better-supabase 0.2.0 → 0.4.0

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 (190) hide show
  1. package/README.md +37 -33
  2. package/dist/base64-D2gsioCY.js +42 -0
  3. package/dist/claims-BAf6c7is.js +48 -0
  4. package/dist/cli/_format-Cax5EsM9.js +101 -0
  5. package/dist/cli/bin.js +39 -6
  6. package/dist/cli/command-CK14fP91.js +502 -0
  7. package/dist/cli/compare-BmIWVEui.js +9 -0
  8. package/dist/cli/config-D9R0o1LH.js +1895 -0
  9. package/dist/cli/config-SSKSTUl2.js +2 -0
  10. package/dist/cli/db-DOBPt660.js +52 -0
  11. package/dist/cli/dist-B1MvLv-M.js +129 -0
  12. package/dist/cli/dist-CFgGknmZ.js +1112 -0
  13. package/dist/cli/dist-Du7VnEUG.js +621 -0
  14. package/dist/cli/doctor-BOym3mbL.js +2382 -0
  15. package/dist/cli/env-BZ0uy8XK.js +108 -0
  16. package/dist/cli/env-jIFUADLY.js +511 -0
  17. package/dist/cli/errors-4v4DTtda.js +56 -0
  18. package/dist/cli/fastest-levenshtein-CFN-lNDv.js +120 -0
  19. package/dist/cli/gen-Ccn_p90L.js +2008 -0
  20. package/dist/cli/gen-D5cLCULx.js +2 -0
  21. package/dist/cli/index.d.ts +295 -28
  22. package/dist/cli/index.js +184 -3
  23. package/dist/cli/init-ClnxRYBF.js +550 -0
  24. package/dist/cli/introspect-DxqfkVIv.js +81 -0
  25. package/dist/cli/io-k41_z-jT.js +24 -0
  26. package/dist/cli/json5-ChRycquj.js +787 -0
  27. package/dist/cli/jsonc-BUniUpOk.js +2 -0
  28. package/dist/cli/jsonc-D5Fu67jw.js +45 -0
  29. package/dist/cli/keys-ByKHnvP9.js +83 -0
  30. package/dist/cli/ohash-D7bG_EOb.js +277 -0
  31. package/dist/cli/openapi-8WHjxiTJ.js +66 -0
  32. package/dist/cli/project-B_GeXyHh.js +70 -0
  33. package/dist/cli/prompts-BNcNfAve.js +1142 -0
  34. package/dist/cli/prompts-BTYQGunc.js +2 -0
  35. package/dist/cli/read-sets-CMa29t9a.js +971 -0
  36. package/dist/cli/rolldown-runtime-BPOCksWG.js +24 -0
  37. package/dist/cli/run-CP20LKk_.js +347 -0
  38. package/dist/cli/seed-5J6eu_Xg.js +98 -0
  39. package/dist/cli/skills-LJJIhLFR.js +137 -0
  40. package/dist/cli/sql-D4VbqmXi.js +199 -0
  41. package/dist/cli/style-C0NFdJRL.js +29 -0
  42. package/dist/cli/toml-DB-MNnFs.js +424 -0
  43. package/dist/{version-Cqq1m3UY.js → cli/version-5mW_8sY1.js} +1 -1
  44. package/dist/cli/yaml-CYCbJ6et.js +2252 -0
  45. package/dist/client/index.d.ts +2 -2
  46. package/dist/client/index.js +15 -25
  47. package/dist/{compiler-CZ9nIuqy.d.ts → compiler-DB3aSFOA.d.ts} +2 -2
  48. package/dist/config/index.d.ts +4 -3
  49. package/dist/config/index.js +5 -3
  50. package/dist/config-BpxDfnbg.js +129 -0
  51. package/dist/{index-DOsjFvMf.d.ts → config-C1CYcm6o.d.ts} +49 -49
  52. package/dist/{config-ClDXmVtY.js → config-CbvFmGD8.js} +14 -137
  53. package/dist/{define-BXMYD9AY.js → define-Bh0AqTik.js} +221 -120
  54. package/dist/{define-e3zI4_4g.d.ts → define-CRS2MRV3.d.ts} +36 -31
  55. package/dist/edge/index.d.ts +9 -13
  56. package/dist/edge/index.js +51 -25
  57. package/dist/{entitlements-Dng-ctuT.d.ts → entitlements-Dm-FHpNH.d.ts} +2 -2
  58. package/dist/env/index.js +203 -1
  59. package/dist/{errors-Bl3rkOzo.js → errors-L0xK41y_.js} +1 -1
  60. package/dist/events/index.d.ts +1 -1
  61. package/dist/events/index.js +139 -1
  62. package/dist/{events-DOt3nSO-.d.ts → events-B21UOhvP.d.ts} +4 -4
  63. package/dist/{executor-CGdNQ27g.d.ts → executor-B5IoUxLE.d.ts} +2 -2
  64. package/dist/{executor-DeppvirK.js → executor-CVt6dD0B.js} +9 -4
  65. package/dist/{executor-BYXQ9AGn.d.ts → executor-CZ7ImRiD.d.ts} +2 -2
  66. package/dist/hono/index.d.ts +17 -24
  67. package/dist/hono/index.js +11 -11
  68. package/dist/{index-DuP14VHo.d.ts → index-528Ugmyp.d.ts} +30 -10
  69. package/dist/{index-Bw1bwtC0.d.ts → index-BAy4tsAP.d.ts} +28 -15
  70. package/dist/{index-CBDufH1M.d.ts → index-BBdvo-5d.d.ts} +24 -26
  71. package/dist/{index-DbxFr7XG.d.ts → index-BhHEC04r.d.ts} +9 -4
  72. package/dist/index-Cf-D2jk1.d.ts +50 -0
  73. package/dist/{index-Ciu5Xlml.d.ts → index-D5IfUIDh.d.ts} +6 -5
  74. package/dist/{index-K-3WM2Hp.d.ts → index-DFmOpBGC.d.ts} +13 -13
  75. package/dist/{index-D4v7sncu.d.ts → index-RlLXd8dL.d.ts} +13 -13
  76. package/dist/index.d.ts +17 -17
  77. package/dist/index.js +23 -14
  78. package/dist/{invalidate-DbxuL2jL.js → invalidate-CgxmRamI.js} +7 -1
  79. package/dist/jobs/index.d.ts +33 -26
  80. package/dist/jobs/index.js +44 -22
  81. package/dist/{json-schema-BpYqkCKf.js → json-schema-DP6V7cbr.js} +8 -3
  82. package/dist/lint/index.js +1 -1
  83. package/dist/list/index.d.ts +2 -2
  84. package/dist/list/index.js +131 -96
  85. package/dist/{live-DJyZMD6w.d.ts → live-BHakSWWo.d.ts} +26 -16
  86. package/dist/{live-D8rV1Ldw.js → live-CdJBOc4f.js} +13 -9
  87. package/dist/lookup-BaP5bI27.js +18 -0
  88. package/dist/mcp/index.d.ts +34 -27
  89. package/dist/mcp/index.js +59 -25
  90. package/dist/{mfa-TVia554c.d.ts → mfa-C7MNQ1Ob.d.ts} +1 -1
  91. package/dist/{mfa-CpLfJSde.js → mfa-byfjruR9.js} +190 -46
  92. package/dist/next/image/index.js +6 -3
  93. package/dist/next/index.d.ts +64 -48
  94. package/dist/next/index.js +63 -50
  95. package/dist/openapi/index.d.ts +1 -1
  96. package/dist/openapi/index.js +61 -38
  97. package/dist/orpc/index.d.ts +18 -21
  98. package/dist/orpc/index.js +12 -12
  99. package/dist/otel/index.d.ts +5 -5
  100. package/dist/otel/index.js +84 -63
  101. package/dist/{permdock-sql-CghlHPuH.js → permdock-sql-C4KFzLc9.js} +12 -7
  102. package/dist/permdock-sql-DImJULY-.d.ts +17 -0
  103. package/dist/{plugin-C4TR9J0Z.d.ts → plugin-bNhvJwRh.d.ts} +5 -4
  104. package/dist/plugins/actor/index.d.ts +1 -1
  105. package/dist/plugins/actor/index.js +1 -1
  106. package/dist/plugins/rules/index.d.ts +2 -2
  107. package/dist/plugins/rules/index.js +46 -16
  108. package/dist/plugins/soft-delete/index.d.ts +3 -3
  109. package/dist/plugins/soft-delete/index.js +4 -4
  110. package/dist/plugins/tenant/index.d.ts +3 -3
  111. package/dist/plugins/tenant/index.js +10 -4
  112. package/dist/plugins/timestamps/index.d.ts +1 -1
  113. package/dist/plugins/timestamps/index.js +2 -2
  114. package/dist/plugins/validation/index.d.ts +2 -2
  115. package/dist/plugins/validation/index.js +3 -3
  116. package/dist/pool-DFwEQwmN.d.ts +78 -0
  117. package/dist/postgres/index.d.ts +10 -5
  118. package/dist/postgres/index.js +37 -16
  119. package/dist/{postgrest-cAEQ_IQN.d.ts → postgrest-Bc-0Xw62.d.ts} +1 -1
  120. package/dist/{problem-BTkTtRV9.js → problem-BihjPR0t.js} +11 -5
  121. package/dist/{problem-DlgB0lYl.d.ts → problem-U8UEKccv.d.ts} +6 -4
  122. package/dist/query/index.d.ts +2 -2
  123. package/dist/query/index.js +2 -2
  124. package/dist/{query-ChvDbsDE.js → query-BMMSWbI7.js} +19 -19
  125. package/dist/react/index.d.ts +7 -7
  126. package/dist/react/index.js +2 -2
  127. package/dist/react/server.d.ts +6 -6
  128. package/dist/react/server.js +3 -3
  129. package/dist/react/session.d.ts +21 -2
  130. package/dist/react/session.js +19 -1
  131. package/dist/{react-C83BdBGt.js → react-CQHMaESR.js} +59 -55
  132. package/dist/{read-set-4lI3W_gZ.js → read-set-FWK8qQ58.js} +51 -16
  133. package/dist/realtime/index.d.ts +4 -3
  134. package/dist/realtime/index.js +19 -17
  135. package/dist/{index-CG69s15v.d.ts → refresh-BwYkyNOQ.d.ts} +7 -3
  136. package/dist/{resolve-CjHILk2w.d.ts → resolve-BAqQcwMW.d.ts} +17 -11
  137. package/dist/{resource-CgZa3YG_.d.ts → resource-BJcaIfxi.d.ts} +17 -8
  138. package/dist/{resource-BHEWmQJK.js → resource-My_y-Syh.js} +43 -21
  139. package/dist/{respond-Dne1ARSa.d.ts → respond-DgIbdrt8.d.ts} +39 -14
  140. package/dist/{result-DWXatkd6.js → result-Bj6yt33D.js} +2 -2
  141. package/dist/{result-CTkCZ6JA.d.ts → result-CqEsbgYs.d.ts} +16 -11
  142. package/dist/server/index.d.ts +38 -13
  143. package/dist/server/index.js +43 -14
  144. package/dist/{respond-DMcbQwfN.js → server-BA75B0mT.js} +151 -96
  145. package/dist/{shared-_6-uPL7E.js → shared-DnoCdMDr.js} +4 -3
  146. package/dist/{simplify-bwJpLnaS.js → simplify-Cqvfr9dj.js} +76 -39
  147. package/dist/sql/index.d.ts +139 -0
  148. package/dist/sql/index.js +1983 -0
  149. package/dist/{sql-DTjA1LPj.js → sql-B34HU2DI.js} +74 -17
  150. package/dist/ssr/index.d.ts +4 -4
  151. package/dist/ssr/index.js +2 -2
  152. package/dist/{standard-FUi3Z3-7.js → standard-BRyBGTtp.js} +2 -2
  153. package/dist/{standard-CyhRzctb.d.ts → standard-BsaCYQJc.d.ts} +1 -1
  154. package/dist/{stats-C5W-rBfR.js → stats-C_YxA2r1.js} +40 -14
  155. package/dist/storage/index.d.ts +4 -3
  156. package/dist/storage/index.js +548 -1
  157. package/dist/{tables-rZxRxNPW.js → tables-Cb-3_VWc.js} +19 -5
  158. package/dist/temporal-BwshQk0W.js +27 -0
  159. package/dist/temporal-required-CBNHT6ni.js +19 -0
  160. package/dist/testing/index.d.ts +25 -24
  161. package/dist/testing/index.js +165 -66
  162. package/dist/{types-C83v5SQz.d.ts → types-DONv9SHN.d.ts} +14 -11
  163. package/dist/version-Bmf7_FzM.js +4 -0
  164. package/dist/{view-D1s0wa0T.d.ts → view-B64o81wp.d.ts} +36 -6
  165. package/dist/{view-aOYizTeE.js → view-BrJI2LKp.js} +11 -2
  166. package/dist/webhooks/index.d.ts +19 -17
  167. package/dist/webhooks/index.js +1 -1
  168. package/dist/{webhooks-DMipjhSP.js → webhooks-Bh_Jf_-l.js} +45 -24
  169. package/package.json +50 -22
  170. package/schemas/config-v1.json +31 -1
  171. package/schemas/doctor-report-v1.json +17 -1
  172. package/schemas/snapshot-v2.json +35 -0
  173. package/skills/better-supabase/SKILL.md +77 -18
  174. package/skills/better-supabase/references/plugins.md +21 -22
  175. package/skills/better-supabase/references/troubleshooting.md +38 -18
  176. package/skills/better-supabase-api/SKILL.md +66 -18
  177. package/skills/better-supabase-api/references/adapters.md +64 -41
  178. package/skills/better-supabase-auth/SKILL.md +146 -0
  179. package/skills/better-supabase-auth/references/permdock.md +55 -0
  180. package/skills/better-supabase-testing/SKILL.md +68 -11
  181. package/dist/casing-da0uRTqt.js +0 -14
  182. package/dist/claims-CoTobNC-.js +0 -25
  183. package/dist/cli-DrSgDOQC.js +0 -6646
  184. package/dist/env-BEToab0I.js +0 -204
  185. package/dist/events-BuzTgn2D.js +0 -135
  186. package/dist/pool-R2m_DkXi.d.ts +0 -37
  187. package/dist/seed-CzecODcJ.js +0 -101
  188. package/dist/session-C3LxnQ0e.d.ts +0 -22
  189. package/dist/session-CqEwzVup.js +0 -20
  190. package/dist/storage-DuGn38fr.js +0 -527
@@ -0,0 +1,2 @@
1
+ import { n as genCommand } from "./gen-Ccn_p90L.js";
2
+ export { genCommand };
@@ -1,20 +1,134 @@
1
- import { $ as ExtrasFunction, B as Catalog, G as CatalogFunction, H as CatalogColumn, J as CatalogIndex, K as CatalogFunctionArg, Q as CatalogUnique, U as CatalogEnum, V as CatalogCheck, W as CatalogForeignKey, X as CatalogTable, Y as CatalogPolicy, Z as CatalogTrigger, at as SnapshotBucket, ct as Queryable, et as ExtrasHook, it as Snapshot, nt as ExtrasTable, ot as SnapshotExtras, q as CatalogGrant, rt as ForeignKeyAction, st as GeneratorMetadata, tt as ExtrasHookFunction, u as GeneratedFile, y as ResolvedConfig } from "../index-DOsjFvMf.js";
2
- import { A as SchemaMeta, P as TableMeta, T as RelationMeta, a as Casing, c as Codec, m as FunctionMeta } from "../types-C83v5SQz.js";
3
- //#region src/cli/args.d.ts
4
- type FlagValue = string | boolean | readonly string[];
5
- interface ParsedArgs {
6
- readonly command: string | undefined;
7
- readonly rest: readonly string[];
8
- readonly flags: Readonly<Record<string, FlagValue>>;
1
+ import { styleText } from "node:util";
2
+ import { Catalog, CatalogCheck, CatalogColumn, CatalogColumnGrant, CatalogEnum, CatalogForeignKey, CatalogFunction, CatalogFunctionArg, CatalogGrant, CatalogIndex, CatalogPolicy, CatalogTable, CatalogTrigger, CatalogUnique, ExtrasFunction, ExtrasHook, ExtrasHookFunction, ExtrasTable, ForeignKeyAction, GeneratedFile, GeneratorMetadata, ResolvedConfig, Snapshot, SnapshotBucket, SnapshotExtras } from "better-supabase/config";
3
+ import { Casing, Codec, FunctionMeta, RelationMeta, SchemaMeta, TableMeta } from "better-supabase";
4
+ import { GeneratorMetadata as GeneratorMetadata$1, Queryable } from "@supabase/postgrest-typegen";
5
+ //#region ../../node_modules/.pnpm/citty@0.2.2/node_modules/citty/dist/index.d.mts
6
+ //#region src/types.d.ts
7
+ type ArgType = "boolean" | "string" | "enum" | "positional" | undefined;
8
+ type _ArgDef<T extends ArgType, VT extends boolean | number | string> = {
9
+ type?: T;
10
+ description?: string;
11
+ valueHint?: string;
12
+ alias?: string | string[];
13
+ default?: VT;
14
+ required?: boolean;
15
+ options?: string[];
16
+ };
17
+ type BooleanArgDef = Omit<_ArgDef<"boolean", boolean>, "options"> & {
18
+ negativeDescription?: string;
19
+ };
20
+ type StringArgDef = Omit<_ArgDef<"string", string>, "options">;
21
+ type EnumArgDef = _ArgDef<"enum", string>;
22
+ type PositionalArgDef = Omit<_ArgDef<"positional", string>, "alias" | "options">;
23
+ type ArgDef = BooleanArgDef | StringArgDef | PositionalArgDef | EnumArgDef;
24
+ type ArgsDef = Record<string, ArgDef>;
25
+ type ResolveParsedArgType<T extends ArgDef, VT> = T extends {
26
+ default?: any;
27
+ required?: boolean;
28
+ } ? T["default"] extends NonNullable<VT> ? VT : T["required"] extends true ? VT : VT | undefined : VT | undefined;
29
+ type ParsedPositionalArg<T extends ArgDef> = T extends {
30
+ type: "positional";
31
+ } ? ResolveParsedArgType<T, string> : never;
32
+ type ParsedStringArg<T extends ArgDef> = T extends {
33
+ type: "string";
34
+ } ? ResolveParsedArgType<T, string> : never;
35
+ type ParsedBooleanArg<T extends ArgDef> = T extends {
36
+ type: "boolean";
37
+ } ? ResolveParsedArgType<T, boolean> : never;
38
+ type ParsedEnumArg<T extends ArgDef> = T extends {
39
+ type: "enum";
40
+ options: infer U;
41
+ } ? U extends Array<any> ? ResolveParsedArgType<T, U[number]> : never : never;
42
+ type RawArgs = {
43
+ _: string[];
44
+ };
45
+ type ParsedArg<T extends ArgDef> = T["type"] extends "positional" ? ParsedPositionalArg<T> : T["type"] extends "boolean" ? ParsedBooleanArg<T> : T["type"] extends "string" ? ParsedStringArg<T> : T["type"] extends "enum" ? ParsedEnumArg<T> : never;
46
+ type ParsedArgs$1<T extends ArgsDef = ArgsDef> = RawArgs & { [K in keyof T]: ParsedArg<T[K]>; } & { [K in keyof T as T[K] extends {
47
+ alias: string;
48
+ } ? T[K]["alias"] : never]: ParsedArg<T[K]>; } & { [K in keyof T as T[K] extends {
49
+ alias: string[];
50
+ } ? T[K]["alias"][number] : never]: ParsedArg<T[K]>; } & Record<string, string | number | boolean | string[]>;
51
+ interface CommandMeta {
52
+ name?: string;
53
+ version?: string;
54
+ description?: string;
55
+ hidden?: boolean;
56
+ alias?: string | string[];
57
+ }
58
+ type SubCommandsDef = Record<string, Resolvable<CommandDef<any>>>;
59
+ type CommandDef<T extends ArgsDef = ArgsDef> = {
60
+ meta?: Resolvable<CommandMeta>;
61
+ args?: Resolvable<T>;
62
+ default?: Resolvable<string>;
63
+ subCommands?: Resolvable<SubCommandsDef>;
64
+ plugins?: Resolvable<CittyPlugin>[];
65
+ setup?: (context: CommandContext$1<T>) => any | Promise<any>;
66
+ cleanup?: (context: CommandContext$1<T>) => any | Promise<any>;
67
+ run?: (context: CommandContext$1<T>) => any | Promise<any>;
68
+ };
69
+ type CommandContext$1<T extends ArgsDef = ArgsDef> = {
70
+ rawArgs: string[];
71
+ args: ParsedArgs$1<T>;
72
+ cmd: CommandDef<T>;
73
+ subCommand?: CommandDef<T>;
74
+ data?: any;
75
+ };
76
+ type CittyPlugin = {
77
+ name: string;
78
+ setup?(context: CommandContext$1<any>): void | Promise<void>;
79
+ cleanup?(context: CommandContext$1<any>): void | Promise<void>;
80
+ };
81
+ type Resolvable<T> = T | Promise<T> | (() => T) | (() => Promise<T>);
82
+ //#endregion
83
+ //#region src/cli/env.d.ts
84
+ /** The environment variables the CLI reads, validated once per run. */
85
+ interface CliEnv {
86
+ /** Postgres connection string for gen, introspect, doctor and seed. */
87
+ readonly DATABASE_URL?: string | undefined;
88
+ /** Personal access token for reading a hosted project. */
89
+ readonly SUPABASE_ACCESS_TOKEN?: string | undefined;
90
+ /** Management API base URL; defaults to https://api.supabase.com. */
91
+ readonly SUPABASE_API_URL?: string | undefined;
92
+ /** The Supabase CLI to run instead of `supabase` on the PATH. */
93
+ readonly SUPABASE_BIN?: string | undefined;
94
+ /** Home directory for `skills install --global`. */
95
+ readonly HOME?: string | undefined;
96
+ /** Set in CI; prompts never run there. */
97
+ readonly CI?: string | undefined;
98
+ }
99
+ //#endregion
100
+ //#region src/cli/prompts.d.ts
101
+ interface Choice<T extends string> {
102
+ readonly value: T;
103
+ readonly label: string;
104
+ readonly hint?: string;
105
+ }
106
+ /**
107
+ * Questions and progress for a person at a terminal. `run()` only gets one
108
+ * from the bin on a TTY outside CI; every method resolves `undefined` when the
109
+ * person cancels.
110
+ */
111
+ interface Prompter {
112
+ readonly select: <T extends string>(message: string, choices: readonly Choice<T>[], initial: T) => Promise<T | undefined>;
113
+ readonly multiselect: <T extends string>(message: string, choices: readonly Choice<T>[], initial: readonly T[]) => Promise<T[] | undefined>;
114
+ readonly confirm: (message: string) => Promise<boolean | undefined>;
115
+ /** Shows `message` with a spinner until the returned function is called. */
116
+ readonly spinner: (message: string) => () => void;
9
117
  }
10
118
  //#endregion
11
119
  //#region src/cli/io.d.ts
12
120
  interface CliIo {
13
121
  readonly stdout: (text: string) => void;
14
122
  readonly stderr: (text: string) => void;
15
- readonly now?: () => Date;
16
- /** Environment; defaults to `process.env`. */
17
- readonly env?: Readonly<Record<string, string | undefined>>;
123
+ /** All of stdin, for the `--*-stdin` flags that keep secrets out of arguments. */
124
+ readonly stdin?: () => Promise<string>;
125
+ /** Color the output with ANSI escapes. Off unless set. */
126
+ readonly color?: boolean;
127
+ /**
128
+ * Prompts and spinners for a person at a terminal. `run()` drops them in
129
+ * CI and under `--json` or `--yes`, and without them commands never ask.
130
+ */
131
+ readonly prompts?: Prompter;
18
132
  }
19
133
  interface RunResult {
20
134
  readonly code: number;
@@ -25,11 +139,70 @@ interface CommandResult {
25
139
  readonly code: number;
26
140
  readonly output?: string;
27
141
  readonly error?: string;
142
+ /** The JSON document `--json` prints instead of `output`. */
143
+ readonly data?: unknown;
28
144
  }
29
145
  //#endregion
30
- //#region src/cli/run.d.ts
31
- export declare const HELP: string;
32
- type Command = (context: CommandContext) => Promise<CommandResult>;
146
+ //#region src/cli/command.d.ts
147
+ /** What `run()` hands every command next to its parsed arguments. */
148
+ interface CliContext {
149
+ readonly cwd: string;
150
+ readonly config: ResolvedConfig;
151
+ /** `prompts` is unset in CI and under `--json` or `--yes`. */
152
+ readonly io: CliIo;
153
+ readonly env: CliEnv;
154
+ /** `--json`: return `data`, which `run()` prints as the one JSON document. */
155
+ readonly json: boolean;
156
+ readonly signal: AbortSignal | undefined;
157
+ }
158
+ /** Options every command accepts; `run()` reads them before the command starts. */
159
+ declare const GLOBAL_ARGS: {
160
+ readonly cwd: {
161
+ readonly type: "string";
162
+ readonly description: "Project directory";
163
+ readonly valueHint: "dir";
164
+ };
165
+ readonly config: {
166
+ readonly type: "string";
167
+ readonly description: "Config file, relative to --cwd";
168
+ readonly valueHint: "file";
169
+ };
170
+ readonly json: {
171
+ readonly type: "boolean";
172
+ readonly description: "Print one JSON document on stdout; errors as Problem Details";
173
+ };
174
+ readonly yes: {
175
+ readonly type: "boolean";
176
+ readonly alias: "y";
177
+ readonly description: "Ask nothing; use the flags and the defaults";
178
+ };
179
+ };
180
+ type CliArgs<T extends ArgsDef> = ParsedArgs$1<T & typeof GLOBAL_ARGS>;
181
+ interface CliCommandDef<T extends ArgsDef> {
182
+ readonly meta: CommandMeta & {
183
+ readonly name: string;
184
+ };
185
+ readonly args: T;
186
+ /** String options that take a list: comma-separated, repeated, or both. */
187
+ readonly lists?: readonly (keyof T & string)[];
188
+ readonly run: (args: CliArgs<T>, context: CliContext) => Promise<CommandResult>;
189
+ }
190
+ /** Any citty command, whatever its arguments. */
191
+ type AnyCommand = Exclude<SubCommandsDef[string], Promise<unknown> | (() => unknown)>;
192
+ /** A citty command that receives the `CliContext` and returns a `CommandResult`. */
193
+ export declare function defineCliCommand<const T extends ArgsDef>(def: CliCommandDef<T>): AnyCommand;
194
+ /** Splits a comma-separated option into its trimmed, non-empty parts. */
195
+ export declare function list(value: string | undefined): string[];
196
+ //#endregion
197
+ //#region src/cli/legacy.d.ts
198
+ type FlagValue = string | boolean | readonly string[];
199
+ /** The arguments of a `(context) => CommandResult` command, parsed the 0.2 way. */
200
+ interface ParsedArgs {
201
+ readonly command: string | undefined;
202
+ readonly rest: readonly string[];
203
+ readonly flags: Readonly<Record<string, FlagValue>>;
204
+ }
205
+ /** What a `(context) => CommandResult` command receives. */
33
206
  interface CommandContext {
34
207
  readonly args: ParsedArgs;
35
208
  readonly cwd: string;
@@ -38,16 +211,93 @@ interface CommandContext {
38
211
  readonly env: Readonly<Record<string, string | undefined>>;
39
212
  readonly signal: AbortSignal | undefined;
40
213
  }
41
- /** Registers a command; the built-in commands register themselves below. */
214
+ /** The command shape before 0.3; `registerCommand` still accepts it, deprecated. */
215
+ type Command = (context: CommandContext) => Promise<CommandResult>;
216
+ //#endregion
217
+ //#region src/cli/run.d.ts
218
+ /** Registers a citty command; `defineCliCommand` gives it the `CliContext`. */
219
+ export declare function registerCommand(name: string, command: AnyCommand): void;
220
+ /** @deprecated Pass a citty `CommandDef` from `defineCliCommand` instead. */
42
221
  export declare function registerCommand(name: string, command: Command, help?: string): void;
222
+ /** The usage text for the CLI, or for one command; plain unless `color` is set. */
223
+ export declare function help(command?: string, color?: boolean): Promise<string>;
43
224
  interface RunOptions {
225
+ /** Directory `--cwd` is relative to. */
44
226
  readonly cwd?: string;
227
+ /** Environment variables. Empty unless passed; the bin passes `process.env`. */
228
+ readonly env?: Readonly<Record<string, string | undefined>>;
45
229
  readonly io?: CliIo;
46
230
  readonly signal?: AbortSignal;
47
231
  }
232
+ /** The names `run()` dispatches, registered commands included. */
233
+ export declare function commandNames(): string[];
48
234
  /** Runs the CLI. Never exits the process; returns the exit code and output. */
49
235
  export declare function run(argv: readonly string[], options?: RunOptions): Promise<RunResult>;
50
236
  //#endregion
237
+ //#region src/cli/errors.d.ts
238
+ /** `1` for a failure, `2` for a usage error the caller can fix by changing the command. */
239
+ type ExitCode = 1 | 2;
240
+ type CliErrorCode = "usage" | "unknown_command" | "missing_value" | "config_not_found" | "config_invalid" | "env_invalid" | "failed" | "internal";
241
+ /** Each code has a heading on this page, so `type` links to its explanation. */
242
+ export declare const CLI_ERRORS_URL = "https://bettersupabase.com/docs/cli/errors";
243
+ /** RFC 9457 Problem Details for a CLI error. `--json` prints it on stdout. */
244
+ interface CliProblem {
245
+ readonly type: string;
246
+ readonly title: string;
247
+ readonly detail: string;
248
+ readonly code: CliErrorCode;
249
+ readonly exitCode: number;
250
+ /** The closest command, for `unknown_command`. */
251
+ readonly suggestion?: string;
252
+ /** The flag that supplies the value, for `missing_value`. */
253
+ readonly flag?: string;
254
+ /** One line per problem, for `config_invalid` and `env_invalid`. */
255
+ readonly issues?: readonly string[];
256
+ }
257
+ type CliProblemExtensions = Pick<CliProblem, "suggestion" | "flag" | "issues">;
258
+ interface CliErrorOptions extends CliProblemExtensions {
259
+ readonly exitCode?: number;
260
+ readonly cause?: unknown;
261
+ }
262
+ /** An error the CLI reports as text, or as Problem Details under `--json`. */
263
+ export declare class CliError extends Error {
264
+ override readonly name = "CliError";
265
+ readonly code: CliErrorCode;
266
+ readonly exitCode: number;
267
+ readonly problem: CliProblem;
268
+ constructor(code: CliErrorCode, message: string, options?: CliErrorOptions);
269
+ }
270
+ //#endregion
271
+ //#region src/cli/style.d.ts
272
+ type Format = Parameters<typeof styleText>[0];
273
+ /** Styles text, or returns it unchanged when colors are off. */
274
+ type Paint = (format: Format, text: string) => string;
275
+ //#endregion
276
+ //#region src/cli/db.d.ts
277
+ /** The subset of `pg.Client` the CLI uses. */
278
+ interface PgQueryable {
279
+ query<R = Record<string, unknown>>(text: string, values?: readonly unknown[]): Promise<{
280
+ rows: R[];
281
+ }>;
282
+ }
283
+ interface ConnectOptions {
284
+ /** Opens a pool of this many connections, for callers that query concurrently. */
285
+ readonly pool?: number;
286
+ /** Server-side limit for each statement, in milliseconds. */
287
+ readonly statementTimeout?: number;
288
+ /** Ends the connection when aborted, so Ctrl-C stops a running query. */
289
+ readonly signal?: AbortSignal;
290
+ }
291
+ /** A connection that queues its queries, or a pool that runs them concurrently. */
292
+ interface PgConnection {
293
+ readonly client: PgQueryable;
294
+ readonly pooled?: boolean;
295
+ close: () => Promise<void>;
296
+ describe: string;
297
+ }
298
+ /** Opens a `pg` connection. `pg` is an optional peer, loaded on demand. */
299
+ declare function connect(url: string, load?: () => Promise<unknown>, options?: ConnectOptions): Promise<PgConnection>;
300
+ //#endregion
51
301
  //#region src/cli/introspect/source.d.ts
52
302
  /** A connection introspection can query, plus how to release it. */
53
303
  interface IntrospectionSource {
@@ -56,16 +306,19 @@ interface IntrospectionSource {
56
306
  close(): Promise<void>;
57
307
  }
58
308
  /**
59
- * A `pg` connection. Typegen issues its queries concurrently; one `pg.Client`
60
- * must run them one at a time, so calls are queued.
309
+ * A small `pg` pool, since introspection issues its queries concurrently. A
310
+ * `connect` that returns a single client gets its queries queued, because one
311
+ * `pg.Client` runs them one at a time.
61
312
  */
62
- export declare function pgSource(url: string): Promise<IntrospectionSource>;
313
+ export declare function pgSource(url: string, open?: typeof connect, signal?: AbortSignal): Promise<IntrospectionSource>;
63
314
  interface ManagementSourceOptions {
64
315
  readonly projectRef: string;
65
316
  readonly accessToken: string;
66
317
  /** Defaults to `https://api.supabase.com`. */
67
318
  readonly apiUrl?: string;
68
319
  readonly fetch?: typeof fetch;
320
+ /** Cancels in-flight queries (Ctrl-C). */
321
+ readonly signal?: AbortSignal;
69
322
  }
70
323
  /**
71
324
  * Runs introspection SQL through the Supabase Management API as the
@@ -80,19 +333,29 @@ interface SnapshotSource {
80
333
  readonly projectRef?: string;
81
334
  /** Ignore `source.snapshot` and read the database. */
82
335
  readonly live?: boolean;
336
+ /** Ends the database connection or Management API request (Ctrl-C). */
337
+ readonly signal?: AbortSignal;
338
+ /** Reuses the snapshot cached for an unchanged catalog fingerprint. */
339
+ readonly cache?: boolean;
83
340
  }
84
- type Env = Readonly<Record<string, string | undefined>>;
85
- /** Loads a saved snapshot or introspects the database. */
86
- export declare function loadSnapshot(config: ResolvedConfig, env: Env, source: SnapshotSource): Promise<Snapshot>;
341
+ type Env = CliEnv;
342
+ /**
343
+ * Loads a saved snapshot or introspects the database. With `shared`, it
344
+ * introspects over that source and leaves closing it to the caller, so later
345
+ * queries reuse the connection.
346
+ */
347
+ export declare function loadSnapshot(config: ResolvedConfig, env: Env, source: SnapshotSource, open?: typeof connect, shared?: () => Promise<IntrospectionSource>): Promise<Snapshot>;
87
348
  /** Validates a parsed snapshot document. */
88
- export declare function parseSnapshot(data: unknown, label?: string): Snapshot;
349
+ export declare function parseSnapshot(data: unknown, label?: string): Promise<Snapshot>;
89
350
  export declare function serializeSnapshot(snapshot: Snapshot): string;
90
351
  //#endregion
91
352
  //#region src/cli/commands/gen.d.ts
92
353
  interface GenOptions extends SnapshotSource {
93
354
  readonly config: ResolvedConfig;
94
- readonly env: Readonly<Record<string, string | undefined>>;
355
+ readonly env: CliEnv;
95
356
  readonly check: boolean;
357
+ /** Colors the `--check` diffs. */
358
+ readonly paint?: Paint;
96
359
  /** Pre-loaded snapshot (tests, watch mode). */
97
360
  readonly snapshot?: Snapshot;
98
361
  }
@@ -195,7 +458,7 @@ interface Model {
195
458
  readonly config: ResolvedConfig;
196
459
  readonly catalog: Catalog;
197
460
  /** Typegen metadata restricted to the configured schemas. */
198
- readonly introspection: GeneratorMetadata;
461
+ readonly introspection: GeneratorMetadata$1;
199
462
  }
200
463
  /** Builds the codegen model from a snapshot and config. */
201
464
  export declare function buildModel(snapshot: Snapshot, config: ResolvedConfig): Model;
@@ -209,18 +472,22 @@ interface EmitOptions {
209
472
  readonly databaseTypesImport?: string;
210
473
  /** Import path for each JSON type import, keyed by the configured path. */
211
474
  readonly importPathFor: (from: string) => string;
475
+ /** Import path from the generated module to the metadata module (`emitMeta`). */
476
+ readonly metaImport?: string;
212
477
  }
213
478
  /** Renders the generated module. */
214
479
  export declare function emitModule(model: Model, options: EmitOptions): string;
215
480
  //#endregion
216
481
  //#region src/cli/config.d.ts
217
482
  /**
218
- * Loads the config with a native `import()`. Node 24 strips types from
219
- * `.ts` files, so no loader is needed.
483
+ * Loads `better-supabase.config.*` with c12 and checks it against the config
484
+ * schema. c12 imports `.ts` natively (Node 24 strips the types), so no
485
+ * loader is needed; rc files, `package.json`, env overrides and `extends`
486
+ * are off so the one file is the whole config.
220
487
  */
221
488
  export declare function loadConfig(cwd: string, explicit?: string): Promise<ResolvedConfig>;
222
489
  //#endregion
223
490
  //#region src/cli/version.d.ts
224
- export declare const VERSION = "0.0.0";
491
+ export declare const VERSION = "0.4.0";
225
492
  //#endregion
226
- export type { Catalog, CatalogCheck, CatalogColumn, CatalogEnum, CatalogForeignKey, CatalogFunction, CatalogFunctionArg, CatalogGrant, CatalogIndex, CatalogPolicy, CatalogTable, CatalogTrigger, CatalogUnique, CliIo, Command, CommandContext, CommandResult, ExtrasFunction, ExtrasHook, ExtrasHookFunction, ExtrasTable, ForeignKeyAction, GeneratorMetadata, IntrospectionSource, ManagementSourceOptions, Queryable, RunOptions, RunResult, Snapshot, SnapshotBucket, SnapshotExtras };
493
+ export type { Catalog, CatalogCheck, CatalogColumn, CatalogColumnGrant, CatalogEnum, CatalogForeignKey, CatalogFunction, CatalogFunctionArg, CatalogGrant, CatalogIndex, CatalogPolicy, CatalogTable, CatalogTrigger, CatalogUnique, CliArgs, CliCommandDef, CliContext, CliEnv, CliErrorCode, CliErrorOptions, CliIo, CliProblem, CliProblemExtensions, Command, CommandContext, CommandResult, ExitCode, ExtrasFunction, ExtrasHook, ExtrasHookFunction, ExtrasTable, ForeignKeyAction, GeneratorMetadata, IntrospectionSource, ManagementSourceOptions, ParsedArgs, Queryable, RunOptions, RunResult, Snapshot, SnapshotBucket, SnapshotExtras };
package/dist/cli/index.js CHANGED
@@ -1,3 +1,184 @@
1
- import { t as VERSION } from "../version-Cqq1m3UY.js";
2
- import { _ as emitModule, a as renderFiles, c as parseSnapshot, d as managementSource, f as pgSource, g as GENERATED_HEADER, h as toCatalog, i as run, l as serializeSnapshot, m as buildModel, n as HELP, o as runGen, p as loadConfig, r as registerCommand, s as loadSnapshot, t as fromCatalog, u as introspect } from "../cli-DrSgDOQC.js";
3
- export { GENERATED_HEADER, HELP, VERSION, buildModel, emitModule, fromCatalog, introspect, loadConfig, loadSnapshot, managementSource, parseSnapshot, pgSource, registerCommand, renderFiles, run, runGen, serializeSnapshot, toCatalog };
1
+ import { a as list, r as defineCliCommand } from "./command-CK14fP91.js";
2
+ import { n as CliError, t as CLI_ERRORS_URL } from "./errors-4v4DTtda.js";
3
+ import { i as run, n as help, r as registerCommand, t as commandNames } from "./run-CP20LKk_.js";
4
+ import { t as VERSION } from "./version-5mW_8sY1.js";
5
+ import { a as loadConfig } from "./config-D9R0o1LH.js";
6
+ import { b as emitModule, f as introspect, g as buildModel, i as runGen, k as toCatalog, l as parseSnapshot, m as pgSource, o as loadSnapshot, p as managementSource, r as renderFiles, u as serializeSnapshot, y as GENERATED_HEADER } from "./gen-Ccn_p90L.js";
7
+ //#region src/cli/introspect/from-catalog.ts
8
+ /**
9
+ * Builds a snapshot from catalog records: the inverse of `toCatalog`. Tests
10
+ * and benchmarks describe schemas as tables and functions; this produces the
11
+ * typegen metadata and extras those records imply.
12
+ */
13
+ function fromCatalog(catalog) {
14
+ const schemas = [.../* @__PURE__ */ new Set([...catalog.schemas, ...catalog.tables.map((table) => table.schema)])].sort();
15
+ const meta = {
16
+ version: 1,
17
+ schemas: schemas.map((name, index) => ({
18
+ id: 4e6 + index,
19
+ name,
20
+ owner: "postgres"
21
+ })),
22
+ tables: [],
23
+ foreignTables: [],
24
+ views: [],
25
+ materializedViews: [],
26
+ columns: [],
27
+ primaryKeys: [],
28
+ relationships: [],
29
+ functions: [],
30
+ types: []
31
+ };
32
+ const typeIds = /* @__PURE__ */ new Map();
33
+ const typeId = (schema, name) => {
34
+ const key = `${schema}.${name}`;
35
+ let id = typeIds.get(key);
36
+ if (id === void 0) {
37
+ id = 2e6 + typeIds.size;
38
+ typeIds.set(key, id);
39
+ meta.types.push({
40
+ id,
41
+ name,
42
+ schema,
43
+ format: name,
44
+ enums: [],
45
+ attributes: [],
46
+ comment: null,
47
+ type_relation_id: null
48
+ });
49
+ }
50
+ return id;
51
+ };
52
+ const enums = new Map(catalog.enums.map((entry) => [`${entry.schema}.${entry.name}`, entry]));
53
+ for (const entry of catalog.enums) {
54
+ const id = typeId(entry.schema, entry.name);
55
+ const type = meta.types.find((candidate) => candidate.id === id);
56
+ type.enums = [...entry.values];
57
+ }
58
+ const column = (table, id, entry, index) => ({
59
+ table_id: id,
60
+ schema: table.schema,
61
+ table: table.name,
62
+ id: `${id}.${index + 1}`,
63
+ ordinal_position: index + 1,
64
+ name: entry.name,
65
+ default_value: entry.default,
66
+ data_type: entry.isArray ? "ARRAY" : entry.isEnum ? "USER-DEFINED" : entry.udt,
67
+ format: entry.format,
68
+ type_schema: entry.typeSchema,
69
+ is_identity: entry.identity !== null,
70
+ identity_generation: entry.identity === "always" ? "ALWAYS" : entry.identity === "by default" ? "BY DEFAULT" : null,
71
+ is_generated: entry.generated,
72
+ is_nullable: entry.nullable,
73
+ is_updatable: entry.updatable,
74
+ is_unique: false,
75
+ enums: entry.isEnum ? [...enums.get(`${entry.typeSchema}.${entry.udt}`)?.values ?? []] : [],
76
+ check: null,
77
+ comment: entry.comment
78
+ });
79
+ catalog.tables.forEach((table, index) => {
80
+ const id = table.id || 1e6 + index;
81
+ if (table.kind === "table") meta.tables.push({
82
+ id,
83
+ schema: table.schema,
84
+ name: table.name,
85
+ rls_enabled: table.rls,
86
+ rls_forced: table.forceRls,
87
+ replica_identity: table.replicaIdentity ?? "DEFAULT",
88
+ bytes: 0,
89
+ size: "0 bytes",
90
+ live_rows_estimate: 0,
91
+ dead_rows_estimate: 0,
92
+ comment: table.comment
93
+ });
94
+ else meta.views.push({
95
+ id,
96
+ schema: table.schema,
97
+ name: table.name,
98
+ is_updatable: table.insertable || table.updatable,
99
+ is_insert_enabled: table.insertable,
100
+ is_update_enabled: table.updatable,
101
+ comment: table.comment
102
+ });
103
+ for (const [position, entry] of table.columns.entries()) meta.columns.push(column(table, id, entry, position));
104
+ for (const name of table.primaryKey) meta.primaryKeys.push({
105
+ schema: table.schema,
106
+ table_name: table.name,
107
+ name,
108
+ table_id: id
109
+ });
110
+ for (const fk of table.foreignKeys) meta.relationships.push({
111
+ foreign_key_name: fk.name,
112
+ schema: table.schema,
113
+ relation: table.name,
114
+ columns: [...fk.columns],
115
+ is_one_to_one: fk.oneToOne,
116
+ referenced_schema: fk.refSchema,
117
+ referenced_relation: fk.refTable,
118
+ referenced_columns: [...fk.refColumns]
119
+ });
120
+ });
121
+ const relationIds = new Map([...meta.tables, ...meta.views].map((entry) => [`${entry.schema}.${entry.name}`, entry.id]));
122
+ const argType = (schema, udt) => typeId(enums.has(`${schema}.${udt}`) ? schema : "pg_catalog", udt);
123
+ catalog.functions.forEach((fn, index) => {
124
+ const args = [...fn.args.map((arg) => ({
125
+ mode: "in",
126
+ name: arg.name,
127
+ type_id: argType(fn.schema, arg.isArray ? `_${arg.udt}` : arg.udt),
128
+ has_default: arg.hasDefault
129
+ })), ...(fn.returnsTable ?? []).map((entry) => ({
130
+ mode: "table",
131
+ name: entry.name,
132
+ type_id: argType(fn.schema, entry.udt),
133
+ has_default: false
134
+ }))];
135
+ meta.functions.push({
136
+ id: 3e6 + index,
137
+ schema: fn.schema,
138
+ name: fn.name,
139
+ language: fn.language,
140
+ definition: "",
141
+ complete_statement: "",
142
+ args,
143
+ argument_types: fn.signature,
144
+ identity_argument_types: fn.signature,
145
+ return_type_id: fn.returnsRelation ? typeId(fn.returnsRelation.split(".")[0], fn.returns) : argType(fn.schema, fn.returns),
146
+ return_type: fn.returns,
147
+ return_type_relation_id: fn.returnsRelation ? relationIds.get(fn.returnsRelation) ?? null : null,
148
+ is_set_returning_function: fn.returnsSet,
149
+ prorows: null,
150
+ behavior: fn.volatility.toUpperCase(),
151
+ security_definer: fn.securityDefiner,
152
+ config_params: fn.searchPath === null ? null : { search_path: fn.searchPath === "" ? "\"\"" : fn.searchPath }
153
+ });
154
+ });
155
+ return {
156
+ version: 2,
157
+ schemas,
158
+ generator: meta,
159
+ extras: {
160
+ tables: catalog.tables.map((table, index) => ({
161
+ id: table.id || 1e6 + index,
162
+ schema: table.schema,
163
+ name: table.name,
164
+ primaryKey: table.primaryKey,
165
+ uniques: table.uniques,
166
+ foreignKeys: table.foreignKeys.map((fk) => ({
167
+ name: fk.name,
168
+ onDelete: fk.onDelete,
169
+ onUpdate: fk.onUpdate
170
+ })),
171
+ checks: table.checks,
172
+ indexes: table.indexes,
173
+ policies: table.policies,
174
+ triggers: table.triggers,
175
+ grants: table.grants,
176
+ ...table.columnGrants ? { columnGrants: table.columnGrants } : {}
177
+ })),
178
+ buckets: catalog.buckets,
179
+ realtime: catalog.realtime
180
+ }
181
+ };
182
+ }
183
+ //#endregion
184
+ export { CLI_ERRORS_URL, CliError, GENERATED_HEADER, VERSION, buildModel, commandNames, defineCliCommand, emitModule, fromCatalog, help, introspect, list, loadConfig, loadSnapshot, managementSource, parseSnapshot, pgSource, registerCommand, renderFiles, run, runGen, serializeSnapshot, toCatalog };