@supawatch/target-seed 0.8.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -18,9 +18,12 @@ with a nullable edge, and a post-seed insert that does not collide
18
18
  because sequences were resynced. Seeded rows are ground-truth checked
19
19
  against the generated Zod schemas.
20
20
 
21
- Honest limits, emitted as comments rather than guesses: tables whose
22
- required foreign keys form a cycle, multi-column foreign keys, and
23
- required columns with no default whose types have no honest literal
24
- (composites, unknown types) are skipped by name.
21
+ Honest limits, emitted as comments rather than guesses: anything the
22
+ generator cannot fill truthfully is skipped by name rather than
23
+ approximated. That covers required foreign keys that form a cycle or
24
+ reference something other than a predictable single-column primary key,
25
+ multi-column foreign keys, constrained domains, and required columns
26
+ whose types have no honest literal (composites, unknown types, string
27
+ types with constrained input syntax like inet or interval).
25
28
 
26
29
  MIT.
package/dist/index.js CHANGED
@@ -69,6 +69,8 @@ function literalFor(runtime, col, table, rowIndex, rand, baseTypeOf) {
69
69
  case "json":
70
70
  return sqlString("{}") + "::jsonb";
71
71
  case "enum": {
72
+ if (runtime.labels.length === 0)
73
+ return null; // zero-label enums hold nothing
72
74
  const label = runtime.labels[rowIndex % runtime.labels.length];
73
75
  return sqlString(label) + `::"${col.pgTypeName.replace(/^_/, "")}"`;
74
76
  }
@@ -199,6 +201,10 @@ export class SeedTarget {
199
201
  const col = t.columns.find((c) => c.name === pkName);
200
202
  if (!col)
201
203
  return null;
204
+ // A stored-generated pk computes its own value from an expression
205
+ // the generator cannot predict; children cannot reference it.
206
+ if (col.generated)
207
+ return null;
202
208
  if (col.runtime.kind === "number")
203
209
  return String(i + 1);
204
210
  // bigint primary keys arrive as strings from the driver but seed
@@ -245,6 +251,16 @@ export class SeedTarget {
245
251
  continue;
246
252
  }
247
253
  if (col.name === pk) {
254
+ // A pk with no honest literal (interval, composite, ...) can
255
+ // only work when the database fills it; without a default the
256
+ // table cannot be seeded at all.
257
+ const pkProbe = literalFor(col.runtime, col, table, 0, mulberry32(1), baseTypeOf);
258
+ if (pkProbe === null) {
259
+ if (col.identity || col.hasDefault)
260
+ continue; // db fills it
261
+ skipReasons.push(`primary key ${col.name} has no honest literal (${col.sqlType})`);
262
+ continue;
263
+ }
248
264
  cols.push(col);
249
265
  continue;
250
266
  }
@@ -264,6 +280,14 @@ export class SeedTarget {
264
280
  }
265
281
  continue;
266
282
  }
283
+ // ... and the parent's pk values must be predictable
284
+ // (generated or literal-less pks are not).
285
+ if (parent !== undefined && pkLiteral(parent, 0) === null) {
286
+ if (!col.nullable && !col.hasDefault) {
287
+ skipReasons.push(`foreign key ${col.name} references ${fk.referencedTable}, whose primary key values the generator cannot predict`);
288
+ }
289
+ continue;
290
+ }
267
291
  cols.push(col);
268
292
  continue;
269
293
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@supawatch/target-seed",
3
- "version": "0.8.0",
3
+ "version": "0.9.1",
4
4
  "description": "Deterministic FK-aware seed.sql generated from live Postgres by supawatch: topological order, identity overriding, sequence resync.",
5
5
  "keywords": [
6
6
  "supabase",
@@ -34,7 +34,7 @@
34
34
  "dist"
35
35
  ],
36
36
  "dependencies": {
37
- "@supawatch/core": "0.8.0"
37
+ "@supawatch/core": "0.9.1"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@types/node": "^22.20.1",