build(site): [SITE-07] reproduce Monaco CSS HTML and JSON workers

This commit is contained in:
Harvey Zhao committed 2026-09-15 09:10:16 +08:00
1 parent 11296975f1
commit 0d3ddbf355
28 files changed
+3158 -10

No files matched your search

+1
View File
@@ -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
+2 -1
View File
@@ -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": {
@@ -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"
}
]
}
@@ -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": "<div>\n <p>hello</p>\n <p>world</p>\n</div>"
}
],
"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": "<div>\n <p>hello</p>\n <p>world</p>\n</div>"
}
],
"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": "<div>\n <p>hello</p>\n <p>world</p>\n</div>"
}
],
"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."
]
}
@@ -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);
}
);
}
@@ -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<cssService.Diagnostic[]> {
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<cssService.CompletionList> {
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<cssService.Hover> {
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<cssService.Location> {
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<cssService.Location[]> {
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<cssService.DocumentHighlight[]> {
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<cssService.SymbolInformation[]> {
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<cssService.Command[]> {
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<cssService.ColorInformation[]> {
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<cssService.ColorPresentation[]> {
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<cssService.FoldingRange[]> {
let document = this._getTextDocument(uri);
let ranges = this._languageService.getFoldingRanges(document, context);
return Promise.resolve(ranges);
}
async getSelectionRanges(
uri: string,
positions: cssService.Position[]
): Promise<cssService.SelectionRange[]> {
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<cssService.WorkspaceEdit> {
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);
}
@@ -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;
}
@@ -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"]
}
}
@@ -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);
}
);
}
@@ -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;
}
@@ -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<htmlService.CompletionList> {
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<htmlService.TextEdit[]> {
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<htmlService.Hover> {
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<htmlService.DocumentHighlight[]> {
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<htmlService.DocumentLink[]> {
let document = this._getTextDocument(uri);
let links = this._languageService.findDocumentLinks(document, null);
return Promise.resolve(links);
}
async findDocumentSymbols(uri: string): Promise<htmlService.SymbolInformation[]> {
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<htmlService.FoldingRange[]> {
let document = this._getTextDocument(uri);
let ranges = this._languageService.getFoldingRanges(document, context);
return Promise.resolve(ranges);
}
async getSelectionRanges(
uri: string,
positions: htmlService.Position[]
): Promise<htmlService.SelectionRange[]> {
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<htmlService.WorkspaceEdit> {
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);
}
@@ -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"]
}
}
@@ -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);
}
);
}
@@ -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;
}
@@ -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<jsonService.Diagnostic[]> {
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<jsonService.CompletionList> {
let document = this._getTextDocument(uri);
let jsonDocument = this._languageService.parseJSONDocument(document);
return this._languageService.doComplete(document, position, jsonDocument);
}
async doResolve(item: jsonService.CompletionItem): Promise<jsonService.CompletionItem> {
return this._languageService.doResolve(item);
}
async doHover(uri: string, position: jsonService.Position): Promise<jsonService.Hover> {
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<jsonService.TextEdit[]> {
let document = this._getTextDocument(uri);
let textEdits = this._languageService.format(document, range, options);
return Promise.resolve(textEdits);
}
async resetSchema(uri: string): Promise<boolean> {
return Promise.resolve(this._languageService.resetSchema(uri));
}
async findDocumentSymbols(uri: string): Promise<jsonService.SymbolInformation[]> {
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<jsonService.ColorInformation[]> {
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<jsonService.ColorPresentation[]> {
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<jsonService.FoldingRange[]> {
let document = this._getTextDocument(uri);
let ranges = this._languageService.getFoldingRanges(document, context);
return Promise.resolve(ranges);
}
async getSelectionRanges(
uri: string,
positions: jsonService.Position[]
): Promise<jsonService.SelectionRange[]> {
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);
}
@@ -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"]
}
}
@@ -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 提交,没有推送、部署或发布。
+1 -1
View File
@@ -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)
+8
View File
@@ -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与固定提交锁,补充准确版本及三份原始许可/第三方说明,保留
+7 -2
View File
@@ -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",
+4 -1
View File
@@ -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"
]
},
{
+46 -5
View File
@@ -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.
+80
View File
@@ -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<Buffer> {
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<void> {
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))
}
}
}
+81
View File
@@ -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
*-----------------------------------------------------------------------------*/
`
}
@@ -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 }))
+7
View File
@@ -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
+67
View File
@@ -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('<div><p>hello</p><p>world</p></div>', 'html', 'valid.html')
const htmlCompletion = model('<di', 'html', 'completion.html')
const cssWorker = await connect('css', { languageId: 'css', options: api.languages.css.cssDefaults.options }, [css, badCss])
const jsonWorker = await connect('json', { languageId: 'json', languageSettings: api.languages.json.jsonDefaults.diagnosticsOptions, enableSchemaRequest: false }, [json, badJson])
const htmlWorker = await connect('html', { languageId: 'html', languageSettings: api.languages.html.htmlDefaults.options }, [html, htmlCompletion])
const completion = await htmlWorker.doComplete(htmlCompletion.uri.toString(), { line: 0, character: 3 })
const symbols = await htmlWorker.findDocumentSymbols(html.uri.toString())
const edits = await htmlWorker.format(html.uri.toString(), null, { tabSize: 2, insertSpaces: true, wrapLineLength: 120 })
const jsonEdits = await jsonWorker.format(json.uri.toString(), null, { tabSize: 2, insertSpaces: true })
return {
cssValid: await cssWorker.doValidation(css.uri.toString()),
cssInvalid: await cssWorker.doValidation(badCss.uri.toString()),
jsonValid: await jsonWorker.doValidation(json.uri.toString()),
jsonInvalid: await jsonWorker.doValidation(badJson.uri.toString()),
completionLabels: completion.items.map(item => 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)
})
+34
View File
@@ -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/)
})