@spine-event-engine/proto-tools 2.0.0-snapshot.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/LICENSE +201 -0
- package/README.md +102 -0
- package/REFERENCE.md +80 -0
- package/bin/spine-proto.mjs +2 -0
- package/dist/src/cli/spine-proto-bootstrap.d.ts +4 -0
- package/dist/src/cli/spine-proto-bootstrap.d.ts.map +1 -0
- package/dist/src/cli/spine-proto-bootstrap.js +52 -0
- package/dist/src/cli/spine-proto-bootstrap.js.map +1 -0
- package/dist/src/cli/spine-proto.d.ts +3 -0
- package/dist/src/cli/spine-proto.d.ts.map +1 -0
- package/dist/src/cli/spine-proto.js +32 -0
- package/dist/src/cli/spine-proto.js.map +1 -0
- package/dist/src/generation/authored-interface-provider.d.ts +28 -0
- package/dist/src/generation/authored-interface-provider.d.ts.map +1 -0
- package/dist/src/generation/authored-interface-provider.js +244 -0
- package/dist/src/generation/authored-interface-provider.js.map +1 -0
- package/dist/src/generation/generated-source-policy.d.ts +21 -0
- package/dist/src/generation/generated-source-policy.d.ts.map +1 -0
- package/dist/src/generation/generated-source-policy.js +126 -0
- package/dist/src/generation/generated-source-policy.js.map +1 -0
- package/dist/src/generation/generation-reuse.mjs +84 -0
- package/dist/src/generation/generator.d.ts +195 -0
- package/dist/src/generation/generator.d.ts.map +1 -0
- package/dist/src/generation/generator.js +566 -0
- package/dist/src/generation/generator.js.map +1 -0
- package/dist/src/generation/handler-generator.d.ts +7 -0
- package/dist/src/generation/handler-generator.d.ts.map +1 -0
- package/dist/src/generation/handler-generator.js +55 -0
- package/dist/src/generation/handler-generator.js.map +1 -0
- package/dist/src/generation/interface-generator.d.ts +21 -0
- package/dist/src/generation/interface-generator.d.ts.map +1 -0
- package/dist/src/generation/interface-generator.js +277 -0
- package/dist/src/generation/interface-generator.js.map +1 -0
- package/dist/src/generation/interface-provider.d.ts +30 -0
- package/dist/src/generation/interface-provider.d.ts.map +1 -0
- package/dist/src/generation/interface-provider.js +15 -0
- package/dist/src/generation/interface-provider.js.map +1 -0
- package/dist/src/generation/rejection-generator.d.ts +9 -0
- package/dist/src/generation/rejection-generator.d.ts.map +1 -0
- package/dist/src/generation/rejection-generator.js +62 -0
- package/dist/src/generation/rejection-generator.js.map +1 -0
- package/dist/src/generation/source-view.d.ts +103 -0
- package/dist/src/generation/source-view.d.ts.map +1 -0
- package/dist/src/generation/source-view.js +298 -0
- package/dist/src/generation/source-view.js.map +1 -0
- package/dist/src/index.d.ts +139 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +546 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/io/atomic-manifest.d.ts +32 -0
- package/dist/src/io/atomic-manifest.d.ts.map +1 -0
- package/dist/src/io/atomic-manifest.js +56 -0
- package/dist/src/io/atomic-manifest.js.map +1 -0
- package/dist/src/io/manifest-reader.d.ts +8 -0
- package/dist/src/io/manifest-reader.d.ts.map +1 -0
- package/dist/src/io/manifest-reader.js +19 -0
- package/dist/src/io/manifest-reader.js.map +1 -0
- package/dist/src/model/model-graph.d.ts +68 -0
- package/dist/src/model/model-graph.d.ts.map +1 -0
- package/dist/src/model/model-graph.js +220 -0
- package/dist/src/model/model-graph.js.map +1 -0
- package/dist/src/model/npm-package-name.d.ts +7 -0
- package/dist/src/model/npm-package-name.d.ts.map +1 -0
- package/dist/src/model/npm-package-name.js +33 -0
- package/dist/src/model/npm-package-name.js.map +1 -0
- package/dist/src/model/registry-dependency.d.ts +10 -0
- package/dist/src/model/registry-dependency.d.ts.map +1 -0
- package/dist/src/model/registry-dependency.js +66 -0
- package/dist/src/model/registry-dependency.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +51 -0
- package/scripts/clean-dist.mjs +7 -0
- package/scripts/copy-runtime-modules.mjs +23 -0
|
@@ -0,0 +1,546 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026, CodeMatters. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
|
5
|
+
* in compliance with the License. You may obtain a copy of the License at
|
|
6
|
+
*
|
|
7
|
+
* https://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
*
|
|
9
|
+
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
|
10
|
+
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
|
11
|
+
* or implied. See the License for the specific language governing permissions and limitations under
|
|
12
|
+
* the License.
|
|
13
|
+
*/
|
|
14
|
+
import { closeSync, constants, fstatSync, lstatSync, openSync, opendirSync, readFileSync, } from "node:fs";
|
|
15
|
+
import { randomUUID } from "node:crypto";
|
|
16
|
+
import { isAbsolute, join, normalize, sep } from "node:path";
|
|
17
|
+
import { generationMarkerFile } from "./generation/generation-reuse.mjs";
|
|
18
|
+
import { RegistryDependency } from "./model/registry-dependency.js";
|
|
19
|
+
import { NpmPackageName } from "./model/npm-package-name.js";
|
|
20
|
+
/**
|
|
21
|
+
* Published manifest JSON revision.
|
|
22
|
+
*/
|
|
23
|
+
export const manifestFormatVersion = 2;
|
|
24
|
+
const configFormatVersion = 1;
|
|
25
|
+
const manifestReadAttempts = 3;
|
|
26
|
+
const manifestCommitDelayMs = 25;
|
|
27
|
+
const generationClaimScanLimit = 1_000;
|
|
28
|
+
function waitForManifestCommit() {
|
|
29
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT)), 0, 0, manifestCommitDelayMs);
|
|
30
|
+
}
|
|
31
|
+
function hasLiveGenerationClaim(packageRoot) {
|
|
32
|
+
try {
|
|
33
|
+
const directory = opendirSync(packageRoot, { encoding: "utf8" });
|
|
34
|
+
try {
|
|
35
|
+
let entry;
|
|
36
|
+
const claimPaths = [];
|
|
37
|
+
while ((entry = directory.readSync()) !== null) {
|
|
38
|
+
if (!entry.name.startsWith(".spine-proto-generate.lock."))
|
|
39
|
+
continue;
|
|
40
|
+
claimPaths.push(join(packageRoot, entry.name));
|
|
41
|
+
if (claimPaths.length > generationClaimScanLimit)
|
|
42
|
+
throw new Error("generation claim count exceeds 1000");
|
|
43
|
+
}
|
|
44
|
+
for (const path of claimPaths) {
|
|
45
|
+
let descriptor;
|
|
46
|
+
let owner;
|
|
47
|
+
try {
|
|
48
|
+
descriptor = openSync(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
49
|
+
if (!fstatSync(descriptor).isFile())
|
|
50
|
+
throw new Error("generation claim is unsafe");
|
|
51
|
+
owner = JSON.parse(readFileSync(descriptor, "utf8"));
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
if (error instanceof Error && error.message === "generation claim is unsafe")
|
|
55
|
+
throw error;
|
|
56
|
+
throw new Error("generation claim is unsafe", { cause: error });
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
if (descriptor !== undefined)
|
|
60
|
+
closeSync(descriptor);
|
|
61
|
+
}
|
|
62
|
+
if (typeof owner.pid !== "number" || owner.pid <= 0)
|
|
63
|
+
continue;
|
|
64
|
+
try {
|
|
65
|
+
process.kill(owner.pid, 0);
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
if (error.code !== "ESRCH")
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
directory.closeSync();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
if (error instanceof Error &&
|
|
80
|
+
["generation claim count exceeds 1000", "generation claim is unsafe"].includes(error.message))
|
|
81
|
+
throw error;
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
const reservedBindings = new Set([
|
|
87
|
+
"await",
|
|
88
|
+
"break",
|
|
89
|
+
"case",
|
|
90
|
+
"catch",
|
|
91
|
+
"class",
|
|
92
|
+
"const",
|
|
93
|
+
"continue",
|
|
94
|
+
"default",
|
|
95
|
+
"delete",
|
|
96
|
+
"do",
|
|
97
|
+
"else",
|
|
98
|
+
"enum",
|
|
99
|
+
"export",
|
|
100
|
+
"extends",
|
|
101
|
+
"false",
|
|
102
|
+
"finally",
|
|
103
|
+
"for",
|
|
104
|
+
"function",
|
|
105
|
+
"if",
|
|
106
|
+
"import",
|
|
107
|
+
"in",
|
|
108
|
+
"instanceof",
|
|
109
|
+
"let",
|
|
110
|
+
"new",
|
|
111
|
+
"null",
|
|
112
|
+
"return",
|
|
113
|
+
"super",
|
|
114
|
+
"switch",
|
|
115
|
+
"this",
|
|
116
|
+
"throw",
|
|
117
|
+
"true",
|
|
118
|
+
"try",
|
|
119
|
+
"typeof",
|
|
120
|
+
"var",
|
|
121
|
+
"void",
|
|
122
|
+
"while",
|
|
123
|
+
"with",
|
|
124
|
+
"yield",
|
|
125
|
+
]);
|
|
126
|
+
/**
|
|
127
|
+
* Reports invalid contained Proto package contracts.
|
|
128
|
+
*/
|
|
129
|
+
const ProtoPackageErrors = Object.freeze({
|
|
130
|
+
fail(name, message) {
|
|
131
|
+
throw new Error(`spine-proto: ${name}: ${message}`);
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
/**
|
|
135
|
+
* Reads, validates, and creates contained Proto package contracts.
|
|
136
|
+
*/
|
|
137
|
+
const ProtoPackage = Object.freeze({
|
|
138
|
+
// prettier-ignore
|
|
139
|
+
/**
|
|
140
|
+
* Reads and validates versioned `spine-proto.json` package configuration.
|
|
141
|
+
*/
|
|
142
|
+
configFromPackage(packageRoot) {
|
|
143
|
+
const packageJson = ProtoPackage.readPackage(packageRoot);
|
|
144
|
+
const config = ProtoPackage.objectValue(packageJson.name, ProtoPackage.readJson(join(packageRoot, "spine-proto.json"), packageJson.name), "configuration");
|
|
145
|
+
if (config.formatVersion !== configFormatVersion)
|
|
146
|
+
ProtoPackageErrors.fail(packageJson.name, "formatVersion must be 1");
|
|
147
|
+
if (config.mode !== "model" && config.mode !== "application")
|
|
148
|
+
ProtoPackageErrors.fail(packageJson.name, "mode must be model or application");
|
|
149
|
+
if (config.mode === "application") {
|
|
150
|
+
ProtoPackage.rejectKeys(packageJson.name, config, ["formatVersion", "mode", "modelPackages", "registryOutput"], "application mode");
|
|
151
|
+
const modelPackages = ProtoPackage.packageNameList(packageJson.name, config.modelPackages, "modelPackages");
|
|
152
|
+
ProtoPackage.validateRegistryDependencies(packageJson, modelPackages, "model package");
|
|
153
|
+
const registryOutput = ProtoPackage.packagePath(packageRoot, packageJson.name, config.registryOutput, "registryOutput");
|
|
154
|
+
if (ProtoPackage.isReservedOutput(registryOutput))
|
|
155
|
+
ProtoPackageErrors.fail(packageJson.name, "registryOutput must name a safe source file");
|
|
156
|
+
return {
|
|
157
|
+
formatVersion: 1,
|
|
158
|
+
mode: "application",
|
|
159
|
+
modelPackages,
|
|
160
|
+
registryOutput,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
ProtoPackage.rejectKeys(packageJson.name, config, [
|
|
164
|
+
"formatVersion",
|
|
165
|
+
"mode",
|
|
166
|
+
"packageName",
|
|
167
|
+
"protoRoot",
|
|
168
|
+
"generatedRoot",
|
|
169
|
+
"exportRoot",
|
|
170
|
+
"dependencies",
|
|
171
|
+
"moduleExport",
|
|
172
|
+
], "model mode");
|
|
173
|
+
const packageName = ProtoPackage.packageNameValue(packageJson.name, config.packageName, "packageName");
|
|
174
|
+
if (packageName !== packageJson.name)
|
|
175
|
+
ProtoPackageErrors.fail(packageJson.name, "packageName must match package.json name");
|
|
176
|
+
const dependencies = ProtoPackage.packageNameList(packageJson.name, config.dependencies, "dependencies");
|
|
177
|
+
ProtoPackage.validateRegistryDependencies(packageJson, dependencies, "dependency");
|
|
178
|
+
const protoRoot = ProtoPackage.packagePath(packageRoot, packageJson.name, config.protoRoot, "protoRoot");
|
|
179
|
+
const generatedRoot = ProtoPackage.packagePath(packageRoot, packageJson.name, config.generatedRoot, "generatedRoot");
|
|
180
|
+
if (generatedRoot === "." ||
|
|
181
|
+
["package.json", "spine-proto.json", "spine-proto-manifest.json"].includes(generatedRoot) ||
|
|
182
|
+
ProtoPackage.pathsOverlap(protoRoot, generatedRoot))
|
|
183
|
+
ProtoPackageErrors.fail(packageJson.name, "generatedRoot must not overlap protoRoot or package root");
|
|
184
|
+
const exportRoot = ProtoPackage.packagePath(packageRoot, packageJson.name, config.exportRoot, "exportRoot");
|
|
185
|
+
ProtoPackage.validateGeneratedExports(packageJson, exportRoot);
|
|
186
|
+
return {
|
|
187
|
+
formatVersion: 1,
|
|
188
|
+
mode: "model",
|
|
189
|
+
packageName,
|
|
190
|
+
protoRoot,
|
|
191
|
+
generatedRoot,
|
|
192
|
+
exportRoot,
|
|
193
|
+
dependencies,
|
|
194
|
+
moduleExport: ProtoPackage.bindingIdentifier(packageJson.name, config.moduleExport, "moduleExport"),
|
|
195
|
+
};
|
|
196
|
+
},
|
|
197
|
+
/**
|
|
198
|
+
* Validates a deterministic manifest shipped by a model package.
|
|
199
|
+
*/
|
|
200
|
+
manifestFromPackage(packageRoot, manifestPath = join(packageRoot, "spine-proto-manifest.json")) {
|
|
201
|
+
const packageJson = ProtoPackage.readPackage(packageRoot);
|
|
202
|
+
const manifest = ProtoPackage.manifestFromValue(ProtoPackage.readJson(manifestPath, packageJson.name), packageJson.name);
|
|
203
|
+
if (manifest.packageName !== packageJson.name)
|
|
204
|
+
ProtoPackageErrors.fail(packageJson.name, "manifest packageName must match package.json name");
|
|
205
|
+
if (manifest.packageVersion !== packageJson.version)
|
|
206
|
+
ProtoPackageErrors.fail(packageJson.name, "manifest packageVersion must match package.json version");
|
|
207
|
+
const config = ProtoPackage.configFromPackage(packageRoot);
|
|
208
|
+
if (config.mode !== "model")
|
|
209
|
+
ProtoPackageErrors.fail(packageJson.name, "manifest requires model mode");
|
|
210
|
+
const marker = ProtoPackage.objectValue(packageJson.name, ProtoPackage.readJson(join(packageRoot, config.generatedRoot, generationMarkerFile), packageJson.name), "generated-root marker");
|
|
211
|
+
ProtoPackage.rejectKeys(packageJson.name, marker, ["generationId"], "generated-root marker");
|
|
212
|
+
if (ProtoPackage.stringValue(packageJson.name, marker.generationId, "generated-root marker generationId") !== manifest.generationId)
|
|
213
|
+
ProtoPackageErrors.fail(packageJson.name, "manifest generationId must match generated-root marker");
|
|
214
|
+
for (const protoFile of manifest.protoFiles) {
|
|
215
|
+
ProtoPackage.assertNoSymlinkAncestor(packageRoot, packageJson.name, protoFile, "manifest protoFiles");
|
|
216
|
+
ProtoPackage.assertNoSymlinkAncestor(packageRoot, packageJson.name, manifest.generatedExports[protoFile] ?? "", `manifest generated export for ${protoFile}`);
|
|
217
|
+
}
|
|
218
|
+
return manifest;
|
|
219
|
+
},
|
|
220
|
+
/**
|
|
221
|
+
* Builds a deterministic manifest from a model package's owned Proto paths.
|
|
222
|
+
*/
|
|
223
|
+
manifestForPackage(packageRoot, ownedProtoFiles, generationId = randomUUID()) {
|
|
224
|
+
const config = ProtoPackage.configFromPackage(packageRoot);
|
|
225
|
+
if (config.mode !== "model")
|
|
226
|
+
ProtoPackageErrors.fail(ProtoPackage.readPackage(packageRoot).name, "manifest requires model mode");
|
|
227
|
+
const packageJson = ProtoPackage.readPackage(packageRoot);
|
|
228
|
+
if (ownedProtoFiles !== undefined && ownedProtoFiles.length > 10000)
|
|
229
|
+
ProtoPackageErrors.fail(packageJson.name, "owned Proto paths exceeds 10000 entries");
|
|
230
|
+
const protoFiles = (ownedProtoFiles ??
|
|
231
|
+
ProtoPackage.discoverProtoFiles(join(packageRoot, config.protoRoot), packageJson.name))
|
|
232
|
+
.map((file) => ProtoPackage.protoPath(packageRoot, packageJson.name, config.protoRoot, file))
|
|
233
|
+
.sort();
|
|
234
|
+
if (new Set(protoFiles).size !== protoFiles.length)
|
|
235
|
+
ProtoPackageErrors.fail(packageJson.name, "duplicate proto path");
|
|
236
|
+
return {
|
|
237
|
+
formatVersion: manifestFormatVersion,
|
|
238
|
+
generationId: ProtoPackage.stringValue(packageJson.name, generationId, "manifest generationId"),
|
|
239
|
+
packageName: packageJson.name,
|
|
240
|
+
packageVersion: packageJson.version,
|
|
241
|
+
protoFiles,
|
|
242
|
+
generatedExports: Object.fromEntries(protoFiles.map((file) => [
|
|
243
|
+
file,
|
|
244
|
+
ProtoPackage.exportPath(packageJson.name, config.exportRoot, file),
|
|
245
|
+
])),
|
|
246
|
+
dependencies: [...config.dependencies].sort(),
|
|
247
|
+
moduleExport: config.moduleExport,
|
|
248
|
+
};
|
|
249
|
+
},
|
|
250
|
+
manifestFromValue(value, requester) {
|
|
251
|
+
const manifest = ProtoPackage.objectValue(requester, value, "manifest");
|
|
252
|
+
ProtoPackage.rejectKeys(requester, manifest, [
|
|
253
|
+
"formatVersion",
|
|
254
|
+
"generationId",
|
|
255
|
+
"packageName",
|
|
256
|
+
"packageVersion",
|
|
257
|
+
"protoFiles",
|
|
258
|
+
"generatedExports",
|
|
259
|
+
"dependencies",
|
|
260
|
+
"moduleExport",
|
|
261
|
+
], "manifest");
|
|
262
|
+
if (manifest.formatVersion !== manifestFormatVersion)
|
|
263
|
+
ProtoPackageErrors.fail(requester, "manifest formatVersion must be 2");
|
|
264
|
+
const generationId = ProtoPackage.stringValue(requester, manifest.generationId, "manifest generationId");
|
|
265
|
+
const protoFiles = ProtoPackage.stringList(requester, manifest.protoFiles, "manifest protoFiles")
|
|
266
|
+
.map((file) => ProtoPackage.manifestPath(requester, file, "manifest protoFiles"))
|
|
267
|
+
.sort();
|
|
268
|
+
const generatedExports = ProtoPackage.objectValue(requester, manifest.generatedExports, "manifest generatedExports");
|
|
269
|
+
ProtoPackage.assertRecordBound(requester, generatedExports, "manifest generatedExports");
|
|
270
|
+
const keys = Object.keys(generatedExports).sort();
|
|
271
|
+
if (keys.length !== protoFiles.length || keys.some((key, index) => key !== protoFiles[index])) {
|
|
272
|
+
ProtoPackageErrors.fail(requester, "manifest generatedExports must map every proto file exactly once");
|
|
273
|
+
}
|
|
274
|
+
return {
|
|
275
|
+
formatVersion: manifestFormatVersion,
|
|
276
|
+
generationId,
|
|
277
|
+
packageName: ProtoPackage.packageNameValue(requester, manifest.packageName, "manifest packageName"),
|
|
278
|
+
packageVersion: ProtoPackage.stringValue(requester, manifest.packageVersion, "manifest packageVersion"),
|
|
279
|
+
protoFiles,
|
|
280
|
+
generatedExports: Object.fromEntries(protoFiles.map((file) => [
|
|
281
|
+
file,
|
|
282
|
+
ProtoPackage.manifestPath(requester, generatedExports[file], `manifest generated export for ${file}`),
|
|
283
|
+
])),
|
|
284
|
+
dependencies: [
|
|
285
|
+
...ProtoPackage.packageNameList(requester, manifest.dependencies, "manifest dependencies"),
|
|
286
|
+
].sort(),
|
|
287
|
+
moduleExport: ProtoPackage.bindingIdentifier(requester, manifest.moduleExport, "manifest moduleExport"),
|
|
288
|
+
};
|
|
289
|
+
},
|
|
290
|
+
discoverProtoFiles(root, name) {
|
|
291
|
+
const files = [];
|
|
292
|
+
const pending = [{ path: root, relativePath: "", depth: 0 }];
|
|
293
|
+
let encountered = 0;
|
|
294
|
+
while (pending.length > 0) {
|
|
295
|
+
const directory = pending.pop();
|
|
296
|
+
if (directory === undefined)
|
|
297
|
+
break;
|
|
298
|
+
let directoryHandle;
|
|
299
|
+
try {
|
|
300
|
+
directoryHandle = opendirSync(directory.path, { encoding: "utf8" });
|
|
301
|
+
}
|
|
302
|
+
catch {
|
|
303
|
+
ProtoPackageErrors.fail(name, "proto root is missing or inaccessible");
|
|
304
|
+
}
|
|
305
|
+
try {
|
|
306
|
+
for (let entry = directoryHandle.readSync(); entry !== null; entry = directoryHandle.readSync()) {
|
|
307
|
+
encountered += 1;
|
|
308
|
+
if (encountered > 10000)
|
|
309
|
+
ProtoPackageErrors.fail(name, "proto source exceeds 10000 entries");
|
|
310
|
+
const relativePath = directory.relativePath === "" ? entry.name : `${directory.relativePath}/${entry.name}`;
|
|
311
|
+
if (entry.isDirectory()) {
|
|
312
|
+
if (directory.depth >= 100)
|
|
313
|
+
ProtoPackageErrors.fail(name, "proto source exceeds 100 directory levels");
|
|
314
|
+
pending.push({
|
|
315
|
+
path: join(directory.path, entry.name),
|
|
316
|
+
relativePath,
|
|
317
|
+
depth: directory.depth + 1,
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
else if (entry.isFile() && entry.name.endsWith(".proto")) {
|
|
321
|
+
files.push(relativePath);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
finally {
|
|
326
|
+
directoryHandle.closeSync();
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
return files;
|
|
330
|
+
},
|
|
331
|
+
protoPath(packageRoot, name, protoRoot, value) {
|
|
332
|
+
const path = ProtoPackage.manifestPath(name, value, "proto path");
|
|
333
|
+
ProtoPackage.assertNoSymlinkAncestor(packageRoot, name, join(protoRoot, path), "proto path");
|
|
334
|
+
return path;
|
|
335
|
+
},
|
|
336
|
+
exportPath(name, exportRoot, protoPath) {
|
|
337
|
+
return ProtoPackage.manifestPath(name, `${exportRoot}/${protoPath.replace(/\.proto$/, "_pb.js")}`, "generated export");
|
|
338
|
+
},
|
|
339
|
+
packagePath(packageRoot, name, value, label) {
|
|
340
|
+
const path = ProtoPackage.manifestPath(name, value, label);
|
|
341
|
+
ProtoPackage.assertNoSymlinkAncestor(packageRoot, name, path, label);
|
|
342
|
+
return path;
|
|
343
|
+
},
|
|
344
|
+
pathsOverlap(left, right) {
|
|
345
|
+
return left === right || left.startsWith(`${right}/`) || right.startsWith(`${left}/`);
|
|
346
|
+
},
|
|
347
|
+
isReservedOutput(path) {
|
|
348
|
+
return (path === "." ||
|
|
349
|
+
["package.json", "spine-proto.json", "spine-proto-manifest.json"].includes(path) ||
|
|
350
|
+
!path.includes("."));
|
|
351
|
+
},
|
|
352
|
+
bindingIdentifier(name, value, label) {
|
|
353
|
+
const identifier = ProtoPackage.stringValue(name, value, label);
|
|
354
|
+
if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(identifier) || reservedBindings.has(identifier))
|
|
355
|
+
ProtoPackageErrors.fail(name, `${label} must be a legal ESM binding identifier`);
|
|
356
|
+
return identifier;
|
|
357
|
+
},
|
|
358
|
+
manifestPath(name, value, label) {
|
|
359
|
+
const path = ProtoPackage.stringValue(name, value, label).replaceAll("\\", "/");
|
|
360
|
+
if (isAbsolute(path))
|
|
361
|
+
ProtoPackageErrors.fail(name, `${label} must be relative`);
|
|
362
|
+
if (path.split("/").includes(".."))
|
|
363
|
+
ProtoPackageErrors.fail(name, `${label} must not contain traversal`);
|
|
364
|
+
if (path.endsWith("/") || normalize(path).replaceAll("\\", "/") !== path) {
|
|
365
|
+
ProtoPackageErrors.fail(name, `${label} must be a normalized contained relative path`);
|
|
366
|
+
}
|
|
367
|
+
return path;
|
|
368
|
+
},
|
|
369
|
+
assertNoSymlinkAncestor(packageRoot, name, path, label) {
|
|
370
|
+
let current = packageRoot;
|
|
371
|
+
for (const segment of path.split("/")) {
|
|
372
|
+
current = join(current, segment);
|
|
373
|
+
try {
|
|
374
|
+
if (lstatSync(current).isSymbolicLink())
|
|
375
|
+
ProtoPackageErrors.fail(name, `${label} must not pass through a symlink`);
|
|
376
|
+
}
|
|
377
|
+
catch (error) {
|
|
378
|
+
if (error.code !== "ENOENT")
|
|
379
|
+
throw error;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
},
|
|
383
|
+
validateRegistryDependencies(packageJson, names, label) {
|
|
384
|
+
for (const name of names) {
|
|
385
|
+
const specifier = packageJson.dependencies[name];
|
|
386
|
+
if (specifier === undefined) {
|
|
387
|
+
ProtoPackageErrors.fail(packageJson.name, `${label} ${name} must be declared in package.json dependencies`);
|
|
388
|
+
}
|
|
389
|
+
if (!RegistryDependency.is(specifier)) {
|
|
390
|
+
ProtoPackageErrors.fail(packageJson.name, `${label} ${name} must use a registry version`);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
},
|
|
394
|
+
validateGeneratedExports(packageJson, exportRoot) {
|
|
395
|
+
const key = `./${exportRoot}/*.js`;
|
|
396
|
+
const entry = packageJson.exports[key];
|
|
397
|
+
const expectedRuntime = `./dist/${exportRoot}/*.js`;
|
|
398
|
+
const expectedTypes = `./dist/${exportRoot}/*.d.ts`;
|
|
399
|
+
if (typeof entry !== "object" ||
|
|
400
|
+
entry === null ||
|
|
401
|
+
Array.isArray(entry) ||
|
|
402
|
+
entry.default !== expectedRuntime ||
|
|
403
|
+
entry.types !== expectedTypes) {
|
|
404
|
+
ProtoPackageErrors.fail(packageJson.name, `package.json exports must expose ${key} with default ${expectedRuntime} and types ${expectedTypes}`);
|
|
405
|
+
}
|
|
406
|
+
},
|
|
407
|
+
readPackage(packageRoot) {
|
|
408
|
+
const value = ProtoPackage.objectValue(packageRoot, ProtoPackage.readJson(join(packageRoot, "package.json"), packageRoot), "package.json");
|
|
409
|
+
const name = ProtoPackage.packageNameValue(packageRoot, value.name, "package.json name");
|
|
410
|
+
return {
|
|
411
|
+
name,
|
|
412
|
+
version: ProtoPackage.stringValue(name, value.version, "package.json version"),
|
|
413
|
+
dependencies: ProtoPackage.stringRecord(value.dependencies, name, "package.json dependencies"),
|
|
414
|
+
exports: value.exports === undefined
|
|
415
|
+
? {}
|
|
416
|
+
: ProtoPackage.objectValue(name, value.exports, "package.json exports"),
|
|
417
|
+
};
|
|
418
|
+
},
|
|
419
|
+
readJson(path, name) {
|
|
420
|
+
let descriptor;
|
|
421
|
+
try {
|
|
422
|
+
descriptor = openSync(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
423
|
+
if (!fstatSync(descriptor).isFile())
|
|
424
|
+
throw new Error("unsafe JSON input");
|
|
425
|
+
return JSON.parse(readFileSync(descriptor, "utf8"));
|
|
426
|
+
}
|
|
427
|
+
catch {
|
|
428
|
+
return ProtoPackageErrors.fail(name, `cannot read ${path.split(sep).at(-1) ?? path}`);
|
|
429
|
+
}
|
|
430
|
+
finally {
|
|
431
|
+
if (descriptor !== undefined)
|
|
432
|
+
closeSync(descriptor);
|
|
433
|
+
}
|
|
434
|
+
},
|
|
435
|
+
objectValue(name, value, label) {
|
|
436
|
+
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
437
|
+
return ProtoPackageErrors.fail(name, `${label} must be an object`);
|
|
438
|
+
return value;
|
|
439
|
+
},
|
|
440
|
+
stringValue(name, value, label) {
|
|
441
|
+
if (typeof value !== "string" || value.length === 0)
|
|
442
|
+
return ProtoPackageErrors.fail(name, `${label} must be a non-empty string`);
|
|
443
|
+
return value;
|
|
444
|
+
},
|
|
445
|
+
stringList(name, value, label) {
|
|
446
|
+
if (!Array.isArray(value))
|
|
447
|
+
ProtoPackageErrors.fail(name, `${label} must be an array of non-empty strings`);
|
|
448
|
+
if (value.length > 10000)
|
|
449
|
+
ProtoPackageErrors.fail(name, `${label} exceeds 10000 entries`);
|
|
450
|
+
const strings = value.filter((item) => typeof item === "string" && item.length > 0);
|
|
451
|
+
if (strings.length !== value.length)
|
|
452
|
+
ProtoPackageErrors.fail(name, `${label} must be an array of non-empty strings`);
|
|
453
|
+
if (new Set(strings).size !== strings.length)
|
|
454
|
+
ProtoPackageErrors.fail(name, `${label} must not contain duplicates`);
|
|
455
|
+
return strings;
|
|
456
|
+
},
|
|
457
|
+
packageNameValue(name, value, label) {
|
|
458
|
+
const packageName = ProtoPackage.stringValue(name, value, label);
|
|
459
|
+
if (!NpmPackageName.is(packageName))
|
|
460
|
+
ProtoPackageErrors.fail(name, `${label} must be a valid npm package name`);
|
|
461
|
+
return packageName;
|
|
462
|
+
},
|
|
463
|
+
packageNameList(name, value, label) {
|
|
464
|
+
return ProtoPackage.stringList(name, value, label).map((packageName) => ProtoPackage.packageNameValue(name, packageName, label));
|
|
465
|
+
},
|
|
466
|
+
assertRecordBound(name, record, label) {
|
|
467
|
+
let count = 0;
|
|
468
|
+
for (const key in record) {
|
|
469
|
+
if (!Object.hasOwn(record, key))
|
|
470
|
+
continue;
|
|
471
|
+
count += 1;
|
|
472
|
+
if (count > 10000)
|
|
473
|
+
ProtoPackageErrors.fail(name, `${label} exceeds 10000 entries`);
|
|
474
|
+
}
|
|
475
|
+
},
|
|
476
|
+
stringRecord(value, name, label) {
|
|
477
|
+
if (value === undefined)
|
|
478
|
+
return {};
|
|
479
|
+
const record = ProtoPackage.objectValue(name, value, label);
|
|
480
|
+
if (!Object.values(record).every((item) => typeof item === "string"))
|
|
481
|
+
ProtoPackageErrors.fail(name, `${label} must contain string versions`);
|
|
482
|
+
return record;
|
|
483
|
+
},
|
|
484
|
+
rejectKeys(name, value, allowed, label) {
|
|
485
|
+
const unexpected = Object.keys(value).find((key) => !allowed.includes(key));
|
|
486
|
+
if (unexpected !== undefined)
|
|
487
|
+
ProtoPackageErrors.fail(name, `${label} must not declare ${unexpected}`);
|
|
488
|
+
},
|
|
489
|
+
});
|
|
490
|
+
/**
|
|
491
|
+
* Provides access to the versioned Proto package configuration.
|
|
492
|
+
*/
|
|
493
|
+
export const ProtoConfig = Object.freeze({
|
|
494
|
+
// prettier-ignore
|
|
495
|
+
/**
|
|
496
|
+
* Reads and validates `spine-proto.json` at a package root.
|
|
497
|
+
*
|
|
498
|
+
* @param packageRoot The package root that contains the configuration.
|
|
499
|
+
* @returns The validated model or application configuration.
|
|
500
|
+
*/
|
|
501
|
+
read(packageRoot) {
|
|
502
|
+
return ProtoPackage.configFromPackage(packageRoot);
|
|
503
|
+
},
|
|
504
|
+
});
|
|
505
|
+
/**
|
|
506
|
+
* Provides access to deterministic Proto package manifests.
|
|
507
|
+
*/
|
|
508
|
+
export const ProtoManifest = Object.freeze({
|
|
509
|
+
// prettier-ignore
|
|
510
|
+
/**
|
|
511
|
+
* Reads and validates a package manifest.
|
|
512
|
+
*
|
|
513
|
+
* @param packageRoot The package root that owns the manifest.
|
|
514
|
+
* @param manifestPath The optional manifest path within the package root.
|
|
515
|
+
* @returns The validated manifest.
|
|
516
|
+
*/
|
|
517
|
+
read(packageRoot, manifestPath = join(packageRoot, "spine-proto-manifest.json")) {
|
|
518
|
+
let failure;
|
|
519
|
+
for (let attempt = 0; attempt < manifestReadAttempts; attempt += 1) {
|
|
520
|
+
try {
|
|
521
|
+
return ProtoPackage.manifestFromPackage(packageRoot, manifestPath);
|
|
522
|
+
}
|
|
523
|
+
catch (error) {
|
|
524
|
+
failure = error;
|
|
525
|
+
if (!hasLiveGenerationClaim(packageRoot))
|
|
526
|
+
throw error;
|
|
527
|
+
if (attempt + 1 < manifestReadAttempts)
|
|
528
|
+
waitForManifestCommit();
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
throw failure;
|
|
532
|
+
},
|
|
533
|
+
/**
|
|
534
|
+
* Creates a manifest from package-owned Proto paths. Without a supplied generation ID,
|
|
535
|
+
* a fresh random ID is assigned for a new generated-root marker lifecycle.
|
|
536
|
+
*
|
|
537
|
+
* @param packageRoot The model package root.
|
|
538
|
+
* @param ownedProtoFiles Optional explicit package-relative Proto paths.
|
|
539
|
+
* @param generationId Optional generation ID; a random ID is used when omitted.
|
|
540
|
+
* @returns The created manifest.
|
|
541
|
+
*/
|
|
542
|
+
create(packageRoot, ownedProtoFiles, generationId) {
|
|
543
|
+
return ProtoPackage.manifestForPackage(packageRoot, ownedProtoFiles, generationId);
|
|
544
|
+
},
|
|
545
|
+
});
|
|
546
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filesystem operations used to stage and atomically replace a manifest.
|
|
3
|
+
*/
|
|
4
|
+
export interface ManifestFileOperations {
|
|
5
|
+
/**
|
|
6
|
+
* Writes complete content to a unique staging file.
|
|
7
|
+
*
|
|
8
|
+
* @param path The staging-file path.
|
|
9
|
+
* @param content The complete content to write.
|
|
10
|
+
*/
|
|
11
|
+
readonly writeFile: (path: string, content: string) => void;
|
|
12
|
+
/**
|
|
13
|
+
* Replaces a destination manifest with a staging file.
|
|
14
|
+
*
|
|
15
|
+
* @param from The completed staging-file path.
|
|
16
|
+
* @param to The destination manifest path.
|
|
17
|
+
*/
|
|
18
|
+
readonly rename: (from: string, to: string) => void;
|
|
19
|
+
/**
|
|
20
|
+
* Removes a failed staging file.
|
|
21
|
+
*
|
|
22
|
+
* @param path The staging-file path to remove.
|
|
23
|
+
*/
|
|
24
|
+
readonly remove: (path: string) => void;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Publishes manifest files through complete sibling staging files.
|
|
28
|
+
*/
|
|
29
|
+
export declare const ManifestFile: Readonly<{
|
|
30
|
+
writeAtomically(target: string, content: string, operations?: Partial<ManifestFileOperations>): void;
|
|
31
|
+
}>;
|
|
32
|
+
//# sourceMappingURL=atomic-manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atomic-manifest.d.ts","sourceRoot":"","sources":["../../../src/io/atomic-manifest.ts"],"names":[],"mappings":"AAiBA;;GAEG;AACH,MAAM,WAAW,sBAAsB;IAGrC;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAE5D;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAEpD;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAYD;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,QAAQ,CAAC;IAClC,eAAe,CACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GAC3C,IAAI,CAAC;CACT,CAiCC,CAAC"}
|