From 0d3ddbf355b41abb86fe8990767ff164933d9c5d Mon Sep 17 00:00:00 2001 From: Harvey Zhao Date: Tue, 15 Sep 2026 09:10:16 +0800 Subject: [PATCH] build(site): [SITE-07] reproduce Monaco CSS HTML and JSON workers --- .gitattributes | 1 + package.json | 3 +- .../monaco-languages-provenance.json | 956 ++++++++++++++++++ .../monaco-languages-validation.json | 751 ++++++++++++++ .../monaco-css-scripts-bundle.js.txt | 86 ++ .../monaco-css-src-cssWorker.ts.txt | 184 ++++ .../monaco-css-src-fillers-vscode-nls.ts.txt | 46 + .../monaco-css-src-tsconfig.json.txt | 10 + .../monaco-html-scripts-bundle.js.txt | 86 ++ .../monaco-html-src-fillers-vscode-nls.ts.txt | 46 + .../monaco-html-src-htmlWorker.ts.txt | 137 +++ .../monaco-html-src-tsconfig.json.txt | 10 + .../monaco-json-scripts-bundle.js.txt | 90 ++ .../monaco-json-src-fillers-vscode-nls.ts.txt | 46 + .../monaco-json-src-jsonWorker.ts.txt | 192 ++++ .../monaco-json-src-tsconfig.json.txt | 10 + .../2026-09-15-SITE-07-monaco-languages.md | 52 + refactor/plan.md | 2 +- refactor/progress.md | 8 + refactor/risks.json | 9 +- refactor/tasks.json | 5 +- scripts/site-vendor/monaco/README.md | 51 +- scripts/site-vendor/monaco/archives.ts | 80 ++ scripts/site-vendor/monaco/languages.ts | 81 ++ .../site-vendor/monaco/reproduce-languages.ts | 118 +++ test/browser/README.md | 7 + test/browser/editor-languages.spec.js | 67 ++ test/monaco-provenance.test.js | 34 + 28 files changed, 3158 insertions(+), 10 deletions(-) create mode 100644 refactor/baselines/monaco-languages-provenance.json create mode 100644 refactor/baselines/monaco-languages-validation.json create mode 100644 refactor/baselines/site-vendor/monaco-languages/monaco-css-scripts-bundle.js.txt create mode 100644 refactor/baselines/site-vendor/monaco-languages/monaco-css-src-cssWorker.ts.txt create mode 100644 refactor/baselines/site-vendor/monaco-languages/monaco-css-src-fillers-vscode-nls.ts.txt create mode 100644 refactor/baselines/site-vendor/monaco-languages/monaco-css-src-tsconfig.json.txt create mode 100644 refactor/baselines/site-vendor/monaco-languages/monaco-html-scripts-bundle.js.txt create mode 100644 refactor/baselines/site-vendor/monaco-languages/monaco-html-src-fillers-vscode-nls.ts.txt create mode 100644 refactor/baselines/site-vendor/monaco-languages/monaco-html-src-htmlWorker.ts.txt create mode 100644 refactor/baselines/site-vendor/monaco-languages/monaco-html-src-tsconfig.json.txt create mode 100644 refactor/baselines/site-vendor/monaco-languages/monaco-json-scripts-bundle.js.txt create mode 100644 refactor/baselines/site-vendor/monaco-languages/monaco-json-src-fillers-vscode-nls.ts.txt create mode 100644 refactor/baselines/site-vendor/monaco-languages/monaco-json-src-jsonWorker.ts.txt create mode 100644 refactor/baselines/site-vendor/monaco-languages/monaco-json-src-tsconfig.json.txt create mode 100644 refactor/changes/2026-09-15-SITE-07-monaco-languages.md create mode 100644 scripts/site-vendor/monaco/archives.ts create mode 100644 scripts/site-vendor/monaco/languages.ts create mode 100644 scripts/site-vendor/monaco/reproduce-languages.ts create mode 100644 test/browser/editor-languages.spec.js diff --git a/.gitattributes b/.gitattributes index ae51fb5f6..b9d296b21 100644 --- a/.gitattributes +++ b/.gitattributes @@ -32,3 +32,4 @@ refactor/baselines/site-vendor/console-attribution/** -text whitespace=-trailing refactor/baselines/site-vendor/console-stackoverflow/** -text whitespace=-trailing-space,cr-at-eol refactor/baselines/site-vendor/monaco-typescript/** -text whitespace=-trailing-space,cr-at-eol docs/licenses/monaco-editor/typescript/** -text whitespace=-trailing-space,cr-at-eol +refactor/baselines/site-vendor/monaco-languages/** -text whitespace=-trailing-space,cr-at-eol diff --git a/package.json b/package.json index 57193d676..da73d04d9 100644 --- a/package.json +++ b/package.json @@ -165,7 +165,8 @@ "build:console": "node scripts/build-console.mjs", "check:console": "node scripts/build-console.mjs --check", "test:site-console": "node --test test/site-console.test.js", - "verify:monaco-typescript-source": "node scripts/site-vendor/monaco/reproduce-typescript.ts" + "verify:monaco-typescript-source": "node scripts/site-vendor/monaco/reproduce-typescript.ts", + "verify:monaco-language-sources": "node scripts/site-vendor/monaco/reproduce-languages.ts" }, "browserslist": "last 1 Chrome version", "devDependencies": { diff --git a/refactor/baselines/monaco-languages-provenance.json b/refactor/baselines/monaco-languages-provenance.json new file mode 100644 index 000000000..e31402a68 --- /dev/null +++ b/refactor/baselines/monaco-languages-provenance.json @@ -0,0 +1,956 @@ +{ + "schemaVersion": 1, + "task": "SITE-07", + "commit": "5a7ba61be909ae9e4889768a3453ebb0dec392e2", + "scope": "Complete source-fragment and minified-output matching for CSS/HTML/JSON workers; not a full historical typecheck or embedded-license closure.", + "archives": [ + { + "name": "monaco-editor", + "version": "0.30.1", + "tarball": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.30.1.tgz", + "integrity": "sha512-B/y4+b2O5G2gjuxIFtCE2EkM17R2NM7/3F8x0qcPsqy4V83bitJTIO4TIeZpYlzu/xy6INiY/+84BEm6+7Cmzg==", + "sha256": "d7872ab742036036eca48cd54e43d751bede56742f0689bcf4049bcf701468c7" + }, + { + "name": "typescript", + "version": "4.4.4", + "tarball": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", + "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==", + "sha256": "7524841bbf63777fef1fe6e1a826026b1dd4849f54f5affa481502faab2cdb16" + }, + { + "name": "terser", + "version": "5.9.0", + "tarball": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", + "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", + "sha256": "2ca0d9c4731b6ebd3b86ed1a7b735f685f98636ee5a067ae9e27e83246069619" + }, + { + "name": "source-map", + "version": "0.7.3", + "tarball": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "sha256": "ad69b787ba774733c3e4f0eb20403df7b1fa466252d453533dbcc6a5ad15833e" + }, + { + "name": "jsonc-parser", + "version": "3.0.0", + "tarball": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "sha256": "807c53e781c6c6181165f6214db5f6892742041338d9891ce3c335cf3bc25da8" + }, + { + "name": "vscode-css-languageservice", + "version": "5.1.8", + "tarball": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-5.1.8.tgz", + "integrity": "sha512-Si1sMykS8U/p8LYgLGPCfZD1YFT0AtvUJQp9XJGw64DZWhtwYo28G2l64USLS9ge4ZPMZpwdpOK7PfbVKfgiiA==", + "sha256": "d527257e471c1d9e60d0171c44c90bca38fac3ae195c2b11fcd32318c931f6f9" + }, + { + "name": "vscode-html-languageservice", + "version": "4.1.1", + "tarball": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-4.1.1.tgz", + "integrity": "sha512-rrDyCiOgMwOPgchpPGAeLzjYVVEW/Ror2/a1BWUEI3S9+NQhA9vj4SQkzmH6g2Bq9S9SV0OQeadD+xphOf1N3w==", + "sha256": "e2e3a8552a2090ea6f86e3acedaba629544bc2ea81c18d7cb30dcb2dab6bb17e" + }, + { + "name": "vscode-json-languageservice", + "version": "4.1.9", + "tarball": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-4.1.9.tgz", + "integrity": "sha512-kxNHitUy2fCxmP6vAp0SRLrUSuecUYzzxlC+85cC3jJlFHWmvtCJOzikC+kcUnIdls9fQSB8n0yHs8Sl6taxJw==", + "sha256": "7ad177f8bd4db88fb12f335f50a33cff3a6cc0ee54cbf8057a6fc3ef42f391ca" + }, + { + "name": "vscode-languageserver-textdocument", + "version": "1.0.2", + "tarball": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.2.tgz", + "integrity": "sha512-T7uPC18+f8mYE4lbVZwb3OSmvwTZm3cuFhrdx9Bn2l11lmp3SvSuSVjy2JtvrghzjAo4G6Trqny2m9XGnFnWVA==", + "sha256": "2dac6ed99ac87c7205f446ca1e38912d0d3f8da702346509bd056239358f3bda" + }, + { + "name": "vscode-languageserver-types", + "version": "3.16.0", + "tarball": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", + "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==", + "sha256": "eb934ea5eda6fd6b5d21ae8706922be1179501c30350260e07998e76c6946a2c" + }, + { + "name": "vscode-uri", + "version": "3.0.2", + "tarball": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.2.tgz", + "integrity": "sha512-jkjy6pjU1fxUvI51P+gCsxg1u2n8LSt0W6KrCNQceaziKzff74GoWmjVG46KieVzybO1sttPQmYfrwSHey7GUA==", + "sha256": "e1e26ccda45c167ec7c01d74f4e0fef5a97b96c791f0a006d9a1eaf1b9d55223" + } + ], + "remotes": [ + { + "source": "refactor/baselines/site-vendor/monaco-typescript/package-lock.json.txt", + "sha256": "84c66bfe8ae95b2226ca289279133999356e64137db7ba001817737fa1ac8cf8", + "gitBlobSha": "9f647e9fc82150a5d06a9c02dc781d2dbe902ed6", + "apiUrl": "https://api.github.com/repos/microsoft/monaco-editor/contents/package-lock.json?ref=5a7ba61be909ae9e4889768a3453ebb0dec392e2" + }, + { + "source": "refactor/baselines/site-vendor/monaco-languages/monaco-css-scripts-bundle.js.txt", + "sha256": "2a9dbfbd62b6106835ac69d930e4e1024000196154d0fd98e7a42bfab9977751", + "gitBlobSha": "49709bc5efb3f5e81c2797fa771b0576f86c71fb", + "apiUrl": "https://api.github.com/repos/microsoft/monaco-editor/contents/monaco-css/scripts/bundle.js?ref=5a7ba61be909ae9e4889768a3453ebb0dec392e2" + }, + { + "source": "refactor/baselines/site-vendor/monaco-languages/monaco-css-src-fillers-vscode-nls.ts.txt", + "sha256": "5c1791a7852fece6124a82df100f45caf5e00ce1a9025f0884d1ebb017222534", + "gitBlobSha": "38f7b334931d9a88e19f18153ce4a24f92ac0ffd", + "apiUrl": "https://api.github.com/repos/microsoft/monaco-editor/contents/monaco-css/src/fillers/vscode-nls.ts?ref=5a7ba61be909ae9e4889768a3453ebb0dec392e2" + }, + { + "source": "refactor/baselines/site-vendor/monaco-languages/monaco-css-src-tsconfig.json.txt", + "sha256": "d5739d74d37ae0ff0d8b55f19b1116433bae9b0f8a81c8b410bd587e11bc7694", + "gitBlobSha": "707f714dd2869a2e1fe3c5a679cf1eb116f0f542", + "apiUrl": "https://api.github.com/repos/microsoft/monaco-editor/contents/monaco-css/src/tsconfig.json?ref=5a7ba61be909ae9e4889768a3453ebb0dec392e2" + }, + { + "source": "refactor/baselines/site-vendor/monaco-languages/monaco-css-src-cssWorker.ts.txt", + "sha256": "bba953a5a241cbe197f77a48188aff704cb3c63698db467aa4bcfb60a20621ed", + "gitBlobSha": "45628043913f3bed8b6e3720f1fe50de666b0dbe", + "apiUrl": "https://api.github.com/repos/microsoft/monaco-editor/contents/monaco-css/src/cssWorker.ts?ref=5a7ba61be909ae9e4889768a3453ebb0dec392e2" + }, + { + "source": "refactor/baselines/site-vendor/monaco-languages/monaco-html-scripts-bundle.js.txt", + "sha256": "9a101e8926d384a880bdfc13ae72559f72d1b4e8b1d7dd755a6a999ca6383718", + "gitBlobSha": "d5932edf6307028d76be68e76fcaf08ec2768a58", + "apiUrl": "https://api.github.com/repos/microsoft/monaco-editor/contents/monaco-html/scripts/bundle.js?ref=5a7ba61be909ae9e4889768a3453ebb0dec392e2" + }, + { + "source": "refactor/baselines/site-vendor/monaco-languages/monaco-html-src-fillers-vscode-nls.ts.txt", + "sha256": "5c1791a7852fece6124a82df100f45caf5e00ce1a9025f0884d1ebb017222534", + "gitBlobSha": "38f7b334931d9a88e19f18153ce4a24f92ac0ffd", + "apiUrl": "https://api.github.com/repos/microsoft/monaco-editor/contents/monaco-html/src/fillers/vscode-nls.ts?ref=5a7ba61be909ae9e4889768a3453ebb0dec392e2" + }, + { + "source": "refactor/baselines/site-vendor/monaco-languages/monaco-html-src-tsconfig.json.txt", + "sha256": "d5739d74d37ae0ff0d8b55f19b1116433bae9b0f8a81c8b410bd587e11bc7694", + "gitBlobSha": "707f714dd2869a2e1fe3c5a679cf1eb116f0f542", + "apiUrl": "https://api.github.com/repos/microsoft/monaco-editor/contents/monaco-html/src/tsconfig.json?ref=5a7ba61be909ae9e4889768a3453ebb0dec392e2" + }, + { + "source": "refactor/baselines/site-vendor/monaco-languages/monaco-html-src-htmlWorker.ts.txt", + "sha256": "83627006efb72fd7a407a5f7c60d04eb8b9eca00b13bd4a4f1aa5e29d63c02a7", + "gitBlobSha": "cf5cb6e5fdbde35659a80e017a36539437e48650", + "apiUrl": "https://api.github.com/repos/microsoft/monaco-editor/contents/monaco-html/src/htmlWorker.ts?ref=5a7ba61be909ae9e4889768a3453ebb0dec392e2" + }, + { + "source": "refactor/baselines/site-vendor/monaco-languages/monaco-json-scripts-bundle.js.txt", + "sha256": "1326211da917b321808ae29987c666226028ad276af3e1d376cd7d0ed3902fd6", + "gitBlobSha": "cb54926f4a3fb00d16824d2be6c6e51b3a6524ec", + "apiUrl": "https://api.github.com/repos/microsoft/monaco-editor/contents/monaco-json/scripts/bundle.js?ref=5a7ba61be909ae9e4889768a3453ebb0dec392e2" + }, + { + "source": "refactor/baselines/site-vendor/monaco-languages/monaco-json-src-fillers-vscode-nls.ts.txt", + "sha256": "5c1791a7852fece6124a82df100f45caf5e00ce1a9025f0884d1ebb017222534", + "gitBlobSha": "38f7b334931d9a88e19f18153ce4a24f92ac0ffd", + "apiUrl": "https://api.github.com/repos/microsoft/monaco-editor/contents/monaco-json/src/fillers/vscode-nls.ts?ref=5a7ba61be909ae9e4889768a3453ebb0dec392e2" + }, + { + "source": "refactor/baselines/site-vendor/monaco-languages/monaco-json-src-tsconfig.json.txt", + "sha256": "d5739d74d37ae0ff0d8b55f19b1116433bae9b0f8a81c8b410bd587e11bc7694", + "gitBlobSha": "707f714dd2869a2e1fe3c5a679cf1eb116f0f542", + "apiUrl": "https://api.github.com/repos/microsoft/monaco-editor/contents/monaco-json/src/tsconfig.json?ref=5a7ba61be909ae9e4889768a3453ebb0dec392e2" + }, + { + "source": "refactor/baselines/site-vendor/monaco-languages/monaco-json-src-jsonWorker.ts.txt", + "sha256": "6e31ea103fee114dd20382f373da50bcbd38fc79ec41c711434e4245180a4817", + "gitBlobSha": "781b58e26822e64534d312e3be74b850a6c3ecae", + "apiUrl": "https://api.github.com/repos/microsoft/monaco-editor/contents/monaco-json/src/jsonWorker.ts?ref=5a7ba61be909ae9e4889768a3453ebb0dec392e2" + } + ], + "compilerMembers": [ + { + "archive": "typescript-4.4.4", + "member": "package/lib/typescript.js", + "sha256": "69fde5346b9468255c32d8d0bff32842445822528b25da1a323ec1c076979384" + }, + { + "archive": "typescript-4.4.4", + "member": "package/lib/lib.es5.d.ts", + "sha256": "aa9fb4c70f369237c2f45f9d969c9a59e0eae9a192962eb48581fe864aa609db" + }, + { + "archive": "typescript-4.4.4", + "member": "package/lib/lib.dom.d.ts", + "sha256": "e54c8715a4954cfdc66cd69489f2b725c09ebf37492dbd91cff0a1688b1159e8" + }, + { + "archive": "typescript-4.4.4", + "member": "package/lib/lib.es2015.collection.d.ts", + "sha256": "43fb1d932e4966a39a41b464a12a81899d9ae5f2c829063f5571b6b87e6d2f9c" + }, + { + "archive": "typescript-4.4.4", + "member": "package/lib/lib.es2015.promise.d.ts", + "sha256": "2bb4b3927299434052b37851a47bf5c39764f2ba88a888a107b32262e9292b7c" + }, + { + "archive": "typescript-4.4.4", + "member": "package/lib/lib.es2015.iterable.d.ts", + "sha256": "2c8c5ee58f30e7c944e04ab1fb5506fdbb4dd507c9efa6972cf4b91cec90c503" + }, + { + "archive": "terser-5.9.0", + "member": "package/dist/bundle.min.js", + "sha256": "b8b44743a529c5bd1cf8d6676f040c3c9bed29c7c114e5a26dde5e0fb2125838" + } + ], + "modules": [ + { + "id": "vscode-css-languageservice/parser/cssScanner", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/parser/cssScanner.js", + "sha256": "9a3e5c2184bbba40ddc07db9ca98a2f19829f757b5dea3eaecc8dbbb1c5f6f96" + }, + { + "id": "vscode-css-languageservice/utils/strings", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/utils/strings.js", + "sha256": "748ec977a08777cc6505d5284f3990620e240d4546cb4fb36fd55f9090e61154" + }, + { + "id": "vscode-css-languageservice/parser/cssNodes", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/parser/cssNodes.js", + "sha256": "64575246c66daa56db99500cce3e2f3a7a67c20876c713ed45c3ba44bd831930" + }, + { + "id": "vscode-css-languageservice/parser/cssErrors", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/parser/cssErrors.js", + "sha256": "60ab648e896944405fa3f599b2d6146e21894eac2d82fbd80d6f00d40bf1ef55" + }, + { + "id": "vscode-css-languageservice/languageFacts/entry", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/languageFacts/entry.js", + "sha256": "8310c2e12cbdaa3cb7ae15805dcf4059b0db7e7fc251f2eb73dbdbfcfa77adef" + }, + { + "id": "vscode-css-languageservice/languageFacts/colors", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/languageFacts/colors.js", + "sha256": "3ed3fb3c267e0883aa55cc580dbe3c7503a549fe537edf0bc14d1e04d6324eca" + }, + { + "id": "vscode-css-languageservice/languageFacts/builtinData", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/languageFacts/builtinData.js", + "sha256": "74879dea4179de802db9319846482b6ae57dad1cfc7a964442dea19fef80b603" + }, + { + "id": "vscode-css-languageservice/languageFacts/facts", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/languageFacts/facts.js", + "sha256": "ddda6c80e26f28f0ef89bac8da92211d9d7d02bde900d86a3755dc58a0ee044e" + }, + { + "id": "vscode-css-languageservice/utils/objects", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/utils/objects.js", + "sha256": "19cc9d4d2130327dbd0c4551bd0e220897ef5492f9cd8970e826217d97e3f837" + }, + { + "id": "vscode-css-languageservice/parser/cssParser", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/parser/cssParser.js", + "sha256": "adc62e779d870315f584a329e7c4785277c3310ef78b04a61e8634c81fb028d9" + }, + { + "id": "vscode-css-languageservice/utils/arrays", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/utils/arrays.js", + "sha256": "66ca208f853159481a2b08e895ecbf03649c956d28c9332c09a0b85cf7704a52" + }, + { + "id": "vscode-css-languageservice/parser/cssSymbolScope", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/parser/cssSymbolScope.js", + "sha256": "12308880e5b364e704ef33485ce3d3f25209a79f1f44bf8077fe2b28205182fb" + }, + { + "id": "vscode-languageserver-types/main", + "archive": "vscode-languageserver-types-3.16.0", + "member": "package/lib/umd/main.js", + "sha256": "bc54d0255c6527858d4b2a6c9fd366dd5bdc08d627aa6a81ebb52b27fe1bb17d" + }, + { + "id": "vscode-languageserver-textdocument/main", + "archive": "vscode-languageserver-textdocument-1.0.2", + "member": "package/lib/umd/main.js", + "sha256": "618d67aa720519285678550ff320e2ebb432486bc231e4b308eea176c714bcdc" + }, + { + "id": "vscode-css-languageservice/cssLanguageTypes", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/cssLanguageTypes.js", + "sha256": "20048c4d17d1c63f32c2105f22258c079b19a48a18e2d2f6432a8277910c5f9b" + }, + { + "id": "vscode-uri/index", + "archive": "vscode-uri-3.0.2", + "member": "package/lib/umd/index.js", + "sha256": "db68af3be3a6ef95333900f2c0eaa304ed14d25cf1963699503922ddf266c058" + }, + { + "id": "vscode-css-languageservice/utils/resources", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/utils/resources.js", + "sha256": "9a66fabd2621ec3419657864057d2b1cd32ef219fb8d969510c4d39f472c7e1a" + }, + { + "id": "vscode-css-languageservice/services/pathCompletion", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/services/pathCompletion.js", + "sha256": "77b2dbcb2c0f25bf2146ed63c5afdee297f2d53c4003a6022fd8cac67902e9ff" + }, + { + "id": "vscode-css-languageservice/services/cssCompletion", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/services/cssCompletion.js", + "sha256": "7fe9f7fad6e6e71c9ee6b754eda716894403c5e7335f6411168b49003b84e04b" + }, + { + "id": "vscode-css-languageservice/services/selectorPrinting", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/services/selectorPrinting.js", + "sha256": "03d88007d099f5adad4d5b6f3b620d45c924f3cdf5760bfbe22ce6742093d8c7" + }, + { + "id": "vscode-css-languageservice/services/cssHover", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/services/cssHover.js", + "sha256": "f75b206433ad126c753226a031ff232ffcc0b642567dea71d47e5a9de1dada66" + }, + { + "id": "vscode-css-languageservice/services/cssNavigation", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/services/cssNavigation.js", + "sha256": "fe188264fa79527ec2acf8cd5d8e120841cee5650ed00157df87d0367977991d" + }, + { + "id": "vscode-css-languageservice/services/lintRules", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/services/lintRules.js", + "sha256": "9e59715f9792793a15d34f3827b332504782b790798a7abdc61b51f17a2dcff9" + }, + { + "id": "vscode-css-languageservice/services/cssCodeActions", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/services/cssCodeActions.js", + "sha256": "b6c8720895da4450238997b738e3b643e8f5479a4146e719fd60ecc715ae71ee" + }, + { + "id": "vscode-css-languageservice/services/lintUtil", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/services/lintUtil.js", + "sha256": "316aec7ef76258da65e13f9f86eb4778027bb35133ed84370fd8afacf8c7cefe" + }, + { + "id": "vscode-css-languageservice/services/lint", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/services/lint.js", + "sha256": "0150ff9e418bd6d288f0ed9b588da9bc4e1f96dd79c18b8b93a7a719627b834b" + }, + { + "id": "vscode-css-languageservice/services/cssValidation", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/services/cssValidation.js", + "sha256": "388b4731d0f06d428edc481c29dad408967dd9d89ac4548b70698721ec7f1bc9" + }, + { + "id": "vscode-css-languageservice/parser/scssScanner", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/parser/scssScanner.js", + "sha256": "d2a14f27d408de907ce8e3cca02048358c743ed75573ed9c4e771894086e77e9" + }, + { + "id": "vscode-css-languageservice/parser/scssErrors", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/parser/scssErrors.js", + "sha256": "5aa357ae803184c63ba446254811ce548f69043147bfd2ada3c0405400c253b9" + }, + { + "id": "vscode-css-languageservice/parser/scssParser", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/parser/scssParser.js", + "sha256": "e9efcc8541c5010088d396d4f1e29d8bfe61c974a1f0f416513a44a77014b15c" + }, + { + "id": "vscode-css-languageservice/services/scssCompletion", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/services/scssCompletion.js", + "sha256": "7219ba9e076f7c30733854fa466feb5db1d1c6bc998db2a7b305924824549db1" + }, + { + "id": "vscode-css-languageservice/parser/lessScanner", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/parser/lessScanner.js", + "sha256": "74853819ef4d00a32f50e126349f23c984218fffcd54c61babf45a0f401d66a0" + }, + { + "id": "vscode-css-languageservice/parser/lessParser", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/parser/lessParser.js", + "sha256": "95196b16ff95f8cc4cf911fdbf8e1dc011d0f62c2e12b47486a74549ebe0f429" + }, + { + "id": "vscode-css-languageservice/services/lessCompletion", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/services/lessCompletion.js", + "sha256": "52512f0a1dc0676267fb46f1c650b59b9c7bf86f6f6d5d8a06c91723404dd2be" + }, + { + "id": "vscode-css-languageservice/services/cssFolding", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/services/cssFolding.js", + "sha256": "bb2794e309541086adb0f083472030143f2843bd9ae9af9a4c0f81d2c43c8305" + }, + { + "id": "vscode-css-languageservice/data/webCustomData", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/data/webCustomData.js", + "sha256": "9fae0a6b3f7b86242e7ca13f0cbc333c2e16f93fc5ca532d134655a9835221b6" + }, + { + "id": "vscode-css-languageservice/languageFacts/dataProvider", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/languageFacts/dataProvider.js", + "sha256": "3df94e0f896e1616e536f49325cdb0ef51a628d31117586453046ad5ede320aa" + }, + { + "id": "vscode-css-languageservice/languageFacts/dataManager", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/languageFacts/dataManager.js", + "sha256": "033adccfea25862b3ab4e658e2da4affebb611600bdd7b23fc6c8c855c2ed677" + }, + { + "id": "vscode-css-languageservice/services/cssSelectionRange", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/services/cssSelectionRange.js", + "sha256": "c1fcac66818e4fbfdc718925b626502970d3de80672d9673c1ff5dbacc153911" + }, + { + "id": "vscode-css-languageservice/services/scssNavigation", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/services/scssNavigation.js", + "sha256": "747974c4216cc9d36fceb5833bbaebb5d2828242ae06dbe3f1b257a6b4c52434" + }, + { + "id": "vscode-css-languageservice/cssLanguageService", + "archive": "vscode-css-languageservice-5.1.8", + "member": "package/lib/umd/cssLanguageService.js", + "sha256": "5c9e8608e05c59af83be5c4a7ea5ca8d915b6f90a6219cd86bd0107f53adbe29" + }, + { + "id": "vscode-html-languageservice/htmlLanguageTypes", + "archive": "vscode-html-languageservice-4.1.1", + "member": "package/lib/umd/htmlLanguageTypes.js", + "sha256": "982e3a2ab00e4430eebacc273928ebff48625da72f39809ee7c633ebf27caa4e" + }, + { + "id": "vscode-html-languageservice/parser/htmlScanner", + "archive": "vscode-html-languageservice-4.1.1", + "member": "package/lib/umd/parser/htmlScanner.js", + "sha256": "bdf450d86dd0179d009ce7a9fe74908b908ee27ee352ccd1439f66ace2f99f9a" + }, + { + "id": "vscode-html-languageservice/utils/arrays", + "archive": "vscode-html-languageservice-4.1.1", + "member": "package/lib/umd/utils/arrays.js", + "sha256": "3299dfaa289f7acb4948c934e3c52067539d258573113cbf1a9d93c9bfd8b0a5" + }, + { + "id": "vscode-html-languageservice/languageFacts/fact", + "archive": "vscode-html-languageservice-4.1.1", + "member": "package/lib/umd/languageFacts/fact.js", + "sha256": "f32bb00d0985d8e932733ed665d6d9aefed2411f93b975bad5ca92216fa45112" + }, + { + "id": "vscode-html-languageservice/parser/htmlParser", + "archive": "vscode-html-languageservice-4.1.1", + "member": "package/lib/umd/parser/htmlParser.js", + "sha256": "5f3e15e450e27e2a5bbf84dfc1f78bd75605ee767bc038a3cfe76e6b261c22a9" + }, + { + "id": "vscode-html-languageservice/parser/htmlEntities", + "archive": "vscode-html-languageservice-4.1.1", + "member": "package/lib/umd/parser/htmlEntities.js", + "sha256": "31922ec4c2c2e4ea94291fe57fec7c6a451f5bd724ce6d8147cf41a99257bcae" + }, + { + "id": "vscode-html-languageservice/utils/strings", + "archive": "vscode-html-languageservice-4.1.1", + "member": "package/lib/umd/utils/strings.js", + "sha256": "9488b095ef9365d62ca2aba172caa0099e12ad77ae2e3ce392750103e6d93073" + }, + { + "id": "vscode-html-languageservice/utils/object", + "archive": "vscode-html-languageservice-4.1.1", + "member": "package/lib/umd/utils/object.js", + "sha256": "94781228184ce67e6d8d0bbe8d0c82856be525e4541c5f4e5bacdd087f25fe1c" + }, + { + "id": "vscode-html-languageservice/utils/markup", + "archive": "vscode-html-languageservice-4.1.1", + "member": "package/lib/umd/utils/markup.js", + "sha256": "61452127d0d143f3ce39547cea25b6e9a37db9d5692473a78d68018443f995e1" + }, + { + "id": "vscode-html-languageservice/languageFacts/dataProvider", + "archive": "vscode-html-languageservice-4.1.1", + "member": "package/lib/umd/languageFacts/dataProvider.js", + "sha256": "3156f81a9da25a94e2502c9bb718a022f95ec7ff0dd36d874459183fbcb5bce2" + }, + { + "id": "vscode-html-languageservice/services/pathCompletion", + "archive": "vscode-html-languageservice-4.1.1", + "member": "package/lib/umd/services/pathCompletion.js", + "sha256": "98960ad43356fda078d923c57c20cfab041b9d1c10d02e35810ad8be1e589150" + }, + { + "id": "vscode-html-languageservice/services/htmlCompletion", + "archive": "vscode-html-languageservice-4.1.1", + "member": "package/lib/umd/services/htmlCompletion.js", + "sha256": "009c43c6ceac4802df7e943b6a6871adee62d81a829b1af2e78cc0887d519be3" + }, + { + "id": "vscode-html-languageservice/services/htmlHover", + "archive": "vscode-html-languageservice-4.1.1", + "member": "package/lib/umd/services/htmlHover.js", + "sha256": "6d3a706feec6b36675333b4768d45ce606497bb23adb38face9c8f1567022477" + }, + { + "id": "vscode-html-languageservice/beautify/beautify", + "archive": "vscode-html-languageservice-4.1.1", + "member": "package/lib/umd/beautify/beautify.js", + "sha256": "07c96eca8fa5d2897a1ada7d5a166b7aa647d581b3bf50cb2e3e4cba8d9574b7" + }, + { + "id": "vscode-html-languageservice/beautify/beautify-css", + "archive": "vscode-html-languageservice-4.1.1", + "member": "package/lib/umd/beautify/beautify-css.js", + "sha256": "2fecfef68c27cd406a74b0b45ffae7394d0ee5b3fc8f342297b4a4029fa08723" + }, + { + "id": "vscode-html-languageservice/beautify/beautify-html", + "archive": "vscode-html-languageservice-4.1.1", + "member": "package/lib/umd/beautify/beautify-html.js", + "sha256": "4a66107fa529ebe572351eb3f9c5ce89179cb3c9de43430a12a447a423cea092" + }, + { + "id": "vscode-html-languageservice/services/htmlFormatter", + "archive": "vscode-html-languageservice-4.1.1", + "member": "package/lib/umd/services/htmlFormatter.js", + "sha256": "5353913e5123247fbf42d7cd4b43d68f0efa6a67961a592266d04425dafb2254" + }, + { + "id": "vscode-html-languageservice/services/htmlLinks", + "archive": "vscode-html-languageservice-4.1.1", + "member": "package/lib/umd/services/htmlLinks.js", + "sha256": "dddb002d97986746bef35b63fb3d7c0f8421023671a4680d04dc7cdf649f5288" + }, + { + "id": "vscode-html-languageservice/services/htmlHighlighting", + "archive": "vscode-html-languageservice-4.1.1", + "member": "package/lib/umd/services/htmlHighlighting.js", + "sha256": "3fb3d112e834f2c9a9998fcbff20d05a8f5572240fd6d9b462ca8c4e1b967224" + }, + { + "id": "vscode-html-languageservice/services/htmlSymbolsProvider", + "archive": "vscode-html-languageservice-4.1.1", + "member": "package/lib/umd/services/htmlSymbolsProvider.js", + "sha256": "fbf9b4cbb5e61a8983ece43c71536d71266da85a3af77721795abcac48443330" + }, + { + "id": "vscode-html-languageservice/services/htmlRename", + "archive": "vscode-html-languageservice-4.1.1", + "member": "package/lib/umd/services/htmlRename.js", + "sha256": "f4300d94a8e7c711c1ec57d10fb603432ca49fa194ffd5d0a937f5ed10af33f1" + }, + { + "id": "vscode-html-languageservice/services/htmlMatchingTagPosition", + "archive": "vscode-html-languageservice-4.1.1", + "member": "package/lib/umd/services/htmlMatchingTagPosition.js", + "sha256": "538d4a8eb183bbf53bb38a02726f00258cf66ef6db7c328f1fc163bbce78b720" + }, + { + "id": "vscode-html-languageservice/services/htmlLinkedEditing", + "archive": "vscode-html-languageservice-4.1.1", + "member": "package/lib/umd/services/htmlLinkedEditing.js", + "sha256": "0fefcf02a603244607d49ee7b85e0ec81a7289aab96d5382335ecc29913c6497" + }, + { + "id": "vscode-html-languageservice/services/htmlFolding", + "archive": "vscode-html-languageservice-4.1.1", + "member": "package/lib/umd/services/htmlFolding.js", + "sha256": "9dcce482530eaf5504cc96b56b7da3161f3cd7d0e5f06a3db2c37b3b3ba79331" + }, + { + "id": "vscode-html-languageservice/services/htmlSelectionRange", + "archive": "vscode-html-languageservice-4.1.1", + "member": "package/lib/umd/services/htmlSelectionRange.js", + "sha256": "5d8c77bec64f2ccc6c83032adfead3e69a77ebe97b9a561213f617ad34255372" + }, + { + "id": "vscode-html-languageservice/languageFacts/data/webCustomData", + "archive": "vscode-html-languageservice-4.1.1", + "member": "package/lib/umd/languageFacts/data/webCustomData.js", + "sha256": "9bba4331433943077574ebcc0aa0c36321d6097e48afe1a5288858e0c19f0a96" + }, + { + "id": "vscode-html-languageservice/languageFacts/dataManager", + "archive": "vscode-html-languageservice-4.1.1", + "member": "package/lib/umd/languageFacts/dataManager.js", + "sha256": "3ce95d3d6ecea80bdac5016ef34985f466d19b539145de1935c8fc11972d181a" + }, + { + "id": "vscode-html-languageservice/htmlLanguageService", + "archive": "vscode-html-languageservice-4.1.1", + "member": "package/lib/umd/htmlLanguageService.js", + "sha256": "dc6df6148384f49065b0d089052c80d75c09eccbaaec3b315bd4352af32d5884" + }, + { + "id": "jsonc-parser/impl/scanner", + "archive": "jsonc-parser-3.0.0", + "member": "package/lib/umd/impl/scanner.js", + "sha256": "1de9d507a6fc3cbe314fe77d4129db5d0d717b453d6340dc822869f6be6f01ef" + }, + { + "id": "jsonc-parser/impl/format", + "archive": "jsonc-parser-3.0.0", + "member": "package/lib/umd/impl/format.js", + "sha256": "0a6e9addcaba963b19bdc28a9e563affe7ecfa9d710bbbf88a798e134b8c2d9e" + }, + { + "id": "jsonc-parser/impl/parser", + "archive": "jsonc-parser-3.0.0", + "member": "package/lib/umd/impl/parser.js", + "sha256": "0bcb61b4cddc09380ae45a8bb74d97162a46733dd87bada5590579f91abc2a62" + }, + { + "id": "jsonc-parser/impl/edit", + "archive": "jsonc-parser-3.0.0", + "member": "package/lib/umd/impl/edit.js", + "sha256": "be5cbec07265803c812a888d8aeaf18f69c77c827a120486ef38515d6225008d" + }, + { + "id": "jsonc-parser/main", + "archive": "jsonc-parser-3.0.0", + "member": "package/lib/umd/main.js", + "sha256": "09e425ed64c68688277ed7ef8e0b627700134e4e2290aa36b175530b658245aa" + }, + { + "id": "vscode-json-languageservice/utils/objects", + "archive": "vscode-json-languageservice-4.1.9", + "member": "package/lib/umd/utils/objects.js", + "sha256": "a0e8ca194e3b1d4382979d3d9afa6d1c39706a427a8e7175dd5ba52934ee002d" + }, + { + "id": "vscode-json-languageservice/utils/strings", + "archive": "vscode-json-languageservice-4.1.9", + "member": "package/lib/umd/utils/strings.js", + "sha256": "30a235d6a7fbbb695d1dc1934efab7b5d9d54e5cd3c4b2c0ed391e0f3b29f655" + }, + { + "id": "vscode-json-languageservice/jsonLanguageTypes", + "archive": "vscode-json-languageservice-4.1.9", + "member": "package/lib/umd/jsonLanguageTypes.js", + "sha256": "8f3ec73ca0bbfddd228647025ffb70977ad3e6117ed9631c52da17c250abfd16" + }, + { + "id": "vscode-json-languageservice/parser/jsonParser", + "archive": "vscode-json-languageservice-4.1.9", + "member": "package/lib/umd/parser/jsonParser.js", + "sha256": "a5de026273bd8733a0e71ce3e728811e83963cd72cbd9a9144bd50b490574982" + }, + { + "id": "vscode-json-languageservice/utils/json", + "archive": "vscode-json-languageservice-4.1.9", + "member": "package/lib/umd/utils/json.js", + "sha256": "6b4dc8f5b5a750c3777b86385032860cdec81e7d3f60e2ac8d9701d81269ba11" + }, + { + "id": "vscode-json-languageservice/services/jsonCompletion", + "archive": "vscode-json-languageservice-4.1.9", + "member": "package/lib/umd/services/jsonCompletion.js", + "sha256": "576eb397054b08294b67a4cf1aa106834995b58dcf32919c4634a6c23c340907" + }, + { + "id": "vscode-json-languageservice/services/jsonHover", + "archive": "vscode-json-languageservice-4.1.9", + "member": "package/lib/umd/services/jsonHover.js", + "sha256": "428f5942d222674f80c6844cefb2612d023730c584b227a0a8fa30f541d88903" + }, + { + "id": "vscode-json-languageservice/utils/glob", + "archive": "vscode-json-languageservice-4.1.9", + "member": "package/lib/umd/utils/glob.js", + "sha256": "d93f444d070184b3023f66a4dbca8892ce16084308022f5e549516f3fe104009" + }, + { + "id": "vscode-json-languageservice/services/jsonSchemaService", + "archive": "vscode-json-languageservice-4.1.9", + "member": "package/lib/umd/services/jsonSchemaService.js", + "sha256": "44c1710fc51f81f442c7e5d136907b78ac6bae10ea57484081247c8f4e2a555f" + }, + { + "id": "vscode-json-languageservice/services/jsonValidation", + "archive": "vscode-json-languageservice-4.1.9", + "member": "package/lib/umd/services/jsonValidation.js", + "sha256": "141aeca0078844b5c571315ff633ac01f901d03dd1fd926a48de4254ebf390f0" + }, + { + "id": "vscode-json-languageservice/utils/colors", + "archive": "vscode-json-languageservice-4.1.9", + "member": "package/lib/umd/utils/colors.js", + "sha256": "cfa77c1bcc440cfb7a020ff34c9e6de3adcefacd5fcde1feb590dcff35a0b7a0" + }, + { + "id": "vscode-json-languageservice/services/jsonDocumentSymbols", + "archive": "vscode-json-languageservice-4.1.9", + "member": "package/lib/umd/services/jsonDocumentSymbols.js", + "sha256": "8d39c136aa85b33a3dee106ce919cf8ea554b287d31beb1db8da052d51242e8c" + }, + { + "id": "vscode-json-languageservice/services/configuration", + "archive": "vscode-json-languageservice-4.1.9", + "member": "package/lib/umd/services/configuration.js", + "sha256": "50baf826322ce80df882f4e49906ce73a6a6d7b958910335788b6b043b0edade" + }, + { + "id": "vscode-json-languageservice/services/jsonFolding", + "archive": "vscode-json-languageservice-4.1.9", + "member": "package/lib/umd/services/jsonFolding.js", + "sha256": "9e20d176b7d8a73f9ca6b963f825eadc21248304aa2031735bbf635e51cbe8c0" + }, + { + "id": "vscode-json-languageservice/services/jsonSelectionRanges", + "archive": "vscode-json-languageservice-4.1.9", + "member": "package/lib/umd/services/jsonSelectionRanges.js", + "sha256": "fbbadc20c9a705816195f26256dc1971334c36e0759417c99b299824bd8d3399" + }, + { + "id": "vscode-json-languageservice/services/jsonLinks", + "archive": "vscode-json-languageservice-4.1.9", + "member": "package/lib/umd/services/jsonLinks.js", + "sha256": "435e501e3d8f3b50d34ba4bdd14421818e12d1aa1eb631086d47d818091711e4" + }, + { + "id": "vscode-json-languageservice/jsonLanguageService", + "archive": "vscode-json-languageservice-4.1.9", + "member": "package/lib/umd/jsonLanguageService.js", + "sha256": "216f762160fe72d4fc48c550be9b0f0a5b1a3f7fc63fc69e008aa4e7c468e4a3" + } + ], + "aliases": [ + { + "id": "jsonc-parser", + "main": "main" + }, + { + "id": "vscode-css-languageservice", + "main": "cssLanguageService" + }, + { + "id": "vscode-html-languageservice", + "main": "htmlLanguageService" + }, + { + "id": "vscode-json-languageservice", + "main": "jsonLanguageService" + }, + { + "id": "vscode-languageserver-textdocument", + "main": "main" + }, + { + "id": "vscode-languageserver-types", + "main": "main" + }, + { + "id": "vscode-uri", + "main": "index" + }, + { + "id": "vscode-nls", + "main": "vscode-nls" + } + ], + "workers": [ + { + "language": "css", + "development": { + "archive": "monaco-editor-0.30.1", + "member": "package/dev/vs/language/css/cssWorker.js", + "sha256": "469b4efaa98ec340a463d7cf9f34f6efc574ed889e55d0af7f4e1a65c0deb7b5" + }, + "target": { + "path": "docs/assets/js/vs/language/css/cssWorker.js", + "sha256": "073e09f9301dcf147e40ef675e3f18d8cc29de9f49673ec8d17711569144552d" + }, + "ids": [ + "vscode-css-languageservice/parser/cssScanner", + "vscode-css-languageservice/utils/strings", + "vscode-css-languageservice/parser/cssNodes", + "vscode-nls/vscode-nls", + "vscode-nls", + "vscode-css-languageservice/parser/cssErrors", + "vscode-css-languageservice/languageFacts/entry", + "vscode-css-languageservice/languageFacts/colors", + "vscode-css-languageservice/languageFacts/builtinData", + "vscode-css-languageservice/languageFacts/facts", + "vscode-css-languageservice/utils/objects", + "vscode-css-languageservice/parser/cssParser", + "vscode-css-languageservice/utils/arrays", + "vscode-css-languageservice/parser/cssSymbolScope", + "vscode-languageserver-types/main", + "vscode-languageserver-types", + "vscode-languageserver-textdocument/main", + "vscode-languageserver-textdocument", + "vscode-css-languageservice/cssLanguageTypes", + "vscode-uri/index", + "vscode-uri", + "vscode-css-languageservice/utils/resources", + "vscode-css-languageservice/services/pathCompletion", + "vscode-css-languageservice/services/cssCompletion", + "vscode-css-languageservice/services/selectorPrinting", + "vscode-css-languageservice/services/cssHover", + "vscode-css-languageservice/services/cssNavigation", + "vscode-css-languageservice/services/lintRules", + "vscode-css-languageservice/services/cssCodeActions", + "vscode-css-languageservice/services/lintUtil", + "vscode-css-languageservice/services/lint", + "vscode-css-languageservice/services/cssValidation", + "vscode-css-languageservice/parser/scssScanner", + "vscode-css-languageservice/parser/scssErrors", + "vscode-css-languageservice/parser/scssParser", + "vscode-css-languageservice/services/scssCompletion", + "vscode-css-languageservice/parser/lessScanner", + "vscode-css-languageservice/parser/lessParser", + "vscode-css-languageservice/services/lessCompletion", + "vscode-css-languageservice/services/cssFolding", + "vscode-css-languageservice/data/webCustomData", + "vscode-css-languageservice/languageFacts/dataProvider", + "vscode-css-languageservice/languageFacts/dataManager", + "vscode-css-languageservice/services/cssSelectionRange", + "vscode-css-languageservice/services/scssNavigation", + "vscode-css-languageservice/cssLanguageService", + "vscode-css-languageservice", + "vs/language/css/cssWorker" + ], + "source": "refactor/baselines/site-vendor/monaco-languages/monaco-css-src-cssWorker.ts.txt", + "shim": "refactor/baselines/site-vendor/monaco-languages/monaco-css-src-fillers-vscode-nls.ts.txt", + "config": "refactor/baselines/site-vendor/monaco-languages/monaco-css-src-tsconfig.json.txt" + }, + { + "language": "html", + "development": { + "archive": "monaco-editor-0.30.1", + "member": "package/dev/vs/language/html/htmlWorker.js", + "sha256": "8f6344e4a97ba8c42f3b5bc5d9b6d405ab7ea0435077d91f332476d3ddccc3a5" + }, + "target": { + "path": "docs/assets/js/vs/language/html/htmlWorker.js", + "sha256": "0b14f0af7ae7ab85732574fb384496dae3e85d28f953188cc842eec468a8a457" + }, + "ids": [ + "vscode-nls/vscode-nls", + "vscode-nls", + "vscode-languageserver-types/main", + "vscode-languageserver-types", + "vscode-languageserver-textdocument/main", + "vscode-languageserver-textdocument", + "vscode-html-languageservice/htmlLanguageTypes", + "vscode-html-languageservice/parser/htmlScanner", + "vscode-html-languageservice/utils/arrays", + "vscode-html-languageservice/languageFacts/fact", + "vscode-html-languageservice/parser/htmlParser", + "vscode-html-languageservice/parser/htmlEntities", + "vscode-html-languageservice/utils/strings", + "vscode-html-languageservice/utils/object", + "vscode-html-languageservice/utils/markup", + "vscode-html-languageservice/languageFacts/dataProvider", + "vscode-html-languageservice/services/pathCompletion", + "vscode-html-languageservice/services/htmlCompletion", + "vscode-html-languageservice/services/htmlHover", + "vscode-html-languageservice/beautify/beautify", + "vscode-html-languageservice/beautify/beautify-css", + "vscode-html-languageservice/beautify/beautify-html", + "vscode-html-languageservice/services/htmlFormatter", + "vscode-uri/index", + "vscode-uri", + "vscode-html-languageservice/services/htmlLinks", + "vscode-html-languageservice/services/htmlHighlighting", + "vscode-html-languageservice/services/htmlSymbolsProvider", + "vscode-html-languageservice/services/htmlRename", + "vscode-html-languageservice/services/htmlMatchingTagPosition", + "vscode-html-languageservice/services/htmlLinkedEditing", + "vscode-html-languageservice/services/htmlFolding", + "vscode-html-languageservice/services/htmlSelectionRange", + "vscode-html-languageservice/languageFacts/data/webCustomData", + "vscode-html-languageservice/languageFacts/dataManager", + "vscode-html-languageservice/htmlLanguageService", + "vscode-html-languageservice", + "vs/language/html/htmlWorker" + ], + "source": "refactor/baselines/site-vendor/monaco-languages/monaco-html-src-htmlWorker.ts.txt", + "shim": "refactor/baselines/site-vendor/monaco-languages/monaco-html-src-fillers-vscode-nls.ts.txt", + "config": "refactor/baselines/site-vendor/monaco-languages/monaco-html-src-tsconfig.json.txt" + }, + { + "language": "json", + "development": { + "archive": "monaco-editor-0.30.1", + "member": "package/dev/vs/language/json/jsonWorker.js", + "sha256": "81f25e487025e001ce806e1d1b0dea5fc261d3ee4bf4e4485f04203abf727f50" + }, + "target": { + "path": "docs/assets/js/vs/language/json/jsonWorker.js", + "sha256": "0eb929c56d44afddb3030c011913010311ce34e5eadb1129a3ce9cbafd4c771d" + }, + "ids": [ + "jsonc-parser/impl/scanner", + "jsonc-parser/impl/format", + "jsonc-parser/impl/parser", + "jsonc-parser/impl/edit", + "jsonc-parser/main", + "jsonc-parser", + "vscode-json-languageservice/utils/objects", + "vscode-json-languageservice/utils/strings", + "vscode-languageserver-types/main", + "vscode-languageserver-types", + "vscode-languageserver-textdocument/main", + "vscode-languageserver-textdocument", + "vscode-json-languageservice/jsonLanguageTypes", + "vscode-nls/vscode-nls", + "vscode-nls", + "vscode-json-languageservice/parser/jsonParser", + "vscode-json-languageservice/utils/json", + "vscode-json-languageservice/services/jsonCompletion", + "vscode-json-languageservice/services/jsonHover", + "vscode-uri/index", + "vscode-uri", + "vscode-json-languageservice/utils/glob", + "vscode-json-languageservice/services/jsonSchemaService", + "vscode-json-languageservice/services/jsonValidation", + "vscode-json-languageservice/utils/colors", + "vscode-json-languageservice/services/jsonDocumentSymbols", + "vscode-json-languageservice/services/configuration", + "vscode-json-languageservice/services/jsonFolding", + "vscode-json-languageservice/services/jsonSelectionRanges", + "vscode-json-languageservice/services/jsonLinks", + "vscode-json-languageservice/jsonLanguageService", + "vscode-json-languageservice", + "vs/language/json/jsonWorker" + ], + "source": "refactor/baselines/site-vendor/monaco-languages/monaco-json-src-jsonWorker.ts.txt", + "shim": "refactor/baselines/site-vendor/monaco-languages/monaco-json-src-fillers-vscode-nls.ts.txt", + "config": "refactor/baselines/site-vendor/monaco-languages/monaco-json-src-tsconfig.json.txt" + } + ] +} diff --git a/refactor/baselines/monaco-languages-validation.json b/refactor/baselines/monaco-languages-validation.json new file mode 100644 index 000000000..ebe2df804 --- /dev/null +++ b/refactor/baselines/monaco-languages-validation.json @@ -0,0 +1,751 @@ +{ + "schemaVersion": 1, + "task": "SITE-07", + "status": "checkpoint-incomplete", + "recordedAt": "2026-09-15T01:09:12.810Z", + "baseCommit": "11296975f100e027f7dcbf7e5be6663bc9978cd3", + "node": "v24.21.0", + "yarn": "1.22.22", + "fingerprints": { + "sourceRecord": "43d720dbc73f94a2a2bb6d403813f3835f2714dea0fc74b8d846ed83ad506718", + "runtimeChanges": "No changes to any Monaco runtime asset" + }, + "reproduction": { + "result": { + "archives": 11, + "gitSources": 13, + "npmModules": 91, + "aliases": 8, + "workers": [ + { + "language": "css", + "modules": 48, + "exactSources": true, + "exactWorker": true, + "sha256": "073e09f9301dcf147e40ef675e3f18d8cc29de9f49673ec8d17711569144552d" + }, + { + "language": "html", + "modules": 38, + "exactSources": true, + "exactWorker": true, + "sha256": "0b14f0af7ae7ab85732574fb384496dae3e85d28f953188cc842eec468a8a457" + }, + { + "language": "json", + "modules": 33, + "exactSources": true, + "exactWorker": true, + "sha256": "0eb929c56d44afddb3030c011913010311ce34e5eadb1129a3ce9cbafd4c771d" + } + ], + "licenseReviewComplete": false, + "otherMonacoComponentsReviewed": false + }, + "fetchLog": "refactor/.cache/monaco-languages-fetch.log", + "offlineLog": "refactor/.cache/monaco-languages-yarn.log" + }, + "unit": { + "passed": 4, + "log": "refactor/.cache/monaco-languages-unit.log" + }, + "browser": { + "report": "refactor/.cache/browser/report.json", + "sha256": "9c16417579ea84d295d1ae5d0bc5f6d845fa44790abba33119d5ae44f8e500cc", + "tests": [ + { + "project": "chromium", + "title": "docs Monaco CSS, HTML and JSON workers validate, complete and format real models", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "results": { + "cssValid": [], + "cssInvalid": [ + { + "code": "css-propertyvalueexpected", + "source": "css", + "message": "property value expected", + "severity": 1, + "range": { + "start": { + "line": 0, + "character": 11 + }, + "end": { + "line": 0, + "character": 12 + } + } + } + ], + "jsonValid": [], + "jsonInvalid": [ + { + "range": { + "start": { + "line": 0, + "character": 9 + }, + "end": { + "line": 0, + "character": 10 + } + }, + "message": "Value expected", + "severity": 1, + "code": 516, + "source": "json" + } + ], + "completionLabels": [ + "html", + "head", + "title", + "base", + "link", + "meta", + "style", + "body", + "article", + "section", + "nav", + "aside", + "h1", + "h2", + "h3", + "h4", + "h5", + "h6", + "header", + "footer", + "address", + "p", + "hr", + "pre", + "blockquote", + "ol", + "ul", + "li", + "dl", + "dt", + "dd", + "figure", + "figcaption", + "main", + "div", + "a", + "em", + "strong", + "small", + "s", + "cite", + "q", + "dfn", + "abbr", + "ruby", + "rb", + "rt", + "rp", + "time", + "code", + "var", + "samp", + "kbd", + "sub", + "sup", + "i", + "b", + "u", + "mark", + "bdi", + "bdo", + "span", + "br", + "wbr", + "ins", + "del", + "picture", + "img", + "iframe", + "embed", + "object", + "param", + "video", + "audio", + "source", + "track", + "map", + "area", + "table", + "caption", + "colgroup", + "col", + "tbody", + "thead", + "tfoot", + "tr", + "td", + "th", + "form", + "label", + "input", + "button", + "select", + "datalist", + "optgroup", + "option", + "textarea", + "output", + "progress", + "meter", + "fieldset", + "legend", + "details", + "summary", + "dialog", + "script", + "noscript", + "template", + "canvas" + ], + "htmlSymbols": [ + "div", + "p", + "p" + ], + "htmlEdits": [ + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 35 + } + }, + "newText": "
\n

hello

\n

world

\n
" + } + ], + "jsonEdits": [ + { + "range": { + "start": { + "line": 0, + "character": 1 + }, + "end": { + "line": 0, + "character": 1 + } + }, + "newText": "\n " + }, + { + "range": { + "start": { + "line": 0, + "character": 9 + }, + "end": { + "line": 0, + "character": 9 + } + }, + "newText": " " + }, + { + "range": { + "start": { + "line": 0, + "character": 10 + }, + "end": { + "line": 0, + "character": 10 + } + }, + "newText": "\n" + } + ], + "startedWorkers": [ + "http://127.0.0.1:8084/assets/js/vs/base/worker/workerMain.js#css", + "http://127.0.0.1:8084/assets/js/vs/base/worker/workerMain.js#css", + "http://127.0.0.1:8084/assets/js/vs/base/worker/workerMain.js#json", + "http://127.0.0.1:8084/assets/js/vs/base/worker/workerMain.js#json", + "http://127.0.0.1:8084/assets/js/vs/base/worker/workerMain.js#html" + ] + } + }, + { + "project": "firefox", + "title": "docs Monaco CSS, HTML and JSON workers validate, complete and format real models", + "status": "passed", + "retry": 0, + "browser": "155.0", + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "results": { + "cssValid": [], + "cssInvalid": [ + { + "code": "css-propertyvalueexpected", + "source": "css", + "message": "property value expected", + "severity": 1, + "range": { + "start": { + "line": 0, + "character": 11 + }, + "end": { + "line": 0, + "character": 12 + } + } + } + ], + "jsonValid": [], + "jsonInvalid": [ + { + "range": { + "start": { + "line": 0, + "character": 9 + }, + "end": { + "line": 0, + "character": 10 + } + }, + "message": "Value expected", + "severity": 1, + "code": 516, + "source": "json" + } + ], + "completionLabels": [ + "html", + "head", + "title", + "base", + "link", + "meta", + "style", + "body", + "article", + "section", + "nav", + "aside", + "h1", + "h2", + "h3", + "h4", + "h5", + "h6", + "header", + "footer", + "address", + "p", + "hr", + "pre", + "blockquote", + "ol", + "ul", + "li", + "dl", + "dt", + "dd", + "figure", + "figcaption", + "main", + "div", + "a", + "em", + "strong", + "small", + "s", + "cite", + "q", + "dfn", + "abbr", + "ruby", + "rb", + "rt", + "rp", + "time", + "code", + "var", + "samp", + "kbd", + "sub", + "sup", + "i", + "b", + "u", + "mark", + "bdi", + "bdo", + "span", + "br", + "wbr", + "ins", + "del", + "picture", + "img", + "iframe", + "embed", + "object", + "param", + "video", + "audio", + "source", + "track", + "map", + "area", + "table", + "caption", + "colgroup", + "col", + "tbody", + "thead", + "tfoot", + "tr", + "td", + "th", + "form", + "label", + "input", + "button", + "select", + "datalist", + "optgroup", + "option", + "textarea", + "output", + "progress", + "meter", + "fieldset", + "legend", + "details", + "summary", + "dialog", + "script", + "noscript", + "template", + "canvas" + ], + "htmlSymbols": [ + "div", + "p", + "p" + ], + "htmlEdits": [ + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 35 + } + }, + "newText": "
\n

hello

\n

world

\n
" + } + ], + "jsonEdits": [ + { + "range": { + "start": { + "line": 0, + "character": 1 + }, + "end": { + "line": 0, + "character": 1 + } + }, + "newText": "\n " + }, + { + "range": { + "start": { + "line": 0, + "character": 9 + }, + "end": { + "line": 0, + "character": 9 + } + }, + "newText": " " + }, + { + "range": { + "start": { + "line": 0, + "character": 10 + }, + "end": { + "line": 0, + "character": 10 + } + }, + "newText": "\n" + } + ], + "startedWorkers": [ + "/assets/js/vs/base/worker/workerMain.js#css", + "/assets/js/vs/base/worker/workerMain.js#css", + "/assets/js/vs/base/worker/workerMain.js#json", + "/assets/js/vs/base/worker/workerMain.js#json", + "/assets/js/vs/base/worker/workerMain.js#html" + ] + } + }, + { + "project": "webkit", + "title": "docs Monaco CSS, HTML and JSON workers validate, complete and format real models", + "status": "passed", + "retry": 0, + "browser": "26.6", + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "results": { + "cssValid": [], + "cssInvalid": [ + { + "code": "css-propertyvalueexpected", + "source": "css", + "message": "property value expected", + "severity": 1, + "range": { + "start": { + "line": 0, + "character": 11 + }, + "end": { + "line": 0, + "character": 12 + } + } + } + ], + "jsonValid": [], + "jsonInvalid": [ + { + "range": { + "start": { + "line": 0, + "character": 9 + }, + "end": { + "line": 0, + "character": 10 + } + }, + "message": "Value expected", + "severity": 1, + "code": 516, + "source": "json" + } + ], + "completionLabels": [ + "html", + "head", + "title", + "base", + "link", + "meta", + "style", + "body", + "article", + "section", + "nav", + "aside", + "h1", + "h2", + "h3", + "h4", + "h5", + "h6", + "header", + "footer", + "address", + "p", + "hr", + "pre", + "blockquote", + "ol", + "ul", + "li", + "dl", + "dt", + "dd", + "figure", + "figcaption", + "main", + "div", + "a", + "em", + "strong", + "small", + "s", + "cite", + "q", + "dfn", + "abbr", + "ruby", + "rb", + "rt", + "rp", + "time", + "code", + "var", + "samp", + "kbd", + "sub", + "sup", + "i", + "b", + "u", + "mark", + "bdi", + "bdo", + "span", + "br", + "wbr", + "ins", + "del", + "picture", + "img", + "iframe", + "embed", + "object", + "param", + "video", + "audio", + "source", + "track", + "map", + "area", + "table", + "caption", + "colgroup", + "col", + "tbody", + "thead", + "tfoot", + "tr", + "td", + "th", + "form", + "label", + "input", + "button", + "select", + "datalist", + "optgroup", + "option", + "textarea", + "output", + "progress", + "meter", + "fieldset", + "legend", + "details", + "summary", + "dialog", + "script", + "noscript", + "template", + "canvas" + ], + "htmlSymbols": [ + "div", + "p", + "p" + ], + "htmlEdits": [ + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 35 + } + }, + "newText": "
\n

hello

\n

world

\n
" + } + ], + "jsonEdits": [ + { + "range": { + "start": { + "line": 0, + "character": 1 + }, + "end": { + "line": 0, + "character": 1 + } + }, + "newText": "\n " + }, + { + "range": { + "start": { + "line": 0, + "character": 9 + }, + "end": { + "line": 0, + "character": 9 + } + }, + "newText": " " + }, + { + "range": { + "start": { + "line": 0, + "character": 10 + }, + "end": { + "line": 0, + "character": 10 + } + }, + "newText": "\n" + } + ], + "startedWorkers": [ + "http://127.0.0.1:8084/assets/js/vs/base/worker/workerMain.js#css", + "http://127.0.0.1:8084/assets/js/vs/base/worker/workerMain.js#css", + "http://127.0.0.1:8084/assets/js/vs/base/worker/workerMain.js#json", + "http://127.0.0.1:8084/assets/js/vs/base/worker/workerMain.js#json", + "http://127.0.0.1:8084/assets/js/vs/base/worker/workerMain.js#html" + ] + } + } + ] + }, + "limitations": [ + "Source and exact output proof; not a complete upstream semantic typecheck.", + "Language-service original notices and embedded source attribution remain under review.", + "Mode bundles, editor core, basic languages and other site assets are not closed by this record.", + "No playback, physical device, external SDK, remote CI or publication verification in this checkpoint." + ] +} diff --git a/refactor/baselines/site-vendor/monaco-languages/monaco-css-scripts-bundle.js.txt b/refactor/baselines/site-vendor/monaco-languages/monaco-css-scripts-bundle.js.txt new file mode 100644 index 000000000..49709bc5e --- /dev/null +++ b/refactor/baselines/site-vendor/monaco-languages/monaco-css-scripts-bundle.js.txt @@ -0,0 +1,86 @@ +const requirejs = require('requirejs'); +const path = require('path'); +const fs = require('fs'); +const Terser = require('terser'); +const helpers = require('monaco-plugin-helpers'); + +const REPO_ROOT = path.resolve(__dirname, '..', '..'); + +const sha1 = helpers.getGitVersion(REPO_ROOT); +const semver = require('../../package.json').version; +const headerVersion = semver + '(' + sha1 + ')'; + +const BUNDLED_FILE_HEADER = [ + '/*!-----------------------------------------------------------------------------', + ' * Copyright (c) Microsoft Corporation. All rights reserved.', + ' * monaco-css version: ' + headerVersion, + ' * Released under the MIT license', + ' * https://github.com/Microsoft/monaco-css/blob/master/LICENSE.md', + ' *-----------------------------------------------------------------------------*/', + '' +].join('\n'); + +bundleOne('monaco.contribution'); +bundleOne('cssMode', ['vs/language/css/monaco.contribution']); +bundleOne('cssWorker'); + +function bundleOne(moduleId, exclude) { + requirejs.optimize( + { + baseUrl: 'out/amd/', + name: 'vs/language/css/' + moduleId, + out: 'release/dev/' + moduleId + '.js', + exclude: exclude, + paths: { + 'vs/language/css': REPO_ROOT + '/monaco-css/out/amd', + 'vs/language/css/fillers/monaco-editor-core': + REPO_ROOT + '/monaco-css/out/amd/fillers/monaco-editor-core-amd' + }, + optimize: 'none', + packages: [ + { + name: 'vscode-css-languageservice', + location: path.join(REPO_ROOT, 'node_modules/vscode-css-languageservice/lib/umd'), + main: 'cssLanguageService' + }, + { + name: 'vscode-languageserver-types', + location: path.join(REPO_ROOT, 'node_modules/vscode-languageserver-types/lib/umd'), + main: 'main' + }, + { + name: 'vscode-languageserver-textdocument', + location: path.join(REPO_ROOT, 'node_modules/vscode-languageserver-textdocument/lib/umd'), + main: 'main' + }, + { + name: 'vscode-uri', + location: path.join(REPO_ROOT, 'node_modules/vscode-uri/lib/umd'), + main: 'index' + }, + { + name: 'vscode-nls', + location: path.join(REPO_ROOT, 'monaco-css/out/amd/fillers'), + main: 'vscode-nls' + } + ] + }, + async function (buildResponse) { + const devFilePath = path.join(REPO_ROOT, 'monaco-css/release/dev/' + moduleId + '.js'); + const minFilePath = path.join(REPO_ROOT, 'monaco-css/release/min/' + moduleId + '.js'); + const fileContents = fs.readFileSync(devFilePath).toString(); + console.log(); + console.log(`Minifying ${devFilePath}...`); + const result = await Terser.minify(fileContents, { + output: { + comments: 'some' + } + }); + console.log(`Done minifying ${devFilePath}.`); + try { + fs.mkdirSync(path.join(REPO_ROOT, 'monaco-css/release/min')); + } catch (err) {} + fs.writeFileSync(minFilePath, BUNDLED_FILE_HEADER + result.code); + } + ); +} diff --git a/refactor/baselines/site-vendor/monaco-languages/monaco-css-src-cssWorker.ts.txt b/refactor/baselines/site-vendor/monaco-languages/monaco-css-src-cssWorker.ts.txt new file mode 100644 index 000000000..456280439 --- /dev/null +++ b/refactor/baselines/site-vendor/monaco-languages/monaco-css-src-cssWorker.ts.txt @@ -0,0 +1,184 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import type { worker } from './fillers/monaco-editor-core'; +import * as cssService from 'vscode-css-languageservice'; +import { Options } from './monaco.contribution'; + +export class CSSWorker { + // --- model sync ----------------------- + + private _ctx: worker.IWorkerContext; + private _languageService: cssService.LanguageService; + private _languageSettings: cssService.LanguageSettings; + private _languageId: string; + + constructor(ctx: worker.IWorkerContext, createData: ICreateData) { + this._ctx = ctx; + this._languageSettings = createData.options; + this._languageId = createData.languageId; + + const data = createData.options.data; + + const useDefaultDataProvider = data?.useDefaultDataProvider; + const customDataProviders: cssService.ICSSDataProvider[] = []; + if (data?.dataProviders) { + for (const id in data.dataProviders) { + customDataProviders.push(cssService.newCSSDataProvider(data.dataProviders[id])); + } + } + const lsOptions: cssService.LanguageServiceOptions = { + customDataProviders, + useDefaultDataProvider + }; + + switch (this._languageId) { + case 'css': + this._languageService = cssService.getCSSLanguageService(lsOptions); + break; + case 'less': + this._languageService = cssService.getLESSLanguageService(lsOptions); + break; + case 'scss': + this._languageService = cssService.getSCSSLanguageService(lsOptions); + break; + default: + throw new Error('Invalid language id: ' + this._languageId); + } + this._languageService.configure(this._languageSettings); + } + + // --- language service host --------------- + + async doValidation(uri: string): Promise { + let document = this._getTextDocument(uri); + if (document) { + let stylesheet = this._languageService.parseStylesheet(document); + let diagnostics = this._languageService.doValidation(document, stylesheet); + return Promise.resolve(diagnostics); + } + return Promise.resolve([]); + } + async doComplete(uri: string, position: cssService.Position): Promise { + let document = this._getTextDocument(uri); + let stylesheet = this._languageService.parseStylesheet(document); + let completions = this._languageService.doComplete(document, position, stylesheet); + return Promise.resolve(completions); + } + async doHover(uri: string, position: cssService.Position): Promise { + let document = this._getTextDocument(uri); + let stylesheet = this._languageService.parseStylesheet(document); + let hover = this._languageService.doHover(document, position, stylesheet); + return Promise.resolve(hover); + } + async findDefinition(uri: string, position: cssService.Position): Promise { + let document = this._getTextDocument(uri); + let stylesheet = this._languageService.parseStylesheet(document); + let definition = this._languageService.findDefinition(document, position, stylesheet); + return Promise.resolve(definition); + } + async findReferences(uri: string, position: cssService.Position): Promise { + let document = this._getTextDocument(uri); + let stylesheet = this._languageService.parseStylesheet(document); + let references = this._languageService.findReferences(document, position, stylesheet); + return Promise.resolve(references); + } + async findDocumentHighlights( + uri: string, + position: cssService.Position + ): Promise { + let document = this._getTextDocument(uri); + let stylesheet = this._languageService.parseStylesheet(document); + let highlights = this._languageService.findDocumentHighlights(document, position, stylesheet); + return Promise.resolve(highlights); + } + async findDocumentSymbols(uri: string): Promise { + let document = this._getTextDocument(uri); + let stylesheet = this._languageService.parseStylesheet(document); + let symbols = this._languageService.findDocumentSymbols(document, stylesheet); + return Promise.resolve(symbols); + } + async doCodeActions( + uri: string, + range: cssService.Range, + context: cssService.CodeActionContext + ): Promise { + let document = this._getTextDocument(uri); + let stylesheet = this._languageService.parseStylesheet(document); + let actions = this._languageService.doCodeActions(document, range, context, stylesheet); + return Promise.resolve(actions); + } + async findDocumentColors(uri: string): Promise { + let document = this._getTextDocument(uri); + let stylesheet = this._languageService.parseStylesheet(document); + let colorSymbols = this._languageService.findDocumentColors(document, stylesheet); + return Promise.resolve(colorSymbols); + } + async getColorPresentations( + uri: string, + color: cssService.Color, + range: cssService.Range + ): Promise { + let document = this._getTextDocument(uri); + let stylesheet = this._languageService.parseStylesheet(document); + let colorPresentations = this._languageService.getColorPresentations( + document, + stylesheet, + color, + range + ); + return Promise.resolve(colorPresentations); + } + async getFoldingRanges( + uri: string, + context?: { rangeLimit?: number } + ): Promise { + let document = this._getTextDocument(uri); + let ranges = this._languageService.getFoldingRanges(document, context); + return Promise.resolve(ranges); + } + async getSelectionRanges( + uri: string, + positions: cssService.Position[] + ): Promise { + let document = this._getTextDocument(uri); + let stylesheet = this._languageService.parseStylesheet(document); + let ranges = this._languageService.getSelectionRanges(document, positions, stylesheet); + return Promise.resolve(ranges); + } + async doRename( + uri: string, + position: cssService.Position, + newName: string + ): Promise { + let document = this._getTextDocument(uri); + let stylesheet = this._languageService.parseStylesheet(document); + let renames = this._languageService.doRename(document, position, newName, stylesheet); + return Promise.resolve(renames); + } + private _getTextDocument(uri: string): cssService.TextDocument { + let models = this._ctx.getMirrorModels(); + for (let model of models) { + if (model.uri.toString() === uri) { + return cssService.TextDocument.create( + uri, + this._languageId, + model.version, + model.getValue() + ); + } + } + return null; + } +} + +export interface ICreateData { + languageId: string; + options: Options; +} + +export function create(ctx: worker.IWorkerContext, createData: ICreateData): CSSWorker { + return new CSSWorker(ctx, createData); +} diff --git a/refactor/baselines/site-vendor/monaco-languages/monaco-css-src-fillers-vscode-nls.ts.txt b/refactor/baselines/site-vendor/monaco-languages/monaco-css-src-fillers-vscode-nls.ts.txt new file mode 100644 index 000000000..38f7b3349 --- /dev/null +++ b/refactor/baselines/site-vendor/monaco-languages/monaco-css-src-fillers-vscode-nls.ts.txt @@ -0,0 +1,46 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +export interface Options { + locale?: string; + cacheLanguageResolution?: boolean; +} +export interface LocalizeInfo { + key: string; + comment: string[]; +} +export interface LocalizeFunc { + (info: LocalizeInfo, message: string, ...args: any[]): string; + (key: string, message: string, ...args: any[]): string; +} +export interface LoadFunc { + (file?: string): LocalizeFunc; +} + +function format(message: string, args: any[]): string { + let result: string; + + if (args.length === 0) { + result = message; + } else { + result = message.replace(/\{(\d+)\}/g, (match, rest) => { + let index = rest[0]; + return typeof args[index] !== 'undefined' ? args[index] : match; + }); + } + return result; +} + +function localize(key: string | LocalizeInfo, message: string, ...args: any[]): string { + return format(message, args); +} + +export function loadMessageBundle(file?: string): LocalizeFunc { + return localize; +} + +export function config(opt?: Options | string): LoadFunc { + return loadMessageBundle; +} diff --git a/refactor/baselines/site-vendor/monaco-languages/monaco-css-src-tsconfig.json.txt b/refactor/baselines/site-vendor/monaco-languages/monaco-css-src-tsconfig.json.txt new file mode 100644 index 000000000..707f714dd --- /dev/null +++ b/refactor/baselines/site-vendor/monaco-languages/monaco-css-src-tsconfig.json.txt @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "module": "amd", + "moduleResolution": "node", + "outDir": "../out/amd", + "declaration": true, + "target": "es5", + "lib": ["dom", "es5", "es2015.collection", "es2015.promise", "es2015.iterable"] + } +} diff --git a/refactor/baselines/site-vendor/monaco-languages/monaco-html-scripts-bundle.js.txt b/refactor/baselines/site-vendor/monaco-languages/monaco-html-scripts-bundle.js.txt new file mode 100644 index 000000000..d5932edf6 --- /dev/null +++ b/refactor/baselines/site-vendor/monaco-languages/monaco-html-scripts-bundle.js.txt @@ -0,0 +1,86 @@ +const requirejs = require('requirejs'); +const path = require('path'); +const fs = require('fs'); +const terser = require('terser'); +const helpers = require('monaco-plugin-helpers'); + +const REPO_ROOT = path.resolve(__dirname, '..', '..'); + +const sha1 = helpers.getGitVersion(REPO_ROOT); +const semver = require('../../package.json').version; +const headerVersion = semver + '(' + sha1 + ')'; + +const BUNDLED_FILE_HEADER = [ + '/*!-----------------------------------------------------------------------------', + ' * Copyright (c) Microsoft Corporation. All rights reserved.', + ' * monaco-html version: ' + headerVersion, + ' * Released under the MIT license', + ' * https://github.com/Microsoft/monaco-html/blob/master/LICENSE.md', + ' *-----------------------------------------------------------------------------*/', + '' +].join('\n'); + +bundleOne('monaco.contribution'); +bundleOne('htmlMode', ['vs/language/html/monaco.contribution']); +bundleOne('htmlWorker'); + +function bundleOne(moduleId, exclude) { + requirejs.optimize( + { + baseUrl: 'out/amd/', + name: 'vs/language/html/' + moduleId, + out: 'release/dev/' + moduleId + '.js', + exclude: exclude, + paths: { + 'vs/language/html': REPO_ROOT + '/monaco-html/out/amd', + 'vs/language/html/fillers/monaco-editor-core': + REPO_ROOT + '/monaco-html/out/amd/fillers/monaco-editor-core-amd' + }, + optimize: 'none', + packages: [ + { + name: 'vscode-html-languageservice', + location: path.join(REPO_ROOT, 'node_modules/vscode-html-languageservice/lib/umd'), + main: 'htmlLanguageService' + }, + { + name: 'vscode-languageserver-types', + location: path.join(REPO_ROOT, 'node_modules/vscode-languageserver-types/lib/umd'), + main: 'main' + }, + { + name: 'vscode-languageserver-textdocument', + location: path.join(REPO_ROOT, 'node_modules/vscode-languageserver-textdocument/lib/umd'), + main: 'main' + }, + { + name: 'vscode-uri', + location: path.join(REPO_ROOT, 'node_modules/vscode-uri/lib/umd'), + main: 'index' + }, + { + name: 'vscode-nls', + location: path.join(REPO_ROOT, 'monaco-html/out/amd/fillers'), + main: 'vscode-nls' + } + ] + }, + async function (buildResponse) { + const devFilePath = path.join(REPO_ROOT, 'monaco-html/release/dev/' + moduleId + '.js'); + const minFilePath = path.join(REPO_ROOT, 'monaco-html/release/min/' + moduleId + '.js'); + const fileContents = fs.readFileSync(devFilePath).toString(); + console.log(); + console.log(`Minifying ${devFilePath}...`); + const result = await terser.minify(fileContents, { + output: { + comments: 'some' + } + }); + console.log(`Done minifying ${devFilePath}.`); + try { + fs.mkdirSync(path.join(REPO_ROOT, 'monaco-html/release/min')); + } catch (err) {} + fs.writeFileSync(minFilePath, BUNDLED_FILE_HEADER + result.code); + } + ); +} diff --git a/refactor/baselines/site-vendor/monaco-languages/monaco-html-src-fillers-vscode-nls.ts.txt b/refactor/baselines/site-vendor/monaco-languages/monaco-html-src-fillers-vscode-nls.ts.txt new file mode 100644 index 000000000..38f7b3349 --- /dev/null +++ b/refactor/baselines/site-vendor/monaco-languages/monaco-html-src-fillers-vscode-nls.ts.txt @@ -0,0 +1,46 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +export interface Options { + locale?: string; + cacheLanguageResolution?: boolean; +} +export interface LocalizeInfo { + key: string; + comment: string[]; +} +export interface LocalizeFunc { + (info: LocalizeInfo, message: string, ...args: any[]): string; + (key: string, message: string, ...args: any[]): string; +} +export interface LoadFunc { + (file?: string): LocalizeFunc; +} + +function format(message: string, args: any[]): string { + let result: string; + + if (args.length === 0) { + result = message; + } else { + result = message.replace(/\{(\d+)\}/g, (match, rest) => { + let index = rest[0]; + return typeof args[index] !== 'undefined' ? args[index] : match; + }); + } + return result; +} + +function localize(key: string | LocalizeInfo, message: string, ...args: any[]): string { + return format(message, args); +} + +export function loadMessageBundle(file?: string): LocalizeFunc { + return localize; +} + +export function config(opt?: Options | string): LoadFunc { + return loadMessageBundle; +} diff --git a/refactor/baselines/site-vendor/monaco-languages/monaco-html-src-htmlWorker.ts.txt b/refactor/baselines/site-vendor/monaco-languages/monaco-html-src-htmlWorker.ts.txt new file mode 100644 index 000000000..cf5cb6e5f --- /dev/null +++ b/refactor/baselines/site-vendor/monaco-languages/monaco-html-src-htmlWorker.ts.txt @@ -0,0 +1,137 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { worker } from './fillers/monaco-editor-core'; +import * as htmlService from 'vscode-html-languageservice'; +import type { Options } from './monaco.contribution'; +import { IHTMLDataProvider } from 'vscode-html-languageservice'; + +export class HTMLWorker { + private _ctx: worker.IWorkerContext; + private _languageService: htmlService.LanguageService; + private _languageSettings: Options; + private _languageId: string; + + constructor(ctx: worker.IWorkerContext, createData: ICreateData) { + this._ctx = ctx; + this._languageSettings = createData.languageSettings; + this._languageId = createData.languageId; + + const data = this._languageSettings.data; + + const useDefaultDataProvider = data?.useDefaultDataProvider; + const customDataProviders: IHTMLDataProvider[] = []; + if (data?.dataProviders) { + for (const id in data.dataProviders) { + customDataProviders.push(htmlService.newHTMLDataProvider(id, data.dataProviders[id])); + } + } + this._languageService = htmlService.getLanguageService({ + useDefaultDataProvider, + customDataProviders + }); + } + + async doComplete( + uri: string, + position: htmlService.Position + ): Promise { + let document = this._getTextDocument(uri); + let htmlDocument = this._languageService.parseHTMLDocument(document); + return Promise.resolve( + this._languageService.doComplete( + document, + position, + htmlDocument, + this._languageSettings && this._languageSettings.suggest + ) + ); + } + async format( + uri: string, + range: htmlService.Range, + options: htmlService.FormattingOptions + ): Promise { + let document = this._getTextDocument(uri); + let formattingOptions = { ...this._languageSettings.format, ...options }; + let textEdits = this._languageService.format(document, range, formattingOptions); + return Promise.resolve(textEdits); + } + async doHover(uri: string, position: htmlService.Position): Promise { + let document = this._getTextDocument(uri); + let htmlDocument = this._languageService.parseHTMLDocument(document); + let hover = this._languageService.doHover(document, position, htmlDocument); + return Promise.resolve(hover); + } + async findDocumentHighlights( + uri: string, + position: htmlService.Position + ): Promise { + let document = this._getTextDocument(uri); + let htmlDocument = this._languageService.parseHTMLDocument(document); + let highlights = this._languageService.findDocumentHighlights(document, position, htmlDocument); + return Promise.resolve(highlights); + } + async findDocumentLinks(uri: string): Promise { + let document = this._getTextDocument(uri); + let links = this._languageService.findDocumentLinks(document, null); + return Promise.resolve(links); + } + async findDocumentSymbols(uri: string): Promise { + let document = this._getTextDocument(uri); + let htmlDocument = this._languageService.parseHTMLDocument(document); + let symbols = this._languageService.findDocumentSymbols(document, htmlDocument); + return Promise.resolve(symbols); + } + async getFoldingRanges( + uri: string, + context?: { rangeLimit?: number } + ): Promise { + let document = this._getTextDocument(uri); + let ranges = this._languageService.getFoldingRanges(document, context); + return Promise.resolve(ranges); + } + async getSelectionRanges( + uri: string, + positions: htmlService.Position[] + ): Promise { + let document = this._getTextDocument(uri); + let ranges = this._languageService.getSelectionRanges(document, positions); + return Promise.resolve(ranges); + } + async doRename( + uri: string, + position: htmlService.Position, + newName: string + ): Promise { + let document = this._getTextDocument(uri); + let htmlDocument = this._languageService.parseHTMLDocument(document); + let renames = this._languageService.doRename(document, position, newName, htmlDocument); + return Promise.resolve(renames); + } + private _getTextDocument(uri: string): htmlService.TextDocument { + let models = this._ctx.getMirrorModels(); + for (let model of models) { + if (model.uri.toString() === uri) { + return htmlService.TextDocument.create( + uri, + this._languageId, + model.version, + model.getValue() + ); + } + } + return null; + } +} + +export interface ICreateData { + languageId: string; + languageSettings: Options; +} + +export function create(ctx: worker.IWorkerContext, createData: ICreateData): HTMLWorker { + return new HTMLWorker(ctx, createData); +} diff --git a/refactor/baselines/site-vendor/monaco-languages/monaco-html-src-tsconfig.json.txt b/refactor/baselines/site-vendor/monaco-languages/monaco-html-src-tsconfig.json.txt new file mode 100644 index 000000000..707f714dd --- /dev/null +++ b/refactor/baselines/site-vendor/monaco-languages/monaco-html-src-tsconfig.json.txt @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "module": "amd", + "moduleResolution": "node", + "outDir": "../out/amd", + "declaration": true, + "target": "es5", + "lib": ["dom", "es5", "es2015.collection", "es2015.promise", "es2015.iterable"] + } +} diff --git a/refactor/baselines/site-vendor/monaco-languages/monaco-json-scripts-bundle.js.txt b/refactor/baselines/site-vendor/monaco-languages/monaco-json-scripts-bundle.js.txt new file mode 100644 index 000000000..cb54926f4 --- /dev/null +++ b/refactor/baselines/site-vendor/monaco-languages/monaco-json-scripts-bundle.js.txt @@ -0,0 +1,90 @@ +const requirejs = require('requirejs'); +const path = require('path'); +const fs = require('fs'); +const Terser = require('terser'); +const helpers = require('monaco-plugin-helpers'); + +const REPO_ROOT = path.resolve(__dirname, '..', '..'); + +const sha1 = helpers.getGitVersion(REPO_ROOT); +const semver = require('../../package.json').version; +const headerVersion = semver + '(' + sha1 + ')'; + +const BUNDLED_FILE_HEADER = [ + '/*!-----------------------------------------------------------------------------', + ' * Copyright (c) Microsoft Corporation. All rights reserved.', + ' * monaco-json version: ' + headerVersion, + ' * Released under the MIT license', + ' * https://github.com/Microsoft/monaco-json/blob/master/LICENSE.md', + ' *-----------------------------------------------------------------------------*/', + '' +].join('\n'); + +bundleOne('monaco.contribution'); +bundleOne('jsonMode', ['vs/language/json/monaco.contribution']); +bundleOne('jsonWorker'); + +function bundleOne(moduleId, exclude) { + requirejs.optimize( + { + baseUrl: 'out/amd/', + name: 'vs/language/json/' + moduleId, + out: 'release/dev/' + moduleId + '.js', + exclude: exclude, + paths: { + 'vs/language/json': REPO_ROOT + '/monaco-json/out/amd', + 'vs/language/json/fillers/monaco-editor-core': + REPO_ROOT + '/monaco-json/out/amd/fillers/monaco-editor-core-amd' + }, + optimize: 'none', + packages: [ + { + name: 'vscode-json-languageservice', + location: path.join(REPO_ROOT, 'node_modules/vscode-json-languageservice/lib/umd'), + main: 'jsonLanguageService' + }, + { + name: 'vscode-languageserver-types', + location: path.join(REPO_ROOT, 'node_modules/vscode-languageserver-types/lib/umd'), + main: 'main' + }, + { + name: 'vscode-languageserver-textdocument', + location: path.join(REPO_ROOT, 'node_modules/vscode-languageserver-textdocument/lib/umd'), + main: 'main' + }, + { + name: 'jsonc-parser', + location: path.join(REPO_ROOT, 'node_modules/jsonc-parser/lib/umd'), + main: 'main' + }, + { + name: 'vscode-uri', + location: path.join(REPO_ROOT, 'node_modules/vscode-uri/lib/umd'), + main: 'index' + }, + { + name: 'vscode-nls', + location: path.join(REPO_ROOT, 'monaco-json/out/amd/fillers'), + main: 'vscode-nls' + } + ] + }, + async function (buildResponse) { + const devFilePath = path.join(REPO_ROOT, 'monaco-json/release/dev/' + moduleId + '.js'); + const minFilePath = path.join(REPO_ROOT, 'monaco-json/release/min/' + moduleId + '.js'); + const fileContents = fs.readFileSync(devFilePath).toString(); + console.log(`Minifying ${devFilePath}...`); + const result = await Terser.minify(fileContents, { + output: { + comments: 'some' + } + }); + console.log(`Done minifying ${devFilePath}.`); + try { + fs.mkdirSync(path.join(REPO_ROOT, 'monaco-json/release/min')); + } catch (err) {} + fs.writeFileSync(minFilePath, BUNDLED_FILE_HEADER + result.code); + } + ); +} diff --git a/refactor/baselines/site-vendor/monaco-languages/monaco-json-src-fillers-vscode-nls.ts.txt b/refactor/baselines/site-vendor/monaco-languages/monaco-json-src-fillers-vscode-nls.ts.txt new file mode 100644 index 000000000..38f7b3349 --- /dev/null +++ b/refactor/baselines/site-vendor/monaco-languages/monaco-json-src-fillers-vscode-nls.ts.txt @@ -0,0 +1,46 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +export interface Options { + locale?: string; + cacheLanguageResolution?: boolean; +} +export interface LocalizeInfo { + key: string; + comment: string[]; +} +export interface LocalizeFunc { + (info: LocalizeInfo, message: string, ...args: any[]): string; + (key: string, message: string, ...args: any[]): string; +} +export interface LoadFunc { + (file?: string): LocalizeFunc; +} + +function format(message: string, args: any[]): string { + let result: string; + + if (args.length === 0) { + result = message; + } else { + result = message.replace(/\{(\d+)\}/g, (match, rest) => { + let index = rest[0]; + return typeof args[index] !== 'undefined' ? args[index] : match; + }); + } + return result; +} + +function localize(key: string | LocalizeInfo, message: string, ...args: any[]): string { + return format(message, args); +} + +export function loadMessageBundle(file?: string): LocalizeFunc { + return localize; +} + +export function config(opt?: Options | string): LoadFunc { + return loadMessageBundle; +} diff --git a/refactor/baselines/site-vendor/monaco-languages/monaco-json-src-jsonWorker.ts.txt b/refactor/baselines/site-vendor/monaco-languages/monaco-json-src-jsonWorker.ts.txt new file mode 100644 index 000000000..781b58e26 --- /dev/null +++ b/refactor/baselines/site-vendor/monaco-languages/monaco-json-src-jsonWorker.ts.txt @@ -0,0 +1,192 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as jsonService from 'vscode-json-languageservice'; +import type { worker } from './fillers/monaco-editor-core'; +import { URI } from 'vscode-uri'; +import { DiagnosticsOptions } from './monaco.contribution'; + +let defaultSchemaRequestService; +if (typeof fetch !== 'undefined') { + defaultSchemaRequestService = function (url) { + return fetch(url).then((response) => response.text()); + }; +} + +export class JSONWorker { + private _ctx: worker.IWorkerContext; + private _languageService: jsonService.LanguageService; + private _languageSettings: DiagnosticsOptions; + private _languageId: string; + + constructor(ctx: worker.IWorkerContext, createData: ICreateData) { + this._ctx = ctx; + this._languageSettings = createData.languageSettings; + this._languageId = createData.languageId; + this._languageService = jsonService.getLanguageService({ + workspaceContext: { + resolveRelativePath: (relativePath: string, resource: string) => { + const base = resource.substr(0, resource.lastIndexOf('/') + 1); + return resolvePath(base, relativePath); + } + }, + schemaRequestService: createData.enableSchemaRequest && defaultSchemaRequestService + }); + this._languageService.configure(this._languageSettings); + } + + async doValidation(uri: string): Promise { + let document = this._getTextDocument(uri); + if (document) { + let jsonDocument = this._languageService.parseJSONDocument(document); + return this._languageService.doValidation(document, jsonDocument, this._languageSettings); + } + return Promise.resolve([]); + } + async doComplete( + uri: string, + position: jsonService.Position + ): Promise { + let document = this._getTextDocument(uri); + let jsonDocument = this._languageService.parseJSONDocument(document); + return this._languageService.doComplete(document, position, jsonDocument); + } + async doResolve(item: jsonService.CompletionItem): Promise { + return this._languageService.doResolve(item); + } + async doHover(uri: string, position: jsonService.Position): Promise { + let document = this._getTextDocument(uri); + let jsonDocument = this._languageService.parseJSONDocument(document); + return this._languageService.doHover(document, position, jsonDocument); + } + async format( + uri: string, + range: jsonService.Range, + options: jsonService.FormattingOptions + ): Promise { + let document = this._getTextDocument(uri); + let textEdits = this._languageService.format(document, range, options); + return Promise.resolve(textEdits); + } + async resetSchema(uri: string): Promise { + return Promise.resolve(this._languageService.resetSchema(uri)); + } + async findDocumentSymbols(uri: string): Promise { + let document = this._getTextDocument(uri); + let jsonDocument = this._languageService.parseJSONDocument(document); + let symbols = this._languageService.findDocumentSymbols(document, jsonDocument); + return Promise.resolve(symbols); + } + async findDocumentColors(uri: string): Promise { + let document = this._getTextDocument(uri); + let jsonDocument = this._languageService.parseJSONDocument(document); + let colorSymbols = this._languageService.findDocumentColors(document, jsonDocument); + return Promise.resolve(colorSymbols); + } + async getColorPresentations( + uri: string, + color: jsonService.Color, + range: jsonService.Range + ): Promise { + let document = this._getTextDocument(uri); + let jsonDocument = this._languageService.parseJSONDocument(document); + let colorPresentations = this._languageService.getColorPresentations( + document, + jsonDocument, + color, + range + ); + return Promise.resolve(colorPresentations); + } + async getFoldingRanges( + uri: string, + context?: { rangeLimit?: number } + ): Promise { + let document = this._getTextDocument(uri); + let ranges = this._languageService.getFoldingRanges(document, context); + return Promise.resolve(ranges); + } + async getSelectionRanges( + uri: string, + positions: jsonService.Position[] + ): Promise { + let document = this._getTextDocument(uri); + let jsonDocument = this._languageService.parseJSONDocument(document); + let ranges = this._languageService.getSelectionRanges(document, positions, jsonDocument); + return Promise.resolve(ranges); + } + private _getTextDocument(uri: string): jsonService.TextDocument { + let models = this._ctx.getMirrorModels(); + for (let model of models) { + if (model.uri.toString() === uri) { + return jsonService.TextDocument.create( + uri, + this._languageId, + model.version, + model.getValue() + ); + } + } + return null; + } +} + +// URI path utilities, will (hopefully) move to vscode-uri + +const Slash = '/'.charCodeAt(0); +const Dot = '.'.charCodeAt(0); + +function isAbsolutePath(path: string) { + return path.charCodeAt(0) === Slash; +} + +function resolvePath(uriString: string, path: string): string { + if (isAbsolutePath(path)) { + const uri = URI.parse(uriString); + const parts = path.split('/'); + return uri.with({ path: normalizePath(parts) }).toString(); + } + return joinPath(uriString, path); +} + +function normalizePath(parts: string[]): string { + const newParts: string[] = []; + for (const part of parts) { + if (part.length === 0 || (part.length === 1 && part.charCodeAt(0) === Dot)) { + // ignore + } else if (part.length === 2 && part.charCodeAt(0) === Dot && part.charCodeAt(1) === Dot) { + newParts.pop(); + } else { + newParts.push(part); + } + } + if (parts.length > 1 && parts[parts.length - 1].length === 0) { + newParts.push(''); + } + let res = newParts.join('/'); + if (parts[0].length === 0) { + res = '/' + res; + } + return res; +} + +function joinPath(uriString: string, ...paths: string[]): string { + const uri = URI.parse(uriString); + const parts = uri.path.split('/'); + for (let path of paths) { + parts.push(...path.split('/')); + } + return uri.with({ path: normalizePath(parts) }).toString(); +} + +export interface ICreateData { + languageId: string; + languageSettings: DiagnosticsOptions; + enableSchemaRequest: boolean; +} + +export function create(ctx: worker.IWorkerContext, createData: ICreateData): JSONWorker { + return new JSONWorker(ctx, createData); +} diff --git a/refactor/baselines/site-vendor/monaco-languages/monaco-json-src-tsconfig.json.txt b/refactor/baselines/site-vendor/monaco-languages/monaco-json-src-tsconfig.json.txt new file mode 100644 index 000000000..707f714dd --- /dev/null +++ b/refactor/baselines/site-vendor/monaco-languages/monaco-json-src-tsconfig.json.txt @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "module": "amd", + "moduleResolution": "node", + "outDir": "../out/amd", + "declaration": true, + "target": "es5", + "lib": ["dom", "es5", "es2015.collection", "es2015.promise", "es2015.iterable"] + } +} diff --git a/refactor/changes/2026-09-15-SITE-07-monaco-languages.md b/refactor/changes/2026-09-15-SITE-07-monaco-languages.md new file mode 100644 index 000000000..e0a49dadc --- /dev/null +++ b/refactor/changes/2026-09-15-SITE-07-monaco-languages.md @@ -0,0 +1,52 @@ +# SITE-07 Monaco CSS/HTML/JSON worker 来源复现 + +修改前 HEAD:11296975f100e027f7dcbf7e5be6663bc9978cd3。 + +本批把临时比对变成可联网准备、离线重复执行的源码验证,覆盖三个完整 worker。 +保留现有 Monaco 0.30.1 运行资产、路径和 API;没有升级编辑器或修改其压缩文件。 + +## 实现与证据边界 + +- 固定 11 份 npm 归档,检查 SHA-256 和 SHA-512;编译输入取自已有固定上游锁。 + source-map 0.7.3 是 Terser 的嵌套依赖,不能误取根层的 0.6.1。 +- 固定 13 份 Git 源码:既有根锁,加三个包各自的 bundle 配方、编译配置、 + 本地化 shim 和 worker 适配器;同时检查 Git blob SHA 与内容 SHA-256。 +- 七个 npm 包的 91 个完整 UMD 源文件、八个根别名、一个共享 shim 和三个 + worker 适配器,组成 CSS/HTML/JSON 的 48/38/33 个模块实例。完整片段逐字匹配, + 模块之间仅允许空白,不能遗漏 define 外的辅助代码、额外模块或依赖路径变化。 +- 三个完整开发版 worker 经原 Terser 5.9.0 配方和头部处理,与当前压缩产物 + 逐字节相等。`vscode-nls` 来自 Monaco 自有 filler,三个文件相同,不是锁里的 + 同名 npm 实现。适配器用 TypeScript 4.4.4 与其原始标准库发射;只证明产物, + 未恢复整个上游工程的语义类型检查和安装流程。 + +新增 archives.ts 管理隔离归档与编译器输入;languages.ts 管理 AMD 命名及全文件 +源码覆盖;reproduce-languages.ts 组织固定输入、适配器发射、全部来源及压缩验证。 +脚本 `yarn verify:monaco-language-sources [--fetch]` 不执行服务运行时或安装脚本。 +Node 24.21.0 / Yarn 1.22.22、根依赖及 yarn.lock 保持不变。 + +核验实际发现并处理了几个差异,未放宽检查绕过: + +1. 无结尾换行的 types/main 与 uri/index 源映射注释被旧优化器保留并追加分号。 + 按实际字节恢复,而不是忽略所有未覆盖文本。 +2. 单文件 transpileModule 的 Promise 类型解析与真实程序发射不同;改用固定 + 编译器和标准库的程序发射。未解析的服务 import 不被声称为类型检查通过。 +3. 新浏览器测试最初使用了该历史版本不存在的 CSS/HTML/JSON getter;对照原 + mode manager 后改用公共 createWebWorker 和相同 createData,并检查实际 Worker。 +4. HTML 格式器保留行内 span 是正常行为;格式化样本改用应分行的块元素 p, + 仍要求实际多行编辑,未删除格式断言。 + +## 验证与下一步 + +单元 4/4,通过真实源码复现验证 119 个模块实例;严格 docs-tools 类型检查、 +相关 ESLint、工具链检查通过。联网复现及 Yarn 离线入口通过。新增浏览器用例 +三引擎 3/3、无重试/跳过,验证 CSS/JSON 正反诊断、HTML 补全/符号、HTML/JSON +格式化、实际 Worker 创建及模型/worker 清理。浏览器版本、原始输出指纹和范围 +见 [验证记录](../baselines/monaco-languages-validation.json)。 + +本批不是播放、真机、外部 SDK、远端 CI 或完整站点验收。服务包的完整原始 +LICENSE/第三方说明及内嵌 beautifier、数据来源继续审查;本批没有宣称许可闭环。 +Monaco mode bundles、核心内嵌库与语言定义也继续核对。 +SITE-07 doing / VENDOR-06 open,总计仍 199/265 done。 + +回退仅撤销本批来源验证、冻结源码、测试及文档;站点运行资产未变。本地独立 +checkpoint 提交,没有推送、部署或发布。 diff --git a/refactor/plan.md b/refactor/plan.md index 9d83925f0..5606d7c3d 100644 --- a/refactor/plan.md +++ b/refactor/plan.md @@ -653,7 +653,7 @@ - SITE-AI-DOCS-01: [记录](changes/2026-09-14-SITE-AI-DOCS-01-documentation-pipeline.md) [记录](baselines/documentation-pipeline-validation.json) - SITE-BUILD-01: [记录](changes/2026-09-14-SITE-BUILD-01-staged-builds.md) [记录](baselines/site-build-validation.json) - SITE-03: [记录](changes/2026-09-14-SITE-03-desktop-editor.md) [记录](baselines/site-editor-validation.json) -- SITE-07: [记录](site-inventory.md) [记录](baselines/site-provenance.json) [记录](changes/2026-09-14-SITE-07-vendor-notices.md) [记录](baselines/site-notices-checkpoint.json) [记录](baselines/site-codicons-provenance.json) [记录](baselines/site-codicons-validation.json) [记录](changes/2026-09-15-SITE-07-codicons.md) [记录](baselines/vconsole-notices-provenance.json) [记录](baselines/vconsole-notices-validation.json) [记录](changes/2026-09-15-SITE-07-vconsole-notices.md) [记录](console-modernization.md) [记录](baselines/site-console-inventory.json) [记录](baselines/site-console-validation.json) [记录](changes/2026-09-15-SITE-07-console-baseline.md) [记录](baselines/console-feed-provenance.json) [记录](changes/2026-09-15-SITE-07-console-feed-source.md) [记录](baselines/console-commonjs-provenance.json) [记录](changes/2026-09-15-SITE-07-console-commonjs.md) [记录](baselines/console-esm-provenance.json) [记录](changes/2026-09-15-SITE-07-console-esm.md) [记录](baselines/console-embedded-notices.json) [记录](baselines/console-notices-validation.json) [记录](changes/2026-09-15-SITE-07-console-notices.md) [记录](baselines/console-embedded-sources.json) [记录](baselines/console-embedded-validation.json) [记录](changes/2026-09-15-SITE-07-console-embedded-sources.md) [记录](baselines/console-derived-attribution.json) [记录](baselines/console-derived-validation.json) [记录](changes/2026-09-15-SITE-07-console-derived-attribution.md) [记录](baselines/console-stackoverflow-provenance.json) [记录](baselines/console-stackoverflow-validation.json) [记录](changes/2026-09-15-SITE-07-console-stackoverflow.md) [记录](baselines/console-shallowequal-validation.json) [记录](changes/2026-09-15-SITE-07-console-shallowequal.md) [记录](console-notice-review.md) [记录](baselines/console-notice-review-validation.json) [记录](changes/2026-09-15-SITE-07-console-notice-review.md) [记录](baselines/monaco-typescript-provenance.json) [记录](baselines/monaco-typescript-validation.json) [记录](changes/2026-09-15-SITE-07-monaco-typescript.md) +- SITE-07: [记录](site-inventory.md) [记录](baselines/site-provenance.json) [记录](changes/2026-09-14-SITE-07-vendor-notices.md) [记录](baselines/site-notices-checkpoint.json) [记录](baselines/site-codicons-provenance.json) [记录](baselines/site-codicons-validation.json) [记录](changes/2026-09-15-SITE-07-codicons.md) [记录](baselines/vconsole-notices-provenance.json) [记录](baselines/vconsole-notices-validation.json) [记录](changes/2026-09-15-SITE-07-vconsole-notices.md) [记录](console-modernization.md) [记录](baselines/site-console-inventory.json) [记录](baselines/site-console-validation.json) [记录](changes/2026-09-15-SITE-07-console-baseline.md) [记录](baselines/console-feed-provenance.json) [记录](changes/2026-09-15-SITE-07-console-feed-source.md) [记录](baselines/console-commonjs-provenance.json) [记录](changes/2026-09-15-SITE-07-console-commonjs.md) [记录](baselines/console-esm-provenance.json) [记录](changes/2026-09-15-SITE-07-console-esm.md) [记录](baselines/console-embedded-notices.json) [记录](baselines/console-notices-validation.json) [记录](changes/2026-09-15-SITE-07-console-notices.md) [记录](baselines/console-embedded-sources.json) [记录](baselines/console-embedded-validation.json) [记录](changes/2026-09-15-SITE-07-console-embedded-sources.md) [记录](baselines/console-derived-attribution.json) [记录](baselines/console-derived-validation.json) [记录](changes/2026-09-15-SITE-07-console-derived-attribution.md) [记录](baselines/console-stackoverflow-provenance.json) [记录](baselines/console-stackoverflow-validation.json) [记录](changes/2026-09-15-SITE-07-console-stackoverflow.md) [记录](baselines/console-shallowequal-validation.json) [记录](changes/2026-09-15-SITE-07-console-shallowequal.md) [记录](console-notice-review.md) [记录](baselines/console-notice-review-validation.json) [记录](changes/2026-09-15-SITE-07-console-notice-review.md) [记录](baselines/monaco-typescript-provenance.json) [记录](baselines/monaco-typescript-validation.json) [记录](changes/2026-09-15-SITE-07-monaco-typescript.md) [记录](baselines/monaco-languages-provenance.json) [记录](baselines/monaco-languages-validation.json) [记录](changes/2026-09-15-SITE-07-monaco-languages.md) - EX-01: [记录](changes/2026-09-14-EX-01-react-consumer.md) [记录](baselines/react-consumer-validation.json) [记录](scripts/react-consumer.mjs) - EX-02: [记录](changes/2026-09-14-EX-02-vue-consumer.md) [记录](baselines/vue-consumer-validation.json) [记录](scripts/vue-consumer.mjs) - MOD-01: [记录](changes/2026-09-15-MOD-01-bun-evaluation.md) [记录](baselines/bun-install-validation.json) [记录](bun-evaluation.md) diff --git a/refactor/progress.md b/refactor/progress.md index 0520abb8f..058d90a43 100644 --- a/refactor/progress.md +++ b/refactor/progress.md @@ -1,5 +1,13 @@ # 进度与证据 +## SITE-07 Monaco CSS/HTML/JSON worker + +完成三个 worker 的全部源码片段与压缩产物复现:11 归档、13 Git 来源、119 模块 +实例,nls 确认为 Monaco 自有 shim。单元 4/4、三引擎真实 worker 诊断/补全/格式化 +3/3 通过,见[记录](changes/2026-09-15-SITE-07-monaco-languages.md)。运行资产和锁 +未改;服务包原始 notices 与内嵌来源、mode/core/basic-language 继续审查。 +SITE-07 doing、VENDOR-06 open,整体 199/265,没有推送或发布。 + ## SITE-07 Monaco TypeScript 4.4.4 核对实际worker与固定提交锁,补充准确版本及三份原始许可/第三方说明,保留 diff --git a/refactor/risks.json b/refactor/risks.json index c81eb3491..d84003cac 100644 --- a/refactor/risks.json +++ b/refactor/risks.json @@ -629,11 +629,16 @@ "refactor/baselines/monaco-typescript-validation.json", "refactor/changes/2026-09-15-SITE-07-monaco-typescript.md", "scripts/site-vendor/monaco/typescript.ts", - "scripts/site-vendor/monaco/reproduce-typescript.ts" + "scripts/site-vendor/monaco/reproduce-typescript.ts", + "refactor/baselines/monaco-languages-provenance.json", + "refactor/baselines/monaco-languages-validation.json", + "refactor/changes/2026-09-15-SITE-07-monaco-languages.md", + "scripts/site-vendor/monaco/languages.ts", + "scripts/site-vendor/monaco/reproduce-languages.ts" ], "compatibleResolution": "Keep separate from owned TS migration. Verify source/version/diff and license notices before replacement; preserve API/CSS/worker URLs and run owning package tests.", "closureCriteria": "固定上游版本/内容差异、完整组件许可与分发 notices,兼容测试通过;仅当前上游许可证名称不足以关闭。", - "workspaceState": "Monaco 0.30.1 TypeScript worker identifies 4.4.4, unlike the original stale 2.7.2 notice. Fixed Git lock/recipes and four archives prove the 9698327-character adapted service segment and exact minified worker. Three original TypeScript notices plus a version/modification explanation are delivered. Unit 10/10 and three-engine editor/notice checks 6/6 pass. Other language services, shim, core embedded libraries and language definitions remain under review; VENDOR-06 is open." + "workspaceState": "Monaco 0.30.1 TypeScript worker identifies 4.4.4, unlike the original stale 2.7.2 notice. Fixed Git lock/recipes and four archives prove the 9698327-character adapted service segment and exact minified worker. Three original TypeScript notices plus a version/modification explanation are delivered. Unit 10/10 and three-engine editor/notice checks 6/6 pass. Other language services, shim, core embedded libraries and language definitions remain under review; VENDOR-06 is open. CSS/HTML/JSON complete workers now have exact source coverage for 119 module instances from 91 npm sources, 8 aliases, a shared Monaco-owned nls shim and three adapters; 11 archives/13 Git sources and all three minified outputs match. Four unit tests and three real-engine diagnostics/completion/formatting checks pass. Service notices, embedded attribution, mode bundles, core and basic languages remain open." }, { "id": "VENDOR-07", diff --git a/refactor/tasks.json b/refactor/tasks.json index 2e05810c2..88d90bcc7 100644 --- a/refactor/tasks.json +++ b/refactor/tasks.json @@ -4514,7 +4514,10 @@ "changes/2026-09-15-SITE-07-console-notice-review.md", "baselines/monaco-typescript-provenance.json", "baselines/monaco-typescript-validation.json", - "changes/2026-09-15-SITE-07-monaco-typescript.md" + "changes/2026-09-15-SITE-07-monaco-typescript.md", + "baselines/monaco-languages-provenance.json", + "baselines/monaco-languages-validation.json", + "changes/2026-09-15-SITE-07-monaco-languages.md" ] }, { diff --git a/scripts/site-vendor/monaco/README.md b/scripts/site-vendor/monaco/README.md index 56347402a..b68619f1c 100644 --- a/scripts/site-vendor/monaco/README.md +++ b/scripts/site-vendor/monaco/README.md @@ -40,8 +40,49 @@ CopyrightNotice and ThirdPartyNoticeText. The last file includes upstream third- terms, not just Apache 2.0. Preserve raw bytes, including encoding and line endings. The new attribution explains upstream modifications and the stale version label. -The other language services, localization shim, core embedded libraries and -language definitions remain under VENDOR-06 review. A match for this worker does -not close those components. Revalidate actual editor diagnostics/emission and -notice HTTP delivery after changes; use the committed editor-types and site-vendor -browser tests. Whole-site, physical-device and remote release gates remain separate. +## CSS, HTML and JSON workers + +`languages.ts` names anonymous AMD modules syntactically, accounts for exact map +trailers and package aliases, and checks every source fragment and intervening byte. +It rejects missing modules, renamed dependencies, uncovered helper code, overlaps +and duplicate definitions. The npm sources are whole UMD files, including their +helpers and comments; module bodies alone are insufficient evidence. + +`archives.ts` verifies archives and fixed Git files and extracts only historical +compiler inputs into the isolated cache. `reproduce-languages.ts` uses the fixed +upstream lock and recipes to match 91 npm modules from seven packages, eight root +aliases, the shared Monaco localization shim and three worker adapters. The complete +CSS/HTML/JSON development files contain 48/38/33 module instances respectively. +All bytes except whitespace are assigned to a verified source fragment. Terser +5.9.0 with the original options and header reproduces all three shipped workers. + +The shim is Monaco's own `src/fillers/vscode-nls.ts`, identical in the three packages; +it is not the installed `vscode-nls` npm implementation. Compile the shim and worker +adapters with TypeScript 4.4.4 and its ES5/DOM/collection/promise/iterable libraries. +The compiler program intentionally omits import resolution; exact emission is +verified, but this is not a full upstream build or semantic typecheck. Standalone +`transpileModule` changes an async helper's Promise argument and does not reproduce +these adapters. No service runtime or install script executes during source checks. + +```sh +yarn verify:monaco-language-sources --fetch +yarn verify:monaco-language-sources +node --test test/monaco-provenance.test.js +yarn typecheck:docs-tools +yarn test:browser test/browser/editor-languages.spec.js --workers=1 +``` + +The source record is `refactor/baselines/monaco-languages-provenance.json`; its 13 +fixed Git references include the shared upstream lock plus all three bundle recipes, +compiler configs, shims and adapters. The browser suite creates real workers with +Monaco's public `createWebWorker`, using the archived mode-manager options, and +disposes both workers and models. Monaco 0.30.1 has no public CSS/HTML/JSON worker +getter equivalent to `getTypeScriptWorker`. Tests exercise valid/invalid CSS and +JSON, HTML tag completion, document symbols, and HTML/JSON formatting on three engines. + +This source checkpoint does not close embedded license review. Follow up with the +seven packages' original licenses/third-party notices, including HTML beautifiers +and data sources. Core embedded libraries, mode bundles and language definitions +also remain under VENDOR-06. Revalidate editor-types and site-vendor tests when +changing declarations or delivered notices. Whole-site, physical-device and remote +release gates remain separate. diff --git a/scripts/site-vendor/monaco/archives.ts b/scripts/site-vendor/monaco/archives.ts new file mode 100644 index 000000000..f0fd49713 --- /dev/null +++ b/scripts/site-vendor/monaco/archives.ts @@ -0,0 +1,80 @@ +import assert from 'node:assert/strict' +import { Buffer } from 'node:buffer' +import { execFileSync } from 'node:child_process' +import { createHash } from 'node:crypto' +import fs from 'node:fs' +import path from 'node:path' + +export interface Archive { name: string, version: string, tarball: string, integrity: string, sha256: string } +export interface Member { archive: string, member: string, sha256: string } +export interface Remote { source: string, sha256: string, gitBlobSha: string, apiUrl: string } +export const hash = (bytes: Uint8Array) => createHash('sha256').update(bytes).digest('hex') + +async function download(url: string): Promise { + const response = await fetch(url, { signal: AbortSignal.timeout(60000) }) + assert(response.ok, `${url}: HTTP ${response.status}`) + return Buffer.from(await response.arrayBuffer()) +} + +// Historical inputs stay in an isolated cache; never install their package scripts. +export class ArchiveCache { + readonly root: string + readonly directory: string + + constructor(root: string, directory: string) { + this.root = root + this.directory = directory + fs.mkdirSync(directory, { recursive: true }) + assert.equal(fs.realpathSync(directory).toLowerCase(), path.resolve(directory).toLowerCase(), 'Redirected Monaco cache') + } + + async verify(archives: Archive[], remotes: Remote[], fetch: boolean): Promise { + for (const archive of archives) { + const file = path.join(this.directory, `${archive.name}-${archive.version}.tgz`) + const bytes = fetch ? await download(archive.tarball) : fs.readFileSync(file) + assert.equal(hash(bytes), archive.sha256, `Monaco archive changed: ${archive.name}`) + assert.equal(`sha512-${createHash('sha512').update(bytes).digest('base64')}`, archive.integrity, 'Monaco archive integrity changed') + if (fetch) + fs.writeFileSync(file, bytes) + } + for (const remote of remotes) { + const verify = (bytes: Buffer) => { + assert.equal(hash(bytes), remote.sha256, 'Monaco fixed Git content changed') + assert.equal(createHash('sha1').update(`blob ${bytes.length}\0`).update(bytes).digest('hex'), remote.gitBlobSha, 'Monaco Git blob changed') + } + verify(fs.readFileSync(path.join(this.root, remote.source))) + if (fetch) { + const data: { encoding: string, content: string } = JSON.parse((await download(remote.apiUrl)).toString('utf8')) + assert.equal(data.encoding, 'base64', 'Expected Git content encoding') + verify(Buffer.from(data.content, 'base64')) + } + } + } + + read(archive: string, member: string): Buffer { + return execFileSync('tar', ['-xOzf', path.join(this.directory, `${archive}.tgz`), member], { maxBuffer: 20 * 1024 * 1024 }) + } + + member(member: Member): Buffer { + const bytes = this.read(member.archive, member.member) + assert.equal(hash(bytes), member.sha256, `Monaco source member changed: ${member.member}`) + return bytes + } + + extractCompiler(archive: Archive): void { + const name = `${archive.name}-${archive.version}` + const members = execFileSync('tar', ['-tzf', path.join(this.directory, `${name}.tgz`)], { encoding: 'utf8' }).trim().split(/\r?\n/) + const directory = path.join(this.directory, 'compiler/node_modules', archive.name) + fs.mkdirSync(directory, { recursive: true }) + assert.equal(fs.realpathSync(directory).toLowerCase(), path.resolve(directory).toLowerCase(), 'Redirected compiler directory') + for (const member of members.filter(member => !member.endsWith('/'))) { + assert(member.startsWith('package/') && !member.includes('\\') && !member.split('/').includes('..'), 'Unsafe compiler archive member') + const destination = path.resolve(directory, member.slice('package/'.length)) + assert(destination.startsWith(`${directory}${path.sep}`), 'Compiler member escapes cache') + fs.mkdirSync(path.dirname(destination), { recursive: true }) + assert.equal(fs.realpathSync(path.dirname(destination)).toLowerCase(), path.dirname(destination).toLowerCase(), 'Redirected compiler member directory') + assert(!fs.existsSync(destination) || !fs.lstatSync(destination).isSymbolicLink(), 'Redirected compiler file') + fs.writeFileSync(destination, this.read(name, member)) + } + } +} diff --git a/scripts/site-vendor/monaco/languages.ts b/scripts/site-vendor/monaco/languages.ts new file mode 100644 index 000000000..1e2d0c54f --- /dev/null +++ b/scripts/site-vendor/monaco/languages.ts @@ -0,0 +1,81 @@ +import assert from 'node:assert/strict' +import ts from 'typescript' + +function definitions(source: string): ts.CallExpression[] { + const ast = ts.createSourceFile('worker.js', source, ts.ScriptTarget.Latest, true, ts.ScriptKind.JS) + const result: ts.CallExpression[] = [] + const walk = (node: ts.Node) => { + if (ts.isCallExpression(node) && ts.isIdentifier(node.expression) && node.expression.text === 'define') + result.push(node) + ts.forEachChild(node, walk) + } + walk(ast) + return result +} + +export function moduleIds(source: string): string[] { + const ids = definitions(source).map((call) => { + assert(call.arguments[0] && ts.isStringLiteral(call.arguments[0]), 'Expected literal AMD name') + return call.arguments[0].text + }) + assert.equal(new Set(ids).size, ids.length, 'Duplicate AMD module') + return ids +} + +// RequireJS names one anonymous AMD definition and removes newline-ended maps. +// Locate the call syntactically so comments/strings containing define( are inert. +export function nameModule(source: string, id: string): string { + assert(/^[\w/-]+$/.test(id), 'Unexpected AMD identifier') + const calls = definitions(source) + assert.equal(calls.length, 1, 'Expected one anonymous AMD definition') + const call = calls[0]! + assert(call.arguments[0] && ts.isArrayLiteralExpression(call.arguments[0]), 'Expected anonymous AMD dependency array') + const offset = call.expression.end + assert.equal(source[offset], '(', 'Unexpected AMD opening boundary') + const map = /^\/\/# sourceMappingURL=[^\r\n]+(?:\r?\n)?$/gm + const maps = [...source.matchAll(map)] + assert(maps.length <= 1, 'Duplicate source map trailer') + source = `${source.slice(0, offset + 1)}'${id}',${source.slice(offset + 1)}` + // types/main and uri/index have no final newline. The archived optimizer kept + // their map comment and appended a semicolon; account for those bytes too. + if (maps[0] && !maps[0][0].endsWith('\n')) + return `${source};` + return source.replace(map, '').trimEnd() +} + +export function aliasModule(id: string, main: string): string { + assert(/^[\w-]+$/.test(id) && /^[\w/-]+$/.test(main), 'Unexpected AMD alias') + return `define('${id}', ['${id}/${main}'], function (main) { return main; });` +} + +// Check whole source fragments, their module ownership and every intervening byte. +// A module inventory alone would overlook helper code outside define() calls. +export function verifyWorkerSources(worker: string, ids: string[], fragments: { id: string, source: string }[]): void { + assert.deepEqual(moduleIds(worker), ids, 'Worker AMD inventory changed') + assert.deepEqual(fragments.map(item => item.id).sort(), [...ids].sort(), 'Incomplete source coverage') + const intervals = fragments.map(({ id, source }) => { + assert.deepEqual(moduleIds(source), [id], 'Wrong source module ownership') + const start = worker.indexOf(source) + assert(start >= 0, `Source differs: ${id}`) + assert.equal(worker.indexOf(source, start + 1), -1, `Repeated source: ${id}`) + return { start, end: start + source.length } + }).sort((a, b) => a.start - b.start) + let end = 0 + for (const interval of intervals) { + assert(interval.start >= end, 'Overlapping source fragments') + assert.equal(worker.slice(end, interval.start).trim(), '', 'Unattributed worker content') + end = interval.end + } + assert.equal(worker.slice(end).trim(), '', 'Unattributed worker suffix') +} + +export function languageHeader(language: string): string { + assert(['css', 'html', 'json'].includes(language), 'Unexpected Monaco language') + return `/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-${language} version: 0.30.1(5a7ba61be909ae9e4889768a3453ebb0dec392e2) + * Released under the MIT license + * https://github.com/Microsoft/monaco-${language}/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +` +} diff --git a/scripts/site-vendor/monaco/reproduce-languages.ts b/scripts/site-vendor/monaco/reproduce-languages.ts new file mode 100644 index 000000000..c5a343637 --- /dev/null +++ b/scripts/site-vendor/monaco/reproduce-languages.ts @@ -0,0 +1,118 @@ +import type { Archive, Member, Remote } from './archives.ts' +import assert from 'node:assert/strict' +import fs from 'node:fs' +import { createRequire } from 'node:module' +import path from 'node:path' +import process from 'node:process' +import { fileURLToPath } from 'node:url' +import { ArchiveCache, hash } from './archives.ts' +import { aliasModule, languageHeader, nameModule, verifyWorkerSources } from './languages.ts' + +interface Provenance { + archives: Archive[] + remotes: Remote[] + compilerMembers: Member[] + modules: (Member & { id: string })[] + aliases: { id: string, main: string }[] + workers: { + language: string + development: Member + target: { path: string, sha256: string } + ids: string[] + source: string + shim: string + config: string + }[] +} +const root = fileURLToPath(new URL('../../../', import.meta.url)) +assert(process.argv.slice(2).every(arg => arg === '--fetch'), 'Use reproduce-languages.ts [--fetch]') +assert.equal(process.version, `v${fs.readFileSync(path.join(root, '.node-version'), 'utf8').trim()}`, 'Use canonical Node') +const record: Provenance = JSON.parse(fs.readFileSync(path.join(root, 'refactor/baselines/monaco-languages-provenance.json'), 'utf8')) +assert.deepEqual(record.workers.map(worker => worker.language), ['css', 'html', 'json'], 'Missing language worker') +assert.equal(record.modules.length, 91, 'Missing historical npm module') +assert.equal(new Set(record.modules.map(member => member.id)).size, 91, 'Duplicate npm module source') +assert.equal(record.aliases.length, 8, 'Missing historical package alias') +assert.equal(new Set(record.aliases.map(alias => alias.id)).size, 8, 'Duplicate package alias') +const lock = JSON.parse(fs.readFileSync(path.join(root, 'refactor/baselines/site-vendor/monaco-typescript/package-lock.json.txt'), 'utf8')) +for (const archive of record.archives.filter(item => item.name !== 'monaco-editor')) { + const entry = archive.name === 'source-map' ? lock.dependencies.terser.dependencies['source-map'] : lock.dependencies[archive.name] + assert(entry && entry.version === archive.version && entry.resolved === archive.tarball && entry.integrity === archive.integrity, 'Archive differs from the fixed upstream lock') +} +for (const member of record.modules) { + const [name, ...parts] = member.id.split('/') + const archive = record.archives.find(item => item.name === name) + assert(archive && member.archive === `${name}-${archive.version}`, 'Wrong module archive binding') + assert.equal(member.member, `package/lib/umd/${parts.join('/')}.js`, 'Wrong UMD source path') +} +const cache = new ArchiveCache(root, path.join(root, 'refactor/.cache/monaco-review')) +await cache.verify(record.archives, record.remotes, process.argv.includes('--fetch')) +for (const name of ['typescript', 'terser', 'source-map']) { + const archive = record.archives.find(item => item.name === name) + assert(archive, 'Missing historical compiler dependency') + cache.extractCompiler(archive) +} +for (const member of record.compilerMembers) + cache.member(member) +const require = createRequire(path.join(cache.directory, 'compiler/entry.cjs')) +const ts = require('typescript') as typeof import('typescript') + +const terser = require('terser') as { minify: (source: string, options: { output: { comments: string } }) => Promise<{ code: string }> } + +assert.equal(ts.version, '4.4.4', 'Wrong TypeScript compiler') +assert.equal(require('terser/package.json').version, '5.9.0', 'Wrong Terser compiler') + +assert.equal(require('source-map/package.json').version, '0.7.3', 'Wrong minifier dependency') + +function compile(source: string): string { + // Emit with the real pinned standard libraries. Isolated transpileModule loses + // Promise type resolution and emits a different async helper argument here. + // Unresolved service imports are intentionally not a full upstream typecheck. + const options: import('typescript').CompilerOptions = { + target: ts.ScriptTarget.ES5, + module: ts.ModuleKind.AMD, + newLine: ts.NewLineKind.LineFeed, + noResolve: true, + lib: ['lib.es5.d.ts', 'lib.dom.d.ts', 'lib.es2015.collection.d.ts', 'lib.es2015.promise.d.ts', 'lib.es2015.iterable.d.ts'], + } + const host = ts.createCompilerHost(options) + const getSourceFile = host.getSourceFile.bind(host) + host.getSourceFile = (file, languageVersion, onError, createNew) => file === 'worker.ts' + ? ts.createSourceFile(file, source, languageVersion, true) + : getSourceFile(file, languageVersion, onError, createNew) + let output = '' + host.writeFile = (file, text) => { + assert(file.endsWith('.js') && !output, 'Unexpected compiler output') + output = text + } + const program = ts.createProgram(['worker.ts'], options, host) + const result = program.emit() + assert(!result.emitSkipped && output, 'Missing language source emission') + return output +} +const modules = new Map(record.modules.map(member => [member.id, nameModule(cache.member(member).toString('utf8'), member.id)])) +const aliases = new Map(record.aliases.map(alias => [alias.id, aliasModule(alias.id, alias.main)])) +const results = [] +for (const worker of record.workers) { + const config = JSON.parse(fs.readFileSync(path.join(root, worker.config), 'utf8')).compilerOptions + assert.equal(config.module, 'amd') + assert.equal(config.target, 'es5') + assert.deepEqual(config.lib, ['dom', 'es5', 'es2015.collection', 'es2015.promise', 'es2015.iterable']) + const ownId = `vs/language/${worker.language}/${worker.language}Worker` + const local = new Map([ + [ownId, nameModule(compile(fs.readFileSync(path.join(root, worker.source), 'utf8')), ownId)], + ['vscode-nls/vscode-nls', nameModule(compile(fs.readFileSync(path.join(root, worker.shim), 'utf8')), 'vscode-nls/vscode-nls')], + ]) + const development = cache.member(worker.development).toString('utf8') + const fragments = worker.ids.map((id) => { + const source = local.get(id) ?? modules.get(id) ?? aliases.get(id) + assert(source, `Missing source for ${id}`) + return { id, source } + }) + verifyWorkerSources(development, worker.ids, fragments) + const target = fs.readFileSync(path.join(root, worker.target.path)) + assert.equal(hash(target), worker.target.sha256, 'Shipped Monaco language worker changed') + const { code } = await terser.minify(development, { output: { comments: 'some' } }) + assert.equal(languageHeader(worker.language) + code, target.toString('utf8'), 'Minified language worker differs') + results.push({ language: worker.language, modules: worker.ids.length, exactSources: true, exactWorker: true, sha256: hash(target) }) +} +console.log(JSON.stringify({ archives: record.archives.length, gitSources: record.remotes.length, npmModules: modules.size, aliases: aliases.size, workers: results, licenseReviewComplete: false, otherMonacoComponentsReviewed: false })) diff --git a/test/browser/README.md b/test/browser/README.md index d61e9f0aa..2de6116fd 100644 --- a/test/browser/README.md +++ b/test/browser/README.md @@ -1,5 +1,12 @@ # Browser regression entry +`editor-languages.spec.js` loads the frozen Monaco 0.30.1 CSS/HTML/JSON workers, +checks real Worker creation, positive/negative diagnostics, tag completion, document +symbols and formatting, and disposes models/workers. It uses `createWebWorker` with +the archived mode managers' options; this version does not expose public language +worker getters other than TypeScript. These checks complement `editor-types.spec.js` +and do not replace full editor UI or actual player playback tests. + `yarn test:vast-native` is the explicit external Google IMA suite; it is separate from default `*.spec.js` PR checks. It uses local VAST/media inputs and real SDK loading, playback, content restoration and destruction. See diff --git a/test/browser/editor-languages.spec.js b/test/browser/editor-languages.spec.js new file mode 100644 index 000000000..d5aea317d --- /dev/null +++ b/test/browser/editor-languages.spec.js @@ -0,0 +1,67 @@ +import { expect, test } from './fixtures.js' + +test('docs Monaco CSS, HTML and JSON workers validate, complete and format real models', async ({ page }, testInfo) => { + const startedWorkers = [] + page.on('worker', worker => startedWorkers.push(worker.url())) + await page.goto('/test/player.html?core=candidate&chapter=published') + await page.addScriptTag({ url: '/assets/js/vs/loader.js' }) + const result = await page.evaluate(async () => { + window.require.config({ paths: { vs: '/assets/js/vs' } }) + await new Promise((resolve, reject) => window.require(['vs/editor/editor.main'], resolve, reject)) + const api = window.monaco + const models = [] + const workers = [] + const model = (text, language, name) => { + const value = api.editor.createModel(text, language, api.Uri.parse(`file:///${name}`)) + models.push(value) + return value + } + const connect = async (language, createData, resources) => { + // Monaco 0.30.1 exposes getTypeScriptWorker but no CSS/HTML/JSON accessor. + // Use the same public worker constructor and createData as its mode managers. + const worker = api.editor.createWebWorker({ moduleId: `vs/language/${language}/${language}Worker`, label: language, createData }) + workers.push(worker) + await worker.withSyncedResources(resources.map(model => model.uri)) + return worker.getProxy() + } + try { + const css = model('a { color: red; }', 'css', 'valid.css') + const badCss = model('a { color: ; }', 'css', 'invalid.css') + const json = model('{"value":1}', 'json', 'valid.json') + const badJson = model('{"value":}', 'json', 'invalid.json') + const html = model('

hello

world

', 'html', 'valid.html') + const htmlCompletion = model(' item.label), + htmlSymbols: symbols.map(item => item.name), + htmlEdits: edits, + jsonEdits, + } + } + finally { + workers.forEach(worker => worker.dispose()) + models.forEach(model => model.dispose()) + } + }) + await testInfo.attach('monaco-language-results', { contentType: 'application/json', body: JSON.stringify({ ...result, startedWorkers }, null, 2) }) + expect(startedWorkers.length).toBeGreaterThanOrEqual(3) + expect(result.cssValid).toEqual([]) + expect(result.cssInvalid.some(item => item.severity === 1 && item.message)).toBe(true) + expect(result.jsonValid).toEqual([]) + expect(result.jsonInvalid.some(item => item.severity === 1 && item.message)).toBe(true) + expect(result.completionLabels).toContain('div') + expect(result.htmlSymbols).toEqual(['div', 'p', 'p']) + expect(result.htmlEdits.some(item => item.newText.includes('\n') && item.newText.includes('hello'))).toBe(true) + expect(result.jsonEdits.some(item => item.newText.includes('\n'))).toBe(true) +}) diff --git a/test/monaco-provenance.test.js b/test/monaco-provenance.test.js index 8f9c979bc..b42f759b7 100644 --- a/test/monaco-provenance.test.js +++ b/test/monaco-provenance.test.js @@ -1,6 +1,7 @@ import assert from 'node:assert/strict' // eslint-disable-next-line test/no-import-node-test -- Verify fixed source transforms without executing archived runtime. import test from 'node:test' +import { aliasModule, moduleIds, nameModule, verifyWorkerSources } from '../scripts/site-vendor/monaco/languages.ts' import { browserTypeScript, verifyTypeScriptSource } from '../scripts/site-vendor/monaco/typescript.ts' const source = `"use strict"; @@ -37,3 +38,36 @@ test('Monaco TypeScript proof rejects modified or repeated worker content', () = assert.throws(() => verifyTypeScriptSource(source, worker + output), /Duplicate/) assert.throws(() => verifyTypeScriptSource(source, worker.slice(1)), /differs/) }) + +test('Monaco AMD naming ignores strings and preserves source bodies', () => { + const anonymous = '// define(fake)\nconst example = "define(fake)";\ndefine(["exports"], function (exports) { exports.value = 1; });\n//# sourceMappingURL=source.js.map\n' + const named = nameModule(anonymous, 'library/main') + assert(named.includes('const example = "define(fake)";')) + assert(named.includes('define(\'library/main\',["exports"]')) + assert(!named.includes('sourceMappingURL')) + assert.deepEqual(moduleIds(named), ['library/main']) + assert(nameModule(anonymous.trimEnd(), 'library/main').endsWith('//# sourceMappingURL=source.js.map;')) + assert.throws(() => nameModule(named, 'library/main'), /anonymous AMD dependency array/) + assert.throws(() => nameModule(anonymous + anonymous, 'library/main'), /one anonymous/) + assert.throws(() => nameModule(anonymous, 'library/\'main'), /identifier/) + assert.throws(() => nameModule(`${anonymous}//# sourceMappingURL=second.map\n`, 'library/main'), /Duplicate source map/) +}) + +test('Monaco worker proof covers helper code, aliases and all module boundaries', () => { + const id = 'library/main' + const source = nameModule('const helper = 1;\ndefine(["exports"], function (exports) { exports.value = helper; });', id) + const alias = aliasModule('library', 'main') + const worker = `${source}\n\n${alias}\n` + const fragments = [{ id, source }, { id: 'library', source: alias }] + const ids = [id, 'library'] + verifyWorkerSources(worker, ids, fragments) + assert.throws(() => verifyWorkerSources(worker.replace('helper = 1', 'helper = 2'), ids, fragments), /Source differs/) + assert.throws(() => verifyWorkerSources(`globalThis.hidden = true;\n${worker}`, ids, fragments), /Unattributed worker content/) + assert.throws(() => verifyWorkerSources(`${worker}globalThis.hidden = true;`, ids, fragments), /Unattributed worker suffix/) + assert.throws(() => verifyWorkerSources(worker, ids, fragments.slice(0, 1)), /Incomplete source coverage/) + assert.throws(() => verifyWorkerSources(worker, ids, [{ id, source: alias }, fragments[1]]), /ownership/) + assert.throws(() => verifyWorkerSources(worker.replace('[\'library/main\']', '[\'library/other\']'), ids, fragments), /Source differs/) + assert.throws(() => verifyWorkerSources(worker + alias, ids, fragments), /Duplicate AMD/) + assert.throws(() => verifyWorkerSources(`${worker}define('extra', [], function () {});`, ids, fragments), /inventory changed/) + assert.throws(() => moduleIds('define(dynamicName, [], function () {});'), /literal AMD name/) +})