@g3nomaly/core 0.3.0 → 0.3.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 +95 -0
- package/dist/cli/commands/add.d.ts +17 -0
- package/dist/cli/commands/add.d.ts.map +1 -0
- package/dist/cli/commands/add.js +76 -0
- package/dist/cli/commands/add.js.map +1 -0
- package/dist/cli/commands/installFromSources.d.ts +49 -0
- package/dist/cli/commands/installFromSources.d.ts.map +1 -0
- package/dist/cli/commands/installFromSources.js +138 -0
- package/dist/cli/commands/installFromSources.js.map +1 -0
- package/dist/cli/commands/ls.d.ts +16 -0
- package/dist/cli/commands/ls.d.ts.map +1 -0
- package/dist/cli/commands/ls.js +65 -0
- package/dist/cli/commands/ls.js.map +1 -0
- package/dist/cli/commands/remove.d.ts +13 -0
- package/dist/cli/commands/remove.d.ts.map +1 -0
- package/dist/cli/commands/remove.js +109 -0
- package/dist/cli/commands/remove.js.map +1 -0
- package/dist/cli/commands/sources.d.ts +45 -0
- package/dist/cli/commands/sources.d.ts.map +1 -0
- package/dist/cli/commands/sources.js +89 -0
- package/dist/cli/commands/sources.js.map +1 -0
- package/dist/cli/commands/update.d.ts +10 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +92 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/dialogue.d.ts +74 -0
- package/dist/cli/dialogue.d.ts.map +1 -0
- package/dist/cli/dialogue.js +117 -0
- package/dist/cli/dialogue.js.map +1 -0
- package/dist/cli/index.d.ts +19 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +16 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/installDialogues.d.ts +15 -0
- package/dist/cli/installDialogues.d.ts.map +1 -0
- package/dist/cli/installDialogues.js +72 -0
- package/dist/cli/installDialogues.js.map +1 -0
- package/dist/cli/pick.d.ts +14 -0
- package/dist/cli/pick.d.ts.map +1 -0
- package/dist/cli/pick.js +35 -0
- package/dist/cli/pick.js.map +1 -0
- package/dist/cli/report.d.ts +34 -0
- package/dist/cli/report.d.ts.map +1 -0
- package/dist/cli/report.js +71 -0
- package/dist/cli/report.js.map +1 -0
- package/dist/cli/theme.d.ts +23 -0
- package/dist/cli/theme.d.ts.map +1 -0
- package/dist/cli/theme.js +25 -0
- package/dist/cli/theme.js.map +1 -0
- package/dist/cli/types.d.ts +45 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/config/config.d.ts +30 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +77 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/types.d.ts +124 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +61 -0
- package/dist/config/types.js.map +1 -0
- package/dist/hash/hash.d.ts +25 -0
- package/dist/hash/hash.d.ts.map +1 -0
- package/dist/hash/hash.js +44 -0
- package/dist/hash/hash.js.map +1 -0
- package/dist/hash/index.d.ts +2 -0
- package/dist/hash/index.d.ts.map +1 -0
- package/dist/hash/index.js +2 -0
- package/dist/hash/index.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/installer/classify.d.ts +7 -0
- package/dist/installer/classify.d.ts.map +1 -0
- package/dist/installer/classify.js +47 -0
- package/dist/installer/classify.js.map +1 -0
- package/dist/installer/files.d.ts +15 -0
- package/dist/installer/files.d.ts.map +1 -0
- package/dist/installer/files.js +22 -0
- package/dist/installer/files.js.map +1 -0
- package/dist/installer/index.d.ts +19 -0
- package/dist/installer/index.d.ts.map +1 -0
- package/dist/installer/index.js +14 -0
- package/dist/installer/index.js.map +1 -0
- package/dist/installer/install.d.ts +13 -0
- package/dist/installer/install.d.ts.map +1 -0
- package/dist/installer/install.js +61 -0
- package/dist/installer/install.js.map +1 -0
- package/dist/installer/io.d.ts +4 -0
- package/dist/installer/io.d.ts.map +1 -0
- package/dist/installer/io.js +18 -0
- package/dist/installer/io.js.map +1 -0
- package/dist/installer/manifest.d.ts +59 -0
- package/dist/installer/manifest.d.ts.map +1 -0
- package/dist/installer/manifest.js +60 -0
- package/dist/installer/manifest.js.map +1 -0
- package/dist/installer/manifestSources.d.ts +21 -0
- package/dist/installer/manifestSources.d.ts.map +1 -0
- package/dist/installer/manifestSources.js +39 -0
- package/dist/installer/manifestSources.js.map +1 -0
- package/dist/installer/marketplace.d.ts +34 -0
- package/dist/installer/marketplace.d.ts.map +1 -0
- package/dist/installer/marketplace.js +64 -0
- package/dist/installer/marketplace.js.map +1 -0
- package/dist/installer/origin.d.ts +43 -0
- package/dist/installer/origin.d.ts.map +1 -0
- package/dist/installer/origin.js +22 -0
- package/dist/installer/origin.js.map +1 -0
- package/dist/installer/remove.d.ts +14 -0
- package/dist/installer/remove.d.ts.map +1 -0
- package/dist/installer/remove.js +37 -0
- package/dist/installer/remove.js.map +1 -0
- package/dist/installer/resolve.d.ts +78 -0
- package/dist/installer/resolve.d.ts.map +1 -0
- package/dist/installer/resolve.js +184 -0
- package/dist/installer/resolve.js.map +1 -0
- package/dist/installer/sourceRegistry.d.ts +59 -0
- package/dist/installer/sourceRegistry.d.ts.map +1 -0
- package/dist/installer/sourceRegistry.js +71 -0
- package/dist/installer/sourceRegistry.js.map +1 -0
- package/dist/installer/types.d.ts +80 -0
- package/dist/installer/types.d.ts.map +1 -0
- package/dist/installer/types.js +21 -0
- package/dist/installer/types.js.map +1 -0
- package/dist/registry/index.d.ts +12 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +12 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/registry.handlers.d.ts +9 -0
- package/dist/registry/registry.handlers.d.ts.map +1 -0
- package/dist/registry/registry.handlers.js +13 -0
- package/dist/registry/registry.handlers.js.map +1 -0
- package/dist/registry/registry.io.d.ts +22 -0
- package/dist/registry/registry.io.d.ts.map +1 -0
- package/dist/registry/registry.io.js +78 -0
- package/dist/registry/registry.io.js.map +1 -0
- package/dist/registry/registry.mutations.d.ts +12 -0
- package/dist/registry/registry.mutations.d.ts.map +1 -0
- package/dist/registry/registry.mutations.js +22 -0
- package/dist/registry/registry.mutations.js.map +1 -0
- package/dist/registry/registry.selectors.d.ts +38 -0
- package/dist/registry/registry.selectors.d.ts.map +1 -0
- package/dist/registry/registry.selectors.js +61 -0
- package/dist/registry/registry.selectors.js.map +1 -0
- package/dist/registry/registry.store.d.ts +34 -0
- package/dist/registry/registry.store.d.ts.map +1 -0
- package/dist/registry/registry.store.js +27 -0
- package/dist/registry/registry.store.js.map +1 -0
- package/dist/registry/registry.template.d.ts +23 -0
- package/dist/registry/registry.template.d.ts.map +1 -0
- package/dist/registry/registry.template.js +63 -0
- package/dist/registry/registry.template.js.map +1 -0
- package/dist/registry/types.d.ts +33 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +25 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/security/index.d.ts +2 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +2 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/securityParser.d.ts +14 -0
- package/dist/security/securityParser.d.ts.map +1 -0
- package/dist/security/securityParser.js +89 -0
- package/dist/security/securityParser.js.map +1 -0
- package/dist/security/securityWorker.d.ts +8 -0
- package/dist/security/securityWorker.d.ts.map +1 -0
- package/dist/security/securityWorker.js +158 -0
- package/dist/security/securityWorker.js.map +1 -0
- package/dist/sources/checkout.d.ts +14 -0
- package/dist/sources/checkout.d.ts.map +1 -0
- package/dist/sources/checkout.js +27 -0
- package/dist/sources/checkout.js.map +1 -0
- package/dist/sources/git.d.ts +9 -0
- package/dist/sources/git.d.ts.map +1 -0
- package/dist/sources/git.js +22 -0
- package/dist/sources/git.js.map +1 -0
- package/dist/sources/index.d.ts +5 -0
- package/dist/sources/index.d.ts.map +1 -0
- package/dist/sources/index.js +6 -0
- package/dist/sources/index.js.map +1 -0
- package/dist/sources/local.d.ts +10 -0
- package/dist/sources/local.d.ts.map +1 -0
- package/dist/sources/local.js +20 -0
- package/dist/sources/local.js.map +1 -0
- package/dist/sources/npm.d.ts +13 -0
- package/dist/sources/npm.d.ts.map +1 -0
- package/dist/sources/npm.js +128 -0
- package/dist/sources/npm.js.map +1 -0
- package/dist/sources/packageJson.d.ts +3 -0
- package/dist/sources/packageJson.d.ts.map +1 -0
- package/dist/sources/packageJson.js +13 -0
- package/dist/sources/packageJson.js.map +1 -0
- package/dist/sources/parse.d.ts +34 -0
- package/dist/sources/parse.d.ts.map +1 -0
- package/dist/sources/parse.js +92 -0
- package/dist/sources/parse.js.map +1 -0
- package/dist/sources/process.d.ts +18 -0
- package/dist/sources/process.d.ts.map +1 -0
- package/dist/sources/process.js +43 -0
- package/dist/sources/process.js.map +1 -0
- package/dist/sources/register.d.ts +16 -0
- package/dist/sources/register.d.ts.map +1 -0
- package/dist/sources/register.js +37 -0
- package/dist/sources/register.js.map +1 -0
- package/dist/sources/types.d.ts +73 -0
- package/dist/sources/types.d.ts.map +1 -0
- package/dist/sources/types.js +36 -0
- package/dist/sources/types.js.map +1 -0
- package/dist/utils/errors.d.ts +3 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +6 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/merge.d.ts +6 -0
- package/dist/utils/merge.d.ts.map +1 -0
- package/dist/utils/merge.js +21 -0
- package/dist/utils/merge.js.map +1 -0
- package/dist/utils/packageMeta.d.ts +12 -0
- package/dist/utils/packageMeta.d.ts.map +1 -0
- package/dist/utils/packageMeta.js +20 -0
- package/dist/utils/packageMeta.js.map +1 -0
- package/dist/utils/paths.d.ts +16 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +40 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/prompt.d.ts +3 -0
- package/dist/utils/prompt.d.ts.map +1 -0
- package/dist/utils/prompt.js +8 -0
- package/dist/utils/prompt.js.map +1 -0
- package/dist/utils/version.d.ts +9 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +103 -0
- package/dist/utils/version.js.map +1 -0
- package/package.json +64 -3
- package/README.md +0 -3
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Store } from "@tanstack/store";
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// Factory
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
/**
|
|
6
|
+
* Creates a RegistryStore backed by TanStack Store.
|
|
7
|
+
* State starts empty — call load() to hydrate from disk.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* const registry = createRegistryStore<MyEntry>({ filePath: "/abs/.g3nerate-manifest.ts" })
|
|
11
|
+
* await load(registry)
|
|
12
|
+
*/
|
|
13
|
+
export function createRegistryStore(options = {}) {
|
|
14
|
+
return {
|
|
15
|
+
store: new Store({}),
|
|
16
|
+
filePath: options.filePath,
|
|
17
|
+
handler: options.handler,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Sets the default handler on the store. Returns the store for chaining.
|
|
22
|
+
*/
|
|
23
|
+
export function useHandler(registry, handler) {
|
|
24
|
+
registry.handler = handler;
|
|
25
|
+
return registry;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=registry.store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.store.js","sourceRoot":"","sources":["../../src/registry/registry.store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AA2BvC,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAO,GAA4B,EAAE;IAErC,OAAO;QACL,KAAK,EAAE,IAAI,KAAK,CAAkB,EAAE,CAAC;QACrC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,QAA0B,EAC1B,OAA2B;IAE3B,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAA;IAC1B,OAAO,QAAQ,CAAA;AACjB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recursively serializes a value to a TypeScript object literal string.
|
|
3
|
+
* Used by generateRegistryFile to produce human-readable .ts output.
|
|
4
|
+
*/
|
|
5
|
+
export declare function stringifyValue(value: unknown, depth?: number): string;
|
|
6
|
+
/**
|
|
7
|
+
* Generates the full content of a typed .ts registry manifest file.
|
|
8
|
+
*
|
|
9
|
+
* @param entries - The registry entries to serialize
|
|
10
|
+
* @param typeName - TypeScript type name for the `satisfies` clause
|
|
11
|
+
* @param importFrom - Package to import the type from
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* generateRegistryFile(entries, "G3nerateRegistry", "@g3nomaly/g3nerate")
|
|
15
|
+
* // →
|
|
16
|
+
* // import type { G3nerateRegistry } from "@g3nomaly/g3nerate"
|
|
17
|
+
* //
|
|
18
|
+
* // export const registry = {
|
|
19
|
+
* // "my-schema": { ... },
|
|
20
|
+
* // } as const satisfies G3nerateRegistry
|
|
21
|
+
*/
|
|
22
|
+
export declare function generateRegistryFile(entries: Record<string, unknown>, typeName: string, importFrom: string): string;
|
|
23
|
+
//# sourceMappingURL=registry.template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.template.d.ts","sourceRoot":"","sources":["../../src/registry/registry.template.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,SAAI,GAAG,MAAM,CA2BhE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,MAAM,CAeR"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recursively serializes a value to a TypeScript object literal string.
|
|
3
|
+
* Used by generateRegistryFile to produce human-readable .ts output.
|
|
4
|
+
*/
|
|
5
|
+
export function stringifyValue(value, depth = 0) {
|
|
6
|
+
const indent = " ".repeat(depth);
|
|
7
|
+
const innerIndent = " ".repeat(depth + 1);
|
|
8
|
+
if (value === null)
|
|
9
|
+
return "null";
|
|
10
|
+
if (value === undefined)
|
|
11
|
+
return "undefined";
|
|
12
|
+
if (typeof value === "string")
|
|
13
|
+
return JSON.stringify(value);
|
|
14
|
+
if (typeof value === "number" || typeof value === "boolean")
|
|
15
|
+
return String(value);
|
|
16
|
+
if (Array.isArray(value)) {
|
|
17
|
+
if (value.length === 0)
|
|
18
|
+
return "[]";
|
|
19
|
+
const items = value
|
|
20
|
+
.map((v) => `${innerIndent}${stringifyValue(v, depth + 1)}`)
|
|
21
|
+
.join(",\n");
|
|
22
|
+
return `[\n${items},\n${indent}]`;
|
|
23
|
+
}
|
|
24
|
+
if (typeof value === "object") {
|
|
25
|
+
const entries = Object.entries(value);
|
|
26
|
+
if (entries.length === 0)
|
|
27
|
+
return "{}";
|
|
28
|
+
const lines = entries
|
|
29
|
+
.map(([k, v]) => `${innerIndent}${JSON.stringify(k)}: ${stringifyValue(v, depth + 1)}`)
|
|
30
|
+
.join(",\n");
|
|
31
|
+
return `{\n${lines},\n${indent}}`;
|
|
32
|
+
}
|
|
33
|
+
return String(value);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Generates the full content of a typed .ts registry manifest file.
|
|
37
|
+
*
|
|
38
|
+
* @param entries - The registry entries to serialize
|
|
39
|
+
* @param typeName - TypeScript type name for the `satisfies` clause
|
|
40
|
+
* @param importFrom - Package to import the type from
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* generateRegistryFile(entries, "G3nerateRegistry", "@g3nomaly/g3nerate")
|
|
44
|
+
* // →
|
|
45
|
+
* // import type { G3nerateRegistry } from "@g3nomaly/g3nerate"
|
|
46
|
+
* //
|
|
47
|
+
* // export const registry = {
|
|
48
|
+
* // "my-schema": { ... },
|
|
49
|
+
* // } as const satisfies G3nerateRegistry
|
|
50
|
+
*/
|
|
51
|
+
export function generateRegistryFile(entries, typeName, importFrom) {
|
|
52
|
+
const lines = [];
|
|
53
|
+
lines.push(`import type { ${typeName} } from "${importFrom}"`);
|
|
54
|
+
lines.push("");
|
|
55
|
+
lines.push("export const registry = {");
|
|
56
|
+
for (const [key, value] of Object.entries(entries)) {
|
|
57
|
+
lines.push(` ${JSON.stringify(key)}: ${stringifyValue(value, 1)},`);
|
|
58
|
+
}
|
|
59
|
+
lines.push(`} as const satisfies ${typeName}`);
|
|
60
|
+
lines.push("");
|
|
61
|
+
return lines.join("\n");
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=registry.template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.template.js","sourceRoot":"","sources":["../../src/registry/registry.template.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc,EAAE,KAAK,GAAG,CAAC;IACtD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACjC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;IAE1C,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAA;IACjC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,WAAW,CAAA;IAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAC3D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;IAEjF,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QACnC,MAAM,KAAK,GAAG,KAAK;aAChB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,WAAW,GAAG,cAAc,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;aAC3D,IAAI,CAAC,KAAK,CAAC,CAAA;QACd,OAAO,MAAM,KAAK,MAAM,MAAM,GAAG,CAAA;IACnC,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,CAAA;QAChE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QACrC,MAAM,KAAK,GAAG,OAAO;aAClB,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;aACtF,IAAI,CAAC,KAAK,CAAC,CAAA;QACd,OAAO,MAAM,KAAK,MAAM,MAAM,GAAG,CAAA;IACnC,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;AACtB,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAgC,EAChC,QAAgB,EAChB,UAAkB;IAElB,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,CAAC,IAAI,CAAC,iBAAiB,QAAQ,YAAY,UAAU,GAAG,CAAC,CAAA;IAC9D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAA;IAEvC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAA;IACtE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAA;IAC9C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Base file entry — extended by each package with their own `type` enum.
|
|
4
|
+
*/
|
|
5
|
+
export declare const BaseFileEntrySchema: z.ZodObject<{
|
|
6
|
+
path: z.ZodString;
|
|
7
|
+
type: z.ZodString;
|
|
8
|
+
hash: z.ZodOptional<z.ZodString>;
|
|
9
|
+
version: z.ZodOptional<z.ZodString>;
|
|
10
|
+
}, z.core.$strip>;
|
|
11
|
+
export type BaseFileEntry = z.infer<typeof BaseFileEntrySchema>;
|
|
12
|
+
/**
|
|
13
|
+
* Base registry entry — extended by each package with their own fields.
|
|
14
|
+
*/
|
|
15
|
+
export declare const BaseRegistryEntrySchema: z.ZodObject<{
|
|
16
|
+
name: z.ZodString;
|
|
17
|
+
description: z.ZodOptional<z.ZodString>;
|
|
18
|
+
version: z.ZodOptional<z.ZodString>;
|
|
19
|
+
group: z.ZodOptional<z.ZodString>;
|
|
20
|
+
registryDependencies: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
21
|
+
files: z.ZodArray<z.ZodObject<{
|
|
22
|
+
path: z.ZodString;
|
|
23
|
+
type: z.ZodString;
|
|
24
|
+
hash: z.ZodOptional<z.ZodString>;
|
|
25
|
+
version: z.ZodOptional<z.ZodString>;
|
|
26
|
+
}, z.core.$strip>>;
|
|
27
|
+
}, z.core.$strip>;
|
|
28
|
+
export type BaseRegistryEntry = z.infer<typeof BaseRegistryEntrySchema>;
|
|
29
|
+
/**
|
|
30
|
+
* Generic registry map — key → entry.
|
|
31
|
+
*/
|
|
32
|
+
export type BaseRegistry<T extends BaseRegistryEntry = BaseRegistryEntry> = Record<string, T>;
|
|
33
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/registry/types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;iBAK9B,CAAA;AAEF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAE/D;;GAEG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;iBASlC,CAAA;AAEF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA;AAEvE;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// packages/core/src/registry/types.ts
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
/**
|
|
4
|
+
* Base file entry — extended by each package with their own `type` enum.
|
|
5
|
+
*/
|
|
6
|
+
export const BaseFileEntrySchema = z.object({
|
|
7
|
+
path: z.string().min(1),
|
|
8
|
+
type: z.string(),
|
|
9
|
+
hash: z.string().min(1).optional(), // populated at build/install time, absent in unbuilt source meta files
|
|
10
|
+
version: z.string().min(1).optional(), // populated at build/install time, absent in unbuilt source meta files
|
|
11
|
+
});
|
|
12
|
+
/**
|
|
13
|
+
* Base registry entry — extended by each package with their own fields.
|
|
14
|
+
*/
|
|
15
|
+
export const BaseRegistryEntrySchema = z.object({
|
|
16
|
+
name: z.string().min(1),
|
|
17
|
+
description: z.string().optional(),
|
|
18
|
+
version: z.string().optional(),
|
|
19
|
+
/** Display group for `ls`; packages derive it at registry build/load time */
|
|
20
|
+
group: z.string().optional(),
|
|
21
|
+
/** Keys of entries this entry needs installed alongside it */
|
|
22
|
+
registryDependencies: z.array(z.string().min(1)).optional(),
|
|
23
|
+
files: z.array(BaseFileEntrySchema).min(1),
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/registry/types.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,IAAI,EAAK,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,IAAI,EAAK,CAAC,CAAC,MAAM,EAAE;IACnB,IAAI,EAAK,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,uEAAuE;IAC9G,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,uEAAuE;CAC/G,CAAC,CAAA;AAIF;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,6EAA6E;IAC7E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,8DAA8D;IAC9D,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC3D,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;CAC3C,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ZodType, z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Safely parses a TypeScript file that has a default export object literal.
|
|
4
|
+
* Transpiles the file, extracts the object literal via regex, evaluates it
|
|
5
|
+
* inside a sandboxed Worker with a timeout, then validates with the provided
|
|
6
|
+
* Zod schema.
|
|
7
|
+
*
|
|
8
|
+
* @param filePath - Absolute path to the .ts file to parse
|
|
9
|
+
* @param schema - Zod schema to validate the extracted object against
|
|
10
|
+
* @param timeoutMs - Worker timeout in milliseconds (default: 1000)
|
|
11
|
+
* @returns Validated, typed object
|
|
12
|
+
*/
|
|
13
|
+
export declare function getSafeObject<TSchema extends ZodType>(filePath: string, schema: TSchema, timeoutMs?: number): Promise<z.infer<TSchema>>;
|
|
14
|
+
//# sourceMappingURL=securityParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"securityParser.d.ts","sourceRoot":"","sources":["../../src/security/securityParser.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAEtC;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CAAC,OAAO,SAAS,OAAO,EACzD,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,EACf,SAAS,SAAO,GACf,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAkG3B"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// packages/core/src/security/securityParser.ts
|
|
2
|
+
import { Transpiler } from "bun";
|
|
3
|
+
/**
|
|
4
|
+
* Safely parses a TypeScript file that has a default export object literal.
|
|
5
|
+
* Transpiles the file, extracts the object literal via regex, evaluates it
|
|
6
|
+
* inside a sandboxed Worker with a timeout, then validates with the provided
|
|
7
|
+
* Zod schema.
|
|
8
|
+
*
|
|
9
|
+
* @param filePath - Absolute path to the .ts file to parse
|
|
10
|
+
* @param schema - Zod schema to validate the extracted object against
|
|
11
|
+
* @param timeoutMs - Worker timeout in milliseconds (default: 1000)
|
|
12
|
+
* @returns Validated, typed object
|
|
13
|
+
*/
|
|
14
|
+
export async function getSafeObject(filePath, schema, timeoutMs = 1000) {
|
|
15
|
+
const file = Bun.file(filePath);
|
|
16
|
+
const rawContent = await file.text();
|
|
17
|
+
const transpiler = new Transpiler({ loader: "ts" });
|
|
18
|
+
const jsCode = transpiler.transformSync(rawContent);
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Pre-eval static analysis
|
|
21
|
+
// Catches attacks that are undetectable at runtime because they complete
|
|
22
|
+
// successfully before the sanitiser sees any output.
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
const DANGEROUS_PATTERNS = [
|
|
25
|
+
[/\bimport\s*\(/, "dynamic import()"],
|
|
26
|
+
[/\bimport\.meta\b/, "import.meta"],
|
|
27
|
+
[/\bnew\s+Worker\b/, "Worker construction"],
|
|
28
|
+
[/\beval\s*\(/, "eval()"],
|
|
29
|
+
[/\.constructor\s*\.\s*constructor/, "constructor.constructor chain"],
|
|
30
|
+
// deep-object.meta.ts: IIFE builds 100k nested object literals in a loop.
|
|
31
|
+
// Object literal construction bypasses any runtime stub (the Object()
|
|
32
|
+
// constructor is not called for `{}`), so the only reliable catch is
|
|
33
|
+
// source-level: reject any for/while loop that contains an object literal.
|
|
34
|
+
// Pattern: a for(...) or while(...) body that contains `{` (object/block).
|
|
35
|
+
[/\bfor\s*\([\s\S]{0,200}?\)\s*\{[\s\S]{0,500}?\bnested\b/,
|
|
36
|
+
"deep object construction loop"],
|
|
37
|
+
// Broader: any loop body that reassigns via `= {` (obj = { ... })
|
|
38
|
+
[/\bfor\s*\([^)]*\)[^{]*\{[^}]*=\s*\{/,
|
|
39
|
+
"object-building loop"],
|
|
40
|
+
[/\bwhile\s*\([^)]*\)[^{]*\{[^}]*=\s*\{/,
|
|
41
|
+
"object-building loop"],
|
|
42
|
+
// regex-bomb.meta.ts: uses a regex *literal* /(a+)+$/ — the RegExp constructor
|
|
43
|
+
// stub in the worker never fires for literals. Detect nested quantifiers
|
|
44
|
+
// statically: pattern (x+)+ or (x*)* or (x+)* are canonical ReDoS forms.
|
|
45
|
+
[/\/[^/]*\([^)]*[+*]\)[+*]/, "catastrophic regex literal (nested quantifier)"],
|
|
46
|
+
];
|
|
47
|
+
for (const [pattern, label] of DANGEROUS_PATTERNS) {
|
|
48
|
+
if (pattern.test(jsCode)) {
|
|
49
|
+
throw new Error(`Static analysis blocked [${label}] in: ${filePath}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const match = jsCode.match(/(?:export default|const \w+ =)\s*(\{[\s\S]*\})/);
|
|
53
|
+
if (!match) {
|
|
54
|
+
throw new Error(`No valid object literal found in: ${filePath}`);
|
|
55
|
+
}
|
|
56
|
+
const objectString = match[1];
|
|
57
|
+
// securityWorker sits beside this module and shares its extension (.ts in src, .js in dist)
|
|
58
|
+
const workerPath = import.meta.url.replace(/securityParser\.(\w+)$/, "securityWorker.$1");
|
|
59
|
+
const worker = new Worker(workerPath);
|
|
60
|
+
const result = await new Promise((res, rej) => {
|
|
61
|
+
const timeout = setTimeout(() => {
|
|
62
|
+
worker.terminate();
|
|
63
|
+
rej(new Error(`Security Error: Evaluation timed out after ${timeoutMs}ms — possible infinite loop in ${filePath}`));
|
|
64
|
+
}, timeoutMs);
|
|
65
|
+
worker.onmessage = (event) => {
|
|
66
|
+
clearTimeout(timeout);
|
|
67
|
+
worker.terminate();
|
|
68
|
+
const { success, data, error } = event.data;
|
|
69
|
+
if (success) {
|
|
70
|
+
res(data);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
rej(new Error(`Security or Format Error in ${filePath}: ${error}`));
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
worker.onerror = (err) => {
|
|
77
|
+
clearTimeout(timeout);
|
|
78
|
+
worker.terminate();
|
|
79
|
+
rej(new Error(`Worker Error for ${filePath}: ${err.message}`));
|
|
80
|
+
};
|
|
81
|
+
worker.postMessage({ objectString });
|
|
82
|
+
});
|
|
83
|
+
const parsed = schema.safeParse(result);
|
|
84
|
+
if (!parsed.success) {
|
|
85
|
+
throw new Error(`Schema validation failed for ${filePath}:\n${parsed.error.message}`);
|
|
86
|
+
}
|
|
87
|
+
return parsed.data;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=securityParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"securityParser.js","sourceRoot":"","sources":["../../src/security/securityParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
declare const worker: DedicatedWorkerGlobalScope;
|
|
2
|
+
declare const MAX_DEPTH = 20;
|
|
3
|
+
declare const MAX_KEYS = 1000;
|
|
4
|
+
declare const MAX_STRLEN = 100000;
|
|
5
|
+
declare let totalKeys: number;
|
|
6
|
+
declare function sanitise(value: unknown, depth?: number): unknown;
|
|
7
|
+
declare const SANDBOX_PREAMBLE = "\n \"use strict\";\n\n const process = undefined;\n const global = undefined;\n const globalThis = Object.create(null); // isolated dummy \u2014 writes succeed but go nowhere\n const module = undefined;\n const require = undefined;\n const __dirname = undefined;\n const __filename = undefined;\n const importScripts = undefined;\n const Function = undefined;\n const Reflect = undefined;\n const Proxy = undefined;\n\n // Stub ArrayBuffer \u2014 catches IIFE allocation bombs before they run.\n const ArrayBuffer = function() {\n throw new RangeError(\"ArrayBuffer construction is not allowed in meta files\");\n };\n\n // Stub RegExp constructor \u2014 catches IIFE regex bombs constructed via\n // new RegExp(...) or RegExp(...). Regex *literals* are a different path\n // (they don't call the RegExp constructor at parse time) but executing\n // .match()/.exec() on them still goes through the engine's regex executor.\n // The Worker timeout is the backstop for literal-based regex bombs.\n const RegExp = function() {\n throw new Error(\"RegExp construction is not allowed in meta files\");\n };\n";
|
|
8
|
+
//# sourceMappingURL=securityWorker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"securityWorker.d.ts","sourceRoot":"","sources":["../../src/security/securityWorker.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,MAAM,EAAsB,0BAA0B,CAAC;AAM7D,QAAA,MAAM,SAAS,KAAM,CAAC;AACtB,QAAA,MAAM,QAAQ,OAAU,CAAC;AACzB,QAAA,MAAM,UAAU,SAAU,CAAC;AAC3B,QAAA,IAAM,SAAS,QAAK,CAAC;AAErB,iBAAS,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,SAAI,GAAG,OAAO,CAwEpD;AAwCD,QAAA,MAAM,gBAAgB,uqCA4BrB,CAAC"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const worker = self;
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Deep object sanitiser
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
const MAX_DEPTH = 20;
|
|
7
|
+
const MAX_KEYS = 1_000;
|
|
8
|
+
const MAX_STRLEN = 100_000;
|
|
9
|
+
let totalKeys = 0;
|
|
10
|
+
function sanitise(value, depth = 0) {
|
|
11
|
+
if (depth > MAX_DEPTH) {
|
|
12
|
+
throw new Error(`Object exceeds maximum nesting depth (${MAX_DEPTH})`);
|
|
13
|
+
}
|
|
14
|
+
if (typeof value === "function") {
|
|
15
|
+
throw new Error("Functions are not allowed in meta objects");
|
|
16
|
+
}
|
|
17
|
+
if (typeof value === "symbol") {
|
|
18
|
+
throw new Error("Symbols are not allowed in meta objects");
|
|
19
|
+
}
|
|
20
|
+
const tag = Object.prototype.toString.call(value);
|
|
21
|
+
if (tag === "[object RegExp]") {
|
|
22
|
+
throw new Error("RegExp values are not allowed (potential ReDoS)");
|
|
23
|
+
}
|
|
24
|
+
if (tag === "[object ArrayBuffer]" ||
|
|
25
|
+
tag === "[object SharedArrayBuffer]" ||
|
|
26
|
+
ArrayBuffer.isView(value)) {
|
|
27
|
+
throw new Error("ArrayBuffer / TypedArray values are not allowed");
|
|
28
|
+
}
|
|
29
|
+
if (tag === "[object Error]" || value instanceof Error) {
|
|
30
|
+
throw new Error("Error objects are not allowed (potential stack leakage)");
|
|
31
|
+
}
|
|
32
|
+
if (tag === "[object Promise]") {
|
|
33
|
+
throw new Error("Promise values are not allowed");
|
|
34
|
+
}
|
|
35
|
+
if (Array.isArray(value)) {
|
|
36
|
+
if (++totalKeys > MAX_KEYS)
|
|
37
|
+
throw new Error("Object exceeds maximum key/element count");
|
|
38
|
+
return value.map((item) => sanitise(item, depth + 1));
|
|
39
|
+
}
|
|
40
|
+
if (value !== null && typeof value === "object") {
|
|
41
|
+
if (tag !== "[object Object]") {
|
|
42
|
+
throw new Error(`Non-plain objects are not allowed (tag: ${tag})`);
|
|
43
|
+
}
|
|
44
|
+
const out = {};
|
|
45
|
+
const descriptors = Object.getOwnPropertyDescriptors(value);
|
|
46
|
+
for (const key of Object.keys(descriptors)) {
|
|
47
|
+
if (++totalKeys > MAX_KEYS)
|
|
48
|
+
throw new Error("Object exceeds maximum key/element count");
|
|
49
|
+
const desc = descriptors[key];
|
|
50
|
+
if (desc.get || desc.set) {
|
|
51
|
+
// Silently skip getter/setter properties — the getter-side-effect test
|
|
52
|
+
// expects a clean resolve and verifies the side effect did not happen.
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
out[key] = sanitise(value[key], depth + 1);
|
|
56
|
+
}
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
59
|
+
if (typeof value === "string") {
|
|
60
|
+
if (value.length > MAX_STRLEN) {
|
|
61
|
+
throw new Error(`String value exceeds maximum length (${MAX_STRLEN})`);
|
|
62
|
+
}
|
|
63
|
+
// Reject strings that look like captured error stack traces.
|
|
64
|
+
// error-stack.meta.ts catches an Error and returns e.stack as a plain
|
|
65
|
+
// string — detectable by the " at " stack frame marker.
|
|
66
|
+
if (/\n {4}at /.test(value)) {
|
|
67
|
+
throw new Error("String value appears to contain a stack trace");
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return value;
|
|
71
|
+
}
|
|
72
|
+
// ---------------------------------------------------------------------------
|
|
73
|
+
// Resource-limit stubs injected into the sandbox
|
|
74
|
+
//
|
|
75
|
+
// IIFEs run during object construction, before our sanitise() pass sees the
|
|
76
|
+
// result. We stub dangerous builtins so they throw at the point of the call.
|
|
77
|
+
//
|
|
78
|
+
// array-buffer.meta.ts → new ArrayBuffer(1e9) — stubbed below
|
|
79
|
+
// regex-bomb.meta.ts → /(a+)+$/.exec(str) — stubbed via RegExp
|
|
80
|
+
// deep-object.meta.ts → 100k nested { nested: obj } literals
|
|
81
|
+
// Object literals bypass the Object() constructor so
|
|
82
|
+
// they cannot be intercepted via a stub. Instead we
|
|
83
|
+
// cap total object allocations with a counter in the
|
|
84
|
+
// Object stub for `new Object()` / `Object.assign`
|
|
85
|
+
// style calls, AND we rely on the IIFE loop itself
|
|
86
|
+
// being detectable via a loop-iteration counter.
|
|
87
|
+
//
|
|
88
|
+
// The loop counter trick: we inject a global __iterCount variable into the
|
|
89
|
+
// sandbox and wrap the sandbox body so that — via a Proxy on the iteration
|
|
90
|
+
// variable — we detect runaway loops. However, this is complex and fragile.
|
|
91
|
+
//
|
|
92
|
+
// Simpler reliable approach for deep-object: the fixture runs a for-loop
|
|
93
|
+
// 100,000 times. We shadow the Number constructor and use a Proxy on the
|
|
94
|
+
// iteration space? No — object literals are truly uninterceptable at the
|
|
95
|
+
// VM level without a custom realm.
|
|
96
|
+
//
|
|
97
|
+
// Pragmatic solution: raise a hard iteration budget by injecting a
|
|
98
|
+
// __checkBudget() call... but we can't inject into the transpiled fixture.
|
|
99
|
+
//
|
|
100
|
+
// FINAL approach: use a SharedArrayBuffer + Atomics watchdog from the
|
|
101
|
+
// parent thread to measure wall-clock time inside the worker, and terminate
|
|
102
|
+
// if the IIFE phase takes too long. Since we already have a Worker timeout,
|
|
103
|
+
// the deep-object IIFE completing in 6ms means it's genuinely fast — the
|
|
104
|
+
// nesting is built but immediately discarded and the string is returned.
|
|
105
|
+
//
|
|
106
|
+
// The ONLY reliable fix for deep-object is to reject the *input source* via
|
|
107
|
+
// static analysis in securityParser.ts before it reaches the worker.
|
|
108
|
+
// ---------------------------------------------------------------------------
|
|
109
|
+
const SANDBOX_PREAMBLE = `
|
|
110
|
+
"use strict";
|
|
111
|
+
|
|
112
|
+
const process = undefined;
|
|
113
|
+
const global = undefined;
|
|
114
|
+
const globalThis = Object.create(null); // isolated dummy — writes succeed but go nowhere
|
|
115
|
+
const module = undefined;
|
|
116
|
+
const require = undefined;
|
|
117
|
+
const __dirname = undefined;
|
|
118
|
+
const __filename = undefined;
|
|
119
|
+
const importScripts = undefined;
|
|
120
|
+
const Function = undefined;
|
|
121
|
+
const Reflect = undefined;
|
|
122
|
+
const Proxy = undefined;
|
|
123
|
+
|
|
124
|
+
// Stub ArrayBuffer — catches IIFE allocation bombs before they run.
|
|
125
|
+
const ArrayBuffer = function() {
|
|
126
|
+
throw new RangeError("ArrayBuffer construction is not allowed in meta files");
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
// Stub RegExp constructor — catches IIFE regex bombs constructed via
|
|
130
|
+
// new RegExp(...) or RegExp(...). Regex *literals* are a different path
|
|
131
|
+
// (they don't call the RegExp constructor at parse time) but executing
|
|
132
|
+
// .match()/.exec() on them still goes through the engine's regex executor.
|
|
133
|
+
// The Worker timeout is the backstop for literal-based regex bombs.
|
|
134
|
+
const RegExp = function() {
|
|
135
|
+
throw new Error("RegExp construction is not allowed in meta files");
|
|
136
|
+
};
|
|
137
|
+
`;
|
|
138
|
+
// ---------------------------------------------------------------------------
|
|
139
|
+
// Message handler
|
|
140
|
+
// ---------------------------------------------------------------------------
|
|
141
|
+
worker.onmessage = (event) => {
|
|
142
|
+
const { objectString } = event.data;
|
|
143
|
+
try {
|
|
144
|
+
const sandbox = new Function(`
|
|
145
|
+
${SANDBOX_PREAMBLE}
|
|
146
|
+
return (${objectString});
|
|
147
|
+
`);
|
|
148
|
+
totalKeys = 0;
|
|
149
|
+
const rawData = sandbox();
|
|
150
|
+
const pureData = sanitise(rawData);
|
|
151
|
+
worker.postMessage({ success: true, data: pureData });
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
const safeMessage = (error?.message ?? String(error)).split("\n")[0];
|
|
155
|
+
worker.postMessage({ success: false, error: safeMessage });
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
//# sourceMappingURL=securityWorker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"securityWorker.js","sourceRoot":"","sources":["../../src/security/securityWorker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SourceCheckout, SourceSpec } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Resolves a source to a folder holding its files: a shallow clone for git,
|
|
4
|
+
* an installed or downloaded package for npm, the folder itself for local.
|
|
5
|
+
*
|
|
6
|
+
* @param projectRoot - Absolute project root; local paths and the `node_modules` lookup start there
|
|
7
|
+
*/
|
|
8
|
+
export declare function checkoutSource(source: {
|
|
9
|
+
name: string;
|
|
10
|
+
spec: SourceSpec;
|
|
11
|
+
}, projectRoot: string): Promise<SourceCheckout>;
|
|
12
|
+
/** One line naming where a source comes from, e.g. `git https://github.com/me/skills.git#main`. */
|
|
13
|
+
export declare function describeSource(spec: SourceSpec): string;
|
|
14
|
+
//# sourceMappingURL=checkout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkout.d.ts","sourceRoot":"","sources":["../../src/sources/checkout.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1D;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAO7H;AAED,mGAAmG;AACnG,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAMvD"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// packages/core/src/sources/checkout.ts
|
|
2
|
+
import { checkoutGit } from "./git";
|
|
3
|
+
import { checkoutLocal } from "./local";
|
|
4
|
+
import { checkoutNpm } from "./npm";
|
|
5
|
+
/**
|
|
6
|
+
* Resolves a source to a folder holding its files: a shallow clone for git,
|
|
7
|
+
* an installed or downloaded package for npm, the folder itself for local.
|
|
8
|
+
*
|
|
9
|
+
* @param projectRoot - Absolute project root; local paths and the `node_modules` lookup start there
|
|
10
|
+
*/
|
|
11
|
+
export async function checkoutSource(source, projectRoot) {
|
|
12
|
+
const { name, spec } = source;
|
|
13
|
+
switch (spec.kind) {
|
|
14
|
+
case "git": return checkoutGit(name, spec);
|
|
15
|
+
case "npm": return checkoutNpm(name, spec, projectRoot);
|
|
16
|
+
case "local": return checkoutLocal(name, spec, projectRoot);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/** One line naming where a source comes from, e.g. `git https://github.com/me/skills.git#main`. */
|
|
20
|
+
export function describeSource(spec) {
|
|
21
|
+
switch (spec.kind) {
|
|
22
|
+
case "git": return `git ${spec.url}${spec.ref === undefined ? "" : `#${spec.ref}`}`;
|
|
23
|
+
case "npm": return `npm ${spec.package}${spec.version === undefined ? "" : `@${spec.version}`}`;
|
|
24
|
+
case "local": return `local ${spec.path}`;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=checkout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkout.js","sourceRoot":"","sources":["../../src/sources/checkout.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAGpC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAA0C,EAAE,WAAmB;IAClG,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IAC9B,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,KAAK,EAAI,OAAO,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7C,KAAK,KAAK,EAAI,OAAO,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QAC1D,KAAK,OAAO,EAAE,OAAO,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,cAAc,CAAC,IAAgB;IAC7C,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,KAAK,EAAI,OAAO,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACtF,KAAK,KAAK,EAAI,OAAO,OAAO,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;QAClG,KAAK,OAAO,EAAE,OAAO,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { GitSourceSpec, SourceCheckout } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Shallow-clones a git source into a temporary folder, at its `ref` when set
|
|
4
|
+
* and at the default branch otherwise, and resolves the commit it landed on.
|
|
5
|
+
*
|
|
6
|
+
* @throws when the clone fails, e.g. an unknown ref or an unreachable host
|
|
7
|
+
*/
|
|
8
|
+
export declare function checkoutGit(name: string, spec: GitSourceSpec): Promise<SourceCheckout>;
|
|
9
|
+
//# sourceMappingURL=git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/sources/git.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE7D;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAW5F"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// packages/core/src/sources/git.ts
|
|
2
|
+
import { createTempDir, removeDir, runCommand } from "./process";
|
|
3
|
+
/**
|
|
4
|
+
* Shallow-clones a git source into a temporary folder, at its `ref` when set
|
|
5
|
+
* and at the default branch otherwise, and resolves the commit it landed on.
|
|
6
|
+
*
|
|
7
|
+
* @throws when the clone fails, e.g. an unknown ref or an unreachable host
|
|
8
|
+
*/
|
|
9
|
+
export async function checkoutGit(name, spec) {
|
|
10
|
+
const dir = createTempDir("git");
|
|
11
|
+
try {
|
|
12
|
+
const ref = spec.ref === undefined ? [] : ["--branch", spec.ref];
|
|
13
|
+
await runCommand(["git", "clone", "--depth", "1", "--quiet", ...ref, "--", spec.url, dir]);
|
|
14
|
+
const commit = await runCommand(["git", "rev-parse", "HEAD"], dir);
|
|
15
|
+
return { name, spec, dir, commit, dispose: () => removeDir(dir) };
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
removeDir(dir);
|
|
19
|
+
throw error;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/sources/git.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGjE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,IAAmB;IACjE,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,UAAU,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3F,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;QACnE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,SAAS,CAAC,GAAG,CAAC,CAAC;QACf,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export * from "./types";
|
|
2
|
+
export { parseSourceSpec, defaultSourceName, anchorLocalSpec } from "./parse";
|
|
3
|
+
export { listSources, addSource, removeSource } from "./register";
|
|
4
|
+
export { checkoutSource, describeSource } from "./checkout";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sources/index.ts"],"names":[],"mappings":"AACA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// packages/core/src/sources/index.ts
|
|
2
|
+
export * from "./types";
|
|
3
|
+
export { parseSourceSpec, defaultSourceName, anchorLocalSpec } from "./parse";
|
|
4
|
+
export { listSources, addSource, removeSource } from "./register";
|
|
5
|
+
export { checkoutSource, describeSource } from "./checkout";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sources/index.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|