@percher/core 0.4.0 → 0.4.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 (245) hide show
  1. package/dist/commands/account.d.ts +24 -14
  2. package/dist/commands/account.d.ts.map +1 -1
  3. package/dist/commands/account.js +17 -4
  4. package/dist/commands/account.js.map +1 -1
  5. package/dist/commands/admin-reconcile-routes.d.ts +18 -0
  6. package/dist/commands/admin-reconcile-routes.d.ts.map +1 -0
  7. package/dist/commands/admin-reconcile-routes.js +22 -0
  8. package/dist/commands/admin-reconcile-routes.js.map +1 -0
  9. package/dist/commands/ai-files.d.ts +5 -17
  10. package/dist/commands/ai-files.d.ts.map +1 -1
  11. package/dist/commands/ai-files.js +3 -4
  12. package/dist/commands/ai-files.js.map +1 -1
  13. package/dist/commands/alerts.d.ts +69 -0
  14. package/dist/commands/alerts.d.ts.map +1 -0
  15. package/dist/commands/alerts.js +80 -0
  16. package/dist/commands/alerts.js.map +1 -0
  17. package/dist/commands/app-resources.d.ts +30 -0
  18. package/dist/commands/app-resources.d.ts.map +1 -0
  19. package/dist/commands/app-resources.js +34 -0
  20. package/dist/commands/app-resources.js.map +1 -0
  21. package/dist/commands/app-topology.d.ts +18 -0
  22. package/dist/commands/app-topology.d.ts.map +1 -0
  23. package/dist/commands/app-topology.js +25 -0
  24. package/dist/commands/app-topology.js.map +1 -0
  25. package/dist/commands/billing.d.ts +8 -8
  26. package/dist/commands/billing.d.ts.map +1 -1
  27. package/dist/commands/billing.js +1 -1
  28. package/dist/commands/billing.js.map +1 -1
  29. package/dist/commands/continue.d.ts +1 -1
  30. package/dist/commands/create.d.ts +2 -12
  31. package/dist/commands/create.d.ts.map +1 -1
  32. package/dist/commands/create.js +1 -1
  33. package/dist/commands/create.js.map +1 -1
  34. package/dist/commands/dashboard.d.ts +2 -8
  35. package/dist/commands/dashboard.d.ts.map +1 -1
  36. package/dist/commands/dashboard.js +1 -1
  37. package/dist/commands/dashboard.js.map +1 -1
  38. package/dist/commands/data-export.d.ts +2 -8
  39. package/dist/commands/data-export.d.ts.map +1 -1
  40. package/dist/commands/data-export.js +1 -1
  41. package/dist/commands/data-export.js.map +1 -1
  42. package/dist/commands/data.d.ts +2 -8
  43. package/dist/commands/data.d.ts.map +1 -1
  44. package/dist/commands/data.js +1 -1
  45. package/dist/commands/data.js.map +1 -1
  46. package/dist/commands/delete.d.ts +2 -8
  47. package/dist/commands/delete.d.ts.map +1 -1
  48. package/dist/commands/delete.js +1 -1
  49. package/dist/commands/delete.js.map +1 -1
  50. package/dist/commands/deploys.d.ts +4 -28
  51. package/dist/commands/deploys.d.ts.map +1 -1
  52. package/dist/commands/deploys.js +1 -1
  53. package/dist/commands/deploys.js.map +1 -1
  54. package/dist/commands/dev.d.ts +2 -6
  55. package/dist/commands/dev.d.ts.map +1 -1
  56. package/dist/commands/dev.js +1 -1
  57. package/dist/commands/dev.js.map +1 -1
  58. package/dist/commands/diagnose.d.ts +2 -22
  59. package/dist/commands/diagnose.d.ts.map +1 -1
  60. package/dist/commands/diagnose.js +1 -1
  61. package/dist/commands/diagnose.js.map +1 -1
  62. package/dist/commands/doctor.d.ts +10 -35
  63. package/dist/commands/doctor.d.ts.map +1 -1
  64. package/dist/commands/doctor.js +12 -4
  65. package/dist/commands/doctor.js.map +1 -1
  66. package/dist/commands/domains.d.ts +5 -27
  67. package/dist/commands/domains.d.ts.map +1 -1
  68. package/dist/commands/domains.js +1 -1
  69. package/dist/commands/domains.js.map +1 -1
  70. package/dist/commands/env-scan.js +1 -1
  71. package/dist/commands/env-scan.js.map +1 -1
  72. package/dist/commands/env.d.ts +4 -20
  73. package/dist/commands/env.d.ts.map +1 -1
  74. package/dist/commands/env.js +1 -1
  75. package/dist/commands/env.js.map +1 -1
  76. package/dist/commands/export.d.ts +1 -1
  77. package/dist/commands/forgejo.d.ts +45 -0
  78. package/dist/commands/forgejo.d.ts.map +1 -0
  79. package/dist/commands/forgejo.js +125 -0
  80. package/dist/commands/forgejo.js.map +1 -0
  81. package/dist/commands/generate.d.ts +2 -6
  82. package/dist/commands/generate.d.ts.map +1 -1
  83. package/dist/commands/generate.js +1 -1
  84. package/dist/commands/generate.js.map +1 -1
  85. package/dist/commands/github.d.ts +4 -15
  86. package/dist/commands/github.d.ts.map +1 -1
  87. package/dist/commands/github.js +17 -1
  88. package/dist/commands/github.js.map +1 -1
  89. package/dist/commands/import-project.d.ts +13 -9
  90. package/dist/commands/import-project.d.ts.map +1 -1
  91. package/dist/commands/import-project.js +73 -22
  92. package/dist/commands/import-project.js.map +1 -1
  93. package/dist/commands/init.d.ts +26 -11
  94. package/dist/commands/init.d.ts.map +1 -1
  95. package/dist/commands/init.js +103 -2
  96. package/dist/commands/init.js.map +1 -1
  97. package/dist/commands/insights.d.ts +2 -6
  98. package/dist/commands/insights.d.ts.map +1 -1
  99. package/dist/commands/insights.js +1 -1
  100. package/dist/commands/insights.js.map +1 -1
  101. package/dist/commands/login.d.ts +2 -8
  102. package/dist/commands/login.d.ts.map +1 -1
  103. package/dist/commands/login.js +22 -1
  104. package/dist/commands/login.js.map +1 -1
  105. package/dist/commands/logs.d.ts +25 -10
  106. package/dist/commands/logs.d.ts.map +1 -1
  107. package/dist/commands/logs.js +65 -5
  108. package/dist/commands/logs.js.map +1 -1
  109. package/dist/commands/mcp.d.ts +2 -2
  110. package/dist/commands/mcp.d.ts.map +1 -1
  111. package/dist/commands/mcp.js +1 -1
  112. package/dist/commands/mcp.js.map +1 -1
  113. package/dist/commands/migrate-supabase-map.d.ts +171 -0
  114. package/dist/commands/migrate-supabase-map.d.ts.map +1 -0
  115. package/dist/commands/migrate-supabase-map.js +452 -0
  116. package/dist/commands/migrate-supabase-map.js.map +1 -0
  117. package/dist/commands/migrate-supabase-schema.d.ts +67 -0
  118. package/dist/commands/migrate-supabase-schema.d.ts.map +1 -0
  119. package/dist/commands/migrate-supabase-schema.js +321 -0
  120. package/dist/commands/migrate-supabase-schema.js.map +1 -0
  121. package/dist/commands/migrate-supabase-scripts.d.ts +64 -0
  122. package/dist/commands/migrate-supabase-scripts.d.ts.map +1 -0
  123. package/dist/commands/migrate-supabase-scripts.js +564 -0
  124. package/dist/commands/migrate-supabase-scripts.js.map +1 -0
  125. package/dist/commands/migrate-supabase-sdk.d.ts +133 -0
  126. package/dist/commands/migrate-supabase-sdk.d.ts.map +1 -0
  127. package/dist/commands/migrate-supabase-sdk.js +1119 -0
  128. package/dist/commands/migrate-supabase-sdk.js.map +1 -0
  129. package/dist/commands/migrate-supabase-walker.d.ts +93 -0
  130. package/dist/commands/migrate-supabase-walker.d.ts.map +1 -0
  131. package/dist/commands/migrate-supabase-walker.js +413 -0
  132. package/dist/commands/migrate-supabase-walker.js.map +1 -0
  133. package/dist/commands/migrate-supabase.d.ts +81 -0
  134. package/dist/commands/migrate-supabase.d.ts.map +1 -0
  135. package/dist/commands/migrate-supabase.js +579 -0
  136. package/dist/commands/migrate-supabase.js.map +1 -0
  137. package/dist/commands/open.d.ts +2 -6
  138. package/dist/commands/open.d.ts.map +1 -1
  139. package/dist/commands/open.js +1 -1
  140. package/dist/commands/open.js.map +1 -1
  141. package/dist/commands/publish-api-error.d.ts +46 -0
  142. package/dist/commands/publish-api-error.d.ts.map +1 -0
  143. package/dist/commands/publish-api-error.js +307 -0
  144. package/dist/commands/publish-api-error.js.map +1 -0
  145. package/dist/commands/publish.d.ts +40 -17
  146. package/dist/commands/publish.d.ts.map +1 -1
  147. package/dist/commands/publish.js +115 -8
  148. package/dist/commands/publish.js.map +1 -1
  149. package/dist/commands/push.d.ts +2 -12
  150. package/dist/commands/push.d.ts.map +1 -1
  151. package/dist/commands/push.js +2 -2
  152. package/dist/commands/push.js.map +1 -1
  153. package/dist/commands/redeploy.d.ts +2 -8
  154. package/dist/commands/redeploy.d.ts.map +1 -1
  155. package/dist/commands/redeploy.js +2 -2
  156. package/dist/commands/redeploy.js.map +1 -1
  157. package/dist/commands/rename.d.ts +2 -8
  158. package/dist/commands/rename.d.ts.map +1 -1
  159. package/dist/commands/rename.js +1 -1
  160. package/dist/commands/rename.js.map +1 -1
  161. package/dist/commands/reproduce.d.ts +2 -8
  162. package/dist/commands/reproduce.d.ts.map +1 -1
  163. package/dist/commands/reproduce.js +1 -1
  164. package/dist/commands/reproduce.js.map +1 -1
  165. package/dist/commands/reset-superuser.d.ts +2 -16
  166. package/dist/commands/reset-superuser.d.ts.map +1 -1
  167. package/dist/commands/reset-superuser.js +1 -1
  168. package/dist/commands/reset-superuser.js.map +1 -1
  169. package/dist/commands/restore.d.ts +7 -22
  170. package/dist/commands/restore.d.ts.map +1 -1
  171. package/dist/commands/restore.js +1 -1
  172. package/dist/commands/restore.js.map +1 -1
  173. package/dist/commands/resume.d.ts +2 -6
  174. package/dist/commands/resume.d.ts.map +1 -1
  175. package/dist/commands/resume.js +1 -1
  176. package/dist/commands/resume.js.map +1 -1
  177. package/dist/commands/rollback.d.ts +2 -8
  178. package/dist/commands/rollback.d.ts.map +1 -1
  179. package/dist/commands/rollback.js +1 -1
  180. package/dist/commands/rollback.js.map +1 -1
  181. package/dist/commands/sharing.d.ts +48 -0
  182. package/dist/commands/sharing.d.ts.map +1 -0
  183. package/dist/commands/sharing.js +85 -0
  184. package/dist/commands/sharing.js.map +1 -0
  185. package/dist/commands/status.d.ts +2 -6
  186. package/dist/commands/status.d.ts.map +1 -1
  187. package/dist/commands/status.js +1 -1
  188. package/dist/commands/status.js.map +1 -1
  189. package/dist/commands/transfers.d.ts +34 -0
  190. package/dist/commands/transfers.d.ts.map +1 -0
  191. package/dist/commands/transfers.js +62 -0
  192. package/dist/commands/transfers.js.map +1 -0
  193. package/dist/commands/unsuspend.d.ts +2 -6
  194. package/dist/commands/unsuspend.d.ts.map +1 -1
  195. package/dist/commands/unsuspend.js +1 -1
  196. package/dist/commands/unsuspend.js.map +1 -1
  197. package/dist/commands/versions.d.ts +2 -6
  198. package/dist/commands/versions.d.ts.map +1 -1
  199. package/dist/commands/versions.js +1 -1
  200. package/dist/commands/versions.js.map +1 -1
  201. package/dist/commands/wait-deploy.d.ts +2 -12
  202. package/dist/commands/wait-deploy.d.ts.map +1 -1
  203. package/dist/commands/wait-deploy.js +1 -1
  204. package/dist/commands/wait-deploy.js.map +1 -1
  205. package/dist/context.d.ts +15 -0
  206. package/dist/context.d.ts.map +1 -1
  207. package/dist/detect.d.ts +11 -0
  208. package/dist/detect.d.ts.map +1 -1
  209. package/dist/detect.js +31 -8
  210. package/dist/detect.js.map +1 -1
  211. package/dist/env-scan-source.js +1 -1
  212. package/dist/env-scan-source.js.map +1 -1
  213. package/dist/error-classifier.d.ts +17 -0
  214. package/dist/error-classifier.d.ts.map +1 -1
  215. package/dist/error-classifier.js +94 -8
  216. package/dist/error-classifier.js.map +1 -1
  217. package/dist/errors.d.ts +1 -1
  218. package/dist/errors.d.ts.map +1 -1
  219. package/dist/errors.js.map +1 -1
  220. package/dist/index.d.ts +63 -49
  221. package/dist/index.d.ts.map +1 -1
  222. package/dist/index.js +56 -42
  223. package/dist/index.js.map +1 -1
  224. package/dist/plans.d.ts +61 -5
  225. package/dist/plans.d.ts.map +1 -1
  226. package/dist/plans.js +78 -18
  227. package/dist/plans.js.map +1 -1
  228. package/dist/recovery.d.ts +60 -3
  229. package/dist/recovery.d.ts.map +1 -1
  230. package/dist/recovery.js +22 -0
  231. package/dist/recovery.js.map +1 -1
  232. package/dist/static-docker.d.ts +77 -0
  233. package/dist/static-docker.d.ts.map +1 -0
  234. package/dist/static-docker.js +105 -0
  235. package/dist/static-docker.js.map +1 -0
  236. package/dist/tarball.js +1 -1
  237. package/dist/tarball.js.map +1 -1
  238. package/dist/templates/ai-files/cursor-percher-mdc.d.ts.map +1 -1
  239. package/dist/templates/ai-files/cursor-percher-mdc.js +12 -9
  240. package/dist/templates/ai-files/cursor-percher-mdc.js.map +1 -1
  241. package/dist/templates.js +11 -11
  242. package/dist/templates.js.map +1 -1
  243. package/dist/watcher.js +1 -1
  244. package/dist/watcher.js.map +1 -1
  245. package/package.json +6 -2
@@ -0,0 +1,321 @@
1
+ import { mkdir, writeFile } from "node:fs/promises";
2
+ import { isAbsolute, join, relative, resolve } from "node:path";
3
+ import { z } from "zod";
4
+ import { recoveryAsk, recoveryNone, } from "../recovery";
5
+ import { inspectSupabase, } from "./migrate-supabase";
6
+ import { mapSupabaseToPocketBase } from "./migrate-supabase-map";
7
+ import { generateDataImportScripts } from "./migrate-supabase-scripts";
8
+ /**
9
+ * FUTURE9 Phase B chunk 2 — schema migration write step.
10
+ *
11
+ * Wires Phase A (`inspectSupabase`) + Phase B chunk 1
12
+ * (`mapSupabaseToPocketBase`) together and writes the preview files
13
+ * to a sibling directory the user can inspect before committing to
14
+ * the full migration (Phases C–D).
15
+ *
16
+ * Dry-run / apply contract (locked in STATUS_FUTURE9_phase-a.md):
17
+ * - Phase A (`inspectSupabase`) — strictly read-only, no writes.
18
+ * - Phase B (this command) — writes to ./migration-preview/ by
19
+ * default. The sibling dir IS the dry-run posture relative to
20
+ * a future `--apply` flag (Phase C/D) that will write to
21
+ * project root.
22
+ * - `outputDir` override exists for CI/tests/users who already
23
+ * have a `./migration-preview/` they care about.
24
+ *
25
+ * Token stays on the user's machine — same invariant as Phase A.
26
+ * The Supabase PAT is forwarded straight into `inspectSupabase`,
27
+ * which calls api.supabase.com directly; we never round-trip it
28
+ * through Percher's wire.
29
+ */
30
+ export const migrateSupabaseSchemaInputSchema = z.object({
31
+ projectRef: z
32
+ .string()
33
+ .min(1, "projectRef is required")
34
+ .describe("Supabase project reference (the 20-char id from the project URL — e.g. `abcdefghijklmnopqrst`)."),
35
+ token: z
36
+ .string()
37
+ .min(1, "token is required")
38
+ .describe("Supabase personal access token (sbp_...). Never leaves the user's machine — sent directly to api.supabase.com."),
39
+ outputDir: z
40
+ .string()
41
+ .optional()
42
+ .describe("Directory to write `pb_schema.json` and `MIGRATION_NOTES.md` to. Relative paths resolve against ctx.cwd. Defaults to `./migration-preview/`."),
43
+ });
44
+ export async function migrateSupabaseSchema(ctx, input) {
45
+ const outputDirAbs = resolveOutputDir(ctx.cwd, input.outputDir);
46
+ const outputDirRel = relative(ctx.cwd, outputDirAbs) || ".";
47
+ ctx.status(`Inspecting Supabase project ${input.projectRef}...`);
48
+ const inspection = await inspectSupabase(ctx, {
49
+ projectRef: input.projectRef,
50
+ token: input.token,
51
+ });
52
+ if (inspection.status === "failed") {
53
+ return {
54
+ status: "failed",
55
+ projectRef: input.projectRef,
56
+ outputDir: outputDirAbs,
57
+ filesWritten: [],
58
+ preview: null,
59
+ recovery: inspection.recovery,
60
+ summary: inspection.summary,
61
+ error: inspection.error,
62
+ };
63
+ }
64
+ ctx.status("Mapping Supabase schema → PocketBase collections...");
65
+ const preview = mapSupabaseToPocketBase(inspection);
66
+ ctx.status(`Writing preview to ${outputDirRel}/...`);
67
+ let filesWritten;
68
+ try {
69
+ filesWritten = await writePreviewFiles(ctx, outputDirAbs, preview);
70
+ }
71
+ catch (err) {
72
+ const message = err instanceof Error ? err.message : String(err);
73
+ return {
74
+ status: "failed",
75
+ projectRef: input.projectRef,
76
+ outputDir: outputDirAbs,
77
+ filesWritten: [],
78
+ preview,
79
+ recovery: recoveryAsk({
80
+ prompt: `Couldn't write the migration preview to ${outputDirRel}/: ${message}. Check the directory is writeable and re-run the same command.`,
81
+ reasonCode: "unknown",
82
+ retryable: true,
83
+ }),
84
+ summary: `Inspection succeeded; preview write to ${outputDirRel}/ failed: ${message}`,
85
+ error: {
86
+ code: "write_failed",
87
+ title: "Couldn't write migration preview",
88
+ explanation: `Writing the preview files under ${outputDirAbs} failed: ${message}.`,
89
+ suggestion: `Check the directory is writeable (or pick a different one with --output-dir). Inspection data is intact — re-run after fixing.`,
90
+ },
91
+ };
92
+ }
93
+ const summary = renderSummary({
94
+ projectRef: input.projectRef,
95
+ outputDirRel,
96
+ inspection,
97
+ preview,
98
+ });
99
+ return {
100
+ status: "ok",
101
+ projectRef: input.projectRef,
102
+ outputDir: outputDirAbs,
103
+ filesWritten,
104
+ preview,
105
+ recovery: recoveryNone(),
106
+ summary,
107
+ };
108
+ }
109
+ function resolveOutputDir(cwd, requested) {
110
+ const raw = requested ?? "./migration-preview";
111
+ return isAbsolute(raw) ? raw : resolve(cwd, raw);
112
+ }
113
+ async function writePreviewFiles(ctx, outputDir, preview) {
114
+ await mkdir(outputDir, { recursive: true });
115
+ // Pre-render every file's content in memory first, THEN write. If
116
+ // the renderer throws on a malformed input we don't leave a half-
117
+ // populated preview dir behind.
118
+ const schemaJson = renderSchemaJson(preview);
119
+ const notesMd = renderMigrationNotes(preview);
120
+ const scripts = generateDataImportScripts(preview);
121
+ const schemaPath = join(outputDir, "pb_schema.json");
122
+ const notesPath = join(outputDir, "MIGRATION_NOTES.md");
123
+ const migratePath = join(outputDir, "pb_migrate.js");
124
+ const storagePath = join(outputDir, "pb_migrate_storage.js");
125
+ await writeFile(schemaPath, schemaJson, "utf8");
126
+ await writeFile(notesPath, notesMd, "utf8");
127
+ await writeFile(migratePath, scripts.pbMigrate, "utf8");
128
+ const written = [
129
+ relative(ctx.cwd, schemaPath),
130
+ relative(ctx.cwd, notesPath),
131
+ relative(ctx.cwd, migratePath),
132
+ ];
133
+ if (scripts.pbMigrateStorage !== null) {
134
+ await writeFile(storagePath, scripts.pbMigrateStorage, "utf8");
135
+ written.push(relative(ctx.cwd, storagePath));
136
+ }
137
+ return written;
138
+ }
139
+ /**
140
+ * The schema JSON is the import-target for a future `percher data
141
+ * import-schema` command. Shape mirrors PocketBase's
142
+ * collection-create payload with Percher-internal provenance
143
+ * fields (`sourceTable`, `source.postgresType`, etc.) — the
144
+ * importer can strip those before posting to PB's admin API.
145
+ *
146
+ * Pretty-printed with 2-space indent so the file is diff-friendly
147
+ * if the user keeps it under version control.
148
+ */
149
+ function renderSchemaJson(preview) {
150
+ return `${JSON.stringify({
151
+ sourceProjectRef: preview.sourceProjectRef,
152
+ generatedAt: preview.generatedAt,
153
+ collections: preview.collections,
154
+ summary: preview.summary,
155
+ }, null, 2)}\n`;
156
+ }
157
+ /**
158
+ * Markdown report the user reads before deciding to commit. Sections
159
+ * follow the example in the FUTURE9 plan (Steg 2):
160
+ * 1. Header (projectRef, when generated, totals)
161
+ * 2. Collections — one block per mapped table
162
+ * 3. RLS policies — Supabase original + suggested PB rule (or MANUAL)
163
+ * 4. Unsupported items — every thing the mapper refused to guess at
164
+ * 5. Auth / storage notes
165
+ *
166
+ * Stable wording — tests snapshot-compare. Don't reword on a whim;
167
+ * change the test if you do.
168
+ */
169
+ export function renderMigrationNotes(preview) {
170
+ const lines = [];
171
+ lines.push("# Supabase → Percher migration preview");
172
+ lines.push("");
173
+ lines.push(`- **Source project:** \`${preview.sourceProjectRef}\``);
174
+ lines.push(`- **Generated at:** ${preview.generatedAt}`);
175
+ lines.push(`- **Collections:** ${preview.summary.collectionCount}`);
176
+ lines.push(`- **Fields:** ${preview.summary.fieldCount}`);
177
+ lines.push(`- **Relation fields:** ${preview.summary.relationFieldCount}`);
178
+ lines.push(`- **RLS policies:** ${preview.summary.rlsPolicyCount} (${preview.summary.manualRlsPolicyCount} need manual review)`);
179
+ lines.push(`- **Unsupported items:** ${preview.summary.unsupportedCount}`);
180
+ lines.push("");
181
+ lines.push("> This file is generated by `bunx percher migrate-from-supabase`. It is a **preview** — nothing has been written to your PocketBase yet. Review every section below before running the eventual import step.");
182
+ lines.push("");
183
+ lines.push("## Running the data import");
184
+ lines.push("");
185
+ lines.push("The companion `pb_migrate.js` script copies rows from your Supabase project into PocketBase. It reads credentials from env vars only — no secrets are baked into the generated source.");
186
+ lines.push("");
187
+ lines.push("```bash");
188
+ lines.push("# 1. Install the runtime deps the script imports.");
189
+ lines.push("bun add pocketbase @supabase/supabase-js");
190
+ lines.push("");
191
+ lines.push("# 2. Provide credentials (use a service-role key — never bake it into source).");
192
+ lines.push("export POCKETBASE_URL=https://<your-app>.percher.run/_/");
193
+ lines.push("export POCKETBASE_ADMIN_EMAIL=...");
194
+ lines.push("export POCKETBASE_ADMIN_PASSWORD=...");
195
+ lines.push("export SUPABASE_URL=https://<ref>.supabase.co");
196
+ lines.push("export SUPABASE_SERVICE_ROLE_KEY=...");
197
+ lines.push("");
198
+ lines.push("# 3. Dry-run posture: the script lives under ./migration-preview/.");
199
+ lines.push("# Inspect it first, then run.");
200
+ lines.push("bun ./migration-preview/pb_migrate.js");
201
+ lines.push("");
202
+ lines.push("# Optional: skip rows that already exist in PB (default is fail-fast on duplicate PK).");
203
+ lines.push("SKIP_EXISTING=1 bun ./migration-preview/pb_migrate.js");
204
+ lines.push("```");
205
+ lines.push("");
206
+ if (preview.migrationNotes.storageMigration !== null) {
207
+ lines.push("A second script — `pb_migrate_storage.js` — downloads every file in each Supabase storage bucket. The upload side is MANUAL because PocketBase's record-attached-file model doesn't map cleanly onto Supabase's bucket model; the script gives you the bytes + path and a clear hand-off comment. See the script's top docstring.");
208
+ lines.push("");
209
+ }
210
+ lines.push("## Collections");
211
+ lines.push("");
212
+ if (preview.collections.length === 0) {
213
+ lines.push("_No user-schema tables were found in the source project._");
214
+ lines.push("");
215
+ }
216
+ else {
217
+ for (const collection of preview.collections) {
218
+ lines.push(`### \`${collection.name}\``);
219
+ lines.push("");
220
+ lines.push(`- **Source table:** \`${collection.sourceTable}\``);
221
+ lines.push(`- **PocketBase type:** \`${collection.type}\``);
222
+ lines.push(`- **Fields:** ${collection.schema.length}`);
223
+ lines.push("");
224
+ if (collection.schema.length === 0) {
225
+ lines.push("_(No user-defined fields. PB built-in `id`/`created`/`updated` cover this collection.)_");
226
+ lines.push("");
227
+ }
228
+ else {
229
+ lines.push("| Field | Type | Required | Postgres source | Flag |");
230
+ lines.push("|---|---|---|---|---|");
231
+ for (const field of collection.schema) {
232
+ const target = field.type === "relation"
233
+ ? `relation → \`${field.options.collectionName}\``
234
+ : field.type;
235
+ lines.push(`| \`${field.name}\` | ${target} | ${field.required ? "yes" : "no"} | \`${field.source.postgresType}\` | ${field.source.flag ? `\`${field.source.flag}\`` : "—"} |`);
236
+ }
237
+ lines.push("");
238
+ }
239
+ lines.push("> PocketBase API rules default to `null` (most-restrictive). See the RLS section below for the original Supabase policies and suggested rewrites — paste them into PB's collection admin once you've reviewed each one.");
240
+ lines.push("");
241
+ }
242
+ }
243
+ lines.push("## RLS policies");
244
+ lines.push("");
245
+ if (preview.migrationNotes.rlsPolicies.length === 0) {
246
+ lines.push("_No row-level-security policies were found in the source project._");
247
+ lines.push("");
248
+ }
249
+ else {
250
+ for (const policy of preview.migrationNotes.rlsPolicies) {
251
+ lines.push(`### \`${policy.table}\` · policy \`${policy.policyName}\` (${policy.command})`);
252
+ lines.push("");
253
+ lines.push("**Original (Supabase Postgres):**");
254
+ lines.push("");
255
+ lines.push("```");
256
+ lines.push(`USING: ${policy.originalUsing ?? "(none)"}`);
257
+ lines.push(`WITH CHECK: ${policy.originalWithCheck ?? "(none)"}`);
258
+ lines.push("```");
259
+ lines.push("");
260
+ if (policy.manual) {
261
+ lines.push("**Suggested PocketBase API rule:** _MANUAL_");
262
+ lines.push("");
263
+ lines.push("The rewriter only recognises the canonical `auth.uid() = <column>` pattern. This policy is more complex (function calls, boolean combinators, subqueries, casts, etc.) — translate it by hand. PB API rules use a different mental model than SQL RLS: see https://pocketbase.io/docs/api-rules-and-filters/.");
264
+ }
265
+ else {
266
+ lines.push("**Suggested PocketBase API rule (verify before pasting):**");
267
+ lines.push("");
268
+ lines.push("```");
269
+ lines.push(policy.suggestedRule ?? "");
270
+ lines.push("```");
271
+ lines.push("");
272
+ lines.push("The above is a best-effort rewrite of the canonical `auth.uid() = <column>` pattern. PB rules don't have direct equivalents for SQL operators on related tables; verify against your auth model before deploying.");
273
+ }
274
+ lines.push("");
275
+ }
276
+ }
277
+ lines.push("## Unsupported / flagged items");
278
+ lines.push("");
279
+ if (preview.migrationNotes.unsupported.length === 0) {
280
+ lines.push("_Nothing flagged. The schema mapped cleanly._");
281
+ lines.push("");
282
+ }
283
+ else {
284
+ for (const item of preview.migrationNotes.unsupported) {
285
+ lines.push(`### \`${item.source}\` — ${item.kind}`);
286
+ lines.push("");
287
+ lines.push(item.reason);
288
+ lines.push("");
289
+ lines.push(`**Suggestion:** ${item.suggestion}`);
290
+ lines.push("");
291
+ }
292
+ }
293
+ if (preview.migrationNotes.authMigration) {
294
+ lines.push("## Auth migration");
295
+ lines.push("");
296
+ lines.push(`Source has **${preview.migrationNotes.authMigration.userCount}** auth user${preview.migrationNotes.authMigration.userCount === 1 ? "" : "s"}.`);
297
+ lines.push("");
298
+ lines.push(preview.migrationNotes.authMigration.note);
299
+ lines.push("");
300
+ }
301
+ if (preview.migrationNotes.storageMigration) {
302
+ lines.push("## Storage migration");
303
+ lines.push("");
304
+ lines.push(`Source has **${preview.migrationNotes.storageMigration.buckets.length}** storage bucket${preview.migrationNotes.storageMigration.buckets.length === 1 ? "" : "s"}: ${preview.migrationNotes.storageMigration.buckets.map((b) => `\`${b}\``).join(", ")}.`);
305
+ lines.push("");
306
+ lines.push(preview.migrationNotes.storageMigration.note);
307
+ lines.push("");
308
+ }
309
+ return lines.join("\n");
310
+ }
311
+ function renderSummary(args) {
312
+ const counts = args.preview.summary;
313
+ return [
314
+ `Wrote migration preview for Supabase project ${args.projectRef} to ${args.outputDirRel}/.`,
315
+ `${counts.collectionCount} collection${counts.collectionCount === 1 ? "" : "s"} (${counts.fieldCount} fields, ${counts.relationFieldCount} relations),`,
316
+ `${counts.rlsPolicyCount} RLS polic${counts.rlsPolicyCount === 1 ? "y" : "ies"} (${counts.manualRlsPolicyCount} need manual review),`,
317
+ `${counts.unsupportedCount} flagged item${counts.unsupportedCount === 1 ? "" : "s"}.`,
318
+ "Review `MIGRATION_NOTES.md` before running the import step.",
319
+ ].join(" ");
320
+ }
321
+ //# sourceMappingURL=migrate-supabase-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-supabase-schema.js","sourceRoot":"","sources":["../../src/commands/migrate-supabase-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAGL,WAAW,EACX,YAAY,GAEb,MAAM,aAAa,CAAC;AACrB,OAAO,EAGL,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAyB,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,CAAC,MAAM,CAAC;IACvD,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,wBAAwB,CAAC;SAChC,QAAQ,CACP,iGAAiG,CAClG;IACH,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,mBAAmB,CAAC;SAC3B,QAAQ,CACP,gHAAgH,CACjH;IACH,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,8IAA8I,CAC/I;CACJ,CAAC,CAAC;AAwBH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,GAAY,EACZ,KAAiC;IAEjC,MAAM,YAAY,GAAG,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAChE,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,IAAI,GAAG,CAAC;IAE5D,GAAG,CAAC,MAAM,CAAC,+BAA+B,KAAK,CAAC,UAAU,KAAK,CAAC,CAAC;IACjE,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE;QAC5C,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,KAAK,EAAE,KAAK,CAAC,KAAK;KACnB,CAAC,CAAC;IAEH,IAAI,UAAU,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,SAAS,EAAE,YAAY;YACvB,YAAY,EAAE,EAAE;YAChB,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,KAAK,EAAE,UAAU,CAAC,KAAK;SACxB,CAAC;IACJ,CAAC;IAED,GAAG,CAAC,MAAM,CAAC,qDAAqD,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAAC;IAEpD,GAAG,CAAC,MAAM,CAAC,sBAAsB,YAAY,MAAM,CAAC,CAAC;IACrD,IAAI,YAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,YAAY,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IACrE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,SAAS,EAAE,YAAY;YACvB,YAAY,EAAE,EAAE;YAChB,OAAO;YACP,QAAQ,EAAE,WAAW,CAAC;gBACpB,MAAM,EAAE,2CAA2C,YAAY,MAAM,OAAO,iEAAiE;gBAC7I,UAAU,EAAE,SAAS;gBACrB,SAAS,EAAE,IAAI;aAChB,CAAC;YACF,OAAO,EAAE,0CAA0C,YAAY,aAAa,OAAO,EAAE;YACrF,KAAK,EAAE;gBACL,IAAI,EAAE,cAAc;gBACpB,KAAK,EAAE,kCAAkC;gBACzC,WAAW,EAAE,mCAAmC,YAAY,YAAY,OAAO,GAAG;gBAClF,UAAU,EAAE,gIAAgI;aAC7I;SACF,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC;QAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,YAAY;QACZ,UAAU;QACV,OAAO;KACR,CAAC,CAAC;IAEH,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,SAAS,EAAE,YAAY;QACvB,YAAY;QACZ,OAAO;QACP,QAAQ,EAAE,YAAY,EAAE;QACxB,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW,EAAE,SAA6B;IAClE,MAAM,GAAG,GAAG,SAAS,IAAI,qBAAqB,CAAC;IAC/C,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACnD,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,GAAY,EACZ,SAAiB,EACjB,OAAyB;IAEzB,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,kEAAkE;IAClE,kEAAkE;IAClE,gCAAgC;IAChC,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAEnD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;IAE7D,MAAM,SAAS,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5C,MAAM,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAExD,MAAM,OAAO,GAAG;QACd,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC;QAC7B,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC;QAC5B,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC;KAC/B,CAAC;IAEF,IAAI,OAAO,CAAC,gBAAgB,KAAK,IAAI,EAAE,CAAC;QACtC,MAAM,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,gBAAgB,CAAC,OAAyB;IACjD,OAAO,GAAG,IAAI,CAAC,SAAS,CACtB;QACE,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,EACD,IAAI,EACJ,CAAC,CACF,IAAI,CAAC;AACR,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAyB;IAC5D,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACrD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,2BAA2B,OAAO,CAAC,gBAAgB,IAAI,CAAC,CAAC;IACpE,KAAK,CAAC,IAAI,CAAC,uBAAuB,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACzD,KAAK,CAAC,IAAI,CAAC,sBAAsB,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACpE,KAAK,CAAC,IAAI,CAAC,iBAAiB,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,CAAC,0BAA0B,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC3E,KAAK,CAAC,IAAI,CACR,uBAAuB,OAAO,CAAC,OAAO,CAAC,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,oBAAoB,sBAAsB,CACrH,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,4BAA4B,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC3E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CACR,8MAA8M,CAC/M,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IACzC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CACR,wLAAwL,CACzL,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtB,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IAChE,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IACvD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,gFAAgF,CAAC,CAAC;IAC7F,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;IACtE,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAChD,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IAC5D,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;IACjF,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAC/C,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IACpD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CACR,wFAAwF,CACzF,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;IACpE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,IAAI,OAAO,CAAC,cAAc,CAAC,gBAAgB,KAAK,IAAI,EAAE,CAAC;QACrD,KAAK,CAAC,IAAI,CACR,mUAAmU,CACpU,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;QACxE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,UAAU,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,SAAS,UAAU,CAAC,IAAI,IAAI,CAAC,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,yBAAyB,UAAU,CAAC,WAAW,IAAI,CAAC,CAAC;YAChE,KAAK,CAAC,IAAI,CAAC,4BAA4B,UAAU,CAAC,IAAI,IAAI,CAAC,CAAC;YAC5D,KAAK,CAAC,IAAI,CAAC,iBAAiB,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YACxD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnC,KAAK,CAAC,IAAI,CACR,yFAAyF,CAC1F,CAAC;gBACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;gBACnE,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;gBACpC,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;oBACtC,MAAM,MAAM,GACV,KAAK,CAAC,IAAI,KAAK,UAAU;wBACvB,CAAC,CAAC,gBAAiB,KAAK,CAAC,OAAsC,CAAC,cAAc,IAAI;wBAClF,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;oBACjB,KAAK,CAAC,IAAI,CACR,OAAO,KAAK,CAAC,IAAI,QAAQ,MAAM,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,QAAQ,KAAK,CAAC,MAAM,CAAC,YAAY,QAAQ,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CACpK,CAAC;gBACJ,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC;YACD,KAAK,CAAC,IAAI,CACR,yNAAyN,CAC1N,CAAC;YACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,IAAI,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,KAAK,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;QACjF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC;YACxD,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,KAAK,iBAAiB,MAAM,CAAC,UAAU,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;YAC5F,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClB,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,aAAa,IAAI,QAAQ,EAAE,CAAC,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,iBAAiB,IAAI,QAAQ,EAAE,CAAC,CAAC;YAClE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;gBAC1D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CACR,+SAA+S,CAChT,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;gBACzE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;gBACvC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CACR,mNAAmN,CACpN,CAAC;YACJ,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAC7C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,IAAI,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC;YACtD,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACpD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;YACjD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CACR,gBAAgB,OAAO,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,eAAe,OAAO,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAChJ,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,CAAC,cAAc,CAAC,gBAAgB,EAAE,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CACR,gBAAgB,OAAO,CAAC,cAAc,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,oBAAoB,OAAO,CAAC,cAAc,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,cAAc,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC3P,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACzD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,aAAa,CAAC,IAKtB;IACC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IACpC,OAAO;QACL,gDAAgD,IAAI,CAAC,UAAU,OAAO,IAAI,CAAC,YAAY,IAAI;QAC3F,GAAG,MAAM,CAAC,eAAe,cAAc,MAAM,CAAC,eAAe,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,UAAU,YAAY,MAAM,CAAC,kBAAkB,cAAc;QACvJ,GAAG,MAAM,CAAC,cAAc,aAAa,MAAM,CAAC,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,oBAAoB,uBAAuB;QACrI,GAAG,MAAM,CAAC,gBAAgB,gBAAgB,MAAM,CAAC,gBAAgB,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG;QACrF,6DAA6D;KAC9D,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC"}
@@ -0,0 +1,64 @@
1
+ import type { MigrationPreview } from "./migrate-supabase-map";
2
+ /**
3
+ * FUTURE9 Phase C — data-import script generator.
4
+ *
5
+ * Pure function: takes the Phase B `MigrationPreview` and emits the
6
+ * JavaScript source of two scripts the user runs to actually copy
7
+ * their data over:
8
+ *
9
+ * - `pb_migrate.js` — iterates every collection in FK-dependency
10
+ * order, batches 500 rows at a time from Supabase, and creates
11
+ * them in PocketBase. Reads credentials from env vars only —
12
+ * no secrets baked in.
13
+ * - `pb_migrate_storage.js` — (only when the source has storage
14
+ * buckets) lists + downloads files from each bucket. The upload
15
+ * side is left MANUAL because Supabase's bucket-shape doesn't
16
+ * map cleanly to PB's record-attached-file model; the script
17
+ * gives the user the bytes + path and a clear hand-off comment.
18
+ *
19
+ * Why pure: the generated JS goes through the same write-step path
20
+ * as the Phase B preview files (`pb_schema.json`,
21
+ * `MIGRATION_NOTES.md`) — see `writePreviewFiles` in
22
+ * migrate-supabase-schema.ts. Keeping the generator I/O-free means
23
+ * tests can pin the exact source byte-for-byte without disk.
24
+ *
25
+ * Safety invariants pinned by tests:
26
+ *
27
+ * - Generated scripts read credentials from env vars only. No
28
+ * hardcoded URLs, no PAT, no service-role key.
29
+ * - `pb_migrate.js` fails fast on missing env vars BEFORE making
30
+ * any network call. A misconfigured run can't half-import.
31
+ * - Table order is topologically sorted by foreign-key edges.
32
+ * Cycles are detected (Postgres allows deferred FKs; PB doesn't)
33
+ * and reported in `cyclicTables` so the user can break them
34
+ * manually instead of getting a runtime FK-violation.
35
+ * - The default behavior is fail-fast on duplicate-PK insert.
36
+ * Users opt into skip-on-conflict by setting `SKIP_EXISTING=1`
37
+ * in the env. Documented in MIGRATION_NOTES.md (separate step
38
+ * in the Phase B renderer).
39
+ */
40
+ export interface DataImportScripts {
41
+ /** `pb_migrate.js` source. Always present, even if `preview.collections` is empty (header + admin auth still useful as a smoke test). */
42
+ pbMigrate: string;
43
+ /** `pb_migrate_storage.js` source. Null when the source project has no storage buckets. */
44
+ pbMigrateStorage: string | null;
45
+ /** Collection names that participate in an FK cycle and couldn't be topologically sorted. Empty when the graph is acyclic. */
46
+ cyclicTables: string[];
47
+ /** Final order the generated script migrates collections in. Independent tables first, dependent tables after. Cyclic-set tables come last, in their original input order. */
48
+ tableOrder: string[];
49
+ }
50
+ /**
51
+ * Generate the data-import scripts for a Phase B migration preview.
52
+ * Pure — no I/O. Deterministic — identical input gives byte-identical
53
+ * scripts.
54
+ */
55
+ export declare function generateDataImportScripts(preview: MigrationPreview): DataImportScripts;
56
+ /**
57
+ * Convenience exposed for the Phase B Markdown renderer. Returns the
58
+ * env-var names the generated `pb_migrate.js` requires — kept in
59
+ * sync with `REQUIRED_ENV` inside the script by reading the same
60
+ * source-of-truth array.
61
+ */
62
+ export declare const PB_MIGRATE_REQUIRED_ENV: readonly ["POCKETBASE_URL", "POCKETBASE_ADMIN_EMAIL", "POCKETBASE_ADMIN_PASSWORD", "SUPABASE_URL", "SUPABASE_SERVICE_ROLE_KEY"];
63
+ export declare const PB_MIGRATE_OPTIONAL_ENV: readonly ["SKIP_EXISTING", "BATCH_SIZE"];
64
+ //# sourceMappingURL=migrate-supabase-scripts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-supabase-scripts.d.ts","sourceRoot":"","sources":["../../src/commands/migrate-supabase-scripts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAGjB,MAAM,wBAAwB,CAAC;AAEhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,MAAM,WAAW,iBAAiB;IAChC,yIAAyI;IACzI,SAAS,EAAE,MAAM,CAAC;IAClB,2FAA2F;IAC3F,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,8HAA8H;IAC9H,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,8KAA8K;IAC9K,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,gBAAgB,GAAG,iBAAiB,CAqBtF;AAklBD;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,iIAM1B,CAAC;AAEX,eAAO,MAAM,uBAAuB,0CAA2C,CAAC"}