@enactprotocol/shared 2.0.0 → 2.0.2
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/config.d.ts +164 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +386 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +17 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +26 -0
- package/dist/constants.js.map +1 -0
- package/dist/execution/command.d.ts +102 -0
- package/dist/execution/command.d.ts.map +1 -0
- package/dist/execution/command.js +262 -0
- package/dist/execution/command.js.map +1 -0
- package/dist/execution/index.d.ts +12 -0
- package/dist/execution/index.d.ts.map +1 -0
- package/dist/execution/index.js +17 -0
- package/dist/execution/index.js.map +1 -0
- package/dist/execution/runtime.d.ts +82 -0
- package/dist/execution/runtime.d.ts.map +1 -0
- package/dist/execution/runtime.js +273 -0
- package/dist/execution/runtime.js.map +1 -0
- package/dist/execution/types.d.ts +306 -0
- package/dist/execution/types.d.ts.map +1 -0
- package/dist/execution/types.js +14 -0
- package/dist/execution/types.js.map +1 -0
- package/dist/execution/validation.d.ts +43 -0
- package/dist/execution/validation.d.ts.map +1 -0
- package/dist/execution/validation.js +430 -0
- package/dist/execution/validation.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest/index.d.ts +7 -0
- package/dist/manifest/index.d.ts.map +1 -0
- package/dist/manifest/index.js +10 -0
- package/dist/manifest/index.js.map +1 -0
- package/dist/manifest/loader.d.ts +76 -0
- package/dist/manifest/loader.d.ts.map +1 -0
- package/dist/manifest/loader.js +146 -0
- package/dist/manifest/loader.js.map +1 -0
- package/dist/manifest/parser.d.ts +64 -0
- package/dist/manifest/parser.d.ts.map +1 -0
- package/dist/manifest/parser.js +135 -0
- package/dist/manifest/parser.js.map +1 -0
- package/dist/manifest/validator.d.ts +95 -0
- package/dist/manifest/validator.d.ts.map +1 -0
- package/dist/manifest/validator.js +258 -0
- package/dist/manifest/validator.js.map +1 -0
- package/dist/paths.d.ts +57 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +93 -0
- package/dist/paths.js.map +1 -0
- package/dist/registry.d.ts +73 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +147 -0
- package/dist/registry.js.map +1 -0
- package/dist/resolver.d.ts +89 -0
- package/dist/resolver.d.ts.map +1 -0
- package/dist/resolver.js +282 -0
- package/dist/resolver.js.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/manifest.d.ts +201 -0
- package/dist/types/manifest.d.ts.map +1 -0
- package/dist/types/manifest.js +13 -0
- package/dist/types/manifest.js.map +1 -0
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/fs.d.ts +105 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +233 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/logger.d.ts +112 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +232 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/version.d.ts +62 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +259 -0
- package/dist/utils/version.js.map +1 -0
- package/package.json +2 -2
- package/src/config.ts +36 -2
- package/src/index.ts +1 -0
- package/tests/config.test.ts +190 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @enactprotocol/shared - Version utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides semver parsing, comparison, and range checking.
|
|
5
|
+
*/
|
|
6
|
+
export interface ParsedVersion {
|
|
7
|
+
major: number;
|
|
8
|
+
minor: number;
|
|
9
|
+
patch: number;
|
|
10
|
+
prerelease?: string | undefined;
|
|
11
|
+
build?: string | undefined;
|
|
12
|
+
raw: string;
|
|
13
|
+
}
|
|
14
|
+
export interface VersionRange {
|
|
15
|
+
operator: "=" | ">" | ">=" | "<" | "<=" | "^" | "~";
|
|
16
|
+
version: ParsedVersion;
|
|
17
|
+
raw: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Parse a semver version string
|
|
21
|
+
* Supports: 1.0.0, 1.0, 1, 1.0.0-alpha, 1.0.0+build, 1.0.0-alpha+build
|
|
22
|
+
*/
|
|
23
|
+
export declare function parseVersion(version: string): ParsedVersion | null;
|
|
24
|
+
/**
|
|
25
|
+
* Check if a string is a valid semver version
|
|
26
|
+
*/
|
|
27
|
+
export declare function isValidVersion(version: string): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Compare two version strings
|
|
30
|
+
* @returns -1 if a < b, 0 if a === b, 1 if a > b
|
|
31
|
+
*/
|
|
32
|
+
export declare function compareVersions(a: string, b: string): -1 | 0 | 1;
|
|
33
|
+
/**
|
|
34
|
+
* Parse a version range string
|
|
35
|
+
* Supports: =1.0.0, >1.0.0, >=1.0.0, <1.0.0, <=1.0.0, ^1.0.0, ~1.0.0
|
|
36
|
+
*/
|
|
37
|
+
export declare function parseRange(range: string): VersionRange | null;
|
|
38
|
+
/**
|
|
39
|
+
* Check if a version satisfies a range
|
|
40
|
+
*/
|
|
41
|
+
export declare function satisfiesRange(version: string, range: string): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Sort versions in ascending order
|
|
44
|
+
*/
|
|
45
|
+
export declare function sortVersions(versions: string[]): string[];
|
|
46
|
+
/**
|
|
47
|
+
* Get the highest version from a list
|
|
48
|
+
*/
|
|
49
|
+
export declare function getHighestVersion(versions: string[]): string | null;
|
|
50
|
+
/**
|
|
51
|
+
* Increment a version by bump type
|
|
52
|
+
*/
|
|
53
|
+
export declare function incrementVersion(version: string, bump: "major" | "minor" | "patch"): string | null;
|
|
54
|
+
/**
|
|
55
|
+
* Coerce a string to a valid semver, filling in missing parts
|
|
56
|
+
*/
|
|
57
|
+
export declare function coerceVersion(version: string): string | null;
|
|
58
|
+
/**
|
|
59
|
+
* Format a parsed version back to string
|
|
60
|
+
*/
|
|
61
|
+
export declare function formatVersion(version: ParsedVersion): string;
|
|
62
|
+
//# sourceMappingURL=version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;IACpD,OAAO,EAAE,aAAa,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CA2BlE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAgChE;AA0CD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CA6B7D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAgDtE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAEzD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAOnE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAChC,MAAM,GAAG,IAAI,CAYf;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqB5D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAS5D"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @enactprotocol/shared - Version utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides semver parsing, comparison, and range checking.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Parse a semver version string
|
|
8
|
+
* Supports: 1.0.0, 1.0, 1, 1.0.0-alpha, 1.0.0+build, 1.0.0-alpha+build
|
|
9
|
+
*/
|
|
10
|
+
export function parseVersion(version) {
|
|
11
|
+
const trimmed = version.trim();
|
|
12
|
+
// Remove leading 'v' if present (common in tags)
|
|
13
|
+
const normalized = trimmed.startsWith("v") ? trimmed.slice(1) : trimmed;
|
|
14
|
+
// Full semver regex with prerelease and build metadata
|
|
15
|
+
const semverRegex = /^(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:-([a-zA-Z0-9.-]+))?(?:\+([a-zA-Z0-9.-]+))?$/;
|
|
16
|
+
const match = normalized.match(semverRegex);
|
|
17
|
+
if (!match) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
const major = Number.parseInt(match[1] ?? "0", 10);
|
|
21
|
+
const minor = Number.parseInt(match[2] ?? "0", 10);
|
|
22
|
+
const patch = Number.parseInt(match[3] ?? "0", 10);
|
|
23
|
+
return {
|
|
24
|
+
major,
|
|
25
|
+
minor,
|
|
26
|
+
patch,
|
|
27
|
+
prerelease: match[4],
|
|
28
|
+
build: match[5],
|
|
29
|
+
raw: trimmed,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check if a string is a valid semver version
|
|
34
|
+
*/
|
|
35
|
+
export function isValidVersion(version) {
|
|
36
|
+
return parseVersion(version) !== null;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Compare two version strings
|
|
40
|
+
* @returns -1 if a < b, 0 if a === b, 1 if a > b
|
|
41
|
+
*/
|
|
42
|
+
export function compareVersions(a, b) {
|
|
43
|
+
const parsedA = parseVersion(a);
|
|
44
|
+
const parsedB = parseVersion(b);
|
|
45
|
+
// Invalid versions sort last
|
|
46
|
+
if (!parsedA && !parsedB)
|
|
47
|
+
return 0;
|
|
48
|
+
if (!parsedA)
|
|
49
|
+
return 1;
|
|
50
|
+
if (!parsedB)
|
|
51
|
+
return -1;
|
|
52
|
+
// Compare major.minor.patch
|
|
53
|
+
if (parsedA.major !== parsedB.major) {
|
|
54
|
+
return parsedA.major < parsedB.major ? -1 : 1;
|
|
55
|
+
}
|
|
56
|
+
if (parsedA.minor !== parsedB.minor) {
|
|
57
|
+
return parsedA.minor < parsedB.minor ? -1 : 1;
|
|
58
|
+
}
|
|
59
|
+
if (parsedA.patch !== parsedB.patch) {
|
|
60
|
+
return parsedA.patch < parsedB.patch ? -1 : 1;
|
|
61
|
+
}
|
|
62
|
+
// Prerelease comparison
|
|
63
|
+
// A version without prerelease is greater than one with
|
|
64
|
+
if (!parsedA.prerelease && parsedB.prerelease)
|
|
65
|
+
return 1;
|
|
66
|
+
if (parsedA.prerelease && !parsedB.prerelease)
|
|
67
|
+
return -1;
|
|
68
|
+
// Both have prereleases - compare lexically
|
|
69
|
+
if (parsedA.prerelease && parsedB.prerelease) {
|
|
70
|
+
const prereleaseCompare = comparePrerelease(parsedA.prerelease, parsedB.prerelease);
|
|
71
|
+
if (prereleaseCompare !== 0)
|
|
72
|
+
return prereleaseCompare;
|
|
73
|
+
}
|
|
74
|
+
return 0;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Compare prerelease strings according to semver rules
|
|
78
|
+
*/
|
|
79
|
+
function comparePrerelease(a, b) {
|
|
80
|
+
const partsA = a.split(".");
|
|
81
|
+
const partsB = b.split(".");
|
|
82
|
+
for (let i = 0; i < Math.max(partsA.length, partsB.length); i++) {
|
|
83
|
+
const partA = partsA[i];
|
|
84
|
+
const partB = partsB[i];
|
|
85
|
+
// Shorter prerelease is less than longer
|
|
86
|
+
if (partA === undefined)
|
|
87
|
+
return -1;
|
|
88
|
+
if (partB === undefined)
|
|
89
|
+
return 1;
|
|
90
|
+
const numA = Number.parseInt(partA, 10);
|
|
91
|
+
const numB = Number.parseInt(partB, 10);
|
|
92
|
+
const isNumA = !Number.isNaN(numA) && String(numA) === partA;
|
|
93
|
+
const isNumB = !Number.isNaN(numB) && String(numB) === partB;
|
|
94
|
+
// Numeric identifiers are less than alphanumeric
|
|
95
|
+
if (isNumA && !isNumB)
|
|
96
|
+
return -1;
|
|
97
|
+
if (!isNumA && isNumB)
|
|
98
|
+
return 1;
|
|
99
|
+
// Both numeric - compare as numbers
|
|
100
|
+
if (isNumA && isNumB) {
|
|
101
|
+
if (numA < numB)
|
|
102
|
+
return -1;
|
|
103
|
+
if (numA > numB)
|
|
104
|
+
return 1;
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
// Both alphanumeric - compare lexically
|
|
108
|
+
if (partA < partB)
|
|
109
|
+
return -1;
|
|
110
|
+
if (partA > partB)
|
|
111
|
+
return 1;
|
|
112
|
+
}
|
|
113
|
+
return 0;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Parse a version range string
|
|
117
|
+
* Supports: =1.0.0, >1.0.0, >=1.0.0, <1.0.0, <=1.0.0, ^1.0.0, ~1.0.0
|
|
118
|
+
*/
|
|
119
|
+
export function parseRange(range) {
|
|
120
|
+
const trimmed = range.trim();
|
|
121
|
+
// Match operator at start
|
|
122
|
+
const rangeRegex = /^([=><^~]+)?\s*(.+)$/;
|
|
123
|
+
const match = trimmed.match(rangeRegex);
|
|
124
|
+
if (!match || !match[2]) {
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
const operator = (match[1] ?? "=");
|
|
128
|
+
const versionStr = match[2];
|
|
129
|
+
// Validate operator
|
|
130
|
+
if (!["=", ">", ">=", "<", "<=", "^", "~"].includes(operator)) {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
const version = parseVersion(versionStr);
|
|
134
|
+
if (!version) {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
operator,
|
|
139
|
+
version,
|
|
140
|
+
raw: trimmed,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Check if a version satisfies a range
|
|
145
|
+
*/
|
|
146
|
+
export function satisfiesRange(version, range) {
|
|
147
|
+
const parsedVersion = parseVersion(version);
|
|
148
|
+
const parsedRange = parseRange(range);
|
|
149
|
+
if (!parsedVersion || !parsedRange) {
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
const comparison = compareVersions(version, parsedRange.version.raw);
|
|
153
|
+
switch (parsedRange.operator) {
|
|
154
|
+
case "=":
|
|
155
|
+
return comparison === 0;
|
|
156
|
+
case ">":
|
|
157
|
+
return comparison === 1;
|
|
158
|
+
case ">=":
|
|
159
|
+
return comparison >= 0;
|
|
160
|
+
case "<":
|
|
161
|
+
return comparison === -1;
|
|
162
|
+
case "<=":
|
|
163
|
+
return comparison <= 0;
|
|
164
|
+
case "^":
|
|
165
|
+
// Caret range: compatible changes (same major, >= version)
|
|
166
|
+
// ^1.2.3 := >=1.2.3 <2.0.0
|
|
167
|
+
// ^0.2.3 := >=0.2.3 <0.3.0
|
|
168
|
+
// ^0.0.3 := >=0.0.3 <0.0.4
|
|
169
|
+
if (comparison === -1)
|
|
170
|
+
return false;
|
|
171
|
+
if (parsedRange.version.major === 0) {
|
|
172
|
+
if (parsedRange.version.minor === 0) {
|
|
173
|
+
// ^0.0.x - must be exact patch
|
|
174
|
+
return parsedVersion.patch === parsedRange.version.patch;
|
|
175
|
+
}
|
|
176
|
+
// ^0.x - must be same minor
|
|
177
|
+
return parsedVersion.minor === parsedRange.version.minor;
|
|
178
|
+
}
|
|
179
|
+
// ^x - must be same major
|
|
180
|
+
return parsedVersion.major === parsedRange.version.major;
|
|
181
|
+
case "~":
|
|
182
|
+
// Tilde range: patch-level changes (same major.minor, >= version)
|
|
183
|
+
// ~1.2.3 := >=1.2.3 <1.3.0
|
|
184
|
+
if (comparison === -1)
|
|
185
|
+
return false;
|
|
186
|
+
return (parsedVersion.major === parsedRange.version.major &&
|
|
187
|
+
parsedVersion.minor === parsedRange.version.minor);
|
|
188
|
+
default:
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Sort versions in ascending order
|
|
194
|
+
*/
|
|
195
|
+
export function sortVersions(versions) {
|
|
196
|
+
return [...versions].sort(compareVersions);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Get the highest version from a list
|
|
200
|
+
*/
|
|
201
|
+
export function getHighestVersion(versions) {
|
|
202
|
+
const valid = versions.filter(isValidVersion);
|
|
203
|
+
if (valid.length === 0)
|
|
204
|
+
return null;
|
|
205
|
+
const sorted = sortVersions(valid);
|
|
206
|
+
const last = sorted[sorted.length - 1];
|
|
207
|
+
return last ?? null;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Increment a version by bump type
|
|
211
|
+
*/
|
|
212
|
+
export function incrementVersion(version, bump) {
|
|
213
|
+
const parsed = parseVersion(version);
|
|
214
|
+
if (!parsed)
|
|
215
|
+
return null;
|
|
216
|
+
switch (bump) {
|
|
217
|
+
case "major":
|
|
218
|
+
return `${parsed.major + 1}.0.0`;
|
|
219
|
+
case "minor":
|
|
220
|
+
return `${parsed.major}.${parsed.minor + 1}.0`;
|
|
221
|
+
case "patch":
|
|
222
|
+
return `${parsed.major}.${parsed.minor}.${parsed.patch + 1}`;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Coerce a string to a valid semver, filling in missing parts
|
|
227
|
+
*/
|
|
228
|
+
export function coerceVersion(version) {
|
|
229
|
+
const trimmed = version.trim();
|
|
230
|
+
const normalized = trimmed.startsWith("v") ? trimmed.slice(1) : trimmed;
|
|
231
|
+
// Try parsing as-is first
|
|
232
|
+
const parsed = parseVersion(normalized);
|
|
233
|
+
if (parsed) {
|
|
234
|
+
return `${parsed.major}.${parsed.minor}.${parsed.patch}`;
|
|
235
|
+
}
|
|
236
|
+
// Try extracting numbers
|
|
237
|
+
const numbers = normalized.match(/^(\d+)(?:\.(\d+))?(?:\.(\d+))?/);
|
|
238
|
+
if (!numbers) {
|
|
239
|
+
return null;
|
|
240
|
+
}
|
|
241
|
+
const major = Number.parseInt(numbers[1] ?? "0", 10);
|
|
242
|
+
const minor = Number.parseInt(numbers[2] ?? "0", 10);
|
|
243
|
+
const patch = Number.parseInt(numbers[3] ?? "0", 10);
|
|
244
|
+
return `${major}.${minor}.${patch}`;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Format a parsed version back to string
|
|
248
|
+
*/
|
|
249
|
+
export function formatVersion(version) {
|
|
250
|
+
let result = `${version.major}.${version.minor}.${version.patch}`;
|
|
251
|
+
if (version.prerelease) {
|
|
252
|
+
result += `-${version.prerelease}`;
|
|
253
|
+
}
|
|
254
|
+
if (version.build) {
|
|
255
|
+
result += `+${version.build}`;
|
|
256
|
+
}
|
|
257
|
+
return result;
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@enactprotocol/shared",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.2",
|
|
4
4
|
"description": "Core business logic and utilities for Enact",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"typecheck": "tsc --noEmit"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@enactprotocol/trust": "2.0.
|
|
21
|
+
"@enactprotocol/trust": "2.0.2",
|
|
22
22
|
"js-yaml": "^4.1.1",
|
|
23
23
|
"zod": "^4.1.13"
|
|
24
24
|
},
|
package/src/config.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
7
|
-
import { dirname } from "node:path";
|
|
7
|
+
import { dirname, join } from "node:path";
|
|
8
8
|
import yaml from "js-yaml";
|
|
9
9
|
import { getConfigPath, getEnactHome } from "./paths";
|
|
10
10
|
|
|
@@ -95,7 +95,7 @@ export const DEFAULT_CONFIG: EnactConfig = {
|
|
|
95
95
|
verbose: false,
|
|
96
96
|
},
|
|
97
97
|
registry: {
|
|
98
|
-
url: "https://
|
|
98
|
+
url: "https://siikwkfgsmouioodghho.supabase.co/functions/v1",
|
|
99
99
|
},
|
|
100
100
|
};
|
|
101
101
|
|
|
@@ -257,6 +257,40 @@ export function configExists(): boolean {
|
|
|
257
257
|
return existsSync(getConfigPath());
|
|
258
258
|
}
|
|
259
259
|
|
|
260
|
+
/**
|
|
261
|
+
* Ensure global setup is complete
|
|
262
|
+
* Creates ~/.enact/ directory structure and default config if they don't exist.
|
|
263
|
+
* This is a non-interactive initialization that runs silently.
|
|
264
|
+
* @returns true if setup was performed, false if already initialized
|
|
265
|
+
*/
|
|
266
|
+
export function ensureGlobalSetup(): boolean {
|
|
267
|
+
const enactHome = getEnactHome();
|
|
268
|
+
const configPath = getConfigPath();
|
|
269
|
+
const cacheDir = join(enactHome, "cache");
|
|
270
|
+
|
|
271
|
+
let performedSetup = false;
|
|
272
|
+
|
|
273
|
+
// Ensure ~/.enact/ directory exists
|
|
274
|
+
if (!existsSync(enactHome)) {
|
|
275
|
+
mkdirSync(enactHome, { recursive: true });
|
|
276
|
+
performedSetup = true;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// Ensure ~/.enact/cache/ directory exists
|
|
280
|
+
if (!existsSync(cacheDir)) {
|
|
281
|
+
mkdirSync(cacheDir, { recursive: true });
|
|
282
|
+
performedSetup = true;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Create default config if it doesn't exist
|
|
286
|
+
if (!existsSync(configPath)) {
|
|
287
|
+
saveConfig({ ...DEFAULT_CONFIG });
|
|
288
|
+
performedSetup = true;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
return performedSetup;
|
|
292
|
+
}
|
|
293
|
+
|
|
260
294
|
// =============================================================================
|
|
261
295
|
// Local Trust Management
|
|
262
296
|
// =============================================================================
|
package/src/index.ts
CHANGED
package/tests/config.test.ts
CHANGED
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
addTrustedIdentity,
|
|
12
12
|
configExists,
|
|
13
13
|
emailToProviderIdentity,
|
|
14
|
+
ensureGlobalSetup,
|
|
14
15
|
getConfigValue,
|
|
15
16
|
getMinimumAttestations,
|
|
16
17
|
getTrustPolicy,
|
|
@@ -25,6 +26,7 @@ import {
|
|
|
25
26
|
saveConfig,
|
|
26
27
|
setConfigValue,
|
|
27
28
|
} from "../src/config";
|
|
29
|
+
import { getCacheDir, getConfigPath, getEnactHome } from "../src/paths";
|
|
28
30
|
|
|
29
31
|
// Use a test-specific home directory to avoid affecting real config
|
|
30
32
|
const TEST_HOME = join(import.meta.dir, "fixtures", "config-test-home");
|
|
@@ -64,7 +66,9 @@ describe("configuration manager", () => {
|
|
|
64
66
|
expect(DEFAULT_CONFIG.trust?.minimum_attestations).toBe(1);
|
|
65
67
|
expect(DEFAULT_CONFIG.cache?.maxSizeMb).toBe(1024);
|
|
66
68
|
expect(DEFAULT_CONFIG.execution?.defaultTimeout).toBe("30s");
|
|
67
|
-
expect(DEFAULT_CONFIG.registry?.url).toBe(
|
|
69
|
+
expect(DEFAULT_CONFIG.registry?.url).toBe(
|
|
70
|
+
"https://siikwkfgsmouioodghho.supabase.co/functions/v1"
|
|
71
|
+
);
|
|
68
72
|
});
|
|
69
73
|
});
|
|
70
74
|
|
|
@@ -512,4 +516,189 @@ describe("configuration manager", () => {
|
|
|
512
516
|
});
|
|
513
517
|
});
|
|
514
518
|
});
|
|
519
|
+
|
|
520
|
+
describe("ensureGlobalSetup", () => {
|
|
521
|
+
test("creates ~/.enact/ directory if it doesn't exist", () => {
|
|
522
|
+
const enactHome = getEnactHome();
|
|
523
|
+
|
|
524
|
+
// Clean up first to ensure fresh state
|
|
525
|
+
if (existsSync(enactHome)) {
|
|
526
|
+
rmSync(enactHome, { recursive: true, force: true });
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
// Run setup
|
|
530
|
+
const result = ensureGlobalSetup();
|
|
531
|
+
|
|
532
|
+
// Should have performed setup
|
|
533
|
+
expect(result).toBe(true);
|
|
534
|
+
expect(existsSync(enactHome)).toBe(true);
|
|
535
|
+
});
|
|
536
|
+
|
|
537
|
+
test("creates ~/.enact/cache/ directory", () => {
|
|
538
|
+
const enactHome = getEnactHome();
|
|
539
|
+
const cacheDir = getCacheDir();
|
|
540
|
+
|
|
541
|
+
// Clean up first
|
|
542
|
+
if (existsSync(enactHome)) {
|
|
543
|
+
rmSync(enactHome, { recursive: true, force: true });
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
ensureGlobalSetup();
|
|
547
|
+
|
|
548
|
+
expect(existsSync(cacheDir)).toBe(true);
|
|
549
|
+
});
|
|
550
|
+
|
|
551
|
+
test("creates default config.yaml", () => {
|
|
552
|
+
const enactHome = getEnactHome();
|
|
553
|
+
const configPath = getConfigPath();
|
|
554
|
+
|
|
555
|
+
// Clean up first
|
|
556
|
+
if (existsSync(enactHome)) {
|
|
557
|
+
rmSync(enactHome, { recursive: true, force: true });
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
ensureGlobalSetup();
|
|
561
|
+
|
|
562
|
+
expect(existsSync(configPath)).toBe(true);
|
|
563
|
+
|
|
564
|
+
// Verify config content
|
|
565
|
+
const config = loadConfig();
|
|
566
|
+
expect(config.version).toBe(DEFAULT_CONFIG.version);
|
|
567
|
+
expect(config.trust?.policy).toBe(DEFAULT_CONFIG.trust?.policy);
|
|
568
|
+
expect(config.registry?.url).toBe(DEFAULT_CONFIG.registry?.url);
|
|
569
|
+
});
|
|
570
|
+
|
|
571
|
+
test("returns false if already initialized", () => {
|
|
572
|
+
// First call should perform setup
|
|
573
|
+
ensureGlobalSetup();
|
|
574
|
+
|
|
575
|
+
// Second call should return false (already set up)
|
|
576
|
+
const result = ensureGlobalSetup();
|
|
577
|
+
expect(result).toBe(false);
|
|
578
|
+
});
|
|
579
|
+
|
|
580
|
+
test("is idempotent - multiple calls don't break things", () => {
|
|
581
|
+
// Run setup multiple times
|
|
582
|
+
ensureGlobalSetup();
|
|
583
|
+
ensureGlobalSetup();
|
|
584
|
+
ensureGlobalSetup();
|
|
585
|
+
|
|
586
|
+
// Everything should still work
|
|
587
|
+
expect(configExists()).toBe(true);
|
|
588
|
+
const config = loadConfig();
|
|
589
|
+
expect(config.version).toBeDefined();
|
|
590
|
+
});
|
|
591
|
+
|
|
592
|
+
test("preserves existing config if present", () => {
|
|
593
|
+
const enactHome = getEnactHome();
|
|
594
|
+
|
|
595
|
+
// Clean up first
|
|
596
|
+
if (existsSync(enactHome)) {
|
|
597
|
+
rmSync(enactHome, { recursive: true, force: true });
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
// Create initial config
|
|
601
|
+
ensureGlobalSetup();
|
|
602
|
+
|
|
603
|
+
// Modify the config
|
|
604
|
+
saveConfig({
|
|
605
|
+
...DEFAULT_CONFIG,
|
|
606
|
+
trust: { policy: "require_attestation", auditors: ["github:test-user"] },
|
|
607
|
+
});
|
|
608
|
+
|
|
609
|
+
// Run setup again
|
|
610
|
+
ensureGlobalSetup();
|
|
611
|
+
|
|
612
|
+
// Config should be preserved
|
|
613
|
+
const config = loadConfig();
|
|
614
|
+
expect(config.trust?.policy).toBe("require_attestation");
|
|
615
|
+
expect(config.trust?.auditors).toContain("github:test-user");
|
|
616
|
+
});
|
|
617
|
+
|
|
618
|
+
test("creates cache directory even if config exists", () => {
|
|
619
|
+
const enactHome = getEnactHome();
|
|
620
|
+
const cacheDir = getCacheDir();
|
|
621
|
+
|
|
622
|
+
// Clean up first
|
|
623
|
+
if (existsSync(enactHome)) {
|
|
624
|
+
rmSync(enactHome, { recursive: true, force: true });
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
// Create only the home and config
|
|
628
|
+
mkdirSync(enactHome, { recursive: true });
|
|
629
|
+
saveConfig({ ...DEFAULT_CONFIG });
|
|
630
|
+
|
|
631
|
+
// Manually remove cache dir if it exists
|
|
632
|
+
if (existsSync(cacheDir)) {
|
|
633
|
+
rmSync(cacheDir, { recursive: true, force: true });
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
// Run setup
|
|
637
|
+
const result = ensureGlobalSetup();
|
|
638
|
+
|
|
639
|
+
// Should have created cache dir
|
|
640
|
+
expect(result).toBe(true);
|
|
641
|
+
expect(existsSync(cacheDir)).toBe(true);
|
|
642
|
+
});
|
|
643
|
+
|
|
644
|
+
test("default config has correct registry URL", () => {
|
|
645
|
+
const enactHome = getEnactHome();
|
|
646
|
+
|
|
647
|
+
// Clean up first
|
|
648
|
+
if (existsSync(enactHome)) {
|
|
649
|
+
rmSync(enactHome, { recursive: true, force: true });
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
ensureGlobalSetup();
|
|
653
|
+
|
|
654
|
+
const config = loadConfig();
|
|
655
|
+
expect(config.registry?.url).toBe("https://siikwkfgsmouioodghho.supabase.co/functions/v1");
|
|
656
|
+
});
|
|
657
|
+
|
|
658
|
+
test("default config has correct trust settings", () => {
|
|
659
|
+
const enactHome = getEnactHome();
|
|
660
|
+
|
|
661
|
+
// Clean up first
|
|
662
|
+
if (existsSync(enactHome)) {
|
|
663
|
+
rmSync(enactHome, { recursive: true, force: true });
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
ensureGlobalSetup();
|
|
667
|
+
|
|
668
|
+
const config = loadConfig();
|
|
669
|
+
expect(config.trust?.policy).toBe("prompt");
|
|
670
|
+
expect(config.trust?.minimum_attestations).toBe(1);
|
|
671
|
+
expect(config.trust?.auditors).toEqual([]);
|
|
672
|
+
});
|
|
673
|
+
|
|
674
|
+
test("default config has correct cache settings", () => {
|
|
675
|
+
const enactHome = getEnactHome();
|
|
676
|
+
|
|
677
|
+
// Clean up first
|
|
678
|
+
if (existsSync(enactHome)) {
|
|
679
|
+
rmSync(enactHome, { recursive: true, force: true });
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
ensureGlobalSetup();
|
|
683
|
+
|
|
684
|
+
const config = loadConfig();
|
|
685
|
+
expect(config.cache?.maxSizeMb).toBe(1024);
|
|
686
|
+
expect(config.cache?.ttlSeconds).toBe(86400 * 7); // 7 days
|
|
687
|
+
});
|
|
688
|
+
|
|
689
|
+
test("default config has correct execution settings", () => {
|
|
690
|
+
const enactHome = getEnactHome();
|
|
691
|
+
|
|
692
|
+
// Clean up first
|
|
693
|
+
if (existsSync(enactHome)) {
|
|
694
|
+
rmSync(enactHome, { recursive: true, force: true });
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
ensureGlobalSetup();
|
|
698
|
+
|
|
699
|
+
const config = loadConfig();
|
|
700
|
+
expect(config.execution?.defaultTimeout).toBe("30s");
|
|
701
|
+
expect(config.execution?.verbose).toBe(false);
|
|
702
|
+
});
|
|
703
|
+
});
|
|
515
704
|
});
|