@supatype/cli 0.3.2 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/.turbo/turbo-test.log +163 -161
- package/.turbo/turbo-typecheck.log +1 -1
- package/CHANGELOG.md +77 -0
- package/dist/augmentation-generator.d.ts.map +1 -1
- package/dist/augmentation-generator.js +70 -15
- package/dist/augmentation-generator.js.map +1 -1
- package/dist/cli-version-embedded.js +1 -1
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +3 -3
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +29 -19
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/seed.d.ts +27 -1
- package/dist/commands/seed.d.ts.map +1 -1
- package/dist/commands/seed.js +206 -33
- package/dist/commands/seed.js.map +1 -1
- package/dist/engine-client.d.ts +1 -0
- package/dist/engine-client.d.ts.map +1 -1
- package/dist/engine-client.js +47 -2
- package/dist/engine-client.js.map +1 -1
- package/dist/engine-floor.d.ts +27 -4
- package/dist/engine-floor.d.ts.map +1 -1
- package/dist/engine-floor.js +90 -9
- package/dist/engine-floor.js.map +1 -1
- package/dist/gitignore.d.ts.map +1 -1
- package/dist/gitignore.js +7 -0
- package/dist/gitignore.js.map +1 -1
- package/dist/hooks-generator.d.ts.map +1 -1
- package/dist/hooks-generator.js +18 -3
- package/dist/hooks-generator.js.map +1 -1
- package/dist/seed-connection.d.ts +60 -0
- package/dist/seed-connection.d.ts.map +1 -0
- package/dist/seed-connection.js +90 -0
- package/dist/seed-connection.js.map +1 -0
- package/dist/seed-ir.d.ts +66 -0
- package/dist/seed-ir.d.ts.map +1 -0
- package/dist/seed-ir.js +265 -0
- package/dist/seed-ir.js.map +1 -0
- package/dist/seed-runner.d.ts +44 -0
- package/dist/seed-runner.d.ts.map +1 -0
- package/dist/seed-runner.js +83 -0
- package/dist/seed-runner.js.map +1 -0
- package/dist/seed.d.ts +345 -0
- package/dist/seed.d.ts.map +1 -1
- package/dist/seed.js +138 -0
- package/dist/seed.js.map +1 -1
- package/dist/self-host-compose.d.ts.map +1 -1
- package/dist/self-host-compose.js +14 -8
- package/dist/self-host-compose.js.map +1 -1
- package/dist/type-extractor.d.ts.map +1 -1
- package/dist/type-extractor.js +73 -0
- package/dist/type-extractor.js.map +1 -1
- package/dist/type-generation.d.ts +29 -0
- package/dist/type-generation.d.ts.map +1 -1
- package/dist/type-generation.js +52 -0
- package/dist/type-generation.js.map +1 -1
- package/package.json +2 -2
- package/src/augmentation-generator.ts +73 -14
- package/src/cli-version-embedded.ts +1 -1
- package/src/commands/generate.ts +7 -3
- package/src/commands/init.ts +31 -21
- package/src/commands/seed.ts +294 -44
- package/src/engine-client.ts +52 -3
- package/src/engine-floor.ts +100 -9
- package/src/gitignore.ts +7 -0
- package/src/hooks-generator.ts +21 -6
- package/src/seed-connection.ts +146 -0
- package/src/seed-ir.ts +311 -0
- package/src/seed-runner.ts +109 -0
- package/src/seed.ts +408 -0
- package/src/self-host-compose.ts +14 -8
- package/src/type-extractor.ts +101 -0
- package/src/type-generation.ts +64 -0
- package/tests/access-composition.test.ts +123 -0
- package/tests/augmentation-generator.test.ts +149 -9
- package/tests/engine-floor.test.ts +93 -0
- package/tests/fixtures/seed_golden_ir.json +186 -0
- package/tests/runtime-contract.test.ts +31 -6
- package/tests/seed-connection.test.ts +158 -0
- package/tests/seed-ir.test.ts +436 -0
- package/tsconfig.tsbuildinfo +1 -1
package/dist/commands/seed.js
CHANGED
|
@@ -1,12 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `supatype seed`: find the seed files, collect what they describe, hand it to the engine.
|
|
3
|
+
*
|
|
4
|
+
* Discovery and the Cloud guard are what this command already did. The rest is new only in
|
|
5
|
+
* that it collects rather than executes: no connection handling, no SQL, no transaction, no
|
|
6
|
+
* error mapping, because those are the engine's now and six more language runners should not
|
|
7
|
+
* each reimplement them and disagree.
|
|
8
|
+
*
|
|
9
|
+
* Both module shapes are supported. A default-exported function is the new contract and is
|
|
10
|
+
* handed a context; a module with no default export is the old one, which does its work on
|
|
11
|
+
* import and is told so by name. Nothing here removes the old shape.
|
|
12
|
+
*/
|
|
1
13
|
import { existsSync, readdirSync } from "node:fs";
|
|
2
|
-
import { join, resolve } from "node:path";
|
|
3
|
-
import { isLinkedToCloudProject } from "../binary-cache.js";
|
|
4
|
-
import { loadConfig } from "../config.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
14
|
+
import { join, relative, resolve, sep } from "node:path";
|
|
15
|
+
import { isLinkedToCloudProject, pinnedVersion } from "../binary-cache.js";
|
|
16
|
+
import { loadConfig, loadSchemaAst } from "../config.js";
|
|
17
|
+
import { engineRequest, ensureEngine } from "../engine-client.js";
|
|
18
|
+
import { seedUnsupportedByPinnedEngine } from "../engine-floor.js";
|
|
19
|
+
import { pgSchema, projectRootFromConfig, schemaPathFromProject } from "../project-config.js";
|
|
20
|
+
import { DsnNotFound, redact, resolveSeedDsn } from "../seed-connection.js";
|
|
21
|
+
import { collectSeed, SeedCollectionFailed } from "../seed-runner.js";
|
|
22
|
+
import { seedBuilderPathWithDefaults } from "../type-generation.js";
|
|
23
|
+
import { error, info, success, warn } from "../ui/messages.js";
|
|
8
24
|
const SEED_EXT = /\.(ts|mts|tsx)$/;
|
|
9
|
-
/** Seed entries under `seeds/`, sorted by filename
|
|
25
|
+
/** Seed entries under `seeds/`, sorted by filename. */
|
|
10
26
|
export function discoverSeedsDir(cwd, seedsDir) {
|
|
11
27
|
if (!existsSync(seedsDir))
|
|
12
28
|
return [];
|
|
@@ -19,38 +35,195 @@ export function registerSeed(program) {
|
|
|
19
35
|
.command("seed [file]")
|
|
20
36
|
.description("Run database seeds: optional single file; else all seeds/*.ts (alphabetical); else seed.ts")
|
|
21
37
|
.option("--force", "Allow running when the project is linked to Supatype Cloud (dangerous)", false)
|
|
38
|
+
.option("--atomic", "Run every seed file in one transaction", false)
|
|
39
|
+
.option("--status", "Show what has been applied, and what has changed since", false)
|
|
40
|
+
.option("--connection <dsn>", "Database to seed, instead of the resolved one")
|
|
41
|
+
.option("--environment <name>", "Environment name, for an `environment` condition")
|
|
22
42
|
.action(async (file, opts) => {
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
43
|
+
const code = await runSeed(file, opts);
|
|
44
|
+
if (code !== 0)
|
|
45
|
+
process.exit(code);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Separated from the action so the exit code is a value rather than a side effect.
|
|
50
|
+
*
|
|
51
|
+
* `0` applied, `1` a seed failed, `2` the run could not start. The split is what lets CI
|
|
52
|
+
* retry one and not the other.
|
|
53
|
+
*/
|
|
54
|
+
export async function runSeed(file, opts) {
|
|
55
|
+
const cwd = process.cwd();
|
|
56
|
+
const config = loadConfig(cwd);
|
|
57
|
+
if (isLinkedToCloudProject(cwd, config) && !opts.force) {
|
|
58
|
+
error("This project is linked to Supatype Cloud. Refusing to run seeds locally.\n" +
|
|
59
|
+
" Pass --force only if you intend to target this linked project (advanced).");
|
|
60
|
+
return 2;
|
|
61
|
+
}
|
|
62
|
+
// Before the connection is resolved and before a builder is looked for: an engine that cannot
|
|
63
|
+
// seed makes both of those pointless, and the pin is the cheapest thing here to read.
|
|
64
|
+
const tooOld = seedUnsupportedByPinnedEngine(pinnedVersion("engine", config));
|
|
65
|
+
if (tooOld !== undefined) {
|
|
66
|
+
error(tooOld);
|
|
67
|
+
return 2;
|
|
68
|
+
}
|
|
69
|
+
let dsn;
|
|
70
|
+
try {
|
|
71
|
+
dsn = resolveSeedDsn(cwd, config, {
|
|
72
|
+
connection: opts.connection,
|
|
73
|
+
allowDerived: true,
|
|
74
|
+
}).dsn;
|
|
75
|
+
}
|
|
76
|
+
catch (e) {
|
|
77
|
+
error(e instanceof DsnNotFound ? e.message : String(e));
|
|
78
|
+
return 2;
|
|
79
|
+
}
|
|
80
|
+
await ensureEngine();
|
|
81
|
+
if (opts.status)
|
|
82
|
+
return await reportStatus(dsn);
|
|
83
|
+
const paths = seedPaths(file, cwd, config);
|
|
84
|
+
const missing = paths.filter((p) => !existsSync(p));
|
|
85
|
+
if (missing.length > 0) {
|
|
86
|
+
error(`Seed file(s) not found:\n ${missing.join("\n ")}`);
|
|
87
|
+
return 2;
|
|
88
|
+
}
|
|
89
|
+
const builderPath = locateBuilder(cwd, config);
|
|
90
|
+
if (builderPath === undefined)
|
|
91
|
+
return 2;
|
|
92
|
+
const prepared = [];
|
|
93
|
+
for (const path of paths) {
|
|
94
|
+
const label = toPosix(relative(cwd, path));
|
|
95
|
+
let collected;
|
|
96
|
+
try {
|
|
97
|
+
collected = collectSeed(path, {
|
|
98
|
+
cwd,
|
|
99
|
+
builderPath,
|
|
100
|
+
environment: opts.environment,
|
|
101
|
+
});
|
|
29
102
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
if (file !== undefined && file.trim() !== "") {
|
|
34
|
-
paths = [resolve(cwd, file)];
|
|
103
|
+
catch (e) {
|
|
104
|
+
error(e instanceof SeedCollectionFailed ? e.message : String(e));
|
|
105
|
+
return 1;
|
|
35
106
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
paths = [resolve(root, "seed.ts")];
|
|
40
|
-
}
|
|
107
|
+
if (collected.stdout.trim().length > 0) {
|
|
108
|
+
for (const line of collected.stdout.trimEnd().split(/\r?\n/))
|
|
109
|
+
info(` ${label}: ${line}`);
|
|
41
110
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
111
|
+
if (collected.result.shape === "legacy") {
|
|
112
|
+
warn(`${label} has no default export, so it ran on import.\n` +
|
|
113
|
+
" Export a default function to have its writes collected, ordered and applied in one transaction.");
|
|
114
|
+
continue;
|
|
46
115
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
116
|
+
prepared.push({
|
|
117
|
+
file: label,
|
|
118
|
+
document: collected.result.ir,
|
|
119
|
+
config: collected.result.config,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
if (prepared.length === 0) {
|
|
123
|
+
info("No seed operations to apply.");
|
|
124
|
+
return 0;
|
|
125
|
+
}
|
|
126
|
+
return await apply(prepared, { cwd, config, dsn, opts });
|
|
127
|
+
}
|
|
128
|
+
// --- Discovery ---
|
|
129
|
+
function seedPaths(file, cwd, config) {
|
|
130
|
+
if (file !== undefined && file.trim() !== "")
|
|
131
|
+
return [resolve(cwd, file)];
|
|
132
|
+
const root = projectRootFromConfig(config, cwd);
|
|
133
|
+
const fromDir = discoverSeedsDir(cwd, join(root, "seeds"));
|
|
134
|
+
return fromDir.length > 0 ? fromDir : [resolve(root, "seed.ts")];
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* The generated builder, which the runtime needs for the manifest and the fingerprint.
|
|
138
|
+
*
|
|
139
|
+
* Absent is a setup problem with a one-line remedy rather than a crash: the builder is
|
|
140
|
+
* gitignored by design, so a fresh clone that has not run `generate` is the ordinary case.
|
|
141
|
+
*/
|
|
142
|
+
function locateBuilder(cwd, config) {
|
|
143
|
+
const relativePath = seedBuilderPathWithDefaults(config.output);
|
|
144
|
+
const path = resolve(cwd, relativePath);
|
|
145
|
+
if (!existsSync(path)) {
|
|
146
|
+
error(`The generated seed builder is missing: ${toPosix(relativePath)}\n` +
|
|
147
|
+
" Run `supatype generate`. It needs no database and no running stack.");
|
|
148
|
+
return undefined;
|
|
149
|
+
}
|
|
150
|
+
return path;
|
|
151
|
+
}
|
|
152
|
+
async function apply(prepared, options) {
|
|
153
|
+
const { cwd, config, dsn, opts } = options;
|
|
154
|
+
const ast = loadSchemaAst(schemaPathFromProject(config, cwd), cwd);
|
|
155
|
+
// The engine takes one `--run-once` for the run, so a file asking for it decides for all
|
|
156
|
+
// of them. Said out loud rather than generalised silently, because the difference is
|
|
157
|
+
// whether work someone expected to happen happens.
|
|
158
|
+
const askedRunOnce = prepared.filter((one) => one.config.runOnce === true);
|
|
159
|
+
if (askedRunOnce.length > 0 && askedRunOnce.length !== prepared.length) {
|
|
160
|
+
warn("Some seed files declare `runOnce` and others do not, and the run takes one setting.\n" +
|
|
161
|
+
` Applying it to all of them, because ${askedRunOnce
|
|
162
|
+
.map((one) => one.file)
|
|
163
|
+
.join(", ")} asked for it.`);
|
|
164
|
+
}
|
|
165
|
+
const result = await engineRequest("/seed", {
|
|
166
|
+
ast,
|
|
167
|
+
ir_documents: prepared.map((one) => JSON.stringify({ ...one.document, file: one.file })),
|
|
168
|
+
database_url: dsn,
|
|
169
|
+
schema: pgSchema(config),
|
|
170
|
+
atomic: opts.atomic,
|
|
171
|
+
run_once: askedRunOnce.length > 0,
|
|
172
|
+
...(opts.environment !== undefined ? { environment: opts.environment } : {}),
|
|
173
|
+
});
|
|
174
|
+
return report(result, prepared.length, dsn);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Print what happened to every file, then the outcome.
|
|
178
|
+
*
|
|
179
|
+
* Every file, not just the one that failed: without `--atomic` a failure in the third of
|
|
180
|
+
* five leaves the first two committed, and a report that mentioned only the failure would
|
|
181
|
+
* leave the reader to guess at the rest.
|
|
182
|
+
*/
|
|
183
|
+
function report(result, count, dsn) {
|
|
184
|
+
for (const file of result.files ?? []) {
|
|
185
|
+
const rows = Object.entries(file.written ?? {})
|
|
186
|
+
.map(([model, written]) => `${model} ${written}`)
|
|
187
|
+
.join(", ");
|
|
188
|
+
info(` ${file.file.padEnd(32)} ${file.status}${rows.length > 0 ? ` (${rows})` : ""}`);
|
|
189
|
+
for (const skipped of file.skippedGroups ?? []) {
|
|
190
|
+
info(` condition was false, skipped: ${skipped}`);
|
|
53
191
|
}
|
|
192
|
+
}
|
|
193
|
+
if (result.ok) {
|
|
194
|
+
success(`Seeded ${count} file(s) into ${redact(dsn)}.`);
|
|
195
|
+
return 0;
|
|
196
|
+
}
|
|
197
|
+
const failure = result.error;
|
|
198
|
+
if (failure === undefined) {
|
|
199
|
+
error("The seed failed, and the engine said nothing about why.");
|
|
200
|
+
return 1;
|
|
201
|
+
}
|
|
202
|
+
const where = [failure.file, failure.path].filter((part) => part !== undefined && part !== "");
|
|
203
|
+
error((failure.message ?? failure.kind) +
|
|
204
|
+
(where.length > 0 ? `\n at ${where.join(" ")}` : "") +
|
|
205
|
+
(failure.remedy !== undefined && failure.remedy !== null ? `\n ${failure.remedy}` : ""));
|
|
206
|
+
// Nothing ran because nothing could: the environment, not the seed.
|
|
207
|
+
return failure.kind === "connection" || failure.kind === "document" ? 2 : 1;
|
|
208
|
+
}
|
|
209
|
+
async function reportStatus(dsn) {
|
|
210
|
+
const result = await engineRequest("/seed", {
|
|
211
|
+
database_url: dsn,
|
|
212
|
+
status: true,
|
|
54
213
|
});
|
|
214
|
+
const files = result.files ?? [];
|
|
215
|
+
if (files.length === 0) {
|
|
216
|
+
info(`No seeds have been applied to ${redact(dsn)}.`);
|
|
217
|
+
return 0;
|
|
218
|
+
}
|
|
219
|
+
for (const entry of files) {
|
|
220
|
+
info(` ${entry.file.padEnd(32)} ${entry.status.padEnd(12)} ${entry.appliedAt} ` +
|
|
221
|
+
`${entry.durationMs}ms${entry.drifted ? " changed since it was applied" : ""}`);
|
|
222
|
+
}
|
|
223
|
+
return 0;
|
|
224
|
+
}
|
|
225
|
+
/** Reported with forward slashes, so the message reads the same on every platform. */
|
|
226
|
+
function toPosix(path) {
|
|
227
|
+
return path.split(sep).join("/");
|
|
55
228
|
}
|
|
56
229
|
//# sourceMappingURL=seed.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seed.js","sourceRoot":"","sources":["../../src/commands/seed.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"seed.js","sourceRoot":"","sources":["../../src/commands/seed.ts"],"names":[],"mappings":"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"}
|
package/dist/engine-client.d.ts
CHANGED
|
@@ -73,6 +73,7 @@ export declare function engineHealth(): Promise<boolean>;
|
|
|
73
73
|
* /introspect → engine introspect
|
|
74
74
|
* /validate → engine validate
|
|
75
75
|
* /admin → engine admin (admin-config JSON on stdout)
|
|
76
|
+
* /seed → engine seed (result document JSON on stdout)
|
|
76
77
|
*/
|
|
77
78
|
export declare function engineRequest<T = unknown>(endpoint: string, body: Record<string, unknown>): Promise<T>;
|
|
78
79
|
//# sourceMappingURL=engine-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine-client.d.ts","sourceRoot":"","sources":["../src/engine-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAcH,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,aAAa,CAAA;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;CAC/D;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,SAAS,EAAE,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,KAAK,CAAC;YACb,IAAI,EAAE,MAAM,CAAA;YACZ,IAAI,EAAE,MAAM,CAAA;YACZ,QAAQ,EAAE,OAAO,CAAA;YACjB,OAAO,CAAC,EAAE,MAAM,CAAA;YAChB,UAAU,CAAC,EAAE,OAAO,CAAA;YACpB,MAAM,CAAC,EAAE,OAAO,CAAA;YAChB,UAAU,CAAC,EAAE;gBAAE,KAAK,EAAE,MAAM,CAAC;gBAAC,MAAM,EAAE,MAAM,CAAA;aAAE,CAAA;SAC/C,CAAC,CAAA;KACH,CAAC,CAAA;CACH;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACvC,EAAE,EAAE,OAAO,CAAA;IACX,IAAI,EAAE,CAAC,CAAA;IACP,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,qBAAa,WAAY,SAAQ,KAAK;aAGlB,QAAQ,EAAE,MAAM;aAChB,QAAQ,EAAE,MAAM,GAAG,IAAI;gBAFvC,OAAO,EAAE,MAAM,EACC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GAAG,IAAI;CAK1C;AAkDD,mEAAmE;AACnE,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAElD;AAED,8DAA8D;AAC9D,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAQrD;AAED
|
|
1
|
+
{"version":3,"file":"engine-client.d.ts","sourceRoot":"","sources":["../src/engine-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAcH,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,aAAa,CAAA;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;CAC/D;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,SAAS,EAAE,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,KAAK,CAAC;YACb,IAAI,EAAE,MAAM,CAAA;YACZ,IAAI,EAAE,MAAM,CAAA;YACZ,QAAQ,EAAE,OAAO,CAAA;YACjB,OAAO,CAAC,EAAE,MAAM,CAAA;YAChB,UAAU,CAAC,EAAE,OAAO,CAAA;YACpB,MAAM,CAAC,EAAE,OAAO,CAAA;YAChB,UAAU,CAAC,EAAE;gBAAE,KAAK,EAAE,MAAM,CAAC;gBAAC,MAAM,EAAE,MAAM,CAAA;aAAE,CAAA;SAC/C,CAAC,CAAA;KACH,CAAC,CAAA;CACH;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACvC,EAAE,EAAE,OAAO,CAAA;IACX,IAAI,EAAE,CAAC,CAAA;IACP,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,qBAAa,WAAY,SAAQ,KAAK;aAGlB,QAAQ,EAAE,MAAM;aAChB,QAAQ,EAAE,MAAM,GAAG,IAAI;gBAFvC,OAAO,EAAE,MAAM,EACC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GAAG,IAAI;CAK1C;AAkDD,mEAAmE;AACnE,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAElD;AAED,8DAA8D;AAC9D,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAQrD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CAAC,CAAC,GAAG,OAAO,EAC7C,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC,CAiFZ"}
|
package/dist/engine-client.js
CHANGED
|
@@ -92,6 +92,7 @@ export async function engineHealth() {
|
|
|
92
92
|
* /introspect → engine introspect
|
|
93
93
|
* /validate → engine validate
|
|
94
94
|
* /admin → engine admin (admin-config JSON on stdout)
|
|
95
|
+
* /seed → engine seed (result document JSON on stdout)
|
|
95
96
|
*/
|
|
96
97
|
export async function engineRequest(endpoint, body) {
|
|
97
98
|
const bin = await getEngineBin();
|
|
@@ -109,6 +110,18 @@ export async function engineRequest(endpoint, body) {
|
|
|
109
110
|
writeFileSync(gzPath, Buffer.from(body["schema_sources_gz_base64"], "base64"));
|
|
110
111
|
cleanup.push(gzPath);
|
|
111
112
|
}
|
|
113
|
+
// One file per seed document. The engine takes `--ir` once per document rather than one
|
|
114
|
+
// combined blob, so a failure can name the file it was in.
|
|
115
|
+
const irPaths = [];
|
|
116
|
+
const documents = body["ir_documents"];
|
|
117
|
+
if (Array.isArray(documents)) {
|
|
118
|
+
documents.forEach((document, index) => {
|
|
119
|
+
const irPath = join(tmpDir, `ir-${Date.now()}-${index}.json`);
|
|
120
|
+
writeFileSync(irPath, typeof document === "string" ? document : JSON.stringify(document));
|
|
121
|
+
cleanup.push(irPath);
|
|
122
|
+
irPaths.push(irPath);
|
|
123
|
+
});
|
|
124
|
+
}
|
|
112
125
|
if (body["schema_sources_manifest"] !== undefined) {
|
|
113
126
|
manifestPath = join(tmpDir, `manifest-${Date.now()}.json`);
|
|
114
127
|
writeFileSync(manifestPath, JSON.stringify(body["schema_sources_manifest"]));
|
|
@@ -117,6 +130,7 @@ export async function engineRequest(endpoint, body) {
|
|
|
117
130
|
const args = endpointToArgs(endpoint, body, reqFile, {
|
|
118
131
|
...(gzPath !== undefined ? { gzPath } : {}),
|
|
119
132
|
...(manifestPath !== undefined ? { manifestPath } : {}),
|
|
133
|
+
...(irPaths.length > 0 ? { irPaths } : {}),
|
|
120
134
|
});
|
|
121
135
|
const result = spawnSync(bin, args, {
|
|
122
136
|
encoding: "utf8",
|
|
@@ -128,7 +142,15 @@ export async function engineRequest(endpoint, body) {
|
|
|
128
142
|
}
|
|
129
143
|
catch { /* ignore */ }
|
|
130
144
|
}
|
|
131
|
-
|
|
145
|
+
// A failed seed is an answer, not a crash.
|
|
146
|
+
//
|
|
147
|
+
// `engine seed` exits 1 when the seed itself failed and prints the result document on
|
|
148
|
+
// stdout: which file, what it wrote before it stopped, and the error in the schema's own
|
|
149
|
+
// terms. Treating a non-zero exit as "no output" threw all of that away and reported
|
|
150
|
+
// `Engine /seed failed (exit 1): (no output)`, which is worse than the raw Postgres error
|
|
151
|
+
// it replaced. Anything without a document to read still throws.
|
|
152
|
+
const reportsFailureAsData = endpoint === "/seed" && (result.stdout?.trim().length ?? 0) > 0;
|
|
153
|
+
if (result.status !== 0 && !reportsFailureAsData) {
|
|
132
154
|
const stderr = result.stderr?.trim() || "(no output)";
|
|
133
155
|
throw new EngineError(`Engine ${endpoint} failed (exit ${result.status}): ${stderr}`, endpoint, result.status);
|
|
134
156
|
}
|
|
@@ -180,7 +202,30 @@ function endpointToArgs(endpoint, body, reqFile, sources) {
|
|
|
180
202
|
return ["parse", "--input", reqFile];
|
|
181
203
|
case "/generate": {
|
|
182
204
|
const lang = body["lang"] ?? "typescript";
|
|
183
|
-
|
|
205
|
+
const artifact = body["artifact"] ?? "types";
|
|
206
|
+
return ["generate", "--input", reqFile, "--lang", lang, "--artifact", artifact];
|
|
207
|
+
}
|
|
208
|
+
case "/seed": {
|
|
209
|
+
// `--status` reads the ledger and needs no schema, so it does not take `--input`:
|
|
210
|
+
// passing one would make the command fail on a project whose schema has moved on.
|
|
211
|
+
if (body["status"] === true) {
|
|
212
|
+
return ["seed", "--database-url", dbUrl, "--status"];
|
|
213
|
+
}
|
|
214
|
+
const documents = (sources?.irPaths ?? []).flatMap((path) => ["--ir", path]);
|
|
215
|
+
const environment = typeof body["environment"] === "string" ? ["--environment", body["environment"]] : [];
|
|
216
|
+
return [
|
|
217
|
+
"seed",
|
|
218
|
+
"--input",
|
|
219
|
+
reqFile,
|
|
220
|
+
...documents,
|
|
221
|
+
"--database-url",
|
|
222
|
+
dbUrl,
|
|
223
|
+
"--schema",
|
|
224
|
+
schema,
|
|
225
|
+
...environment,
|
|
226
|
+
...(body["atomic"] === true ? ["--atomic"] : []),
|
|
227
|
+
...(body["run_once"] === true ? ["--run-once"] : []),
|
|
228
|
+
];
|
|
184
229
|
}
|
|
185
230
|
case "/introspect":
|
|
186
231
|
return ["introspect", "--database-url", dbUrl, "--schema", schema];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine-client.js","sourceRoot":"","sources":["../src/engine-client.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"engine-client.js","sourceRoot":"","sources":["../src/engine-client.ts"],"names":[],"mappings":"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"}
|
package/dist/engine-floor.d.ts
CHANGED
|
@@ -33,6 +33,25 @@ export declare const ENGINE_MIN_FOR_BOUNDS = "0.2.0";
|
|
|
33
33
|
* no snapshot table, and Studio saves drafts into nothing.
|
|
34
34
|
*/
|
|
35
35
|
export declare const ENGINE_MIN_FOR_VERSIONS = "0.3.0";
|
|
36
|
+
/**
|
|
37
|
+
* First engine release that normalises a rich text column's contents (schema-engine v0.4.0).
|
|
38
|
+
*
|
|
39
|
+
* Silent in the same way `versions` is, and for a reason worth naming. The generated types accept
|
|
40
|
+
* a plain string on the way in and promise a Lexical document on the way out, and a trigger is
|
|
41
|
+
* what makes the second half true for every writer. An older engine emits no trigger and rejects
|
|
42
|
+
* nothing, so the string is stored exactly as it was written and every later read returns
|
|
43
|
+
* something the types say cannot happen.
|
|
44
|
+
*/
|
|
45
|
+
export declare const ENGINE_MIN_FOR_RICHTEXT_TRIGGER = "0.4.0";
|
|
46
|
+
/**
|
|
47
|
+
* First engine release that has a `seed` subcommand (schema-engine v0.4.0).
|
|
48
|
+
*
|
|
49
|
+
* Unconditional, where everything else in this file is conditional on the schema. There is no way
|
|
50
|
+
* to write a seed that does not need the subcommand, so there is nothing to read the project for
|
|
51
|
+
* and nothing to point at. An older engine answers the request with a usage error about an
|
|
52
|
+
* unrecognised argument, which names no part of the project and reads like a broken install.
|
|
53
|
+
*/
|
|
54
|
+
export declare const ENGINE_MIN_FOR_SEED = "0.4.0";
|
|
36
55
|
/**
|
|
37
56
|
* Compare two dotted versions numerically. Returns <0, 0 or >0.
|
|
38
57
|
*
|
|
@@ -48,13 +67,17 @@ export declare function compareVersions(a: string, b: string): number;
|
|
|
48
67
|
* that gets deleted the first time it is inconvenient.
|
|
49
68
|
*/
|
|
50
69
|
export declare function boundsRequiringHelpers(ast: ExtractedSchemaAstV2): string[];
|
|
70
|
+
/** Rich text fields, which need a trigger only a new enough engine emits. */
|
|
71
|
+
export declare function fieldsNeedingRichTextTrigger(ast: ExtractedSchemaAstV2): string[];
|
|
51
72
|
/** Models declaring `versions`, which needs a whole layer only a new enough engine emits. */
|
|
52
73
|
export declare function modelsRequiringVersions(ast: ExtractedSchemaAstV2): string[];
|
|
74
|
+
export declare function assertEngineSupportsSchema(ast: ExtractedSchemaAstV2, pinnedEngineVersion: string | undefined): void;
|
|
53
75
|
/**
|
|
54
|
-
*
|
|
76
|
+
* Why the pinned engine cannot run a seed, or undefined when it can.
|
|
55
77
|
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
78
|
+
* Returns rather than throws, because the seed command answers in exit codes and this is a `2`:
|
|
79
|
+
* the run could not start, alongside a missing builder or an unreachable database, rather than a
|
|
80
|
+
* `1` where the seed itself was wrong.
|
|
58
81
|
*/
|
|
59
|
-
export declare function
|
|
82
|
+
export declare function seedUnsupportedByPinnedEngine(pinnedEngineVersion: string | undefined): string | undefined;
|
|
60
83
|
//# sourceMappingURL=engine-floor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine-floor.d.ts","sourceRoot":"","sources":["../src/engine-floor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAc,MAAM,oBAAoB,CAAA;AAE1E,mGAAmG;AACnG,eAAO,MAAM,qBAAqB,UAAU,CAAA;AAE5C;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,UAAU,CAAA;AAE9C;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAgB5D;AAoBD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAE1E;AAED,6FAA6F;AAC7F,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAI3E;
|
|
1
|
+
{"version":3,"file":"engine-floor.d.ts","sourceRoot":"","sources":["../src/engine-floor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAc,MAAM,oBAAoB,CAAA;AAE1E,mGAAmG;AACnG,eAAO,MAAM,qBAAqB,UAAU,CAAA;AAE5C;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,UAAU,CAAA;AAE9C;;;;;;;;GAQG;AACH,eAAO,MAAM,+BAA+B,UAAU,CAAA;AAEtD;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,UAAU,CAAA;AAE1C;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAgB5D;AAoBD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAE1E;AAED,6EAA6E;AAC7E,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAQhF;AAED,6FAA6F;AAC7F,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAI3E;AAqFD,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,oBAAoB,EACzB,mBAAmB,EAAE,MAAM,GAAG,SAAS,GACtC,IAAI,CAoBN;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAC3C,mBAAmB,EAAE,MAAM,GAAG,SAAS,GACtC,MAAM,GAAG,SAAS,CAapB"}
|
package/dist/engine-floor.js
CHANGED
|
@@ -8,6 +8,25 @@ export const ENGINE_MIN_FOR_BOUNDS = "0.2.0";
|
|
|
8
8
|
* no snapshot table, and Studio saves drafts into nothing.
|
|
9
9
|
*/
|
|
10
10
|
export const ENGINE_MIN_FOR_VERSIONS = "0.3.0";
|
|
11
|
+
/**
|
|
12
|
+
* First engine release that normalises a rich text column's contents (schema-engine v0.4.0).
|
|
13
|
+
*
|
|
14
|
+
* Silent in the same way `versions` is, and for a reason worth naming. The generated types accept
|
|
15
|
+
* a plain string on the way in and promise a Lexical document on the way out, and a trigger is
|
|
16
|
+
* what makes the second half true for every writer. An older engine emits no trigger and rejects
|
|
17
|
+
* nothing, so the string is stored exactly as it was written and every later read returns
|
|
18
|
+
* something the types say cannot happen.
|
|
19
|
+
*/
|
|
20
|
+
export const ENGINE_MIN_FOR_RICHTEXT_TRIGGER = "0.4.0";
|
|
21
|
+
/**
|
|
22
|
+
* First engine release that has a `seed` subcommand (schema-engine v0.4.0).
|
|
23
|
+
*
|
|
24
|
+
* Unconditional, where everything else in this file is conditional on the schema. There is no way
|
|
25
|
+
* to write a seed that does not need the subcommand, so there is nothing to read the project for
|
|
26
|
+
* and nothing to point at. An older engine answers the request with a usage error about an
|
|
27
|
+
* unrecognised argument, which names no part of the project and reads like a broken install.
|
|
28
|
+
*/
|
|
29
|
+
export const ENGINE_MIN_FOR_SEED = "0.4.0";
|
|
11
30
|
/**
|
|
12
31
|
* Compare two dotted versions numerically. Returns <0, 0 or >0.
|
|
13
32
|
*
|
|
@@ -58,6 +77,17 @@ function modelsWithConstraints(models) {
|
|
|
58
77
|
export function boundsRequiringHelpers(ast) {
|
|
59
78
|
return [...fieldsWithBounds(ast.models), ...modelsWithConstraints(ast.models)];
|
|
60
79
|
}
|
|
80
|
+
/** Rich text fields, which need a trigger only a new enough engine emits. */
|
|
81
|
+
export function fieldsNeedingRichTextTrigger(ast) {
|
|
82
|
+
const found = [];
|
|
83
|
+
for (const model of ast.models) {
|
|
84
|
+
for (const [fieldName, field] of Object.entries(model.fields)) {
|
|
85
|
+
if (field.kind === "richText")
|
|
86
|
+
found.push(`${model.name}.${fieldName}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return found;
|
|
90
|
+
}
|
|
61
91
|
/** Models declaring `versions`, which needs a whole layer only a new enough engine emits. */
|
|
62
92
|
export function modelsRequiringVersions(ast) {
|
|
63
93
|
return ast.models
|
|
@@ -82,6 +112,16 @@ const ENGINE_REQUIREMENTS = [
|
|
|
82
112
|
`push reports success and you get a model with no history, no drafts and an editor that ` +
|
|
83
113
|
`saves into nothing. That silence is the reason this refuses.`,
|
|
84
114
|
},
|
|
115
|
+
{
|
|
116
|
+
since: ENGINE_MIN_FOR_RICHTEXT_TRIGGER,
|
|
117
|
+
declaredBy: fieldsNeedingRichTextTrigger,
|
|
118
|
+
feature: "rich text columns",
|
|
119
|
+
consequence: `Only engine ${ENGINE_MIN_FOR_RICHTEXT_TRIGGER}+ emits the trigger that turns a plain ` +
|
|
120
|
+
`string written into one of these columns into a Lexical document. The generated types ` +
|
|
121
|
+
`accept a string on the way in and promise a document on the way out, and the trigger is ` +
|
|
122
|
+
`the only thing that makes the second half true. Without it the string is stored as it ` +
|
|
123
|
+
`was written and a later read returns what the types say is impossible.`,
|
|
124
|
+
},
|
|
85
125
|
];
|
|
86
126
|
/**
|
|
87
127
|
* Refuse a push whose schema needs something this engine cannot apply.
|
|
@@ -89,10 +129,30 @@ const ENGINE_REQUIREMENTS = [
|
|
|
89
129
|
* Takes the pin from `versions.engine`, or undefined when unpinned. See the note above on why
|
|
90
130
|
* that is the right source rather than the binary's own `--version`.
|
|
91
131
|
*/
|
|
132
|
+
/**
|
|
133
|
+
* Whether a pin can be compared at all.
|
|
134
|
+
*
|
|
135
|
+
* Unpinned resolves to latest, and `local` points at a build whose version the config does not
|
|
136
|
+
* know. Neither can be compared, and neither is the case that breaks.
|
|
137
|
+
*/
|
|
138
|
+
function comparable(pin) {
|
|
139
|
+
return pin !== undefined && pin !== "local";
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* The parts every refusal here shares: what is needed, and what to do about it.
|
|
143
|
+
*
|
|
144
|
+
* One builder rather than one per check, because the remedy is the only part of this message
|
|
145
|
+
* anyone acts on, and a second copy is a second place for it to go stale.
|
|
146
|
+
*/
|
|
147
|
+
function refusal(parts) {
|
|
148
|
+
return (`${parts.needs}, which needs schema-engine ${parts.since} or newer, and this project ` +
|
|
149
|
+
`pins ${parts.pinned}.\n\n` +
|
|
150
|
+
`${parts.body}\n\n` +
|
|
151
|
+
`Raise or remove the pin in supatype.config.ts:\n` +
|
|
152
|
+
` versions: { engine: "${parts.since}" } // or omit it to track latest`);
|
|
153
|
+
}
|
|
92
154
|
export function assertEngineSupportsSchema(ast, pinnedEngineVersion) {
|
|
93
|
-
|
|
94
|
-
// know. Neither can be compared, and neither is the case that breaks.
|
|
95
|
-
if (pinnedEngineVersion === undefined || pinnedEngineVersion === "local")
|
|
155
|
+
if (!comparable(pinnedEngineVersion))
|
|
96
156
|
return;
|
|
97
157
|
for (const requirement of ENGINE_REQUIREMENTS) {
|
|
98
158
|
if (compareVersions(pinnedEngineVersion, requirement.since) >= 0)
|
|
@@ -102,12 +162,33 @@ export function assertEngineSupportsSchema(ast, pinnedEngineVersion) {
|
|
|
102
162
|
continue;
|
|
103
163
|
const shown = needed.slice(0, 3).join(", ");
|
|
104
164
|
const more = needed.length > 3 ? `, and ${needed.length - 3} more` : "";
|
|
105
|
-
throw new Error(
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
`
|
|
110
|
-
|
|
165
|
+
throw new Error(refusal({
|
|
166
|
+
needs: `This schema declares ${requirement.feature}`,
|
|
167
|
+
since: requirement.since,
|
|
168
|
+
pinned: pinnedEngineVersion,
|
|
169
|
+
body: ` Declared on: ${shown}${more}\n\n${requirement.consequence}`,
|
|
170
|
+
}));
|
|
111
171
|
}
|
|
112
172
|
}
|
|
173
|
+
/**
|
|
174
|
+
* Why the pinned engine cannot run a seed, or undefined when it can.
|
|
175
|
+
*
|
|
176
|
+
* Returns rather than throws, because the seed command answers in exit codes and this is a `2`:
|
|
177
|
+
* the run could not start, alongside a missing builder or an unreachable database, rather than a
|
|
178
|
+
* `1` where the seed itself was wrong.
|
|
179
|
+
*/
|
|
180
|
+
export function seedUnsupportedByPinnedEngine(pinnedEngineVersion) {
|
|
181
|
+
if (!comparable(pinnedEngineVersion))
|
|
182
|
+
return undefined;
|
|
183
|
+
if (compareVersions(pinnedEngineVersion, ENGINE_MIN_FOR_SEED) >= 0)
|
|
184
|
+
return undefined;
|
|
185
|
+
return refusal({
|
|
186
|
+
needs: "Seeding is done by the engine",
|
|
187
|
+
since: ENGINE_MIN_FOR_SEED,
|
|
188
|
+
pinned: pinnedEngineVersion,
|
|
189
|
+
body: `An engine older than ${ENGINE_MIN_FOR_SEED} has no \`seed\` subcommand. It would answer ` +
|
|
190
|
+
`this run with a usage error about an unrecognised argument, which names nothing about ` +
|
|
191
|
+
`your project and reads like a broken install.`,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
113
194
|
//# sourceMappingURL=engine-floor.js.map
|