pipework 0.19.1 → 0.20.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.20.0
4
+
5
+ - **The test template is now shared across processes and keyed by its contents, so a suite pays for its migration stack once per run instead of once per test file.** The per-file test database has been a `CREATE DATABASE … WITH TEMPLATE` clone since 0.16 (#321), but the template it cloned from was cached in a module-local map and named after `process.pid` plus a per-process nonce. Both are process-scoped, and a consumer running vitest with `pool: 'forks'` and `isolate: true` gets a fresh process per test file — so every file did an unconditional `DROP DATABASE` / `CREATE DATABASE` / full migration replay for a byte-identical result. One reporting consumer measured 504 files × (111 migrations + extensions + framework tables); on a constrained box the suite did not finish at all.
6
+
7
+ A template is now named for the hash of everything that determines its contents: the migrations folder's bytes, the migrations table, the extensions, the trace and audit config, the connecting role, the pipework version, and the calendar day. Any process — in this run or a later one — that wants that exact content clones the template that is already there. Per-file **clone** databases are unchanged: still keyed by pid and run nonce, still dropped at teardown. Nothing about isolation between test files changes; only the read-only template stops being rebuilt.
8
+
9
+ Content keying makes invalidation automatic rather than manual. Edit a migration and the hash changes, so you ask for a template that does not exist yet and it is built; the old one is named something nobody will ask for again, and the reaper drops it. The day is part of the hash because trace and audit day partitions are provisioned relative to "today" — a template built yesterday is missing today's partitions.
10
+
11
+ Concurrency is handled with two advisory locks in the same family as the existing reap machinery. Every process holds a SHARE-mode lock on the template's content key for its whole life, and the reaper drops a template only under an EXCLUSIVE one, so a template can never be pulled out from under a process sitting between its readiness check and its clone. A separate EXCLUSIVE build lock means N processes starting together produce one template and one migration replay, not N. A template records a marker row as the last act of a successful build: a database without it is the wreckage of a builder that died mid-migration, and is rebuilt rather than cloned.
12
+
13
+ There is deliberately no fallback. If the shared template cannot be built or validated, test setup fails loudly — quietly reverting to a private per-process build would re-hide exactly the cost this removes. Issue #340.
14
+
15
+ - **Test databases and templates now live in separate namespaces**: clones stay under `<project>_test_`, templates move to `<project>_tmpl_`. The app role a test connects as is content-keyed to its template (`<project>_app_<database>_<fingerprint>`) rather than carrying a pid. If you assert on these names, they have changed. Old-format leftovers from previous runs are reaped normally.
16
+
17
+ - **Fix: `pipe.sql` no longer overflows the stack or spends quadratic time on deeply composed queries.** Building a query by folding fragments — `acc = sql\`${acc} union all ${next}\`` — nests one `SQL` per fragment, and the builder recursed once per level: past a few thousand fragments it died with `RangeError: Maximum call stack size exceeded`, and before reaching that limit it accumulated the query text with repeated `+=` across the recursion, which is quadratic in total string work. One reported case burned 26 minutes at 100% CPU and 44 GB RSS before throwing. The builder now traverses with an explicit work stack and joins the text once, so depth costs heap instead of call frames and assembly is linear. A 200,000-fragment composition builds in well under a second. Emitted SQL, parameter order, and typings are unchanged. Issue #339.
18
+
3
19
  ## 0.19.1
4
20
 
5
21
  - **Fix: `pipework check` no longer exits 0 when `pipework.config.ts` cannot be loaded.** A config file that exists but throws on import — a missing `DATABASE_URL`, a bad import, any evaluation error — was swallowed by a bare `catch` in module-scope resolution. `check` then fell back to filesystem discovery, and in a package with no `pnpm-workspace.yaml` that resolves to *no* modules, so lint, type check, doctrine and the flow checks never ran and the run still printed `All checks passed` and exited 0. As a gate, that is the worst possible failure direction: a broken config, or any environment that cannot resolve one, passed silently, and nothing distinguished "lint ran clean" from "lint never ran". The load failure is now its own reported step (`Config load`) that fails the run; the remaining steps still execute so one run surfaces everything it can, but none of them can green it. Issue #335.
@@ -1 +1 @@
1
- {"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../../../src/data/query/sql/sql.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../../../src/data/query/sql/sql.ts"],"names":[],"mappings":"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"}
@@ -16,20 +16,6 @@ export class FakePrimitiveParam {
16
16
  export function isSQLWrapper(value) {
17
17
  return value !== null && value !== undefined && typeof value.getSQL === 'function';
18
18
  }
19
- function mergeQueries(queries) {
20
- const result = { sql: '', params: [] };
21
- for (const query of queries) {
22
- result.sql += query.sql;
23
- result.params.push(...query.params);
24
- if (query.typings?.length) {
25
- if (!result.typings) {
26
- result.typings = [];
27
- }
28
- result.typings.push(...query.typings);
29
- }
30
- }
31
- return result;
32
- }
33
19
  export class StringChunk {
34
20
  static [entityKind] = 'StringChunk';
35
21
  value;
@@ -79,122 +65,164 @@ export class SQL {
79
65
  paramStartIndex: _config.paramStartIndex || { value: 0 },
80
66
  });
81
67
  const { casing, escapeName, escapeParam, prepareTyping, inlineParams, paramStartIndex, } = config;
82
- return mergeQueries(chunks.map((chunk) => {
68
+ // Traversal is iterative, not recursive: composed queries nest one `SQL`
69
+ // per fragment, so folding N fragments together produces depth-N nesting
70
+ // and self-recursion here blows the stack well before Postgres would
71
+ // object to the query. The work stack keeps depth off the call stack, and
72
+ // collecting the text in an array joined once at the end keeps the string
73
+ // work linear instead of quadratic.
74
+ const stack = [];
75
+ const pushChunks = (source, frameInlineParams) => {
76
+ for (let i = source.length - 1; i >= 0; i--) {
77
+ stack.push({ chunk: source[i], inlineParams: frameInlineParams });
78
+ }
79
+ };
80
+ const sqlParts = [];
81
+ const params = [];
82
+ let typings;
83
+ const pushTyping = (typing) => {
84
+ if (!typings) {
85
+ typings = [];
86
+ }
87
+ typings.push(typing);
88
+ };
89
+ pushChunks(chunks, inlineParams ?? false);
90
+ while (stack.length > 0) {
91
+ const frame = stack.pop();
92
+ const chunk = frame.chunk;
93
+ const frameInlineParams = frame.inlineParams;
83
94
  if (is(chunk, StringChunk)) {
84
- return { sql: chunk.value.join(''), params: [] };
95
+ sqlParts.push(chunk.value.join(''));
96
+ continue;
85
97
  }
86
98
  if (is(chunk, Name)) {
87
- return { sql: escapeName(chunk.value), params: [] };
99
+ sqlParts.push(escapeName(chunk.value));
100
+ continue;
88
101
  }
89
102
  if (chunk === undefined) {
90
- return { sql: '', params: [] };
103
+ continue;
91
104
  }
92
105
  if (Array.isArray(chunk)) {
93
- const result = [new StringChunk('(')];
106
+ const expanded = [new StringChunk('(')];
94
107
  for (const [i, p] of chunk.entries()) {
95
- result.push(p);
108
+ expanded.push(p);
96
109
  if (i < chunk.length - 1) {
97
- result.push(new StringChunk(', '));
110
+ expanded.push(new StringChunk(', '));
98
111
  }
99
112
  }
100
- result.push(new StringChunk(')'));
101
- return this.buildQueryFromSourceParams(result, config);
113
+ expanded.push(new StringChunk(')'));
114
+ pushChunks(expanded, frameInlineParams);
115
+ continue;
102
116
  }
103
117
  if (is(chunk, SQL)) {
104
- return this.buildQueryFromSourceParams(chunk.queryChunks, {
105
- ...config,
106
- inlineParams: inlineParams || chunk.shouldInlineParams,
107
- });
118
+ pushChunks(chunk.queryChunks, frameInlineParams || chunk.shouldInlineParams);
119
+ continue;
108
120
  }
109
121
  if (is(chunk, Table)) {
110
122
  const schemaName = chunk[Table.Symbol.Schema];
111
123
  const tableName = chunk[Table.Symbol.Name];
112
- return {
113
- sql: schemaName === undefined || chunk[IsAlias]
114
- ? escapeName(tableName)
115
- : escapeName(schemaName) + '.' + escapeName(tableName),
116
- params: [],
117
- };
124
+ sqlParts.push(schemaName === undefined || chunk[IsAlias]
125
+ ? escapeName(tableName)
126
+ : escapeName(schemaName) + '.' + escapeName(tableName));
127
+ continue;
118
128
  }
119
129
  if (is(chunk, Column)) {
120
130
  const columnName = casing.getColumnCasing(chunk);
121
131
  if (_config.invokeSource === 'indexes') {
122
- return { sql: escapeName(columnName), params: [] };
132
+ sqlParts.push(escapeName(columnName));
133
+ continue;
123
134
  }
124
135
  const schemaName = chunk.table[Table.Symbol.Schema];
125
- return {
126
- sql: chunk.table[IsAlias] || schemaName === undefined
127
- ? escapeName(chunk.table[Table.Symbol.Name]) + '.' + escapeName(columnName)
128
- : escapeName(schemaName) + '.' + escapeName(chunk.table[Table.Symbol.Name]) + '.'
129
- + escapeName(columnName),
130
- params: [],
131
- };
136
+ sqlParts.push(chunk.table[IsAlias] || schemaName === undefined
137
+ ? escapeName(chunk.table[Table.Symbol.Name]) + '.' + escapeName(columnName)
138
+ : escapeName(schemaName) + '.' + escapeName(chunk.table[Table.Symbol.Name]) + '.'
139
+ + escapeName(columnName));
140
+ continue;
132
141
  }
133
142
  if (is(chunk, View)) {
134
143
  const schemaName = chunk[ViewBaseConfig].schema;
135
144
  const viewName = chunk[ViewBaseConfig].name;
136
- return {
137
- sql: schemaName === undefined || chunk[ViewBaseConfig].isAlias
138
- ? escapeName(viewName)
139
- : escapeName(schemaName) + '.' + escapeName(viewName),
140
- params: [],
141
- };
145
+ sqlParts.push(schemaName === undefined || chunk[ViewBaseConfig].isAlias
146
+ ? escapeName(viewName)
147
+ : escapeName(schemaName) + '.' + escapeName(viewName));
148
+ continue;
142
149
  }
143
150
  if (is(chunk, Param)) {
144
151
  if (is(chunk.value, Placeholder)) {
145
- return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };
152
+ sqlParts.push(escapeParam(paramStartIndex.value++, chunk));
153
+ params.push(chunk);
154
+ pushTyping('none');
155
+ continue;
146
156
  }
147
157
  const mappedValue = chunk.value === null ? null : chunk.encoder.mapToDriverValue(chunk.value);
148
158
  if (is(mappedValue, SQL)) {
149
- return this.buildQueryFromSourceParams([mappedValue], config);
150
- }
151
- if (inlineParams) {
152
- return { sql: this.mapInlineParam(mappedValue, config), params: [] };
159
+ stack.push({ chunk: mappedValue, inlineParams: frameInlineParams });
160
+ continue;
153
161
  }
154
- let typings = ['none'];
155
- if (prepareTyping) {
156
- typings = [prepareTyping(chunk.encoder)];
162
+ if (frameInlineParams) {
163
+ sqlParts.push(this.mapInlineParam(mappedValue, config));
164
+ continue;
157
165
  }
158
- return { sql: escapeParam(paramStartIndex.value++, mappedValue), params: [mappedValue], typings };
166
+ sqlParts.push(escapeParam(paramStartIndex.value++, mappedValue));
167
+ params.push(mappedValue);
168
+ pushTyping(prepareTyping ? prepareTyping(chunk.encoder) : 'none');
169
+ continue;
159
170
  }
160
171
  if (is(chunk, Placeholder)) {
161
- return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };
172
+ sqlParts.push(escapeParam(paramStartIndex.value++, chunk));
173
+ params.push(chunk);
174
+ pushTyping('none');
175
+ continue;
162
176
  }
163
177
  if (is(chunk, SQL.Aliased) && chunk.fieldAlias !== undefined) {
164
- return { sql: escapeName(chunk.fieldAlias), params: [] };
178
+ sqlParts.push(escapeName(chunk.fieldAlias));
179
+ continue;
165
180
  }
166
181
  if (is(chunk, Subquery)) {
167
182
  if (chunk._.isWith) {
168
- return { sql: escapeName(chunk._.alias), params: [] };
183
+ sqlParts.push(escapeName(chunk._.alias));
184
+ continue;
169
185
  }
170
- return this.buildQueryFromSourceParams([
186
+ pushChunks([
171
187
  new StringChunk('('),
172
188
  chunk._.sql,
173
189
  new StringChunk(') '),
174
190
  new Name(chunk._.alias),
175
- ], config);
191
+ ], frameInlineParams);
192
+ continue;
176
193
  }
177
194
  if (isPgEnum(chunk)) {
178
- if (chunk.schema) {
179
- return { sql: escapeName(chunk.schema) + '.' + escapeName(chunk.enumName), params: [] };
180
- }
181
- return { sql: escapeName(chunk.enumName), params: [] };
195
+ sqlParts.push(chunk.schema
196
+ ? escapeName(chunk.schema) + '.' + escapeName(chunk.enumName)
197
+ : escapeName(chunk.enumName));
198
+ continue;
182
199
  }
183
200
  if (isSQLWrapper(chunk)) {
184
201
  if (chunk.shouldOmitSQLParens?.()) {
185
- return this.buildQueryFromSourceParams([chunk.getSQL()], config);
202
+ stack.push({ chunk: chunk.getSQL(), inlineParams: frameInlineParams });
186
203
  }
187
- return this.buildQueryFromSourceParams([
188
- new StringChunk('('),
189
- chunk.getSQL(),
190
- new StringChunk(')'),
191
- ], config);
204
+ else {
205
+ pushChunks([
206
+ new StringChunk('('),
207
+ chunk.getSQL(),
208
+ new StringChunk(')'),
209
+ ], frameInlineParams);
210
+ }
211
+ continue;
192
212
  }
193
- if (inlineParams) {
194
- return { sql: this.mapInlineParam(chunk, config), params: [] };
213
+ if (frameInlineParams) {
214
+ sqlParts.push(this.mapInlineParam(chunk, config));
215
+ continue;
195
216
  }
196
- return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };
197
- }));
217
+ sqlParts.push(escapeParam(paramStartIndex.value++, chunk));
218
+ params.push(chunk);
219
+ pushTyping('none');
220
+ }
221
+ const query = { sql: sqlParts.join(''), params };
222
+ if (typings) {
223
+ query.typings = typings;
224
+ }
225
+ return query;
198
226
  }
199
227
  mapInlineParam(chunk, { escapeString }) {
200
228
  if (chunk === null) {
@@ -1 +1 @@
1
- {"version":3,"file":"sql.js","sourceRoot":"","sources":["../../../../src/data/query/sql/sql.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sql.js","sourceRoot":"","sources":["../../../../src/data/query/sql/sql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import type { Blueprint } from '../core/config/schema.js';
2
+ import type { ResolvedDatabase } from '../core/config/index.js';
3
+ /**
4
+ * Everything that determines a template's contents. Serialized and hashed;
5
+ * anything omitted here is something two runs may disagree about while still
6
+ * sharing a template, so omissions are the way stale reuse happens.
7
+ */
8
+ export interface TemplateInputs {
9
+ /** Which configured database this template stands in for. */
10
+ readonly databaseName: string;
11
+ /**
12
+ * The role that builds — and therefore owns — the template.
13
+ *
14
+ * `CREATE DATABASE ... WITH TEMPLATE` requires ownership of the template, so
15
+ * a template is only shareable among processes connecting as the same role.
16
+ * Keying on the owner means a second role builds its own rather than failing
17
+ * to clone, or worse, trying to drop a database it does not own.
18
+ */
19
+ readonly owner: string;
20
+ readonly extensions: readonly string[];
21
+ readonly migrationTable: string;
22
+ /** Hash of the migrations folder's contents, or `null` when unmigrated. */
23
+ readonly migrations: string | null;
24
+ /** Framework-table provisioning depends on these blueprint sections. */
25
+ readonly trace: unknown;
26
+ readonly audit: unknown;
27
+ /** Framework tables ride the default database only. */
28
+ readonly isDefaultDatabase: boolean;
29
+ /** Trace/audit day partitions are provisioned relative to the current day. */
30
+ readonly partitionDay: string;
31
+ /** Internal definitions and emitted DDL travel with the pipework version. */
32
+ readonly pipeworkVersion: string;
33
+ readonly formatVersion: number;
34
+ }
35
+ /**
36
+ * Hash a migrations folder's contents: every file's path relative to the folder
37
+ * and its bytes, in a stable order. Path names are included so a rename is a
38
+ * change; a missing or unreadable folder hashes as absent.
39
+ */
40
+ export declare function hashMigrationsFolder(folder: string): string | null;
41
+ /**
42
+ * Collect the content inputs for one configured database's template.
43
+ *
44
+ * `partitionDay` is the current UTC date. Trace and audit partitions are
45
+ * created per day with a lead window, so a template built yesterday is missing
46
+ * today's partitions — keying on the day makes that invalidation automatic
47
+ * instead of a stale-data bug that only shows up after midnight.
48
+ */
49
+ export declare function templateInputs(databaseName: string, dbConfig: ResolvedDatabase, blueprint: Blueprint, isDefaultDatabase: boolean, today: Date): TemplateInputs;
50
+ /**
51
+ * The template's content fingerprint: 16 lowercase hex chars. Deliberately
52
+ * wider than the 12-char per-run nonce so a template name can never be mistaken
53
+ * for a run-owned database name.
54
+ */
55
+ export declare function templateFingerprint(inputs: TemplateInputs): string;
56
+ //# sourceMappingURL=fingerprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../src/test/fingerprint.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAiB/D;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,6DAA6D;IAC7D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B;;;;;;;OAOG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAA;IACtC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,wEAAwE;IACxE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,uDAAuD;IACvD,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAA;IACnC,8EAA8E;IAC9E,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,6EAA6E;IAC7E,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA2BlE;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,SAAS,EACpB,iBAAiB,EAAE,OAAO,EAC1B,KAAK,EAAE,IAAI,GACV,cAAc,CAchB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAElE"}
@@ -0,0 +1,84 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { readdirSync, readFileSync } from 'node:fs';
3
+ import { join, relative, sep } from 'node:path';
4
+ import { VERSION } from '../core/runtime/broker.js';
5
+ // The template is keyed by its CONTENT, not by the run that happened to build
6
+ // it. Every input that changes what ends up inside a template database is
7
+ // folded into one hash, and that hash becomes the template's name — so a
8
+ // migration edit does not invalidate a template, it simply asks for a
9
+ // different one, and the stale one is reaped because nobody asks for it again.
10
+ //
11
+ // Content keying is what lets a template outlive the process that built it:
12
+ // a vitest run with `pool: 'forks'` + `isolate: true` gives every test file a
13
+ // fresh process, and a per-process key (pid, run nonce) meant every one of them
14
+ // replayed the whole migration stack. Issue #340.
15
+ /** Bump when pipework changes the SHAPE of what it puts in a template. */
16
+ const TEMPLATE_FORMAT_VERSION = 1;
17
+ /**
18
+ * Hash a migrations folder's contents: every file's path relative to the folder
19
+ * and its bytes, in a stable order. Path names are included so a rename is a
20
+ * change; a missing or unreadable folder hashes as absent.
21
+ */
22
+ export function hashMigrationsFolder(folder) {
23
+ const files = [];
24
+ const walk = (dir) => {
25
+ let entries;
26
+ try {
27
+ entries = readdirSync(dir, { withFileTypes: true });
28
+ }
29
+ catch {
30
+ return;
31
+ }
32
+ for (const entry of entries.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0))) {
33
+ const full = join(dir, entry.name);
34
+ if (entry.isDirectory())
35
+ walk(full);
36
+ else if (entry.isFile())
37
+ files.push(full);
38
+ }
39
+ };
40
+ walk(folder);
41
+ if (files.length === 0)
42
+ return null;
43
+ const hash = createHash('sha256');
44
+ for (const file of files) {
45
+ // Normalize the separator so the same tree hashes alike on any platform.
46
+ hash.update(relative(folder, file).split(sep).join('/'));
47
+ hash.update('\0');
48
+ hash.update(readFileSync(file));
49
+ hash.update('\0');
50
+ }
51
+ return hash.digest('hex');
52
+ }
53
+ /**
54
+ * Collect the content inputs for one configured database's template.
55
+ *
56
+ * `partitionDay` is the current UTC date. Trace and audit partitions are
57
+ * created per day with a lead window, so a template built yesterday is missing
58
+ * today's partitions — keying on the day makes that invalidation automatic
59
+ * instead of a stale-data bug that only shows up after midnight.
60
+ */
61
+ export function templateInputs(databaseName, dbConfig, blueprint, isDefaultDatabase, today) {
62
+ return {
63
+ databaseName,
64
+ owner: new URL(dbConfig.url).username,
65
+ extensions: [...dbConfig.extensions].sort(),
66
+ migrationTable: dbConfig.migrationTable,
67
+ migrations: dbConfig.migrations === undefined ? null : hashMigrationsFolder(dbConfig.migrations),
68
+ trace: blueprint.trace ?? null,
69
+ audit: blueprint.audit ?? null,
70
+ isDefaultDatabase,
71
+ partitionDay: today.toISOString().slice(0, 10),
72
+ pipeworkVersion: VERSION,
73
+ formatVersion: TEMPLATE_FORMAT_VERSION,
74
+ };
75
+ }
76
+ /**
77
+ * The template's content fingerprint: 16 lowercase hex chars. Deliberately
78
+ * wider than the 12-char per-run nonce so a template name can never be mistaken
79
+ * for a run-owned database name.
80
+ */
81
+ export function templateFingerprint(inputs) {
82
+ return createHash('sha256').update(JSON.stringify(inputs)).digest('hex').slice(0, 16);
83
+ }
84
+ //# sourceMappingURL=fingerprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../src/test/fingerprint.ts"],"names":[],"mappings":"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"}
@@ -10,10 +10,22 @@ export declare function projectNamespace(): string;
10
10
  export declare function testDbPrefix(): string;
11
11
  /** Prefix for this project's per-run runtime (app) roles: `<project>_app_`. */
12
12
  export declare function appRolePrefix(): string;
13
+ /**
14
+ * Prefix for this project's shared, content-keyed templates: `<project>_tmpl_`.
15
+ *
16
+ * Templates sit in their own prefix rather than under `testDbPrefix()` because
17
+ * they have a different lifecycle and a different reaping rule: a per-run clone
18
+ * dies with its run, a template deliberately outlives every run that uses it
19
+ * and is dropped only once no run wants it. Separate prefixes keep the reaper's
20
+ * two passes from having to tell the names apart by shape. Issue #340.
21
+ */
22
+ export declare function templateDbPrefix(): string;
13
23
  /**
14
24
  * `LIKE` pattern matching every per-run test database of THIS project, with the
15
25
  * prefix underscores escaped so they match literally. The reaper uses it to
16
26
  * scope its sweep to its own namespace and never another project's databases.
17
27
  */
18
28
  export declare function testDbLikePattern(): string;
29
+ /** `LIKE` pattern matching every shared template of THIS project. */
30
+ export declare function templateDbLikePattern(): string;
19
31
  //# sourceMappingURL=namespace.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../src/test/namespace.ts"],"names":[],"mappings":"AAqBA;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAUrG;AAED,iEAAiE;AACjE,wBAAgB,gBAAgB,IAAI,MAAM,CAUzC;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,+EAA+E;AAC/E,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C"}
1
+ {"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../src/test/namespace.ts"],"names":[],"mappings":"AAqBA;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAUrG;AAED,iEAAiE;AACjE,wBAAgB,gBAAgB,IAAI,MAAM,CAUzC;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,+EAA+E;AAC/E,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,qEAAqE;AACrE,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C"}
@@ -54,6 +54,18 @@ export function testDbPrefix() {
54
54
  export function appRolePrefix() {
55
55
  return `${projectNamespace()}_app_`;
56
56
  }
57
+ /**
58
+ * Prefix for this project's shared, content-keyed templates: `<project>_tmpl_`.
59
+ *
60
+ * Templates sit in their own prefix rather than under `testDbPrefix()` because
61
+ * they have a different lifecycle and a different reaping rule: a per-run clone
62
+ * dies with its run, a template deliberately outlives every run that uses it
63
+ * and is dropped only once no run wants it. Separate prefixes keep the reaper's
64
+ * two passes from having to tell the names apart by shape. Issue #340.
65
+ */
66
+ export function templateDbPrefix() {
67
+ return `${projectNamespace()}_tmpl_`;
68
+ }
57
69
  /**
58
70
  * `LIKE` pattern matching every per-run test database of THIS project, with the
59
71
  * prefix underscores escaped so they match literally. The reaper uses it to
@@ -62,4 +74,8 @@ export function appRolePrefix() {
62
74
  export function testDbLikePattern() {
63
75
  return `${testDbPrefix().replace(/_/g, '\\_')}%`;
64
76
  }
77
+ /** `LIKE` pattern matching every shared template of THIS project. */
78
+ export function templateDbLikePattern() {
79
+ return `${templateDbPrefix().replace(/_/g, '\\_')}%`;
80
+ }
65
81
  //# sourceMappingURL=namespace.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../src/test/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,gEAAgE;AAChE,EAAE;AACF,6EAA6E;AAC7E,4EAA4E;AAC5E,8EAA8E;AAC9E,2EAA2E;AAC3E,8EAA8E;AAC9E,2EAA2E;AAC3E,4EAA4E;AAC5E,EAAE;AACF,oBAAoB;AACpB,4EAA4E;AAC5E,oEAAoE;AACpE,gFAAgF;AAChF,wDAAwD;AAExD,IAAI,MAAM,GAAkB,IAAI,CAAA;AAEhC;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAA+B,EAAE,OAA2B;IAC3F,MAAM,GAAG,GAAG,WAAW,KAAK,SAAS,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,WAAW;QAC9E,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO;YAC1D,CAAC,CAAC,UAAU,CAAA;IACd,0EAA0E;IAC1E,qEAAqE;IACrE,wEAAwE;IACxE,yEAAyE;IACzE,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;IACnF,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAA;AACpD,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,gBAAgB;IAC9B,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,MAAM,CAAA;IAClC,IAAI,OAA2B,CAAA;IAC/B,IAAI,CAAC;QACH,OAAO,GAAI,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAuB,CAAC,IAAI,CAAA;IAC9G,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;IAC3E,CAAC;IACD,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,OAAO,CAAC,CAAA;IAC1E,OAAO,MAAM,CAAA;AACf,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,YAAY;IAC1B,OAAO,GAAG,gBAAgB,EAAE,QAAQ,CAAA;AACtC,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,aAAa;IAC3B,OAAO,GAAG,gBAAgB,EAAE,OAAO,CAAA;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,GAAG,YAAY,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAA;AAClD,CAAC"}
1
+ {"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../src/test/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,gEAAgE;AAChE,EAAE;AACF,6EAA6E;AAC7E,4EAA4E;AAC5E,8EAA8E;AAC9E,2EAA2E;AAC3E,8EAA8E;AAC9E,2EAA2E;AAC3E,4EAA4E;AAC5E,EAAE;AACF,oBAAoB;AACpB,4EAA4E;AAC5E,oEAAoE;AACpE,gFAAgF;AAChF,wDAAwD;AAExD,IAAI,MAAM,GAAkB,IAAI,CAAA;AAEhC;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAA+B,EAAE,OAA2B;IAC3F,MAAM,GAAG,GAAG,WAAW,KAAK,SAAS,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,WAAW;QAC9E,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO;YAC1D,CAAC,CAAC,UAAU,CAAA;IACd,0EAA0E;IAC1E,qEAAqE;IACrE,wEAAwE;IACxE,yEAAyE;IACzE,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;IACnF,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAA;AACpD,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,gBAAgB;IAC9B,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,MAAM,CAAA;IAClC,IAAI,OAA2B,CAAA;IAC/B,IAAI,CAAC;QACH,OAAO,GAAI,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAuB,CAAC,IAAI,CAAA;IAC9G,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;IAC3E,CAAC;IACD,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,OAAO,CAAC,CAAA;IAC1E,OAAO,MAAM,CAAA;AACf,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,YAAY;IAC1B,OAAO,GAAG,gBAAgB,EAAE,QAAQ,CAAA;AACtC,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,aAAa;IAC3B,OAAO,GAAG,gBAAgB,EAAE,OAAO,CAAA;AACrC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,GAAG,gBAAgB,EAAE,QAAQ,CAAA;AACtC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,GAAG,YAAY,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAA;AAClD,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,qBAAqB;IACnC,OAAO,GAAG,gBAAgB,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAA;AACtD,CAAC"}
@@ -10,6 +10,8 @@ export interface ReapResult {
10
10
  * SIGKILL, reboot). The reaper reads "lock is free" as "owning run is dead".
11
11
  */
12
12
  export declare function runLockKey(nonce: string): bigint;
13
+ export declare function templateUseKey(fingerprint: string): bigint;
14
+ export declare function templateBuildKey(fingerprint: string): bigint;
13
15
  /** Admin (`/postgres`) connection URL for a database URL. */
14
16
  export declare function getAdminUrl(databaseUrl: string): string;
15
17
  /**
@@ -24,7 +26,7 @@ export declare function getAdminUrl(databaseUrl: string): string;
24
26
  * Both conditions only ever make the reaper more conservative, so it can
25
27
  * never drop a database belonging to a live or still-provisioning run.
26
28
  */
27
- export declare function reapOrphanTestDatabases(admin: postgres.Sql): Promise<ReapResult>;
29
+ export declare function reapOrphanTestDatabases(admin: postgres.Sql, liveTemplates?: ReadonlySet<string>): Promise<ReapResult>;
28
30
  /**
29
31
  * Reap orphan test databases across every Postgres server referenced by the
30
32
  * manifold's database config. Used by `pipework test --reap`.
@@ -1 +1 @@
1
- {"version":3,"file":"reap.d.ts","sourceRoot":"","sources":["../../src/test/reap.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAUnD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAA;CAC7C;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,6DAA6D;AAC7D,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAIvD;AAMD;;;;;;;;;;;GAWG;AACH,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CA0BtF;AAED;;;GAGG;AACH,wBAAsB,2BAA2B,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAgBzF"}
1
+ {"version":3,"file":"reap.d.ts","sourceRoot":"","sources":["../../src/test/reap.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAgBnD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAA;CAC7C;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AA0BD,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,6DAA6D;AAC7D,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAIvD;AAcD;;;;;;;;;;;GAWG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,QAAQ,CAAC,GAAG,EACnB,aAAa,GAAE,WAAW,CAAC,MAAM,CAAa,GAC7C,OAAO,CAAC,UAAU,CAAC,CA2BrB;AA4DD;;;GAGG;AACH,wBAAsB,2BAA2B,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAgBzF"}
package/dist/test/reap.js CHANGED
@@ -1,6 +1,7 @@
1
+ import { createHash } from 'node:crypto';
1
2
  import postgres from 'postgres';
2
3
  import { quoteIdentifier } from '../data/db/identifiers.js';
3
- import { testDbPrefix, appRolePrefix, testDbLikePattern } from './namespace.js';
4
+ import { testDbPrefix, appRolePrefix, testDbLikePattern, templateDbPrefix, templateDbLikePattern, } from './namespace.js';
4
5
  // Per-run test database and role names end with `_<pid>_<nonce>`, where the
5
6
  // nonce is 12 random hex chars. The reaper recovers the nonce from a database
6
7
  // name to rebuild that run's advisory-lock key.
@@ -14,6 +15,35 @@ const NONCE_SUFFIX = /_([0-9a-f]{12})$/;
14
15
  export function runLockKey(nonce) {
15
16
  return BigInt('0x' + nonce);
16
17
  }
18
+ /**
19
+ * Advisory-lock keys for a shared template, derived from its content
20
+ * fingerprint. Both are salted hashes truncated to 60 bits, which keeps them
21
+ * inside a signed `bigint` and makes an accidental collision with a 48-bit run
22
+ * lock key or with each other a non-event.
23
+ *
24
+ * Two keys, because the two things being coordinated are different:
25
+ *
26
+ * - the USE key is taken in SHARE mode by every process that intends to clone
27
+ * the template, for that process's whole life, and in EXCLUSIVE mode by the
28
+ * reaper. That is what stops a reaper from dropping a template between
29
+ * another process's readiness check and its `CREATE DATABASE ... WITH
30
+ * TEMPLATE`: the reaper simply cannot get the lock while anyone holds it.
31
+ * - the BUILD key is taken in EXCLUSIVE mode only while building, so that N
32
+ * processes starting at once produce one template and one migration replay
33
+ * rather than N. It is separate because advisory locks do not upgrade from
34
+ * share to exclusive, and a builder must keep its own pin while it builds.
35
+ *
36
+ * Issue #340.
37
+ */
38
+ function templateLockKey(salt, fingerprint) {
39
+ return BigInt('0x' + createHash('sha256').update(`${salt}:${fingerprint}`).digest('hex').slice(0, 15));
40
+ }
41
+ export function templateUseKey(fingerprint) {
42
+ return templateLockKey('pipework-template-use', fingerprint);
43
+ }
44
+ export function templateBuildKey(fingerprint) {
45
+ return templateLockKey('pipework-template-build', fingerprint);
46
+ }
17
47
  /** Admin (`/postgres`) connection URL for a database URL. */
18
48
  export function getAdminUrl(databaseUrl) {
19
49
  const url = new URL(databaseUrl);
@@ -23,6 +53,12 @@ export function getAdminUrl(databaseUrl) {
23
53
  function pairedRoleName(datname) {
24
54
  return appRolePrefix() + datname.slice(testDbPrefix().length);
25
55
  }
56
+ /** A shared template's app role is content-keyed the same way the template is. */
57
+ function pairedTemplateRoleName(datname) {
58
+ return appRolePrefix() + datname.slice(templateDbPrefix().length);
59
+ }
60
+ /** Content fingerprint trailing a shared template's name: 16 lowercase hex. */
61
+ const TEMPLATE_FINGERPRINT_SUFFIX = /_([0-9a-f]{16})$/;
26
62
  /**
27
63
  * Drop test databases left behind by runs that never reached teardown
28
64
  * (Ctrl-C, timeout, crash). A database is reaped only when BOTH hold:
@@ -35,7 +71,7 @@ function pairedRoleName(datname) {
35
71
  * Both conditions only ever make the reaper more conservative, so it can
36
72
  * never drop a database belonging to a live or still-provisioning run.
37
73
  */
38
- export async function reapOrphanTestDatabases(admin) {
74
+ export async function reapOrphanTestDatabases(admin, liveTemplates = new Set()) {
39
75
  const rows = await admin `
40
76
  SELECT datname, numbackends
41
77
  FROM pg_stat_database
@@ -61,6 +97,63 @@ export async function reapOrphanTestDatabases(admin) {
61
97
  }
62
98
  }
63
99
  }
100
+ droppedDatabases.push(...(await reapStaleTemplates(admin, liveTemplates)).droppedDatabases);
101
+ return { droppedDatabases };
102
+ }
103
+ /**
104
+ * Drop shared templates nobody wants any more.
105
+ *
106
+ * A template is deliberately long-lived — it survives the run that built it, so
107
+ * the next run clones instead of replaying migrations (#340) — which means
108
+ * "left behind by a dead run" is no longer a reason to drop one. The two
109
+ * reasons that remain:
110
+ *
111
+ * - it is not in `liveTemplates`, the set of content keys the calling run
112
+ * actually intends to use. Editing a migration changes the key, so the
113
+ * template built from the old migrations is named something nobody will ask
114
+ * for again. That is what makes invalidation automatic rather than manual.
115
+ * - nobody holds its use lock, in any mode. Every process that intends to
116
+ * clone a template holds that lock in SHARE mode for its whole life, so
117
+ * failing to take it EXCLUSIVE means no live process is cloning from it —
118
+ * including no process sitting between a readiness check and its `CREATE
119
+ * DATABASE ... WITH TEMPLATE`.
120
+ *
121
+ * `numbackends = 0` is required as well, for the same conservatism as clones.
122
+ *
123
+ * An empty `liveTemplates` — what `pipework test --reap` passes — therefore
124
+ * means "drop every template not currently in use", which is the right reading
125
+ * of an explicit cleanup command.
126
+ */
127
+ async function reapStaleTemplates(admin, liveTemplates) {
128
+ const rows = await admin `
129
+ SELECT datname, numbackends
130
+ FROM pg_stat_database
131
+ WHERE datname LIKE ${templateDbLikePattern()}
132
+ `;
133
+ const droppedDatabases = [];
134
+ for (const { datname, numbackends } of rows) {
135
+ if (numbackends > 0)
136
+ continue;
137
+ if (liveTemplates.has(datname))
138
+ continue;
139
+ const fingerprint = TEMPLATE_FINGERPRINT_SUFFIX.exec(datname)?.[1];
140
+ // A name in the template namespace without a fingerprint was not written by
141
+ // this scheme. Leave it alone rather than guess at its owner.
142
+ if (fingerprint === undefined)
143
+ continue;
144
+ const key = templateUseKey(fingerprint);
145
+ if (!(await tryAcquire(admin, key)))
146
+ continue;
147
+ try {
148
+ if (await dropDatabase(admin, datname)) {
149
+ droppedDatabases.push(datname);
150
+ await dropRole(admin, pairedTemplateRoleName(datname));
151
+ }
152
+ }
153
+ finally {
154
+ await admin `SELECT pg_advisory_unlock(${key.toString()}::bigint)`;
155
+ }
156
+ }
64
157
  return { droppedDatabases };
65
158
  }
66
159
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"reap.js","sourceRoot":"","sources":["../../src/test/reap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reap.js","sourceRoot":"","sources":["../../src/test/reap.ts"],"names":[],"mappings":"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"}
@@ -17,4 +17,12 @@ export declare function withTemplateRetry<T>(attempt: () => Promise<T>, sleep?:
17
17
  export declare function teardownTestDatabases(): Promise<void>;
18
18
  export declare function getTestDatabase(name: string): TestDatabase | undefined;
19
19
  export declare function getTestDatabases(): ReadonlyMap<string, TestDatabase>;
20
+ /**
21
+ * Forget the in-process template cache, so the next `setupTestDatabases` takes
22
+ * the same path a freshly-forked worker takes: shared lock, readiness check,
23
+ * clone. This is how a single process can prove the cross-process claim — that
24
+ * a second fork reuses the template rather than rebuilding it — without
25
+ * actually forking. Test-only. Issue #340.
26
+ */
27
+ export declare function forgetTemplateCacheForTests(): void;
20
28
  //# sourceMappingURL=setup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/test/setup.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAUnD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAA;CACjB;AAyCD,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAiC/F;AAuLD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACzB,KAAK,GAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAyD,EAC5F,QAAQ,GAAE,SAAS,MAAM,EAA6B,GACrD,OAAO,CAAC,CAAC,CAAC,CASZ;AA4ED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAuB3D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEtE;AAED,wBAAgB,gBAAgB,IAAI,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAEpE"}
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/test/setup.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAWnD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAA;CACjB;AAoED,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAqD/F;AAiSD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACzB,KAAK,GAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAyD,EAC5F,QAAQ,GAAE,SAAS,MAAM,EAA6B,GACrD,OAAO,CAAC,CAAC,CAAC,CASZ;AA4ED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAuB3D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEtE;AAED,wBAAgB,gBAAgB,IAAI,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAEpE;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,IAAI,IAAI,CAElD"}
@@ -7,8 +7,13 @@ import { applyMigrations } from '../data/migrate/apply.js';
7
7
  import { missingQueueTables, queueTableMessage } from '../core/validation/queue-tables.js';
8
8
  import { probeRlsRole, rlsProbeTarget, rlsRoleMessage } from '../core/validation/rls-role.js';
9
9
  import { provisionFrameworkTables } from '../data/migrate/provision-framework.js';
10
- import { getAdminUrl, reapOrphanTestDatabases, runLockKey } from './reap.js';
11
- import { testDbPrefix, appRolePrefix } from './namespace.js';
10
+ import { getAdminUrl, reapOrphanTestDatabases, runLockKey, templateBuildKey, templateUseKey } from './reap.js';
11
+ import { testDbPrefix, appRolePrefix, templateDbPrefix } from './namespace.js';
12
+ import { templateFingerprint, templateInputs } from './fingerprint.js';
13
+ // Marker table written inside a template as the last act of a successful build.
14
+ // A template database that exists without this row is the wreckage of a builder
15
+ // that died mid-migration: it must be rebuilt, never cloned.
16
+ const TEMPLATE_MARKER_TABLE = 'pipework_test_template';
12
17
  const testDatabases = new Map();
13
18
  const templates = new Map();
14
19
  let adminClient = null;
@@ -19,18 +24,20 @@ const runNonce = randomBytes(6).toString('hex');
19
24
  let lockClient = null;
20
25
  let reaped = false;
21
26
  let workerShutdownArmed = false;
22
- function templateDbName(baseName) {
23
- return `${testDbPrefix()}${baseName}_tmpl_${process.pid}_${runNonce}`;
27
+ function templateDbName(baseName, fingerprint) {
28
+ return `${templateDbPrefix()}${baseName}_${fingerprint}`;
24
29
  }
25
30
  function testDbName(baseName) {
26
31
  return `${testDbPrefix()}${baseName}_${process.pid}_${runNonce}`;
27
32
  }
28
33
  // The app role is named to match what the orphan reaper derives from the
29
- // *template* database name (`reap.ts` `pairedRoleName`): the template outlives
30
- // every per-file clone, so when the reaper drops a leaked template it drops
31
- // this role with it. Without the `_tmpl_` segment the role would leak forever.
32
- function appRoleName(baseName) {
33
- return `${appRolePrefix()}${baseName}_tmpl_${process.pid}_${runNonce}`;
34
+ // *template* database name (`reap.ts` `pairedTemplateRoleName`): the template
35
+ // outlives every per-file clone and every run, so when the reaper finally drops
36
+ // a stale template it drops this role with it. The role must be content-keyed
37
+ // too — its grants are baked into the template's catalog by OID, so a template
38
+ // shared across processes needs a role shared across processes.
39
+ function appRoleName(baseName, fingerprint) {
40
+ return `${appRolePrefix()}${baseName}_${fingerprint}`;
34
41
  }
35
42
  export async function setupTestDatabases(instance) {
36
43
  const databases = [...instance.config.databases()];
@@ -50,25 +57,42 @@ export async function setupTestDatabases(instance) {
50
57
  throw new Error(`[pipework] Test bootstrap failed:\n\n ${rlsRoleMessage(name, probe)}\n`);
51
58
  }
52
59
  }
60
+ // Template identities are pure functions of config and migration content, so
61
+ // they are computed before any connection opens — the reaper needs the set of
62
+ // templates this run intends to use before it decides which templates are
63
+ // stale enough to drop.
64
+ const today = new Date();
65
+ const defaultName = instance.config.databaseNames()[0];
66
+ const plans = databases.map(([name, dbConfig]) => {
67
+ const fingerprint = templateFingerprint(templateInputs(name, dbConfig, instance.config.raw, name === defaultName, today));
68
+ return {
69
+ name,
70
+ dbConfig,
71
+ fingerprint,
72
+ templateDb: templateDbName(name, fingerprint),
73
+ appRole: appRoleName(name, fingerprint),
74
+ isDefaultDatabase: name === defaultName,
75
+ };
76
+ });
53
77
  const firstDb = databases[0];
54
78
  if (firstDb !== undefined) {
55
- await prepareRun(getAdminUrl(firstDb[1].url));
79
+ await prepareRun(getAdminUrl(firstDb[1].url), new Set(plans.map(plan => plan.templateDb)));
56
80
  }
57
- for (const [name, dbConfig] of databases) {
58
- const template = await ensureTemplate(instance, name, dbConfig);
59
- const testDb = await cloneTestDatabase(name, dbConfig, template);
60
- testDatabases.set(name, testDb);
81
+ for (const plan of plans) {
82
+ const template = await ensureTemplate(instance, plan);
83
+ const testDb = await cloneTestDatabase(plan.name, plan.dbConfig, template);
84
+ testDatabases.set(plan.name, testDb);
61
85
  }
62
86
  return testDatabases;
63
87
  }
64
88
  // Acquire this run's advisory lock and reap orphans before provisioning. The
65
89
  // lock is taken before the first CREATE DATABASE so a concurrent run's reaper
66
90
  // can never mistake this run's freshly-created, backend-less databases — the
67
- // per-process template included — for orphans. It is held on a dedicated
91
+ // per-run clones included — for orphans. It is held on a dedicated
68
92
  // connection (idle/lifetime timeouts off) so Postgres releases it only when
69
93
  // this process dies, and is never unlocked per file: the template outlives
70
94
  // every file's database, so the lock that protects it must outlive them too.
71
- async function prepareRun(adminUrl) {
95
+ async function prepareRun(adminUrl, liveTemplates) {
72
96
  if (adminClient === null) {
73
97
  adminClient = postgres(adminUrl, { max: 1, onnotice: () => { } });
74
98
  }
@@ -80,23 +104,127 @@ async function prepareRun(adminUrl) {
80
104
  if (!reaped) {
81
105
  reaped = true;
82
106
  try {
83
- await reapOrphanTestDatabases(adminClient);
107
+ await reapOrphanTestDatabases(adminClient, liveTemplates);
84
108
  }
85
109
  catch {
86
110
  // Reaping is best effort — never let stale-orphan cleanup break setup.
87
111
  }
88
112
  }
89
113
  }
90
- // Build the per-process template for one database, once. Subsequent test files
91
- // hit the cache and skip straight to cloning. Issue #321.
92
- async function ensureTemplate(instance, name, dbConfig) {
93
- const cached = templates.get(name);
114
+ /**
115
+ * Get the shared template for one database, building it only if no process has
116
+ * built it yet.
117
+ *
118
+ * The protocol, in order, and the order is the point:
119
+ *
120
+ * 1. Take a SHARED advisory lock on the template's content key, on this run's
121
+ * lifetime connection. That pins the template: the reaper drops a template
122
+ * only under an EXCLUSIVE lock, so from here until this process dies, no
123
+ * reaper can pull the template out from under a clone.
124
+ * 2. Ask whether the template is ready. Because the pin is already held, a
125
+ * `yes` cannot go stale.
126
+ * 3. If not ready, take an EXCLUSIVE lock on the separate BUILD key and ask
127
+ * again — a concurrent builder may have finished while we waited — then
128
+ * build. Two processes starting together therefore converge on one
129
+ * template, and the loser pays a wait rather than a second migration replay.
130
+ *
131
+ * There is deliberately no fallback: if the shared template cannot be built or
132
+ * validated, setup fails loudly. Quietly reverting to a private per-process
133
+ * build would re-hide exactly the cost this exists to remove. Issue #340.
134
+ */
135
+ async function ensureTemplate(instance, plan) {
136
+ const cached = templates.get(plan.name);
94
137
  if (cached !== undefined)
95
138
  return cached;
96
- const templateDb = templateDbName(name);
139
+ const useKey = templateUseKey(plan.fingerprint).toString();
140
+ const buildKey = templateBuildKey(plan.fingerprint).toString();
141
+ await lockClient `SELECT pg_advisory_lock_shared(${useKey}::bigint)`;
142
+ if (!await templateIsReady(plan)) {
143
+ await lockClient `SELECT pg_advisory_lock(${buildKey}::bigint)`;
144
+ try {
145
+ if (!await templateIsReady(plan)) {
146
+ await buildTemplate(instance, plan);
147
+ }
148
+ }
149
+ finally {
150
+ await lockClient `SELECT pg_advisory_unlock(${buildKey}::bigint)`;
151
+ }
152
+ }
153
+ // Checked on every process, not just the one that happened to build. A
154
+ // template is keyed by the migrations that made it; the QUEUES a manifold
155
+ // registers are not part of that key, so two instances can legitimately share
156
+ // one template while disagreeing about which queue tables must exist. Running
157
+ // this only inside the build would make the check depend on who got there
158
+ // first — which is to say, it would silently stop running.
159
+ await assertQueueTables(instance, plan);
160
+ const template = {
161
+ templateDb: plan.templateDb,
162
+ appRole: plan.appRole,
163
+ fingerprint: plan.fingerprint,
164
+ };
165
+ templates.set(plan.name, template);
166
+ return template;
167
+ }
168
+ // D2 loudness at test bootstrap: a registered queue whose table did not come
169
+ // out of the migrations would otherwise fail at first insert, deep in a test.
170
+ // Checked on the database queue migrations are emitted into — the sole
171
+ // database, or the declared defaultDatabase (same rule as startup validation).
172
+ async function assertQueueTables(instance, plan) {
173
+ const declaredNames = instance.config.databaseNames();
174
+ const queueDbName = declaredNames.length === 1 ? declaredNames[0] : instance.config.raw.defaultDatabase;
175
+ if (plan.name !== queueDbName)
176
+ return;
177
+ const missing = await missingQueueTables(siblingUrl(plan.dbConfig, plan.templateDb));
178
+ if (missing.length > 0) {
179
+ throw new Error(`[pipework] Test bootstrap failed:\n\n` +
180
+ missing.map(table => ` ${queueTableMessage(table, plan.name)}`).join('\n') + '\n');
181
+ }
182
+ }
183
+ /** Connection URL for a database on the same server as `dbConfig.url`. */
184
+ function siblingUrl(dbConfig, database) {
185
+ const url = new URL(dbConfig.url);
186
+ url.pathname = `/${database}`;
187
+ return url.toString();
188
+ }
189
+ /**
190
+ * Is this template complete and usable?
191
+ *
192
+ * A missing database, an unreachable one, or one without the marker row all
193
+ * answer `false` — the caller then rebuilds it under the exclusive build lock.
194
+ * That is recovery from a half-built template, not a fallback to per-process
195
+ * building: the result is still the one shared template every process uses.
196
+ */
197
+ async function templateIsReady(plan) {
198
+ const client = postgres(siblingUrl(plan.dbConfig, plan.templateDb), {
199
+ max: 1,
200
+ onnotice: () => { },
201
+ connect_timeout: 10,
202
+ });
203
+ try {
204
+ const rows = await client `
205
+ SELECT fingerprint FROM ${client(TEMPLATE_MARKER_TABLE)} LIMIT 1
206
+ `;
207
+ return rows[0]?.fingerprint === plan.fingerprint;
208
+ }
209
+ catch {
210
+ // Database absent, still being built, or missing its marker table.
211
+ return false;
212
+ }
213
+ finally {
214
+ await client.end();
215
+ }
216
+ }
217
+ // Build one shared template from scratch. Runs under the exclusive build lock,
218
+ // with this process's shared use-lock already held. Issue #321, #340.
219
+ async function buildTemplate(instance, plan) {
220
+ const { dbConfig } = plan;
221
+ const templateDb = plan.templateDb;
97
222
  const templateIdent = quoteIdentifier(templateDb, 'database');
98
223
  const admin = drizzle(adminClient);
99
- await admin.execute(sql.raw(`DROP DATABASE IF EXISTS ${templateIdent}`));
224
+ // A template database that exists at this point failed its readiness check —
225
+ // the leftovers of a builder that died. Drop and start over.
226
+ await closeTemplateClients(admin, templateDb);
227
+ await withTemplateRetry(() => admin.execute(sql.raw(`DROP DATABASE IF EXISTS ${templateIdent}`)));
100
228
  await admin.execute(sql.raw(`CREATE DATABASE ${templateIdent}`));
101
229
  // #325: a test database is dropped or rolled back — durable commits are pure
102
230
  // overhead. `synchronous_commit` is a per-database setting and does not copy
@@ -121,21 +249,6 @@ async function ensureTemplate(instance, name, dbConfig) {
121
249
  unloggedTables: true,
122
250
  });
123
251
  }
124
- // D2 loudness at test bootstrap: a registered queue whose table did not come
125
- // out of the migrations above would otherwise fail at first insert, deep in
126
- // a test. Checked on the database queue migrations are emitted into — the
127
- // sole database, or the declared defaultDatabase (same rule as startup
128
- // validation).
129
- const declaredNames = instance.config.databaseNames();
130
- const queueDbName = declaredNames.length === 1 ? declaredNames[0] : instance.config.raw.defaultDatabase;
131
- if (name === queueDbName) {
132
- const missing = await missingQueueTables(templateUrlStr);
133
- if (missing.length > 0) {
134
- await templateClient.end();
135
- throw new Error(`[pipework] Test bootstrap failed:\n\n` +
136
- missing.map(table => ` ${queueTableMessage(table, name)}`).join('\n') + '\n');
137
- }
138
- }
139
252
  // Framework-owned partitioned tables (trace family) are kept out of app
140
253
  // migrations (#313) — pipework creates them and their day partitions here so
141
254
  // a traced test never hits a missing relation or a missing partition.
@@ -144,15 +257,21 @@ async function ensureTemplate(instance, name, dbConfig) {
144
257
  errorRetentionDays: instance.config.trace.errorRetentionDays,
145
258
  auditRetentionDays: instance.config.audit.retentionDays,
146
259
  partitionLeadDays: instance.config.trace.partitionLeadDays,
147
- }, name === instance.config.databaseNames()[0]);
260
+ }, plan.isDefaultDatabase);
261
+ // The marker is written last, and its presence is what makes this template
262
+ // clonable by any other process. Everything above must have succeeded first;
263
+ // a builder that dies before this point leaves a database that every reader
264
+ // correctly refuses to clone.
265
+ await templateDbHandle.execute(sql.raw(`CREATE TABLE ${quoteIdentifier(TEMPLATE_MARKER_TABLE, 'table')} (` +
266
+ `fingerprint text PRIMARY KEY, built_at timestamptz NOT NULL DEFAULT now(), builder_pid integer NOT NULL)`));
267
+ await templateDbHandle.execute(sql `
268
+ INSERT INTO ${sql.identifier(TEMPLATE_MARKER_TABLE)} (fingerprint, builder_pid)
269
+ VALUES (${plan.fingerprint}, ${process.pid})
270
+ `);
148
271
  await templateClient.end();
149
- const appRole = appRoleName(name);
150
- await provisionTemplateRole(adminClient, templateUrlStr, appRole);
151
- const template = { templateDb, appRole };
152
- templates.set(name, template);
153
- return template;
272
+ await provisionTemplateRole(adminClient, templateUrlStr, plan.appRole);
154
273
  }
155
- // Clone one test file's database from the per-process template. A clone copies
274
+ // Clone one test file's database from the shared template. A clone copies
156
275
  // the template's tables, partitions, and in-database grants; only the cluster
157
276
  // catalog's CONNECT privilege has to be re-granted on the new database. Issue #321.
158
277
  async function cloneTestDatabase(name, dbConfig, template) {
@@ -182,12 +301,16 @@ async function cloneTestDatabase(name, dbConfig, template) {
182
301
  database: dbName,
183
302
  };
184
303
  }
185
- // Close our own straggler client connections to the template so the clone can
186
- // proceed. Two guards keep this from aborting the clone:
304
+ // Close straggler client connections to the template so the clone can proceed.
305
+ // Three guards keep this from aborting the clone — or from sabotaging a peer:
187
306
  // - `backend_type = 'client backend'` excludes background workers. An
188
307
  // autovacuum worker attaches to every database and runs as superuser, and a
189
308
  // non-superuser test role cannot signal it — targeting it would raise
190
309
  // `permission denied to terminate process` (42501) and abort the statement.
310
+ // - `state = 'idle'` excludes backends doing work. The template is now shared
311
+ // across processes (#340), so an active backend may be another run's
312
+ // builder or readiness check rather than a leak of ours; an idle one is
313
+ // doing nothing and its owner reconnects transparently.
191
314
  // - best-effort: if a client backend is still unkillable (owned by a role we
192
315
  // cannot signal), swallow it. The `CREATE` retry waits out whatever remains.
193
316
  async function closeTemplateClients(admin, templateDb) {
@@ -198,6 +321,7 @@ async function closeTemplateClients(admin, templateDb) {
198
321
  WHERE datname = ${templateDb}
199
322
  AND pid <> pg_backend_pid()
200
323
  AND backend_type = 'client backend'
324
+ AND state = 'idle'
201
325
  `);
202
326
  }
203
327
  catch {
@@ -255,9 +379,9 @@ async function provisionTemplateRole(client, templateUrl, roleName) {
255
379
  }
256
380
  // Close this run's persistent admin and lock connections. Releasing
257
381
  // `lockClient` drops the run's advisory lock — so this runs exactly once, at
258
- // worker shutdown, never per file: the lock guards the per-process template
259
- // against a sibling worker's orphan reaper, and the template outlives every
260
- // file, so the lock must outlive every file too.
382
+ // worker shutdown, never per file: these connections hold the run's advisory
383
+ // lock and this run's shared pin on every template it uses, and both must
384
+ // outlive every file in the worker.
261
385
  async function closeRunConnections() {
262
386
  if (adminClient !== null) {
263
387
  await adminClient.end();
@@ -288,9 +412,9 @@ function armWorkerShutdown() {
288
412
  });
289
413
  }
290
414
  }
291
- // Drop this file's clones. The per-process template and its app role
292
- // deliberately outlive teardown — the next file reuses the template, and the
293
- // next run's reaper eventually drops them. The run's admin and lock
415
+ // Drop this file's clones. The shared template and its app role deliberately
416
+ // outlive teardown — the next file, the next process, and the next run all
417
+ // reuse it, and a reaper drops it only once its content key goes stale (#340). The run's admin and lock
294
418
  // connections also survive: `lockClient` holds the advisory lock that protects
295
419
  // the live template from a sibling worker's reaper, so it must stay open for
296
420
  // the worker's whole life — `armWorkerShutdown` closes both once, at worker
@@ -324,4 +448,14 @@ export function getTestDatabase(name) {
324
448
  export function getTestDatabases() {
325
449
  return testDatabases;
326
450
  }
451
+ /**
452
+ * Forget the in-process template cache, so the next `setupTestDatabases` takes
453
+ * the same path a freshly-forked worker takes: shared lock, readiness check,
454
+ * clone. This is how a single process can prove the cross-process claim — that
455
+ * a second fork reuses the template rather than rebuilding it — without
456
+ * actually forking. Test-only. Issue #340.
457
+ */
458
+ export function forgetTemplateCacheForTests() {
459
+ templates.clear();
460
+ }
327
461
  //# sourceMappingURL=setup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/test/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAA;AAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,wBAAwB,CAAA;AAG5C,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAA;AAC1F,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAC7F,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAA;AACjF,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAC5E,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAsB5D,MAAM,aAAa,GAAG,IAAI,GAAG,EAAwB,CAAA;AACrD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAA;AAC7C,IAAI,WAAW,GAAwB,IAAI,CAAA;AAE3C,6EAA6E;AAC7E,8EAA8E;AAC9E,6EAA6E;AAC7E,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AAC/C,IAAI,UAAU,GAAwB,IAAI,CAAA;AAC1C,IAAI,MAAM,GAAG,KAAK,CAAA;AAClB,IAAI,mBAAmB,GAAG,KAAK,CAAA;AAE/B,SAAS,cAAc,CAAC,QAAgB;IACtC,OAAO,GAAG,YAAY,EAAE,GAAG,QAAQ,SAAS,OAAO,CAAC,GAAG,IAAI,QAAQ,EAAE,CAAA;AACvE,CAAC;AAED,SAAS,UAAU,CAAC,QAAgB;IAClC,OAAO,GAAG,YAAY,EAAE,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,IAAI,QAAQ,EAAE,CAAA;AAClE,CAAC;AAED,yEAAyE;AACzE,+EAA+E;AAC/E,4EAA4E;AAC5E,+EAA+E;AAC/E,SAAS,WAAW,CAAC,QAAgB;IACnC,OAAO,GAAG,aAAa,EAAE,GAAG,QAAQ,SAAS,OAAO,CAAC,GAAG,IAAI,QAAQ,EAAE,CAAA;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,QAAkB;IACzD,MAAM,SAAS,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAA;IAElD,wEAAwE;IACxE,4EAA4E;IAC5E,yEAAyE;IACzE,2EAA2E;IAC3E,wEAAwE;IACxE,yEAAyE;IACzE,0EAA0E;IAC1E,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,SAAS,EAAE,CAAC;QACzC,IAAI,QAAQ,CAAC,GAAG,KAAK,SAAS;YAAE,SAAQ;QACxC,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAA;QAChF,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAA;QACxC,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CACb,0CAA0C,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAC1E,CAAA;QACH,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;IAC5B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IAC/C,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,SAAS,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;QAC/D,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;QAChE,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACjC,CAAC;IAED,OAAO,aAAa,CAAA;AACtB,CAAC;AAED,6EAA6E;AAC7E,8EAA8E;AAC9E,6EAA6E;AAC7E,yEAAyE;AACzE,4EAA4E;AAC5E,2EAA2E;AAC3E,6EAA6E;AAC7E,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACzB,WAAW,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAA;IAClE,CAAC;IACD,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,UAAU,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAA;QACjG,MAAM,UAAU,CAAA,2BAA2B,UAAU,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAA;IACvF,CAAC;IACD,iBAAiB,EAAE,CAAA;IACnB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,IAAI,CAAA;QACb,IAAI,CAAC;YACH,MAAM,uBAAuB,CAAC,WAAW,CAAC,CAAA;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,uEAAuE;QACzE,CAAC;IACH,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,0DAA0D;AAC1D,KAAK,UAAU,cAAc,CAAC,QAAkB,EAAE,IAAY,EAAE,QAA0B;IACxF,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAClC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAA;IAEvC,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAA;IACvC,MAAM,aAAa,GAAG,eAAe,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;IAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,WAAY,CAAC,CAAA;IAEnC,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,2BAA2B,aAAa,EAAE,CAAC,CAAC,CAAA;IACxE,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,mBAAmB,aAAa,EAAE,CAAC,CAAC,CAAA;IAChE,6EAA6E;IAC7E,6EAA6E;IAC7E,yEAAyE;IACzE,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,kBAAkB,aAAa,+BAA+B,CAAC,CAAC,CAAA;IAE5F,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;IACzC,WAAW,CAAC,QAAQ,GAAG,IAAI,UAAU,EAAE,CAAA;IACvC,MAAM,cAAc,GAAG,WAAW,CAAC,QAAQ,EAAE,CAAA;IAE7C,MAAM,cAAc,GAAG,QAAQ,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAA;IAC/E,MAAM,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;IAEhD,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;YACtC,MAAM,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,kCAAkC,eAAe,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,CAAA;QAChH,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACtC,MAAM,eAAe,CAAC;YACpB,gBAAgB,EAAE,QAAQ,CAAC,UAAU;YACrC,eAAe,EAAE,QAAQ,CAAC,cAAc;YACxC,aAAa,EAAE,cAAc;YAC7B,iBAAiB,EAAE,IAAI;YACvB,cAAc,EAAE,IAAI;SACrB,CAAC,CAAA;IACJ,CAAC;IAED,6EAA6E;IAC7E,4EAA4E;IAC5E,0EAA0E;IAC1E,uEAAuE;IACvE,eAAe;IACf,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,CAAA;IACrD,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAA;IACvG,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,cAAc,CAAC,CAAA;QACxD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,cAAc,CAAC,GAAG,EAAE,CAAA;YAC1B,MAAM,IAAI,KAAK,CACb,uCAAuC;gBACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAC9E,CAAA;QACH,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,6EAA6E;IAC7E,sEAAsE;IACtE,MAAM,wBAAwB,CAC5B,gBAAgB,EAChB,QAAQ,CAAC,MAAM,CAAC,GAAG,EACnB;QACE,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB;QACxD,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB;QAC5D,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa;QACvD,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB;KAC3D,EACD,IAAI,KAAK,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAC5C,CAAA;IAED,MAAM,cAAc,CAAC,GAAG,EAAE,CAAA;IAE1B,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;IACjC,MAAM,qBAAqB,CAAC,WAAY,EAAE,cAAc,EAAE,OAAO,CAAC,CAAA;IAElE,MAAM,QAAQ,GAAa,EAAE,UAAU,EAAE,OAAO,EAAE,CAAA;IAClD,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC7B,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,+EAA+E;AAC/E,8EAA8E;AAC9E,oFAAoF;AACpF,KAAK,UAAU,iBAAiB,CAAC,IAAY,EAAE,QAA0B,EAAE,QAAkB;IAC3F,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IAC/B,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IACnD,MAAM,aAAa,GAAG,eAAe,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;IACtE,MAAM,SAAS,GAAG,eAAe,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,WAAY,CAAC,CAAA;IAEnC,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,2BAA2B,OAAO,EAAE,CAAC,CAAC,CAAA;IAClE,4EAA4E;IAC5E,8EAA8E;IAC9E,6EAA6E;IAC7E,MAAM,oBAAoB,CAAC,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAA;IACtD,MAAM,iBAAiB,CAAC,GAAG,EAAE,CAC3B,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,mBAAmB,OAAO,kBAAkB,aAAa,EAAE,CAAC,CAAC,CACpF,CAAA;IACD,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,kBAAkB,OAAO,+BAA+B,CAAC,CAAC,CAAA;IACtF,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,6BAA6B,OAAO,OAAO,SAAS,EAAE,CAAC,CAAC,CAAA;IAEpF,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;IACrC,OAAO,CAAC,QAAQ,GAAG,IAAI,MAAM,EAAE,CAAA;IAE/B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC1C,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAA;IAClC,MAAM,CAAC,QAAQ,GAAG,eAAe,CAAA;IAEjC,OAAO;QACL,IAAI;QACJ,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE;QACvB,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE;QACzB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,QAAQ,EAAE,MAAM;KACjB,CAAA;AACH,CAAC;AAED,8EAA8E;AAC9E,yDAAyD;AACzD,wEAAwE;AACxE,gFAAgF;AAChF,0EAA0E;AAC1E,gFAAgF;AAChF,+EAA+E;AAC/E,iFAAiF;AACjF,KAAK,UAAU,oBAAoB,CAAC,KAAiC,EAAE,UAAkB;IACvF,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,CAAA;;;wBAGH,UAAU;;;KAG7B,CAAC,CAAA;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,0EAA0E;IAC5E,CAAC;AACH,CAAC;AAED,kFAAkF;AAClF,8EAA8E;AAC9E,2EAA2E;AAC3E,8EAA8E;AAC9E,+CAA+C;AAC/C,MAAM,aAAa,GAAG,OAAO,CAAA;AAE7B,SAAS,aAAa,CAAC,GAAY;IACjC,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAK,GAA0B,CAAC,IAAI,KAAK,aAAa,CAAA;AACtG,CAAC;AAED,MAAM,wBAAwB,GAAsB,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;AAElF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAyB,EACzB,QAAuC,EAAE,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAC5F,WAA8B,wBAAwB;IAEtD,KAAK,IAAI,CAAC,GAAG,CAAC,GAAI,CAAC,EAAE,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,EAAE,CAAA;QACxB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,MAAM;gBAAE,MAAM,GAAG,CAAA;YAC1D,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAA;QAC3B,CAAC;IACH,CAAC;AACH,CAAC;AAED,6EAA6E;AAC7E,6EAA6E;AAC7E,+EAA+E;AAC/E,yEAAyE;AACzE,kCAAkC;AAClC,KAAK,UAAU,qBAAqB,CAAC,MAAoB,EAAE,WAAmB,EAAE,QAAgB;IAC9F,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAC7B,MAAM,SAAS,GAAG,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IAEnD,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CACzB,cAAc;QACd,wDAAwD,QAAQ,UAAU;QAC1E,eAAe,SAAS,4EAA4E;QACpG,UAAU;QACV,QAAQ,CACT,CAAC,CAAA;IAEF,MAAM,cAAc,GAAG,QAAQ,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAA;IAC5E,MAAM,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;IAE1C,MAAM,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,mCAAmC,SAAS,EAAE,CAAC,CAAC,CAAA;IACjF,MAAM,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,0EAA0E,SAAS,EAAE,CAAC,CAAC,CAAA;IACxH,MAAM,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,4DAA4D,SAAS,EAAE,CAAC,CAAC,CAAA;IAC1G,MAAM,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,+FAA+F,SAAS,EAAE,CAAC,CAAC,CAAA;IAC7I,MAAM,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,iFAAiF,SAAS,EAAE,CAAC,CAAC,CAAA;IAE/H,MAAM,cAAc,CAAC,GAAG,EAAE,CAAA;AAC5B,CAAC;AAED,oEAAoE;AACpE,6EAA6E;AAC7E,4EAA4E;AAC5E,4EAA4E;AAC5E,iDAAiD;AACjD,KAAK,UAAU,mBAAmB;IAChC,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACzB,MAAM,WAAW,CAAC,GAAG,EAAE,CAAA;QACvB,WAAW,GAAG,IAAI,CAAA;IACpB,CAAC;IACD,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,UAAU,CAAC,GAAG,EAAE,CAAA;QACtB,UAAU,GAAG,IAAI,CAAA;IACnB,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,yEAAyE;AACzE,8EAA8E;AAC9E,0EAA0E;AAC1E,6EAA6E;AAC7E,8EAA8E;AAC9E,8EAA8E;AAC9E,2EAA2E;AAC3E,6EAA6E;AAC7E,sCAAsC;AACtC,SAAS,iBAAiB;IACxB,IAAI,mBAAmB;QAAE,OAAM;IAC/B,mBAAmB,GAAG,IAAI,CAAA;IAC1B,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE;YAC9B,KAAK,mBAAmB,EAAE,CAAA;QAC5B,CAAC,CAAC,CAAA;IACJ,CAAC;AACH,CAAC;AAED,qEAAqE;AACrE,6EAA6E;AAC7E,oEAAoE;AACpE,+EAA+E;AAC/E,6EAA6E;AAC7E,4EAA4E;AAC5E,+EAA+E;AAC/E,8EAA8E;AAC9E,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACzB,aAAa,CAAC,KAAK,EAAE,CAAA;QACrB,OAAM;IACR,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;IAElC,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;YAC5D,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,CAAA,0EAA0E,MAAM,CAAC,QAAQ,8BAA8B,CAAC,CAAA;YAC/I,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,2BAA2B,OAAO,EAAE,CAAC,CAAC,CAAA;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,oEAAoE;QACtE,CAAC;IACH,CAAC;IAED,aAAa,CAAC,KAAK,EAAE,CAAA;IAErB,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACvC,MAAM,mBAAmB,EAAE,CAAA;IAC7B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AAChC,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,aAAa,CAAA;AACtB,CAAC"}
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/test/setup.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pipework",
3
- "version": "0.19.1",
3
+ "version": "0.20.0",
4
4
  "description": "TypeScript framework for multi-tenant SaaS applications. PostgreSQL-only.",
5
5
  "type": "module",
6
6
  "license": "MIT",