mthds 0.0.6 → 0.0.8
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 +1 -1
- package/README.md +51 -11
- package/dist/agent/commands/build.d.ts +35 -0
- package/dist/agent/commands/build.js +334 -0
- package/dist/agent/commands/build.js.map +1 -0
- package/dist/agent/commands/config.d.ts +6 -0
- package/dist/agent/commands/config.js +50 -0
- package/dist/agent/commands/config.js.map +1 -0
- package/dist/agent/commands/install.d.ts +14 -0
- package/dist/agent/commands/install.js +178 -0
- package/dist/agent/commands/install.js.map +1 -0
- package/dist/agent/commands/pipelex.d.ts +7 -0
- package/dist/agent/commands/pipelex.js +56 -0
- package/dist/agent/commands/pipelex.js.map +1 -0
- package/dist/agent/commands/plxt.d.ts +7 -0
- package/dist/agent/commands/plxt.js +27 -0
- package/dist/agent/commands/plxt.js.map +1 -0
- package/dist/agent/commands/validate.d.ts +15 -0
- package/dist/agent/commands/validate.js +118 -0
- package/dist/agent/commands/validate.js.map +1 -0
- package/dist/agent/output.d.ts +25 -0
- package/dist/agent/output.js +51 -0
- package/dist/agent/output.js.map +1 -0
- package/dist/agent/passthrough.d.ts +5 -0
- package/dist/agent/passthrough.js +19 -0
- package/dist/agent/passthrough.js.map +1 -0
- package/dist/agent-cli.d.ts +8 -0
- package/dist/agent-cli.js +237 -0
- package/dist/agent-cli.js.map +1 -0
- package/dist/cli/commands/build.d.ts +31 -0
- package/dist/cli/commands/build.js +305 -0
- package/dist/cli/commands/build.js.map +1 -0
- package/dist/{commands → cli/commands}/config.js +4 -4
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/{commands → cli/commands}/index.js +20 -18
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/install.js +275 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/package/add.d.ts +6 -0
- package/dist/cli/commands/package/add.js +9 -0
- package/dist/cli/commands/package/add.js.map +1 -0
- package/dist/cli/commands/package/init.d.ts +3 -0
- package/dist/cli/commands/package/init.js +108 -0
- package/dist/cli/commands/package/init.js.map +1 -0
- package/dist/cli/commands/package/install.d.ts +3 -0
- package/dist/cli/commands/package/install.js +97 -0
- package/dist/cli/commands/package/install.js.map +1 -0
- package/dist/cli/commands/package/list.d.ts +3 -0
- package/dist/cli/commands/package/list.js +58 -0
- package/dist/cli/commands/package/list.js.map +1 -0
- package/dist/cli/commands/package/lock.d.ts +3 -0
- package/dist/cli/commands/package/lock.js +37 -0
- package/dist/cli/commands/package/lock.js.map +1 -0
- package/dist/cli/commands/package/update.d.ts +3 -0
- package/dist/cli/commands/package/update.js +35 -0
- package/dist/cli/commands/package/update.js.map +1 -0
- package/dist/cli/commands/package/validate.d.ts +3 -0
- package/dist/cli/commands/package/validate.js +76 -0
- package/dist/cli/commands/package/validate.js.map +1 -0
- package/dist/cli/commands/run.d.ts +12 -0
- package/dist/cli/commands/run.js +95 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +3 -0
- package/dist/cli/commands/setup.js +168 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/utils.d.ts +9 -0
- package/dist/cli/commands/utils.js +34 -0
- package/dist/cli/commands/utils.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +10 -0
- package/dist/cli/commands/validate.js +93 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli.js +276 -99
- package/dist/cli.js.map +1 -1
- package/dist/client/client.js +2 -2
- package/dist/client/client.js.map +1 -1
- package/dist/config/config.d.ts +5 -20
- package/dist/config/config.js +5 -78
- package/dist/config/config.js.map +1 -1
- package/dist/config/credentials.d.ts +25 -0
- package/dist/config/credentials.js +230 -0
- package/dist/config/credentials.js.map +1 -0
- package/dist/installer/agents/registry.d.ts +12 -0
- package/dist/installer/agents/registry.js +78 -0
- package/dist/installer/agents/registry.js.map +1 -0
- package/dist/installer/agents/types.d.ts +16 -0
- package/dist/installer/agents/types.js +6 -0
- package/dist/installer/agents/types.js.map +1 -0
- package/dist/installer/resolver/address.d.ts +2 -0
- package/dist/installer/resolver/address.js.map +1 -0
- package/dist/{resolver → installer/resolver}/github.d.ts +1 -1
- package/dist/{resolver → installer/resolver}/github.js +2 -2
- package/dist/installer/resolver/github.js.map +1 -0
- package/dist/installer/resolver/index.d.ts +6 -0
- package/dist/{resolver → installer/resolver}/index.js +1 -1
- package/dist/installer/resolver/index.js.map +1 -0
- package/dist/{resolver → installer/resolver}/local.d.ts +1 -1
- package/dist/{resolver → installer/resolver}/local.js +2 -2
- package/dist/installer/resolver/local.js.map +1 -0
- package/dist/installer/runtime/check.js.map +1 -0
- package/dist/installer/runtime/installer.js.map +1 -0
- package/dist/installer/runtime/spawn.js.map +1 -0
- package/dist/{telemetry → installer/telemetry}/posthog.d.ts +2 -5
- package/dist/installer/telemetry/posthog.js +55 -0
- package/dist/installer/telemetry/posthog.js.map +1 -0
- package/dist/package/bundle-metadata.d.ts +8 -0
- package/dist/package/bundle-metadata.js +2 -0
- package/dist/package/bundle-metadata.js.map +1 -0
- package/dist/package/bundle-scanner.d.ts +18 -0
- package/dist/package/bundle-scanner.js +77 -0
- package/dist/package/bundle-scanner.js.map +1 -0
- package/dist/package/dependency-resolver.d.ts +32 -0
- package/dist/package/dependency-resolver.js +298 -0
- package/dist/package/dependency-resolver.js.map +1 -0
- package/dist/package/discovery.d.ts +9 -0
- package/dist/package/discovery.js +32 -0
- package/dist/package/discovery.js.map +1 -0
- package/dist/package/exceptions.d.ts +36 -0
- package/dist/package/exceptions.js +73 -0
- package/dist/package/exceptions.js.map +1 -0
- package/dist/package/lock-file.d.ts +27 -0
- package/dist/package/lock-file.js +137 -0
- package/dist/package/lock-file.js.map +1 -0
- package/dist/package/manifest/convert.d.ts +14 -0
- package/dist/package/manifest/convert.js +83 -0
- package/dist/package/manifest/convert.js.map +1 -0
- package/dist/package/manifest/parser.d.ts +9 -0
- package/dist/package/manifest/parser.js +261 -0
- package/dist/package/manifest/parser.js.map +1 -0
- package/dist/package/manifest/schema.d.ts +71 -0
- package/dist/package/manifest/schema.js +73 -0
- package/dist/package/manifest/schema.js.map +1 -0
- package/dist/{resolver → package/manifest}/types.d.ts +2 -5
- package/dist/{resolver → package/manifest}/types.js.map +1 -1
- package/dist/{resolver → package/manifest}/validate.js +25 -20
- package/dist/package/manifest/validate.js.map +1 -0
- package/dist/package/manifest/validation.d.ts +10 -0
- package/dist/package/manifest/validation.js +34 -0
- package/dist/package/manifest/validation.js.map +1 -0
- package/dist/package/package-cache.d.ts +24 -0
- package/dist/package/package-cache.js +92 -0
- package/dist/package/package-cache.js.map +1 -0
- package/dist/package/qualified-ref.d.ts +41 -0
- package/dist/package/qualified-ref.js +105 -0
- package/dist/package/qualified-ref.js.map +1 -0
- package/dist/package/semver.d.ts +33 -0
- package/dist/package/semver.js +77 -0
- package/dist/package/semver.js.map +1 -0
- package/dist/package/vcs-resolver.d.ts +19 -0
- package/dist/package/vcs-resolver.js +115 -0
- package/dist/package/vcs-resolver.js.map +1 -0
- package/dist/package/visibility.d.ts +25 -0
- package/dist/package/visibility.js +132 -0
- package/dist/package/visibility.js.map +1 -0
- package/dist/runners/api-runner.d.ts +3 -0
- package/dist/runners/api-runner.js +9 -1
- package/dist/runners/api-runner.js.map +1 -1
- package/dist/runners/pipelex-runner.d.ts +16 -2
- package/dist/runners/pipelex-runner.js +155 -41
- package/dist/runners/pipelex-runner.js.map +1 -1
- package/dist/runners/registry.d.ts +1 -1
- package/dist/runners/registry.js +5 -4
- package/dist/runners/registry.js.map +1 -1
- package/dist/runners/types.d.ts +17 -10
- package/dist/runners/types.js +6 -1
- package/dist/runners/types.js.map +1 -1
- package/package.json +7 -4
- package/dist/agents/claude-code.d.ts +0 -2
- package/dist/agents/claude-code.js +0 -36
- package/dist/agents/claude-code.js.map +0 -1
- package/dist/agents/cursor.d.ts +0 -2
- package/dist/agents/cursor.js +0 -11
- package/dist/agents/cursor.js.map +0 -1
- package/dist/agents/github-copilot.d.ts +0 -2
- package/dist/agents/github-copilot.js +0 -11
- package/dist/agents/github-copilot.js.map +0 -1
- package/dist/agents/registry.d.ts +0 -4
- package/dist/agents/registry.js +0 -24
- package/dist/agents/registry.js.map +0 -1
- package/dist/agents/types.d.ts +0 -25
- package/dist/agents/types.js +0 -11
- package/dist/agents/types.js.map +0 -1
- package/dist/agents/windsurf.d.ts +0 -2
- package/dist/agents/windsurf.js +0 -11
- package/dist/agents/windsurf.js.map +0 -1
- package/dist/commands/build.d.ts +0 -19
- package/dist/commands/build.js +0 -128
- package/dist/commands/build.js.map +0 -1
- package/dist/commands/config.js.map +0 -1
- package/dist/commands/index.js.map +0 -1
- package/dist/commands/install.js +0 -252
- package/dist/commands/install.js.map +0 -1
- package/dist/commands/run.d.ts +0 -11
- package/dist/commands/run.js +0 -44
- package/dist/commands/run.js.map +0 -1
- package/dist/commands/runner.d.ts +0 -2
- package/dist/commands/runner.js +0 -59
- package/dist/commands/runner.js.map +0 -1
- package/dist/commands/setup.d.ts +0 -1
- package/dist/commands/setup.js +0 -45
- package/dist/commands/setup.js.map +0 -1
- package/dist/commands/telemetry.d.ts +0 -3
- package/dist/commands/telemetry.js +0 -49
- package/dist/commands/telemetry.js.map +0 -1
- package/dist/commands/validate.d.ts +0 -6
- package/dist/commands/validate.js +0 -41
- package/dist/commands/validate.js.map +0 -1
- package/dist/resolver/address.d.ts +0 -2
- package/dist/resolver/address.js.map +0 -1
- package/dist/resolver/github.js.map +0 -1
- package/dist/resolver/index.d.ts +0 -6
- package/dist/resolver/index.js.map +0 -1
- package/dist/resolver/local.js.map +0 -1
- package/dist/resolver/validate.js.map +0 -1
- package/dist/runtime/check.js.map +0 -1
- package/dist/runtime/installer.js.map +0 -1
- package/dist/runtime/spawn.js.map +0 -1
- package/dist/supabase/client.d.ts +0 -4
- package/dist/supabase/client.js +0 -5
- package/dist/supabase/client.js.map +0 -1
- package/dist/supabase/methods.d.ts +0 -2
- package/dist/supabase/methods.js +0 -13
- package/dist/supabase/methods.js.map +0 -1
- package/dist/supabase/types.d.ts +0 -30
- package/dist/supabase/types.js +0 -2
- package/dist/supabase/types.js.map +0 -1
- package/dist/telemetry/posthog.js +0 -117
- package/dist/telemetry/posthog.js.map +0 -1
- /package/dist/{commands → cli/commands}/config.d.ts +0 -0
- /package/dist/{commands → cli/commands}/index.d.ts +0 -0
- /package/dist/{commands → cli/commands}/install.d.ts +0 -0
- /package/dist/{resolver → installer/resolver}/address.js +0 -0
- /package/dist/{runtime → installer/runtime}/check.d.ts +0 -0
- /package/dist/{runtime → installer/runtime}/check.js +0 -0
- /package/dist/{runtime → installer/runtime}/installer.d.ts +0 -0
- /package/dist/{runtime → installer/runtime}/installer.js +0 -0
- /package/dist/{runtime → installer/runtime}/spawn.d.ts +0 -0
- /package/dist/{runtime → installer/runtime}/spawn.js +0 -0
- /package/dist/{resolver → package/manifest}/types.js +0 -0
- /package/dist/{resolver → package/manifest}/validate.d.ts +0 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
export class MthdsPackageError extends Error {
|
|
2
|
+
constructor(message) {
|
|
3
|
+
super(message);
|
|
4
|
+
this.name = "MthdsPackageError";
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export class ManifestError extends MthdsPackageError {
|
|
8
|
+
constructor(message) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.name = "ManifestError";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class ManifestParseError extends ManifestError {
|
|
14
|
+
constructor(message) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.name = "ManifestParseError";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export class ManifestValidationError extends ManifestError {
|
|
20
|
+
constructor(message) {
|
|
21
|
+
super(message);
|
|
22
|
+
this.name = "ManifestValidationError";
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export class VCSFetchError extends MthdsPackageError {
|
|
26
|
+
constructor(message) {
|
|
27
|
+
super(message);
|
|
28
|
+
this.name = "VCSFetchError";
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export class VersionResolutionError extends MthdsPackageError {
|
|
32
|
+
constructor(message) {
|
|
33
|
+
super(message);
|
|
34
|
+
this.name = "VersionResolutionError";
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export class PackageCacheError extends MthdsPackageError {
|
|
38
|
+
constructor(message) {
|
|
39
|
+
super(message);
|
|
40
|
+
this.name = "PackageCacheError";
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export class LockFileError extends MthdsPackageError {
|
|
44
|
+
constructor(message) {
|
|
45
|
+
super(message);
|
|
46
|
+
this.name = "LockFileError";
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export class IntegrityError extends MthdsPackageError {
|
|
50
|
+
constructor(message) {
|
|
51
|
+
super(message);
|
|
52
|
+
this.name = "IntegrityError";
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export class DependencyResolveError extends MthdsPackageError {
|
|
56
|
+
constructor(message) {
|
|
57
|
+
super(message);
|
|
58
|
+
this.name = "DependencyResolveError";
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export class TransitiveDependencyError extends MthdsPackageError {
|
|
62
|
+
constructor(message) {
|
|
63
|
+
super(message);
|
|
64
|
+
this.name = "TransitiveDependencyError";
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export class QualifiedRefError extends MthdsPackageError {
|
|
68
|
+
constructor(message) {
|
|
69
|
+
super(message);
|
|
70
|
+
this.name = "QualifiedRefError";
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=exceptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exceptions.js","sourceRoot":"","sources":["../../src/package/exceptions.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,iBAAiB;IAClD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,aAAa;IACnD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,aAAa;IACxD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,iBAAiB;IAClD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,iBAAiB;IAC3D,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,iBAAiB;IACtD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,iBAAiB;IAClD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,iBAAiB;IACnD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,iBAAiB;IAC3D,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED,MAAM,OAAO,yBAA0B,SAAQ,iBAAiB;IAC9D,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC1C,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,iBAAiB;IACtD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type ParsedManifest } from "./manifest/schema.js";
|
|
2
|
+
export declare const LOCK_FILENAME = "methods.lock";
|
|
3
|
+
export declare const HASH_PREFIX = "sha256:";
|
|
4
|
+
export interface LockedPackage {
|
|
5
|
+
readonly version: string;
|
|
6
|
+
readonly hash: string;
|
|
7
|
+
readonly source: string;
|
|
8
|
+
}
|
|
9
|
+
export interface LockFile {
|
|
10
|
+
readonly packages: Record<string, LockedPackage>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Compute a deterministic SHA-256 hash of a directory's contents.
|
|
14
|
+
* Sorts by POSIX-normalized relative path for cross-platform determinism.
|
|
15
|
+
*/
|
|
16
|
+
export declare function computeDirectoryHash(directory: string): string;
|
|
17
|
+
export declare function parseLockFile(content: string): LockFile;
|
|
18
|
+
export declare function serializeLockFile(lockFile: LockFile): string;
|
|
19
|
+
export interface ResolvedDepForLock {
|
|
20
|
+
readonly alias: string;
|
|
21
|
+
readonly address: string;
|
|
22
|
+
readonly manifest: ParsedManifest | null;
|
|
23
|
+
readonly packageRoot: string;
|
|
24
|
+
}
|
|
25
|
+
export declare function generateLockFile(resolvedDeps: ResolvedDepForLock[]): LockFile;
|
|
26
|
+
export declare function verifyLockedPackage(locked: LockedPackage, address: string, cacheRoot?: string): void;
|
|
27
|
+
export declare function verifyLockFile(lockFile: LockFile, cacheRoot?: string): void;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
3
|
+
import { join, relative, posix, sep } from "node:path";
|
|
4
|
+
import { parse, stringify } from "smol-toml";
|
|
5
|
+
import { IntegrityError, LockFileError } from "./exceptions.js";
|
|
6
|
+
import { isValidSemver } from "./manifest/schema.js";
|
|
7
|
+
import { getCachedPackagePath } from "./package-cache.js";
|
|
8
|
+
export const LOCK_FILENAME = "methods.lock";
|
|
9
|
+
export const HASH_PREFIX = "sha256:";
|
|
10
|
+
const HASH_PATTERN = /^sha256:[0-9a-f]{64}$/;
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// Hash computation
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
function collectFilesRecursive(dir, baseDir, result) {
|
|
15
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
16
|
+
for (const entry of entries) {
|
|
17
|
+
const fullPath = join(dir, entry.name);
|
|
18
|
+
const relPath = relative(baseDir, fullPath);
|
|
19
|
+
const posixRelPath = relPath.split(sep).join(posix.sep);
|
|
20
|
+
// Skip .git
|
|
21
|
+
if (posixRelPath.split(posix.sep).includes(".git"))
|
|
22
|
+
continue;
|
|
23
|
+
if (entry.isFile()) {
|
|
24
|
+
result.push(fullPath);
|
|
25
|
+
}
|
|
26
|
+
else if (entry.isDirectory()) {
|
|
27
|
+
collectFilesRecursive(fullPath, baseDir, result);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Compute a deterministic SHA-256 hash of a directory's contents.
|
|
33
|
+
* Sorts by POSIX-normalized relative path for cross-platform determinism.
|
|
34
|
+
*/
|
|
35
|
+
export function computeDirectoryHash(directory) {
|
|
36
|
+
if (!existsSync(directory) || !statSync(directory).isDirectory()) {
|
|
37
|
+
throw new LockFileError(`Directory '${directory}' does not exist or is not a directory`);
|
|
38
|
+
}
|
|
39
|
+
const hasher = createHash("sha256");
|
|
40
|
+
const filePaths = [];
|
|
41
|
+
collectFilesRecursive(directory, directory, filePaths);
|
|
42
|
+
// Sort by POSIX relative path
|
|
43
|
+
filePaths.sort((a, b) => {
|
|
44
|
+
const relA = relative(directory, a).split(sep).join(posix.sep);
|
|
45
|
+
const relB = relative(directory, b).split(sep).join(posix.sep);
|
|
46
|
+
return relA < relB ? -1 : relA > relB ? 1 : 0;
|
|
47
|
+
});
|
|
48
|
+
for (const filePath of filePaths) {
|
|
49
|
+
const relativePosix = relative(directory, filePath).split(sep).join(posix.sep);
|
|
50
|
+
hasher.update(relativePosix, "utf-8");
|
|
51
|
+
hasher.update(readFileSync(filePath));
|
|
52
|
+
}
|
|
53
|
+
return `${HASH_PREFIX}${hasher.digest("hex")}`;
|
|
54
|
+
}
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
// TOML parse / serialize
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
function validateLockedPackage(address, entry) {
|
|
59
|
+
const version = entry["version"];
|
|
60
|
+
if (typeof version !== "string" || !isValidSemver(version)) {
|
|
61
|
+
throw new LockFileError(`Invalid version '${version}' for '${address}' in lock file`);
|
|
62
|
+
}
|
|
63
|
+
const hash = entry["hash"];
|
|
64
|
+
if (typeof hash !== "string" || !HASH_PATTERN.test(hash)) {
|
|
65
|
+
throw new LockFileError(`Invalid hash for '${address}' in lock file`);
|
|
66
|
+
}
|
|
67
|
+
const source = entry["source"];
|
|
68
|
+
if (typeof source !== "string" || !source.startsWith("https://")) {
|
|
69
|
+
throw new LockFileError(`Invalid source '${source}' for '${address}' in lock file`);
|
|
70
|
+
}
|
|
71
|
+
return { version, hash, source };
|
|
72
|
+
}
|
|
73
|
+
export function parseLockFile(content) {
|
|
74
|
+
if (!content.trim()) {
|
|
75
|
+
return { packages: {} };
|
|
76
|
+
}
|
|
77
|
+
let raw;
|
|
78
|
+
try {
|
|
79
|
+
raw = parse(content);
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
throw new LockFileError(`Invalid TOML syntax in lock file: ${err.message}`);
|
|
83
|
+
}
|
|
84
|
+
const packages = {};
|
|
85
|
+
for (const [address, entry] of Object.entries(raw)) {
|
|
86
|
+
if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
|
|
87
|
+
throw new LockFileError(`Lock file entry for '${address}' must be a table, got ${typeof entry}`);
|
|
88
|
+
}
|
|
89
|
+
packages[address] = validateLockedPackage(address, entry);
|
|
90
|
+
}
|
|
91
|
+
return { packages };
|
|
92
|
+
}
|
|
93
|
+
export function serializeLockFile(lockFile) {
|
|
94
|
+
const doc = {};
|
|
95
|
+
for (const address of Object.keys(lockFile.packages).sort()) {
|
|
96
|
+
const locked = lockFile.packages[address];
|
|
97
|
+
doc[address] = {
|
|
98
|
+
version: locked.version,
|
|
99
|
+
hash: locked.hash,
|
|
100
|
+
source: locked.source,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
return stringify(doc);
|
|
104
|
+
}
|
|
105
|
+
export function generateLockFile(resolvedDeps) {
|
|
106
|
+
const packages = {};
|
|
107
|
+
for (const resolved of resolvedDeps) {
|
|
108
|
+
if (resolved.manifest === null) {
|
|
109
|
+
throw new LockFileError(`Remote dependency '${resolved.alias}' (${resolved.address}) has no manifest — cannot generate lock entry`);
|
|
110
|
+
}
|
|
111
|
+
const address = resolved.address;
|
|
112
|
+
const version = resolved.manifest.version;
|
|
113
|
+
const hash = computeDirectoryHash(resolved.packageRoot);
|
|
114
|
+
const source = `https://${address}`;
|
|
115
|
+
packages[address] = { version, hash, source };
|
|
116
|
+
}
|
|
117
|
+
return { packages };
|
|
118
|
+
}
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
// Verification
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
export function verifyLockedPackage(locked, address, cacheRoot) {
|
|
123
|
+
const cachedPath = getCachedPackagePath(address, locked.version, cacheRoot);
|
|
124
|
+
if (!existsSync(cachedPath) || !statSync(cachedPath).isDirectory()) {
|
|
125
|
+
throw new IntegrityError(`Cached package '${address}@${locked.version}' not found at '${cachedPath}'`);
|
|
126
|
+
}
|
|
127
|
+
const actualHash = computeDirectoryHash(cachedPath);
|
|
128
|
+
if (actualHash !== locked.hash) {
|
|
129
|
+
throw new IntegrityError(`Integrity check failed for '${address}@${locked.version}': expected ${locked.hash}, got ${actualHash}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
export function verifyLockFile(lockFile, cacheRoot) {
|
|
133
|
+
for (const [address, locked] of Object.entries(lockFile.packages)) {
|
|
134
|
+
verifyLockedPackage(locked, address, cacheRoot);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=lock-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock-file.js","sourceRoot":"","sources":["../../src/package/lock-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bridge between the flat ParsedManifest (package manager) and the nested
|
|
3
|
+
* MethodsManifest (installer/validate) types.
|
|
4
|
+
*/
|
|
5
|
+
import type { MethodsManifest } from "./types.js";
|
|
6
|
+
import type { ParsedManifest } from "./schema.js";
|
|
7
|
+
/**
|
|
8
|
+
* Convert a flat ParsedManifest to the nested MethodsManifest used by installer code.
|
|
9
|
+
*/
|
|
10
|
+
export declare function parsedManifestToLegacy(parsed: ParsedManifest): MethodsManifest;
|
|
11
|
+
/**
|
|
12
|
+
* Convert a nested MethodsManifest to a flat ParsedManifest.
|
|
13
|
+
*/
|
|
14
|
+
export declare function legacyToParsedManifest(legacy: MethodsManifest): ParsedManifest;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert a flat ParsedManifest to the nested MethodsManifest used by installer code.
|
|
3
|
+
*/
|
|
4
|
+
export function parsedManifestToLegacy(parsed) {
|
|
5
|
+
// Build nested exports
|
|
6
|
+
let exports;
|
|
7
|
+
if (Object.keys(parsed.exports).length > 0) {
|
|
8
|
+
const root = {};
|
|
9
|
+
for (const [domainPath, domainExport] of Object.entries(parsed.exports)) {
|
|
10
|
+
const segments = domainPath.split(".");
|
|
11
|
+
let current = root;
|
|
12
|
+
for (let idx = 0; idx < segments.length - 1; idx++) {
|
|
13
|
+
const segment = segments[idx];
|
|
14
|
+
if (!(segment in current) || typeof current[segment] !== "object" || Array.isArray(current[segment])) {
|
|
15
|
+
current[segment] = {};
|
|
16
|
+
}
|
|
17
|
+
current = current[segment];
|
|
18
|
+
}
|
|
19
|
+
const lastSegment = segments[segments.length - 1];
|
|
20
|
+
const existing = current[lastSegment];
|
|
21
|
+
if (existing && typeof existing === "object" && !Array.isArray(existing)) {
|
|
22
|
+
// Merge pipes into existing node
|
|
23
|
+
existing["pipes"] = [...domainExport.pipes];
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
current[lastSegment] = { pipes: [...domainExport.pipes] };
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports = root;
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
package: {
|
|
33
|
+
...(parsed.name !== undefined ? { name: parsed.name } : {}),
|
|
34
|
+
address: parsed.address,
|
|
35
|
+
version: parsed.version,
|
|
36
|
+
description: parsed.description,
|
|
37
|
+
...(parsed.displayName !== undefined ? { display_name: parsed.displayName } : {}),
|
|
38
|
+
...(parsed.authors.length > 0 ? { authors: parsed.authors } : {}),
|
|
39
|
+
...(parsed.license !== undefined ? { license: parsed.license } : {}),
|
|
40
|
+
...(parsed.mthdsVersion !== undefined ? { mthds_version: parsed.mthdsVersion } : {}),
|
|
41
|
+
...(parsed.mainPipe !== undefined ? { main_pipe: parsed.mainPipe } : {}),
|
|
42
|
+
},
|
|
43
|
+
...(exports !== undefined ? { exports } : {}),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Convert a nested MethodsManifest to a flat ParsedManifest.
|
|
48
|
+
*/
|
|
49
|
+
export function legacyToParsedManifest(legacy) {
|
|
50
|
+
// Flatten nested exports
|
|
51
|
+
const exports = {};
|
|
52
|
+
if (legacy.exports) {
|
|
53
|
+
flattenExports(legacy.exports, "", exports);
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
address: legacy.package.address,
|
|
57
|
+
version: legacy.package.version,
|
|
58
|
+
description: legacy.package.description,
|
|
59
|
+
authors: legacy.package.authors ?? [],
|
|
60
|
+
exports,
|
|
61
|
+
...(legacy.package.name !== undefined ? { name: legacy.package.name } : {}),
|
|
62
|
+
...(legacy.package.display_name !== undefined ? { displayName: legacy.package.display_name } : {}),
|
|
63
|
+
...(legacy.package.license !== undefined ? { license: legacy.package.license } : {}),
|
|
64
|
+
...(legacy.package.mthds_version !== undefined ? { mthdsVersion: legacy.package.mthds_version } : {}),
|
|
65
|
+
...(legacy.package.main_pipe !== undefined ? { mainPipe: legacy.package.main_pipe } : {}),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function flattenExports(node, prefix, result) {
|
|
69
|
+
for (const [key, value] of Object.entries(node)) {
|
|
70
|
+
if (key === "pipes" || value === undefined)
|
|
71
|
+
continue;
|
|
72
|
+
const currentPath = prefix ? `${prefix}.${key}` : key;
|
|
73
|
+
if (typeof value === "object" && !Array.isArray(value)) {
|
|
74
|
+
const exportNode = value;
|
|
75
|
+
if (exportNode.pipes) {
|
|
76
|
+
result[currentPath] = { pipes: [...exportNode.pipes] };
|
|
77
|
+
}
|
|
78
|
+
// Recurse into sub-nodes
|
|
79
|
+
flattenExports(exportNode, currentPath, result);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=convert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../src/package/manifest/convert.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ParsedManifest } from "./schema.js";
|
|
2
|
+
/**
|
|
3
|
+
* Parse METHODS.toml content into a ParsedManifest.
|
|
4
|
+
*/
|
|
5
|
+
export declare function parseMethodsToml(content: string): ParsedManifest;
|
|
6
|
+
/**
|
|
7
|
+
* Serialize a ParsedManifest to a TOML string.
|
|
8
|
+
*/
|
|
9
|
+
export declare function serializeManifestToToml(manifest: ParsedManifest): string;
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import { parse, stringify } from "smol-toml";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { ManifestParseError, ManifestValidationError } from "../exceptions.js";
|
|
4
|
+
import { isValidSemver, isValidVersionConstraint, isValidAddress, isValidMethodName, isReservedDomainPath, MethodsTomlSchema, DomainExportsSchema, } from "./schema.js";
|
|
5
|
+
import { isDomainCodeValid, isPipeCodeValid } from "./validation.js";
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// Zod error formatting
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
function formatZodError(err) {
|
|
10
|
+
return err.issues
|
|
11
|
+
.map((issue) => {
|
|
12
|
+
const path = issue.path;
|
|
13
|
+
const pathStr = path.join(".");
|
|
14
|
+
if (issue.code === "unrecognized_keys") {
|
|
15
|
+
if (path.length === 0) {
|
|
16
|
+
return `Unknown sections in METHODS.toml: ${issue.keys.sort().join(", ")}`;
|
|
17
|
+
}
|
|
18
|
+
return `Unknown keys in [${pathStr}]: ${issue.keys.sort().join(", ")}`;
|
|
19
|
+
}
|
|
20
|
+
if (issue.code === "invalid_type") {
|
|
21
|
+
// "expected string, received undefined" — extract received from message
|
|
22
|
+
const receivedUndefined = issue.message.includes("received undefined");
|
|
23
|
+
if (receivedUndefined) {
|
|
24
|
+
return path.length === 1
|
|
25
|
+
? `[${pathStr}] section is required`
|
|
26
|
+
: `[${pathStr}] is required`;
|
|
27
|
+
}
|
|
28
|
+
return `[${pathStr}]: ${issue.message}`;
|
|
29
|
+
}
|
|
30
|
+
return pathStr ? `[${pathStr}]: ${issue.message}` : issue.message;
|
|
31
|
+
})
|
|
32
|
+
.join("; ");
|
|
33
|
+
}
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// Exports flattening
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
/**
|
|
38
|
+
* Recursively walk nested export sub-tables to flatten them into dotted domain paths.
|
|
39
|
+
* e.g. { legal: { contracts: { pipes: ["extract_clause"] } } }
|
|
40
|
+
* -> { "legal.contracts": { pipes: ["extract_clause"] } }
|
|
41
|
+
*/
|
|
42
|
+
function walkExportsTable(table, prefix) {
|
|
43
|
+
const result = {};
|
|
44
|
+
for (const [key, value] of Object.entries(table)) {
|
|
45
|
+
const currentPath = prefix ? `${prefix}.${key}` : key;
|
|
46
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
47
|
+
throw new ManifestValidationError(`Invalid entry '${key}' in [exports${prefix ? `.${prefix}` : ""}]: expected a table, got ${value === null ? "null" : Array.isArray(value) ? "array" : typeof value}`);
|
|
48
|
+
}
|
|
49
|
+
{
|
|
50
|
+
const valueDict = value;
|
|
51
|
+
if ("pipes" in valueDict) {
|
|
52
|
+
// Validate this domain entry with DomainExportsSchema (rejects unknown keys at leaf)
|
|
53
|
+
const nonTableKeys = Object.fromEntries(Object.entries(valueDict).filter(([, v]) => v === null || typeof v !== "object" || Array.isArray(v)));
|
|
54
|
+
try {
|
|
55
|
+
DomainExportsSchema.parse(nonTableKeys);
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
if (err instanceof z.ZodError) {
|
|
59
|
+
throw new ManifestValidationError(`Invalid domain [exports.${currentPath}]: ${formatZodError(err)}`);
|
|
60
|
+
}
|
|
61
|
+
throw err;
|
|
62
|
+
}
|
|
63
|
+
const pipesValue = valueDict["pipes"];
|
|
64
|
+
if (!Array.isArray(pipesValue)) {
|
|
65
|
+
throw new ManifestValidationError(`'pipes' in domain '${currentPath}' must be a list, got ${typeof pipesValue}`);
|
|
66
|
+
}
|
|
67
|
+
for (const pipe of pipesValue) {
|
|
68
|
+
if (typeof pipe !== "string") {
|
|
69
|
+
throw new ManifestValidationError(`'pipes' in domain '${currentPath}' must contain only strings`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
result[currentPath] = { pipes: pipesValue };
|
|
73
|
+
// Also recurse into remaining sub-tables
|
|
74
|
+
for (const [subKey, subValue] of Object.entries(valueDict)) {
|
|
75
|
+
if (subKey !== "pipes" && subValue !== null && typeof subValue === "object" && !Array.isArray(subValue)) {
|
|
76
|
+
Object.assign(result, walkExportsTable({ [subKey]: subValue }, currentPath));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
// Check there are no unexpected non-table values at this level
|
|
82
|
+
for (const [subKey, subValue] of Object.entries(valueDict)) {
|
|
83
|
+
if (subValue === null || typeof subValue !== "object" || Array.isArray(subValue)) {
|
|
84
|
+
throw new ManifestValidationError(`Unknown key '${subKey}' in [exports.${currentPath}]. Only 'pipes' and sub-domain tables are allowed.`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
Object.assign(result, walkExportsTable(valueDict, currentPath));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
// Parse
|
|
95
|
+
// ---------------------------------------------------------------------------
|
|
96
|
+
/**
|
|
97
|
+
* Parse METHODS.toml content into a ParsedManifest.
|
|
98
|
+
*/
|
|
99
|
+
export function parseMethodsToml(content) {
|
|
100
|
+
let raw;
|
|
101
|
+
try {
|
|
102
|
+
raw = parse(content);
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
throw new ManifestParseError(`Invalid TOML syntax in METHODS.toml: ${err.message}`);
|
|
106
|
+
}
|
|
107
|
+
// Step 1: Structural validation via Zod (rejects unknown keys, wrong types, missing required)
|
|
108
|
+
let validated;
|
|
109
|
+
try {
|
|
110
|
+
validated = MethodsTomlSchema.parse(raw);
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
if (err instanceof z.ZodError) {
|
|
114
|
+
throw new ManifestValidationError(formatZodError(err));
|
|
115
|
+
}
|
|
116
|
+
throw err;
|
|
117
|
+
}
|
|
118
|
+
const pkg = validated.package;
|
|
119
|
+
// Step 2: Semantic validation on [package] fields
|
|
120
|
+
if (!isValidAddress(pkg.address)) {
|
|
121
|
+
throw new ManifestValidationError(`Invalid package address '${pkg.address}'. Address must follow hostname/path pattern (e.g. 'github.com/org/repo').`);
|
|
122
|
+
}
|
|
123
|
+
if (!isValidSemver(pkg.version)) {
|
|
124
|
+
throw new ManifestValidationError(`Invalid version '${pkg.version}'. Must be valid semver (e.g. '1.0.0', '2.1.3-beta.1').`);
|
|
125
|
+
}
|
|
126
|
+
if (!pkg.description.trim()) {
|
|
127
|
+
throw new ManifestValidationError("[package.description] is required and must be a non-empty string");
|
|
128
|
+
}
|
|
129
|
+
let displayName;
|
|
130
|
+
if (pkg.display_name !== undefined) {
|
|
131
|
+
const dn = pkg.display_name.trim();
|
|
132
|
+
if (!dn) {
|
|
133
|
+
throw new ManifestValidationError("Display name must not be empty or whitespace when provided");
|
|
134
|
+
}
|
|
135
|
+
if (dn.length > 128) {
|
|
136
|
+
throw new ManifestValidationError(`Display name must not exceed 128 characters (got ${dn.length})`);
|
|
137
|
+
}
|
|
138
|
+
displayName = dn;
|
|
139
|
+
}
|
|
140
|
+
const authors = [];
|
|
141
|
+
if (pkg.authors) {
|
|
142
|
+
for (const [idx, author] of pkg.authors.entries()) {
|
|
143
|
+
if (!author.trim()) {
|
|
144
|
+
throw new ManifestValidationError(`Author at index ${idx} must not be empty or whitespace`);
|
|
145
|
+
}
|
|
146
|
+
authors.push(author.trim());
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
let license;
|
|
150
|
+
if (pkg.license !== undefined) {
|
|
151
|
+
const trimmedLicense = pkg.license.trim();
|
|
152
|
+
if (!trimmedLicense) {
|
|
153
|
+
throw new ManifestValidationError("License must not be empty or whitespace when provided");
|
|
154
|
+
}
|
|
155
|
+
license = trimmedLicense;
|
|
156
|
+
}
|
|
157
|
+
let mthdsVersion;
|
|
158
|
+
if (pkg.mthds_version !== undefined) {
|
|
159
|
+
if (!isValidVersionConstraint(pkg.mthds_version)) {
|
|
160
|
+
throw new ManifestValidationError(`Invalid mthds_version constraint '${pkg.mthds_version}'. Must be a valid version constraint.`);
|
|
161
|
+
}
|
|
162
|
+
mthdsVersion = pkg.mthds_version;
|
|
163
|
+
}
|
|
164
|
+
let name;
|
|
165
|
+
if (pkg.name !== undefined) {
|
|
166
|
+
if (!isValidMethodName(pkg.name)) {
|
|
167
|
+
throw new ManifestValidationError(`Invalid method name '${pkg.name}'. Must be 2-25 lowercase chars (letters, digits, hyphens, underscores), starting with a letter.`);
|
|
168
|
+
}
|
|
169
|
+
name = pkg.name;
|
|
170
|
+
}
|
|
171
|
+
let mainPipe;
|
|
172
|
+
if (pkg.main_pipe !== undefined) {
|
|
173
|
+
if (!isPipeCodeValid(pkg.main_pipe)) {
|
|
174
|
+
throw new ManifestValidationError(`Invalid main_pipe '${pkg.main_pipe}'. Must be a valid snake_case pipe code.`);
|
|
175
|
+
}
|
|
176
|
+
mainPipe = pkg.main_pipe;
|
|
177
|
+
}
|
|
178
|
+
// Step 3: Process and validate exports
|
|
179
|
+
let exports = {};
|
|
180
|
+
if (validated.exports) {
|
|
181
|
+
exports = walkExportsTable(validated.exports, "");
|
|
182
|
+
for (const [domainPath, domainExport] of Object.entries(exports)) {
|
|
183
|
+
if (!isDomainCodeValid(domainPath)) {
|
|
184
|
+
throw new ManifestValidationError(`Invalid domain path '${domainPath}' in [exports]. Domain paths must be dot-separated snake_case segments.`);
|
|
185
|
+
}
|
|
186
|
+
if (isReservedDomainPath(domainPath)) {
|
|
187
|
+
const firstSegment = domainPath.split(".")[0];
|
|
188
|
+
throw new ManifestValidationError(`Domain path '${domainPath}' uses reserved domain '${firstSegment}'. ` +
|
|
189
|
+
`Reserved domains (mthds, native, pipelex) cannot be used in package exports.`);
|
|
190
|
+
}
|
|
191
|
+
for (const pipe of domainExport.pipes) {
|
|
192
|
+
if (!isPipeCodeValid(pipe)) {
|
|
193
|
+
throw new ManifestValidationError(`Invalid pipe name '${pipe}' in [exports.${domainPath}]. Pipe names must be in snake_case.`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return {
|
|
199
|
+
address: pkg.address,
|
|
200
|
+
version: pkg.version,
|
|
201
|
+
description: pkg.description.trim(),
|
|
202
|
+
authors,
|
|
203
|
+
exports,
|
|
204
|
+
...(name !== undefined ? { name } : {}),
|
|
205
|
+
...(displayName !== undefined ? { displayName } : {}),
|
|
206
|
+
...(license !== undefined ? { license } : {}),
|
|
207
|
+
...(mthdsVersion !== undefined ? { mthdsVersion } : {}),
|
|
208
|
+
...(mainPipe !== undefined ? { mainPipe } : {}),
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
// ---------------------------------------------------------------------------
|
|
212
|
+
// Serialize
|
|
213
|
+
// ---------------------------------------------------------------------------
|
|
214
|
+
/**
|
|
215
|
+
* Serialize a ParsedManifest to a TOML string.
|
|
216
|
+
*/
|
|
217
|
+
export function serializeManifestToToml(manifest) {
|
|
218
|
+
const doc = {};
|
|
219
|
+
// [package] section
|
|
220
|
+
const packageSection = {};
|
|
221
|
+
if (manifest.name !== undefined) {
|
|
222
|
+
packageSection["name"] = manifest.name;
|
|
223
|
+
}
|
|
224
|
+
packageSection["address"] = manifest.address;
|
|
225
|
+
if (manifest.displayName !== undefined) {
|
|
226
|
+
packageSection["display_name"] = manifest.displayName;
|
|
227
|
+
}
|
|
228
|
+
packageSection["version"] = manifest.version;
|
|
229
|
+
packageSection["description"] = manifest.description;
|
|
230
|
+
if (manifest.authors.length > 0) {
|
|
231
|
+
packageSection["authors"] = manifest.authors;
|
|
232
|
+
}
|
|
233
|
+
if (manifest.license !== undefined) {
|
|
234
|
+
packageSection["license"] = manifest.license;
|
|
235
|
+
}
|
|
236
|
+
if (manifest.mthdsVersion !== undefined) {
|
|
237
|
+
packageSection["mthds_version"] = manifest.mthdsVersion;
|
|
238
|
+
}
|
|
239
|
+
if (manifest.mainPipe !== undefined) {
|
|
240
|
+
packageSection["main_pipe"] = manifest.mainPipe;
|
|
241
|
+
}
|
|
242
|
+
doc["package"] = packageSection;
|
|
243
|
+
// [exports] section — rebuild nested structure from dotted paths
|
|
244
|
+
if (Object.keys(manifest.exports).length > 0) {
|
|
245
|
+
const exportsRoot = {};
|
|
246
|
+
for (const [domainPath, domainExport] of Object.entries(manifest.exports)) {
|
|
247
|
+
const segments = domainPath.split(".");
|
|
248
|
+
let current = exportsRoot;
|
|
249
|
+
for (const segment of segments) {
|
|
250
|
+
if (!(segment in current)) {
|
|
251
|
+
current[segment] = {};
|
|
252
|
+
}
|
|
253
|
+
current = current[segment];
|
|
254
|
+
}
|
|
255
|
+
current["pipes"] = domainExport.pipes;
|
|
256
|
+
}
|
|
257
|
+
doc["exports"] = exportsRoot;
|
|
258
|
+
}
|
|
259
|
+
return stringify(doc);
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/package/manifest/parser.ts"],"names":[],"mappings":"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"}
|