@velarscript/cli 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +117 -0
- package/dist/application-package-host.d.ts +5 -0
- package/dist/application-package-host.d.ts.map +1 -0
- package/dist/application-package-host.js +67 -0
- package/dist/application-package-host.js.map +1 -0
- package/dist/bounded-text.d.ts +2 -0
- package/dist/bounded-text.d.ts.map +1 -0
- package/dist/bounded-text.js +13 -0
- package/dist/bounded-text.js.map +1 -0
- package/dist/browser-process-owner.d.ts +15 -0
- package/dist/browser-process-owner.d.ts.map +1 -0
- package/dist/browser-process-owner.js +151 -0
- package/dist/browser-process-owner.js.map +1 -0
- package/dist/browser-test-runner.d.ts +11 -0
- package/dist/browser-test-runner.d.ts.map +1 -0
- package/dist/browser-test-runner.js +1022 -0
- package/dist/browser-test-runner.js.map +1 -0
- package/dist/build-engine-tool.d.ts +3 -0
- package/dist/build-engine-tool.d.ts.map +1 -0
- package/dist/build-engine-tool.js +34 -0
- package/dist/build-engine-tool.js.map +1 -0
- package/dist/build-staging.d.ts +3 -0
- package/dist/build-staging.d.ts.map +1 -0
- package/dist/build-staging.js +3 -0
- package/dist/build-staging.js.map +1 -0
- package/dist/bundled-application-package-host-registry.d.ts +10 -0
- package/dist/bundled-application-package-host-registry.d.ts.map +1 -0
- package/dist/bundled-application-package-host-registry.js +16 -0
- package/dist/bundled-application-package-host-registry.js.map +1 -0
- package/dist/bundled-extension-registry.d.ts +22 -0
- package/dist/bundled-extension-registry.d.ts.map +1 -0
- package/dist/bundled-extension-registry.js +10 -0
- package/dist/bundled-extension-registry.js.map +1 -0
- package/dist/canonical-path.d.ts +3 -0
- package/dist/canonical-path.d.ts.map +1 -0
- package/dist/canonical-path.js +30 -0
- package/dist/canonical-path.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1274 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +26 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +403 -0
- package/dist/config.js.map +1 -0
- package/dist/deployment-verifier.d.ts +34 -0
- package/dist/deployment-verifier.d.ts.map +1 -0
- package/dist/deployment-verifier.js +260 -0
- package/dist/deployment-verifier.js.map +1 -0
- package/dist/dev-server.d.ts +3 -0
- package/dist/dev-server.d.ts.map +1 -0
- package/dist/dev-server.js +464 -0
- package/dist/dev-server.js.map +1 -0
- package/dist/embedded-modules.d.ts +17 -0
- package/dist/embedded-modules.d.ts.map +1 -0
- package/dist/embedded-modules.js +33 -0
- package/dist/embedded-modules.js.map +1 -0
- package/dist/extension-metadata.d.ts +23 -0
- package/dist/extension-metadata.d.ts.map +1 -0
- package/dist/extension-metadata.js +254 -0
- package/dist/extension-metadata.js.map +1 -0
- package/dist/file-integrity.d.ts +7 -0
- package/dist/file-integrity.d.ts.map +1 -0
- package/dist/file-integrity.js +14 -0
- package/dist/file-integrity.js.map +1 -0
- package/dist/framework-host.d.ts +12 -0
- package/dist/framework-host.d.ts.map +1 -0
- package/dist/framework-host.js +46 -0
- package/dist/framework-host.js.map +1 -0
- package/dist/host-error.d.ts +6 -0
- package/dist/host-error.d.ts.map +1 -0
- package/dist/host-error.js +54 -0
- package/dist/host-error.js.map +1 -0
- package/dist/installed-package.d.ts +9 -0
- package/dist/installed-package.d.ts.map +1 -0
- package/dist/installed-package.js +23 -0
- package/dist/installed-package.js.map +1 -0
- package/dist/language-server-bundle-entry.d.ts +2 -0
- package/dist/language-server-bundle-entry.d.ts.map +1 -0
- package/dist/language-server-bundle-entry.js +7 -0
- package/dist/language-server-bundle-entry.js.map +1 -0
- package/dist/language-server-tool.d.ts +3 -0
- package/dist/language-server-tool.d.ts.map +1 -0
- package/dist/language-server-tool.js +30 -0
- package/dist/language-server-tool.js.map +1 -0
- package/dist/language-server.d.ts +9 -0
- package/dist/language-server.d.ts.map +1 -0
- package/dist/language-server.js +1733 -0
- package/dist/language-server.js.map +1 -0
- package/dist/mechanical-fixer.d.ts +30 -0
- package/dist/mechanical-fixer.d.ts.map +1 -0
- package/dist/mechanical-fixer.js +103 -0
- package/dist/mechanical-fixer.js.map +1 -0
- package/dist/module-assets.d.ts +11 -0
- package/dist/module-assets.d.ts.map +1 -0
- package/dist/module-assets.js +90 -0
- package/dist/module-assets.js.map +1 -0
- package/dist/npm.d.ts +23 -0
- package/dist/npm.d.ts.map +1 -0
- package/dist/npm.js +456 -0
- package/dist/npm.js.map +1 -0
- package/dist/official-language-server-extensions.d.ts +2 -0
- package/dist/official-language-server-extensions.d.ts.map +1 -0
- package/dist/official-language-server-extensions.js +38 -0
- package/dist/official-language-server-extensions.js.map +1 -0
- package/dist/official-script-language-service.d.ts +2 -0
- package/dist/official-script-language-service.d.ts.map +1 -0
- package/dist/official-script-language-service.js +10 -0
- package/dist/official-script-language-service.js.map +1 -0
- package/dist/official-tool-assets.d.ts +3 -0
- package/dist/official-tool-assets.d.ts.map +1 -0
- package/dist/official-tool-assets.js +41 -0
- package/dist/official-tool-assets.js.map +1 -0
- package/dist/ownership-graph.d.ts +46 -0
- package/dist/ownership-graph.d.ts.map +1 -0
- package/dist/ownership-graph.js +255 -0
- package/dist/ownership-graph.js.map +1 -0
- package/dist/package-manager.d.ts +20 -0
- package/dist/package-manager.d.ts.map +1 -0
- package/dist/package-manager.js +345 -0
- package/dist/package-manager.js.map +1 -0
- package/dist/packaged-official-tool.d.ts +8 -0
- package/dist/packaged-official-tool.d.ts.map +1 -0
- package/dist/packaged-official-tool.js +32 -0
- package/dist/packaged-official-tool.js.map +1 -0
- package/dist/preview-server.d.ts +11 -0
- package/dist/preview-server.d.ts.map +1 -0
- package/dist/preview-server.js +163 -0
- package/dist/preview-server.js.map +1 -0
- package/dist/production-build.d.ts +57 -0
- package/dist/production-build.d.ts.map +1 -0
- package/dist/production-build.js +332 -0
- package/dist/production-build.js.map +1 -0
- package/dist/production-verifier.d.ts +9 -0
- package/dist/production-verifier.d.ts.map +1 -0
- package/dist/production-verifier.js +268 -0
- package/dist/production-verifier.js.map +1 -0
- package/dist/program-runner.d.ts +7 -0
- package/dist/program-runner.d.ts.map +1 -0
- package/dist/program-runner.js +98 -0
- package/dist/program-runner.js.map +1 -0
- package/dist/project-check.d.ts +31 -0
- package/dist/project-check.d.ts.map +1 -0
- package/dist/project-check.js +95 -0
- package/dist/project-check.js.map +1 -0
- package/dist/project-format.d.ts +6 -0
- package/dist/project-format.d.ts.map +1 -0
- package/dist/project-format.js +21 -0
- package/dist/project-format.js.map +1 -0
- package/dist/project-semantic.d.ts +62 -0
- package/dist/project-semantic.d.ts.map +1 -0
- package/dist/project-semantic.js +1079 -0
- package/dist/project-semantic.js.map +1 -0
- package/dist/project-session.d.ts +36 -0
- package/dist/project-session.d.ts.map +1 -0
- package/dist/project-session.js +339 -0
- package/dist/project-session.js.map +1 -0
- package/dist/project-task-bundle-entry.d.ts +2 -0
- package/dist/project-task-bundle-entry.d.ts.map +1 -0
- package/dist/project-task-bundle-entry.js +18 -0
- package/dist/project-task-bundle-entry.js.map +1 -0
- package/dist/project-task-invocation.d.ts +16 -0
- package/dist/project-task-invocation.d.ts.map +1 -0
- package/dist/project-task-invocation.js +72 -0
- package/dist/project-task-invocation.js.map +1 -0
- package/dist/project-task-tool.d.ts +3 -0
- package/dist/project-task-tool.d.ts.map +1 -0
- package/dist/project-task-tool.js +61 -0
- package/dist/project-task-tool.js.map +1 -0
- package/dist/project.d.ts +71 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +1750 -0
- package/dist/project.js.map +1 -0
- package/dist/reproduction.d.ts +50 -0
- package/dist/reproduction.d.ts.map +1 -0
- package/dist/reproduction.js +321 -0
- package/dist/reproduction.js.map +1 -0
- package/dist/script-language-service.d.ts +82 -0
- package/dist/script-language-service.d.ts.map +1 -0
- package/dist/script-language-service.js +18 -0
- package/dist/script-language-service.js.map +1 -0
- package/dist/source-limits.d.ts +5 -0
- package/dist/source-limits.d.ts.map +1 -0
- package/dist/source-limits.js +19 -0
- package/dist/source-limits.js.map +1 -0
- package/dist/standalone-build.d.ts +15 -0
- package/dist/standalone-build.d.ts.map +1 -0
- package/dist/standalone-build.js +76 -0
- package/dist/standalone-build.js.map +1 -0
- package/dist/standard-modules.d.ts +22 -0
- package/dist/standard-modules.d.ts.map +1 -0
- package/dist/standard-modules.js +3066 -0
- package/dist/standard-modules.js.map +1 -0
- package/dist/static-deployment.d.ts +48 -0
- package/dist/static-deployment.d.ts.map +1 -0
- package/dist/static-deployment.js +142 -0
- package/dist/static-deployment.js.map +1 -0
- package/dist/test-output.d.ts +20 -0
- package/dist/test-output.d.ts.map +1 -0
- package/dist/test-output.js +119 -0
- package/dist/test-output.js.map +1 -0
- package/dist/test-runner.d.ts +13 -0
- package/dist/test-runner.d.ts.map +1 -0
- package/dist/test-runner.js +226 -0
- package/dist/test-runner.js.map +1 -0
- package/dist/typescript-declarations.d.ts +20 -0
- package/dist/typescript-declarations.d.ts.map +1 -0
- package/dist/typescript-declarations.js +1609 -0
- package/dist/typescript-declarations.js.map +1 -0
- package/dist/uncaught-program-error.d.ts +24 -0
- package/dist/uncaught-program-error.d.ts.map +1 -0
- package/dist/uncaught-program-error.js +105 -0
- package/dist/uncaught-program-error.js.map +1 -0
- package/dist/unowned-errors.d.ts +56 -0
- package/dist/unowned-errors.d.ts.map +1 -0
- package/dist/unowned-errors.js +82 -0
- package/dist/unowned-errors.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/dist/workspace-index.d.ts +78 -0
- package/dist/workspace-index.d.ts.map +1 -0
- package/dist/workspace-index.js +493 -0
- package/dist/workspace-index.js.map +1 -0
- package/package.json +45 -0
- package/skill/ai-skill.md +749 -0
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { lstat, readFile, readdir, stat } from "node:fs/promises";
|
|
3
|
+
import { basename, dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
4
|
+
import { PRODUCTION_MANIFEST_NAME } from "./production-build.js";
|
|
5
|
+
import { resolveVelarProject } from "./config.js";
|
|
6
|
+
import { fileIdentity, MAX_PRODUCTION_ASSETS } from "./file-integrity.js";
|
|
7
|
+
import { hostErrorMessage, isHostErrorCode } from "./host-error.js";
|
|
8
|
+
const assetRoles = new Set(["entry", "stylesheet", "source-map", "html", "deployment", "adapter", "asset"]);
|
|
9
|
+
export async function verifyProductionBuild(input, cwd = process.cwd()) {
|
|
10
|
+
const directory = await resolveProductionDirectory(input, cwd);
|
|
11
|
+
const manifestPath = join(directory, PRODUCTION_MANIFEST_NAME);
|
|
12
|
+
const actualFiles = await productionFiles(directory);
|
|
13
|
+
const manifest = await readJson(manifestPath, "production build manifest");
|
|
14
|
+
if (manifest?.formatVersion !== 3 || manifest?.kind !== "velar-framework-build") {
|
|
15
|
+
throw new Error(`${manifestPath} has an unsupported production build format`);
|
|
16
|
+
}
|
|
17
|
+
if (manifest.compiler?.name !== "velar" || typeof manifest.compiler.version !== "string" || !manifest.compiler.version) {
|
|
18
|
+
throw new Error(`${manifestPath} has invalid compiler identity`);
|
|
19
|
+
}
|
|
20
|
+
const framework = manifest.framework;
|
|
21
|
+
if (!framework || typeof framework.id !== "string" || !framework.id
|
|
22
|
+
|| typeof framework.capability !== "string" || !/^[a-z][a-z0-9-]*$/u.test(framework.capability)
|
|
23
|
+
|| framework.target !== "browser" || !Number.isInteger(framework.protocolVersion) || framework.protocolVersion < 1
|
|
24
|
+
|| typeof framework.apiVersion !== "string" || !framework.apiVersion
|
|
25
|
+
|| typeof framework.artifactKind !== "string" || !/^[a-z][a-z0-9-]*$/u.test(framework.artifactKind)) {
|
|
26
|
+
throw new Error(`${manifestPath} has an invalid framework host identity`);
|
|
27
|
+
}
|
|
28
|
+
if (!Array.isArray(manifest.assets) || manifest.assets.length === 0)
|
|
29
|
+
throw new Error(`${manifestPath} has no asset inventory`);
|
|
30
|
+
if (manifest.assets.length > MAX_PRODUCTION_ASSETS)
|
|
31
|
+
throw new Error(`${manifestPath} exceeds the ${MAX_PRODUCTION_ASSETS}-asset production limit`);
|
|
32
|
+
const declared = new Map();
|
|
33
|
+
for (const asset of manifest.assets) {
|
|
34
|
+
const path = safeRelativePath(asset?.path, "asset path");
|
|
35
|
+
if (declared.has(path))
|
|
36
|
+
throw new Error(`${manifestPath} declares duplicate asset '${path}'`);
|
|
37
|
+
if (!Number.isInteger(asset.sizeBytes) || asset.sizeBytes < 0)
|
|
38
|
+
throw new Error(`${manifestPath} has invalid size for '${path}'`);
|
|
39
|
+
if (typeof asset.sha256 !== "string" || !/^[a-f0-9]{64}$/u.test(asset.sha256)) {
|
|
40
|
+
throw new Error(`${manifestPath} has invalid SHA-256 for '${path}'`);
|
|
41
|
+
}
|
|
42
|
+
if (!assetRoles.has(asset.role))
|
|
43
|
+
throw new Error(`${manifestPath} has invalid role for '${path}'`);
|
|
44
|
+
declared.set(path, asset);
|
|
45
|
+
}
|
|
46
|
+
const declaredPaths = [...declared.keys()];
|
|
47
|
+
const sortedPaths = [...declaredPaths].sort();
|
|
48
|
+
if (declaredPaths.some((path, index) => path !== sortedPaths[index])) {
|
|
49
|
+
throw new Error(`${manifestPath} asset inventory is not deterministically sorted`);
|
|
50
|
+
}
|
|
51
|
+
const expectedFiles = [...actualFiles].filter((path) => path !== PRODUCTION_MANIFEST_NAME).sort();
|
|
52
|
+
const missing = sortedPaths.filter((path) => !actualFiles.has(path));
|
|
53
|
+
const unexpected = expectedFiles.filter((path) => !declared.has(path));
|
|
54
|
+
if (missing.length > 0)
|
|
55
|
+
throw new Error(`Production build is missing declared asset '${missing[0]}'`);
|
|
56
|
+
if (unexpected.length > 0)
|
|
57
|
+
throw new Error(`Production build contains undeclared file '${unexpected[0]}'`);
|
|
58
|
+
for (const path of sortedPaths) {
|
|
59
|
+
const asset = declared.get(path);
|
|
60
|
+
const identity = await fileIdentity(join(directory, path));
|
|
61
|
+
if (identity.sizeBytes !== asset.sizeBytes)
|
|
62
|
+
throw new Error(`Production asset '${path}' size does not match ${PRODUCTION_MANIFEST_NAME}`);
|
|
63
|
+
if (identity.sha256 !== asset.sha256)
|
|
64
|
+
throw new Error(`Production asset '${path}' SHA-256 does not match ${PRODUCTION_MANIFEST_NAME}`);
|
|
65
|
+
}
|
|
66
|
+
const buildId = createHash("sha256")
|
|
67
|
+
.update(sortedPaths.map((path) => `${path}\0${declared.get(path).sha256}`).join("\n"))
|
|
68
|
+
.digest("hex");
|
|
69
|
+
if (manifest.buildId !== buildId)
|
|
70
|
+
throw new Error(`${manifestPath} buildId does not match its asset inventory`);
|
|
71
|
+
const sourceMapAssets = sortedPaths.filter((path) => declared.get(path)?.role === "source-map");
|
|
72
|
+
const sourceMaps = typeof manifest.sourceMaps === "boolean" ? manifest.sourceMaps : sourceMapAssets.length > 0;
|
|
73
|
+
if (sourceMaps && sourceMapAssets.length === 0)
|
|
74
|
+
throw new Error(`${manifestPath} enables source maps but declares none`);
|
|
75
|
+
if (!sourceMaps && sourceMapAssets.length > 0)
|
|
76
|
+
throw new Error(`${manifestPath} disables source maps but declares source-map assets`);
|
|
77
|
+
const entry = safeRelativePath(manifest.entry, "entry");
|
|
78
|
+
if (declared.get(entry)?.role !== "entry")
|
|
79
|
+
throw new Error(`${manifestPath} entry '${entry}' is not the entry asset`);
|
|
80
|
+
if (manifest.stylesheet !== null) {
|
|
81
|
+
const stylesheet = safeRelativePath(manifest.stylesheet, "stylesheet");
|
|
82
|
+
if (declared.get(stylesheet)?.role !== "stylesheet")
|
|
83
|
+
throw new Error(`${manifestPath} stylesheet '${stylesheet}' is not the stylesheet asset`);
|
|
84
|
+
}
|
|
85
|
+
const deploymentPath = safeRelativePath(manifest.deployment?.manifest, "deployment manifest");
|
|
86
|
+
if (declared.get(deploymentPath)?.role !== "deployment") {
|
|
87
|
+
throw new Error(`${manifestPath} deployment manifest '${deploymentPath}' is not a deployment asset`);
|
|
88
|
+
}
|
|
89
|
+
const deployment = await readJson(join(directory, deploymentPath), "static deployment manifest");
|
|
90
|
+
verifyDeploymentManifest(deployment, manifest, declared, manifestPath);
|
|
91
|
+
return { directory, manifest, deployment };
|
|
92
|
+
}
|
|
93
|
+
async function resolveProductionDirectory(input, cwd) {
|
|
94
|
+
const current = resolve(cwd);
|
|
95
|
+
if (!input && await isFile(join(current, PRODUCTION_MANIFEST_NAME)))
|
|
96
|
+
return current;
|
|
97
|
+
if (input) {
|
|
98
|
+
const explicit = resolve(current, input);
|
|
99
|
+
if (await isFile(explicit) && basename(explicit) === PRODUCTION_MANIFEST_NAME)
|
|
100
|
+
return dirname(explicit);
|
|
101
|
+
if (await isFile(join(explicit, PRODUCTION_MANIFEST_NAME)))
|
|
102
|
+
return explicit;
|
|
103
|
+
}
|
|
104
|
+
const project = await resolveVelarProject(input, current);
|
|
105
|
+
return project.outDir;
|
|
106
|
+
}
|
|
107
|
+
async function productionFiles(root) {
|
|
108
|
+
const output = new Set();
|
|
109
|
+
const visit = async (directory) => {
|
|
110
|
+
for (const entry of await readdir(directory, { withFileTypes: true })) {
|
|
111
|
+
const path = join(directory, entry.name);
|
|
112
|
+
const information = await lstat(path);
|
|
113
|
+
const display = relative(root, path).replaceAll("\\", "/");
|
|
114
|
+
if (information.isSymbolicLink())
|
|
115
|
+
throw new Error(`Production build contains symbolic link '${display}'`);
|
|
116
|
+
if (information.isDirectory())
|
|
117
|
+
await visit(path);
|
|
118
|
+
else if (information.isFile()) {
|
|
119
|
+
output.add(display);
|
|
120
|
+
if (output.size > MAX_PRODUCTION_ASSETS + 1)
|
|
121
|
+
throw new RangeError(`A production build cannot contain more than ${MAX_PRODUCTION_ASSETS} assets`);
|
|
122
|
+
}
|
|
123
|
+
else
|
|
124
|
+
throw new Error(`Production build contains unsupported file '${display}'`);
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
try {
|
|
128
|
+
if (!(await stat(root)).isDirectory())
|
|
129
|
+
throw new Error(`${root} is not a production build directory`);
|
|
130
|
+
await visit(root);
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
if (isHostErrorCode(error, "ENOENT")) {
|
|
134
|
+
throw new Error(`${root} does not contain a production build; run 'velar build' first`);
|
|
135
|
+
}
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
if (!output.has(PRODUCTION_MANIFEST_NAME))
|
|
139
|
+
throw new Error(`${root} does not contain ${PRODUCTION_MANIFEST_NAME}`);
|
|
140
|
+
return output;
|
|
141
|
+
}
|
|
142
|
+
function verifyDeploymentManifest(deployment, build, assets, manifestPath) {
|
|
143
|
+
if (deployment?.formatVersion !== 2 || deployment?.kind !== "velar-static-deployment") {
|
|
144
|
+
throw new Error(`${manifestPath} references an unsupported static deployment manifest`);
|
|
145
|
+
}
|
|
146
|
+
if (deployment.compiler?.name !== build.compiler.name || deployment.compiler.version !== build.compiler.version) {
|
|
147
|
+
throw new Error(`Production compiler identity differs between build and deployment manifests`);
|
|
148
|
+
}
|
|
149
|
+
if (!sameFramework(deployment.framework, build.framework)) {
|
|
150
|
+
throw new Error(`Framework identity differs between build and deployment manifests`);
|
|
151
|
+
}
|
|
152
|
+
if (typeof deployment.base !== "string" || !deployment.base.startsWith("/") || !deployment.base.endsWith("/")) {
|
|
153
|
+
throw new Error(`Static deployment base must start and end with '/'`);
|
|
154
|
+
}
|
|
155
|
+
if (!Array.isArray(deployment.headers) || deployment.headers.some((rule) => !rule || typeof rule.path !== "string" || !rule.path.startsWith("/") || !rule.values ||
|
|
156
|
+
Object.entries(rule.values).some(([name, value]) => !name || typeof value !== "string"))) {
|
|
157
|
+
throw new Error(`Static deployment headers are invalid`);
|
|
158
|
+
}
|
|
159
|
+
if (deployment.caching?.assets !== "public, max-age=31536000, immutable" || deployment.caching?.documents !== "no-cache") {
|
|
160
|
+
throw new Error(`Static deployment caching contract is invalid`);
|
|
161
|
+
}
|
|
162
|
+
const securityPath = `${deployment.base}*`;
|
|
163
|
+
const requiredSecurityHeaders = {
|
|
164
|
+
"Cross-Origin-Opener-Policy": "same-origin",
|
|
165
|
+
"Permissions-Policy": "camera=(), microphone=(), geolocation=()",
|
|
166
|
+
"Referrer-Policy": "no-referrer",
|
|
167
|
+
"X-Content-Type-Options": "nosniff",
|
|
168
|
+
};
|
|
169
|
+
for (const [name, value] of Object.entries(requiredSecurityHeaders)) {
|
|
170
|
+
requireDeploymentHeader(deployment, securityPath, name, value);
|
|
171
|
+
}
|
|
172
|
+
requireDeploymentHeader(deployment, `${deployment.base}assets/*`, "Cache-Control", deployment.caching.assets);
|
|
173
|
+
const documentPaths = [
|
|
174
|
+
deployment.base,
|
|
175
|
+
`${deployment.base}index.html`,
|
|
176
|
+
`${deployment.base}${PRODUCTION_MANIFEST_NAME}`,
|
|
177
|
+
`${deployment.base}${deploymentPathName(build.deployment.manifest)}`,
|
|
178
|
+
...(deployment.spaFallback ? [`${deployment.base}${deployment.spaFallback.fallback}`] : []),
|
|
179
|
+
];
|
|
180
|
+
for (const path of documentPaths)
|
|
181
|
+
requireDeploymentHeader(deployment, path, "Cache-Control", deployment.caching.documents);
|
|
182
|
+
const fallback = deployment.spaFallback?.fallback ?? null;
|
|
183
|
+
if (fallback !== build.deployment.fallback)
|
|
184
|
+
throw new Error(`SPA fallback differs between build and deployment manifests`);
|
|
185
|
+
if (fallback && assets.get(safeRelativePath(fallback, "SPA fallback"))?.role !== "html") {
|
|
186
|
+
throw new Error(`SPA fallback '${fallback}' is not a declared HTML asset`);
|
|
187
|
+
}
|
|
188
|
+
if (deployment.spaFallback) {
|
|
189
|
+
const source = safeRelativePath(deployment.spaFallback.source, "SPA fallback source");
|
|
190
|
+
if (assets.get(source)?.role !== "html")
|
|
191
|
+
throw new Error(`SPA fallback source '${source}' is not a declared HTML asset`);
|
|
192
|
+
}
|
|
193
|
+
const hasCsp = deployment.headers.some((rule) => Object.hasOwn(rule.values, "Content-Security-Policy"));
|
|
194
|
+
if (hasCsp !== build.deployment.contentSecurityPolicy)
|
|
195
|
+
throw new Error(`CSP state differs between build and deployment manifests`);
|
|
196
|
+
const adapter = deployment.adapter?.name ?? "neutral";
|
|
197
|
+
if (adapter !== build.deployment.adapter)
|
|
198
|
+
throw new Error(`Host adapter differs between build and deployment manifests`);
|
|
199
|
+
if (deployment.adapter) {
|
|
200
|
+
if (deployment.adapter.name !== "netlify" || !Array.isArray(deployment.adapter.files))
|
|
201
|
+
throw new Error(`Static deployment adapter is invalid`);
|
|
202
|
+
if (deployment.base !== "/")
|
|
203
|
+
throw new Error(`Netlify deployment adapter requires root base`);
|
|
204
|
+
if (new Set(deployment.adapter.files).size !== deployment.adapter.files.length)
|
|
205
|
+
throw new Error(`Static deployment adapter declares duplicate files`);
|
|
206
|
+
for (const path of deployment.adapter.files) {
|
|
207
|
+
if (assets.get(safeRelativePath(path, "adapter file"))?.role !== "adapter") {
|
|
208
|
+
throw new Error(`Host adapter file '${path}' is not a declared adapter asset`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
function sameFramework(left, right) {
|
|
214
|
+
return left?.id === right.id
|
|
215
|
+
&& left.capability === right.capability
|
|
216
|
+
&& left.target === right.target
|
|
217
|
+
&& left.protocolVersion === right.protocolVersion
|
|
218
|
+
&& left.apiVersion === right.apiVersion
|
|
219
|
+
&& left.artifactKind === right.artifactKind;
|
|
220
|
+
}
|
|
221
|
+
function requireDeploymentHeader(deployment, path, name, expected) {
|
|
222
|
+
const values = deployment.headers
|
|
223
|
+
.filter((rule) => rule.path === path)
|
|
224
|
+
.flatMap((rule) => Object.entries(rule.values))
|
|
225
|
+
.filter(([candidate]) => candidate.toLowerCase() === name.toLowerCase())
|
|
226
|
+
.map(([, value]) => value);
|
|
227
|
+
if (values.length !== 1 || values[0] !== expected) {
|
|
228
|
+
throw new Error(`Static deployment header '${name}' for '${path}' must be '${expected}'`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
function deploymentPathName(value) {
|
|
232
|
+
return safeRelativePath(value, "deployment manifest");
|
|
233
|
+
}
|
|
234
|
+
function safeRelativePath(value, label) {
|
|
235
|
+
if (typeof value !== "string" || !value || isAbsolute(value) || value.includes("\\")) {
|
|
236
|
+
throw new Error(`Production ${label} must be a normalized relative path`);
|
|
237
|
+
}
|
|
238
|
+
const segments = value.split("/");
|
|
239
|
+
if (segments.some((segment) => !segment || segment === "." || segment === "..")) {
|
|
240
|
+
throw new Error(`Production ${label} must be a normalized relative path`);
|
|
241
|
+
}
|
|
242
|
+
return value;
|
|
243
|
+
}
|
|
244
|
+
async function readJson(path, label) {
|
|
245
|
+
try {
|
|
246
|
+
const metadata = await stat(path);
|
|
247
|
+
if (!metadata.isFile())
|
|
248
|
+
throw new Error("not a regular file");
|
|
249
|
+
if (metadata.size > 64 * 1024 * 1024)
|
|
250
|
+
throw new RangeError("JSON file exceeds 64 MiB");
|
|
251
|
+
const source = await readFile(path, "utf8");
|
|
252
|
+
if (Buffer.byteLength(source, "utf8") > 64 * 1024 * 1024)
|
|
253
|
+
throw new RangeError("JSON file exceeds 64 MiB");
|
|
254
|
+
return JSON.parse(source);
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
throw new Error(`Cannot read ${label} ${path}: ${hostErrorMessage(error)}`);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
async function isFile(path) {
|
|
261
|
+
try {
|
|
262
|
+
return (await stat(path)).isFile();
|
|
263
|
+
}
|
|
264
|
+
catch {
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=production-verifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"production-verifier.js","sourceRoot":"","sources":["../src/production-verifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { VelarProjectConfig } from "./config.ts";
|
|
2
|
+
export interface RunProgramOptions {
|
|
3
|
+
/** MOD-U10: prints the unfiltered Node.js stack instead of the owned frames. */
|
|
4
|
+
readonly fullStack?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare function runProgram(config: VelarProjectConfig, programArguments: readonly string[], options?: RunProgramOptions): Promise<number>;
|
|
7
|
+
//# sourceMappingURL=program-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"program-runner.d.ts","sourceRoot":"","sources":["../src/program-runner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAWtD,MAAM,WAAW,iBAAiB;IAChC,gFAAgF;IAChF,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,kBAAkB,EAC1B,gBAAgB,EAAE,SAAS,MAAM,EAAE,EACnC,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,MAAM,CAAC,CA0CjB"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { pathToFileURL } from "node:url";
|
|
5
|
+
import { formatDiagnostic } from "@velarscript/compiler";
|
|
6
|
+
import { compileProject } from "./project.js";
|
|
7
|
+
import { compiledTestModulePath, createCompiledSandbox, removeCompiledSandbox, writeCompiledTestProject } from "./test-output.js";
|
|
8
|
+
import { prepareStandardModules } from "./test-runner.js";
|
|
9
|
+
import { uncaughtProgramEntrySource } from "./uncaught-program-error.js";
|
|
10
|
+
// velar/host owns a 30-second in-program graceful-shutdown window. The outer
|
|
11
|
+
// launcher must not truncate that public contract; this margin only catches a
|
|
12
|
+
// child that ignored the signal or failed to exit after its own deadline.
|
|
13
|
+
const runShutdownDeadlineMs = 35_000;
|
|
14
|
+
export async function runProgram(config, programArguments, options = {}) {
|
|
15
|
+
const project = await compileProject(config.entryPath, new Map(), {
|
|
16
|
+
sourceRoot: config.root,
|
|
17
|
+
projectRoot: config.root,
|
|
18
|
+
publicRoot: config.publicDir,
|
|
19
|
+
extensions: config.compilerExtensions,
|
|
20
|
+
extensionConfig: config.extensionConfig,
|
|
21
|
+
framework: config.framework,
|
|
22
|
+
});
|
|
23
|
+
for (const notice of project.notices)
|
|
24
|
+
process.stderr.write(`${notice.path}: notice: ${notice.message}\n`);
|
|
25
|
+
const errors = [
|
|
26
|
+
...project.failures.map((failure) => `${failure.path}: ${failure.message}`),
|
|
27
|
+
...project.modules.flatMap((module) => module.result.diagnostics.map((diagnostic) => formatDiagnostic(module.result.source, diagnostic))),
|
|
28
|
+
];
|
|
29
|
+
if (errors.length > 0) {
|
|
30
|
+
process.stderr.write(`${errors.join("\n\n")}\n`);
|
|
31
|
+
return 1;
|
|
32
|
+
}
|
|
33
|
+
const entry = project.modules.find((module) => module.inputPath === project.entryPath);
|
|
34
|
+
if (!entry) {
|
|
35
|
+
process.stderr.write(`velar run: the entry module ${project.entryPath} was not compiled\n`);
|
|
36
|
+
return 1;
|
|
37
|
+
}
|
|
38
|
+
const temporary = await createCompiledSandbox(config.root, "run");
|
|
39
|
+
try {
|
|
40
|
+
await prepareStandardModules(temporary, config);
|
|
41
|
+
await writeCompiledTestProject(project, temporary);
|
|
42
|
+
// MOD-U10: the program is entered through a VelarScript-owned launcher so an
|
|
43
|
+
// uncaught initialization or entry error prints as a VelarScript failure —
|
|
44
|
+
// the source-mapped .vel frames without Node's module-loader frames or its
|
|
45
|
+
// version banner — instead of a raw Node.js crash dump.
|
|
46
|
+
const launcher = join(temporary, ".velar-run-entry.mjs");
|
|
47
|
+
await writeFile(launcher, uncaughtProgramEntrySource({
|
|
48
|
+
entryUrl: pathToFileURL(compiledTestModulePath(project, entry, temporary)).href,
|
|
49
|
+
sourcePath: entry.inputPath.replaceAll("\\", "/"),
|
|
50
|
+
fullStack: options.fullStack === true,
|
|
51
|
+
}), "utf8");
|
|
52
|
+
return await executeNodeProgram(launcher, programArguments);
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
await removeCompiledSandbox(temporary);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function executeNodeProgram(entryPath, programArguments) {
|
|
59
|
+
return new Promise((resolve, reject) => {
|
|
60
|
+
const child = spawn(process.execPath, ["--enable-source-maps", entryPath, ...programArguments], { stdio: "inherit" });
|
|
61
|
+
let forwardedSignal = null;
|
|
62
|
+
let shutdownDeadline = null;
|
|
63
|
+
const cleanup = () => {
|
|
64
|
+
process.off("SIGINT", onInterrupt);
|
|
65
|
+
process.off("SIGTERM", onTerminate);
|
|
66
|
+
if (shutdownDeadline)
|
|
67
|
+
clearTimeout(shutdownDeadline);
|
|
68
|
+
};
|
|
69
|
+
const forward = (signal) => {
|
|
70
|
+
if (child.exitCode !== null || child.signalCode !== null)
|
|
71
|
+
return;
|
|
72
|
+
if (forwardedSignal !== null) {
|
|
73
|
+
child.kill("SIGKILL");
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
forwardedSignal = signal;
|
|
77
|
+
child.kill(signal);
|
|
78
|
+
shutdownDeadline = setTimeout(() => {
|
|
79
|
+
if (child.exitCode === null && child.signalCode === null)
|
|
80
|
+
child.kill("SIGKILL");
|
|
81
|
+
}, runShutdownDeadlineMs);
|
|
82
|
+
shutdownDeadline.unref();
|
|
83
|
+
};
|
|
84
|
+
const onInterrupt = () => forward("SIGINT");
|
|
85
|
+
const onTerminate = () => forward("SIGTERM");
|
|
86
|
+
process.on("SIGINT", onInterrupt);
|
|
87
|
+
process.on("SIGTERM", onTerminate);
|
|
88
|
+
child.once("error", (error) => {
|
|
89
|
+
cleanup();
|
|
90
|
+
reject(error);
|
|
91
|
+
});
|
|
92
|
+
child.once("exit", (code, signal) => {
|
|
93
|
+
cleanup();
|
|
94
|
+
resolve(code ?? (signal === "SIGINT" ? 130 : signal === "SIGTERM" ? 143 : 1));
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=program-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"program-runner.js","sourceRoot":"","sources":["../src/program-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { VelarProjectConfig } from "./config.ts";
|
|
2
|
+
import { type ProjectResult } from "./project.ts";
|
|
3
|
+
/**
|
|
4
|
+
* One compiled root of a `velar check` run: the project entry first, then every
|
|
5
|
+
* `*.test.vel` module, which no import reaches and which therefore has to be
|
|
6
|
+
* compiled as a root of its own.
|
|
7
|
+
*/
|
|
8
|
+
export interface CheckedProjectRoot {
|
|
9
|
+
readonly result: ProjectResult;
|
|
10
|
+
readonly errors: readonly string[];
|
|
11
|
+
}
|
|
12
|
+
export interface CheckedProject {
|
|
13
|
+
readonly project: ProjectResult;
|
|
14
|
+
readonly roots: readonly CheckedProjectRoot[];
|
|
15
|
+
readonly compiled: ReadonlySet<string>;
|
|
16
|
+
readonly notices: readonly string[];
|
|
17
|
+
readonly errors: readonly string[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* D66 ruling 7A: `velar repro` has to bundle the failure `velar check` reports,
|
|
21
|
+
* so both commands read the project through this one function. A repro that
|
|
22
|
+
* compiled the project its own way would eventually bundle a different failure
|
|
23
|
+
* than the one the author saw.
|
|
24
|
+
*/
|
|
25
|
+
export declare function checkResolvedProject(config: VelarProjectConfig, input: string | null): Promise<CheckedProject>;
|
|
26
|
+
/** Exactly what a `velar check` run writes to stderr, without the repro hint. */
|
|
27
|
+
export declare function formatCheckOutput(checked: CheckedProject): string;
|
|
28
|
+
/** Every `*.test.vel` root in the project — the modules no import reaches. */
|
|
29
|
+
export declare function projectTestModules(config: VelarProjectConfig): Promise<string[]>;
|
|
30
|
+
export declare function discoverVelarSources(config: VelarProjectConfig): Promise<string[]>;
|
|
31
|
+
//# sourceMappingURL=project-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-check.d.ts","sourceRoot":"","sources":["../src/project-check.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAyC,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAGzF;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC9C,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC,CAkDpH;AAED,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAGjE;AAED,8EAA8E;AAC9E,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAEtF;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmBxF"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { readdir } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { formatDiagnostic } from "@velarscript/compiler";
|
|
4
|
+
import { compileProject, compileProjectEntries } from "./project.js";
|
|
5
|
+
import { MAX_VELAR_PROJECT_MODULES } from "./source-limits.js";
|
|
6
|
+
/**
|
|
7
|
+
* D66 ruling 7A: `velar repro` has to bundle the failure `velar check` reports,
|
|
8
|
+
* so both commands read the project through this one function. A repro that
|
|
9
|
+
* compiled the project its own way would eventually bundle a different failure
|
|
10
|
+
* than the one the author saw.
|
|
11
|
+
*/
|
|
12
|
+
export async function checkResolvedProject(config, input) {
|
|
13
|
+
const project = await compileProjectEntries([config.entryPath, ...config.workerEntries.values()], config.entryPath, new Map(), {
|
|
14
|
+
projectRoot: config.root,
|
|
15
|
+
publicRoot: config.publicDir,
|
|
16
|
+
extensions: config.compilerExtensions,
|
|
17
|
+
extensionConfig: config.extensionConfig,
|
|
18
|
+
framework: config.framework,
|
|
19
|
+
});
|
|
20
|
+
// A `*.test.vel` module is not reachable from the entry, so the module-graph
|
|
21
|
+
// walk never saw one: `const n: number = "not a number"` inside a test passed
|
|
22
|
+
// `check` and `build` (audit 12). Test source is source the author owns and
|
|
23
|
+
// answers to the same compiler; it stays out of the build *output*, because
|
|
24
|
+
// checking is not emitting.
|
|
25
|
+
const testModules = input?.endsWith(".vel") ? [] : await projectTestModules(config);
|
|
26
|
+
const compiled = new Set(project.modules.map((module) => module.inputPath));
|
|
27
|
+
// MOD-I1: resolution failures and module diagnostics print together —
|
|
28
|
+
// exactly as `velar run` reports them — so one unresolved import can never
|
|
29
|
+
// bury the compiler's own diagnostics for everything else.
|
|
30
|
+
const roots = [{
|
|
31
|
+
result: project,
|
|
32
|
+
errors: [
|
|
33
|
+
...project.failures.map((failure) => `${failure.path}: ${failure.message}`),
|
|
34
|
+
...project.modules.flatMap((module) => module.result.diagnostics.map((item) => formatDiagnostic(module.result.source, item))),
|
|
35
|
+
],
|
|
36
|
+
}];
|
|
37
|
+
for (const file of testModules) {
|
|
38
|
+
const testProject = await compileProject(file, new Map(), {
|
|
39
|
+
sourceRoot: config.root,
|
|
40
|
+
projectRoot: config.root,
|
|
41
|
+
publicRoot: config.publicDir,
|
|
42
|
+
extensions: config.compilerExtensions,
|
|
43
|
+
extensionConfig: config.extensionConfig,
|
|
44
|
+
framework: config.framework,
|
|
45
|
+
exportTestFunctions: true,
|
|
46
|
+
});
|
|
47
|
+
const errors = testProject.failures.map((failure) => `${failure.path}: ${failure.message}`);
|
|
48
|
+
for (const module of testProject.modules) {
|
|
49
|
+
if (compiled.has(module.inputPath))
|
|
50
|
+
continue;
|
|
51
|
+
compiled.add(module.inputPath);
|
|
52
|
+
errors.push(...module.result.diagnostics.map((item) => formatDiagnostic(module.result.source, item)));
|
|
53
|
+
}
|
|
54
|
+
roots.push({ result: testProject, errors });
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
project,
|
|
58
|
+
roots,
|
|
59
|
+
compiled,
|
|
60
|
+
notices: project.notices.map((notice) => `${notice.path}: notice: ${notice.message}`),
|
|
61
|
+
errors: roots.flatMap((root) => root.errors),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/** Exactly what a `velar check` run writes to stderr, without the repro hint. */
|
|
65
|
+
export function formatCheckOutput(checked) {
|
|
66
|
+
const notices = checked.notices.map((notice) => `${notice}\n`).join("");
|
|
67
|
+
return checked.errors.length > 0 ? `${notices}${checked.errors.join("\n\n")}\n` : notices;
|
|
68
|
+
}
|
|
69
|
+
/** Every `*.test.vel` root in the project — the modules no import reaches. */
|
|
70
|
+
export async function projectTestModules(config) {
|
|
71
|
+
return (await discoverVelarSources(config)).filter((path) => path.endsWith(".test.vel"));
|
|
72
|
+
}
|
|
73
|
+
export async function discoverVelarSources(config) {
|
|
74
|
+
const output = [];
|
|
75
|
+
const excluded = new Set([config.outDir, config.publicDir]);
|
|
76
|
+
const visit = async (directory) => {
|
|
77
|
+
for (const entry of await readdir(directory, { withFileTypes: true })) {
|
|
78
|
+
const path = join(directory, entry.name);
|
|
79
|
+
if (entry.isDirectory()) {
|
|
80
|
+
if (entry.name === ".git" || entry.name === "node_modules" || entry.name === ".velar" || excluded.has(path))
|
|
81
|
+
continue;
|
|
82
|
+
await visit(path);
|
|
83
|
+
}
|
|
84
|
+
else if (entry.isFile() && entry.name.endsWith(".vel")) {
|
|
85
|
+
output.push(path);
|
|
86
|
+
if (output.length > MAX_VELAR_PROJECT_MODULES) {
|
|
87
|
+
throw new RangeError(`A VelarScript project cannot contain more than ${MAX_VELAR_PROJECT_MODULES} source modules`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
await visit(config.root);
|
|
93
|
+
return output.sort();
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=project-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-check.js","sourceRoot":"","sources":["../src/project-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const CURRENT_PROJECT_FORMAT_VERSION = 2;
|
|
2
|
+
export declare const CORE_PROJECT_MANIFEST_FIELDS: readonly ["formatVersion", "entry", "outDir", "publicDir", "extensions", "workers"];
|
|
3
|
+
/** Internal standard-module config carrying logical worker names to output paths. */
|
|
4
|
+
export declare const CORE_WORKER_CONFIG_KEY = "velar:core-workers-v1";
|
|
5
|
+
export declare function isReservedExtensionManifestKey(value: string): boolean;
|
|
6
|
+
//# sourceMappingURL=project-format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-format.d.ts","sourceRoot":"","sources":["../src/project-format.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAEhD,eAAO,MAAM,4BAA4B,qFAO9B,CAAC;AAEZ,qFAAqF;AACrF,eAAO,MAAM,sBAAsB,0BAA0B,CAAC;AAS9D,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAErE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export const CURRENT_PROJECT_FORMAT_VERSION = 2;
|
|
2
|
+
export const CORE_PROJECT_MANIFEST_FIELDS = Object.freeze([
|
|
3
|
+
"formatVersion",
|
|
4
|
+
"entry",
|
|
5
|
+
"outDir",
|
|
6
|
+
"publicDir",
|
|
7
|
+
"extensions",
|
|
8
|
+
"workers",
|
|
9
|
+
]);
|
|
10
|
+
/** Internal standard-module config carrying logical worker names to output paths. */
|
|
11
|
+
export const CORE_WORKER_CONFIG_KEY = "velar:core-workers-v1";
|
|
12
|
+
const reservedExtensionManifestKeys = new Set([
|
|
13
|
+
...CORE_PROJECT_MANIFEST_FIELDS,
|
|
14
|
+
"__proto__",
|
|
15
|
+
"constructor",
|
|
16
|
+
"prototype",
|
|
17
|
+
]);
|
|
18
|
+
export function isReservedExtensionManifestKey(value) {
|
|
19
|
+
return reservedExtensionManifestKeys.has(value);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=project-format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-format.js","sourceRoot":"","sources":["../src/project-format.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC;AAEhD,MAAM,CAAC,MAAM,4BAA4B,GAAG,MAAM,CAAC,MAAM,CAAC;IACxD,eAAe;IACf,OAAO;IACP,QAAQ;IACR,WAAW;IACX,YAAY;IACZ,SAAS;CACD,CAAC,CAAC;AAEZ,qFAAqF;AACrF,MAAM,CAAC,MAAM,sBAAsB,GAAG,uBAAuB,CAAC;AAE9D,MAAM,6BAA6B,GAAG,IAAI,GAAG,CAAS;IACpD,GAAG,4BAA4B;IAC/B,WAAW;IACX,aAAa;IACb,WAAW;CACZ,CAAC,CAAC;AAEH,MAAM,UAAU,8BAA8B,CAAC,KAAa;IAC1D,OAAO,6BAA6B,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAClD,CAAC"}
|