@cms0/cms0 0.0.1
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/bin/cms0.js +30 -0
- package/dist/cjs/cli.cjs +7 -0
- package/dist/cjs/config.cjs +6 -0
- package/dist/cjs/generated/schema-descriptor.cjs +523 -0
- package/dist/cjs/index.cjs +48 -0
- package/dist/cjs/libs/cli/build.cjs +14 -0
- package/dist/cjs/libs/cli/cli.cjs +64 -0
- package/dist/cjs/libs/cli/config-loader.cjs +211 -0
- package/dist/cjs/libs/cli/descriptor-builder-alt.cjs +221 -0
- package/dist/cjs/libs/cli/descriptor-builder.cjs +232 -0
- package/dist/cjs/libs/cli/descriptor-writer.cjs +23 -0
- package/dist/cjs/libs/cli/index.cjs +10 -0
- package/dist/cjs/libs/cli/paths.cjs +28 -0
- package/dist/cjs/libs/cli/publisher.cjs +103 -0
- package/dist/cjs/libs/cli/types.cjs +3 -0
- package/dist/cjs/libs/cli/watcher.cjs +34 -0
- package/dist/cjs/schema-descriptors.cjs +5 -0
- package/dist/cjs/utils/index.cjs +2 -0
- package/dist/esm/cli.js +5 -0
- package/dist/esm/config.js +3 -0
- package/dist/esm/generated/schema-descriptor.js +520 -0
- package/dist/esm/index.js +45 -0
- package/dist/esm/libs/cli/build.js +12 -0
- package/dist/esm/libs/cli/cli.js +62 -0
- package/dist/esm/libs/cli/config-loader.js +168 -0
- package/dist/esm/libs/cli/descriptor-builder-alt.js +216 -0
- package/dist/esm/libs/cli/descriptor-builder.js +227 -0
- package/dist/esm/libs/cli/descriptor-writer.js +18 -0
- package/dist/esm/libs/cli/index.js +4 -0
- package/dist/esm/libs/cli/paths.js +21 -0
- package/dist/esm/libs/cli/publisher.js +101 -0
- package/dist/esm/libs/cli/types.js +2 -0
- package/dist/esm/libs/cli/watcher.js +29 -0
- package/dist/esm/schema-descriptors.js +1 -0
- package/dist/esm/utils/index.js +1 -0
- package/dist/types/cli.d.ts +3 -0
- package/dist/types/cli.d.ts.map +1 -0
- package/dist/types/config.d.ts +22 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/generated/schema-descriptor.d.ts +520 -0
- package/dist/types/generated/schema-descriptor.d.ts.map +1 -0
- package/dist/types/index.d.ts +14 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/libs/cli/build.d.ts +5 -0
- package/dist/types/libs/cli/build.d.ts.map +1 -0
- package/dist/types/libs/cli/cli.d.ts +3 -0
- package/dist/types/libs/cli/cli.d.ts.map +1 -0
- package/dist/types/libs/cli/config-loader.d.ts +12 -0
- package/dist/types/libs/cli/config-loader.d.ts.map +1 -0
- package/dist/types/libs/cli/descriptor-builder-alt.d.ts +5 -0
- package/dist/types/libs/cli/descriptor-builder-alt.d.ts.map +1 -0
- package/dist/types/libs/cli/descriptor-builder.d.ts +5 -0
- package/dist/types/libs/cli/descriptor-builder.d.ts.map +1 -0
- package/dist/types/libs/cli/descriptor-writer.d.ts +4 -0
- package/dist/types/libs/cli/descriptor-writer.d.ts.map +1 -0
- package/dist/types/libs/cli/index.d.ts +4 -0
- package/dist/types/libs/cli/index.d.ts.map +1 -0
- package/dist/types/libs/cli/paths.d.ts +4 -0
- package/dist/types/libs/cli/paths.d.ts.map +1 -0
- package/dist/types/libs/cli/publisher.d.ts +5 -0
- package/dist/types/libs/cli/publisher.d.ts.map +1 -0
- package/dist/types/libs/cli/types.d.ts +8 -0
- package/dist/types/libs/cli/types.d.ts.map +1 -0
- package/dist/types/libs/cli/watcher.d.ts +5 -0
- package/dist/types/libs/cli/watcher.d.ts.map +1 -0
- package/dist/types/schema-descriptors.d.ts +2 -0
- package/dist/types/schema-descriptors.d.ts.map +1 -0
- package/dist/types/utils/index.d.ts +2 -0
- package/dist/types/utils/index.d.ts.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
2
|
+
const startSpinner = (label) => {
|
|
3
|
+
if (!process.stdout.isTTY) {
|
|
4
|
+
console.log(`${label}...`);
|
|
5
|
+
return {
|
|
6
|
+
stop: (message) => {
|
|
7
|
+
if (message)
|
|
8
|
+
console.log(message);
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
const frames = ["|", "/", "-", "\\"];
|
|
13
|
+
let idx = 0;
|
|
14
|
+
const timer = setInterval(() => {
|
|
15
|
+
const frame = frames[idx % frames.length];
|
|
16
|
+
idx += 1;
|
|
17
|
+
process.stdout.write(`\r${frame} ${label}`);
|
|
18
|
+
}, 120);
|
|
19
|
+
return {
|
|
20
|
+
stop: (message) => {
|
|
21
|
+
clearInterval(timer);
|
|
22
|
+
process.stdout.write("\r");
|
|
23
|
+
if (message)
|
|
24
|
+
process.stdout.write(`${message}\n`);
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
async function waitForAdminReady(baseUrl, headers) {
|
|
29
|
+
const healthUrl = `${baseUrl.replace(/\/$/, "")}/ok`;
|
|
30
|
+
const maxWaitMs = 30_000;
|
|
31
|
+
const startedAt = Date.now();
|
|
32
|
+
const spinner = startSpinner("cms0: waiting for admin to reload");
|
|
33
|
+
await sleep(250);
|
|
34
|
+
let attempt = 0;
|
|
35
|
+
while (Date.now() - startedAt < maxWaitMs) {
|
|
36
|
+
attempt += 1;
|
|
37
|
+
try {
|
|
38
|
+
const res = await fetch(healthUrl, { headers });
|
|
39
|
+
if (res.ok) {
|
|
40
|
+
spinner.stop("cms0: admin ready");
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// ignore transient errors during restart
|
|
46
|
+
}
|
|
47
|
+
await sleep(Math.min(500 + attempt * 250, 2000));
|
|
48
|
+
}
|
|
49
|
+
spinner.stop("cms0: admin restart timed out");
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
async function publishDescriptor(resolved, descriptor) {
|
|
53
|
+
if (!resolved.apiBaseUrl)
|
|
54
|
+
return;
|
|
55
|
+
try {
|
|
56
|
+
const payload = {
|
|
57
|
+
version: new Date().toISOString(),
|
|
58
|
+
descriptor,
|
|
59
|
+
};
|
|
60
|
+
const headers = {
|
|
61
|
+
"Content-Type": "application/json",
|
|
62
|
+
};
|
|
63
|
+
if (resolved.apiKey) {
|
|
64
|
+
headers["Authorization"] = `Bearer ${resolved.apiKey}`;
|
|
65
|
+
}
|
|
66
|
+
const target = `${resolved.apiBaseUrl.replace(/\/$/, "")}/schema`;
|
|
67
|
+
const maxAttempts = 5;
|
|
68
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
69
|
+
try {
|
|
70
|
+
const res = await fetch(target, {
|
|
71
|
+
method: "POST",
|
|
72
|
+
headers,
|
|
73
|
+
body: JSON.stringify(payload),
|
|
74
|
+
});
|
|
75
|
+
if (!res.ok) {
|
|
76
|
+
throw new Error(`status ${res.status}`);
|
|
77
|
+
}
|
|
78
|
+
const ready = await waitForAdminReady(resolved.apiBaseUrl.replace(/\/$/, ""), headers);
|
|
79
|
+
if (!ready) {
|
|
80
|
+
console.warn("cms0: publish succeeded, but admin did not become healthy in time.");
|
|
81
|
+
}
|
|
82
|
+
console.log(`cms0: published descriptor to ${target}`);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
const waitMs = Math.min(2000 * attempt, 5000);
|
|
87
|
+
console.warn(`cms0: publish attempt ${attempt}/${maxAttempts} failed (${err instanceof Error ? err.message : err}).` + (attempt < maxAttempts ? ` retrying in ${waitMs}ms...` : ""));
|
|
88
|
+
if (attempt < maxAttempts) {
|
|
89
|
+
await new Promise((r) => setTimeout(r, waitMs));
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
console.warn("cms0: giving up on publishing descriptor for now.");
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
console.warn(`cms0: failed to publish descriptor ${err instanceof Error ? err.message : err}`, err);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export { publishDescriptor };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// File watcher that rebuilds descriptors on entry changes.
|
|
2
|
+
import chokidar from "chokidar";
|
|
3
|
+
import { buildOnce } from "./build.js";
|
|
4
|
+
function startWatcher(resolved, afterBuild) {
|
|
5
|
+
const watcher = chokidar.watch([resolved.entryFile], {
|
|
6
|
+
ignoreInitial: false,
|
|
7
|
+
});
|
|
8
|
+
const run = (after) => {
|
|
9
|
+
try {
|
|
10
|
+
const descriptor = buildOnce(resolved);
|
|
11
|
+
if (after) {
|
|
12
|
+
Promise.resolve(after(descriptor)).catch((err) => {
|
|
13
|
+
console.error("cms0: post-build hook failed", err);
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
console.error("cms0: generation failed", err);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
// Trigger a build on startup and whenever the entry file changes.
|
|
22
|
+
watcher.on("ready", () => run(afterBuild));
|
|
23
|
+
watcher.on("change", () => run(afterBuild));
|
|
24
|
+
watcher.on("error", (error) => {
|
|
25
|
+
console.error("cms0: watcher error", error);
|
|
26
|
+
});
|
|
27
|
+
return watcher;
|
|
28
|
+
}
|
|
29
|
+
export { startWatcher };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { schemaDescriptor } from "@cms0/cms0/generated/schema-descriptor";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type Cms0Config = {
|
|
2
|
+
/**
|
|
3
|
+
* Path to the file that calls cms0<T>(), relative to this config file.
|
|
4
|
+
*/
|
|
5
|
+
entry: string;
|
|
6
|
+
/**
|
|
7
|
+
* Optional path to tsconfig to use for type analysis, relative to this config file.
|
|
8
|
+
* If omitted, the CLI will walk up from the entry file to find a tsconfig.json.
|
|
9
|
+
*/
|
|
10
|
+
tsconfig?: string;
|
|
11
|
+
/**
|
|
12
|
+
* Optional API configuration. Used by the SDK as a default and by the generator
|
|
13
|
+
* to publish descriptors to the admin API.
|
|
14
|
+
*/
|
|
15
|
+
api: Cms0APIConfig;
|
|
16
|
+
};
|
|
17
|
+
export type Cms0APIConfig = {
|
|
18
|
+
baseUrl?: string;
|
|
19
|
+
key?: string;
|
|
20
|
+
};
|
|
21
|
+
export declare function defineConfig(config: Cms0Config): Cms0Config;
|
|
22
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IACvB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,GAAG,EAAE,aAAa,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAE3D"}
|