@cms0/cms0 0.2.17 → 0.2.19
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/cjs/descriptor-sidecar.cjs +20 -0
- package/dist/cjs/generated/schema-descriptor.cjs +3 -0
- package/dist/cjs/index.cjs +135 -29
- package/dist/cjs/libs/cli/browser-sidecar.cjs +56 -0
- package/dist/cjs/libs/cli/build.cjs +2 -2
- package/dist/cjs/libs/cli/cli.cjs +8 -3
- package/dist/cjs/libs/cli/config-loader.cjs +19 -33
- package/dist/cjs/libs/cli/descriptor-writer.cjs +21 -9
- package/dist/cjs/libs/cli/paths.cjs +7 -0
- package/dist/cjs/libs/cli/watcher.cjs +5 -3
- package/dist/cjs/provenance.cjs +80 -10
- package/dist/cjs/schema-descriptors.cjs +265 -2
- package/dist/esm/descriptor-sidecar.js +16 -0
- package/dist/esm/generated/schema-descriptor.js +3 -0
- package/dist/esm/index.js +134 -30
- package/dist/esm/libs/cli/browser-sidecar.js +51 -0
- package/dist/esm/libs/cli/build.js +2 -2
- package/dist/esm/libs/cli/cli.js +8 -3
- package/dist/esm/libs/cli/config-loader.js +20 -34
- package/dist/esm/libs/cli/descriptor-writer.js +21 -11
- package/dist/esm/libs/cli/paths.js +7 -1
- package/dist/esm/libs/cli/watcher.js +5 -3
- package/dist/esm/provenance.js +78 -10
- package/dist/esm/schema-descriptors.js +261 -1
- package/dist/types/descriptor-sidecar.d.ts +5 -0
- package/dist/types/descriptor-sidecar.d.ts.map +1 -0
- package/dist/types/generated/schema-descriptor.d.ts +3 -0
- package/dist/types/generated/schema-descriptor.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/libs/cli/browser-sidecar.d.ts +9 -0
- package/dist/types/libs/cli/browser-sidecar.d.ts.map +1 -0
- package/dist/types/libs/cli/build.d.ts +2 -1
- package/dist/types/libs/cli/build.d.ts.map +1 -1
- package/dist/types/libs/cli/cli.d.ts.map +1 -1
- package/dist/types/libs/cli/config-loader.d.ts.map +1 -1
- package/dist/types/libs/cli/descriptor-writer.d.ts +11 -2
- package/dist/types/libs/cli/descriptor-writer.d.ts.map +1 -1
- package/dist/types/libs/cli/paths.d.ts +5 -1
- package/dist/types/libs/cli/paths.d.ts.map +1 -1
- package/dist/types/libs/cli/types.d.ts +1 -0
- package/dist/types/libs/cli/types.d.ts.map +1 -1
- package/dist/types/libs/cli/watcher.d.ts +2 -1
- package/dist/types/libs/cli/watcher.d.ts.map +1 -1
- package/dist/types/provenance.d.ts +3 -0
- package/dist/types/provenance.d.ts.map +1 -1
- package/dist/types/schema-descriptors.d.ts +12 -1
- package/dist/types/schema-descriptors.d.ts.map +1 -1
- package/package.json +4 -3
|
@@ -7,13 +7,13 @@ exports.startWatcher = startWatcher;
|
|
|
7
7
|
// File watcher that rebuilds descriptors on entry changes.
|
|
8
8
|
const chokidar_1 = __importDefault(require("chokidar"));
|
|
9
9
|
const build_js_1 = require("./build.cjs");
|
|
10
|
-
function startWatcher(resolved, afterBuild) {
|
|
10
|
+
function startWatcher(resolved, afterBuild, browserTarget = "sidecar", runInitialBuild = true) {
|
|
11
11
|
const watcher = chokidar_1.default.watch([resolved.entryFile], {
|
|
12
12
|
ignoreInitial: false,
|
|
13
13
|
});
|
|
14
14
|
const run = (after) => {
|
|
15
15
|
try {
|
|
16
|
-
const descriptor = (0, build_js_1.buildOnce)(resolved);
|
|
16
|
+
const descriptor = (0, build_js_1.buildOnce)(resolved, browserTarget);
|
|
17
17
|
if (after) {
|
|
18
18
|
Promise.resolve(after(descriptor)).catch((err) => {
|
|
19
19
|
console.error("cms0: post-build hook failed", err);
|
|
@@ -25,7 +25,9 @@ function startWatcher(resolved, afterBuild) {
|
|
|
25
25
|
}
|
|
26
26
|
};
|
|
27
27
|
// Trigger a build on startup and whenever the entry file changes.
|
|
28
|
-
|
|
28
|
+
if (runInitialBuild) {
|
|
29
|
+
watcher.on("ready", () => run(afterBuild));
|
|
30
|
+
}
|
|
29
31
|
watcher.on("change", () => run(afterBuild));
|
|
30
32
|
watcher.on("error", (error) => {
|
|
31
33
|
console.error("cms0: watcher error", error);
|
package/dist/cjs/provenance.cjs
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.isCms0CanvasTransportEnabled = isCms0CanvasTransportEnabled;
|
|
4
|
+
exports.dehydrateCms0CanvasTransportValue = dehydrateCms0CanvasTransportValue;
|
|
5
|
+
exports.dehydrateCms0CanvasVisibleValue = dehydrateCms0CanvasVisibleValue;
|
|
4
6
|
exports.registerCms0LiveRoot = registerCms0LiveRoot;
|
|
5
7
|
exports.registerCms0CollectionItemIdentity = registerCms0CollectionItemIdentity;
|
|
6
8
|
exports.readCms0CollectionItemIdentity = readCms0CollectionItemIdentity;
|
|
@@ -14,9 +16,6 @@ exports.readCms0CanvasTransportCollectionItemId = readCms0CanvasTransportCollect
|
|
|
14
16
|
exports.restoreCms0CanvasTransportMetadata = restoreCms0CanvasTransportMetadata;
|
|
15
17
|
exports.readCms0LiveRoots = readCms0LiveRoots;
|
|
16
18
|
exports.captureCms0Provenance = captureCms0Provenance;
|
|
17
|
-
const schema_descriptors_js_1 = require("./schema-descriptors.cjs");
|
|
18
|
-
globalThis.__CMS0_SCHEMA_DESCRIPTOR__ = schema_descriptors_js_1.schemaDescriptor;
|
|
19
|
-
globalThis.__CMS0_CANVAS_SCHEMA_DESCRIPTOR__ = schema_descriptors_js_1.schemaDescriptor;
|
|
20
19
|
const CAPTURE_STACK = [];
|
|
21
20
|
const ARRAY_METHOD_NAMES = new Set(Object.getOwnPropertyNames(Array.prototype));
|
|
22
21
|
const TRACK_IGNORED_OBJECT_KEYS = new Set([
|
|
@@ -41,9 +40,26 @@ function isCms0CanvasTransportEnabled() {
|
|
|
41
40
|
function isRootRawPath(rawPath) {
|
|
42
41
|
return rawPath.length > 0 && !rawPath.includes(".") && !rawPath.includes("[#");
|
|
43
42
|
}
|
|
44
|
-
function
|
|
43
|
+
function isWalkableCanvasTransportValue(value) {
|
|
44
|
+
if (!value || typeof value !== "object")
|
|
45
|
+
return false;
|
|
46
|
+
if (Array.isArray(value))
|
|
47
|
+
return true;
|
|
48
|
+
const record = value;
|
|
49
|
+
if ("$$typeof" in record || "__v_isVNode" in record || "_owner" in record) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
if (typeof record.then === "function") {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
const prototype = Object.getPrototypeOf(value);
|
|
56
|
+
return prototype === Object.prototype || prototype === null;
|
|
57
|
+
}
|
|
58
|
+
function cloneCanvasTransportValue(value, seen = new WeakMap(), options = {}) {
|
|
45
59
|
if (!value || typeof value !== "object")
|
|
46
60
|
return value;
|
|
61
|
+
if (!isWalkableCanvasTransportValue(value))
|
|
62
|
+
return undefined;
|
|
47
63
|
const cached = seen.get(value);
|
|
48
64
|
if (cached)
|
|
49
65
|
return cached;
|
|
@@ -51,19 +67,48 @@ function cloneCanvasTransportValue(value, seen = new WeakMap()) {
|
|
|
51
67
|
const clone = [];
|
|
52
68
|
seen.set(value, clone);
|
|
53
69
|
value.forEach((item, index) => {
|
|
54
|
-
clone[index] = cloneCanvasTransportValue(item, seen);
|
|
70
|
+
clone[index] = cloneCanvasTransportValue(item, seen, options);
|
|
55
71
|
});
|
|
72
|
+
const collectionItemId = readCms0CollectionItemIdentity(value);
|
|
73
|
+
if (collectionItemId) {
|
|
74
|
+
collectionItemIdentity.set(clone, collectionItemId);
|
|
75
|
+
}
|
|
76
|
+
if (options.attachVisibleProvenance) {
|
|
77
|
+
const meta = readCms0ProvenanceValueMeta(value);
|
|
78
|
+
if (meta?.rawPath) {
|
|
79
|
+
const wrapped = attachCms0ProvenanceRoot(clone, meta.rawPath, {
|
|
80
|
+
registerLiveRoot: false,
|
|
81
|
+
transportSerializable: options.transportSerializable,
|
|
82
|
+
});
|
|
83
|
+
seen.set(value, wrapped);
|
|
84
|
+
return wrapped;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
56
87
|
return clone;
|
|
57
88
|
}
|
|
58
89
|
const clone = {};
|
|
59
90
|
seen.set(value, clone);
|
|
60
91
|
Object.entries(value).forEach(([key, nested]) => {
|
|
61
|
-
clone[key] = cloneCanvasTransportValue(nested, seen);
|
|
92
|
+
clone[key] = cloneCanvasTransportValue(nested, seen, options);
|
|
62
93
|
});
|
|
63
94
|
const collectionItemId = readCms0CollectionItemIdentity(value);
|
|
64
|
-
if (collectionItemId) {
|
|
95
|
+
if (options.includeCollectionItemId !== false && collectionItemId) {
|
|
65
96
|
clone[CMS0_CANVAS_COLLECTION_ITEM_ID_KEY] = collectionItemId;
|
|
66
97
|
}
|
|
98
|
+
if (collectionItemId) {
|
|
99
|
+
collectionItemIdentity.set(clone, collectionItemId);
|
|
100
|
+
}
|
|
101
|
+
if (options.attachVisibleProvenance) {
|
|
102
|
+
const meta = readCms0ProvenanceValueMeta(value);
|
|
103
|
+
if (meta?.rawPath) {
|
|
104
|
+
const wrapped = attachCms0ProvenanceRoot(clone, meta.rawPath, {
|
|
105
|
+
registerLiveRoot: false,
|
|
106
|
+
transportSerializable: options.transportSerializable,
|
|
107
|
+
});
|
|
108
|
+
seen.set(value, wrapped);
|
|
109
|
+
return wrapped;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
67
112
|
return clone;
|
|
68
113
|
}
|
|
69
114
|
function wrapCanvasTransportRoot(value, rootId) {
|
|
@@ -75,6 +120,28 @@ function wrapCanvasTransportRoot(value, rootId) {
|
|
|
75
120
|
[CMS0_CANVAS_TRANSPORT_DATA_KEY]: cloneCanvasTransportValue(value),
|
|
76
121
|
};
|
|
77
122
|
}
|
|
123
|
+
function dehydrateCms0CanvasTransportValue(value) {
|
|
124
|
+
if (!value || typeof value !== "object") {
|
|
125
|
+
return value;
|
|
126
|
+
}
|
|
127
|
+
const meta = readCms0ProvenanceValueMeta(value);
|
|
128
|
+
if (meta?.rawPath) {
|
|
129
|
+
return wrapCanvasTransportRoot(value, meta.rawPath);
|
|
130
|
+
}
|
|
131
|
+
return cloneCanvasTransportValue(value, new WeakMap(), {
|
|
132
|
+
includeCollectionItemId: true,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
function dehydrateCms0CanvasVisibleValue(value) {
|
|
136
|
+
if (!value || typeof value !== "object") {
|
|
137
|
+
return value;
|
|
138
|
+
}
|
|
139
|
+
return cloneCanvasTransportValue(value, new WeakMap(), {
|
|
140
|
+
attachVisibleProvenance: true,
|
|
141
|
+
includeCollectionItemId: false,
|
|
142
|
+
transportSerializable: false,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
78
145
|
function supportsWeakRef() {
|
|
79
146
|
return typeof WeakRef !== "undefined";
|
|
80
147
|
}
|
|
@@ -345,7 +412,7 @@ function buildEntityLineage(inheritedEntityIds, rawPath, value) {
|
|
|
345
412
|
[rawPath]: entityId,
|
|
346
413
|
};
|
|
347
414
|
}
|
|
348
|
-
function wrapWithProvenance(value, pathTokens, inheritedEntityIds = {}) {
|
|
415
|
+
function wrapWithProvenance(value, pathTokens, inheritedEntityIds = {}, options = {}) {
|
|
349
416
|
if (!provenanceEnabled)
|
|
350
417
|
return value;
|
|
351
418
|
if (!value || typeof value !== "object")
|
|
@@ -360,6 +427,7 @@ function wrapWithProvenance(value, pathTokens, inheritedEntityIds = {}) {
|
|
|
360
427
|
const proxy = new Proxy(objectValue, {
|
|
361
428
|
get(target, property, receiver) {
|
|
362
429
|
if (property === "toJSON" &&
|
|
430
|
+
options.transportSerializable !== false &&
|
|
363
431
|
isCanvasTransportEnabled() &&
|
|
364
432
|
isRootRawPath(pathKey)) {
|
|
365
433
|
return () => wrapCanvasTransportRoot(target, pathKey);
|
|
@@ -371,7 +439,7 @@ function wrapWithProvenance(value, pathTokens, inheritedEntityIds = {}) {
|
|
|
371
439
|
if (!trackedToken)
|
|
372
440
|
return result;
|
|
373
441
|
const nextPath = [...pathTokens, trackedToken];
|
|
374
|
-
const wrappedResult = wrapWithProvenance(result, nextPath, buildEntityLineage(currentEntityIds, nextPath.join("."), result));
|
|
442
|
+
const wrappedResult = wrapWithProvenance(result, nextPath, buildEntityLineage(currentEntityIds, nextPath.join("."), result), options);
|
|
375
443
|
recordPath(nextPath);
|
|
376
444
|
recordCapture(nextPath, wrappedResult);
|
|
377
445
|
return wrappedResult;
|
|
@@ -409,7 +477,9 @@ function attachCms0ProvenanceRoot(value, rootId, options) {
|
|
|
409
477
|
const normalizedRoot = typeof rootId === "string" ? rootId.trim() : "";
|
|
410
478
|
if (!normalizedRoot)
|
|
411
479
|
return value;
|
|
412
|
-
const wrapped = wrapWithProvenance(value, [normalizedRoot]
|
|
480
|
+
const wrapped = wrapWithProvenance(value, [normalizedRoot], {}, {
|
|
481
|
+
transportSerializable: options?.transportSerializable,
|
|
482
|
+
});
|
|
413
483
|
if (options?.registerLiveRoot !== false &&
|
|
414
484
|
wrapped &&
|
|
415
485
|
typeof wrapped === "object") {
|
|
@@ -1,5 +1,268 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.schemaDescriptor = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
exports.readLocalSchemaDescriptor = readLocalSchemaDescriptor;
|
|
5
|
+
exports.resolveBrowserSchemaDescriptor = resolveBrowserSchemaDescriptor;
|
|
6
|
+
exports.getActiveSchemaDescriptor = getActiveSchemaDescriptor;
|
|
7
|
+
exports.syncActiveSchemaDescriptorGlobals = syncActiveSchemaDescriptorGlobals;
|
|
8
|
+
const schema_descriptor_1 = require("@cms0/cms0/generated/schema-descriptor");
|
|
9
|
+
const descriptor_sidecar_js_1 = require("./descriptor-sidecar.cjs");
|
|
10
|
+
const LOCAL_DESCRIPTOR_RELATIVE_SEGMENTS = [
|
|
11
|
+
".cms0",
|
|
12
|
+
"generated",
|
|
13
|
+
"schema-descriptor.json",
|
|
14
|
+
];
|
|
15
|
+
let cachedLocalDescriptor = null;
|
|
16
|
+
const browserDescriptorPromiseCache = new Map();
|
|
17
|
+
exports.schemaDescriptor = schema_descriptor_1.schemaDescriptor;
|
|
18
|
+
function setSchemaDescriptorGlobals(descriptor) {
|
|
19
|
+
const globals = globalThis;
|
|
20
|
+
globals.__CMS0_SCHEMA_DESCRIPTOR__ = descriptor;
|
|
21
|
+
globals.__CMS0_CANVAS_SCHEMA_DESCRIPTOR__ = descriptor;
|
|
22
|
+
return descriptor;
|
|
23
|
+
}
|
|
24
|
+
function createMissingBrowserDescriptorError() {
|
|
25
|
+
return new Error("cms0: no browser schema descriptor is active. Start the cms0 sidecar so the browser can load the descriptor generated from .cms0. Bundled package descriptors are not used at runtime.");
|
|
26
|
+
}
|
|
27
|
+
function createMissingLocalDescriptorError() {
|
|
28
|
+
return new Error("cms0: no local schema descriptor was found. Expected .cms0/generated/schema-descriptor.json near the current project root. Run cms0 dev or cms0 build before calling cms0().");
|
|
29
|
+
}
|
|
30
|
+
function getBuiltinModule(specifier) {
|
|
31
|
+
const runtimeProcess = globalThis.process;
|
|
32
|
+
if (typeof runtimeProcess?.getBuiltinModule === "function") {
|
|
33
|
+
try {
|
|
34
|
+
return runtimeProcess.getBuiltinModule(specifier);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Ignore missing builtins and fall through.
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
const runtimeRequire = Function("try { return require; } catch { return undefined; }")();
|
|
42
|
+
if (runtimeRequire) {
|
|
43
|
+
return runtimeRequire(specifier);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// Ignore runtime require failures outside Node/CommonJS.
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
function getNodeFs() {
|
|
52
|
+
return (getBuiltinModule("node:fs") ??
|
|
53
|
+
getBuiltinModule("fs"));
|
|
54
|
+
}
|
|
55
|
+
function getNodePath() {
|
|
56
|
+
return (getBuiltinModule("node:path") ??
|
|
57
|
+
getBuiltinModule("path"));
|
|
58
|
+
}
|
|
59
|
+
function getNodeUrl() {
|
|
60
|
+
return (getBuiltinModule("node:url") ??
|
|
61
|
+
getBuiltinModule("url"));
|
|
62
|
+
}
|
|
63
|
+
function isRecord(value) {
|
|
64
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
65
|
+
}
|
|
66
|
+
function isFullDescriptor(value) {
|
|
67
|
+
return isRecord(value) && isRecord(value.models) && isRecord(value.roots);
|
|
68
|
+
}
|
|
69
|
+
function dedupePaths(values) {
|
|
70
|
+
const seen = new Set();
|
|
71
|
+
const result = [];
|
|
72
|
+
for (const value of values) {
|
|
73
|
+
const normalized = value.trim();
|
|
74
|
+
if (!normalized || seen.has(normalized))
|
|
75
|
+
continue;
|
|
76
|
+
seen.add(normalized);
|
|
77
|
+
result.push(normalized);
|
|
78
|
+
}
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
function parseStackFramePath(line) {
|
|
82
|
+
const urlModule = getNodeUrl();
|
|
83
|
+
const directMatch = line.match(/\((file:\/\/[^)]+|\/[^)]+):\d+:\d+\)$/) ??
|
|
84
|
+
line.match(/at (file:\/\/\S+|\/\S+):\d+:\d+$/);
|
|
85
|
+
const rawPath = directMatch?.[1];
|
|
86
|
+
if (!rawPath)
|
|
87
|
+
return null;
|
|
88
|
+
if (rawPath.startsWith("file://")) {
|
|
89
|
+
if (urlModule) {
|
|
90
|
+
try {
|
|
91
|
+
return urlModule.fileURLToPath(rawPath);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
try {
|
|
98
|
+
return decodeURIComponent(new URL(rawPath).pathname);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return rawPath;
|
|
105
|
+
}
|
|
106
|
+
function resolveSchemaDescriptorSearchRoots() {
|
|
107
|
+
const pathModule = getNodePath();
|
|
108
|
+
if (!pathModule || typeof process === "undefined") {
|
|
109
|
+
return [];
|
|
110
|
+
}
|
|
111
|
+
const roots = [];
|
|
112
|
+
const projectRootOverride = process.env.CMS0_PROJECT_ROOT;
|
|
113
|
+
if (typeof projectRootOverride === "string" && projectRootOverride.trim()) {
|
|
114
|
+
roots.push(pathModule.resolve(projectRootOverride));
|
|
115
|
+
}
|
|
116
|
+
const descriptorPathOverride = process.env.CMS0_SCHEMA_DESCRIPTOR_PATH;
|
|
117
|
+
if (typeof descriptorPathOverride === "string" && descriptorPathOverride.trim()) {
|
|
118
|
+
roots.push(pathModule.dirname(pathModule.resolve(descriptorPathOverride)));
|
|
119
|
+
}
|
|
120
|
+
const stack = new Error().stack ?? "";
|
|
121
|
+
for (const line of stack.split("\n").slice(1)) {
|
|
122
|
+
const filePath = parseStackFramePath(line);
|
|
123
|
+
if (!filePath)
|
|
124
|
+
continue;
|
|
125
|
+
roots.push(pathModule.dirname(pathModule.resolve(filePath)));
|
|
126
|
+
}
|
|
127
|
+
if (typeof process.cwd === "function") {
|
|
128
|
+
roots.push(pathModule.resolve(process.cwd()));
|
|
129
|
+
}
|
|
130
|
+
return dedupePaths(roots);
|
|
131
|
+
}
|
|
132
|
+
function resolveLocalSchemaDescriptorPath(searchRoots) {
|
|
133
|
+
const fs = getNodeFs();
|
|
134
|
+
const pathModule = getNodePath();
|
|
135
|
+
if (!fs || !pathModule) {
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
const directOverride = process.env.CMS0_SCHEMA_DESCRIPTOR_PATH;
|
|
139
|
+
if (typeof directOverride === "string" && directOverride.trim()) {
|
|
140
|
+
const resolvedDirectOverride = pathModule.resolve(directOverride);
|
|
141
|
+
if (fs.existsSync(resolvedDirectOverride)) {
|
|
142
|
+
return resolvedDirectOverride;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
for (const root of searchRoots) {
|
|
146
|
+
let current = pathModule.resolve(root);
|
|
147
|
+
while (true) {
|
|
148
|
+
const candidate = pathModule.join(current, ...LOCAL_DESCRIPTOR_RELATIVE_SEGMENTS);
|
|
149
|
+
if (fs.existsSync(candidate)) {
|
|
150
|
+
return candidate;
|
|
151
|
+
}
|
|
152
|
+
const parent = pathModule.dirname(current);
|
|
153
|
+
if (parent === current)
|
|
154
|
+
break;
|
|
155
|
+
current = parent;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
function readLocalSchemaDescriptor(searchRoots = resolveSchemaDescriptorSearchRoots()) {
|
|
161
|
+
const fs = getNodeFs();
|
|
162
|
+
if (!fs) {
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
const descriptorPath = resolveLocalSchemaDescriptorPath(searchRoots);
|
|
166
|
+
if (!descriptorPath) {
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
try {
|
|
170
|
+
const stat = fs.statSync(descriptorPath);
|
|
171
|
+
if (cachedLocalDescriptor &&
|
|
172
|
+
cachedLocalDescriptor.path === descriptorPath &&
|
|
173
|
+
cachedLocalDescriptor.mtimeMs === stat.mtimeMs) {
|
|
174
|
+
return cachedLocalDescriptor.descriptor;
|
|
175
|
+
}
|
|
176
|
+
const parsed = JSON.parse(fs.readFileSync(descriptorPath, "utf8"));
|
|
177
|
+
if (!isFullDescriptor(parsed)) {
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
cachedLocalDescriptor = {
|
|
181
|
+
descriptor: parsed,
|
|
182
|
+
mtimeMs: stat.mtimeMs,
|
|
183
|
+
path: descriptorPath,
|
|
184
|
+
};
|
|
185
|
+
return parsed;
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
function readGlobalSchemaDescriptor() {
|
|
192
|
+
const globals = globalThis;
|
|
193
|
+
const activeDescriptor = globals.__CMS0_CANVAS_SCHEMA_DESCRIPTOR__ ?? globals.__CMS0_SCHEMA_DESCRIPTOR__;
|
|
194
|
+
return isFullDescriptor(activeDescriptor) ? activeDescriptor : null;
|
|
195
|
+
}
|
|
196
|
+
function isBundledFallbackDescriptor(descriptor) {
|
|
197
|
+
return (isRecord(descriptor.metadata) &&
|
|
198
|
+
descriptor.metadata.__cms0Fallback === true);
|
|
199
|
+
}
|
|
200
|
+
function readBundledBrowserDescriptor() {
|
|
201
|
+
const descriptor = schema_descriptor_1.schemaDescriptor;
|
|
202
|
+
return isBundledFallbackDescriptor(descriptor) ? null : descriptor;
|
|
203
|
+
}
|
|
204
|
+
function createBrowserDescriptorFetchError(sidecarUrl, reason) {
|
|
205
|
+
const details = reason ? ` ${reason}` : "";
|
|
206
|
+
return new Error(`cms0: failed to load the browser schema descriptor from ${sidecarUrl}.${details} Start the cms0 sidecar before calling cms0() in the browser.`);
|
|
207
|
+
}
|
|
208
|
+
async function resolveBrowserSchemaDescriptor(baseUrl, apiKey) {
|
|
209
|
+
const injectedDescriptor = readGlobalSchemaDescriptor();
|
|
210
|
+
if (injectedDescriptor) {
|
|
211
|
+
return setSchemaDescriptorGlobals(injectedDescriptor);
|
|
212
|
+
}
|
|
213
|
+
const bundledDescriptor = readBundledBrowserDescriptor();
|
|
214
|
+
if (bundledDescriptor) {
|
|
215
|
+
return setSchemaDescriptorGlobals(bundledDescriptor);
|
|
216
|
+
}
|
|
217
|
+
const sidecarUrl = (0, descriptor_sidecar_js_1.getCms0DescriptorSidecarUrl)(baseUrl, apiKey);
|
|
218
|
+
const cachedPromise = browserDescriptorPromiseCache.get(sidecarUrl);
|
|
219
|
+
if (cachedPromise) {
|
|
220
|
+
return cachedPromise;
|
|
221
|
+
}
|
|
222
|
+
const descriptorPromise = (async () => {
|
|
223
|
+
try {
|
|
224
|
+
const response = await fetch(sidecarUrl, {
|
|
225
|
+
headers: {
|
|
226
|
+
accept: "application/json",
|
|
227
|
+
},
|
|
228
|
+
});
|
|
229
|
+
if (!response.ok) {
|
|
230
|
+
throw createBrowserDescriptorFetchError(sidecarUrl, `HTTP ${response.status}`);
|
|
231
|
+
}
|
|
232
|
+
const parsed = await response.json();
|
|
233
|
+
if (!isFullDescriptor(parsed)) {
|
|
234
|
+
throw createBrowserDescriptorFetchError(sidecarUrl, "Received an invalid descriptor payload.");
|
|
235
|
+
}
|
|
236
|
+
return setSchemaDescriptorGlobals(parsed);
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
browserDescriptorPromiseCache.delete(sidecarUrl);
|
|
240
|
+
if (error instanceof Error) {
|
|
241
|
+
throw createBrowserDescriptorFetchError(sidecarUrl, error.message);
|
|
242
|
+
}
|
|
243
|
+
throw createBrowserDescriptorFetchError(sidecarUrl);
|
|
244
|
+
}
|
|
245
|
+
})();
|
|
246
|
+
browserDescriptorPromiseCache.set(sidecarUrl, descriptorPromise);
|
|
247
|
+
return descriptorPromise;
|
|
248
|
+
}
|
|
249
|
+
function getActiveSchemaDescriptor() {
|
|
250
|
+
if (typeof window !== "undefined") {
|
|
251
|
+
const injectedDescriptor = readGlobalSchemaDescriptor();
|
|
252
|
+
if (!injectedDescriptor) {
|
|
253
|
+
throw createMissingBrowserDescriptorError();
|
|
254
|
+
}
|
|
255
|
+
return setSchemaDescriptorGlobals(injectedDescriptor);
|
|
256
|
+
}
|
|
257
|
+
return setSchemaDescriptorGlobals(resolveActiveSchemaDescriptor());
|
|
258
|
+
}
|
|
259
|
+
function resolveActiveSchemaDescriptor() {
|
|
260
|
+
const localDescriptor = readLocalSchemaDescriptor();
|
|
261
|
+
if (!localDescriptor) {
|
|
262
|
+
throw createMissingLocalDescriptorError();
|
|
263
|
+
}
|
|
264
|
+
return localDescriptor;
|
|
265
|
+
}
|
|
266
|
+
function syncActiveSchemaDescriptorGlobals() {
|
|
267
|
+
return setSchemaDescriptorGlobals(getActiveSchemaDescriptor());
|
|
268
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
function hashCms0SidecarSeed(seed) {
|
|
2
|
+
let hash = 5381;
|
|
3
|
+
for (let index = 0; index < seed.length; index += 1) {
|
|
4
|
+
hash = ((hash << 5) + hash + seed.charCodeAt(index)) >>> 0;
|
|
5
|
+
}
|
|
6
|
+
return hash >>> 0;
|
|
7
|
+
}
|
|
8
|
+
function getCms0DescriptorSidecarPort(baseUrl, apiKey) {
|
|
9
|
+
const seed = `${baseUrl?.trim() ?? ""}|${apiKey?.trim() ?? ""}`;
|
|
10
|
+
return 43129 + (hashCms0SidecarSeed(seed) % 1000);
|
|
11
|
+
}
|
|
12
|
+
function getCms0DescriptorSidecarUrl(baseUrl, apiKey) {
|
|
13
|
+
const port = getCms0DescriptorSidecarPort(baseUrl, apiKey);
|
|
14
|
+
return `http://127.0.0.1:${port}/schema-descriptor`;
|
|
15
|
+
}
|
|
16
|
+
export { getCms0DescriptorSidecarPort, getCms0DescriptorSidecarUrl, hashCms0SidecarSeed, };
|