|
|
@ -145,27 +145,6 @@ class Editor extends Plugin { |
|
|
|
this.currentThemeType = theme.quality |
|
|
|
this.currentThemeType = theme.quality |
|
|
|
this.renderComponent() |
|
|
|
this.renderComponent() |
|
|
|
}) |
|
|
|
}) |
|
|
|
this.on('fileManager', 'currentFileChanged', async (name) => { |
|
|
|
|
|
|
|
if (name.endsWith('.ts')) { |
|
|
|
|
|
|
|
// extract the import, resolve their content
|
|
|
|
|
|
|
|
// and add the imported files to Monaco through the `addModel`
|
|
|
|
|
|
|
|
// so Monaco can provide auto completion
|
|
|
|
|
|
|
|
let content = await this.call('fileManager', 'readFile', name) |
|
|
|
|
|
|
|
const paths = name.split('/') |
|
|
|
|
|
|
|
paths.pop() |
|
|
|
|
|
|
|
const fromPath = paths.join('/') // get current execution context path
|
|
|
|
|
|
|
|
for (const match of content.matchAll(/import\s+.*\s+from\s+(?:"(.*?)"|'(.*?)')/g)) { |
|
|
|
|
|
|
|
let path = match[2] |
|
|
|
|
|
|
|
if (path.startsWith('./') || path.startsWith('../')) path = resolve(fromPath, path) |
|
|
|
|
|
|
|
if (path.startsWith('/')) path = path.substring(1) |
|
|
|
|
|
|
|
if (!path.endsWith('.ts')) path = path + '.ts' |
|
|
|
|
|
|
|
if (await this.call('fileManager', 'exists', path)) { |
|
|
|
|
|
|
|
content = await this.call('fileManager', 'readFile', path) |
|
|
|
|
|
|
|
this.emit('addModel', content, 'typescript', path, false) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
this.on('fileManager', 'noFileSelected', async () => { |
|
|
|
this.on('fileManager', 'noFileSelected', async () => { |
|
|
|
this.currentFile = null |
|
|
|
this.currentFile = null |
|
|
|
this.renderComponent() |
|
|
|
this.renderComponent() |
|
|
@ -240,8 +219,33 @@ class Editor extends Plugin { |
|
|
|
* @param {string} content Content of the file to open |
|
|
|
* @param {string} content Content of the file to open |
|
|
|
* @param {string} mode Mode for this file [Default is `text`] |
|
|
|
* @param {string} mode Mode for this file [Default is `text`] |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
_createSession (path, content, mode) { |
|
|
|
async _createSession (path, content, mode) { |
|
|
|
if (!this.activated) return |
|
|
|
if (!this.activated) return |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (path.endsWith('.ts')) { |
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
// extract the import, resolve their content
|
|
|
|
|
|
|
|
// and add the imported files to Monaco through the `addModel`
|
|
|
|
|
|
|
|
// so Monaco can provide auto completion
|
|
|
|
|
|
|
|
let content = await this.call('fileManager', 'readFile', path) |
|
|
|
|
|
|
|
const paths = path.split('/') |
|
|
|
|
|
|
|
paths.pop() |
|
|
|
|
|
|
|
const fromPath = paths.join('/') // get current execution context path
|
|
|
|
|
|
|
|
for (const match of content.matchAll(/import\s+.*\s+from\s+(?:"(.*?)"|'(.*?)')/g)) { |
|
|
|
|
|
|
|
let path = match[2] |
|
|
|
|
|
|
|
if (path.startsWith('./') || path.startsWith('../')) path = resolve(fromPath, path) |
|
|
|
|
|
|
|
if (path.startsWith('/')) path = path.substring(1) |
|
|
|
|
|
|
|
if (!path.endsWith('.ts')) path = path + '.ts' |
|
|
|
|
|
|
|
if (await this.call('fileManager', 'exists', path)) { |
|
|
|
|
|
|
|
content = await this.call('fileManager', 'readFile', path) |
|
|
|
|
|
|
|
this.emit('addModel', content, 'typescript', path, false) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} catch (e) { |
|
|
|
|
|
|
|
console.log('unable to resolve dependency of', path, e) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
this.emit('addModel', content, mode, path, false) |
|
|
|
this.emit('addModel', content, mode, path, false) |
|
|
|
return { |
|
|
|
return { |
|
|
|
path, |
|
|
|
path, |
|
|
@ -294,7 +298,7 @@ class Editor extends Plugin { |
|
|
|
* @param {string} path Path of the session to open. |
|
|
|
* @param {string} path Path of the session to open. |
|
|
|
* @param {string} content Content of the document or update. |
|
|
|
* @param {string} content Content of the document or update. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
open (path, content) { |
|
|
|
async open (path, content) { |
|
|
|
/* |
|
|
|
/* |
|
|
|
we have the following cases: |
|
|
|
we have the following cases: |
|
|
|
- URL prepended with "localhost" |
|
|
|
- URL prepended with "localhost" |
|
|
@ -302,7 +306,7 @@ class Editor extends Plugin { |
|
|
|
- URL not prepended with the file explorer. We assume (as it is in the whole app, that this is a "browser" URL |
|
|
|
- URL not prepended with the file explorer. We assume (as it is in the whole app, that this is a "browser" URL |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
if (!this.sessions[path]) { |
|
|
|
if (!this.sessions[path]) { |
|
|
|
const session = this._createSession(path, content, this._getMode(path)) |
|
|
|
const session = await this._createSession(path, content, this._getMode(path)) |
|
|
|
this.sessions[path] = session |
|
|
|
this.sessions[path] = session |
|
|
|
this.readOnlySessions[path] = false |
|
|
|
this.readOnlySessions[path] = false |
|
|
|
} else if (this.sessions[path].getValue() !== content) { |
|
|
|
} else if (this.sessions[path].getValue() !== content) { |
|
|
@ -316,9 +320,9 @@ class Editor extends Plugin { |
|
|
|
* @param {string} path Path of the session to open. |
|
|
|
* @param {string} path Path of the session to open. |
|
|
|
* @param {string} content Content of the document or update. |
|
|
|
* @param {string} content Content of the document or update. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
openReadOnly (path, content) { |
|
|
|
async openReadOnly (path, content) { |
|
|
|
if (!this.sessions[path]) { |
|
|
|
if (!this.sessions[path]) { |
|
|
|
const session = this._createSession(path, content, this._getMode(path)) |
|
|
|
const session = await this._createSession(path, content, this._getMode(path)) |
|
|
|
this.sessions[path] = session |
|
|
|
this.sessions[path] = session |
|
|
|
this.readOnlySessions[path] = true |
|
|
|
this.readOnlySessions[path] = true |
|
|
|
} |
|
|
|
} |
|
|
|