@metaobjectsdev/migrate-ts 0.5.0 → 0.6.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 (73) hide show
  1. package/README.md +34 -0
  2. package/dist/emit/d1-safety-pass.d.ts +15 -0
  3. package/dist/emit/d1-safety-pass.d.ts.map +1 -0
  4. package/dist/emit/d1-safety-pass.js +80 -0
  5. package/dist/emit/d1-safety-pass.js.map +1 -0
  6. package/dist/emit/d1.d.ts +3 -0
  7. package/dist/emit/d1.d.ts.map +1 -0
  8. package/dist/emit/d1.js +11 -0
  9. package/dist/emit/d1.js.map +1 -0
  10. package/dist/emit/index.d.ts.map +1 -1
  11. package/dist/emit/index.js +2 -0
  12. package/dist/emit/index.js.map +1 -1
  13. package/dist/emit/postgres.js +28 -3
  14. package/dist/emit/postgres.js.map +1 -1
  15. package/dist/emit/sqlite.d.ts +1 -1
  16. package/dist/emit/sqlite.d.ts.map +1 -1
  17. package/dist/emit/sqlite.js.map +1 -1
  18. package/dist/errors.d.ts +17 -0
  19. package/dist/errors.d.ts.map +1 -1
  20. package/dist/errors.js +28 -0
  21. package/dist/errors.js.map +1 -1
  22. package/dist/expected-schema.d.ts +7 -7
  23. package/dist/expected-schema.d.ts.map +1 -1
  24. package/dist/expected-schema.js +78 -35
  25. package/dist/expected-schema.js.map +1 -1
  26. package/dist/index.d.ts +7 -1
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +12 -1
  29. package/dist/index.js.map +1 -1
  30. package/dist/introspect/d1.d.ts +21 -0
  31. package/dist/introspect/d1.d.ts.map +1 -0
  32. package/dist/introspect/d1.js +149 -0
  33. package/dist/introspect/d1.js.map +1 -0
  34. package/dist/introspect/index.d.ts.map +1 -1
  35. package/dist/introspect/index.js +1 -0
  36. package/dist/introspect/index.js.map +1 -1
  37. package/dist/introspect/sqlite-shared.d.ts +14 -0
  38. package/dist/introspect/sqlite-shared.d.ts.map +1 -0
  39. package/dist/introspect/sqlite-shared.js +74 -0
  40. package/dist/introspect/sqlite-shared.js.map +1 -0
  41. package/dist/introspect/sqlite.js +1 -73
  42. package/dist/introspect/sqlite.js.map +1 -1
  43. package/dist/referential-actions.d.ts +49 -0
  44. package/dist/referential-actions.d.ts.map +1 -0
  45. package/dist/referential-actions.js +110 -0
  46. package/dist/referential-actions.js.map +1 -0
  47. package/dist/types.d.ts +15 -1
  48. package/dist/types.d.ts.map +1 -1
  49. package/dist/wrangler-config.d.ts +25 -0
  50. package/dist/wrangler-config.d.ts.map +1 -0
  51. package/dist/wrangler-config.js +91 -0
  52. package/dist/wrangler-config.js.map +1 -0
  53. package/dist/write-migration-d1.d.ts +17 -0
  54. package/dist/write-migration-d1.d.ts.map +1 -0
  55. package/dist/write-migration-d1.js +50 -0
  56. package/dist/write-migration-d1.js.map +1 -0
  57. package/package.json +28 -27
  58. package/src/emit/d1-safety-pass.ts +94 -0
  59. package/src/emit/d1.ts +16 -0
  60. package/src/emit/index.ts +2 -0
  61. package/src/emit/postgres.ts +35 -3
  62. package/src/emit/sqlite.ts +1 -1
  63. package/src/errors.ts +33 -0
  64. package/src/expected-schema.ts +100 -52
  65. package/src/index.ts +22 -1
  66. package/src/introspect/d1.ts +185 -0
  67. package/src/introspect/index.ts +1 -0
  68. package/src/introspect/sqlite-shared.ts +77 -0
  69. package/src/introspect/sqlite.ts +2 -69
  70. package/src/referential-actions.ts +134 -0
  71. package/src/types.ts +15 -1
  72. package/src/wrangler-config.ts +103 -0
  73. package/src/write-migration-d1.ts +74 -0
@@ -0,0 +1,74 @@
1
+ import { mkdir, readdir, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import type { EmitResult } from "./types.js";
4
+
5
+ export interface WriteMigrationD1Options {
6
+ /** Migrations dir (e.g., "migrations"). Created if missing. */
7
+ dir: string;
8
+ /** Human-readable slug; sanitized to lowercase + hyphens. */
9
+ slug: string;
10
+ }
11
+
12
+ export interface WriteMigrationD1Result {
13
+ /** Full path to the up SQL file. */
14
+ upPath: string;
15
+ /** Full path to the down sidecar SQL file. */
16
+ downPath: string;
17
+ /** Assigned sequence number (e.g., 1, 2, 10000). */
18
+ sequence: number;
19
+ }
20
+
21
+ const SEQ_RE = /^(\d+)_/;
22
+
23
+ export async function writeMigrationD1(
24
+ result: Pick<EmitResult, "up" | "down">,
25
+ opts: WriteMigrationD1Options,
26
+ ): Promise<WriteMigrationD1Result> {
27
+ await mkdir(opts.dir, { recursive: true });
28
+ await mkdir(join(opts.dir, ".down"), { recursive: true });
29
+
30
+ const seq = await nextSequence(opts.dir);
31
+ const padded = String(seq).padStart(4, "0");
32
+ const slug = sanitizeSlug(opts.slug);
33
+ const filename = `${padded}_${slug}.sql`;
34
+
35
+ const upPath = join(opts.dir, filename);
36
+ const downPath = join(opts.dir, ".down", filename);
37
+
38
+ await writeFile(upPath, ensureTrailingNewline(result.up), "utf8");
39
+ await writeFile(downPath, ensureTrailingNewline(result.down), "utf8");
40
+
41
+ return { upPath, downPath, sequence: seq };
42
+ }
43
+
44
+ async function nextSequence(dir: string): Promise<number> {
45
+ let entries: string[];
46
+ // Best-effort: dir was just mkdir'd above, but in race/permission edge cases the
47
+ // listing can still fail; treat as empty (next seq = 1) rather than rethrow.
48
+ try {
49
+ entries = await readdir(dir);
50
+ } catch {
51
+ return 1;
52
+ }
53
+ let max = 0;
54
+ for (const entry of entries) {
55
+ if (!entry.endsWith(".sql")) continue;
56
+ const m = SEQ_RE.exec(entry);
57
+ if (!m) continue;
58
+ const n = parseInt(m[1]!, 10);
59
+ if (n > max) max = n;
60
+ }
61
+ return max + 1;
62
+ }
63
+
64
+ function sanitizeSlug(raw: string): string {
65
+ return raw
66
+ .toLowerCase()
67
+ .replace(/[^a-z0-9]+/g, "-")
68
+ .replace(/^-+|-+$/g, "")
69
+ .substring(0, 60);
70
+ }
71
+
72
+ function ensureTrailingNewline(s: string): string {
73
+ return s.endsWith("\n") ? s : s + "\n";
74
+ }