@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.
Files changed (67) hide show
  1. package/LICENSE +189 -0
  2. package/README.md +184 -0
  3. package/dist/bin/meta.d.ts +3 -0
  4. package/dist/bin/meta.d.ts.map +1 -0
  5. package/dist/bin/meta.js +7 -0
  6. package/dist/bin/meta.js.map +1 -0
  7. package/dist/src/commands/export.d.ts +2 -0
  8. package/dist/src/commands/export.d.ts.map +1 -0
  9. package/dist/src/commands/export.js +45 -0
  10. package/dist/src/commands/export.js.map +1 -0
  11. package/dist/src/commands/gen.d.ts +2 -0
  12. package/dist/src/commands/gen.d.ts.map +1 -0
  13. package/dist/src/commands/gen.js +86 -0
  14. package/dist/src/commands/gen.js.map +1 -0
  15. package/dist/src/commands/init.d.ts +16 -0
  16. package/dist/src/commands/init.d.ts.map +1 -0
  17. package/dist/src/commands/init.js +222 -0
  18. package/dist/src/commands/init.js.map +1 -0
  19. package/dist/src/commands/migrate.d.ts +2 -0
  20. package/dist/src/commands/migrate.d.ts.map +1 -0
  21. package/dist/src/commands/migrate.js +361 -0
  22. package/dist/src/commands/migrate.js.map +1 -0
  23. package/dist/src/index.d.ts +4 -0
  24. package/dist/src/index.d.ts.map +1 -0
  25. package/dist/src/index.js +105 -0
  26. package/dist/src/index.js.map +1 -0
  27. package/dist/src/lib/args.d.ts +34 -0
  28. package/dist/src/lib/args.d.ts.map +1 -0
  29. package/dist/src/lib/args.js +103 -0
  30. package/dist/src/lib/args.js.map +1 -0
  31. package/dist/src/lib/config.d.ts +17 -0
  32. package/dist/src/lib/config.d.ts.map +1 -0
  33. package/dist/src/lib/config.js +48 -0
  34. package/dist/src/lib/config.js.map +1 -0
  35. package/dist/src/lib/kysely.d.ts +28 -0
  36. package/dist/src/lib/kysely.d.ts.map +1 -0
  37. package/dist/src/lib/kysely.js +100 -0
  38. package/dist/src/lib/kysely.js.map +1 -0
  39. package/dist/src/lib/load-metaobjects-config.d.ts +3 -0
  40. package/dist/src/lib/load-metaobjects-config.d.ts.map +1 -0
  41. package/dist/src/lib/load-metaobjects-config.js +83 -0
  42. package/dist/src/lib/load-metaobjects-config.js.map +1 -0
  43. package/dist/src/lib/log.d.ts +6 -0
  44. package/dist/src/lib/log.d.ts.map +1 -0
  45. package/dist/src/lib/log.js +6 -0
  46. package/dist/src/lib/log.js.map +1 -0
  47. package/dist/src/lib/output.d.ts +38 -0
  48. package/dist/src/lib/output.d.ts.map +1 -0
  49. package/dist/src/lib/output.js +96 -0
  50. package/dist/src/lib/output.js.map +1 -0
  51. package/dist/src/lib/projection-migrations.d.ts +34 -0
  52. package/dist/src/lib/projection-migrations.d.ts.map +1 -0
  53. package/dist/src/lib/projection-migrations.js +112 -0
  54. package/dist/src/lib/projection-migrations.js.map +1 -0
  55. package/package.json +71 -0
  56. package/src/commands/export.ts +50 -0
  57. package/src/commands/gen.ts +88 -0
  58. package/src/commands/init.ts +272 -0
  59. package/src/commands/migrate.ts +390 -0
  60. package/src/index.ts +109 -0
  61. package/src/lib/args.ts +157 -0
  62. package/src/lib/config.ts +78 -0
  63. package/src/lib/kysely.ts +114 -0
  64. package/src/lib/load-metaobjects-config.ts +89 -0
  65. package/src/lib/log.ts +5 -0
  66. package/src/lib/output.ts +156 -0
  67. package/src/lib/projection-migrations.ts +159 -0
@@ -0,0 +1,105 @@
1
+ import { resolve } from "node:path";
2
+ import { log } from "./lib/log.js";
3
+ export { defineConfig } from "@metaobjectsdev/codegen-ts";
4
+ const VERSION = "0.2.0";
5
+ const HELP_TEXT = `meta — MetaObjects CLI (v${VERSION})
6
+
7
+ USAGE:
8
+ meta <command> [flags]
9
+
10
+ COMMANDS:
11
+ init Scaffold metaobjects/ + .metaobjects/ in the current repo
12
+ init --refresh-docs Refresh .metaobjects/AGENTS.md + CLAUDE.md after CLI upgrades
13
+ gen [<entity>...] Codegen TS targets from metaobjects/ entities
14
+ export Flatten loaded metadata to one canonical JSON artifact
15
+ migrate Diff metadata vs live DB; emit migration SQL files
16
+ --version, -v Print version
17
+ --help, -h Print this help
18
+
19
+ GLOBAL OPTIONS:
20
+ --cwd <path>, -C <path> Run as if launched from <path> (default: current directory)
21
+
22
+ GEN FLAGS:
23
+ --dry-run Compute and print, don't write
24
+ <entity> [<entity>] Positional filter on entity names
25
+ (outDir, dialect, dbImport, extStyle are read from metaobjects.config.ts)
26
+
27
+ EXPORT FLAGS:
28
+ --out <file> Write output to a file (default: stdout)
29
+
30
+ MIGRATE FLAGS:
31
+ --db <url> DB connection URL (required, or set DATABASE_URL or config)
32
+ Supports: file:, libsql:, postgres:, postgresql:
33
+ --dialect sqlite|postgres Optional override (auto-detected from URL scheme)
34
+ --out-dir <path> Migration directory (default: ./.metaobjects/migrations)
35
+ --slug <name> Required when changes are present (e.g., add-user-shipping)
36
+ --allow <csv> Comma-separated destructive-change permissions:
37
+ drop-column,drop-table,type-change,drop-index,drop-fk,nullable-to-not-null
38
+ --on-ambiguous abort|rename|drop-add Default abort
39
+ --dry-run Print SQL to stdout, don't write
40
+
41
+ Other commands (ingest, mcp, serve, install-hooks, audit, capture, promote)
42
+ ship in later sub-projects. See https://metaobjects.com for docs.
43
+ `;
44
+ export async function run(argv) {
45
+ // Extract the global --cwd / -C flag (anywhere in argv). A relative path
46
+ // resolves against the real process.cwd(). Absent → process.cwd().
47
+ let cwd = process.cwd();
48
+ const cleaned = [];
49
+ for (let i = 0; i < argv.length; i++) {
50
+ const a = argv[i];
51
+ if (a === "--cwd" || a === "-C") {
52
+ const val = argv[i + 1];
53
+ if (val === undefined) {
54
+ log.error(`${a} requires a path argument`);
55
+ return 2;
56
+ }
57
+ cwd = resolve(process.cwd(), val);
58
+ i++; // consume the value
59
+ continue;
60
+ }
61
+ if (a.startsWith("--cwd=")) {
62
+ const val = a.slice("--cwd=".length);
63
+ if (val === "") {
64
+ log.error("--cwd= requires a path argument");
65
+ return 2;
66
+ }
67
+ cwd = resolve(process.cwd(), val);
68
+ continue;
69
+ }
70
+ cleaned.push(a);
71
+ }
72
+ const [cmd, ...rest] = cleaned;
73
+ switch (cmd) {
74
+ case undefined:
75
+ case "--help":
76
+ case "-h":
77
+ log.info(HELP_TEXT);
78
+ return 0;
79
+ case "--version":
80
+ case "-v":
81
+ log.info(VERSION);
82
+ return 0;
83
+ case "init": {
84
+ const { initCommand } = await import("./commands/init.js");
85
+ return initCommand(rest, cwd);
86
+ }
87
+ case "gen": {
88
+ const { genCommand } = await import("./commands/gen.js");
89
+ return genCommand(rest, cwd);
90
+ }
91
+ case "export": {
92
+ const { exportCommand } = await import("./commands/export.js");
93
+ return exportCommand(rest, cwd);
94
+ }
95
+ case "migrate": {
96
+ const { migrateCommand } = await import("./commands/migrate.js");
97
+ return migrateCommand(rest, cwd);
98
+ }
99
+ default:
100
+ log.error(`Unknown command: ${cmd}`);
101
+ log.info(HELP_TEXT);
102
+ return 2;
103
+ }
104
+ }
105
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ export interface InitFlags {
2
+ force: boolean;
3
+ quiet: boolean;
4
+ printOnly: boolean;
5
+ refreshDocs: boolean;
6
+ }
7
+ export declare function parseInitArgs(argv: string[]): InitFlags;
8
+ export interface GenFlags {
9
+ dryRun: boolean;
10
+ entities: string[];
11
+ }
12
+ export declare function parseGenArgs(argv: string[]): GenFlags;
13
+ export interface ExportFlags {
14
+ out: string | undefined;
15
+ }
16
+ export declare function parseExportArgs(argv: string[]): ExportFlags;
17
+ declare const DIALECTS: readonly ["sqlite", "postgres"];
18
+ type Dialect = (typeof DIALECTS)[number];
19
+ declare const ALLOW_TOKENS: readonly ["drop-column", "drop-table", "type-change", "drop-index", "drop-fk", "nullable-to-not-null"];
20
+ type AllowToken = (typeof ALLOW_TOKENS)[number];
21
+ declare const ON_AMBIGUOUS: readonly ["abort", "rename", "drop-add"];
22
+ type OnAmbiguous = (typeof ON_AMBIGUOUS)[number];
23
+ export interface MigrateFlags {
24
+ db: string | undefined;
25
+ dialect: Dialect | undefined;
26
+ outDir: string | undefined;
27
+ slug: string | undefined;
28
+ allow: AllowToken[];
29
+ onAmbiguous: OnAmbiguous | undefined;
30
+ dryRun: boolean;
31
+ }
32
+ export declare function parseMigrateArgs(argv: string[]): MigrateFlags;
33
+ export {};
34
+ //# sourceMappingURL=args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../../src/lib/args.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,CAkBvD;AAMD,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,CAarD;AAMD,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;CACzB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CAY3D;AAMD,QAAA,MAAM,QAAQ,iCAAkC,CAAC;AACjD,KAAK,OAAO,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzC,QAAA,MAAM,YAAY,wGAOR,CAAC;AACX,KAAK,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhD,QAAA,MAAM,YAAY,0CAA2C,CAAC;AAC9D,KAAK,WAAW,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC;IACvB,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC;IACrC,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,CA+C7D"}
@@ -0,0 +1,103 @@
1
+ import { parseArgs } from "node:util";
2
+ export function parseInitArgs(argv) {
3
+ const { values } = parseArgs({
4
+ args: argv,
5
+ options: {
6
+ force: { type: "boolean", default: false },
7
+ quiet: { type: "boolean", default: false },
8
+ "print-only": { type: "boolean", default: false },
9
+ "refresh-docs": { type: "boolean", default: false },
10
+ },
11
+ strict: true,
12
+ allowPositionals: false,
13
+ });
14
+ return {
15
+ force: !!values.force,
16
+ quiet: !!values.quiet,
17
+ printOnly: !!values["print-only"],
18
+ refreshDocs: !!values["refresh-docs"],
19
+ };
20
+ }
21
+ export function parseGenArgs(argv) {
22
+ const { values, positionals } = parseArgs({
23
+ args: argv,
24
+ options: {
25
+ "dry-run": { type: "boolean", default: false },
26
+ },
27
+ strict: true,
28
+ allowPositionals: true,
29
+ });
30
+ return {
31
+ dryRun: !!values["dry-run"],
32
+ entities: positionals,
33
+ };
34
+ }
35
+ export function parseExportArgs(argv) {
36
+ const { values } = parseArgs({
37
+ args: argv,
38
+ options: {
39
+ out: { type: "string" },
40
+ },
41
+ strict: true,
42
+ allowPositionals: false,
43
+ });
44
+ return {
45
+ out: values.out,
46
+ };
47
+ }
48
+ // ---------------------------------------------------------------------------
49
+ // migrate flags
50
+ // ---------------------------------------------------------------------------
51
+ const DIALECTS = ["sqlite", "postgres"];
52
+ const ALLOW_TOKENS = [
53
+ "drop-column",
54
+ "drop-table",
55
+ "type-change",
56
+ "drop-index",
57
+ "drop-fk",
58
+ "nullable-to-not-null",
59
+ ];
60
+ const ON_AMBIGUOUS = ["abort", "rename", "drop-add"];
61
+ export function parseMigrateArgs(argv) {
62
+ const { values } = parseArgs({
63
+ args: argv,
64
+ options: {
65
+ "db": { type: "string" },
66
+ "dialect": { type: "string" },
67
+ "out-dir": { type: "string" },
68
+ "slug": { type: "string" },
69
+ "allow": { type: "string" },
70
+ "on-ambiguous": { type: "string" },
71
+ "dry-run": { type: "boolean", default: false },
72
+ },
73
+ strict: true,
74
+ allowPositionals: false,
75
+ });
76
+ const dialect = values.dialect;
77
+ if (dialect !== undefined && !DIALECTS.includes(dialect)) {
78
+ throw new Error(`invalid --dialect '${dialect}'; expected: ${DIALECTS.join(", ")}`);
79
+ }
80
+ const onAmb = values["on-ambiguous"];
81
+ if (onAmb !== undefined && !ON_AMBIGUOUS.includes(onAmb)) {
82
+ throw new Error(`invalid --on-ambiguous '${onAmb}'; expected: ${ON_AMBIGUOUS.join(", ")}`);
83
+ }
84
+ const allowRaw = values.allow ?? "";
85
+ const allowTokens = allowRaw.length === 0
86
+ ? []
87
+ : allowRaw.split(",").map((s) => s.trim()).filter((s) => s.length > 0);
88
+ for (const tok of allowTokens) {
89
+ if (!ALLOW_TOKENS.includes(tok)) {
90
+ throw new Error(`invalid --allow token '${tok}'; expected one of: ${ALLOW_TOKENS.join(", ")}`);
91
+ }
92
+ }
93
+ return {
94
+ db: values.db,
95
+ dialect: dialect,
96
+ outDir: values["out-dir"],
97
+ slug: values.slug,
98
+ allow: allowTokens,
99
+ onAmbiguous: onAmb,
100
+ dryRun: !!values["dry-run"],
101
+ };
102
+ }
103
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../../src/lib/args.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { GenFlags, MigrateFlags } from "./args.js";
2
+ export interface ResolvedGenConfig {
3
+ dryRun: boolean;
4
+ entities: string[];
5
+ }
6
+ export interface ResolvedMigrateConfig {
7
+ outDir: string;
8
+ databaseUrl: string | undefined;
9
+ dialect: "sqlite" | "postgres" | undefined;
10
+ onAmbiguous: "abort" | "rename" | "drop-add";
11
+ allow: string[];
12
+ slug: string | undefined;
13
+ dryRun: boolean;
14
+ }
15
+ export declare function resolveGenConfig(flags: GenFlags): ResolvedGenConfig;
16
+ export declare function resolveMigrateConfig(flags: MigrateFlags, metaRoot: string): Promise<ResolvedMigrateConfig>;
17
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/lib/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAkBxD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,OAAO,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;IAC3C,WAAW,EAAE,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC7C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;CACjB;AAmBD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,GAAG,iBAAiB,CAEnE;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,qBAAqB,CAAC,CAiBhC"}
@@ -0,0 +1,48 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { ConfigSchema, DEFAULT_METAOBJECTS_DIR } from "@metaobjectsdev/sdk";
4
+ // ---------------------------------------------------------------------------
5
+ // Built-in defaults
6
+ // ---------------------------------------------------------------------------
7
+ const MIGRATE_DEFAULTS = {
8
+ outDir: "./.metaobjects/migrations",
9
+ databaseUrl: undefined,
10
+ dialect: undefined,
11
+ onAmbiguous: "abort",
12
+ allow: [],
13
+ };
14
+ // ---------------------------------------------------------------------------
15
+ // Config loader (silent if file missing)
16
+ // ---------------------------------------------------------------------------
17
+ async function tryLoadConfig(metaRoot) {
18
+ try {
19
+ const raw = await readFile(join(metaRoot, DEFAULT_METAOBJECTS_DIR, "config.json"), "utf8");
20
+ return ConfigSchema.parse(JSON.parse(raw));
21
+ }
22
+ catch {
23
+ return undefined;
24
+ }
25
+ }
26
+ // ---------------------------------------------------------------------------
27
+ // Public resolvers
28
+ // ---------------------------------------------------------------------------
29
+ export function resolveGenConfig(flags) {
30
+ return { dryRun: flags.dryRun, entities: flags.entities };
31
+ }
32
+ export async function resolveMigrateConfig(flags, metaRoot) {
33
+ const config = await tryLoadConfig(metaRoot);
34
+ const cfgBlock = config?.migrate ?? {};
35
+ const envUrl = process.env.DATABASE_URL;
36
+ return {
37
+ outDir: flags.outDir ?? cfgBlock.outDir ?? MIGRATE_DEFAULTS.outDir,
38
+ databaseUrl: flags.db ?? envUrl ?? cfgBlock.databaseUrl ?? MIGRATE_DEFAULTS.databaseUrl,
39
+ dialect: flags.dialect ?? cfgBlock.dialect ?? MIGRATE_DEFAULTS.dialect,
40
+ onAmbiguous: flags.onAmbiguous ?? cfgBlock.onAmbiguous ?? MIGRATE_DEFAULTS.onAmbiguous,
41
+ allow: flags.allow.length > 0
42
+ ? flags.allow
43
+ : (cfgBlock.allow ?? MIGRATE_DEFAULTS.allow),
44
+ slug: flags.slug,
45
+ dryRun: flags.dryRun,
46
+ };
47
+ }
48
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAe,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAGzF,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,MAAM,gBAAgB,GAAG;IACvB,MAAM,EAAE,2BAA2B;IACnC,WAAW,EAAE,SAA+B;IAC5C,OAAO,EAAE,SAA8C;IACvD,WAAW,EAAE,OAAgB;IAC7B,KAAK,EAAE,EAAc;CACtB,CAAC;AAqBF,8EAA8E;AAC9E,yCAAyC;AACzC,8EAA8E;AAE9E,KAAK,UAAU,aAAa,CAAC,QAAgB;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,uBAAuB,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC;QAC3F,OAAO,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,MAAM,UAAU,gBAAgB,CAAC,KAAe;IAC9C,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAAmB,EACnB,QAAgB;IAEhB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;IAEvC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAExC,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,IAAI,gBAAgB,CAAC,MAAM;QAClE,WAAW,EAAE,KAAK,CAAC,EAAE,IAAI,MAAM,IAAI,QAAQ,CAAC,WAAW,IAAI,gBAAgB,CAAC,WAAW;QACvF,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,IAAI,gBAAgB,CAAC,OAAO;QACtE,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW,IAAI,gBAAgB,CAAC,WAAW;QACtF,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YAC3B,CAAC,CAAC,KAAK,CAAC,KAAK;YACb,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,IAAI,gBAAgB,CAAC,KAAK,CAAC;QAC9C,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { Kysely } from "kysely";
2
+ export type Dialect = "sqlite" | "postgres";
3
+ export interface KyselyHandle {
4
+ db: Kysely<Record<string, unknown>>;
5
+ dialect: Dialect;
6
+ /** URL with credentials redacted, safe for display. */
7
+ displayUrl: string;
8
+ /** Idempotent — safe to call multiple times. */
9
+ close: () => Promise<void>;
10
+ }
11
+ /**
12
+ * Infer dialect from URL scheme. Throws if the scheme isn't recognized.
13
+ */
14
+ export declare function inferDialect(url: string): Dialect;
15
+ /**
16
+ * Strip credentials from a URL for display. Returns unchanged if no userinfo.
17
+ */
18
+ export declare function redactUrl(url: string): string;
19
+ /**
20
+ * Construct a Kysely instance from a URL.
21
+ *
22
+ * For sqlite/libsql, requires `@libsql/kysely-libsql` peer dep.
23
+ * For postgres, requires `pg` peer dep.
24
+ *
25
+ * Surfaces an install hint if the peer dep is missing.
26
+ */
27
+ export declare function buildKyselyFromUrl(url: string, dialectOverride?: Dialect): Promise<KyselyHandle>;
28
+ //# sourceMappingURL=kysely.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kysely.d.ts","sourceRoot":"","sources":["../../../src/lib/kysely.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE5C,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAkBjD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,eAAe,CAAC,EAAE,OAAO,GACxB,OAAO,CAAC,YAAY,CAAC,CA2DvB"}
@@ -0,0 +1,100 @@
1
+ import { Kysely } from "kysely";
2
+ /**
3
+ * Infer dialect from URL scheme. Throws if the scheme isn't recognized.
4
+ */
5
+ export function inferDialect(url) {
6
+ const match = /^([a-z]+):/i.exec(url);
7
+ if (match === null) {
8
+ throw new Error(`unrecognized URL '${url}'; expected scheme prefix like file:, libsql:, postgres:, postgresql:`);
9
+ }
10
+ const scheme = match[1].toLowerCase();
11
+ switch (scheme) {
12
+ case "file":
13
+ case "libsql":
14
+ return "sqlite";
15
+ case "postgres":
16
+ case "postgresql":
17
+ return "postgres";
18
+ default:
19
+ throw new Error(`unrecognized URL scheme '${scheme}'; supported: file, libsql, postgres, postgresql`);
20
+ }
21
+ }
22
+ /**
23
+ * Strip credentials from a URL for display. Returns unchanged if no userinfo.
24
+ */
25
+ export function redactUrl(url) {
26
+ return url.replace(/^([a-z]+:\/\/)([^:@/]+):([^@]+)@/i, "$1$2:***@");
27
+ }
28
+ /**
29
+ * Construct a Kysely instance from a URL.
30
+ *
31
+ * For sqlite/libsql, requires `@libsql/kysely-libsql` peer dep.
32
+ * For postgres, requires `pg` peer dep.
33
+ *
34
+ * Surfaces an install hint if the peer dep is missing.
35
+ */
36
+ export async function buildKyselyFromUrl(url, dialectOverride) {
37
+ const dialect = dialectOverride ?? inferDialect(url);
38
+ const displayUrl = redactUrl(url);
39
+ if (dialect === "sqlite") {
40
+ let LibsqlDialect;
41
+ try {
42
+ const mod = await import("@libsql/kysely-libsql");
43
+ LibsqlDialect = mod.LibsqlDialect;
44
+ }
45
+ catch {
46
+ throw new Error(`dialect 'sqlite' requires '@libsql/kysely-libsql'; install it: 'bun add @libsql/kysely-libsql'`);
47
+ }
48
+ const db = new Kysely({ dialect: new LibsqlDialect({ url }) });
49
+ let closed = false;
50
+ return {
51
+ db,
52
+ dialect,
53
+ displayUrl,
54
+ close: async () => {
55
+ if (closed)
56
+ return;
57
+ closed = true;
58
+ try {
59
+ await db.destroy();
60
+ }
61
+ catch { /* swallow */ }
62
+ },
63
+ };
64
+ }
65
+ let pg;
66
+ let PostgresDialect;
67
+ try {
68
+ pg = await import("pg");
69
+ ({ PostgresDialect } = await import("kysely"));
70
+ }
71
+ catch {
72
+ throw new Error(`dialect 'postgres' requires 'pg'; install it: 'bun add pg'`);
73
+ }
74
+ const PoolCtor = pg.Pool ?? pg.default?.Pool;
75
+ if (PoolCtor === undefined) {
76
+ throw new Error(`dialect 'postgres' requires 'pg' (no Pool export found)`);
77
+ }
78
+ const pool = new PoolCtor({ connectionString: url });
79
+ const db = new Kysely({ dialect: new PostgresDialect({ pool: pool }) });
80
+ let closed = false;
81
+ return {
82
+ db,
83
+ dialect,
84
+ displayUrl,
85
+ close: async () => {
86
+ if (closed)
87
+ return;
88
+ closed = true;
89
+ try {
90
+ await db.destroy();
91
+ }
92
+ catch { /* swallow */ }
93
+ try {
94
+ await pool.end();
95
+ }
96
+ catch { /* swallow */ }
97
+ },
98
+ };
99
+ }
100
+ //# sourceMappingURL=kysely.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kysely.js","sourceRoot":"","sources":["../../../src/lib/kysely.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { MetaobjectsGenConfig } from "@metaobjectsdev/codegen-ts";
2
+ export declare function loadMetaobjectsConfig(projectRoot: string): Promise<MetaobjectsGenConfig>;
3
+ //# sourceMappingURL=load-metaobjects-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-metaobjects-config.d.ts","sourceRoot":"","sources":["../../../src/lib/load-metaobjects-config.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAqDvE,wBAAsB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA8B9F"}
@@ -0,0 +1,83 @@
1
+ import { existsSync } from "node:fs";
2
+ import { createRequire } from "node:module";
3
+ import { resolve } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { createJiti } from "jiti";
6
+ const CONFIG_FILE = "metaobjects.config.ts";
7
+ // Resolve @metaobjectsdev/codegen-ts from the CLI's own node_modules so that
8
+ // metaobjects.config.ts (which lives in the user's project) can import it even
9
+ // when the user's project has no direct dependency on the package.
10
+ //
11
+ // When compiled: import.meta.url is dist/src/lib/load-metaobjects-config.js — four
12
+ // levels up (past lib/, src/, dist/) reaches the CLI package root (packages/cli/).
13
+ // When run as TS source (e.g. bun test): import.meta.url is src/lib/load-metaobjects-config.ts
14
+ // — three levels up (past lib/, src/) reaches the package root.
15
+ const _thisFile = fileURLToPath(import.meta.url);
16
+ const _isCompiled = _thisFile.includes("/dist/");
17
+ const _cliDir = resolve(_thisFile, _isCompiled ? "../../../.." : "../../..");
18
+ const _require = createRequire(import.meta.url);
19
+ // Each aliased specifier maps to a compiled-output path and a TS-source path,
20
+ // relative to _cliDir. When running from compiled output we resolve into the
21
+ // package's dist/; when running TS source directly (bun test, `meta` run from
22
+ // the workspace) we resolve into src/ so the CLI never depends on a stale,
23
+ // unrebuilt dist/.
24
+ //
25
+ // The three workspace deps resolve through the CLI's own node_modules.
26
+ // @metaobjectsdev/cli is this package itself, so it resolves directly from
27
+ // _cliDir rather than through node_modules (which would be a non-existent
28
+ // self-referential symlink).
29
+ const CLI_PKG_PATHS = {
30
+ "@metaobjectsdev/codegen-ts": {
31
+ dist: "node_modules/@metaobjectsdev/codegen-ts/dist/index.js",
32
+ src: "node_modules/@metaobjectsdev/codegen-ts/src/index.ts",
33
+ },
34
+ "@metaobjectsdev/codegen-ts/generators": {
35
+ dist: "node_modules/@metaobjectsdev/codegen-ts/dist/generators/index.js",
36
+ src: "node_modules/@metaobjectsdev/codegen-ts/src/generators/index.ts",
37
+ },
38
+ "@metaobjectsdev/codegen-ts-tanstack": {
39
+ dist: "node_modules/@metaobjectsdev/codegen-ts-tanstack/dist/index.js",
40
+ src: "node_modules/@metaobjectsdev/codegen-ts-tanstack/src/index.ts",
41
+ },
42
+ "@metaobjectsdev/cli": {
43
+ dist: "dist/src/index.js",
44
+ src: "src/index.ts",
45
+ },
46
+ };
47
+ function resolveCliPkg(specifier) {
48
+ const paths = CLI_PKG_PATHS[specifier];
49
+ if (paths !== undefined) {
50
+ return resolve(_cliDir, _isCompiled ? paths.dist : paths.src);
51
+ }
52
+ return _require.resolve(specifier);
53
+ }
54
+ export async function loadMetaobjectsConfig(projectRoot) {
55
+ const fullPath = resolve(projectRoot, CONFIG_FILE);
56
+ if (!existsSync(fullPath)) {
57
+ throw new Error(`metaobjects.config.ts not found at ${fullPath}. Run 'meta init' to scaffold one.`);
58
+ }
59
+ // Use import.meta.url as base so jiti resolves workspace deps (@metaobjectsdev/*)
60
+ // from the CLI's own node_modules, not from the user's project root.
61
+ // The alias map redirects codegen-ts imports to the CLI's own copy so that
62
+ // user projects don't need @metaobjectsdev/codegen-ts as a direct dependency.
63
+ const jiti = createJiti(import.meta.url, {
64
+ interopDefault: true,
65
+ alias: {
66
+ "@metaobjectsdev/codegen-ts": resolveCliPkg("@metaobjectsdev/codegen-ts"),
67
+ "@metaobjectsdev/codegen-ts/generators": resolveCliPkg("@metaobjectsdev/codegen-ts/generators"),
68
+ "@metaobjectsdev/codegen-ts-tanstack": resolveCliPkg("@metaobjectsdev/codegen-ts-tanstack"),
69
+ "@metaobjectsdev/cli": resolveCliPkg("@metaobjectsdev/cli"),
70
+ },
71
+ });
72
+ const raw = (await jiti.import(fullPath));
73
+ // jiti's interopDefault doesn't always unwrap the default export when accessed
74
+ // across module boundaries — explicitly unwrap if present.
75
+ const cfg = (raw && typeof raw === "object" && "default" in raw && raw.default
76
+ ? raw.default
77
+ : raw);
78
+ if (!cfg || typeof cfg !== "object" || !Array.isArray(cfg.generators)) {
79
+ throw new Error(`metaobjects.config.ts at ${fullPath} did not export a valid MetaobjectsGenConfig (missing 'generators' array).`);
80
+ }
81
+ return cfg;
82
+ }
83
+ //# sourceMappingURL=load-metaobjects-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-metaobjects-config.js","sourceRoot":"","sources":["../../../src/lib/load-metaobjects-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare const log: {
2
+ info: (msg: string) => void;
3
+ warn: (msg: string) => void;
4
+ error: (msg: string) => void;
5
+ };
6
+ //# sourceMappingURL=log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../../src/lib/log.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,GAAG;gBACF,MAAM;gBACN,MAAM;iBACL,MAAM;CACpB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export const log = {
2
+ info: (msg) => console.log(msg),
3
+ warn: (msg) => console.error(`meta: ${msg}`),
4
+ error: (msg) => console.error(`meta: ${msg}`),
5
+ };
6
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../../src/lib/log.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;IACvC,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;IACpD,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;CACtD,CAAC"}
@@ -0,0 +1,38 @@
1
+ export interface FormatOptions {
2
+ isTTY: boolean;
3
+ }
4
+ export type GenFileStatus = "new" | "merged" | "conflict" | "unchanged" | "refused";
5
+ export interface GenFileEntry {
6
+ path: string;
7
+ status: GenFileStatus;
8
+ info: string;
9
+ }
10
+ export interface GenResultShape {
11
+ files: GenFileEntry[];
12
+ outDir: string;
13
+ dialect: "sqlite" | "postgres";
14
+ dryRun: boolean;
15
+ warnings: string[];
16
+ }
17
+ export declare function formatGenResult(result: GenResultShape, opts: FormatOptions): string;
18
+ export interface BlockedEntry {
19
+ kind: string;
20
+ description: string;
21
+ allowFlag: string;
22
+ }
23
+ export interface AmbiguousEntry {
24
+ kind: string;
25
+ description: string;
26
+ hint: string;
27
+ }
28
+ export interface MigrateResultShape {
29
+ dialect: "sqlite" | "postgres";
30
+ displayUrl: string;
31
+ changeCounts: Record<string, number>;
32
+ blocked: BlockedEntry[];
33
+ ambiguous: AmbiguousEntry[];
34
+ writtenPaths: string[];
35
+ dryRun: boolean;
36
+ }
37
+ export declare function formatMigrateResult(result: MigrateResultShape, _opts: FormatOptions): string;
38
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../src/lib/output.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,CAAC;CAChB;AAMD,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;AAEpF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAkBD,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,CAyCnF;AAMD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,kBAAkB,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,CAyC5F"}