@package-broker/cli 0.19.8 → 2.0.0-rc.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.
Files changed (181) hide show
  1. package/LICENSE +661 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/bin.d.ts +3 -0
  4. package/dist/bin.d.ts.map +1 -0
  5. package/dist/bin.js +12 -0
  6. package/dist/bin.js.map +1 -0
  7. package/dist/build-artifacts.d.ts +27 -0
  8. package/dist/build-artifacts.d.ts.map +1 -0
  9. package/dist/build-artifacts.js +169 -0
  10. package/dist/build-artifacts.js.map +1 -0
  11. package/dist/build-assets.d.ts +36 -0
  12. package/dist/build-assets.d.ts.map +1 -0
  13. package/dist/build-assets.js +224 -0
  14. package/dist/build-assets.js.map +1 -0
  15. package/dist/build.d.ts +31 -0
  16. package/dist/build.d.ts.map +1 -0
  17. package/dist/build.js +277 -0
  18. package/dist/build.js.map +1 -0
  19. package/dist/cli.d.ts +2 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +801 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/cloudflare/d1-http-executor.d.ts +30 -0
  24. package/dist/cloudflare/d1-http-executor.d.ts.map +1 -0
  25. package/dist/cloudflare/d1-http-executor.js +230 -0
  26. package/dist/cloudflare/d1-http-executor.js.map +1 -0
  27. package/dist/cloudflare/d1-http-response.d.ts +4 -0
  28. package/dist/cloudflare/d1-http-response.d.ts.map +1 -0
  29. package/dist/cloudflare/d1-http-response.js +113 -0
  30. package/dist/cloudflare/d1-http-response.js.map +1 -0
  31. package/dist/commands/admin.d.ts +47 -0
  32. package/dist/commands/admin.d.ts.map +1 -0
  33. package/dist/commands/admin.js +447 -0
  34. package/dist/commands/admin.js.map +1 -0
  35. package/dist/commands/built-manifest.d.ts +13 -0
  36. package/dist/commands/built-manifest.d.ts.map +1 -0
  37. package/dist/commands/built-manifest.js +197 -0
  38. package/dist/commands/built-manifest.js.map +1 -0
  39. package/dist/commands/cloudflare/api.d.ts +129 -0
  40. package/dist/commands/cloudflare/api.d.ts.map +1 -0
  41. package/dist/commands/cloudflare/api.js +480 -0
  42. package/dist/commands/cloudflare/api.js.map +1 -0
  43. package/dist/commands/cloudflare/deploy.d.ts +81 -0
  44. package/dist/commands/cloudflare/deploy.d.ts.map +1 -0
  45. package/dist/commands/cloudflare/deploy.js +1848 -0
  46. package/dist/commands/cloudflare/deploy.js.map +1 -0
  47. package/dist/commands/cloudflare/inventory.d.ts +243 -0
  48. package/dist/commands/cloudflare/inventory.d.ts.map +1 -0
  49. package/dist/commands/cloudflare/inventory.js +786 -0
  50. package/dist/commands/cloudflare/inventory.js.map +1 -0
  51. package/dist/commands/cloudflare/janitor.d.ts +10 -0
  52. package/dist/commands/cloudflare/janitor.d.ts.map +1 -0
  53. package/dist/commands/cloudflare/janitor.js +84 -0
  54. package/dist/commands/cloudflare/janitor.js.map +1 -0
  55. package/dist/commands/cloudflare/migrations-check.d.ts +5 -0
  56. package/dist/commands/cloudflare/migrations-check.d.ts.map +1 -0
  57. package/dist/commands/cloudflare/migrations-check.js +10 -0
  58. package/dist/commands/cloudflare/migrations-check.js.map +1 -0
  59. package/dist/commands/cloudflare/provision.d.ts +79 -0
  60. package/dist/commands/cloudflare/provision.d.ts.map +1 -0
  61. package/dist/commands/cloudflare/provision.js +961 -0
  62. package/dist/commands/cloudflare/provision.js.map +1 -0
  63. package/dist/commands/cloudflare/queue-consumer.d.ts +4 -0
  64. package/dist/commands/cloudflare/queue-consumer.d.ts.map +1 -0
  65. package/dist/commands/cloudflare/queue-consumer.js +57 -0
  66. package/dist/commands/cloudflare/queue-consumer.js.map +1 -0
  67. package/dist/commands/cloudflare/setup.d.ts +48 -0
  68. package/dist/commands/cloudflare/setup.d.ts.map +1 -0
  69. package/dist/commands/cloudflare/setup.js +836 -0
  70. package/dist/commands/cloudflare/setup.js.map +1 -0
  71. package/dist/commands/cloudflare/smoke.d.ts +29 -0
  72. package/dist/commands/cloudflare/smoke.d.ts.map +1 -0
  73. package/dist/commands/cloudflare/smoke.js +715 -0
  74. package/dist/commands/cloudflare/smoke.js.map +1 -0
  75. package/dist/commands/cloudflare/teardown.d.ts +62 -0
  76. package/dist/commands/cloudflare/teardown.d.ts.map +1 -0
  77. package/dist/commands/cloudflare/teardown.js +906 -0
  78. package/dist/commands/cloudflare/teardown.js.map +1 -0
  79. package/dist/commands/cloudflare/worker-settings.d.ts +4 -0
  80. package/dist/commands/cloudflare/worker-settings.d.ts.map +1 -0
  81. package/dist/commands/cloudflare/worker-settings.js +93 -0
  82. package/dist/commands/cloudflare/worker-settings.js.map +1 -0
  83. package/dist/commands/cloudflare.d.ts +55 -0
  84. package/dist/commands/cloudflare.d.ts.map +1 -0
  85. package/dist/commands/cloudflare.js +393 -0
  86. package/dist/commands/cloudflare.js.map +1 -0
  87. package/dist/commands/import-cutover.d.ts +5 -0
  88. package/dist/commands/import-cutover.d.ts.map +1 -0
  89. package/dist/commands/import-cutover.js +25 -0
  90. package/dist/commands/import-cutover.js.map +1 -0
  91. package/dist/commands/import-private-packagist.d.ts +38 -0
  92. package/dist/commands/import-private-packagist.d.ts.map +1 -0
  93. package/dist/commands/import-private-packagist.js +232 -0
  94. package/dist/commands/import-private-packagist.js.map +1 -0
  95. package/dist/commands/import-satis.d.ts +11 -0
  96. package/dist/commands/import-satis.d.ts.map +1 -0
  97. package/dist/commands/import-satis.js +112 -0
  98. package/dist/commands/import-satis.js.map +1 -0
  99. package/dist/commands/import.d.ts +22 -0
  100. package/dist/commands/import.d.ts.map +1 -0
  101. package/dist/commands/import.js +343 -0
  102. package/dist/commands/import.js.map +1 -0
  103. package/dist/commands/openapi-specs.d.ts +4 -0
  104. package/dist/commands/openapi-specs.d.ts.map +1 -0
  105. package/dist/commands/openapi-specs.js +94 -0
  106. package/dist/commands/openapi-specs.js.map +1 -0
  107. package/dist/commands/openapi.d.ts +12 -0
  108. package/dist/commands/openapi.d.ts.map +1 -0
  109. package/dist/commands/openapi.js +44 -0
  110. package/dist/commands/openapi.js.map +1 -0
  111. package/dist/commands/source.d.ts +8 -0
  112. package/dist/commands/source.d.ts.map +1 -0
  113. package/dist/commands/source.js +61 -0
  114. package/dist/commands/source.js.map +1 -0
  115. package/dist/commands/sqlite.d.ts +11 -0
  116. package/dist/commands/sqlite.d.ts.map +1 -0
  117. package/dist/commands/sqlite.js +76 -0
  118. package/dist/commands/sqlite.js.map +1 -0
  119. package/dist/import/client.d.ts +71 -0
  120. package/dist/import/client.d.ts.map +1 -0
  121. package/dist/import/client.js +348 -0
  122. package/dist/import/client.js.map +1 -0
  123. package/dist/import/credential-refs.d.ts +2 -0
  124. package/dist/import/credential-refs.d.ts.map +1 -0
  125. package/dist/import/credential-refs.js +22 -0
  126. package/dist/import/credential-refs.js.map +1 -0
  127. package/dist/import/cutover.d.ts +64 -0
  128. package/dist/import/cutover.d.ts.map +1 -0
  129. package/dist/import/cutover.js +544 -0
  130. package/dist/import/cutover.js.map +1 -0
  131. package/dist/import/private-packagist/api.d.ts +57 -0
  132. package/dist/import/private-packagist/api.d.ts.map +1 -0
  133. package/dist/import/private-packagist/api.js +246 -0
  134. package/dist/import/private-packagist/api.js.map +1 -0
  135. package/dist/import/private-packagist/dates.d.ts +30 -0
  136. package/dist/import/private-packagist/dates.d.ts.map +1 -0
  137. package/dist/import/private-packagist/dates.js +189 -0
  138. package/dist/import/private-packagist/dates.js.map +1 -0
  139. package/dist/import/private-packagist/map.d.ts +48 -0
  140. package/dist/import/private-packagist/map.d.ts.map +1 -0
  141. package/dist/import/private-packagist/map.js +162 -0
  142. package/dist/import/private-packagist/map.js.map +1 -0
  143. package/dist/import/private-packagist/plan.d.ts +61 -0
  144. package/dist/import/private-packagist/plan.d.ts.map +1 -0
  145. package/dist/import/private-packagist/plan.js +936 -0
  146. package/dist/import/private-packagist/plan.js.map +1 -0
  147. package/dist/import/private-packagist/snapshot.d.ts +31 -0
  148. package/dist/import/private-packagist/snapshot.d.ts.map +1 -0
  149. package/dist/import/private-packagist/snapshot.js +406 -0
  150. package/dist/import/private-packagist/snapshot.js.map +1 -0
  151. package/dist/import/satis.d.ts +93 -0
  152. package/dist/import/satis.d.ts.map +1 -0
  153. package/dist/import/satis.js +873 -0
  154. package/dist/import/satis.js.map +1 -0
  155. package/dist/index.d.ts +3 -2
  156. package/dist/index.d.ts.map +1 -1
  157. package/dist/index.js +3 -96
  158. package/dist/index.js.map +1 -1
  159. package/dist/manifest.d.ts +55 -0
  160. package/dist/manifest.d.ts.map +1 -0
  161. package/dist/manifest.js +125 -0
  162. package/dist/manifest.js.map +1 -0
  163. package/dist/migrations-collect.d.ts +6 -0
  164. package/dist/migrations-collect.d.ts.map +1 -0
  165. package/dist/migrations-collect.js +39 -0
  166. package/dist/migrations-collect.js.map +1 -0
  167. package/dist/prebuilt-expected.json +7 -0
  168. package/dist/prebuilt.d.ts +27 -0
  169. package/dist/prebuilt.d.ts.map +1 -0
  170. package/dist/prebuilt.js +391 -0
  171. package/dist/prebuilt.js.map +1 -0
  172. package/package.json +21 -25
  173. package/README.md +0 -29
  174. package/dist/__tests__/migrate.test.d.ts +0 -2
  175. package/dist/__tests__/migrate.test.d.ts.map +0 -1
  176. package/dist/__tests__/migrate.test.js +0 -116
  177. package/dist/__tests__/migrate.test.js.map +0 -1
  178. package/dist/migrate.d.ts +0 -40
  179. package/dist/migrate.d.ts.map +0 -1
  180. package/dist/migrate.js +0 -335
  181. package/dist/migrate.js.map +0 -1
@@ -0,0 +1,27 @@
1
+ import type { Platform } from '@package-broker/core/plugin';
2
+ import { type PlatformPortConfig } from '@package-broker/core/platform/port-config';
3
+ import type { MigrationSource } from '@package-broker/db-sqlite/migrations/source';
4
+ export declare const GENERATED_PACKAGE_MARKER = "pbGenerated";
5
+ export interface BuildInfo {
6
+ readonly schemaVersion: 1;
7
+ readonly target: Platform;
8
+ readonly core: string;
9
+ readonly plugins: Readonly<Record<string, string>>;
10
+ readonly lockfileSha256: string | null;
11
+ readonly gitSha: string | null;
12
+ readonly dirty?: boolean | null;
13
+ }
14
+ export declare function renderBuildInfo(info: BuildInfo): string;
15
+ export declare function renderNodePackageJson(betterSqliteVersion: string): string;
16
+ export declare function writeOutputPackageJson(packageJsonPath: string, contents: string | null): Promise<void>;
17
+ /**
18
+ * A collected migration source carries the file stem in `name` (for example
19
+ * `0001_init`), while the built migrations directory stores it as
20
+ * `migrations/<owner>/<name>.sql` and `loadBuiltMigrations` validates that file
21
+ * name. Widen the name to the file name before rendering the JSON manifest.
22
+ */
23
+ export declare function toManifestMigrations(migrations: readonly MigrationSource[]): readonly MigrationSource[];
24
+ export declare function credentialProblems(described: PlatformPortConfig | null, target: Platform): string[];
25
+ export declare function describePlatformPorts(ports: PlatformPortConfig | undefined): PlatformPortConfig | null;
26
+ export declare function renderBuildManifest(configPath: string, orderedPluginIds: readonly string[], migrations?: readonly Pick<MigrationSource, 'id' | 'checksum'>[], platform?: NodeJS.Platform, platformPorts?: PlatformPortConfig | null): string;
27
+ //# sourceMappingURL=build-artifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-artifacts.d.ts","sourceRoot":"","sources":["../src/build-artifacts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAgB,KAAK,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAElG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAEnF,eAAO,MAAM,wBAAwB,gBAAgB,CAAC;AAEtD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CACjC;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAEvD;AAED,wBAAgB,qBAAqB,CAAC,mBAAmB,EAAE,MAAM,GAAG,MAAM,CAYzE;AAoBD,wBAAsB,sBAAsB,CAC1C,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,OAAO,CAAC,IAAI,CAAC,CAcf;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,SAAS,eAAe,EAAE,GACrC,SAAS,eAAe,EAAE,CAE5B;AA4BD,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,kBAAkB,GAAG,IAAI,EACpC,MAAM,EAAE,QAAQ,GACf,MAAM,EAAE,CAkBV;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,kBAAkB,GAAG,SAAS,GACpC,kBAAkB,GAAG,IAAI,CAgD3B;AAED,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,SAAS,MAAM,EAAE,EACnC,UAAU,CAAC,EAAE,SAAS,IAAI,CAAC,eAAe,EAAE,IAAI,GAAG,UAAU,CAAC,EAAE,EAChE,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,aAAa,CAAC,EAAE,kBAAkB,GAAG,IAAI,GACxC,MAAM,CAyBR"}
@@ -0,0 +1,169 @@
1
+ import { readFile, rm, writeFile } from 'node:fs/promises';
2
+ import { TRACE_FIELDS } from '@package-broker/core/platform/port-config';
3
+ import { looksLikeCredential } from '@package-broker/core/platform/credential';
4
+ export const GENERATED_PACKAGE_MARKER = 'pbGenerated';
5
+ export function renderBuildInfo(info) {
6
+ return `${JSON.stringify(info, null, 2)}\n`;
7
+ }
8
+ export function renderNodePackageJson(betterSqliteVersion) {
9
+ return `${JSON.stringify({
10
+ name: 'package-broker-node',
11
+ private: true,
12
+ type: 'module',
13
+ [GENERATED_PACKAGE_MARKER]: true,
14
+ dependencies: { 'better-sqlite3': betterSqliteVersion },
15
+ }, null, 2)}\n`;
16
+ }
17
+ async function readGeneratedPackageJson(packageJsonPath) {
18
+ let contents;
19
+ try {
20
+ contents = await readFile(packageJsonPath, 'utf8');
21
+ }
22
+ catch (error) {
23
+ if (error.code === 'ENOENT')
24
+ return null;
25
+ throw error;
26
+ }
27
+ try {
28
+ const parsed = JSON.parse(contents);
29
+ return typeof parsed === 'object' && parsed !== null ? parsed : {};
30
+ }
31
+ catch {
32
+ return {};
33
+ }
34
+ }
35
+ export async function writeOutputPackageJson(packageJsonPath, contents) {
36
+ const existing = await readGeneratedPackageJson(packageJsonPath);
37
+ if (existing !== null && existing[GENERATED_PACKAGE_MARKER] !== true) {
38
+ throw new Error(`refusing to ${contents === null ? 'remove' : 'overwrite'} ${packageJsonPath}: it exists but was not generated by pb; pass --out with another directory`);
39
+ }
40
+ if (contents === null) {
41
+ await rm(packageJsonPath, { force: true });
42
+ return;
43
+ }
44
+ await writeFile(packageJsonPath, contents);
45
+ }
46
+ /**
47
+ * A collected migration source carries the file stem in `name` (for example
48
+ * `0001_init`), while the built migrations directory stores it as
49
+ * `migrations/<owner>/<name>.sql` and `loadBuiltMigrations` validates that file
50
+ * name. Widen the name to the file name before rendering the JSON manifest.
51
+ */
52
+ export function toManifestMigrations(migrations) {
53
+ return migrations.map((source) => ({ ...source, name: `${source.name}.sql` }));
54
+ }
55
+ const DESCRIBED_KEYS = {
56
+ blob: [
57
+ 'adapter',
58
+ 'binding',
59
+ 'rootEnv',
60
+ 'endpointEnv',
61
+ 'regionEnv',
62
+ 'bucketEnv',
63
+ 'accessKeyIdEnv',
64
+ 'secretAccessKeyEnv',
65
+ 'sessionTokenEnv',
66
+ 'pathStyle',
67
+ 'maxBytes',
68
+ ],
69
+ cache: ['adapter', 'namespace', 'maxBytes'],
70
+ jobs: ['adapter', 'binding', 'maxRunning'],
71
+ observability: [
72
+ 'adapter',
73
+ 'analyticsBinding',
74
+ 'deploymentIdEnv',
75
+ 'endpointEnv',
76
+ 'headersEnv',
77
+ 'traces',
78
+ ],
79
+ };
80
+ export function credentialProblems(described, target) {
81
+ if (described === null)
82
+ return [];
83
+ const problems = [];
84
+ for (const [port, section] of Object.entries(described)) {
85
+ for (const [key, value] of Object.entries(section)) {
86
+ if (typeof value === 'string' && looksLikeCredential(value)) {
87
+ problems.push(`${target}.${port}.${key}: looks like a credential value`);
88
+ }
89
+ }
90
+ }
91
+ const destinations = described.observability?.traces?.destinations;
92
+ if (Array.isArray(destinations) &&
93
+ destinations.some((value) => typeof value === 'string' && looksLikeCredential(value))) {
94
+ problems.push(`${target}.observability.traces.destinations: looks like a credential value`);
95
+ }
96
+ return problems;
97
+ }
98
+ export function describePlatformPorts(ports) {
99
+ if (typeof ports !== 'object' || ports === null)
100
+ return null;
101
+ const described = {};
102
+ for (const [port, keys] of Object.entries(DESCRIBED_KEYS)) {
103
+ const section = {};
104
+ const source = ports[port];
105
+ if (typeof source !== 'object' || source === null)
106
+ continue;
107
+ for (const key of keys) {
108
+ const value = Object.hasOwn(source, key)
109
+ ? source[key]
110
+ : undefined;
111
+ if (port === 'observability' &&
112
+ key === 'traces' &&
113
+ (typeof value !== 'object' || value === null))
114
+ continue;
115
+ if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
116
+ section[key] = value;
117
+ }
118
+ else if (port === 'observability' &&
119
+ key === 'traces' &&
120
+ typeof value === 'object' &&
121
+ value !== null &&
122
+ !Array.isArray(value)) {
123
+ section[key] = Object.fromEntries(Object.keys(TRACE_FIELDS)
124
+ .filter((field) => {
125
+ if (!Object.hasOwn(value, field))
126
+ return false;
127
+ const setting = value[field];
128
+ if (field === 'destinations')
129
+ return (Array.isArray(setting) &&
130
+ Array.from(setting).every((entry) => typeof entry === 'string'));
131
+ return typeof setting === (field === 'headSamplingRate' ? 'number' : 'boolean');
132
+ })
133
+ .map((field) => {
134
+ const setting = value[field];
135
+ return [field, Array.isArray(setting) ? [...setting] : setting];
136
+ }));
137
+ }
138
+ }
139
+ described[port] = section;
140
+ }
141
+ return described;
142
+ }
143
+ export function renderBuildManifest(configPath, orderedPluginIds, migrations, platform = process.platform, platformPorts) {
144
+ const specifier = platform === 'win32' ? configPath.replaceAll('\\', '/') : configPath;
145
+ const lines = [
146
+ `import config from ${JSON.stringify(specifier)};`,
147
+ `const orderedPluginIds = ${JSON.stringify(orderedPluginIds)};`,
148
+ 'const pluginsById = new Map(config.plugins.map((plugin) => [plugin.id, plugin]));',
149
+ 'export const plugins = orderedPluginIds.map((id) => {',
150
+ ' const plugin = pluginsById.get(id);',
151
+ ' if (plugin === undefined) throw new Error(`plugin "${id}" is missing from config.plugins`);',
152
+ ' return plugin;',
153
+ '});',
154
+ 'if (plugins.length !== config.plugins.length) {',
155
+ ' throw new Error(`config.plugins has ${config.plugins.length} plugins, expected ${plugins.length}`);',
156
+ '}',
157
+ ];
158
+ if (migrations !== undefined) {
159
+ lines.push(`export const migrations = ${JSON.stringify(migrations, null, 2)};`);
160
+ }
161
+ lines.push(`export const platformPorts = ${JSON.stringify(platformPorts ?? null, null, 2)};`);
162
+ lines.push('export const observability = config.observability;');
163
+ lines.push('export const registry = config.registry;');
164
+ lines.push('export const tokens = config.tokens;');
165
+ lines.push('export const vulnerability = config.vulnerability;');
166
+ lines.push('export const mcp = config.mcp;');
167
+ return `${lines.join('\n')}\n`;
168
+ }
169
+ //# sourceMappingURL=build-artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-artifacts.js","sourceRoot":"","sources":["../src/build-artifacts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { BrokerConfig } from '@package-broker/core';
2
+ import type { Platform } from '@package-broker/core/plugin';
3
+ interface AssetRecord {
4
+ readonly schemaVersion: 1;
5
+ readonly provider: {
6
+ readonly specifier: string;
7
+ readonly version: string;
8
+ };
9
+ readonly digest: string;
10
+ readonly descriptor: {
11
+ readonly directory: './assets';
12
+ readonly binding: 'ASSETS';
13
+ readonly run_worker_first: true;
14
+ readonly html_handling: 'none';
15
+ readonly not_found_handling: 'none';
16
+ };
17
+ }
18
+ export interface PreparedAssets {
19
+ readonly record: AssetRecord;
20
+ readonly files: readonly {
21
+ readonly name: string;
22
+ readonly content: Buffer;
23
+ }[];
24
+ }
25
+ export declare class AssetProblemsError extends Error {
26
+ readonly problems: readonly string[];
27
+ constructor(problems: readonly string[]);
28
+ }
29
+ export declare function prepareAssets(options: {
30
+ config: BrokerConfig;
31
+ configPath: string;
32
+ target: Platform;
33
+ }): Promise<PreparedAssets | null>;
34
+ export declare function stageAssets(outDir: string, prepared: PreparedAssets | null): Promise<void>;
35
+ export {};
36
+ //# sourceMappingURL=build-assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-assets.d.ts","sourceRoot":"","sources":["../src/build-assets.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAQzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAM5D,UAAU,WAAW;IACnB,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE;QACnB,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;QAC/B,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;QAC3B,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAC;QAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;KACrC,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAChF;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;gBAEzB,QAAQ,EAAE,SAAS,MAAM,EAAE;CAKxC;AA2FD,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAC3C,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,QAAQ,CAAC;CAClB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAoEjC;AAYD,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAkChG"}
@@ -0,0 +1,224 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { mkdir, readFile, realpath, rename, rm, stat, writeFile } from 'node:fs/promises';
3
+ import { createRequire } from 'node:module';
4
+ import path from 'node:path';
5
+ import { fileURLToPath, pathToFileURL } from 'node:url';
6
+ import { assetProviderProblems, assetProviderResultProblems, brokerAssetsProblems, } from '@package-broker/core/config';
7
+ import { parseUiManifest } from '@package-broker/core/platform/ui-manifest';
8
+ const ASSET_DIR = 'assets';
9
+ const RECORD_FILE = 'assets.json';
10
+ const MANIFEST_FILE = 'manifest.json';
11
+ export class AssetProblemsError extends Error {
12
+ problems;
13
+ constructor(problems) {
14
+ super(problems.join('\n'));
15
+ this.name = 'AssetProblemsError';
16
+ this.problems = problems;
17
+ }
18
+ }
19
+ function sha256(content) {
20
+ return createHash('sha256').update(content).digest('hex');
21
+ }
22
+ function errorCode(error) {
23
+ return error.code;
24
+ }
25
+ async function readProviderVersion(resolvedModule) {
26
+ for (let dir = path.dirname(resolvedModule);; dir = path.dirname(dir)) {
27
+ let text;
28
+ try {
29
+ text = await readFile(path.join(dir, 'package.json'), 'utf8');
30
+ }
31
+ catch (error) {
32
+ if (errorCode(error) !== 'ENOENT')
33
+ throw error;
34
+ if (path.dirname(dir) === dir)
35
+ return null;
36
+ continue;
37
+ }
38
+ const version = JSON.parse(text).version;
39
+ return typeof version === 'string' ? version : null;
40
+ }
41
+ }
42
+ function isContained(root, target) {
43
+ const relative = path.relative(root, target);
44
+ return relative !== '' && !relative.startsWith('..') && !path.isAbsolute(relative);
45
+ }
46
+ async function loadProvider(specifier, configDir) {
47
+ let resolvedModule;
48
+ try {
49
+ resolvedModule = createRequire(path.join(configDir, 'package.json')).resolve(specifier);
50
+ }
51
+ catch {
52
+ throw new AssetProblemsError([
53
+ `assets: provider "${specifier}" could not be resolved from the config location`,
54
+ ]);
55
+ }
56
+ let exported;
57
+ try {
58
+ exported = (await import(pathToFileURL(resolvedModule).href))
59
+ .default;
60
+ }
61
+ catch {
62
+ throw new AssetProblemsError([`assets: provider "${specifier}" failed to load`]);
63
+ }
64
+ const problems = assetProviderProblems(exported);
65
+ if (problems.length > 0)
66
+ throw new AssetProblemsError(problems);
67
+ return { provider: exported, resolvedModule };
68
+ }
69
+ async function readListedFiles(manifestFile, names, bytes) {
70
+ const root = await realpath(path.dirname(manifestFile));
71
+ const problems = [];
72
+ const files = [];
73
+ for (const name of names) {
74
+ const label = `assets: listed file "${name}"`;
75
+ let real;
76
+ try {
77
+ real = await realpath(path.join(root, name));
78
+ }
79
+ catch (error) {
80
+ if (errorCode(error) !== 'ENOENT')
81
+ throw error;
82
+ problems.push(`${label} is missing`);
83
+ continue;
84
+ }
85
+ if (!isContained(root, real)) {
86
+ problems.push(`${label} escapes the asset directory`);
87
+ continue;
88
+ }
89
+ if (!(await stat(real)).isFile()) {
90
+ problems.push(`${label} is not a regular file`);
91
+ continue;
92
+ }
93
+ const content = await readFile(real);
94
+ if (content.length !== bytes(name)) {
95
+ problems.push(`${label} has ${content.length} bytes, manifest lists ${bytes(name)}`);
96
+ continue;
97
+ }
98
+ files.push({ name, content });
99
+ }
100
+ if (problems.length > 0)
101
+ throw new AssetProblemsError(problems);
102
+ return files;
103
+ }
104
+ export async function prepareAssets(options) {
105
+ const problems = brokerAssetsProblems(options.config);
106
+ if (problems.length > 0)
107
+ throw new AssetProblemsError(problems);
108
+ const selection = options.config.assets?.[0];
109
+ if (selection === undefined)
110
+ return null;
111
+ const { provider, resolvedModule } = await loadProvider(selection.provider, path.dirname(options.configPath));
112
+ let result;
113
+ try {
114
+ result = await provider.resolve({ target: options.target });
115
+ }
116
+ catch (error) {
117
+ throw new AssetProblemsError([
118
+ `assets: provider resolve failed: ${error instanceof Error ? error.message : 'unknown error'}`,
119
+ ]);
120
+ }
121
+ const resultProblems = assetProviderResultProblems(result);
122
+ if (resultProblems.length > 0)
123
+ throw new AssetProblemsError(resultProblems);
124
+ const manifestFile = fileURLToPath(result.manifestUrl);
125
+ let manifestBytes;
126
+ try {
127
+ const realManifest = await realpath(manifestFile);
128
+ if (!(await stat(realManifest)).isFile())
129
+ throw Object.assign(new Error(), { code: 'EISDIR' });
130
+ manifestBytes = await readFile(realManifest);
131
+ }
132
+ catch (error) {
133
+ if (errorCode(error) !== 'ENOENT' && errorCode(error) !== 'EISDIR')
134
+ throw error;
135
+ throw new AssetProblemsError(['assets: provider manifest could not be read']);
136
+ }
137
+ let manifest;
138
+ try {
139
+ manifest = parseUiManifest(manifestBytes.toString('utf8'));
140
+ }
141
+ catch (error) {
142
+ throw new AssetProblemsError([
143
+ `assets: ${error instanceof Error ? error.message : 'invalid UI manifest'}`,
144
+ ]);
145
+ }
146
+ const names = Object.keys(manifest.files).sort();
147
+ if (names.includes(MANIFEST_FILE)) {
148
+ throw new AssetProblemsError([`assets: manifest must not list ${MANIFEST_FILE}`]);
149
+ }
150
+ const listed = await readListedFiles(manifestFile, names, (name) => manifest.files[name].bytes);
151
+ const version = await readProviderVersion(resolvedModule);
152
+ if (version === null) {
153
+ throw new AssetProblemsError([
154
+ `assets: provider "${selection.provider}" has no package version`,
155
+ ]);
156
+ }
157
+ const files = [{ name: MANIFEST_FILE, content: manifestBytes }, ...listed];
158
+ const digest = sha256(JSON.stringify(files.map((file) => [file.name, sha256(file.content)])));
159
+ return {
160
+ record: {
161
+ schemaVersion: 1,
162
+ provider: { specifier: selection.provider, version },
163
+ digest: `sha256:${digest}`,
164
+ descriptor: {
165
+ directory: './assets',
166
+ binding: 'ASSETS',
167
+ run_worker_first: true,
168
+ html_handling: 'none',
169
+ not_found_handling: 'none',
170
+ },
171
+ },
172
+ files,
173
+ };
174
+ }
175
+ async function exists(file) {
176
+ try {
177
+ await stat(file);
178
+ return true;
179
+ }
180
+ catch (error) {
181
+ if (errorCode(error) === 'ENOENT')
182
+ return false;
183
+ throw error;
184
+ }
185
+ }
186
+ export async function stageAssets(outDir, prepared) {
187
+ const assetsDir = path.join(outDir, ASSET_DIR);
188
+ const recordFile = path.join(outDir, RECORD_FILE);
189
+ const owned = await exists(recordFile);
190
+ if (prepared === null) {
191
+ if (owned) {
192
+ await rm(assetsDir, { recursive: true, force: true });
193
+ await rm(recordFile, { force: true });
194
+ }
195
+ return;
196
+ }
197
+ if (!owned && (await exists(assetsDir))) {
198
+ throw new AssetProblemsError([
199
+ `assets: output directory "${ASSET_DIR}" exists and is not builder-owned`,
200
+ ]);
201
+ }
202
+ const staging = path.join(outDir, `.${ASSET_DIR}-staging`);
203
+ const pendingRecord = `${recordFile}.tmp`;
204
+ let swapped = false;
205
+ try {
206
+ await rm(staging, { recursive: true, force: true });
207
+ await mkdir(staging, { recursive: true });
208
+ for (const file of prepared.files)
209
+ await writeFile(path.join(staging, file.name), file.content);
210
+ await writeFile(pendingRecord, `${JSON.stringify(prepared.record, null, 2)}\n`);
211
+ await rm(assetsDir, { recursive: true, force: true });
212
+ await rename(staging, assetsDir);
213
+ swapped = true;
214
+ await rename(pendingRecord, recordFile);
215
+ }
216
+ catch (error) {
217
+ await rm(staging, { recursive: true, force: true });
218
+ await rm(pendingRecord, { force: true });
219
+ if (swapped && !owned)
220
+ await rm(assetsDir, { recursive: true, force: true });
221
+ throw error;
222
+ }
223
+ }
224
+ //# sourceMappingURL=build-assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-assets.js","sourceRoot":"","sources":["../src/build-assets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { PackageVisibilityPort } from '@package-broker/core/db/catalogue';
2
+ import type { Platform } from '@package-broker/core/plugin';
3
+ import { type Metafile } from 'esbuild';
4
+ export interface BuildOptions {
5
+ configPath: string;
6
+ target?: Platform;
7
+ outDir?: string;
8
+ cwd?: string;
9
+ runtimeEntry?: string;
10
+ }
11
+ export interface BuildResult {
12
+ outDir: string;
13
+ manifestJson: string;
14
+ manifestTs: string;
15
+ bundle: string;
16
+ migrations: string;
17
+ buildInfo: string;
18
+ metafile: Metafile;
19
+ }
20
+ export declare const declarationOnlyPackageResolver: PackageVisibilityPort;
21
+ export declare class BuildDiagnosticsError extends Error {
22
+ readonly problems: readonly string[];
23
+ constructor(problems: readonly string[]);
24
+ }
25
+ export declare class BuildConfigError extends Error {
26
+ readonly configKeys: readonly string[];
27
+ constructor(keys: readonly string[], message?: string);
28
+ }
29
+ export declare function readNodeDriverVersion(cliRequire?: NodeJS.Require): Promise<string>;
30
+ export declare function build(options: BuildOptions): Promise<BuildResult>;
31
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,KAAK,EAAE,QAAQ,EAAoB,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAC;AA0B1D,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,eAAO,MAAM,8BAA8B,EAAE,qBAG3C,CAAC;AAEH,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;gBAEzB,QAAQ,EAAE,SAAS,MAAM,EAAE;CAKxC;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;gBAE3B,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,SAA8C;CAI3F;AAkDD,wBAAsB,qBAAqB,CACzC,UAAU,GAAE,MAAM,CAAC,OAAwC,GAC1D,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED,wBAAsB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAsNvE"}