@betterportal/framework 10.1.32 → 10.1.34

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.
Files changed (76) hide show
  1. package/lib/adapters/h3.d.ts +4 -4
  2. package/lib/adapters/h3.d.ts.map +1 -1
  3. package/lib/adapters/h3.js +67 -4
  4. package/lib/adapters/h3.js.map +1 -1
  5. package/lib/cli/bp.d.ts +3 -0
  6. package/lib/cli/bp.d.ts.map +1 -0
  7. package/lib/cli/bp.js +73 -0
  8. package/lib/cli/bp.js.map +1 -0
  9. package/lib/cli/client.d.ts +12 -0
  10. package/lib/cli/client.d.ts.map +1 -0
  11. package/lib/cli/client.js +327 -0
  12. package/lib/cli/client.js.map +1 -0
  13. package/lib/cli/contract.d.ts +6 -0
  14. package/lib/cli/contract.d.ts.map +1 -0
  15. package/lib/cli/contract.js +47 -0
  16. package/lib/cli/contract.js.map +1 -0
  17. package/lib/cli/project.d.ts +36 -0
  18. package/lib/cli/project.d.ts.map +1 -0
  19. package/lib/cli/project.js +69 -0
  20. package/lib/cli/project.js.map +1 -0
  21. package/lib/cli/publish.d.ts +2 -0
  22. package/lib/cli/publish.d.ts.map +1 -0
  23. package/lib/cli/publish.js +47 -0
  24. package/lib/cli/publish.js.map +1 -0
  25. package/lib/codegen/init.js +37 -7
  26. package/lib/codegen/init.js.map +1 -1
  27. package/lib/contracts/common.d.ts +2 -0
  28. package/lib/contracts/common.d.ts.map +1 -1
  29. package/lib/contracts/common.js +2 -1
  30. package/lib/contracts/common.js.map +1 -1
  31. package/lib/contracts/controlPlane.d.ts +26 -1
  32. package/lib/contracts/controlPlane.d.ts.map +1 -1
  33. package/lib/contracts/m2m.d.ts +15 -0
  34. package/lib/contracts/m2m.d.ts.map +1 -1
  35. package/lib/contracts/m2m.js +15 -0
  36. package/lib/contracts/m2m.js.map +1 -1
  37. package/lib/contracts/manifest.d.ts +231 -0
  38. package/lib/contracts/manifest.d.ts.map +1 -1
  39. package/lib/contracts/manifest.js +32 -3
  40. package/lib/contracts/manifest.js.map +1 -1
  41. package/lib/contracts/platformConfig.d.ts +2 -0
  42. package/lib/contracts/platformConfig.d.ts.map +1 -1
  43. package/lib/contracts/platformConfig.js +1 -0
  44. package/lib/contracts/platformConfig.js.map +1 -1
  45. package/lib/contracts/route.d.ts +14 -1
  46. package/lib/contracts/route.d.ts.map +1 -1
  47. package/lib/contracts/route.js +7 -2
  48. package/lib/contracts/route.js.map +1 -1
  49. package/lib/index.d.ts +3 -0
  50. package/lib/index.d.ts.map +1 -1
  51. package/lib/index.js +3 -0
  52. package/lib/index.js.map +1 -1
  53. package/lib/runtime/auth/keypair.d.ts +1 -0
  54. package/lib/runtime/auth/keypair.d.ts.map +1 -1
  55. package/lib/runtime/auth/keypair.js +14 -5
  56. package/lib/runtime/auth/keypair.js.map +1 -1
  57. package/lib/runtime/auth/serviceToken.d.ts +34 -0
  58. package/lib/runtime/auth/serviceToken.d.ts.map +1 -0
  59. package/lib/runtime/auth/serviceToken.js +128 -0
  60. package/lib/runtime/auth/serviceToken.js.map +1 -0
  61. package/lib/runtime/contract.d.ts +4 -0
  62. package/lib/runtime/contract.d.ts.map +1 -0
  63. package/lib/runtime/contract.js +15 -0
  64. package/lib/runtime/contract.js.map +1 -0
  65. package/lib/runtime/llms.d.ts +39 -0
  66. package/lib/runtime/llms.d.ts.map +1 -0
  67. package/lib/runtime/llms.js +174 -0
  68. package/lib/runtime/llms.js.map +1 -0
  69. package/lib/runtime/manifest.d.ts.map +1 -1
  70. package/lib/runtime/manifest.js +3 -1
  71. package/lib/runtime/manifest.js.map +1 -1
  72. package/lib/runtime/registry.d.ts +2 -18
  73. package/lib/runtime/registry.d.ts.map +1 -1
  74. package/lib/runtime/registry.js +5 -2
  75. package/lib/runtime/registry.js.map +1 -1
  76. package/package.json +2 -1
@@ -0,0 +1,327 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { contractDigest, findPackageJson, normalizeRegistryUrl, parseContract, parseDependencySelector, readContract, readJsonFile, readLock, readProjectConfig, registryRefParts, writeJsonFile } from "./project.js";
4
+ function repoRoot(start) {
5
+ let current = path.resolve(start);
6
+ while (true) {
7
+ if (fs.existsSync(path.join(current, ".git")))
8
+ return current;
9
+ const parent = path.dirname(current);
10
+ if (parent === current)
11
+ return start;
12
+ current = parent;
13
+ }
14
+ }
15
+ function contractFiles(root) {
16
+ const direct = path.join(root, "bp-contract.json");
17
+ const dir = path.join(root, "lib", "bp-contracts");
18
+ return [
19
+ ...(fs.existsSync(direct) ? [direct] : []),
20
+ ...(fs.existsSync(dir)
21
+ ? fs.readdirSync(dir).filter((name) => name.endsWith(".json")).map((name) => path.join(dir, name))
22
+ : [])
23
+ ];
24
+ }
25
+ function candidateFromRoot(root) {
26
+ if (!fs.existsSync(root) || !fs.statSync(root).isDirectory())
27
+ return [];
28
+ const config = readProjectConfig(root);
29
+ const candidates = [];
30
+ for (const file of contractFiles(root)) {
31
+ try {
32
+ candidates.push({ root, registryRef: config.registryRef, file, contract: readContract(file) });
33
+ }
34
+ catch {
35
+ // A sibling with an invalid/stale contract is not a valid local override.
36
+ }
37
+ }
38
+ return candidates;
39
+ }
40
+ function localRoots(packageDir, explicitPath) {
41
+ if (explicitPath)
42
+ return [path.resolve(packageDir, explicitPath)];
43
+ const root = repoRoot(packageDir);
44
+ const roots = new Set();
45
+ const rootPackageFile = path.join(root, "package.json");
46
+ if (fs.existsSync(rootPackageFile)) {
47
+ const rootPackage = readJsonFile(rootPackageFile);
48
+ for (const workspace of rootPackage.workspaces ?? []) {
49
+ if (!workspace.includes("*"))
50
+ roots.add(path.resolve(root, workspace));
51
+ }
52
+ }
53
+ const nodeModules = path.join(packageDir, "node_modules");
54
+ if (fs.existsSync(nodeModules))
55
+ roots.add(nodeModules);
56
+ const parent = path.dirname(root);
57
+ for (const entry of fs.readdirSync(parent, { withFileTypes: true })) {
58
+ if (entry.isDirectory())
59
+ roots.add(path.join(parent, entry.name));
60
+ }
61
+ for (const extra of (process.env.BP_DEV_PATHS ?? "").split(path.delimiter).filter(Boolean)) {
62
+ roots.add(path.resolve(packageDir, extra));
63
+ }
64
+ return [...roots];
65
+ }
66
+ function nestedPackageRoots(root) {
67
+ if (path.basename(root) !== "node_modules")
68
+ return [root];
69
+ const result = [];
70
+ for (const entry of fs.readdirSync(root, { withFileTypes: true })) {
71
+ if (!entry.isDirectory())
72
+ continue;
73
+ const first = path.join(root, entry.name);
74
+ if (entry.name.startsWith("@")) {
75
+ for (const scoped of fs.readdirSync(first, { withFileTypes: true })) {
76
+ if (scoped.isDirectory())
77
+ result.push(path.join(first, scoped.name));
78
+ }
79
+ }
80
+ else
81
+ result.push(first);
82
+ }
83
+ return result;
84
+ }
85
+ function matches(candidate, selector) {
86
+ if (selector.pluginId && candidate.contract.manifest.pluginId !== selector.pluginId)
87
+ return false;
88
+ if (selector.registryRef && candidate.registryRef !== selector.registryRef)
89
+ return false;
90
+ if (selector.shortName) {
91
+ const refName = candidate.registryRef?.split("/")[1];
92
+ const idName = candidate.contract.manifest.pluginId.split(".").at(-1);
93
+ if (selector.shortName !== refName && selector.shortName !== idName)
94
+ return false;
95
+ }
96
+ return true;
97
+ }
98
+ function findLocal(packageDir, selector, explicitPath) {
99
+ const found = localRoots(packageDir, explicitPath)
100
+ .flatMap(nestedPackageRoots)
101
+ .flatMap(candidateFromRoot)
102
+ .filter((candidate) => matches(candidate, selector));
103
+ const identities = new Set(found.map((candidate) => `${candidate.registryRef ?? ""}|${candidate.contract.manifest.pluginId}`));
104
+ if (identities.size > 1) {
105
+ throw new Error(`Local dependency selector "${selector.raw}" is ambiguous: ${found.map((item) => item.root).join(", ")}`);
106
+ }
107
+ return found[0] ?? null;
108
+ }
109
+ async function fetchRegistry(selector) {
110
+ const base = normalizeRegistryUrl();
111
+ const version = encodeURIComponent(selector.version ?? "latest");
112
+ let url;
113
+ if (selector.registryRef) {
114
+ const [namespace, name] = registryRefParts(selector.registryRef);
115
+ url = `${base}/v1/packages/${namespace}/${name}/${version}/schema.json`;
116
+ }
117
+ else if (selector.pluginId) {
118
+ url = `${base}/v1/plugin-ids/${encodeURIComponent(selector.pluginId)}/${version}/schema.json`;
119
+ }
120
+ else {
121
+ url = `${base}/v1/packages?name=${encodeURIComponent(selector.shortName ?? "")}`;
122
+ }
123
+ const response = await fetch(url, { headers: { Accept: "application/json" } });
124
+ if (!response.ok)
125
+ throw new Error(`Registry lookup failed (${response.status}): ${selector.raw}`);
126
+ const body = await response.json();
127
+ if (!selector.registryRef && !selector.pluginId) {
128
+ const matches = body;
129
+ if (matches.length !== 1)
130
+ throw new Error(`Registry selector "${selector.raw}" matched ${matches.length} packages; use the full reference`);
131
+ return { registryRef: matches[0].registryRef, contract: parseContract(matches[0].contract) };
132
+ }
133
+ const contract = parseContract(body);
134
+ const registryRef = selector.registryRef ?? String(response.headers.get("BP-Registry-Ref") ?? "");
135
+ if (!registryRef)
136
+ throw new Error(`Registry did not return a package reference for ${selector.raw}`);
137
+ return { registryRef, contract };
138
+ }
139
+ function schemaType(document) {
140
+ if (!document || typeof document !== "object" || Object.keys(document).length === 0)
141
+ return "unknown";
142
+ const value = document;
143
+ return nodeType((value.root ?? value));
144
+ }
145
+ function nodeType(input) {
146
+ if (!input || typeof input !== "object")
147
+ return "unknown";
148
+ const node = input;
149
+ switch (node.kind) {
150
+ case "string": return "string";
151
+ case "int":
152
+ case "number": return "number";
153
+ case "bool": return "boolean";
154
+ case "literal": return JSON.stringify(node.value);
155
+ case "enum": return Array.isArray(node.values) ? node.values.map((value) => JSON.stringify(value)).join(" | ") || "never" : "unknown";
156
+ case "array": return `Array<${nodeType(node.items)}>`;
157
+ case "record": return `Record<string, ${nodeType(node.valueSchema)}>`;
158
+ case "optional": return `${nodeType(node.inner)} | undefined`;
159
+ case "nullable": return `${nodeType(node.inner)} | null`;
160
+ case "union": return Array.isArray(node.options) ? node.options.map(nodeType).join(" | ") : "unknown";
161
+ case "object": {
162
+ const properties = (node.properties ?? {});
163
+ const required = new Set(Array.isArray(node.required) ? node.required.map(String) : []);
164
+ const fields = Object.entries(properties).map(([name, child]) => {
165
+ const optional = required.has(name) ? "" : "?";
166
+ return `${JSON.stringify(name)}${optional}: ${nodeType(child)}`;
167
+ });
168
+ return `{ ${fields.join("; ")} }`;
169
+ }
170
+ default: return "unknown";
171
+ }
172
+ }
173
+ function safeName(value) {
174
+ const words = value.split(/[^A-Za-z0-9]+/).filter(Boolean);
175
+ const joined = words.map((word) => word[0].toUpperCase() + word.slice(1)).join("");
176
+ return /^[0-9]/.test(joined) ? `V${joined}` : joined || "View";
177
+ }
178
+ export function emitTypeScriptClient(alias, contract) {
179
+ const lines = [
180
+ "// AUTO-GENERATED by BetterPortal - DO NOT EDIT",
181
+ "export interface BPClientRuntime {",
182
+ " baseUrl: string;",
183
+ " token?: string | (() => string | Promise<string>);",
184
+ " headers?: Record<string, string> | (() => Record<string, string> | Promise<Record<string, string>>);",
185
+ " fetch?: typeof globalThis.fetch;",
186
+ "}",
187
+ "",
188
+ "async function bpRequest<T>(runtime: BPClientRuntime, method: string, route: string, input: { params?: Record<string, unknown>; query?: Record<string, unknown>; headers?: Record<string, string>; body?: unknown } = {}): Promise<T> {",
189
+ " let pathname = route.replace(/:([A-Za-z][A-Za-z0-9]*)/g, (_match, name: string) => {",
190
+ " const value = input.params?.[name];",
191
+ " if (value === undefined || value === null) throw new Error(`Missing route parameter: ${name}`);",
192
+ " return encodeURIComponent(String(value));",
193
+ " });",
194
+ " const url = new URL(pathname, runtime.baseUrl.endsWith('/') ? runtime.baseUrl : runtime.baseUrl + '/');",
195
+ " for (const [name, value] of Object.entries(input.query ?? {})) {",
196
+ " if (value === undefined || value === null) continue;",
197
+ " for (const item of Array.isArray(value) ? value : [value]) url.searchParams.append(name, String(item));",
198
+ " }",
199
+ " const token = typeof runtime.token === 'function' ? await runtime.token() : runtime.token;",
200
+ " const runtimeHeaders = typeof runtime.headers === 'function' ? await runtime.headers() : runtime.headers;",
201
+ " const response = await (runtime.fetch ?? globalThis.fetch)(url, {",
202
+ " method,",
203
+ " headers: { Accept: 'application/json', ...(input.body === undefined ? {} : { 'Content-Type': 'application/json' }), ...(token ? { Authorization: `Bearer ${token}` } : {}), ...(runtimeHeaders ?? {}), ...(input.headers ?? {}) },",
204
+ " ...(input.body === undefined ? {} : { body: JSON.stringify(input.body) })",
205
+ " });",
206
+ " if (!response.ok) throw new Error(`BetterPortal request failed: ${response.status}`);",
207
+ " return await response.json() as T;",
208
+ "}",
209
+ ""
210
+ ];
211
+ for (const view of contract.manifest.views) {
212
+ for (const method of view.methods) {
213
+ const name = `${safeName(alias)}${safeName(view.viewId)}${safeName(method.toLowerCase())}`;
214
+ lines.push(`export interface ${name}Input {`);
215
+ lines.push(` params?: ${schemaType(view.paramsSchema)};`);
216
+ lines.push(` query?: ${schemaType(view.querySchema)};`);
217
+ lines.push(` headers?: ${schemaType(view.headersSchema)};`);
218
+ lines.push(` body?: ${schemaType(view.bodySchema)};`);
219
+ lines.push("}");
220
+ lines.push(`export type ${name}Response = ${schemaType(view.jsonResponseSchema)};`);
221
+ lines.push(`export const ${name[0].toLowerCase() + name.slice(1)} = (runtime: BPClientRuntime, input: ${name}Input = {}) =>`);
222
+ lines.push(` bpRequest<${name}Response>(runtime, ${JSON.stringify(method)}, ${JSON.stringify(view.path)}, input as Parameters<typeof bpRequest>[3]);`);
223
+ lines.push("");
224
+ }
225
+ }
226
+ return `${lines.join("\n")}\n`;
227
+ }
228
+ function generatedClientDir(packageDir) {
229
+ const pkg = readJsonFile(path.join(packageDir, "package.json"));
230
+ const firstRoute = pkg.betterportal?.routes?.[0];
231
+ return firstRoute
232
+ ? path.join(path.resolve(packageDir, firstRoute, ".."), ".bp-generated", "clients")
233
+ : path.join(packageDir, "src", ".bp-generated", "clients");
234
+ }
235
+ function assertAlias(alias) {
236
+ if (!/^[A-Za-z][A-Za-z0-9_-]*$/.test(alias))
237
+ throw new Error(`Invalid BetterPortal dependency alias: ${alias}`);
238
+ }
239
+ function writeClient(packageDir, alias, contract) {
240
+ assertAlias(alias);
241
+ const file = path.join(generatedClientDir(packageDir), `${alias}.ts`);
242
+ fs.mkdirSync(path.dirname(file), { recursive: true });
243
+ const content = emitTypeScriptClient(alias, contract);
244
+ if (!fs.existsSync(file) || fs.readFileSync(file, "utf8") !== content)
245
+ fs.writeFileSync(file, content, "utf8");
246
+ return file;
247
+ }
248
+ function cacheContract(packageDir, contract) {
249
+ const file = path.join(packageDir, ".betterportal", "contracts", contract.manifest.pluginId, `${contract.manifest.version}.json`);
250
+ writeJsonFile(file, contract);
251
+ return file;
252
+ }
253
+ export async function installClient(rawSelector, options = {}) {
254
+ const packageJsonFile = findPackageJson();
255
+ const packageDir = path.dirname(packageJsonFile);
256
+ const config = readProjectConfig(packageDir);
257
+ const selector = parseDependencySelector(rawSelector, config.defaultNamespace);
258
+ const local = findLocal(packageDir, selector, options.path);
259
+ const resolved = local
260
+ ? { registryRef: local.registryRef ?? selector.registryRef ?? "", contract: local.contract }
261
+ : await fetchRegistry(selector);
262
+ if (!resolved.registryRef)
263
+ throw new Error(`Local contract ${resolved.contract.manifest.pluginId} has no registryRef`);
264
+ const alias = options.alias ?? selector.shortName ?? resolved.registryRef.split("/")[1];
265
+ assertAlias(alias);
266
+ const locked = {
267
+ registryRef: resolved.registryRef,
268
+ pluginId: resolved.contract.manifest.pluginId,
269
+ version: resolved.contract.manifest.version,
270
+ digest: contractDigest(resolved.contract)
271
+ };
272
+ const nextConfig = {
273
+ ...config,
274
+ dependencies: { ...(config.dependencies ?? {}), [alias]: `${locked.registryRef}@${selector.version ?? locked.version}` }
275
+ };
276
+ writeJsonFile(path.join(packageDir, "betterportal.json"), nextConfig);
277
+ const lock = readLock(packageDir);
278
+ lock.dependencies[alias] = locked;
279
+ writeJsonFile(path.join(packageDir, "betterportal.lock.json"), lock);
280
+ cacheContract(packageDir, resolved.contract);
281
+ writeClient(packageDir, alias, resolved.contract);
282
+ if (local) {
283
+ const localLockFile = path.join(packageDir, ".betterportal", "local-lock.json");
284
+ const localLock = fs.existsSync(localLockFile) ? readJsonFile(localLockFile) : {};
285
+ localLock[alias] = { path: path.relative(packageDir, local.root), ...locked };
286
+ writeJsonFile(localLockFile, localLock);
287
+ }
288
+ return locked;
289
+ }
290
+ export async function syncClients(options = {}) {
291
+ const packageDir = path.dirname(findPackageJson());
292
+ const config = readProjectConfig(packageDir);
293
+ const lock = readLock(packageDir);
294
+ const localLockFile = path.join(packageDir, ".betterportal", "local-lock.json");
295
+ const localLock = fs.existsSync(localLockFile)
296
+ ? readJsonFile(localLockFile)
297
+ : {};
298
+ const outputs = [];
299
+ for (const [alias, rawSelector] of Object.entries(config.dependencies ?? {})) {
300
+ const selector = parseDependencySelector(rawSelector, config.defaultNamespace);
301
+ const preferredPath = localLock[alias]?.path;
302
+ const local = options.registryOnly
303
+ ? null
304
+ : findLocal(packageDir, selector, preferredPath) ?? (preferredPath ? findLocal(packageDir, selector) : null);
305
+ let contract;
306
+ if (local)
307
+ contract = local.contract;
308
+ else {
309
+ const locked = lock.dependencies[alias];
310
+ const cached = locked && path.join(packageDir, ".betterportal", "contracts", locked.pluginId, `${locked.version}.json`);
311
+ if (cached && fs.existsSync(cached))
312
+ contract = readContract(cached);
313
+ else {
314
+ if (options.frozen)
315
+ throw new Error(`Frozen dependency is not cached: ${alias}`);
316
+ contract = (await fetchRegistry(selector)).contract;
317
+ cacheContract(packageDir, contract);
318
+ }
319
+ }
320
+ const digest = contractDigest(contract);
321
+ if (options.frozen && lock.dependencies[alias]?.digest !== digest)
322
+ throw new Error(`Frozen dependency changed: ${alias}`);
323
+ outputs.push(writeClient(packageDir, alias, contract));
324
+ }
325
+ return outputs;
326
+ }
327
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/cli/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { type BpSchemaOutput } from "../contracts/manifest.js";
2
+ export declare function buildContracts(startDir?: string): Promise<Array<{
3
+ file: string;
4
+ contract: BpSchemaOutput;
5
+ }>>;
6
+ //# sourceMappingURL=contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/cli/contract.ts"],"names":[],"mappings":"AAGA,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AA+BrF,wBAAsB,cAAc,CAAC,QAAQ,SAAgB,GAAG,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAA;CAAE,CAAC,CAAC,CA6BzH"}
@@ -0,0 +1,47 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { pathToFileURL } from "node:url";
4
+ import { BpSchemaOutputSchema } from "../contracts/manifest.js";
5
+ import { buildBpSchema, buildManifestFromRegistry } from "../runtime/registry.js";
6
+ import { findPackageJson, readJsonFile, writeJsonFile } from "./project.js";
7
+ function compiledPluginModule(packageDir, sourcePath, isRouteDir) {
8
+ const sourcePlugin = path.resolve(packageDir, sourcePath, ...(isRouteDir ? ["..", "index.ts"] : []));
9
+ const relative = path.relative(packageDir, sourcePlugin);
10
+ const parts = relative.split(path.sep);
11
+ if (parts[0] !== "src") {
12
+ throw new Error(`BetterPortal definition must be under src/: ${sourcePath}`);
13
+ }
14
+ parts[parts.length - 1] = parts.at(-1)?.replace(/\.tsx?$/, ".js") ?? "index.js";
15
+ return path.join(packageDir, "lib", ...parts.slice(1));
16
+ }
17
+ export async function buildContracts(startDir = process.cwd()) {
18
+ const packageJsonFile = findPackageJson(startDir);
19
+ const packageDir = path.dirname(packageJsonFile);
20
+ const pkg = readJsonFile(packageJsonFile);
21
+ const routeDirs = pkg.betterportal?.routes ?? [];
22
+ const definitions = pkg.betterportal?.definitions ?? [];
23
+ if (routeDirs.length === 0 && definitions.length === 0) {
24
+ throw new Error("No betterportal.routes or betterportal.definitions are configured");
25
+ }
26
+ const modules = [...new Set([
27
+ ...routeDirs.map((routeDir) => compiledPluginModule(packageDir, routeDir, true)),
28
+ ...definitions.map((definition) => compiledPluginModule(packageDir, definition, false))
29
+ ])];
30
+ const outputs = [];
31
+ for (const moduleFile of modules) {
32
+ if (!fs.existsSync(moduleFile))
33
+ throw new Error(`Compiled BP plugin not found: ${moduleFile}`);
34
+ const loaded = await import(`${pathToFileURL(moduleFile).href}?bp-contract=${Date.now()}`);
35
+ if (!loaded.Plugin || typeof loaded.Plugin.getBPDefinition !== "function") {
36
+ throw new Error(`${moduleFile} does not export a BPService Plugin`);
37
+ }
38
+ const definition = loaded.Plugin.getBPDefinition();
39
+ const manifest = buildManifestFromRegistry(definition.registry, { version: pkg.version }, definition.manifest);
40
+ const contract = BpSchemaOutputSchema.parse(buildBpSchema(definition.registry, manifest));
41
+ const file = path.join(packageDir, "lib", "bp-contracts", `${manifest.pluginId}.json`);
42
+ writeJsonFile(file, contract);
43
+ outputs.push({ file, contract });
44
+ }
45
+ return outputs;
46
+ }
47
+ //# sourceMappingURL=contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/cli/contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { type BpSchemaOutput } from "../contracts/manifest.js";
2
+ export { canonicalJson, contractDigest } from "../runtime/contract.js";
3
+ export declare const DEFAULT_REGISTRY_URL = "https://io.betterportal.org";
4
+ export interface BetterPortalProjectConfig {
5
+ $schema?: string;
6
+ registryRef?: string;
7
+ defaultNamespace?: string;
8
+ dependencies?: Record<string, string>;
9
+ }
10
+ export interface LockedDependency {
11
+ registryRef: string;
12
+ pluginId: string;
13
+ version: string;
14
+ digest: string;
15
+ }
16
+ export interface BetterPortalLock {
17
+ dependencies: Record<string, LockedDependency>;
18
+ }
19
+ export declare function findPackageJson(startDir?: string): string;
20
+ export declare function readJsonFile<T>(file: string): T;
21
+ export declare function writeJsonFile(file: string, value: unknown): void;
22
+ export declare function readProjectConfig(packageDir: string): BetterPortalProjectConfig;
23
+ export declare function readLock(packageDir: string): BetterPortalLock;
24
+ export declare function parseContract(value: unknown): BpSchemaOutput;
25
+ export declare function readContract(file: string): BpSchemaOutput;
26
+ export declare function normalizeRegistryUrl(value?: string): string;
27
+ export interface DependencySelector {
28
+ raw: string;
29
+ registryRef?: string;
30
+ pluginId?: string;
31
+ shortName?: string;
32
+ version?: string;
33
+ }
34
+ export declare function parseDependencySelector(rawInput: string, defaultNamespace?: string): DependencySelector;
35
+ export declare function registryRefParts(registryRef: string): [string, string];
36
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/cli/project.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAEvE,eAAO,MAAM,oBAAoB,gCAAgC,CAAC;AAElE,MAAM,WAAW,yBAAyB;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAChD;AAED,wBAAgB,eAAe,CAAC,QAAQ,SAAgB,GAAG,MAAM,CAShE;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAE/C;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAOhE;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,yBAAyB,CAG/E;AAED,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAG7D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAE5D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAEzD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,SAAsD,GAAG,MAAM,CAExG;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAWvG;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAMtE"}
@@ -0,0 +1,69 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { BpSchemaOutputSchema } from "../contracts/manifest.js";
4
+ export { canonicalJson, contractDigest } from "../runtime/contract.js";
5
+ export const DEFAULT_REGISTRY_URL = "https://io.betterportal.org";
6
+ export function findPackageJson(startDir = process.cwd()) {
7
+ let dir = path.resolve(startDir);
8
+ while (true) {
9
+ const candidate = path.join(dir, "package.json");
10
+ if (fs.existsSync(candidate))
11
+ return candidate;
12
+ const parent = path.dirname(dir);
13
+ if (parent === dir)
14
+ throw new Error("No package.json found");
15
+ dir = parent;
16
+ }
17
+ }
18
+ export function readJsonFile(file) {
19
+ return JSON.parse(fs.readFileSync(file, "utf8"));
20
+ }
21
+ export function writeJsonFile(file, value) {
22
+ fs.mkdirSync(path.dirname(file), { recursive: true });
23
+ const next = `${JSON.stringify(value, null, 2)}\n`;
24
+ if (fs.existsSync(file) && fs.readFileSync(file, "utf8") === next)
25
+ return;
26
+ const temp = `${file}.tmp`;
27
+ fs.writeFileSync(temp, next, "utf8");
28
+ fs.renameSync(temp, file);
29
+ }
30
+ export function readProjectConfig(packageDir) {
31
+ const file = path.join(packageDir, "betterportal.json");
32
+ return fs.existsSync(file) ? readJsonFile(file) : {};
33
+ }
34
+ export function readLock(packageDir) {
35
+ const file = path.join(packageDir, "betterportal.lock.json");
36
+ return fs.existsSync(file) ? readJsonFile(file) : { dependencies: {} };
37
+ }
38
+ export function parseContract(value) {
39
+ return BpSchemaOutputSchema.parse(value);
40
+ }
41
+ export function readContract(file) {
42
+ return parseContract(readJsonFile(file));
43
+ }
44
+ export function normalizeRegistryUrl(value = process.env.BP_REGISTRY_URL ?? DEFAULT_REGISTRY_URL) {
45
+ return value.replace(/\/+$/, "");
46
+ }
47
+ export function parseDependencySelector(rawInput, defaultNamespace) {
48
+ const raw = rawInput.trim();
49
+ if (!raw)
50
+ throw new Error("Dependency selector is required");
51
+ const at = raw.lastIndexOf("@");
52
+ const id = at > 0 ? raw.slice(0, at) : raw;
53
+ const version = at > 0 ? raw.slice(at + 1) : undefined;
54
+ if (id.includes("/"))
55
+ return { raw, registryRef: id, version };
56
+ if (id.includes("."))
57
+ return { raw, pluginId: id, version };
58
+ if (defaultNamespace)
59
+ return { raw, registryRef: `${defaultNamespace}/${id}`, shortName: id, version };
60
+ return { raw, shortName: id, version };
61
+ }
62
+ export function registryRefParts(registryRef) {
63
+ const parts = registryRef.split("/");
64
+ if (parts.length !== 2 || parts.some((part) => !/^[a-z0-9][a-z0-9-]*$/.test(part))) {
65
+ throw new Error(`Invalid BetterPortal registry reference: ${registryRef}`);
66
+ }
67
+ return [parts[0], parts[1]];
68
+ }
69
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/cli/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function publishContracts(input?: string): Promise<string[]>;
2
+ //# sourceMappingURL=publish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../src/cli/publish.ts"],"names":[],"mappings":"AAmBA,wBAAsB,gBAAgB,CAAC,KAAK,SAAqB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAuBpF"}
@@ -0,0 +1,47 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { findPackageJson, normalizeRegistryUrl, parseContract, readContract, readProjectConfig, registryRefParts } from "./project.js";
4
+ async function contractInputs(input) {
5
+ if (/^https?:\/\//i.test(input)) {
6
+ const url = `${input.replace(/\/+$/, "")}/.well-known/bp/schema.json`;
7
+ const response = await fetch(url, { headers: { Accept: "application/json" } });
8
+ if (!response.ok)
9
+ throw new Error(`Contract fetch failed (${response.status}): ${url}`);
10
+ return [{ name: url, contract: parseContract(await response.json()) }];
11
+ }
12
+ const absolute = path.resolve(input);
13
+ if (!fs.existsSync(absolute))
14
+ throw new Error(`Contract path not found: ${absolute}`);
15
+ const files = fs.statSync(absolute).isDirectory()
16
+ ? fs.readdirSync(absolute).filter((name) => name.endsWith(".json")).map((name) => path.join(absolute, name))
17
+ : [absolute];
18
+ return files.map((file) => ({ name: file, contract: readContract(file) }));
19
+ }
20
+ export async function publishContracts(input = "lib/bp-contracts") {
21
+ const packageDir = path.dirname(findPackageJson());
22
+ const config = readProjectConfig(packageDir);
23
+ if (!config.registryRef)
24
+ throw new Error("betterportal.json must define registryRef before publishing");
25
+ const [namespace, name] = registryRefParts(config.registryRef);
26
+ const token = process.env.BP_REGISTRY_TOKEN;
27
+ if (!token)
28
+ throw new Error("BP_REGISTRY_TOKEN is required");
29
+ const published = [];
30
+ for (const item of await contractInputs(input)) {
31
+ const response = await fetch(`${normalizeRegistryUrl()}/v1/packages/${namespace}/${name}`, {
32
+ method: "POST",
33
+ headers: {
34
+ Accept: "application/json",
35
+ Authorization: `Bearer ${token}`,
36
+ "Content-Type": "application/json"
37
+ },
38
+ body: JSON.stringify(item.contract)
39
+ });
40
+ const body = await response.json().catch(() => ({}));
41
+ if (!response.ok)
42
+ throw new Error(body.message ?? `Publish failed (${response.status}): ${item.name}`);
43
+ published.push(`${config.registryRef}@${item.contract.manifest.version}`);
44
+ }
45
+ return published;
46
+ }
47
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/cli/publish.ts"],"names":[],"mappings":"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"}