@lark-base-open/base-database-cli 1.0.0

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 (149) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +169 -0
  3. package/changelog/CHANGELOG-0.x.md +103 -0
  4. package/config-schema.json +28 -0
  5. package/dist/agent-guide.d.ts +18 -0
  6. package/dist/agent-guide.d.ts.map +1 -0
  7. package/dist/agent-guide.js +30 -0
  8. package/dist/agent-guide.js.map +1 -0
  9. package/dist/archive.d.ts +16 -0
  10. package/dist/archive.d.ts.map +1 -0
  11. package/dist/archive.js +162 -0
  12. package/dist/archive.js.map +1 -0
  13. package/dist/assets.d.ts +4 -0
  14. package/dist/assets.d.ts.map +1 -0
  15. package/dist/assets.js +6 -0
  16. package/dist/assets.js.map +1 -0
  17. package/dist/auth.d.ts +17 -0
  18. package/dist/auth.d.ts.map +1 -0
  19. package/dist/auth.js +63 -0
  20. package/dist/auth.js.map +1 -0
  21. package/dist/cli.d.ts +3 -0
  22. package/dist/cli.d.ts.map +1 -0
  23. package/dist/cli.js +15 -0
  24. package/dist/cli.js.map +1 -0
  25. package/dist/config.d.ts +5 -0
  26. package/dist/config.d.ts.map +1 -0
  27. package/dist/config.js +50 -0
  28. package/dist/config.js.map +1 -0
  29. package/dist/database-skill.d.ts +22 -0
  30. package/dist/database-skill.d.ts.map +1 -0
  31. package/dist/database-skill.js +135 -0
  32. package/dist/database-skill.js.map +1 -0
  33. package/dist/deploy.d.ts +28 -0
  34. package/dist/deploy.d.ts.map +1 -0
  35. package/dist/deploy.js +476 -0
  36. package/dist/deploy.js.map +1 -0
  37. package/dist/environment.d.ts +12 -0
  38. package/dist/environment.d.ts.map +1 -0
  39. package/dist/environment.js +27 -0
  40. package/dist/environment.js.map +1 -0
  41. package/dist/function-schema.d.ts +3 -0
  42. package/dist/function-schema.d.ts.map +1 -0
  43. package/dist/function-schema.js +310 -0
  44. package/dist/function-schema.js.map +1 -0
  45. package/dist/init.d.ts +77 -0
  46. package/dist/init.d.ts.map +1 -0
  47. package/dist/init.js +418 -0
  48. package/dist/init.js.map +1 -0
  49. package/dist/lark-cli.d.ts +8 -0
  50. package/dist/lark-cli.d.ts.map +1 -0
  51. package/dist/lark-cli.js +228 -0
  52. package/dist/lark-cli.js.map +1 -0
  53. package/dist/npm.d.ts +13 -0
  54. package/dist/npm.d.ts.map +1 -0
  55. package/dist/npm.js +93 -0
  56. package/dist/npm.js.map +1 -0
  57. package/dist/page-title.d.ts +3 -0
  58. package/dist/page-title.d.ts.map +1 -0
  59. package/dist/page-title.js +47 -0
  60. package/dist/page-title.js.map +1 -0
  61. package/dist/preview-receipt.d.ts +23 -0
  62. package/dist/preview-receipt.d.ts.map +1 -0
  63. package/dist/preview-receipt.js +133 -0
  64. package/dist/preview-receipt.js.map +1 -0
  65. package/dist/process.d.ts +17 -0
  66. package/dist/process.d.ts.map +1 -0
  67. package/dist/process.js +53 -0
  68. package/dist/process.js.map +1 -0
  69. package/dist/program.d.ts +12 -0
  70. package/dist/program.d.ts.map +1 -0
  71. package/dist/program.js +204 -0
  72. package/dist/program.js.map +1 -0
  73. package/dist/pull.d.ts +18 -0
  74. package/dist/pull.d.ts.map +1 -0
  75. package/dist/pull.js +324 -0
  76. package/dist/pull.js.map +1 -0
  77. package/dist/skill.d.ts +7 -0
  78. package/dist/skill.d.ts.map +1 -0
  79. package/dist/skill.js +28 -0
  80. package/dist/skill.js.map +1 -0
  81. package/dist/types.d.ts +32 -0
  82. package/dist/types.d.ts.map +1 -0
  83. package/dist/types.js +2 -0
  84. package/dist/types.js.map +1 -0
  85. package/dist/workspace-fingerprint.d.ts +8 -0
  86. package/dist/workspace-fingerprint.d.ts.map +1 -0
  87. package/dist/workspace-fingerprint.js +64 -0
  88. package/dist/workspace-fingerprint.js.map +1 -0
  89. package/package.json +54 -0
  90. package/skills/lark-base-database/SKILL.md +307 -0
  91. package/skills/lark-base-database/references/base-capability-routing.md +81 -0
  92. package/skills/lark-base-database/references/base-sql-unsupported.md +42 -0
  93. package/skills/lark-base-database/references/database-capability-skill.md +24 -0
  94. package/skills/lark-base-database/references/development.md +642 -0
  95. package/skills/lark-base-database/references/file-transfer.md +275 -0
  96. package/skills/lark-base-database/references/permission-design.md +138 -0
  97. package/skills/lark-base-database/references/release.md +81 -0
  98. package/skills/lark-base-database/references/sql-function.md +276 -0
  99. package/skills/lark-base-database/references/style-guide.md +88 -0
  100. package/templates/database-capability/SKILL.md.tmpl +41 -0
  101. package/templates/database-starter/README.md +11 -0
  102. package/templates/database-starter/gitignore +3 -0
  103. package/templates/database-starter/page/.prettierignore +4 -0
  104. package/templates/database-starter/page/.prettierrc.json +7 -0
  105. package/templates/database-starter/page/README.md +29 -0
  106. package/templates/database-starter/page/index.html +24 -0
  107. package/templates/database-starter/page/package-lock.json +2675 -0
  108. package/templates/database-starter/page/package.json +44 -0
  109. package/templates/database-starter/page/public/favicon.png +0 -0
  110. package/templates/database-starter/page/src/App.tsx +18 -0
  111. package/templates/database-starter/page/src/components/UserSelectorEditor/index.tsx +267 -0
  112. package/templates/database-starter/page/src/components/UserSelectorPanel/index.css +32 -0
  113. package/templates/database-starter/page/src/components/UserSelectorPanel/index.test.ts +24 -0
  114. package/templates/database-starter/page/src/components/UserSelectorPanel/index.tsx +478 -0
  115. package/templates/database-starter/page/src/components/UserSelectorPanel/user-search.test.ts +175 -0
  116. package/templates/database-starter/page/src/components/UserSelectorPanel/user-search.ts +201 -0
  117. package/templates/database-starter/page/src/components/database-runtime-ready.tsx +21 -0
  118. package/templates/database-starter/page/src/components/database-user-menu/index.tsx +238 -0
  119. package/templates/database-starter/page/src/components/feedback/page-state.tsx +66 -0
  120. package/templates/database-starter/page/src/components/floating-button/chatbot-entry.test.ts +23 -0
  121. package/templates/database-starter/page/src/components/floating-button/chatbot-entry.tsx +873 -0
  122. package/templates/database-starter/page/src/components/floating-button/index.tsx +196 -0
  123. package/templates/database-starter/page/src/components/floating-button/local-chat-panel.test.ts +25 -0
  124. package/templates/database-starter/page/src/components/floating-button/local-chat-panel.tsx +197 -0
  125. package/templates/database-starter/page/src/components/floating-button/utils/current-user.ts +56 -0
  126. package/templates/database-starter/page/src/components/floating-button/utils/env.ts +18 -0
  127. package/templates/database-starter/page/src/components/floating-button/utils/project-meta.test.ts +79 -0
  128. package/templates/database-starter/page/src/components/floating-button/utils/project-meta.ts +252 -0
  129. package/templates/database-starter/page/src/components/ui/button.tsx +56 -0
  130. package/templates/database-starter/page/src/index.css +67 -0
  131. package/templates/database-starter/page/src/lib/cn.test.ts +9 -0
  132. package/templates/database-starter/page/src/lib/cn.ts +7 -0
  133. package/templates/database-starter/page/src/lib/database-runtime-attachment.test.ts +168 -0
  134. package/templates/database-starter/page/src/lib/database-runtime-context.test.ts +111 -0
  135. package/templates/database-starter/page/src/lib/database-runtime.test.ts +103 -0
  136. package/templates/database-starter/page/src/lib/database-runtime.ts +389 -0
  137. package/templates/database-starter/page/src/main.tsx +34 -0
  138. package/templates/database-starter/page/src/vite-env.d.ts +1 -0
  139. package/templates/database-starter/page/tsconfig.json +23 -0
  140. package/templates/database-starter/page/vite.config.ts +13 -0
  141. package/templates/database-starter/prettierignore +1 -0
  142. package/templates/database-starter/server-functions/.prettierignore +3 -0
  143. package/templates/database-starter/server-functions/.prettierrc.json +7 -0
  144. package/templates/database-starter/server-functions/README.md +11 -0
  145. package/templates/database-starter/server-functions/package-lock.json +1687 -0
  146. package/templates/database-starter/server-functions/package.json +22 -0
  147. package/templates/database-starter/server-functions/scripts/run-tsc.mjs +50 -0
  148. package/templates/database-starter/server-functions/tsconfig.json +20 -0
  149. package/templates/database-starter/sql/README.md +8 -0
@@ -0,0 +1,228 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { accessSync, constants } from 'node:fs';
3
+ import { delimiter, isAbsolute, join, relative, resolve } from 'node:path';
4
+ import { readConfig } from './config.js';
5
+ import { assertProjectRuntimeProfile, ONLINE_RUNTIME_PROFILE, } from './environment.js';
6
+ import { runCommand } from './process.js';
7
+ const LARK_CLI_PATH_ENV = 'BASE_DATABASE_LARK_CLI_PATH';
8
+ const larkCliExecutableCache = new Map();
9
+ function pathEnvironment(env) {
10
+ return env.PATH ?? env.Path ?? env.path;
11
+ }
12
+ function assertExecutable(path) {
13
+ try {
14
+ accessSync(path, constants.X_OK);
15
+ }
16
+ catch {
17
+ throw new Error(`lark-cli is not executable: ${path}`);
18
+ }
19
+ }
20
+ function larkCliCandidatePaths(env, cwd) {
21
+ const pathValue = pathEnvironment(env);
22
+ if (!pathValue)
23
+ return [];
24
+ const executableNames = process.platform === 'win32'
25
+ ? (env.PATHEXT ?? '.EXE;.CMD;.BAT;.COM')
26
+ .split(';')
27
+ .filter(Boolean)
28
+ .map((extension) => `lark-cli${extension.toLowerCase()}`)
29
+ : ['lark-cli'];
30
+ const candidates = [];
31
+ const seen = new Set();
32
+ for (const pathEntry of pathValue.split(delimiter)) {
33
+ const directory = resolve(cwd, pathEntry || '.');
34
+ for (const executableName of executableNames) {
35
+ const candidate = join(directory, executableName);
36
+ if (seen.has(candidate))
37
+ continue;
38
+ seen.add(candidate);
39
+ try {
40
+ accessSync(candidate, constants.X_OK);
41
+ candidates.push(candidate);
42
+ }
43
+ catch {
44
+ // Continue searching the remaining PATH entries.
45
+ }
46
+ }
47
+ }
48
+ return candidates;
49
+ }
50
+ function readLarkCliVersion(executable, env, cwd) {
51
+ const result = spawnSync(executable, ['--version'], {
52
+ cwd,
53
+ env: quietEnvironment(env),
54
+ encoding: 'utf8',
55
+ timeout: 5_000,
56
+ });
57
+ if (result.error || result.status !== 0)
58
+ return undefined;
59
+ const output = `${result.stdout ?? ''}\n${result.stderr ?? ''}`;
60
+ for (const line of output.split(/\r?\n/)) {
61
+ const version = /^lark-cli version\s+(\S+)\s*$/i.exec(line)?.[1];
62
+ if (version)
63
+ return version;
64
+ }
65
+ return undefined;
66
+ }
67
+ function versionContainsBuildHash(version) {
68
+ const normalized = version.replace(/^v/i, '');
69
+ const suffix = normalized.replace(/^\d+\.\d+\.\d+/, '');
70
+ const identifiers = suffix.split(/[-+.]/).filter(Boolean);
71
+ return identifiers.some((identifier) => identifier.length >= 7 &&
72
+ /^[0-9a-f]+$/i.test(identifier) &&
73
+ /[a-f]/i.test(identifier));
74
+ }
75
+ export function resolveLarkCliExecutable(env, cwd = process.cwd()) {
76
+ const explicitPath = env[LARK_CLI_PATH_ENV]?.trim();
77
+ if (explicitPath) {
78
+ if (!isAbsolute(explicitPath)) {
79
+ throw new Error(`${LARK_CLI_PATH_ENV} must be an absolute path`);
80
+ }
81
+ assertExecutable(explicitPath);
82
+ return explicitPath;
83
+ }
84
+ const workingDirectory = resolve(cwd);
85
+ const pathValue = pathEnvironment(env) ?? '';
86
+ const cacheKey = `${workingDirectory}\u0000${pathValue}\u0000${env.PATHEXT ?? ''}`;
87
+ const cached = larkCliExecutableCache.get(cacheKey);
88
+ if (cached)
89
+ return cached;
90
+ const candidates = larkCliCandidatePaths(env, workingDirectory);
91
+ const rejected = [];
92
+ for (const candidate of candidates) {
93
+ const version = readLarkCliVersion(candidate, env, workingDirectory);
94
+ if (!version) {
95
+ rejected.push(`${candidate} (unrecognized --version output)`);
96
+ continue;
97
+ }
98
+ if (versionContainsBuildHash(version)) {
99
+ rejected.push(`${candidate} (${version}, contains a build hash)`);
100
+ continue;
101
+ }
102
+ larkCliExecutableCache.set(cacheKey, candidate);
103
+ return candidate;
104
+ }
105
+ const detail = rejected.length > 0 ? ` Rejected candidates: ${rejected.join('; ')}` : '';
106
+ throw new Error(`No release lark-cli was found in PATH.${detail} Set ${LARK_CLI_PATH_ENV} to an absolute executable path to override automatic selection.`);
107
+ }
108
+ function withUserIdentity(args) {
109
+ const commandArgs = [...args];
110
+ if (args[0] !== 'api' && args[0] !== 'base')
111
+ return commandArgs;
112
+ let identityPresent = false;
113
+ for (let index = 0; index < args.length; index += 1) {
114
+ const argument = args[index];
115
+ if (argument === undefined)
116
+ continue;
117
+ if (argument === '--as') {
118
+ const identity = args[index + 1];
119
+ if (!identity)
120
+ throw new Error('lark-cli requires a value after --as');
121
+ if (identity !== 'user') {
122
+ throw new Error(`Base Database CLI lark-cli requires --as user; received ${identity}`);
123
+ }
124
+ identityPresent = true;
125
+ index += 1;
126
+ }
127
+ else if (argument.startsWith('--as=')) {
128
+ const identity = argument.slice('--as='.length);
129
+ if (identity !== 'user') {
130
+ throw new Error(`Base Database CLI lark-cli requires --as user; received ${identity || '(empty)'}`);
131
+ }
132
+ identityPresent = true;
133
+ }
134
+ }
135
+ if (!identityPresent && !args.includes('--help') && !args.includes('-h')) {
136
+ commandArgs.push('--as', 'user');
137
+ }
138
+ return commandArgs;
139
+ }
140
+ function quietEnvironment(env) {
141
+ return {
142
+ ...env,
143
+ LARKSUITE_CLI_NO_UPDATE_NOTIFIER: '1',
144
+ LARKSUITE_CLI_NO_SKILLS_NOTIFIER: '1',
145
+ };
146
+ }
147
+ export function runLarkCli(args, env, cwd) {
148
+ const commandArgs = withUserIdentity(args);
149
+ if (!args.includes('--json') && !args.includes('--format')) {
150
+ commandArgs.push('--json');
151
+ }
152
+ const result = spawnSync(resolveLarkCliExecutable(env, cwd), commandArgs, {
153
+ cwd,
154
+ env: quietEnvironment(env),
155
+ encoding: 'utf8',
156
+ timeout: 90_000,
157
+ });
158
+ if (result.error)
159
+ throw result.error;
160
+ let response;
161
+ try {
162
+ response = JSON.parse(result.stdout);
163
+ }
164
+ catch {
165
+ throw new Error((result.stderr || result.stdout || 'lark-cli returned no JSON').trim());
166
+ }
167
+ if (result.status === 0 &&
168
+ args[0] === 'auth' &&
169
+ response &&
170
+ typeof response === 'object' &&
171
+ !Object.hasOwn(response, 'ok')) {
172
+ return { ok: true, data: response };
173
+ }
174
+ if (result.status !== 0 ||
175
+ !response ||
176
+ typeof response !== 'object' ||
177
+ response.ok !== true) {
178
+ const failure = response;
179
+ const logId = failure.error?.log_id;
180
+ const message = failure.error?.message || failure.msg || result.stderr;
181
+ throw new Error(`${String(message || 'lark-cli request failed').trim()}${logId ? ` (LogID: ${logId})` : ''}`);
182
+ }
183
+ return response;
184
+ }
185
+ export async function runProjectLarkCli(args, profile = ONLINE_RUNTIME_PROFILE) {
186
+ if (args.length === 0) {
187
+ throw new Error('Pass lark-cli arguments after `--`');
188
+ }
189
+ const directory = process.cwd();
190
+ const config = readConfig(directory);
191
+ assertProjectRuntimeProfile(config.runtimeProfile, profile);
192
+ const env = await profile.commandEnvironment();
193
+ runCommand(resolveLarkCliExecutable(env, directory), withUserIdentity(args), {
194
+ cwd: directory,
195
+ env: quietEnvironment(env),
196
+ });
197
+ }
198
+ export function responseData(response) {
199
+ if (!response.data || typeof response.data !== 'object') {
200
+ throw new Error('lark-cli response does not contain data');
201
+ }
202
+ return response.data;
203
+ }
204
+ export function runLarkCliOutput(method, path, output, env, cwd) {
205
+ const workingDirectory = resolve(cwd ?? process.cwd());
206
+ const resolvedOutput = resolve(workingDirectory, output);
207
+ const relativeOutput = relative(workingDirectory, resolvedOutput);
208
+ if (relativeOutput === '..' ||
209
+ relativeOutput.startsWith('../') ||
210
+ isAbsolute(relativeOutput)) {
211
+ throw new Error(`lark-cli output must stay within cwd: output=${output}, cwd=${workingDirectory}`);
212
+ }
213
+ if (relativeOutput.length === 0) {
214
+ throw new Error('lark-cli output must name a file within cwd');
215
+ }
216
+ const result = spawnSync(resolveLarkCliExecutable(env, workingDirectory), ['api', method, path, '--output', relativeOutput, '--as', 'user'], {
217
+ cwd: workingDirectory,
218
+ env: quietEnvironment(env),
219
+ encoding: 'utf8',
220
+ timeout: 90_000,
221
+ });
222
+ if (result.error)
223
+ throw result.error;
224
+ if (result.status !== 0) {
225
+ throw new Error((result.stderr || result.stdout || 'lark-cli download failed').trim());
226
+ }
227
+ }
228
+ //# sourceMappingURL=lark-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lark-cli.js","sourceRoot":"","sources":["../src/lark-cli.ts"],"names":[],"mappings":"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"}
package/dist/npm.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ export declare const PINNED_NPM_VERSION = "10.9.2";
2
+ export interface WorkspaceNpm {
3
+ version: string;
4
+ run(args: string[], options: {
5
+ cwd?: string;
6
+ env?: NodeJS.ProcessEnv;
7
+ }): Promise<void>;
8
+ }
9
+ export declare function resolveWorkspaceNpm(): WorkspaceNpm;
10
+ export declare function lockRepairHint(directory: string, npmVersion: string): string;
11
+ /** Fast local validation before any remote calls or node_modules changes. */
12
+ export declare function validateDependencyLock(project: string, directory: string, npmVersion: string): void;
13
+ //# sourceMappingURL=npm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm.d.ts","sourceRoot":"","sources":["../src/npm.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAE3C,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CACD,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;KAAE,GACjD,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED,wBAAgB,mBAAmB,IAAI,YAAY,CA6BlD;AAMD,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED,6EAA6E;AAC7E,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,IAAI,CA8DN"}
package/dist/npm.js ADDED
@@ -0,0 +1,93 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { createRequire } from 'node:module';
3
+ import { dirname, join } from 'node:path';
4
+ import { runCommandAsync } from './process.js';
5
+ // Keep public and internal package dependencies in sync; verified by tests.
6
+ export const PINNED_NPM_VERSION = '10.9.2';
7
+ export function resolveWorkspaceNpm() {
8
+ const require = createRequire(import.meta.url);
9
+ let packagePath;
10
+ try {
11
+ packagePath = require.resolve('npm/package.json');
12
+ }
13
+ catch {
14
+ throw new Error(`CLI npm@${PINNED_NPM_VERSION} is missing. Reinstall this CLI package; changing the global npm version will not repair it.`);
15
+ }
16
+ const version = JSON.parse(readFileSync(packagePath, 'utf8')).version;
17
+ const entry = join(dirname(packagePath), 'bin/npm-cli.js');
18
+ if (version !== PINNED_NPM_VERSION || !existsSync(entry)) {
19
+ throw new Error(`CLI requires its own npm@${PINNED_NPM_VERSION}, found ${String(version)}. Reinstall this CLI package.`);
20
+ }
21
+ return {
22
+ version,
23
+ run: (args, options) => runCommandAsync(process.execPath, [entry, ...args], {
24
+ ...options,
25
+ captureStderr: true,
26
+ }),
27
+ };
28
+ }
29
+ function record(value) {
30
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
31
+ }
32
+ export function lockRepairHint(directory, npmVersion) {
33
+ return `In ${directory}, review package.json, then run: npx --yes npm@${npmVersion} install --package-lock-only --ignore-scripts --no-audit --no-fund. Review the lock diff and retry deploy once. Keep the original lock; do not delete it or bypass installation.`;
34
+ }
35
+ /** Fast local validation before any remote calls or node_modules changes. */
36
+ export function validateDependencyLock(project, directory, npmVersion) {
37
+ const packagePath = join(project, 'package.json');
38
+ const lockName = existsSync(join(project, 'npm-shrinkwrap.json'))
39
+ ? 'npm-shrinkwrap.json'
40
+ : 'package-lock.json';
41
+ const fail = (message) => {
42
+ throw new Error(`Dependency lock validation failed for ${directory}: ${message}\n${lockRepairHint(directory, npmVersion)}`);
43
+ };
44
+ let manifest;
45
+ let lock;
46
+ try {
47
+ manifest = JSON.parse(readFileSync(packagePath, 'utf8'));
48
+ lock = JSON.parse(readFileSync(join(project, lockName), 'utf8'));
49
+ }
50
+ catch (error) {
51
+ fail(`Cannot read package.json or ${lockName}: ${String(error)}`);
52
+ }
53
+ if (!record(manifest) || !record(lock))
54
+ return fail('package.json and lock must be JSON objects.');
55
+ if (!Number.isSafeInteger(lock.lockfileVersion) ||
56
+ Number(lock.lockfileVersion) < 1) {
57
+ fail(`${lockName} has no supported lockfileVersion.`);
58
+ }
59
+ // v1 has no root manifest snapshot; npm ci performs the full graph validation.
60
+ if (lock.lockfileVersion === 1)
61
+ return;
62
+ const packages = lock.packages;
63
+ if (!record(packages) || !record(packages['']))
64
+ return fail(`${lockName} is missing its root package snapshot.`);
65
+ const root = packages[''];
66
+ for (const field of [
67
+ 'dependencies',
68
+ 'devDependencies',
69
+ 'optionalDependencies',
70
+ 'peerDependencies',
71
+ ]) {
72
+ const expected = manifest[field] ?? {};
73
+ const actual = root[field] ?? {};
74
+ if (!record(expected) || !record(actual))
75
+ return fail(`Invalid ${field} in package.json or ${lockName}.`);
76
+ for (const name of new Set([
77
+ ...Object.keys(expected),
78
+ ...Object.keys(actual),
79
+ ])) {
80
+ // npm omits required entries overridden by optionalDependencies from
81
+ // the root lock snapshot. Check their effective spec in the optional group.
82
+ if (field === 'dependencies' &&
83
+ record(manifest.optionalDependencies) &&
84
+ Object.hasOwn(manifest.optionalDependencies, name)) {
85
+ continue;
86
+ }
87
+ if (expected[name] !== actual[name]) {
88
+ fail(`package.json ${field}.${name} does not match ${lockName}; synchronize the declared dependency and lock.`);
89
+ }
90
+ }
91
+ }
92
+ }
93
+ //# sourceMappingURL=npm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm.js","sourceRoot":"","sources":["../src/npm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function writePageTitle(workspace: string, title: string): void;
2
+ export declare function validatePageTitle(workspace: string): string;
3
+ //# sourceMappingURL=page-title.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-title.d.ts","sourceRoot":"","sources":["../src/page-title.ts"],"names":[],"mappings":"AAkBA,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAsBrE;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA8B3D"}
@@ -0,0 +1,47 @@
1
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { join, resolve } from 'node:path';
3
+ const titleWhitespaceEntityPattern = /&(?:nbsp|#(?:0*9|0*10|0*13|0*32)|#x(?:0*9|0*a|0*d|0*20));/gi;
4
+ const starterTitlePlaceholder = '<title></title>';
5
+ function pageIndexPath(workspace) {
6
+ return join(resolve(workspace), 'page/index.html');
7
+ }
8
+ function escapeHTMLText(value) {
9
+ return value
10
+ .replaceAll('&', '&amp;')
11
+ .replaceAll('<', '&lt;')
12
+ .replaceAll('>', '&gt;');
13
+ }
14
+ export function writePageTitle(workspace, title) {
15
+ const path = pageIndexPath(workspace);
16
+ const normalizedTitle = title.trim();
17
+ if (normalizedTitle === '') {
18
+ throw new Error('Page title must be a non-empty string.');
19
+ }
20
+ const source = readFileSync(path, 'utf8');
21
+ const placeholders = source.split(starterTitlePlaceholder).length - 1;
22
+ if (placeholders !== 1) {
23
+ throw new Error(`Cannot initialize page title: ${path} must contain exactly one ${starterTitlePlaceholder} placeholder; found ${placeholders}.`);
24
+ }
25
+ writeFileSync(path, source.replace(starterTitlePlaceholder, `<title>${escapeHTMLText(normalizedTitle)}</title>`));
26
+ }
27
+ export function validatePageTitle(workspace) {
28
+ const path = pageIndexPath(workspace);
29
+ if (!existsSync(path)) {
30
+ throw new Error(`Page entry is missing: ${path}`);
31
+ }
32
+ const source = readFileSync(path, 'utf8')
33
+ .replace(/<!--[\s\S]*?-->/g, '')
34
+ .replace(/<(?:script|style|template|noscript)\b[^>]*>[\s\S]*?<\/(?:script|style|template|noscript)\s*>/gi, '');
35
+ const titles = Array.from(source.matchAll(/<title(?:\s[^>]*)?>([\s\S]*?)<\/title\s*>/gi));
36
+ if (titles.length !== 1) {
37
+ throw new Error(`Page title is required: ${path} must contain exactly one non-empty <title> element; found ${titles.length}.`);
38
+ }
39
+ const title = (titles[0]?.[1] ?? '')
40
+ .replace(titleWhitespaceEntityPattern, ' ')
41
+ .trim();
42
+ if (title === '') {
43
+ throw new Error(`Page title is required: ${path} must contain exactly one non-empty <title> element.`);
44
+ }
45
+ return title;
46
+ }
47
+ //# sourceMappingURL=page-title.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-title.js","sourceRoot":"","sources":["../src/page-title.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,4BAA4B,GAChC,6DAA6D,CAAC;AAChE,MAAM,uBAAuB,GAAG,iBAAiB,CAAC;AAElD,SAAS,aAAa,CAAC,SAAiB;IACtC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,iBAAiB,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,OAAO,KAAK;SACT,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;SACxB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,KAAa;IAC7D,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IACtC,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,eAAe,KAAK,EAAE,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACtE,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,iCAAiC,IAAI,6BAA6B,uBAAuB,uBAAuB,YAAY,GAAG,CAChI,CAAC;IACJ,CAAC;IAED,aAAa,CACX,IAAI,EACJ,MAAM,CAAC,OAAO,CACZ,uBAAuB,EACvB,UAAU,cAAc,CAAC,eAAe,CAAC,UAAU,CACpD,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC;SACtC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,OAAO,CACN,gGAAgG,EAChG,EAAE,CACH,CAAC;IACJ,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CACvB,MAAM,CAAC,QAAQ,CAAC,6CAA6C,CAAC,CAC/D,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,2BAA2B,IAAI,8DAA8D,MAAM,CAAC,MAAM,GAAG,CAC9G,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACjC,OAAO,CAAC,4BAA4B,EAAE,GAAG,CAAC;SAC1C,IAAI,EAAE,CAAC;IACV,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,2BAA2B,IAAI,sDAAsD,CACtF,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { type WorkspaceInputFingerprint } from './workspace-fingerprint.js';
2
+ export interface PreviewReceipt {
3
+ receiptVersion?: number;
4
+ appToken: string;
5
+ artifact: string;
6
+ sha256: string;
7
+ bytes: number;
8
+ publishId: string;
9
+ staticUrl?: string;
10
+ workspaceInputFingerprint?: string;
11
+ workspaceInputFingerprintAlgorithm?: string;
12
+ workspaceInputFileCount?: number;
13
+ builderTurnId?: string;
14
+ builderTurnGeneration?: number;
15
+ createdAt?: number;
16
+ }
17
+ type PreviewArtifact = Pick<PreviewReceipt, 'appToken' | 'artifact' | 'sha256' | 'bytes' | 'publishId'>;
18
+ export declare function writePendingPreviewReceipt(workspace: string, artifact: PreviewArtifact, workspaceInput: WorkspaceInputFingerprint): void;
19
+ export declare function finalizePreviewReceipt(workspace: string, appToken: string, publishId: string, staticUrl?: string): PreviewReceipt;
20
+ export declare function readPreviewReceiptForProduction(workspace: string, appToken: string): PreviewReceipt;
21
+ export declare function previewArtifact(appToken: string, artifact: string, publishId: string): PreviewArtifact;
22
+ export {};
23
+ //# sourceMappingURL=preview-receipt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-receipt.d.ts","sourceRoot":"","sources":["../src/preview-receipt.ts"],"names":[],"mappings":"AAYA,OAAO,EAGL,KAAK,yBAAyB,EAC/B,MAAM,4BAA4B,CAAC;AAIpC,MAAM,WAAW,cAAc;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,kCAAkC,CAAC,EAAE,MAAM,CAAC;IAC5C,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAOD,KAAK,eAAe,GAAG,IAAI,CACzB,cAAc,EACd,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,WAAW,CAC3D,CAAC;AAqGF,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,eAAe,EACzB,cAAc,EAAE,yBAAyB,GACxC,IAAI,CAKN;AAED,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,GACjB,cAAc,CAmChB;AAED,wBAAgB,+BAA+B,CAC7C,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,cAAc,CAWhB;AAED,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,eAAe,CAQjB"}
@@ -0,0 +1,133 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, statSync, writeFileSync, } from 'node:fs';
3
+ import { dirname, join } from 'node:path';
4
+ import { WORKSPACE_INPUT_FINGERPRINT_ALGORITHM, workspaceInputFingerprint, } from './workspace-fingerprint.js';
5
+ const PREVIEW_RECEIPT_VERSION = 2;
6
+ function statePath(workspace, name) {
7
+ return join(workspace, '.base-database-cli/state', name);
8
+ }
9
+ function builderTurnContext() {
10
+ const contextPath = process.env.BASE_SITE_BUILDER_TURN_CONTEXT_FILE?.trim();
11
+ if (!contextPath)
12
+ return undefined;
13
+ let value;
14
+ try {
15
+ value = JSON.parse(readFileSync(contextPath, 'utf8'));
16
+ }
17
+ catch {
18
+ throw new Error('Builder turn context is unavailable or invalid');
19
+ }
20
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
21
+ throw new Error('Builder turn context must be an object');
22
+ }
23
+ const context = value;
24
+ if (typeof context.builderTurnId !== 'string' ||
25
+ context.builderTurnId.trim() === '' ||
26
+ context.builderTurnId.length > 256 ||
27
+ !Number.isSafeInteger(context.builderTurnGeneration) ||
28
+ (context.builderTurnGeneration ?? 0) < 1) {
29
+ throw new Error('Builder turn context is missing a valid turn ID or generation');
30
+ }
31
+ return {
32
+ builderTurnId: context.builderTurnId,
33
+ builderTurnGeneration: context.builderTurnGeneration,
34
+ };
35
+ }
36
+ function receiptForPreview(artifact, workspaceInput) {
37
+ return {
38
+ ...artifact,
39
+ receiptVersion: PREVIEW_RECEIPT_VERSION,
40
+ workspaceInputFingerprint: workspaceInput.sha256,
41
+ workspaceInputFingerprintAlgorithm: workspaceInput.algorithm,
42
+ workspaceInputFileCount: workspaceInput.fileCount,
43
+ ...(builderTurnContext() ?? {}),
44
+ };
45
+ }
46
+ function writeJSONAtomically(path, value) {
47
+ mkdirSync(dirname(path), { recursive: true });
48
+ const temporary = `${path}.${String(process.pid)}.tmp`;
49
+ writeFileSync(temporary, `${JSON.stringify(value, null, 2)}\n`);
50
+ renameSync(temporary, path);
51
+ }
52
+ function readReceipt(path, missingMessage) {
53
+ let receipt;
54
+ try {
55
+ receipt = JSON.parse(readFileSync(path, 'utf8'));
56
+ }
57
+ catch {
58
+ throw new Error(missingMessage);
59
+ }
60
+ if (!receipt.artifact || !receipt.sha256 || !receipt.publishId) {
61
+ throw new Error(`Invalid Preview receipt: ${path}`);
62
+ }
63
+ return receipt;
64
+ }
65
+ function verifyArtifact(receipt) {
66
+ const currentHash = createHash('sha256')
67
+ .update(readFileSync(receipt.artifact))
68
+ .digest('hex');
69
+ if (currentHash !== receipt.sha256) {
70
+ throw new Error('The Preview artifact changed; deploy a new Preview first');
71
+ }
72
+ }
73
+ function verifyWorkspace(workspace, receipt) {
74
+ if (receipt.receiptVersion !== PREVIEW_RECEIPT_VERSION ||
75
+ receipt.workspaceInputFingerprintAlgorithm !==
76
+ WORKSPACE_INPUT_FINGERPRINT_ALGORITHM ||
77
+ typeof receipt.workspaceInputFingerprint !== 'string' ||
78
+ !/^[0-9a-f]{64}$/.test(receipt.workspaceInputFingerprint)) {
79
+ throw new Error('The Preview receipt cannot verify the current application workspace; run `deploy` again before publishing Production');
80
+ }
81
+ if (workspaceInputFingerprint(workspace).sha256 !==
82
+ receipt.workspaceInputFingerprint) {
83
+ throw new Error('The application workspace changed after Preview; run `deploy` again before publishing Production');
84
+ }
85
+ }
86
+ export function writePendingPreviewReceipt(workspace, artifact, workspaceInput) {
87
+ writeJSONAtomically(statePath(workspace, 'pending-preview.json'), receiptForPreview(artifact, workspaceInput));
88
+ }
89
+ export function finalizePreviewReceipt(workspace, appToken, publishId, staticUrl) {
90
+ const pendingPath = statePath(workspace, 'pending-preview.json');
91
+ if (!existsSync(pendingPath)) {
92
+ const existing = readReceipt(statePath(workspace, 'preview.json'), 'No matching Preview build record found; run `deploy` again');
93
+ if (existing.appToken !== appToken || existing.publishId !== publishId) {
94
+ throw new Error('No matching Preview build record found; run `deploy` again');
95
+ }
96
+ verifyArtifact(existing);
97
+ verifyWorkspace(workspace, existing);
98
+ return existing;
99
+ }
100
+ const pending = readReceipt(pendingPath, 'No matching Preview build record found; run `deploy` again');
101
+ if (pending.appToken !== appToken || pending.publishId !== publishId) {
102
+ throw new Error('The Preview build record does not match this application or publish task; run `deploy` again');
103
+ }
104
+ verifyArtifact(pending);
105
+ verifyWorkspace(workspace, pending);
106
+ const receipt = {
107
+ ...pending,
108
+ ...(staticUrl ? { staticUrl } : {}),
109
+ createdAt: Date.now(),
110
+ };
111
+ writeJSONAtomically(statePath(workspace, 'preview.json'), receipt);
112
+ rmSync(pendingPath, { force: true });
113
+ return receipt;
114
+ }
115
+ export function readPreviewReceiptForProduction(workspace, appToken) {
116
+ const receipt = readReceipt(statePath(workspace, 'preview.json'), 'No verified Preview found; run `deploy` first');
117
+ if (receipt.appToken !== appToken) {
118
+ throw new Error('Preview receipt belongs to a different application');
119
+ }
120
+ verifyArtifact(receipt);
121
+ verifyWorkspace(workspace, receipt);
122
+ return receipt;
123
+ }
124
+ export function previewArtifact(appToken, artifact, publishId) {
125
+ return {
126
+ appToken,
127
+ artifact,
128
+ sha256: createHash('sha256').update(readFileSync(artifact)).digest('hex'),
129
+ bytes: statSync(artifact).size,
130
+ publishId,
131
+ };
132
+ }
133
+ //# sourceMappingURL=preview-receipt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-receipt.js","sourceRoot":"","sources":["../src/preview-receipt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export declare class CommandExecutionError extends Error {
2
+ readonly stderr: string;
3
+ readonly exitCode: number | null;
4
+ constructor(message: string, stderr: string, exitCode: number | null);
5
+ }
6
+ export declare function runCommand(command: string, args: string[], options?: {
7
+ cwd?: string;
8
+ env?: NodeJS.ProcessEnv;
9
+ capture?: boolean;
10
+ timeout?: number;
11
+ }): string;
12
+ export declare function runCommandAsync(command: string, args: string[], options?: {
13
+ cwd?: string;
14
+ env?: NodeJS.ProcessEnv;
15
+ captureStderr?: boolean;
16
+ }): Promise<void>;
17
+ //# sourceMappingURL=process.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../src/process.ts"],"names":[],"mappings":"AAEA,qBAAa,qBAAsB,SAAQ,KAAK;IAG5C,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAHlC,YACE,OAAO,EAAE,MAAM,EACN,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GAAG,IAAI,EAIjC;CACF;AAED,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE;IACP,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CACb,GACL,MAAM,CAmBR;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE;IACP,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;CACpB,GACL,OAAO,CAAC,IAAI,CAAC,CA2Bf"}