Skip to content

Commit eaa6bbe

Browse files
authoredAug 1, 2024
Add CI to validate extensions.json (foxglove#32)
### Changelog None ### Docs None ### Description Adds validation script to avoid future errors in extensions.json: - Check SHA matches - Check that some required files are present - Check that readme & changelog point at markdown (text) files rather than HTML or something else - Warn if files in the .foxe are not compressed (foxglove/create-foxglove-extension#147) Checking the `id` values requires some more attention (and maybe changes to the app) so not solving that in this PR.
1 parent 76c86e6 commit eaa6bbe

File tree

8 files changed

+579
-1
lines changed

8 files changed

+579
-1
lines changed
 

‎.github/workflows/ci.yml

+10-1
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,14 @@ jobs:
1111
steps:
1212
- uses: actions/checkout@v4
1313

14+
- run: corepack enable
15+
16+
- uses: actions/setup-node@v4.0.2
17+
with:
18+
node-version: 22
19+
cache: yarn
20+
21+
- run: yarn install --immutable
22+
1423
- name: Validate extensions.json
15-
run: jq . extensions.json >/dev/null
24+
run: yarn validate

‎.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ npm-debug.log*
55
yarn-debug.log*
66
yarn-error.log*
77
lerna-debug.log*
8+
.yarn
89

910
# Diagnostic reports (https://nodejs.org/api/report.html)
1011
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json

‎.vscode/settings.json

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"editor.formatOnSave": true
3+
}

‎.yarnrc.yml

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
nodeLinker: node-modules

‎package.json

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"packageManager": "yarn@4.3.1",
3+
"private": true,
4+
"scripts": {
5+
"validate": "ts-node validate.ts"
6+
},
7+
"devDependencies": {
8+
"@actions/core": "1.10.1",
9+
"@foxglove/tsconfig": "2.0.0",
10+
"@types/node": "22.0.2",
11+
"jszip": "3.10.1",
12+
"ts-node": "10.9.2",
13+
"typescript": "5.5.4"
14+
}
15+
}

‎tsconfig.json

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"extends": "@foxglove/tsconfig/base",
3+
"compilerOptions": {
4+
"importHelpers": false,
5+
"lib": ["es2022"],
6+
"module": "NodeNext",
7+
"moduleResolution": "NodeNext",
8+
"resolveJsonModule": true
9+
}
10+
}

‎validate.ts

+158
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
import JSZip from "jszip";
2+
import registryJson from "./extensions.json";
3+
import crypto from "node:crypto";
4+
import path from "node:path";
5+
import * as core from "@actions/core";
6+
7+
function warning(message: string) {
8+
core.warning(message, { file: "extensions.json" });
9+
}
10+
11+
function error(message: string) {
12+
core.error(message, { file: "extensions.json" });
13+
process.exitCode = core.ExitCode.Failure;
14+
}
15+
16+
/**
17+
* SHA sums of extensions that are known to be uncompressed. For these we will only log a warning.
18+
* For other (newer) ones it will be an error if compression is not used.
19+
*/
20+
const knownUncompressedExtensionsSHAs = [
21+
"fa2b11af8ed7c420ca6e541196bca608661c0c1a81cd1f768c565c72a55a63c8",
22+
"ac07f5f84b96ad1139b4d66b685b864cf5713081e198e63fccef7a0546dd1ab2",
23+
"1193589eb2779a1224328defca4e2ca378ef786474be1842ac43b674b9535d82",
24+
"f03d7a517ba6f7d57564eec965358055c87285a8a504d5488af969767a76c4ab",
25+
"71ae6c6ffa4b86aa427d14fcc86af437fdca4b5e10cd714e70f95e1af324ceaf",
26+
"87e0a4fe397974fb2e3771f370009ccdbe195498d4792c04bc08b2e2482bda71",
27+
"6afa4437c45cb5b60a99405e40b0c51b4edfcc0f9a640532cc218962da1ee2b8",
28+
"b5c02cb834005affcf1873a6a481281a73428d04062bbf763863c8fb7e64fc95",
29+
"12863df314ec682e23ebb74598e3e3e89e610fa960f3461b5e91a6896ed8228f",
30+
"bfbb33b91f337a25de79449f9b529bc94bfaf908187f39cef24d70d4e1083434",
31+
"5b2dbe3280a7833c8d827e4f3b8acfa4df9cf4cd16a5db037885a6cfcdd42041",
32+
"d7b831c665111aeab5779bea6f5b8f7d5c3afa6d2200d1f79ba2bafbb799497c",
33+
"90af3124c1a68ab5b9b5d3faa480d1c77c0dd902ac1c7a71dea3f445c2df7939",
34+
"249be37fe7c42a2bf647b344f639b755956b5f656e232770b13353dea75c7696",
35+
"3c1ba8195e31809939c89ce73320cdc47147f012f41b050029f6aae4dabc7c93",
36+
];
37+
38+
/**
39+
* Check that a URL points at a plain-text file (Markdown). This helps avoid accidentally pointing
40+
* at an HTML page (like a non-raw github.com URL)
41+
*/
42+
async function validateMarkdownUrl(url: string, id: string, name: string) {
43+
if (url.startsWith("https://github.com/")) {
44+
error(
45+
`${id}: Invalid ${name} URL: use raw.githubusercontent.com instead of github.com`
46+
);
47+
return;
48+
}
49+
const response = await fetch(url);
50+
const contentType = response.headers.get("content-type");
51+
if (!response.ok) {
52+
error(
53+
`${id}: Invalid ${name} URL: expected status 200, got ${response.status} ${response.statusText}`
54+
);
55+
return;
56+
}
57+
if (contentType == undefined || !contentType.startsWith("text/plain")) {
58+
error(
59+
`${id}: Invalid ${name} URL: expected content-type text/plain, got: ${contentType}`
60+
);
61+
}
62+
}
63+
64+
async function validateExtension(extension: (typeof registryJson)[number]) {
65+
console.log(`\nValidating ${extension.id}...`);
66+
const foxeResponse = await fetch(extension.foxe);
67+
if (foxeResponse.status !== 200) {
68+
error(
69+
`Extension ${extension.id} has invalid foxe URL. Expected 200 response, got ${foxeResponse.status}`
70+
);
71+
return;
72+
}
73+
74+
const foxeContent = await foxeResponse.arrayBuffer();
75+
const sha256sum = crypto
76+
.createHash("sha256")
77+
.update(new DataView(foxeContent))
78+
.digest("hex");
79+
if (sha256sum !== extension.sha256sum) {
80+
error(
81+
`${extension.id}:Digest mismatch for ${extension.foxe}, expected: ${extension.sha256sum}, actual: ${sha256sum}`
82+
);
83+
return;
84+
}
85+
86+
const zip = await JSZip.loadAsync(foxeContent, { checkCRC32: true });
87+
let uncompressedFiles = [];
88+
let anyFilesAreCompressed = false;
89+
for (const [path, zipObj] of Object.entries(zip.files)) {
90+
if (zipObj.dir) continue;
91+
if (zipObj.options.compression === "DEFLATE") {
92+
anyFilesAreCompressed = true;
93+
} else {
94+
uncompressedFiles.push(path);
95+
}
96+
}
97+
if (uncompressedFiles.length > 0) {
98+
(knownUncompressedExtensionsSHAs.includes(extension.sha256sum)
99+
? warning
100+
: error)(
101+
`${extension.id}: the following files are stored without compression: ${
102+
anyFilesAreCompressed ? uncompressedFiles.join(", ") : "(all files)"
103+
}`
104+
);
105+
}
106+
107+
const packageJsonContent = await zip.file("package.json")?.async("string");
108+
if (!packageJsonContent) {
109+
error(`${extension.id}: Missing package.json`);
110+
return;
111+
}
112+
const packageJson = JSON.parse(packageJsonContent);
113+
if (packageJson.name == undefined || packageJson.name.length === 0) {
114+
error(`${extension.id}: Invalid package.json: missing name`);
115+
return;
116+
}
117+
118+
const mainPath = packageJson.main;
119+
if (typeof mainPath !== "string") {
120+
error(`${extension.id}: Invalid package.json: missing "main" field`);
121+
return;
122+
}
123+
124+
// Normalize the package.json:main field so we can lookup the file in the zip archive.
125+
// This turns ./dist/extension.js into dist/extension.js because having a leading `./` is not
126+
// supported by jszip.
127+
const normalized = path.normalize(mainPath);
128+
const srcText = await zip.file(normalized)?.async("string");
129+
if (srcText == undefined) {
130+
error(
131+
`${extension.id}: Extension ${extension.foxe} is corrupted: unable to extract main JS file`
132+
);
133+
return;
134+
}
135+
136+
await validateMarkdownUrl(extension.readme, extension.id, "readme");
137+
await validateMarkdownUrl(extension.changelog, extension.id, "changelog");
138+
}
139+
140+
async function main() {
141+
const unusedSHAs = knownUncompressedExtensionsSHAs.filter(
142+
(sha) => !registryJson.find((ext) => ext.sha256sum === sha)
143+
);
144+
for (const sha of unusedSHAs) {
145+
error(
146+
`The following SHA should be removed from knownUncompressedExtensionsSHAs: ${sha}`
147+
);
148+
}
149+
150+
for (const extension of registryJson) {
151+
await validateExtension(extension);
152+
}
153+
}
154+
155+
void main().catch((err) => {
156+
console.error(err);
157+
process.exit(1);
158+
});

‎yarn.lock

+381
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,381 @@
1+
# This file is generated by running "yarn install" inside your project.
2+
# Manual changes might be lost - proceed with caution!
3+
4+
__metadata:
5+
version: 8
6+
cacheKey: 10c0
7+
8+
"@actions/core@npm:1.10.1":
9+
version: 1.10.1
10+
resolution: "@actions/core@npm:1.10.1"
11+
dependencies:
12+
"@actions/http-client": "npm:^2.0.1"
13+
uuid: "npm:^8.3.2"
14+
checksum: 10c0/7a61446697a23dcad3545cf0634dedbdedf20ae9a0ee6ee977554589a15deb4a93593ee48a41258933d58ce0778f446b0d2c162b60750956fb75e0b9560fb832
15+
languageName: node
16+
linkType: hard
17+
18+
"@actions/http-client@npm:^2.0.1":
19+
version: 2.2.1
20+
resolution: "@actions/http-client@npm:2.2.1"
21+
dependencies:
22+
tunnel: "npm:^0.0.6"
23+
undici: "npm:^5.25.4"
24+
checksum: 10c0/371771e68fcfe1383e59657eb5bc421aba5e1826f5e497efd826236b64fc1ff11f0bc91f936d7f1086f6bb3fd209736425a4d357b98fdfb7a8d054cbb84680e8
25+
languageName: node
26+
linkType: hard
27+
28+
"@cspotcode/source-map-support@npm:^0.8.0":
29+
version: 0.8.1
30+
resolution: "@cspotcode/source-map-support@npm:0.8.1"
31+
dependencies:
32+
"@jridgewell/trace-mapping": "npm:0.3.9"
33+
checksum: 10c0/05c5368c13b662ee4c122c7bfbe5dc0b613416672a829f3e78bc49a357a197e0218d6e74e7c66cfcd04e15a179acab080bd3c69658c9fbefd0e1ccd950a07fc6
34+
languageName: node
35+
linkType: hard
36+
37+
"@fastify/busboy@npm:^2.0.0":
38+
version: 2.1.1
39+
resolution: "@fastify/busboy@npm:2.1.1"
40+
checksum: 10c0/6f8027a8cba7f8f7b736718b013f5a38c0476eea67034c94a0d3c375e2b114366ad4419e6a6fa7ffc2ef9c6d3e0435d76dd584a7a1cbac23962fda7650b579e3
41+
languageName: node
42+
linkType: hard
43+
44+
"@foxglove/tsconfig@npm:2.0.0":
45+
version: 2.0.0
46+
resolution: "@foxglove/tsconfig@npm:2.0.0"
47+
checksum: 10c0/fccd3d2a67b85cc4532653930f6e0c311628458b489ee2e1e0aa0aa60d11b57bc2567b65344ff4007e238f42037eff22ec83f41d948e3be1a1d856ef207ac3d8
48+
languageName: node
49+
linkType: hard
50+
51+
"@jridgewell/resolve-uri@npm:^3.0.3":
52+
version: 3.1.2
53+
resolution: "@jridgewell/resolve-uri@npm:3.1.2"
54+
checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e
55+
languageName: node
56+
linkType: hard
57+
58+
"@jridgewell/sourcemap-codec@npm:^1.4.10":
59+
version: 1.4.15
60+
resolution: "@jridgewell/sourcemap-codec@npm:1.4.15"
61+
checksum: 10c0/0c6b5ae663087558039052a626d2d7ed5208da36cfd707dcc5cea4a07cfc918248403dcb5989a8f7afaf245ce0573b7cc6fd94c4a30453bd10e44d9363940ba5
62+
languageName: node
63+
linkType: hard
64+
65+
"@jridgewell/trace-mapping@npm:0.3.9":
66+
version: 0.3.9
67+
resolution: "@jridgewell/trace-mapping@npm:0.3.9"
68+
dependencies:
69+
"@jridgewell/resolve-uri": "npm:^3.0.3"
70+
"@jridgewell/sourcemap-codec": "npm:^1.4.10"
71+
checksum: 10c0/fa425b606d7c7ee5bfa6a31a7b050dd5814b4082f318e0e4190f991902181b4330f43f4805db1dd4f2433fd0ed9cc7a7b9c2683f1deeab1df1b0a98b1e24055b
72+
languageName: node
73+
linkType: hard
74+
75+
"@tsconfig/node10@npm:^1.0.7":
76+
version: 1.0.11
77+
resolution: "@tsconfig/node10@npm:1.0.11"
78+
checksum: 10c0/28a0710e5d039e0de484bdf85fee883bfd3f6a8980601f4d44066b0a6bcd821d31c4e231d1117731c4e24268bd4cf2a788a6787c12fc7f8d11014c07d582783c
79+
languageName: node
80+
linkType: hard
81+
82+
"@tsconfig/node12@npm:^1.0.7":
83+
version: 1.0.11
84+
resolution: "@tsconfig/node12@npm:1.0.11"
85+
checksum: 10c0/dddca2b553e2bee1308a056705103fc8304e42bb2d2cbd797b84403a223b25c78f2c683ec3e24a095e82cd435387c877239bffcb15a590ba817cd3f6b9a99fd9
86+
languageName: node
87+
linkType: hard
88+
89+
"@tsconfig/node14@npm:^1.0.0":
90+
version: 1.0.3
91+
resolution: "@tsconfig/node14@npm:1.0.3"
92+
checksum: 10c0/67c1316d065fdaa32525bc9449ff82c197c4c19092b9663b23213c8cbbf8d88b6ed6a17898e0cbc2711950fbfaf40388938c1c748a2ee89f7234fc9e7fe2bf44
93+
languageName: node
94+
linkType: hard
95+
96+
"@tsconfig/node16@npm:^1.0.2":
97+
version: 1.0.4
98+
resolution: "@tsconfig/node16@npm:1.0.4"
99+
checksum: 10c0/05f8f2734e266fb1839eb1d57290df1664fe2aa3b0fdd685a9035806daa635f7519bf6d5d9b33f6e69dd545b8c46bd6e2b5c79acb2b1f146e885f7f11a42a5bb
100+
languageName: node
101+
linkType: hard
102+
103+
"@types/node@npm:22.0.2":
104+
version: 22.0.2
105+
resolution: "@types/node@npm:22.0.2"
106+
dependencies:
107+
undici-types: "npm:~6.11.1"
108+
checksum: 10c0/59ee26fb1104674b2e23981d7569ad113aa8ee23c8449af8e4312aa9352ac738c5ffd0ae4d8077db0467704a3b9ccc662048e39716cb5ad51cdb24d106c7871b
109+
languageName: node
110+
linkType: hard
111+
112+
"acorn-walk@npm:^8.1.1":
113+
version: 8.3.3
114+
resolution: "acorn-walk@npm:8.3.3"
115+
dependencies:
116+
acorn: "npm:^8.11.0"
117+
checksum: 10c0/4a9e24313e6a0a7b389e712ba69b66b455b4cb25988903506a8d247e7b126f02060b05a8a5b738a9284214e4ca95f383dd93443a4ba84f1af9b528305c7f243b
118+
languageName: node
119+
linkType: hard
120+
121+
"acorn@npm:^8.11.0, acorn@npm:^8.4.1":
122+
version: 8.12.0
123+
resolution: "acorn@npm:8.12.0"
124+
bin:
125+
acorn: bin/acorn
126+
checksum: 10c0/a19f9dead009d3b430fa3c253710b47778cdaace15b316de6de93a68c355507bc1072a9956372b6c990cbeeb167d4a929249d0faeb8ae4bb6911d68d53299549
127+
languageName: node
128+
linkType: hard
129+
130+
"arg@npm:^4.1.0":
131+
version: 4.1.3
132+
resolution: "arg@npm:4.1.3"
133+
checksum: 10c0/070ff801a9d236a6caa647507bdcc7034530604844d64408149a26b9e87c2f97650055c0f049abd1efc024b334635c01f29e0b632b371ac3f26130f4cf65997a
134+
languageName: node
135+
linkType: hard
136+
137+
"core-util-is@npm:~1.0.0":
138+
version: 1.0.3
139+
resolution: "core-util-is@npm:1.0.3"
140+
checksum: 10c0/90a0e40abbddfd7618f8ccd63a74d88deea94e77d0e8dbbea059fa7ebebb8fbb4e2909667fe26f3a467073de1a542ebe6ae4c73a73745ac5833786759cd906c9
141+
languageName: node
142+
linkType: hard
143+
144+
"create-require@npm:^1.1.0":
145+
version: 1.1.1
146+
resolution: "create-require@npm:1.1.1"
147+
checksum: 10c0/157cbc59b2430ae9a90034a5f3a1b398b6738bf510f713edc4d4e45e169bc514d3d99dd34d8d01ca7ae7830b5b8b537e46ae8f3c8f932371b0875c0151d7ec91
148+
languageName: node
149+
linkType: hard
150+
151+
"diff@npm:^4.0.1":
152+
version: 4.0.2
153+
resolution: "diff@npm:4.0.2"
154+
checksum: 10c0/81b91f9d39c4eaca068eb0c1eb0e4afbdc5bb2941d197f513dd596b820b956fef43485876226d65d497bebc15666aa2aa82c679e84f65d5f2bfbf14ee46e32c1
155+
languageName: node
156+
linkType: hard
157+
158+
"immediate@npm:~3.0.5":
159+
version: 3.0.6
160+
resolution: "immediate@npm:3.0.6"
161+
checksum: 10c0/f8ba7ede69bee9260241ad078d2d535848745ff5f6995c7c7cb41cfdc9ccc213f66e10fa5afb881f90298b24a3f7344b637b592beb4f54e582770cdce3f1f039
162+
languageName: node
163+
linkType: hard
164+
165+
"inherits@npm:~2.0.3":
166+
version: 2.0.4
167+
resolution: "inherits@npm:2.0.4"
168+
checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2
169+
languageName: node
170+
linkType: hard
171+
172+
"isarray@npm:~1.0.0":
173+
version: 1.0.0
174+
resolution: "isarray@npm:1.0.0"
175+
checksum: 10c0/18b5be6669be53425f0b84098732670ed4e727e3af33bc7f948aac01782110eb9a18b3b329c5323bcdd3acdaae547ee077d3951317e7f133bff7105264b3003d
176+
languageName: node
177+
linkType: hard
178+
179+
"jszip@npm:3.10.1":
180+
version: 3.10.1
181+
resolution: "jszip@npm:3.10.1"
182+
dependencies:
183+
lie: "npm:~3.3.0"
184+
pako: "npm:~1.0.2"
185+
readable-stream: "npm:~2.3.6"
186+
setimmediate: "npm:^1.0.5"
187+
checksum: 10c0/58e01ec9c4960383fb8b38dd5f67b83ccc1ec215bf74c8a5b32f42b6e5fb79fada5176842a11409c4051b5b94275044851814a31076bf49e1be218d3ef57c863
188+
languageName: node
189+
linkType: hard
190+
191+
"lie@npm:~3.3.0":
192+
version: 3.3.0
193+
resolution: "lie@npm:3.3.0"
194+
dependencies:
195+
immediate: "npm:~3.0.5"
196+
checksum: 10c0/56dd113091978f82f9dc5081769c6f3b947852ecf9feccaf83e14a123bc630c2301439ce6182521e5fbafbde88e88ac38314327a4e0493a1bea7e0699a7af808
197+
languageName: node
198+
linkType: hard
199+
200+
"make-error@npm:^1.1.1":
201+
version: 1.3.6
202+
resolution: "make-error@npm:1.3.6"
203+
checksum: 10c0/171e458d86854c6b3fc46610cfacf0b45149ba043782558c6875d9f42f222124384ad0b468c92e996d815a8a2003817a710c0a160e49c1c394626f76fa45396f
204+
languageName: node
205+
linkType: hard
206+
207+
"pako@npm:~1.0.2":
208+
version: 1.0.11
209+
resolution: "pako@npm:1.0.11"
210+
checksum: 10c0/86dd99d8b34c3930345b8bbeb5e1cd8a05f608eeb40967b293f72fe469d0e9c88b783a8777e4cc7dc7c91ce54c5e93d88ff4b4f060e6ff18408fd21030d9ffbe
211+
languageName: node
212+
linkType: hard
213+
214+
"process-nextick-args@npm:~2.0.0":
215+
version: 2.0.1
216+
resolution: "process-nextick-args@npm:2.0.1"
217+
checksum: 10c0/bec089239487833d46b59d80327a1605e1c5287eaad770a291add7f45fda1bb5e28b38e0e061add0a1d0ee0984788ce74fa394d345eed1c420cacf392c554367
218+
languageName: node
219+
linkType: hard
220+
221+
"readable-stream@npm:~2.3.6":
222+
version: 2.3.8
223+
resolution: "readable-stream@npm:2.3.8"
224+
dependencies:
225+
core-util-is: "npm:~1.0.0"
226+
inherits: "npm:~2.0.3"
227+
isarray: "npm:~1.0.0"
228+
process-nextick-args: "npm:~2.0.0"
229+
safe-buffer: "npm:~5.1.1"
230+
string_decoder: "npm:~1.1.1"
231+
util-deprecate: "npm:~1.0.1"
232+
checksum: 10c0/7efdb01f3853bc35ac62ea25493567bf588773213f5f4a79f9c365e1ad13bab845ac0dae7bc946270dc40c3929483228415e92a3fc600cc7e4548992f41ee3fa
233+
languageName: node
234+
linkType: hard
235+
236+
"root-workspace-0b6124@workspace:.":
237+
version: 0.0.0-use.local
238+
resolution: "root-workspace-0b6124@workspace:."
239+
dependencies:
240+
"@actions/core": "npm:1.10.1"
241+
"@foxglove/tsconfig": "npm:2.0.0"
242+
"@types/node": "npm:22.0.2"
243+
jszip: "npm:3.10.1"
244+
ts-node: "npm:10.9.2"
245+
typescript: "npm:5.5.4"
246+
languageName: unknown
247+
linkType: soft
248+
249+
"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1":
250+
version: 5.1.2
251+
resolution: "safe-buffer@npm:5.1.2"
252+
checksum: 10c0/780ba6b5d99cc9a40f7b951d47152297d0e260f0df01472a1b99d4889679a4b94a13d644f7dbc4f022572f09ae9005fa2fbb93bbbd83643316f365a3e9a45b21
253+
languageName: node
254+
linkType: hard
255+
256+
"setimmediate@npm:^1.0.5":
257+
version: 1.0.5
258+
resolution: "setimmediate@npm:1.0.5"
259+
checksum: 10c0/5bae81bfdbfbd0ce992893286d49c9693c82b1bcc00dcaaf3a09c8f428fdeacf4190c013598b81875dfac2b08a572422db7df779a99332d0fce186d15a3e4d49
260+
languageName: node
261+
linkType: hard
262+
263+
"string_decoder@npm:~1.1.1":
264+
version: 1.1.1
265+
resolution: "string_decoder@npm:1.1.1"
266+
dependencies:
267+
safe-buffer: "npm:~5.1.0"
268+
checksum: 10c0/b4f89f3a92fd101b5653ca3c99550e07bdf9e13b35037e9e2a1c7b47cec4e55e06ff3fc468e314a0b5e80bfbaf65c1ca5a84978764884ae9413bec1fc6ca924e
269+
languageName: node
270+
linkType: hard
271+
272+
"ts-node@npm:10.9.2":
273+
version: 10.9.2
274+
resolution: "ts-node@npm:10.9.2"
275+
dependencies:
276+
"@cspotcode/source-map-support": "npm:^0.8.0"
277+
"@tsconfig/node10": "npm:^1.0.7"
278+
"@tsconfig/node12": "npm:^1.0.7"
279+
"@tsconfig/node14": "npm:^1.0.0"
280+
"@tsconfig/node16": "npm:^1.0.2"
281+
acorn: "npm:^8.4.1"
282+
acorn-walk: "npm:^8.1.1"
283+
arg: "npm:^4.1.0"
284+
create-require: "npm:^1.1.0"
285+
diff: "npm:^4.0.1"
286+
make-error: "npm:^1.1.1"
287+
v8-compile-cache-lib: "npm:^3.0.1"
288+
yn: "npm:3.1.1"
289+
peerDependencies:
290+
"@swc/core": ">=1.2.50"
291+
"@swc/wasm": ">=1.2.50"
292+
"@types/node": "*"
293+
typescript: ">=2.7"
294+
peerDependenciesMeta:
295+
"@swc/core":
296+
optional: true
297+
"@swc/wasm":
298+
optional: true
299+
bin:
300+
ts-node: dist/bin.js
301+
ts-node-cwd: dist/bin-cwd.js
302+
ts-node-esm: dist/bin-esm.js
303+
ts-node-script: dist/bin-script.js
304+
ts-node-transpile-only: dist/bin-transpile.js
305+
ts-script: dist/bin-script-deprecated.js
306+
checksum: 10c0/5f29938489f96982a25ba650b64218e83a3357d76f7bede80195c65ab44ad279c8357264639b7abdd5d7e75fc269a83daa0e9c62fd8637a3def67254ecc9ddc2
307+
languageName: node
308+
linkType: hard
309+
310+
"tunnel@npm:^0.0.6":
311+
version: 0.0.6
312+
resolution: "tunnel@npm:0.0.6"
313+
checksum: 10c0/e27e7e896f2426c1c747325b5f54efebc1a004647d853fad892b46d64e37591ccd0b97439470795e5262b5c0748d22beb4489a04a0a448029636670bfd801b75
314+
languageName: node
315+
linkType: hard
316+
317+
"typescript@npm:5.5.4":
318+
version: 5.5.4
319+
resolution: "typescript@npm:5.5.4"
320+
bin:
321+
tsc: bin/tsc
322+
tsserver: bin/tsserver
323+
checksum: 10c0/422be60f89e661eab29ac488c974b6cc0a660fb2228003b297c3d10c32c90f3bcffc1009b43876a082515a3c376b1eefcce823d6e78982e6878408b9a923199c
324+
languageName: node
325+
linkType: hard
326+
327+
"typescript@patch:typescript@npm%3A5.5.4#optional!builtin<compat/typescript>":
328+
version: 5.5.4
329+
resolution: "typescript@patch:typescript@npm%3A5.5.4#optional!builtin<compat/typescript>::version=5.5.4&hash=379a07"
330+
bin:
331+
tsc: bin/tsc
332+
tsserver: bin/tsserver
333+
checksum: 10c0/73409d7b9196a5a1217b3aaad929bf76294d3ce7d6e9766dd880ece296ee91cf7d7db6b16c6c6c630ee5096eccde726c0ef17c7dfa52b01a243e57ae1f09ef07
334+
languageName: node
335+
linkType: hard
336+
337+
"undici-types@npm:~6.11.1":
338+
version: 6.11.1
339+
resolution: "undici-types@npm:6.11.1"
340+
checksum: 10c0/d8f5739a8e6c779d72336c82deb49c56d5ac9f9f6e0eb2e8dd4d3f6929ae9db7cde370d2e46516fe6cad04ea53e790c5e16c4c75eed7cd0f9bd31b0763bb2fa3
341+
languageName: node
342+
linkType: hard
343+
344+
"undici@npm:^5.25.4":
345+
version: 5.28.4
346+
resolution: "undici@npm:5.28.4"
347+
dependencies:
348+
"@fastify/busboy": "npm:^2.0.0"
349+
checksum: 10c0/08d0f2596553aa0a54ca6e8e9c7f45aef7d042c60918564e3a142d449eda165a80196f6ef19ea2ef2e6446959e293095d8e40af1236f0d67223b06afac5ecad7
350+
languageName: node
351+
linkType: hard
352+
353+
"util-deprecate@npm:~1.0.1":
354+
version: 1.0.2
355+
resolution: "util-deprecate@npm:1.0.2"
356+
checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942
357+
languageName: node
358+
linkType: hard
359+
360+
"uuid@npm:^8.3.2":
361+
version: 8.3.2
362+
resolution: "uuid@npm:8.3.2"
363+
bin:
364+
uuid: dist/bin/uuid
365+
checksum: 10c0/bcbb807a917d374a49f475fae2e87fdca7da5e5530820ef53f65ba1d12131bd81a92ecf259cc7ce317cbe0f289e7d79fdfebcef9bfa3087c8c8a2fa304c9be54
366+
languageName: node
367+
linkType: hard
368+
369+
"v8-compile-cache-lib@npm:^3.0.1":
370+
version: 3.0.1
371+
resolution: "v8-compile-cache-lib@npm:3.0.1"
372+
checksum: 10c0/bdc36fb8095d3b41df197f5fb6f11e3a26adf4059df3213e3baa93810d8f0cc76f9a74aaefc18b73e91fe7e19154ed6f134eda6fded2e0f1c8d2272ed2d2d391
373+
languageName: node
374+
linkType: hard
375+
376+
"yn@npm:3.1.1":
377+
version: 3.1.1
378+
resolution: "yn@npm:3.1.1"
379+
checksum: 10c0/0732468dd7622ed8a274f640f191f3eaf1f39d5349a1b72836df484998d7d9807fbea094e2f5486d6b0cd2414aad5775972df0e68f8604db89a239f0f4bf7443
380+
languageName: node
381+
linkType: hard

0 commit comments

Comments
 (0)
Please sign in to comment.