GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing github.com — TypeScript/scripts/createPlaygroundBuild.js at main · lowr/TypeScript Expand file tree/ Copy pathcreatePlaygroundBuild.jsMore file actions 313 lines (280 loc) · 11.2 KB / Copy pathcreatePlaygroundBuild.jsFile metadata and controls313 lines (280 loc) · 11.2 KB 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 /* eslint-disable */ // @ts-check /** Run via: node scripts/createPlaygroundBuild.js */ // This script does two things: // // - Listens to changes to the built version of TypeScript (via a filewatcher on `built/local/typescriptServices.js`) // these trigger creating monaco-typescript compatible builds of TypeScript at `internal/lib/typescriptServices.js§ // // - Creates a HTTP server which the playground uses. The webserver almost exclusively re-directs requests to // the latest stable version of monaco-typescript, but specifically overrides requests for the TypeScript js // file to the version created in the above step. // /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ const path = require('path'); const fs = require('fs'); const child_process = require('child_process'); const http = require('http'); const url = require('url'); const nodeFetch = require("node-fetch").default function updateTSDist() { // This code is a direct port of a script from monaco-typescript // https://github.com/microsoft/monaco-typescript/blob/master/scripts/importTypescript.js // Currently based on cc8da6b on June 6 2021 const generatedNote = `// // **NOTE**: Do not edit directly! This file is generated using \`npm run import-typescript\` // `; const TYPESCRIPT_LIB_SOURCE = path.join(__dirname, '../built/local'); const TYPESCRIPT_LIB_DESTINATION = path.join(__dirname, '../internal/lib'); (function () { try { fs.statSync(TYPESCRIPT_LIB_DESTINATION); } catch (err) { fs.mkdirSync(TYPESCRIPT_LIB_DESTINATION); } importLibs(); const npmLsOutput = JSON.parse( child_process.execSync('npm ls typescript --depth=0 --json=true').toString() ); const typeScriptDependencyVersion = npmLsOutput.version; fs.writeFileSync( path.join(TYPESCRIPT_LIB_DESTINATION, 'typescriptServicesMetadata.ts'), `${generatedNote} export const typescriptVersion = "${typeScriptDependencyVersion}";\n` ); let tsServices = fs .readFileSync(path.join(TYPESCRIPT_LIB_SOURCE, 'typescriptServices.js')) .toString(); // Ensure we never run into the node system... // (this also removes require calls that trick webpack into shimming those modules...) tsServices = tsServices.replace( /\n ts\.sys =([^]*)\n \}\)\(\);/m, `\n // MONACOCHANGE\n ts.sys = undefined;\n // END MONACOCHANGE` ); // Eliminate more require() calls... tsServices = tsServices.replace( /^( +)etwModule = require\(.*$/m, '$1// MONACOCHANGE\n$1etwModule = undefined;\n$1// END MONACOCHANGE' ); tsServices = tsServices.replace( /^( +)var result = ts\.sys\.require\(.*$/m, '$1// MONACOCHANGE\n$1var result = undefined;\n$1// END MONACOCHANGE' ); tsServices = tsServices.replace( /^( +)fs = require\("fs"\);$/m, '$1// MONACOCHANGE\n$1fs = undefined;\n$1// END MONACOCHANGE' ); tsServices = tsServices.replace( /^( +)debugger;$/m, '$1// MONACOCHANGE\n$1// debugger;\n$1// END MONACOCHANGE' ); tsServices = tsServices.replace( /= require\("perf_hooks"\)/m, '/* MONACOCHANGE */= {}/* END MONACOCHANGE */' ); // Flag any new require calls (outside comments) so they can be corrected preemptively. // To avoid missing cases (or using an even more complex regex), temporarily remove comments // about require() and then check for lines actually calling require(). // \/[*/] matches the start of a comment (single or multi-line). // ^\s+\*[^/] matches (presumably) a later line of a multi-line comment. const tsServicesNoCommentedRequire = tsServices.replace( /(\/[*/]|^\s+\*[^/]).*\brequire\(.*/gm, '' ); const linesWithRequire = tsServicesNoCommentedRequire.match(/^.*?\brequire\(.*$/gm); // Allow error messages to include references to require() in their strings const runtimeRequires = linesWithRequire && linesWithRequire.filter((l) => !l.includes(': diag(') && !l.includes('ts.DiagnosticCategory')); if (runtimeRequires && runtimeRequires.length && linesWithRequire) { console.error( 'Found new require() calls on the following lines. These should be removed to avoid breaking webpack builds.\n' ); console.error( runtimeRequires.map((r) => `${r} (${tsServicesNoCommentedRequire.indexOf(r)})`).join('\n') ); process.exit(1); } const tsServices_amd = generatedNote + tsServices + ` // MONACOCHANGE // Defining the entire module name because r.js has an issue and cannot bundle this file // correctly with an anonymous define call define("vs/language/typescript/lib/typescriptServices", [], function() { return ts; }); // END MONACOCHANGE `; fs.writeFileSync( path.join(TYPESCRIPT_LIB_DESTINATION, 'typescriptServices-amd.js'), stripSourceMaps(tsServices_amd) ); const tsServices_esm = generatedNote + tsServices + ` // MONACOCHANGE export var createClassifier = ts.createClassifier; export var createLanguageService = ts.createLanguageService; export var displayPartsToString = ts.displayPartsToString; export var EndOfLineState = ts.EndOfLineState; export var flattenDiagnosticMessageText = ts.flattenDiagnosticMessageText; export var IndentStyle = ts.IndentStyle; export var ScriptKind = ts.ScriptKind; export var ScriptTarget = ts.ScriptTarget; export var TokenClass = ts.TokenClass; // END MONACOCHANGE `; fs.writeFileSync( path.join(TYPESCRIPT_LIB_DESTINATION, 'typescriptServices.js'), stripSourceMaps(tsServices_esm) ); let dtsServices = fs .readFileSync(path.join(TYPESCRIPT_LIB_SOURCE, 'typescriptServices.d.ts')) .toString(); dtsServices += ` // MONACOCHANGE export = ts; // END MONACOCHANGE `; fs.writeFileSync( path.join(TYPESCRIPT_LIB_DESTINATION, 'typescriptServices.d.ts'), generatedNote + dtsServices ); })(); function importLibs() { function readLibFile(name) { const srcPath = path.join(TYPESCRIPT_LIB_SOURCE, name); return fs.readFileSync(srcPath).toString(); } let strLibResult = `/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ ${generatedNote} /** Contains all the lib files */ export const libFileMap: Record<string, string> = {} `; let strIndexResult = `/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ ${generatedNote} /** Contains all the lib files */ export const libFileSet: Record<string, boolean> = {} `; const dtsFiles = fs.readdirSync(TYPESCRIPT_LIB_SOURCE).filter((f) => f.includes('lib.')); while (dtsFiles.length > 0) { const name = dtsFiles.shift(); const output = readLibFile(name).replace(/\r\n/g, '\n'); strLibResult += `libFileMap['${name}'] = "${escapeText(output)}";\n`; strIndexResult += `libFileSet['${name}'] = true;\n`; } fs.writeFileSync(path.join(TYPESCRIPT_LIB_DESTINATION, 'lib.ts'), strLibResult); fs.writeFileSync(path.join(TYPESCRIPT_LIB_DESTINATION, 'lib.index.ts'), strIndexResult); } /** * Escape text such that it can be used in a javascript string enclosed by double quotes (") */ function escapeText(text) { // See http://www.javascriptkit.com/jsref/escapesequence.shtml const _backspace = '\b'.charCodeAt(0); const _formFeed = '\f'.charCodeAt(0); const _newLine = '\n'.charCodeAt(0); const _nullChar = 0; const _carriageReturn = '\r'.charCodeAt(0); const _tab = '\t'.charCodeAt(0); const _verticalTab = '\v'.charCodeAt(0); const _backslash = '\\'.charCodeAt(0); const _doubleQuote = '"'.charCodeAt(0); const len = text.length; let startPos = 0; let chrCode; let replaceWith = null; let resultPieces = []; for (let i = 0; i < len; i++) { chrCode = text.charCodeAt(i); switch (chrCode) { case _backspace: replaceWith = '\\b'; break; case _formFeed: replaceWith = '\\f'; break; case _newLine: replaceWith = '\\n'; break; case _nullChar: replaceWith = '\\0'; break; case _carriageReturn: replaceWith = '\\r'; break; case _tab: replaceWith = '\\t'; break; case _verticalTab: replaceWith = '\\v'; break; case _backslash: replaceWith = '\\\\'; break; case _doubleQuote: replaceWith = '\\"'; break; } if (replaceWith !== null) { resultPieces.push(text.substring(startPos, i)); resultPieces.push(replaceWith); startPos = i + 1; replaceWith = null; } } resultPieces.push(text.substring(startPos, len)); return resultPieces.join(''); } function stripSourceMaps(str) { return str.replace(/\/\/# sourceMappingURL[^\n]+/gm, ''); } /// End of import } const services = path.join(__dirname, '../built/local/typescriptServices.js'); fs.watchFile(services, () =>{ console.log("Updating the monaco build") updateTSDist() }) // We need to re-direct non TSC JS requests back to a real copy of // monaco, so grab the list of official releases from the TS CDN // and use the latest stable release, as that is most likely the // closest version to your dev build let latestStable = "4.3.2" nodeFetch('https://typescript.azureedge.net/indexes/releases.json').then(req => req.json()).then(releases => { latestStable = releases.versions.pop() }); http.createServer(function (req, res) { res.setHeader("Access-Control-Allow-Origin", "*") const incoming = url.parse(req.url) if (incoming.path.endsWith("typescriptServices.js")) { // Use the built version res.writeHead(200, {"Content-Type": "text/javascript"}); const amdPath = path.join(__dirname, '../internal/lib/typescriptServices-amd.js'); res.write(fs.readFileSync(amdPath)) } else { // Redirect to the TS CDN res.writeHead(302, { 'Location': `https://typescript.azureedge.net/cdn/${latestStable}/monaco${incoming.path}` }); } res.end(); }).listen(5615); console.log("Starting servers\n") console.log(" - [✓] file watcher: " + services) updateTSDist() console.log(" - [✓] http server: http://localhost:5615") console.log("\n\nGet started: http://www.staging-typescript.org/play?ts=dev") |
| You are visitor 01402520 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |