/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ /// //@ts-check 'use strict'; /** * @import { ISandboxConfiguration } from './vs/base/parts/sandbox/common/sandboxTypes' * @typedef {any} LoaderConfig */ /* eslint-disable no-restricted-globals */ (function (factory) { // @ts-ignore globalThis.MonacoBootstrapWindow = factory(); }(function () { const preloadGlobals = sandboxGlobals(); const safeProcess = preloadGlobals.process; // increase number of stack frames(from 10, https://github.com/v8/v8/wiki/Stack-Trace-API) Error.stackTraceLimit = 100; /** * @param {string[]} modulePaths * @param {(result: unknown, configuration: ISandboxConfiguration) => Promise | undefined} resultCallback * @param {{ * configureDeveloperSettings?: (config: ISandboxConfiguration) => { * forceDisableShowDevtoolsOnError?: boolean, * forceEnableDeveloperKeybindings?: boolean, * disallowReloadKeybinding?: boolean, * removeDeveloperKeybindingsAfterLoad?: boolean * }, * canModifyDOM?: (config: ISandboxConfiguration) => void, * beforeLoaderConfig?: (loaderConfig: object) => void, * beforeRequire?: (config: ISandboxConfiguration) => void * }} [options] */ async function load(modulePaths, resultCallback, options) { // Await window configuration from preload const timeout = setTimeout(() => { console.error(`[resolve window config] Could not resolve window configuration within 10 seconds, but will continue to wait...`); }, 10000); performance.mark('code/willWaitForWindowConfig'); /** @type {ISandboxConfiguration} */ const configuration = await preloadGlobals.context.resolveConfiguration(); performance.mark('code/didWaitForWindowConfig'); clearTimeout(timeout); // Signal DOM modifications are now OK if (typeof options?.canModifyDOM === 'function') { options.canModifyDOM(configuration); } // Developer settings const { forceEnableDeveloperKeybindings, disallowReloadKeybinding, removeDeveloperKeybindingsAfterLoad } = typeof options?.configureDeveloperSettings === 'function' ? options.configureDeveloperSettings(configuration) : { forceEnableDeveloperKeybindings: false, disallowReloadKeybinding: false, removeDeveloperKeybindingsAfterLoad: false }; const isDev = !!safeProcess.env['VSCODE_DEV']; const enableDeveloperKeybindings = isDev || forceEnableDeveloperKeybindings; /** * @type {() => void | undefined} */ let developerDeveloperKeybindingsDisposable; if (enableDeveloperKeybindings) { developerDeveloperKeybindingsDisposable = registerDeveloperKeybindings(disallowReloadKeybinding); } globalThis._VSCODE_NLS_MESSAGES = configuration.nls.messages; globalThis._VSCODE_NLS_LANGUAGE = configuration.nls.language; let language = configuration.nls.language || 'en'; if (language === 'zh-tw') { language = 'zh-Hant'; } else if (language === 'zh-cn') { language = 'zh-Hans'; } window.document.documentElement.setAttribute('lang', language); window['MonacoEnvironment'] = {}; // ESM-uncomment-begin // // Signal before require() // if (typeof options?.beforeRequire === 'function') { // options.beforeRequire(configuration); // } // const baseUrl = new URL(`${fileUriFromPath(configuration.appRoot, { isWindows: safeProcess.platform === 'win32', scheme: 'vscode-file', fallbackAuthority: 'vscode-app' })}/out/`); // globalThis._VSCODE_FILE_ROOT = baseUrl.toString(); // // DEV --------------------------------------------------------------------------------------- // // DEV: This is for development and enables loading CSS via import-statements via import-maps. // // DEV: For each CSS modules that we have we defined an entry in the import map that maps to // // DEV: a blob URL that loads the CSS via a dynamic @import-rule. // // DEV --------------------------------------------------------------------------------------- // if (Array.isArray(configuration.cssModules) && configuration.cssModules.length > 0) { // performance.mark('code/willAddCssLoader'); // const style = document.createElement('style'); // style.type = 'text/css'; // style.media = 'screen'; // style.id = 'vscode-css-loading'; // document.head.appendChild(style); // globalThis._VSCODE_CSS_LOAD = function (url) { // style.textContent += `@import url(${url});\n`; // }; // /** // * @type { { imports: Record }} // */ // const importMap = { imports: {} }; // for (const cssModule of configuration.cssModules) { // const cssUrl = new URL(cssModule, baseUrl).href; // const jsSrc = `globalThis._VSCODE_CSS_LOAD('${cssUrl}');\n`; // const blob = new Blob([jsSrc], { type: 'application/javascript' }); // importMap.imports[cssUrl] = URL.createObjectURL(blob); // } // const ttp = window.trustedTypes?.createPolicy('vscode-bootstrapImportMap', { createScript(value) { return value; }, }); // const importMapSrc = JSON.stringify(importMap, undefined, 2); // const importMapScript = document.createElement('script'); // importMapScript.type = 'importmap'; // importMapScript.setAttribute('nonce', '0c6a828f1297'); // // @ts-ignore // importMapScript.textContent = ttp?.createScript(importMapSrc) ?? importMapSrc; // document.head.appendChild(importMapScript); // performance.mark('code/didAddCssLoader'); // } // const result = Promise.all(modulePaths.map(modulePath => { // if (modulePath.includes('vs/css!')) { // // ESM/CSS when seeing the old `vs/css!` prefix we use that as a signal to // // load CSS via a tag // const cssModule = modulePath.replace('vs/css!', ''); // const link = document.createElement('link'); // link.rel = 'stylesheet'; // link.href = new URL(`${cssModule}.css`, baseUrl).href; // document.head.appendChild(link); // return Promise.resolve(); // } else { // // ESM/JS module loading // return import(new URL(`${modulePath}.js`, baseUrl).href); // } // })); // result.then((res) => invokeResult(res[0]), onUnexpectedError); // ESM-uncomment-end // ESM-comment-begin /** @type {LoaderConfig} */ const loaderConfig = { baseUrl: `${fileUriFromPath(configuration.appRoot, { isWindows: safeProcess.platform === 'win32', scheme: 'vscode-file', fallbackAuthority: 'vscode-app' })}/out`, preferScriptTags: true }; // use a trusted types policy when loading via script tags loaderConfig.trustedTypesPolicy = window.trustedTypes?.createPolicy('amdLoader', { createScriptURL(value) { if (value.startsWith(window.location.origin)) { return value; } throw new Error(`Invalid script url: ${value}`); } }); // Teach the loader the location of the node modules we use in renderers // This will enable to load these modules via