@g3nomaly/core 0.1.6 → 0.2.0
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/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/ls.d.ts +5 -0
- package/dist/cli/commands/ls.d.ts.map +1 -0
- package/dist/cli/commands/ls.js +22 -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/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 +10 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +10 -0
- package/dist/cli/index.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 +7 -10
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +17 -27
- package/dist/config/config.js.map +1 -1
- package/dist/config/index.d.ts +3 -3
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +2 -2
- package/dist/config/index.js.map +1 -1
- package/dist/config/types.d.ts +35 -36
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +14 -17
- package/dist/config/types.js.map +1 -1
- 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/index.d.ts +6 -0
- package/dist/installer/index.d.ts.map +1 -0
- package/dist/installer/index.js +7 -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/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/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/registry.selectors.d.ts +11 -0
- package/dist/registry/registry.selectors.d.ts.map +1 -1
- package/dist/registry/registry.selectors.js +24 -0
- package/dist/registry/registry.selectors.js.map +1 -1
- package/dist/registry/types.d.ts +2 -0
- package/dist/registry/types.d.ts.map +1 -1
- package/dist/registry/types.js +5 -0
- package/dist/registry/types.js.map +1 -1
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -1
- 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/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/package.json +12 -2
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { BaseFileEntry } from "../registry/types";
|
|
2
|
+
import type { ApplyOptions, ApplyResult, FileClassification, FileSource, InstallerIO } from "./types";
|
|
3
|
+
/** Local default: copy each file from the package source tree at its relative path. */
|
|
4
|
+
export declare function copySource<F extends BaseFileEntry>(resolveSourcePath: (relPath: string) => string): FileSource<F>;
|
|
5
|
+
/**
|
|
6
|
+
* Writes the files an install/update decision allows and reports what
|
|
7
|
+
* happened per file. `SafeUpdate` files are always written; `UserOnly` and
|
|
8
|
+
* `Conflict` files only when `decision` is Overwrite or `force` is set.
|
|
9
|
+
* `files` in the result mirrors the on-disk state afterwards so the caller
|
|
10
|
+
* can register it in the user manifest.
|
|
11
|
+
*/
|
|
12
|
+
export declare function applyClassifications<F extends BaseFileEntry>(classifications: readonly FileClassification<F>[], source: FileSource<F>, opts: ApplyOptions, io: InstallerIO): Promise<ApplyResult<F>>;
|
|
13
|
+
//# sourceMappingURL=install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/installer/install.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEtD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAErG,uFAAuF;AACvF,wBAAgB,UAAU,CAAC,CAAC,SAAS,aAAa,EAAE,iBAAiB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAEjH;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,CAAC,SAAS,aAAa,EAChE,eAAe,EAAE,SAAS,kBAAkB,CAAC,CAAC,CAAC,EAAE,EACjD,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,EACrB,IAAI,EAAE,YAAY,EAClB,EAAE,EAAE,WAAW,GACd,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CA2CzB"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// packages/core/src/installer/install.ts
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { ConflictDecision, FileState } from "./types";
|
|
4
|
+
/** Local default: copy each file from the package source tree at its relative path. */
|
|
5
|
+
export function copySource(resolveSourcePath) {
|
|
6
|
+
return (file) => ({ kind: "copy", sourcePath: resolveSourcePath(file.path) });
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Writes the files an install/update decision allows and reports what
|
|
10
|
+
* happened per file. `SafeUpdate` files are always written; `UserOnly` and
|
|
11
|
+
* `Conflict` files only when `decision` is Overwrite or `force` is set.
|
|
12
|
+
* `files` in the result mirrors the on-disk state afterwards so the caller
|
|
13
|
+
* can register it in the user manifest.
|
|
14
|
+
*/
|
|
15
|
+
export async function applyClassifications(classifications, source, opts, io) {
|
|
16
|
+
const result = { written: [], kept: [], missingSource: [], files: [] };
|
|
17
|
+
const overwrite = opts.force === true || opts.decision === ConflictDecision.Overwrite;
|
|
18
|
+
const write = async (cl) => {
|
|
19
|
+
const content = await source(cl.file);
|
|
20
|
+
if (content === null) {
|
|
21
|
+
result.missingSource.push(cl.file.path);
|
|
22
|
+
if (cl.exists)
|
|
23
|
+
result.files.push({ ...cl.file, hash: cl.currentHash ?? undefined });
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (opts.dryRun === true) {
|
|
27
|
+
result.files.push({ ...cl.file, hash: cl.latestHash });
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
io.ensureDir(path.dirname(cl.destPath));
|
|
31
|
+
if (content.kind === "copy")
|
|
32
|
+
io.copyFile(content.sourcePath, cl.destPath);
|
|
33
|
+
else
|
|
34
|
+
io.writeFile(cl.destPath, content.content);
|
|
35
|
+
result.files.push({ ...cl.file, hash: await io.hashFile(cl.destPath) });
|
|
36
|
+
}
|
|
37
|
+
result.written.push(cl.file.path);
|
|
38
|
+
};
|
|
39
|
+
for (const cl of classifications) {
|
|
40
|
+
switch (cl.state) {
|
|
41
|
+
case FileState.UpToDate:
|
|
42
|
+
result.files.push({ ...cl.file, hash: cl.currentHash ?? cl.latestHash });
|
|
43
|
+
break;
|
|
44
|
+
case FileState.SafeUpdate:
|
|
45
|
+
await write(cl);
|
|
46
|
+
break;
|
|
47
|
+
case FileState.UserOnly:
|
|
48
|
+
case FileState.Conflict:
|
|
49
|
+
if (overwrite) {
|
|
50
|
+
await write(cl);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
result.kept.push(cl.file.path);
|
|
54
|
+
result.files.push({ ...cl.file, hash: cl.currentHash ?? undefined });
|
|
55
|
+
}
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/installer/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../../src/installer/io.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,SAAS,GAAE,OAAO,CAAC,WAAW,CAAM,GAAG,WAAW,CAYnF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// packages/core/src/installer/io.ts
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import { hashFile } from "../hash/hash";
|
|
4
|
+
/** Real-filesystem `InstallerIO`; any field can be overridden for tests. */
|
|
5
|
+
export function createInstallerIO(overrides = {}) {
|
|
6
|
+
return {
|
|
7
|
+
exists: (path) => fs.existsSync(path),
|
|
8
|
+
ensureDir: (dir) => { fs.mkdirSync(dir, { recursive: true }); },
|
|
9
|
+
copyFile: (src, dest) => { fs.copyFileSync(src, dest); },
|
|
10
|
+
writeFile: (dest, content) => { fs.writeFileSync(dest, content, "utf8"); },
|
|
11
|
+
removeFile: (path) => { fs.rmSync(path); },
|
|
12
|
+
listDir: (dir) => fs.readdirSync(dir),
|
|
13
|
+
removeDir: (dir) => { fs.rmSync(dir, { recursive: true }); },
|
|
14
|
+
hashFile,
|
|
15
|
+
...overrides,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=io.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"io.js","sourceRoot":"","sources":["../../src/installer/io.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAGvC,4EAA4E;AAC5E,MAAM,UAAU,iBAAiB,CAAC,SAAS,GAAyB,EAAE;IACpE,OAAO;QACL,MAAM,EAAM,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QACzC,SAAS,EAAG,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA,CAAC,CAAC;QAC/D,QAAQ,EAAI,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA,CAAC,CAAC;QACzD,SAAS,EAAG,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA,CAAC,CAAC;QAC1E,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA,CAAC,CAAC;QACzC,OAAO,EAAK,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC;QACxC,SAAS,EAAG,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA,CAAC,CAAC;QAC5D,QAAQ;QACR,GAAG,SAAS;KACb,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { BaseFileEntry } from "../registry/types";
|
|
2
|
+
import type { InstallerIO, RemoveResult } from "./types";
|
|
3
|
+
/**
|
|
4
|
+
* Removes a manifest entry's files from `installDir`. A file whose on-disk
|
|
5
|
+
* hash differs from the hash recorded at install time is kept unless `force`
|
|
6
|
+
* is set. Directories left empty by the removals are pruned up to
|
|
7
|
+
* `installDir`.
|
|
8
|
+
*/
|
|
9
|
+
export declare function removeInstalledFiles(files: readonly BaseFileEntry[], installDir: string, opts: {
|
|
10
|
+
force?: boolean;
|
|
11
|
+
}, io: InstallerIO): Promise<RemoveResult>;
|
|
12
|
+
/** Removes `dir` and its parents while they exist and are empty, stopping at `stopAt`. */
|
|
13
|
+
export declare function pruneEmptyDirs(dir: string, stopAt: string, io: InstallerIO): void;
|
|
14
|
+
//# sourceMappingURL=remove.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../src/installer/remove.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAExD;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,SAAS,aAAa,EAAE,EAC/B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,EACzB,EAAE,EAAE,WAAW,GACd,OAAO,CAAC,YAAY,CAAC,CAsBvB;AAED,0FAA0F;AAC1F,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,GAAG,IAAI,CAMjF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// packages/core/src/installer/remove.ts
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Removes a manifest entry's files from `installDir`. A file whose on-disk
|
|
5
|
+
* hash differs from the hash recorded at install time is kept unless `force`
|
|
6
|
+
* is set. Directories left empty by the removals are pruned up to
|
|
7
|
+
* `installDir`.
|
|
8
|
+
*/
|
|
9
|
+
export async function removeInstalledFiles(files, installDir, opts, io) {
|
|
10
|
+
const result = { removed: [], kept: [], missing: [] };
|
|
11
|
+
for (const file of files) {
|
|
12
|
+
const destPath = path.join(installDir, file.path);
|
|
13
|
+
if (!io.exists(destPath)) {
|
|
14
|
+
result.missing.push(file.path);
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
if (file.hash && opts.force !== true && (await io.hashFile(destPath)) !== file.hash) {
|
|
18
|
+
result.kept.push(file.path);
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
io.removeFile(destPath);
|
|
22
|
+
result.removed.push(file.path);
|
|
23
|
+
}
|
|
24
|
+
for (const relPath of result.removed) {
|
|
25
|
+
pruneEmptyDirs(path.dirname(path.join(installDir, relPath)), installDir, io);
|
|
26
|
+
}
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
/** Removes `dir` and its parents while they exist and are empty, stopping at `stopAt`. */
|
|
30
|
+
export function pruneEmptyDirs(dir, stopAt, io) {
|
|
31
|
+
let current = dir;
|
|
32
|
+
while (current !== stopAt && io.exists(current) && io.listDir(current).length === 0) {
|
|
33
|
+
io.removeDir(current);
|
|
34
|
+
current = path.dirname(current);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=remove.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/installer/remove.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAA;AAI5B;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAA+B,EAC/B,UAAkB,EAClB,IAAyB,EACzB,EAAe;IAEf,MAAM,MAAM,GAAiB,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;IAEnE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;QACjD,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC9B,SAAQ;QACV,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YACpF,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC3B,SAAQ;QACV,CAAC;QACD,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;QACvB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAChC,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACrC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,CAAA;IAC9E,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,MAAc,EAAE,EAAe;IACzE,IAAI,OAAO,GAAG,GAAG,CAAA;IACjB,OAAO,OAAO,KAAK,MAAM,IAAI,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpF,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QACrB,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IACjC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { BaseFileEntry } from "../registry/types";
|
|
2
|
+
/**
|
|
3
|
+
* How one installed file relates to its package version. Ordered by
|
|
4
|
+
* severity: everything >= UserOnly carries local changes.
|
|
5
|
+
* (Const-object enum — the `enum` keyword is barred by `erasableSyntaxOnly`.)
|
|
6
|
+
*/
|
|
7
|
+
export declare const FileState: {
|
|
8
|
+
/** On disk and identical to the package file */
|
|
9
|
+
readonly UpToDate: 0;
|
|
10
|
+
/** Missing, or unmodified while the package file changed; writable without data loss */
|
|
11
|
+
readonly SafeUpdate: 1;
|
|
12
|
+
/** Modified locally while the package file is unchanged */
|
|
13
|
+
readonly UserOnly: 2;
|
|
14
|
+
/** Modified locally and the package file changed too */
|
|
15
|
+
readonly Conflict: 3;
|
|
16
|
+
};
|
|
17
|
+
export type FileState = (typeof FileState)[keyof typeof FileState];
|
|
18
|
+
/** What to do with `UserOnly` and `Conflict` files when applying. */
|
|
19
|
+
export declare const ConflictDecision: {
|
|
20
|
+
readonly Keep: 0;
|
|
21
|
+
readonly Overwrite: 1;
|
|
22
|
+
};
|
|
23
|
+
export type ConflictDecision = (typeof ConflictDecision)[keyof typeof ConflictDecision];
|
|
24
|
+
/** Classification of one file, produced by `classifyFiles` and consumed by `applyClassifications`. */
|
|
25
|
+
export interface FileClassification<F extends BaseFileEntry = BaseFileEntry> {
|
|
26
|
+
file: F;
|
|
27
|
+
destPath: string;
|
|
28
|
+
state: FileState;
|
|
29
|
+
exists: boolean;
|
|
30
|
+
/** Hash of the file currently on disk, null when it does not exist */
|
|
31
|
+
currentHash: string | null;
|
|
32
|
+
/** Hash recorded in the user manifest at install time, undefined when never installed */
|
|
33
|
+
recordedHash: string | undefined;
|
|
34
|
+
/** Hash of the package's current version of the file */
|
|
35
|
+
latestHash: string;
|
|
36
|
+
}
|
|
37
|
+
/** Where a file's content comes from when it is written. `null` skips the file. */
|
|
38
|
+
export type FileContent = {
|
|
39
|
+
kind: "copy";
|
|
40
|
+
sourcePath: string;
|
|
41
|
+
} | {
|
|
42
|
+
kind: "write";
|
|
43
|
+
content: string;
|
|
44
|
+
} | null;
|
|
45
|
+
export type FileSource<F extends BaseFileEntry = BaseFileEntry> = (file: F) => FileContent | Promise<FileContent>;
|
|
46
|
+
/**
|
|
47
|
+
* Filesystem boundary for the installer. `createInstallerIO` supplies the
|
|
48
|
+
* real implementation; tests inject stubs per field.
|
|
49
|
+
*/
|
|
50
|
+
export interface InstallerIO {
|
|
51
|
+
exists: (path: string) => boolean;
|
|
52
|
+
ensureDir: (dir: string) => void;
|
|
53
|
+
copyFile: (src: string, dest: string) => void;
|
|
54
|
+
writeFile: (dest: string, content: string) => void;
|
|
55
|
+
removeFile: (path: string) => void;
|
|
56
|
+
listDir: (dir: string) => string[];
|
|
57
|
+
removeDir: (dir: string) => void;
|
|
58
|
+
hashFile: (path: string) => Promise<string>;
|
|
59
|
+
}
|
|
60
|
+
export interface ApplyOptions {
|
|
61
|
+
decision: ConflictDecision;
|
|
62
|
+
force?: boolean;
|
|
63
|
+
dryRun?: boolean;
|
|
64
|
+
}
|
|
65
|
+
export interface ApplyResult<F extends BaseFileEntry = BaseFileEntry> {
|
|
66
|
+
/** Relative paths written (or that would be written under dryRun) */
|
|
67
|
+
written: string[];
|
|
68
|
+
/** Relative paths with local changes that were left alone */
|
|
69
|
+
kept: string[];
|
|
70
|
+
/** Relative paths whose source produced no content */
|
|
71
|
+
missingSource: string[];
|
|
72
|
+
/** Manifest entries reflecting the on-disk state after the apply */
|
|
73
|
+
files: F[];
|
|
74
|
+
}
|
|
75
|
+
export interface RemoveResult {
|
|
76
|
+
removed: string[];
|
|
77
|
+
kept: string[];
|
|
78
|
+
missing: string[];
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/installer/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How one installed file relates to its package version. Ordered by
|
|
3
|
+
* severity: everything >= UserOnly carries local changes.
|
|
4
|
+
* (Const-object enum — the `enum` keyword is barred by `erasableSyntaxOnly`.)
|
|
5
|
+
*/
|
|
6
|
+
export const FileState = {
|
|
7
|
+
/** On disk and identical to the package file */
|
|
8
|
+
UpToDate: 0,
|
|
9
|
+
/** Missing, or unmodified while the package file changed; writable without data loss */
|
|
10
|
+
SafeUpdate: 1,
|
|
11
|
+
/** Modified locally while the package file is unchanged */
|
|
12
|
+
UserOnly: 2,
|
|
13
|
+
/** Modified locally and the package file changed too */
|
|
14
|
+
Conflict: 3,
|
|
15
|
+
};
|
|
16
|
+
/** What to do with `UserOnly` and `Conflict` files when applying. */
|
|
17
|
+
export const ConflictDecision = {
|
|
18
|
+
Keep: 0,
|
|
19
|
+
Overwrite: 1,
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/installer/types.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,gDAAgD;IAChD,QAAQ,EAAI,CAAC;IACb,wFAAwF;IACxF,UAAU,EAAE,CAAC;IACb,2DAA2D;IAC3D,QAAQ,EAAI,CAAC;IACb,wDAAwD;IACxD,QAAQ,EAAI,CAAC;CACL,CAAA;AAGV,qEAAqE;AACrE,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAO,CAAC;IACZ,SAAS,EAAE,CAAC;CACJ,CAAA"}
|
|
@@ -24,4 +24,15 @@ export declare function getByVersion<T extends BaseRegistryEntry>(registry: Regi
|
|
|
24
24
|
* Return the count of registered entries.
|
|
25
25
|
*/
|
|
26
26
|
export declare function size<T extends BaseRegistryEntry>(registry: RegistryStore<T>): number;
|
|
27
|
+
/**
|
|
28
|
+
* Depth-first walk of `registryDependencies` starting at `key`. Every entry
|
|
29
|
+
* reached is added to `seen`; keys without a registry entry are pushed to
|
|
30
|
+
* `unknown` and not walked further.
|
|
31
|
+
*/
|
|
32
|
+
export declare function collectDependencies(key: string, entries: BaseRegistry, seen: Set<string>, unknown: string[]): void;
|
|
33
|
+
/**
|
|
34
|
+
* Return which of `candidates` have `key` in their `registryDependencies` —
|
|
35
|
+
* the entries that need it and would break if it were removed.
|
|
36
|
+
*/
|
|
37
|
+
export declare function entryDependencies(key: string, entries: BaseRegistry, candidates: string[]): string[];
|
|
27
38
|
//# sourceMappingURL=registry.selectors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.selectors.d.ts","sourceRoot":"","sources":["../../src/registry/registry.selectors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"registry.selectors.d.ts","sourceRoot":"","sources":["../../src/registry/registry.selectors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAErD;;GAEG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,iBAAiB,EAC7C,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAC1B,GAAG,EAAE,MAAM,GACV,CAAC,GAAG,SAAS,CAEf;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,iBAAiB,EAC7C,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAC1B,GAAG,EAAE,MAAM,GACV,OAAO,CAET;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,CAAC,SAAS,iBAAiB,EACjD,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,GACzB,YAAY,CAAC,CAAC,CAAC,CAEjB;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,iBAAiB,EAC9C,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,GACzB,MAAM,EAAE,CAEV;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,iBAAiB,EACtD,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAC1B,OAAO,EAAE,MAAM,GACd,YAAY,CAAC,CAAC,CAAC,CAIjB;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,iBAAiB,EAC9C,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,GACzB,MAAM,CAER;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,YAAY,EACrB,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EACjB,OAAO,EAAE,MAAM,EAAE,GAChB,IAAI,CASN;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,YAAY,EACrB,UAAU,EAAE,MAAM,EAAE,GACnB,MAAM,EAAE,CAEV"}
|
|
@@ -34,4 +34,28 @@ export function getByVersion(registry, version) {
|
|
|
34
34
|
export function size(registry) {
|
|
35
35
|
return Object.keys(registry.store.state).length;
|
|
36
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Depth-first walk of `registryDependencies` starting at `key`. Every entry
|
|
39
|
+
* reached is added to `seen`; keys without a registry entry are pushed to
|
|
40
|
+
* `unknown` and not walked further.
|
|
41
|
+
*/
|
|
42
|
+
export function collectDependencies(key, entries, seen, unknown) {
|
|
43
|
+
if (seen.has(key))
|
|
44
|
+
return;
|
|
45
|
+
const entry = entries[key];
|
|
46
|
+
if (!entry) {
|
|
47
|
+
unknown.push(key);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
seen.add(key);
|
|
51
|
+
for (const dep of entry.registryDependencies ?? [])
|
|
52
|
+
collectDependencies(dep, entries, seen, unknown);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Return which of `candidates` have `key` in their `registryDependencies` —
|
|
56
|
+
* the entries that need it and would break if it were removed.
|
|
57
|
+
*/
|
|
58
|
+
export function entryDependencies(key, entries, candidates) {
|
|
59
|
+
return candidates.filter((k) => entries[k]?.registryDependencies?.includes(key) ?? false);
|
|
60
|
+
}
|
|
37
61
|
//# sourceMappingURL=registry.selectors.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.selectors.js","sourceRoot":"","sources":["../../src/registry/registry.selectors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"registry.selectors.js","sourceRoot":"","sources":["../../src/registry/registry.selectors.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,UAAU,GAAG,CACjB,QAA0B,EAC1B,GAAW;IAEX,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,GAAG,CACjB,QAA0B,EAC1B,GAAW;IAEX,OAAO,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAA;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CACrB,QAA0B;IAE1B,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAA;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,IAAI,CAClB,QAA0B;IAE1B,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,QAA0B,EAC1B,OAAe;IAEf,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,CACtF,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,IAAI,CAClB,QAA0B;IAE1B,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAA;AACjD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,GAAW,EACX,OAAqB,EACrB,IAAiB,EACjB,OAAiB;IAEjB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAM;IACzB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACjB,OAAM;IACR,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACb,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,oBAAoB,IAAI,EAAE;QAAE,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;AACtG,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAW,EACX,OAAqB,EACrB,UAAoB;IAEpB,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAA;AAC3F,CAAC"}
|
package/dist/registry/types.d.ts
CHANGED
|
@@ -16,6 +16,8 @@ export declare const BaseRegistryEntrySchema: z.ZodObject<{
|
|
|
16
16
|
name: z.ZodString;
|
|
17
17
|
description: z.ZodOptional<z.ZodString>;
|
|
18
18
|
version: z.ZodOptional<z.ZodString>;
|
|
19
|
+
group: z.ZodOptional<z.ZodString>;
|
|
20
|
+
registryDependencies: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
19
21
|
files: z.ZodArray<z.ZodObject<{
|
|
20
22
|
path: z.ZodString;
|
|
21
23
|
type: z.ZodString;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/registry/types.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/registry/types.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// packages/core/src/registry/types.ts
|
|
1
2
|
import { z } from "zod";
|
|
2
3
|
/**
|
|
3
4
|
* Base file entry — extended by each package with their own `type` enum.
|
|
@@ -15,6 +16,10 @@ export const BaseRegistryEntrySchema = z.object({
|
|
|
15
16
|
name: z.string().min(1),
|
|
16
17
|
description: z.string().optional(),
|
|
17
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(),
|
|
18
23
|
files: z.array(BaseFileEntrySchema).min(1),
|
|
19
24
|
});
|
|
20
25
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/registry/types.ts"],"names":[],"mappings":"AAAA,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,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;CAC3C,CAAC,CAAA"}
|
|
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"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
1
|
export { findPackageRoot, findUp, findGitRoot } from "./paths";
|
|
2
2
|
export { warnIfOutdated } from "./version";
|
|
3
|
+
export { guardCancel } from "./prompt";
|
|
4
|
+
export { readPackageMeta } from "./packageMeta";
|
|
5
|
+
export type { PackageMetadata } from "./packageMeta";
|
|
3
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/utils/index.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
// packages/core/src/utils/index.ts
|
|
2
2
|
export { findPackageRoot, findUp, findGitRoot } from "./paths";
|
|
3
3
|
export { warnIfOutdated } from "./version";
|
|
4
|
+
export { guardCancel } from "./prompt";
|
|
5
|
+
export { readPackageMeta } from "./packageMeta";
|
|
4
6
|
//# sourceMappingURL=index.js.map
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/utils/merge.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC,CAUvD"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// packages/core/src/utils/merge.ts
|
|
2
|
+
function isPlainObject(value) {
|
|
3
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Recursively merges `patch` into `base` without mutating either.
|
|
7
|
+
* Plain objects merge key-wise; arrays and primitives replace.
|
|
8
|
+
*/
|
|
9
|
+
export function deepMerge(base, patch) {
|
|
10
|
+
if (!isPlainObject(base) || !isPlainObject(patch)) {
|
|
11
|
+
return (patch === undefined ? base : patch);
|
|
12
|
+
}
|
|
13
|
+
const out = { ...base };
|
|
14
|
+
for (const [key, value] of Object.entries(patch)) {
|
|
15
|
+
if (value === undefined)
|
|
16
|
+
continue;
|
|
17
|
+
out[key] = deepMerge(out[key], value);
|
|
18
|
+
}
|
|
19
|
+
return out;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/utils/merge.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAI,IAAO,EAAE,KAAc;IAClD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAM,CAAC;IACnD,CAAC;IACD,MAAM,GAAG,GAA4B,EAAE,GAAG,IAAI,EAAE,CAAC;IACjD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,GAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface PackageMetadata {
|
|
2
|
+
name: string;
|
|
3
|
+
version: string;
|
|
4
|
+
description: string;
|
|
5
|
+
license: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Live metadata of the package that owns `entryUrl` (pass `import.meta.url`),
|
|
9
|
+
* read from its `package.json` on every call so it never goes stale.
|
|
10
|
+
*/
|
|
11
|
+
export declare function readPackageMeta(entryUrl: string): PackageMetadata;
|
|
12
|
+
//# sourceMappingURL=packageMeta.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packageMeta.d.ts","sourceRoot":"","sources":["../../src/utils/packageMeta.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAS,MAAM,CAAC;IACpB,OAAO,EAAM,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAM,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,CASjE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// packages/core/src/utils/packageMeta.ts
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { findPackageRoot } from "./paths";
|
|
6
|
+
/**
|
|
7
|
+
* Live metadata of the package that owns `entryUrl` (pass `import.meta.url`),
|
|
8
|
+
* read from its `package.json` on every call so it never goes stale.
|
|
9
|
+
*/
|
|
10
|
+
export function readPackageMeta(entryUrl) {
|
|
11
|
+
const root = findPackageRoot(dirname(fileURLToPath(entryUrl)));
|
|
12
|
+
const pkg = JSON.parse(readFileSync(join(root, "package.json"), "utf8"));
|
|
13
|
+
return {
|
|
14
|
+
name: typeof pkg.name === "string" ? pkg.name : "",
|
|
15
|
+
version: typeof pkg.version === "string" ? pkg.version : "0.0.0",
|
|
16
|
+
description: typeof pkg.description === "string" ? pkg.description : "",
|
|
17
|
+
license: typeof pkg.license === "string" ? pkg.license : "",
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=packageMeta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packageMeta.js","sourceRoot":"","sources":["../../src/utils/packageMeta.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAS1C;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAA4B,CAAC;IACpG,OAAO;QACL,IAAI,EAAS,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;QACzD,OAAO,EAAM,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;QACpE,WAAW,EAAE,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;QACvE,OAAO,EAAM,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;KAChE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"AAEA,6FAA6F;AAC7F,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,GAAG,CAAC,CAGpD"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// packages/core/src/utils/prompt.ts
|
|
2
|
+
/** Exits the process when a prompt returned a cancel symbol, otherwise returns its value. */
|
|
3
|
+
export function guardCancel(result) {
|
|
4
|
+
if (typeof result === "symbol")
|
|
5
|
+
process.exit(0);
|
|
6
|
+
return result;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"AAAA,oCAAoC;AAEpC,6FAA6F;AAC7F,MAAM,UAAU,WAAW,CAAI,MAAkB;IAC/C,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC/C,OAAO,MAAW,CAAA;AACpB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@g3nomaly/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Shared runtime for @g3n packages — hashing, registry, security, config",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -25,6 +25,14 @@
|
|
|
25
25
|
"types": "./dist/config/index.d.ts",
|
|
26
26
|
"default": "./dist/config/index.js"
|
|
27
27
|
},
|
|
28
|
+
"./installer": {
|
|
29
|
+
"types": "./dist/installer/index.d.ts",
|
|
30
|
+
"default": "./dist/installer/index.js"
|
|
31
|
+
},
|
|
32
|
+
"./cli": {
|
|
33
|
+
"types": "./dist/cli/index.d.ts",
|
|
34
|
+
"default": "./dist/cli/index.js"
|
|
35
|
+
},
|
|
28
36
|
"./utils": {
|
|
29
37
|
"types": "./dist/utils/index.d.ts",
|
|
30
38
|
"default": "./dist/utils/index.js"
|
|
@@ -35,11 +43,13 @@
|
|
|
35
43
|
"dist"
|
|
36
44
|
],
|
|
37
45
|
"scripts": {
|
|
38
|
-
"build": "tsc --project tsconfig.build.json",
|
|
46
|
+
"build": "rm -rf dist && tsc --project tsconfig.build.json",
|
|
39
47
|
"typecheck": "tsc --noEmit"
|
|
40
48
|
},
|
|
41
49
|
"dependencies": {
|
|
50
|
+
"@clack/prompts": "^1.7.0",
|
|
42
51
|
"@tanstack/store": "^0.11.1",
|
|
52
|
+
"chalk": "^6.0.0",
|
|
43
53
|
"zod": "^4.4.3"
|
|
44
54
|
},
|
|
45
55
|
"devDependencies": {
|