/*--------------------------------------------------------------------------------------------- * 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