@metaobjectsdev/cli 0.5.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.
- package/LICENSE +189 -0
- package/README.md +184 -0
- package/dist/bin/meta.d.ts +3 -0
- package/dist/bin/meta.d.ts.map +1 -0
- package/dist/bin/meta.js +7 -0
- package/dist/bin/meta.js.map +1 -0
- package/dist/src/commands/export.d.ts +2 -0
- package/dist/src/commands/export.d.ts.map +1 -0
- package/dist/src/commands/export.js +45 -0
- package/dist/src/commands/export.js.map +1 -0
- package/dist/src/commands/gen.d.ts +2 -0
- package/dist/src/commands/gen.d.ts.map +1 -0
- package/dist/src/commands/gen.js +86 -0
- package/dist/src/commands/gen.js.map +1 -0
- package/dist/src/commands/init.d.ts +16 -0
- package/dist/src/commands/init.d.ts.map +1 -0
- package/dist/src/commands/init.js +222 -0
- package/dist/src/commands/init.js.map +1 -0
- package/dist/src/commands/migrate.d.ts +2 -0
- package/dist/src/commands/migrate.d.ts.map +1 -0
- package/dist/src/commands/migrate.js +361 -0
- package/dist/src/commands/migrate.js.map +1 -0
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +105 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lib/args.d.ts +34 -0
- package/dist/src/lib/args.d.ts.map +1 -0
- package/dist/src/lib/args.js +103 -0
- package/dist/src/lib/args.js.map +1 -0
- package/dist/src/lib/config.d.ts +17 -0
- package/dist/src/lib/config.d.ts.map +1 -0
- package/dist/src/lib/config.js +48 -0
- package/dist/src/lib/config.js.map +1 -0
- package/dist/src/lib/kysely.d.ts +28 -0
- package/dist/src/lib/kysely.d.ts.map +1 -0
- package/dist/src/lib/kysely.js +100 -0
- package/dist/src/lib/kysely.js.map +1 -0
- package/dist/src/lib/load-metaobjects-config.d.ts +3 -0
- package/dist/src/lib/load-metaobjects-config.d.ts.map +1 -0
- package/dist/src/lib/load-metaobjects-config.js +83 -0
- package/dist/src/lib/load-metaobjects-config.js.map +1 -0
- package/dist/src/lib/log.d.ts +6 -0
- package/dist/src/lib/log.d.ts.map +1 -0
- package/dist/src/lib/log.js +6 -0
- package/dist/src/lib/log.js.map +1 -0
- package/dist/src/lib/output.d.ts +38 -0
- package/dist/src/lib/output.d.ts.map +1 -0
- package/dist/src/lib/output.js +96 -0
- package/dist/src/lib/output.js.map +1 -0
- package/dist/src/lib/projection-migrations.d.ts +34 -0
- package/dist/src/lib/projection-migrations.d.ts.map +1 -0
- package/dist/src/lib/projection-migrations.js +112 -0
- package/dist/src/lib/projection-migrations.js.map +1 -0
- package/package.json +71 -0
- package/src/commands/export.ts +50 -0
- package/src/commands/gen.ts +88 -0
- package/src/commands/init.ts +272 -0
- package/src/commands/migrate.ts +390 -0
- package/src/index.ts +109 -0
- package/src/lib/args.ts +157 -0
- package/src/lib/config.ts +78 -0
- package/src/lib/kysely.ts +114 -0
- package/src/lib/load-metaobjects-config.ts +89 -0
- package/src/lib/log.ts +5 -0
- package/src/lib/output.ts +156 -0
- package/src/lib/projection-migrations.ts +159 -0
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { mkdir, writeFile, readFile, stat } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { basename } from "node:path";
|
|
4
|
+
import { DEFAULT_CONFIG, ConfigSchema, saveConfig, PACKAGE_MANIFEST_FILE, DEFAULT_METADATA_DIR, DEFAULT_METAOBJECTS_DIR } from "@metaobjectsdev/sdk";
|
|
5
|
+
import { parseInitArgs } from "../lib/args.js";
|
|
6
|
+
import { log } from "../lib/log.js";
|
|
7
|
+
import { AGENT_DOCS_BODY, withContentHash, isUnmodified } from "@metaobjectsdev/sdk/agent-docs";
|
|
8
|
+
const META_COMMON_JSON = JSON.stringify({
|
|
9
|
+
metadata: {
|
|
10
|
+
package: "",
|
|
11
|
+
children: [],
|
|
12
|
+
},
|
|
13
|
+
}, null, 2) + "\n";
|
|
14
|
+
const METAOBJECTS_GITIGNORE_BODY = `.gen-state/
|
|
15
|
+
`;
|
|
16
|
+
const FORGE_CONFIG_BODY = `import { defineConfig } from "@metaobjectsdev/cli";
|
|
17
|
+
import {
|
|
18
|
+
entityFile,
|
|
19
|
+
queriesFile,
|
|
20
|
+
routesFile,
|
|
21
|
+
// formFile, // opt-in: emit React form components
|
|
22
|
+
barrel,
|
|
23
|
+
} from "@metaobjectsdev/codegen-ts/generators";
|
|
24
|
+
|
|
25
|
+
export default defineConfig({
|
|
26
|
+
outDir: "./src/db",
|
|
27
|
+
extStyle: "none",
|
|
28
|
+
dbImport: "../db",
|
|
29
|
+
dialect: "sqlite",
|
|
30
|
+
apiPrefix: "", // set to "/api" if your routes mount under /api
|
|
31
|
+
generators: [
|
|
32
|
+
entityFile(),
|
|
33
|
+
queriesFile(),
|
|
34
|
+
routesFile(),
|
|
35
|
+
barrel(),
|
|
36
|
+
],
|
|
37
|
+
});
|
|
38
|
+
`;
|
|
39
|
+
const NEXT_STEPS = `
|
|
40
|
+
Initialized metaobjects/ + .metaobjects/ + metaobjects.config.ts
|
|
41
|
+
|
|
42
|
+
Next steps (when later sub-projects ship):
|
|
43
|
+
meta ingest # propose entities from your existing TS code
|
|
44
|
+
meta gen # codegen TS targets from entities
|
|
45
|
+
meta serve # local viewer
|
|
46
|
+
meta install-hooks # register MCP server + Claude Code hooks
|
|
47
|
+
`;
|
|
48
|
+
const AGENT_DOC_FILES = ["AGENTS.md", "CLAUDE.md"];
|
|
49
|
+
async function writeAgentDocs(agentDir, result) {
|
|
50
|
+
const docsBody = withContentHash(AGENT_DOCS_BODY);
|
|
51
|
+
for (const filename of AGENT_DOC_FILES) {
|
|
52
|
+
const path = join(agentDir, filename);
|
|
53
|
+
const exists = await fileExists(path);
|
|
54
|
+
if (!exists) {
|
|
55
|
+
await writeFile(path, docsBody, "utf8");
|
|
56
|
+
result.created.push(`.metaobjects/${filename}`);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const existingBody = await readFile(path, "utf8");
|
|
60
|
+
if (isUnmodified(existingBody)) {
|
|
61
|
+
await writeFile(path, docsBody, "utf8");
|
|
62
|
+
result.created.push(`.metaobjects/${filename}`);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
await writeFile(`${path}.new`, docsBody, "utf8");
|
|
66
|
+
result.created.push(`.metaobjects/${filename}.new`);
|
|
67
|
+
result.warnings.push(`${filename} appears to have been hand-edited; refreshed docs written to ${filename}.new`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export async function init(opts) {
|
|
72
|
+
const result = { created: [], preserved: [], warnings: [] };
|
|
73
|
+
const agentDir = join(opts.cwd, DEFAULT_METAOBJECTS_DIR);
|
|
74
|
+
const metaobjectsDir = join(opts.cwd, DEFAULT_METADATA_DIR);
|
|
75
|
+
const agentDirExists = await dirExists(agentDir);
|
|
76
|
+
const metaobjectsExists = await dirExists(metaobjectsDir);
|
|
77
|
+
const exists = agentDirExists || metaobjectsExists;
|
|
78
|
+
if (opts.refreshDocs && exists && !opts.force) {
|
|
79
|
+
// Refresh-only path: scaffold agent docs, leave everything else alone.
|
|
80
|
+
await writeAgentDocs(agentDir, result);
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
if (exists && !opts.force && !opts.refreshDocs) {
|
|
84
|
+
throw new Error("metaobjects/ or .metaobjects/ already exists; use --force to overwrite scaffold files (existing records are preserved), or --refresh-docs to update only agent docs");
|
|
85
|
+
}
|
|
86
|
+
const dirs = [
|
|
87
|
+
DEFAULT_METADATA_DIR,
|
|
88
|
+
DEFAULT_METAOBJECTS_DIR,
|
|
89
|
+
`${DEFAULT_METAOBJECTS_DIR}/.gen-state`,
|
|
90
|
+
];
|
|
91
|
+
if (opts.printOnly) {
|
|
92
|
+
for (const d of dirs)
|
|
93
|
+
result.created.push(d);
|
|
94
|
+
result.created.push("metaobjects/meta.common.json", ".metaobjects/config.json", ".metaobjects/.gitignore", `.metaobjects/${PACKAGE_MANIFEST_FILE}`);
|
|
95
|
+
for (const filename of AGENT_DOC_FILES)
|
|
96
|
+
result.created.push(`.metaobjects/${filename}`);
|
|
97
|
+
result.created.push("metaobjects.config.ts");
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
for (const d of dirs) {
|
|
101
|
+
await mkdir(join(opts.cwd, d), { recursive: true });
|
|
102
|
+
if (!result.created.includes(d))
|
|
103
|
+
result.created.push(d);
|
|
104
|
+
}
|
|
105
|
+
// metaobjects/meta.common.json — placeholder, only if absent
|
|
106
|
+
const commonJsonPath = join(metaobjectsDir, "meta.common.json");
|
|
107
|
+
if (!(await fileExists(commonJsonPath))) {
|
|
108
|
+
await writeFile(commonJsonPath, META_COMMON_JSON, "utf8");
|
|
109
|
+
result.created.push("metaobjects/meta.common.json");
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
result.preserved.push("metaobjects/meta.common.json");
|
|
113
|
+
}
|
|
114
|
+
// .metaobjects/config.json
|
|
115
|
+
if (agentDirExists) {
|
|
116
|
+
const configPath = join(agentDir, "config.json");
|
|
117
|
+
let priorContent;
|
|
118
|
+
try {
|
|
119
|
+
priorContent = await readFile(configPath, "utf8");
|
|
120
|
+
const parsed = ConfigSchema.parse(JSON.parse(priorContent));
|
|
121
|
+
const merged = ConfigSchema.parse({ ...DEFAULT_CONFIG, ...parsed });
|
|
122
|
+
await saveConfig(agentDir, merged);
|
|
123
|
+
result.preserved.push(".metaobjects/config.json");
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
if (priorContent !== undefined) {
|
|
127
|
+
log.warn("existing .metaobjects/config.json was invalid — writing fresh defaults. Prior content:");
|
|
128
|
+
log.warn(priorContent);
|
|
129
|
+
result.warnings.push("invalid .metaobjects/config.json replaced with defaults");
|
|
130
|
+
}
|
|
131
|
+
await writeFile(join(agentDir, "config.json"), JSON.stringify(DEFAULT_CONFIG, null, 2) + "\n", "utf8");
|
|
132
|
+
if (priorContent === undefined) {
|
|
133
|
+
result.created.push(".metaobjects/config.json");
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
await writeFile(join(agentDir, "config.json"), JSON.stringify(DEFAULT_CONFIG, null, 2) + "\n", "utf8");
|
|
139
|
+
result.created.push(".metaobjects/config.json");
|
|
140
|
+
}
|
|
141
|
+
// .metaobjects/.gitignore
|
|
142
|
+
await writeFile(join(agentDir, ".gitignore"), METAOBJECTS_GITIGNORE_BODY, "utf8");
|
|
143
|
+
result.created.push(".metaobjects/.gitignore");
|
|
144
|
+
// .metaobjects/package.meta.json — scaffold v0.3 package manifest if absent
|
|
145
|
+
const manifestPath = join(agentDir, PACKAGE_MANIFEST_FILE);
|
|
146
|
+
if (!(await fileExists(manifestPath))) {
|
|
147
|
+
const defaultPackageName = basename(opts.cwd);
|
|
148
|
+
const manifestBody = {
|
|
149
|
+
name: defaultPackageName,
|
|
150
|
+
version: "0.1.0",
|
|
151
|
+
extends: [],
|
|
152
|
+
};
|
|
153
|
+
await writeFile(manifestPath, JSON.stringify(manifestBody, null, 2) + "\n", "utf8");
|
|
154
|
+
result.created.push(`.metaobjects/${PACKAGE_MANIFEST_FILE}`);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
result.preserved.push(`.metaobjects/${PACKAGE_MANIFEST_FILE}`);
|
|
158
|
+
}
|
|
159
|
+
await writeAgentDocs(agentDir, result);
|
|
160
|
+
// Scaffold metaobjects.config.ts at the project root. Never overwrite if it exists.
|
|
161
|
+
const forgeConfigPath = join(opts.cwd, "metaobjects.config.ts");
|
|
162
|
+
if (!(await fileExists(forgeConfigPath))) {
|
|
163
|
+
await writeFile(forgeConfigPath, FORGE_CONFIG_BODY, "utf8");
|
|
164
|
+
result.created.push("metaobjects.config.ts");
|
|
165
|
+
}
|
|
166
|
+
return result;
|
|
167
|
+
}
|
|
168
|
+
export function nextStepsBlock() {
|
|
169
|
+
return NEXT_STEPS;
|
|
170
|
+
}
|
|
171
|
+
async function dirExists(p) {
|
|
172
|
+
try {
|
|
173
|
+
const s = await stat(p);
|
|
174
|
+
return s.isDirectory();
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
async function fileExists(p) {
|
|
181
|
+
try {
|
|
182
|
+
const s = await stat(p);
|
|
183
|
+
return s.isFile();
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
export async function initCommand(args, cwd) {
|
|
190
|
+
let flags;
|
|
191
|
+
try {
|
|
192
|
+
flags = parseInitArgs(args);
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
log.error(err.message);
|
|
196
|
+
return 2;
|
|
197
|
+
}
|
|
198
|
+
try {
|
|
199
|
+
const result = await init({
|
|
200
|
+
cwd,
|
|
201
|
+
force: flags.force,
|
|
202
|
+
quiet: flags.quiet,
|
|
203
|
+
printOnly: flags.printOnly,
|
|
204
|
+
refreshDocs: flags.refreshDocs,
|
|
205
|
+
});
|
|
206
|
+
if (flags.printOnly) {
|
|
207
|
+
log.info("Would create:");
|
|
208
|
+
for (const path of result.created)
|
|
209
|
+
log.info(` ${path}`);
|
|
210
|
+
return 0;
|
|
211
|
+
}
|
|
212
|
+
if (!flags.quiet) {
|
|
213
|
+
log.info(nextStepsBlock());
|
|
214
|
+
}
|
|
215
|
+
return 0;
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
log.error(err.message);
|
|
219
|
+
return 1;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../src/commands/migrate.ts"],"names":[],"mappings":"AAoHA,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAyOjF"}
|
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { mkdir } from "node:fs/promises";
|
|
3
|
+
import { parseMigrateArgs } from "../lib/args.js";
|
|
4
|
+
import { resolveMigrateConfig } from "../lib/config.js";
|
|
5
|
+
import { formatMigrateResult } from "../lib/output.js";
|
|
6
|
+
import { buildKyselyFromUrl } from "../lib/kysely.js";
|
|
7
|
+
import { log } from "../lib/log.js";
|
|
8
|
+
import { loadMemory } from "@metaobjectsdev/sdk";
|
|
9
|
+
import { loadMetaobjectsConfig } from "../lib/load-metaobjects-config.js";
|
|
10
|
+
import { buildExpectedSchema, introspect, diff, emit, writeMigration, BlockedChangesError, } from "@metaobjectsdev/migrate-ts";
|
|
11
|
+
import { computeProjectionMigrations, computeProjectionViewDependencies, } from "../lib/projection-migrations.js";
|
|
12
|
+
// Map CLI allow tokens → migrate-ts AllowOptions field names
|
|
13
|
+
const ALLOW_TOKEN_MAP = {
|
|
14
|
+
"drop-column": "dropColumn",
|
|
15
|
+
"drop-table": "dropTable",
|
|
16
|
+
"type-change": "typeChange",
|
|
17
|
+
"drop-index": "dropIndex",
|
|
18
|
+
"drop-fk": "dropFk",
|
|
19
|
+
"nullable-to-not-null": "nullableToNotNull",
|
|
20
|
+
};
|
|
21
|
+
function mapOnAmbiguous(v) {
|
|
22
|
+
return v === "drop-add" ? "drop+add" : v;
|
|
23
|
+
}
|
|
24
|
+
function tokensToAllowOptions(tokens) {
|
|
25
|
+
const opts = {};
|
|
26
|
+
for (const tok of tokens) {
|
|
27
|
+
const field = ALLOW_TOKEN_MAP[tok];
|
|
28
|
+
if (field !== undefined) {
|
|
29
|
+
opts[field] = true;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return opts;
|
|
33
|
+
}
|
|
34
|
+
function summarizeChanges(changes) {
|
|
35
|
+
const counts = {};
|
|
36
|
+
for (const c of changes) {
|
|
37
|
+
counts[c.kind] = (counts[c.kind] ?? 0) + 1;
|
|
38
|
+
}
|
|
39
|
+
return counts;
|
|
40
|
+
}
|
|
41
|
+
function describeChangeForOutput(c) {
|
|
42
|
+
switch (c.kind) {
|
|
43
|
+
case "create-table": return c.table.name;
|
|
44
|
+
case "drop-table": return c.table;
|
|
45
|
+
case "rename-table": return `${c.from} → ${c.to}`;
|
|
46
|
+
case "add-column": return `${c.table}.${c.column.name}`;
|
|
47
|
+
case "drop-column": return `${c.table}.${c.column}`;
|
|
48
|
+
case "rename-column": return `${c.table}.${c.from} → ${c.table}.${c.to}`;
|
|
49
|
+
case "change-column-type": return `${c.table}.${c.column} (${c.from.kind} → ${c.to.kind})`;
|
|
50
|
+
case "change-column-nullable": return `${c.table}.${c.column} (${c.from ? "NULL" : "NOT NULL"} → ${c.to ? "NULL" : "NOT NULL"})`;
|
|
51
|
+
case "change-column-default": return `${c.table}.${c.column}`;
|
|
52
|
+
case "add-index": return `${c.table} idx ${c.index.name}`;
|
|
53
|
+
case "drop-index": return `${c.table} idx ${c.index}`;
|
|
54
|
+
case "add-fk": return `${c.table} fk ${c.fk.name}`;
|
|
55
|
+
case "drop-fk": return `${c.table} fk ${c.fk}`;
|
|
56
|
+
default: return JSON.stringify(c);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function allowFlagFor(kind) {
|
|
60
|
+
switch (kind) {
|
|
61
|
+
case "drop-column": return "drop-column";
|
|
62
|
+
case "drop-table": return "drop-table";
|
|
63
|
+
case "drop-index": return "drop-index";
|
|
64
|
+
case "drop-fk": return "drop-fk";
|
|
65
|
+
case "change-column-type": return "type-change";
|
|
66
|
+
case "change-column-nullable": return "nullable-to-not-null";
|
|
67
|
+
default: return kind;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function blockedToEntries(err) {
|
|
71
|
+
return err.blocked.map((c) => ({
|
|
72
|
+
kind: c.kind,
|
|
73
|
+
description: describeChangeForOutput(c),
|
|
74
|
+
allowFlag: allowFlagFor(c.kind),
|
|
75
|
+
}));
|
|
76
|
+
}
|
|
77
|
+
function ambiguousToEntries(amb) {
|
|
78
|
+
return amb.map((a) => {
|
|
79
|
+
if (a.kind === "possible-column-rename") {
|
|
80
|
+
return {
|
|
81
|
+
kind: a.kind,
|
|
82
|
+
description: `${a.table}.${a.from.name} → ${a.table}.${a.to.name}`,
|
|
83
|
+
hint: `${a.from.sqlType.kind} → ${a.to.sqlType.kind}`,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
kind: a.kind,
|
|
88
|
+
description: `${a.from.name} → ${a.to.name}`,
|
|
89
|
+
hint: `column-set overlap ${a.columnOverlap.toFixed(2)}`,
|
|
90
|
+
};
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
export async function migrateCommand(args, cwd) {
|
|
94
|
+
let flags;
|
|
95
|
+
try {
|
|
96
|
+
flags = parseMigrateArgs(args);
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
log.error(`migrate: ${err.message}`);
|
|
100
|
+
return 2;
|
|
101
|
+
}
|
|
102
|
+
const metaRoot = cwd;
|
|
103
|
+
const config = await resolveMigrateConfig(flags, metaRoot);
|
|
104
|
+
if (config.databaseUrl === undefined) {
|
|
105
|
+
log.error(`migrate: --db <url> required (or set DATABASE_URL, or add migrate.databaseUrl to .metaobjects/config.json)`);
|
|
106
|
+
return 2;
|
|
107
|
+
}
|
|
108
|
+
let metadata;
|
|
109
|
+
try {
|
|
110
|
+
metadata = await loadMemory(metaRoot);
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
const msg = err.message;
|
|
114
|
+
if (msg.includes("ENOENT") || msg.includes("no such") || msg.includes("cannot read")) {
|
|
115
|
+
log.error(`no metaobjects/ found in ${metaRoot}; run 'meta init' to scaffold`);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
log.error(`failed to load metadata: ${msg}`);
|
|
119
|
+
}
|
|
120
|
+
return 2;
|
|
121
|
+
}
|
|
122
|
+
let kysely;
|
|
123
|
+
try {
|
|
124
|
+
kysely = await buildKyselyFromUrl(config.databaseUrl, config.dialect);
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
log.error(`migrate: ${err.message}`);
|
|
128
|
+
return 2;
|
|
129
|
+
}
|
|
130
|
+
let exitCode = 0;
|
|
131
|
+
let writtenPaths = [];
|
|
132
|
+
let blocked = [];
|
|
133
|
+
let ambiguous = [];
|
|
134
|
+
let changeCounts = {};
|
|
135
|
+
try {
|
|
136
|
+
const expected = buildExpectedSchema(metadata, { dialect: kysely.dialect });
|
|
137
|
+
let actual;
|
|
138
|
+
try {
|
|
139
|
+
actual = await introspect(kysely.db, kysely.dialect);
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
log.error(`migrate: failed to connect to ${kysely.displayUrl}: ${err.message}`);
|
|
143
|
+
await kysely.close();
|
|
144
|
+
return 2;
|
|
145
|
+
}
|
|
146
|
+
const collectedAmbiguous = [];
|
|
147
|
+
const onAmbiguousResolution = mapOnAmbiguous(config.onAmbiguous);
|
|
148
|
+
let diffResult;
|
|
149
|
+
try {
|
|
150
|
+
diffResult = await diff({
|
|
151
|
+
expected,
|
|
152
|
+
actual,
|
|
153
|
+
allow: tokensToAllowOptions(config.allow),
|
|
154
|
+
onAmbiguous: async (a) => {
|
|
155
|
+
collectedAmbiguous.push(a);
|
|
156
|
+
return onAmbiguousResolution;
|
|
157
|
+
},
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
// diff() throws when onAmbiguous returns "abort" — surface as exit 1
|
|
162
|
+
// with the collected ambiguity list.
|
|
163
|
+
if (err.message.includes("aborted by onAmbiguous")) {
|
|
164
|
+
ambiguous = ambiguousToEntries(collectedAmbiguous);
|
|
165
|
+
const output = formatMigrateResult({
|
|
166
|
+
dialect: kysely.dialect,
|
|
167
|
+
displayUrl: kysely.displayUrl,
|
|
168
|
+
changeCounts: {},
|
|
169
|
+
blocked: [],
|
|
170
|
+
ambiguous,
|
|
171
|
+
writtenPaths: [],
|
|
172
|
+
dryRun: config.dryRun,
|
|
173
|
+
}, { isTTY: !!process.stdout.isTTY });
|
|
174
|
+
log.info(output);
|
|
175
|
+
await kysely.close();
|
|
176
|
+
return 1;
|
|
177
|
+
}
|
|
178
|
+
throw err;
|
|
179
|
+
}
|
|
180
|
+
changeCounts = summarizeChanges(diffResult.changes);
|
|
181
|
+
// Load metaobjects config to pick up columnNamingStrategy for view DDL emit.
|
|
182
|
+
// If metaobjects.config.ts is absent (e.g. in projects that don't use codegen),
|
|
183
|
+
// fall back to snake_case so migrate still works without it.
|
|
184
|
+
let columnNamingStrategy = "snake_case";
|
|
185
|
+
try {
|
|
186
|
+
const forgeConfig = await loadMetaobjectsConfig(metaRoot);
|
|
187
|
+
if (forgeConfig.columnNamingStrategy) {
|
|
188
|
+
columnNamingStrategy = forgeConfig.columnNamingStrategy;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
// metaobjects.config.ts absent or invalid — use default snake_case
|
|
193
|
+
}
|
|
194
|
+
// Pull existing view CREATE SQL from the DB so unchanged views can be
|
|
195
|
+
// skipped (no DROP+CREATE noise when the body hasn't changed).
|
|
196
|
+
const existingViewSql = await readExistingViewSql(kysely.db, kysely.dialect);
|
|
197
|
+
// Compute view migrations (projections) independently of table changes.
|
|
198
|
+
const viewResult = computeProjectionMigrations({
|
|
199
|
+
metadata,
|
|
200
|
+
dialect: kysely.dialect,
|
|
201
|
+
allowBreaking: false,
|
|
202
|
+
columnNamingStrategy,
|
|
203
|
+
existingViewSql,
|
|
204
|
+
});
|
|
205
|
+
if (viewResult.errors.length > 0) {
|
|
206
|
+
for (const err of viewResult.errors)
|
|
207
|
+
log.error(err);
|
|
208
|
+
await kysely.close();
|
|
209
|
+
return 1;
|
|
210
|
+
}
|
|
211
|
+
const viewUpSql = viewResult.migrations.join("\n\n");
|
|
212
|
+
const hasTableChanges = diffResult.changes.length > 0;
|
|
213
|
+
const hasViewChanges = viewResult.migrations.length > 0;
|
|
214
|
+
if (!hasTableChanges && !hasViewChanges) {
|
|
215
|
+
// no-op — output will say "No schema changes"
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
// Emit table SQL (may be empty if only views changed).
|
|
219
|
+
let tableSql;
|
|
220
|
+
if (hasTableChanges) {
|
|
221
|
+
try {
|
|
222
|
+
tableSql = emit(diffResult.changes, {
|
|
223
|
+
dialect: kysely.dialect,
|
|
224
|
+
expectedSchema: expected,
|
|
225
|
+
...(actual.meta !== undefined ? { actualMeta: actual.meta } : {}),
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
if (err instanceof BlockedChangesError) {
|
|
230
|
+
blocked = blockedToEntries(err);
|
|
231
|
+
exitCode = 1;
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
throw err;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
// Combine table + view SQL into a single migration if no errors.
|
|
239
|
+
if (exitCode === 0) {
|
|
240
|
+
// Extract view names from the CREATE VIEW statements (used by both the
|
|
241
|
+
// pre-drop and down-migration paths below).
|
|
242
|
+
const viewNames = viewResult.migrations
|
|
243
|
+
.map((s) => {
|
|
244
|
+
const m = /CREATE(?:\s+OR\s+REPLACE)?\s+VIEW\s+(\S+)/i.exec(s);
|
|
245
|
+
return m ? m[1] : undefined;
|
|
246
|
+
})
|
|
247
|
+
.filter((n) => Boolean(n));
|
|
248
|
+
// Pre-drop dependent views, BUT only the ones whose source tables are
|
|
249
|
+
// being recreated. SQLite's ALTER TABLE ... RENAME re-parses dependent
|
|
250
|
+
// view definitions and errors if any of them reference a source table
|
|
251
|
+
// that's mid-recreate (the recreate-and-copy pattern temporarily drops
|
|
252
|
+
// the source table and creates __new_<table>, then RENAMEs). The
|
|
253
|
+
// viewUpSql block below recreates the dropped views fresh.
|
|
254
|
+
const recreatedTables = tableSql?.recreatedTables ?? new Set();
|
|
255
|
+
const viewPreDropSql = recreatedTables.size > 0 && viewNames.length > 0
|
|
256
|
+
? (() => {
|
|
257
|
+
const deps = computeProjectionViewDependencies({
|
|
258
|
+
metadata,
|
|
259
|
+
columnNamingStrategy,
|
|
260
|
+
});
|
|
261
|
+
const affected = viewNames.filter((n) => {
|
|
262
|
+
const sources = deps.get(n);
|
|
263
|
+
if (!sources)
|
|
264
|
+
return false;
|
|
265
|
+
for (const t of sources)
|
|
266
|
+
if (recreatedTables.has(t))
|
|
267
|
+
return true;
|
|
268
|
+
return false;
|
|
269
|
+
});
|
|
270
|
+
return affected.length > 0
|
|
271
|
+
? affected.map((n) => `DROP VIEW IF EXISTS ${n};`).join("\n")
|
|
272
|
+
: "";
|
|
273
|
+
})()
|
|
274
|
+
: "";
|
|
275
|
+
const upParts = [viewPreDropSql, tableSql?.up, viewUpSql].filter(Boolean);
|
|
276
|
+
const combinedUp = upParts.join("\n\n");
|
|
277
|
+
// Down SQL: DROP VIEW statements for any views we created.
|
|
278
|
+
const viewDownSql = viewNames
|
|
279
|
+
.map((n) => `DROP VIEW IF EXISTS ${n};`)
|
|
280
|
+
.join("\n");
|
|
281
|
+
const downParts = [viewDownSql, tableSql?.down].filter(Boolean);
|
|
282
|
+
const combinedDown = downParts.join("\n\n");
|
|
283
|
+
if (config.slug === undefined) {
|
|
284
|
+
log.error(`migrate: --slug <name> required when there are changes (e.g., --slug add-user-shipping)`);
|
|
285
|
+
await kysely.close();
|
|
286
|
+
return 2;
|
|
287
|
+
}
|
|
288
|
+
if (config.dryRun) {
|
|
289
|
+
log.info(`-- UP --\n${combinedUp}\n\n-- DOWN --\n${combinedDown}`);
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
const outDir = resolve(metaRoot, config.outDir);
|
|
293
|
+
await mkdir(outDir, { recursive: true });
|
|
294
|
+
const res = await writeMigration({ up: combinedUp, down: combinedDown }, { dir: outDir, slug: config.slug });
|
|
295
|
+
writtenPaths = [res.upPath, res.downPath];
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
finally {
|
|
301
|
+
try {
|
|
302
|
+
await kysely.close();
|
|
303
|
+
}
|
|
304
|
+
catch (err) {
|
|
305
|
+
log.warn(`migrate: failed to close DB cleanly: ${err.message}`);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
const output = formatMigrateResult({
|
|
309
|
+
dialect: kysely.dialect,
|
|
310
|
+
displayUrl: kysely.displayUrl,
|
|
311
|
+
changeCounts,
|
|
312
|
+
blocked,
|
|
313
|
+
ambiguous,
|
|
314
|
+
writtenPaths,
|
|
315
|
+
dryRun: config.dryRun,
|
|
316
|
+
}, { isTTY: !!process.stdout.isTTY });
|
|
317
|
+
log.info(output);
|
|
318
|
+
return exitCode;
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Read existing view CREATE SQL from the DB. Returns an empty map on any
|
|
322
|
+
* introspection failure — the worst case is over-eager DROP+CREATE
|
|
323
|
+
* (the original behaviour), not data loss.
|
|
324
|
+
*/
|
|
325
|
+
async function readExistingViewSql(
|
|
326
|
+
// biome-ignore lint/suspicious/noExplicitAny: kysely raw query, dialect-dispatched
|
|
327
|
+
db, dialect) {
|
|
328
|
+
const result = new Map();
|
|
329
|
+
try {
|
|
330
|
+
if (dialect === "sqlite") {
|
|
331
|
+
const { sql } = await import("kysely");
|
|
332
|
+
const rows = await sql `
|
|
333
|
+
SELECT name, sql FROM sqlite_master WHERE type='view' AND name NOT LIKE 'sqlite_%'
|
|
334
|
+
`.execute(db);
|
|
335
|
+
for (const r of rows.rows) {
|
|
336
|
+
if (r.name && r.sql)
|
|
337
|
+
result.set(r.name, r.sql);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
const { sql } = await import("kysely");
|
|
342
|
+
const rows = await sql `
|
|
343
|
+
SELECT viewname AS name, definition AS def
|
|
344
|
+
FROM pg_views
|
|
345
|
+
WHERE schemaname = 'public'
|
|
346
|
+
`.execute(db);
|
|
347
|
+
for (const r of rows.rows) {
|
|
348
|
+
// Postgres pg_views.definition returns only the SELECT body, not the
|
|
349
|
+
// full "CREATE VIEW ... AS ...". Synthesize so comparison is apples-
|
|
350
|
+
// to-apples with what emitViewDdl produces.
|
|
351
|
+
if (r.name && r.def)
|
|
352
|
+
result.set(r.name, `CREATE VIEW ${r.name} AS ${r.def}`);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
catch {
|
|
357
|
+
// ignore — empty map means over-eager recreate, same as before this fix
|
|
358
|
+
}
|
|
359
|
+
return result;
|
|
360
|
+
}
|
|
361
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../../src/commands/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,YAAY,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AA4CvE,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA6DzD"}
|