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