joist-codegen 1.173.0 → 1.174.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.
@@ -2,5 +2,18 @@ import { Client } from "pg";
2
2
  import { DbMetadata } from "./EntityDbMetadata";
3
3
  /** Creates a `flush_database` stored procedure to truncate all the tables between tests. */
4
4
  export declare function createFlushFunction(client: Client, db: DbMetadata): Promise<void>;
5
- export declare function generateFlushFunction(db: DbMetadata): string;
5
+ /**
6
+ * Explicitly deletes every entity/m2m table in a deterministic order.
7
+ *
8
+ * We do this for schemas with non-deferred foreign keys (order matters)
9
+ * or schemas with UUID id columns.
10
+ */
11
+ export declare function generateExplicitFlushFunction(db: DbMetadata): string;
12
+ /**
13
+ * A cuter/shorter flush that only DELETEs from tables that were inserted into.
14
+ *
15
+ * The difference between this and the explicit-order function should only be
16
+ * noticeable on 100+ table schemas.
17
+ */
18
+ export declare function generateSequenceFlushFunction(db: DbMetadata): string;
6
19
  //# sourceMappingURL=generateFlushFunction.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"generateFlushFunction.d.ts","sourceRoot":"","sources":["../src/generateFlushFunction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,4FAA4F;AAC5F,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvF;AAED,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,UAAU,GAAG,MAAM,CAqD5D"}
1
+ {"version":3,"file":"generateFlushFunction.d.ts","sourceRoot":"","sources":["../src/generateFlushFunction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,4FAA4F;AAC5F,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAQvF;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,UAAU,GAAG,MAAM,CAiDpE;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,UAAU,GAAG,MAAM,CAqBpE"}
@@ -1,12 +1,25 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateFlushFunction = exports.createFlushFunction = void 0;
3
+ exports.generateSequenceFlushFunction = exports.generateExplicitFlushFunction = exports.createFlushFunction = void 0;
4
4
  /** Creates a `flush_database` stored procedure to truncate all the tables between tests. */
5
5
  async function createFlushFunction(client, db) {
6
- await client.query(generateFlushFunction(db));
6
+ const hasAnyNonDeferredFks = db.entities.some((e) => e.nonDeferredFks.length > 0);
7
+ const hasAnyNonSequenceIds = db.entities.some((e) => e.primaryKey.columnType === "uuid");
8
+ if (hasAnyNonSequenceIds || hasAnyNonDeferredFks) {
9
+ await client.query(generateExplicitFlushFunction(db));
10
+ }
11
+ else {
12
+ await client.query(generateSequenceFlushFunction(db));
13
+ }
7
14
  }
8
15
  exports.createFlushFunction = createFlushFunction;
9
- function generateFlushFunction(db) {
16
+ /**
17
+ * Explicitly deletes every entity/m2m table in a deterministic order.
18
+ *
19
+ * We do this for schemas with non-deferred foreign keys (order matters)
20
+ * or schemas with UUID id columns.
21
+ */
22
+ function generateExplicitFlushFunction(db) {
10
23
  // Leave code/enum tables alone
11
24
  const tables = [
12
25
  ...[...db.entities]
@@ -29,11 +42,10 @@ function generateFlushFunction(db) {
29
42
  // On even a 40-table schema, TRUNCATEs (either 1 per table or even a single TRUNCATE with all tables) takes
30
43
  // 100s of milliseconds, whereas DELETEs takes single-digit milliseconds and DELETEs + ALTER SEQUENCEs is
31
44
  // 10s of milliseconds.
32
- //
33
- // One cute idea would be to use a single sequence for all tables when running locally. That would
34
- // mean our flush_database function could reset a single sequence. Plus it would reduce bugs where
35
- // something "works" but only b/c in the test database, all entities have id = 1.
36
- const deletes = tables.map((t) => `DELETE FROM "${t}"; ALTER SEQUENCE IF EXISTS "${t}_id_seq" RESTART WITH 1 INCREMENT BY 1;`);
45
+ const deletes = tables.flatMap((t) => [
46
+ `DELETE FROM "${t}";`,
47
+ `ALTER SEQUENCE IF EXISTS "${t}_id_seq" RESTART WITH 1 INCREMENT BY 1;`,
48
+ ]);
37
49
  // Create `SET NULLs` in schemas that don't have deferred FKs
38
50
  const setFksNulls = db.entities
39
51
  .filter((t) => t.nonDeferredFkOrder)
@@ -44,13 +56,40 @@ function generateFlushFunction(db) {
44
56
  .filter((m2o) => db.entitiesByName[m2o.otherEntity.name].nonDeferredFkOrder > t.nonDeferredFkOrder)
45
57
  .map((m2o) => `UPDATE ${t.tableName} SET ${m2o.columnName} = NULL;`));
46
58
  const statements = [...setFksNulls, ...deletes].join("\n");
47
- // console.log({ statements });
48
59
  return `CREATE OR REPLACE FUNCTION flush_database() RETURNS void AS $$
49
60
  BEGIN
50
- ${statements}
61
+ ${statements}
51
62
  END;
52
63
  $$ LANGUAGE
53
64
  'plpgsql'`;
54
65
  }
55
- exports.generateFlushFunction = generateFlushFunction;
66
+ exports.generateExplicitFlushFunction = generateExplicitFlushFunction;
67
+ /**
68
+ * A cuter/shorter flush that only DELETEs from tables that were inserted into.
69
+ *
70
+ * The difference between this and the explicit-order function should only be
71
+ * noticeable on 100+ table schemas.
72
+ */
73
+ function generateSequenceFlushFunction(db) {
74
+ const enumTables = Object.values(db.enums).map((e) => e.table);
75
+ // We don't currently have a way to filter out the enum sequences in a query
76
+ const maybeSkipEnums = enumTables.length === 0
77
+ ? ""
78
+ : `AND sequencename NOT IN (${enumTables.map((t) => `'${t.name}_id_seq'`).join(", ")})`;
79
+ return `CREATE OR REPLACE FUNCTION flush_database() RETURNS void AS $$
80
+ DECLARE seq RECORD;
81
+ BEGIN
82
+ FOR seq IN
83
+ SELECT sequencename AS name
84
+ FROM pg_sequences
85
+ WHERE schemaname = 'public' AND last_value IS NOT NULL AND sequencename LIKE '%_id_seq' ${maybeSkipEnums}
86
+ LOOP
87
+ EXECUTE format('DELETE FROM %I', regexp_replace(seq.name, '_id_seq$', ''));
88
+ EXECUTE format('ALTER SEQUENCE %I RESTART WITH 1', seq.name);
89
+ END LOOP;
90
+ END;
91
+ $$ LANGUAGE
92
+ 'plpgsql'`;
93
+ }
94
+ exports.generateSequenceFlushFunction = generateSequenceFlushFunction;
56
95
  //# sourceMappingURL=generateFlushFunction.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generateFlushFunction.js","sourceRoot":"","sources":["../src/generateFlushFunction.ts"],"names":[],"mappings":";;;AAGA,4FAA4F;AACrF,KAAK,UAAU,mBAAmB,CAAC,MAAc,EAAE,EAAc;IACtE,MAAM,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAC;AAChD,CAAC;AAFD,kDAEC;AAED,SAAgB,qBAAqB,CAAC,EAAc;IAClD,+BAA+B;IAC/B,MAAM,MAAM,GAAG;QACb,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC;aAChB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACb,wDAAwD;YACxD,MAAM,CAAC,GAAG,CAAC,CAAC,kBAAkB,CAAC;YAC/B,MAAM,CAAC,GAAG,CAAC,CAAC,kBAAkB,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,CAAC;YACf,CAAC;YACD,uCAAuC;YACvC,MAAM,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,CAAC;QACf,CAAC,CAAC;aACD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1B,GAAG,EAAE,CAAC,UAAU;KACjB,CAAC;IACF,yGAAyG;IACzG,4GAA4G;IAC5G,yGAAyG;IACzG,uBAAuB;IACvB,EAAE;IACF,kGAAkG;IAClG,kGAAkG;IAClG,iFAAiF;IACjF,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CACxB,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,gCAAgC,CAAC,yCAAyC,CACnG,CAAC;IAEF,6DAA6D;IAC7D,MAAM,WAAW,GAAG,EAAE,CAAC,QAAQ;SAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC;SACnC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CACb,CAAC,CAAC,UAAU;QACV,mFAAmF;SAClF,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,KAAK,UAAU,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC;QAC3E,qDAAqD;SACpD,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,kBAAkB,GAAG,CAAC,CAAC,kBAAkB,CAAC;SAClG,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,SAAS,QAAQ,GAAG,CAAC,UAAU,UAAU,CAAC,CACvE,CAAC;IAEJ,MAAM,UAAU,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE3D,+BAA+B;IAE/B,OAAO;;MAEH,UAAU;;;cAGF,CAAC;AACf,CAAC;AArDD,sDAqDC"}
1
+ {"version":3,"file":"generateFlushFunction.js","sourceRoot":"","sources":["../src/generateFlushFunction.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "joist-codegen",
3
- "version": "1.173.0",
3
+ "version": "1.174.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -25,7 +25,7 @@
25
25
  "change-case": "^4.1.2",
26
26
  "fast-glob": "^3.3.2",
27
27
  "inquirer": "^8.2.6",
28
- "joist-utils": "1.173.0",
28
+ "joist-utils": "1.174.0",
29
29
  "jscodeshift": "^0.15.2",
30
30
  "knex": "^3.1.0",
31
31
  "pg": "^8.11.5",