@dotglitch/ngx-common
Version:
Angular components and utilities that are commonly used.
112 lines • 16.4 kB
JavaScript
import { ImportResolver } from './import-resolver';
import * as path from 'path-browserify';
import { invokeUpdate } from './update-emitter';
import { RecursionDepth } from './recursion-depth';
import { DummySourceCache } from './dummy-source-cache';
// https://github.com/lukasbach/monaco-editor-auto-typings
export class MonacoAutoTypeImporter {
constructor(editor, options) {
this.editor = editor;
this.options = options;
this.disposables = [];
this.importResolver = new ImportResolver(options);
const changeModelDisposable = editor.onDidChangeModelContent(e => {
this.debouncedResolveContents();
});
this.disposables.push(changeModelDisposable);
this.resolveContents();
if (!options.dontAdaptEditorOptions) {
options.monaco.languages.typescript.typescriptDefaults.setCompilerOptions({
...options.monaco.languages.typescript.typescriptDefaults.getCompilerOptions(),
moduleResolution: options.monaco.languages.typescript.ModuleResolutionKind.NodeJs,
allowSyntheticDefaultImports: true,
rootDir: options.fileRootPath,
});
}
}
static async create(editor, options) {
if (options?.shareCache && options.sourceCache && !MonacoAutoTypeImporter.sharedCache) {
MonacoAutoTypeImporter.sharedCache = options.sourceCache;
}
const monacoInstance = options?.monaco ?? window['monaco'];
if (!monacoInstance) {
throw new Error('monacoInstance not found, you can specify the monaco instance via options.monaco');
}
return new MonacoAutoTypeImporter(editor, {
fileRootPath: 'inmemory://model/',
onlySpecifiedPackages: false,
preloadPackages: false,
shareCache: false,
dontAdaptEditorOptions: false,
dontRefreshModelValueAfterResolvement: false,
sourceCache: MonacoAutoTypeImporter.sharedCache ?? new DummySourceCache(),
debounceDuration: 4000,
fileRecursionDepth: 10,
packageRecursionDepth: 3,
...options,
monaco: monacoInstance,
});
}
dispose() {
this.disposables.forEach(d => d.dispose());
}
setVersions(versions) {
this.importResolver.setVersions(versions);
this.options.versions = versions;
}
async clearCache() {
await this.options.sourceCache.clear();
}
debouncedResolveContents() {
if (this.isResolving) {
return;
}
invokeUpdate({ type: 'CodeChanged' }, this.options);
if (this.options.debounceDuration <= 0) {
this.resolveContents();
}
else {
if (this.debounceTimer !== undefined) {
clearTimeout(this.debounceTimer);
}
this.debounceTimer = setTimeout(async () => {
await this.resolveContents();
this.debounceTimer = undefined;
}, this.options.debounceDuration);
}
}
async resolveContents() {
this.isResolving = true;
invokeUpdate({ type: 'ResolveNewImports' }, this.options);
const model = this.editor.getModel();
// This can happen when the editor is disposed before all typings
// are installed.
if (!model) {
throw Error('No model');
}
const content = model.getLinesContent();
try {
await this.importResolver.resolveImportsInFile(content.join('\n'), path.dirname(model.uri.toString()), new RecursionDepth(this.options));
}
catch (e) {
if (this.options.onError) {
this.options.onError(e.message ?? e);
}
else {
throw e;
}
}
if (this.importResolver.wereNewImportsResolved()) {
if (!this.options.dontRefreshModelValueAfterResolvement) {
const currentPosition = this.editor.getPosition();
model.setValue(model.getValue());
if (currentPosition) {
this.editor.setPosition(currentPosition);
}
}
this.importResolver.resetNewImportsResolved();
}
this.isResolving = false;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvY29tcG9uZW50cy92c2NvZGUvdHMtdHlwZS1yZXNvbHZlci9tYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssSUFBSSxNQUFNLGlCQUFpQixDQUFDO0FBRXhDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFJeEQsMERBQTBEO0FBQzFELE1BQU0sT0FBTyxzQkFBc0I7SUFPL0IsWUFBMkIsTUFBYyxFQUFVLE9BQWdCO1FBQXhDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUFTO1FBRjNELGdCQUFXLEdBQXlCLEVBQUUsQ0FBQztRQUczQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWxELE1BQU0scUJBQXFCLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzdELElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQztnQkFDdEUsR0FBRyxPQUFP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RSxDQUFDO2dCQUNsRCxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUNqQyxJQUFJLGVBQWUsRUFBRSxDQUFDO29CQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDN0MsQ0FBQztZQUNMLENBQUM7WUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDbEQsQ0FBQztRQUVELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzdCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEltcG9ydFJlc29sdmVyIH0gZnJvbSAnLi9pbXBvcnQtcmVzb2x2ZXInO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoLWJyb3dzZXJpZnknO1xuaW1wb3J0IHR5cGUgKiBhcyBtb25hY28gZnJvbSAnbW9uYWNvLWVkaXRvcic7XG5pbXBvcnQgeyBpbnZva2VVcGRhdGUgfSBmcm9tICcuL3VwZGF0ZS1lbWl0dGVyJztcbmltcG9ydCB7IFJlY3Vyc2lvbkRlcHRoIH0gZnJvbSAnLi9yZWN1cnNpb24tZGVwdGgnO1xuaW1wb3J0IHsgT3B0aW9ucywgU291cmNlQ2FjaGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IER1bW15U291cmNlQ2FjaGUgfSBmcm9tICcuL2R1bW15LXNvdXJjZS1jYWNoZSc7XG5cbnR5cGUgRWRpdG9yID0gbW9uYWNvLmVkaXRvci5JQ29kZUVkaXRvciB8IG1vbmFjby5lZGl0b3IuSVN0YW5kYWxvbmVDb2RlRWRpdG9yO1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbHVrYXNiYWNoL21vbmFjby1lZGl0b3ItYXV0by10eXBpbmdzXG5leHBvcnQgY2xhc3MgTW9uYWNvQXV0b1R5cGVJbXBvcnRlciBpbXBsZW1lbnRzIG1vbmFjby5JRGlzcG9zYWJsZSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgc2hhcmVkQ2FjaGU/OiBTb3VyY2VDYWNoZTtcbiAgICBwcml2YXRlIGltcG9ydFJlc29sdmVyOiBJbXBvcnRSZXNvbHZlcjtcbiAgICBwcml2YXRlIGRlYm91bmNlVGltZXI/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBpc1Jlc29sdmluZz86IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBkaXNwb3NhYmxlczogbW9uYWNvLklEaXNwb3NhYmxlW10gPSBbXTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIGVkaXRvcjogRWRpdG9yLCBwcml2YXRlIG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pbXBvcnRSZXNvbHZlciA9IG5ldyBJbXBvcnRSZXNvbHZlcihvcHRpb25zKTtcblxuICAgICAgICBjb25zdCBjaGFuZ2VNb2RlbERpc3Bvc2FibGUgPSBlZGl0b3Iub25EaWRDaGFuZ2VNb2RlbENvbnRlbnQoZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRlYm91bmNlZFJlc29sdmVDb250ZW50cygpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kaXNwb3NhYmxlcy5wdXNoKGNoYW5nZU1vZGVsRGlzcG9zYWJsZSk7XG4gICAgICAgIHRoaXMucmVzb2x2ZUNvbnRlbnRzKCk7XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLmRvbnRBZGFwdEVkaXRvck9wdGlvbnMpIHtcbiAgICAgICAgICAgIG9wdGlvbnMubW9uYWNvLmxhbmd1YWdlcy50eXBlc2NyaXB0LnR5cGVzY3JpcHREZWZhdWx0cy5zZXRDb21waWxlck9wdGlvbnMoe1xuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMubW9uYWNvLmxhbmd1YWdlcy50eXBlc2NyaXB0LnR5cGVzY3JpcHREZWZhdWx0cy5nZXRDb21waWxlck9wdGlvbnMoKSxcbiAgICAgICAgICAgICAgICBtb2R1bGVSZXNvbHV0aW9uOiBvcHRpb25zLm1vbmFjby5sYW5ndWFnZXMudHlwZXNjcmlwdC5Nb2R1bGVSZXNvbHV0aW9uS2luZC5Ob2RlSnMsXG4gICAgICAgICAgICAgICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSxcbiAgICAgICAgICAgICAgICByb290RGlyOiBvcHRpb25zLmZpbGVSb290UGF0aCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGUoZWRpdG9yOiBFZGl0b3IsIG9wdGlvbnM/OiBQYXJ0aWFsPE9wdGlvbnM+KTogUHJvbWlzZTxNb25hY29BdXRvVHlwZUltcG9ydGVyPiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5zaGFyZUNhY2hlICYmIG9wdGlvbnMuc291cmNlQ2FjaGUgJiYgIU1vbmFjb0F1dG9UeXBlSW1wb3J0ZXIuc2hhcmVkQ2FjaGUpIHtcbiAgICAgICAgICAgIE1vbmFjb0F1dG9UeXBlSW1wb3J0ZXIuc2hhcmVkQ2FjaGUgPSBvcHRpb25zLnNvdXJjZUNhY2hlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbW9uYWNvSW5zdGFuY2UgPSBvcHRpb25zPy5tb25hY28gPz8gd2luZG93Wydtb25hY28nXTtcblxuICAgICAgICBpZiAoIW1vbmFjb0luc3RhbmNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21vbmFjb0luc3RhbmNlIG5vdCBmb3VuZCwgeW91IGNhbiBzcGVjaWZ5IHRoZSBtb25hY28gaW5zdGFuY2UgdmlhIG9wdGlvbnMubW9uYWNvJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IE1vbmFjb0F1dG9UeXBlSW1wb3J0ZXIoZWRpdG9yLCB7XG4gICAgICAgICAgICBmaWxlUm9vdFBhdGg6ICdpbm1lbW9yeTovL21vZGVsLycsXG4gICAgICAgICAgICBvbmx5U3BlY2lmaWVkUGFja2FnZXM6IGZhbHNlLFxuICAgICAgICAgICAgcHJlbG9hZFBhY2thZ2VzOiBmYWxzZSxcbiAgICAgICAgICAgIHNoYXJlQ2FjaGU6IGZhbHNlLFxuICAgICAgICAgICAgZG9udEFkYXB0RWRpdG9yT3B0aW9uczogZmFsc2UsXG4gICAgICAgICAgICBkb250UmVmcmVzaE1vZGVsVmFsdWVBZnRlclJlc29sdmVtZW50OiBmYWxzZSxcbiAgICAgICAgICAgIHNvdXJjZUNhY2hlOiBNb25hY29BdXRvVHlwZUltcG9ydGVyLnNoYXJlZENhY2hlID8/IG5ldyBEdW1teVNvdXJjZUNhY2hlKCksXG4gICAgICAgICAgICBkZWJvdW5jZUR1cmF0aW9uOiA0MDAwLFxuICAgICAgICAgICAgZmlsZVJlY3Vyc2lvbkRlcHRoOiAxMCxcbiAgICAgICAgICAgIHBhY2thZ2VSZWN1cnNpb25EZXB0aDogMyxcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBtb25hY286IG1vbmFjb0luc3RhbmNlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5kaXNwb3NhYmxlcy5mb3JFYWNoKGQgPT4gZC5kaXNwb3NlKCkpXG4gICAgfVxuXG4gICAgcHVibGljIHNldFZlcnNpb25zKHZlcnNpb25zOiB7IFtwYWNrYWdlTmFtZTogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgICAgICAgdGhpcy5pbXBvcnRSZXNvbHZlci5zZXRWZXJzaW9ucyh2ZXJzaW9ucyk7XG4gICAgICAgIHRoaXMub3B0aW9ucy52ZXJzaW9ucyA9IHZlcnNpb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjbGVhckNhY2hlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLm9wdGlvbnMuc291cmNlQ2FjaGUuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlYm91bmNlZFJlc29sdmVDb250ZW50cygpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNSZXNvbHZpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGludm9rZVVwZGF0ZSh7IHR5cGU6ICdDb2RlQ2hhbmdlZCcgfSwgdGhpcy5vcHRpb25zKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRlYm91bmNlRHVyYXRpb24gPD0gMCkge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlQ29udGVudHMoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlYm91bmNlVGltZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmRlYm91bmNlVGltZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kZWJvdW5jZVRpbWVyID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXNvbHZlQ29udGVudHMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlYm91bmNlVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMuZGVib3VuY2VEdXJhdGlvbikgYXMgYW55O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZXNvbHZlQ29udGVudHMoKSB7XG4gICAgICAgIHRoaXMuaXNSZXNvbHZpbmcgPSB0cnVlO1xuICAgICAgICBpbnZva2VVcGRhdGUoeyB0eXBlOiAnUmVzb2x2ZU5ld0ltcG9ydHMnIH0sIHRoaXMub3B0aW9ucyk7XG5cbiAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLmVkaXRvci5nZXRNb2RlbCgpO1xuICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgZWRpdG9yIGlzIGRpc3Bvc2VkIGJlZm9yZSBhbGwgdHlwaW5nc1xuICAgICAgICAvLyBhcmUgaW5zdGFsbGVkLlxuICAgICAgICBpZiAoIW1vZGVsKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignTm8gbW9kZWwnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBtb2RlbC5nZXRMaW5lc0NvbnRlbnQoKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbXBvcnRSZXNvbHZlci5yZXNvbHZlSW1wb3J0c0luRmlsZShcbiAgICAgICAgICAgICAgICBjb250ZW50LmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgICAgIHBhdGguZGlybmFtZShtb2RlbC51cmkudG9TdHJpbmcoKSksXG4gICAgICAgICAgICAgICAgbmV3IFJlY3Vyc2lvbkRlcHRoKHRoaXMub3B0aW9ucylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMub25FcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vbkVycm9yKChlIGFzIEVycm9yKS5tZXNzYWdlID8/IGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmltcG9ydFJlc29sdmVyLndlcmVOZXdJbXBvcnRzUmVzb2x2ZWQoKSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZG9udFJlZnJlc2hNb2RlbFZhbHVlQWZ0ZXJSZXNvbHZlbWVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQb3NpdGlvbiA9IHRoaXMuZWRpdG9yLmdldFBvc2l0aW9uKCk7XG4gICAgICAgICAgICAgICAgbW9kZWwuc2V0VmFsdWUobW9kZWwuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5zZXRQb3NpdGlvbihjdXJyZW50UG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaW1wb3J0UmVzb2x2ZXIucmVzZXROZXdJbXBvcnRzUmVzb2x2ZWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaXNSZXNvbHZpbmcgPSBmYWxzZTtcbiAgICB9XG59XG4iXX0=