pipework 0.8.14 → 0.8.16
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 +11 -0
- package/dist/cli/commands/check.d.ts +1 -0
- package/dist/cli/commands/check.d.ts.map +1 -1
- package/dist/cli/commands/check.js +78 -33
- package/dist/cli/commands/check.js.map +1 -1
- package/dist/cli/commands/scope.d.ts +4 -0
- package/dist/cli/commands/scope.d.ts.map +1 -1
- package/dist/cli/commands/scope.js +12 -2
- package/dist/cli/commands/scope.js.map +1 -1
- package/dist/cli/commands/test.d.ts +2 -0
- package/dist/cli/commands/test.d.ts.map +1 -1
- package/dist/cli/commands/test.js +11 -1
- package/dist/cli/commands/test.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +8 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/core/config/namespace.d.ts +10 -0
- package/dist/core/config/namespace.d.ts.map +1 -1
- package/dist/core/config/schema.d.ts +21 -0
- package/dist/core/config/schema.d.ts.map +1 -1
- package/dist/core/config/schema.js +10 -0
- package/dist/core/config/schema.js.map +1 -1
- package/dist/data/migrate/apply.d.ts +15 -0
- package/dist/data/migrate/apply.d.ts.map +1 -1
- package/dist/data/migrate/apply.js +14 -0
- package/dist/data/migrate/apply.js.map +1 -1
- package/dist/data/migrate/diff.d.ts +2 -0
- package/dist/data/migrate/diff.d.ts.map +1 -1
- package/dist/data/migrate/diff.js +4 -0
- package/dist/data/migrate/diff.js.map +1 -1
- package/dist/data/migrate/generate.d.ts.map +1 -1
- package/dist/data/migrate/generate.js +9 -2
- package/dist/data/migrate/generate.js.map +1 -1
- package/dist/data/migrate/provision-framework.d.ts +14 -0
- package/dist/data/migrate/provision-framework.d.ts.map +1 -0
- package/dist/data/migrate/provision-framework.js +39 -0
- package/dist/data/migrate/provision-framework.js.map +1 -0
- package/dist/test/setup.d.ts +2 -1
- package/dist/test/setup.d.ts.map +1 -1
- package/dist/test/setup.js +115 -65
- package/dist/test/setup.js.map +1 -1
- package/dist/trace/check/coverage-check.d.ts.map +1 -1
- package/dist/trace/check/coverage-check.js +4 -2
- package/dist/trace/check/coverage-check.js.map +1 -1
- package/dist/trace/check/flow-step-site.d.ts +4 -0
- package/dist/trace/check/flow-step-site.d.ts.map +1 -1
- package/dist/trace/check/flow-step-site.js +13 -0
- package/dist/trace/check/flow-step-site.js.map +1 -1
- package/dist/trace/partition/sync.d.ts.map +1 -1
- package/dist/trace/partition/sync.js +23 -2
- package/dist/trace/partition/sync.js.map +1 -1
- package/dist/trace/partition/tables.d.ts +7 -0
- package/dist/trace/partition/tables.d.ts.map +1 -1
- package/dist/trace/partition/tables.js +7 -0
- package/dist/trace/partition/tables.js.map +1 -1
- package/dist/workspace/affected.d.ts +6 -0
- package/dist/workspace/affected.d.ts.map +1 -1
- package/dist/workspace/affected.js +5 -0
- package/dist/workspace/affected.js.map +1 -1
- package/dist/workspace/changed-files.d.ts +14 -2
- package/dist/workspace/changed-files.d.ts.map +1 -1
- package/dist/workspace/changed-files.js +50 -4
- package/dist/workspace/changed-files.js.map +1 -1
- package/package.json +1 -1
package/dist/test/setup.js
CHANGED
|
@@ -4,8 +4,10 @@ import { drizzle } from '../data/query/postgres-js/index.js';
|
|
|
4
4
|
import { sql } from '../data/query/index.js';
|
|
5
5
|
import { quoteIdentifier } from '../data/db/identifiers.js';
|
|
6
6
|
import { applyMigrations } from '../data/migrate/apply.js';
|
|
7
|
+
import { provisionFrameworkTables } from '../data/migrate/provision-framework.js';
|
|
7
8
|
import { getAdminUrl, reapOrphanTestDatabases, runLockKey } from './reap.js';
|
|
8
9
|
const testDatabases = new Map();
|
|
10
|
+
const templates = new Map();
|
|
9
11
|
let adminClient = null;
|
|
10
12
|
// A random per-process fingerprint, embedded in every database and role name
|
|
11
13
|
// this run creates. It keys the advisory lock the run holds for its lifetime,
|
|
@@ -13,11 +15,18 @@ let adminClient = null;
|
|
|
13
15
|
const runNonce = randomBytes(6).toString('hex');
|
|
14
16
|
let lockClient = null;
|
|
15
17
|
let reaped = false;
|
|
18
|
+
function templateDbName(baseName) {
|
|
19
|
+
return `pipework_test_${baseName}_tmpl_${process.pid}_${runNonce}`;
|
|
20
|
+
}
|
|
16
21
|
function testDbName(baseName) {
|
|
17
22
|
return `pipework_test_${baseName}_${process.pid}_${runNonce}`;
|
|
18
23
|
}
|
|
24
|
+
// The app role is named to match what the orphan reaper derives from the
|
|
25
|
+
// *template* database name (`reap.ts` `pairedRoleName`): the template outlives
|
|
26
|
+
// every per-file clone, so when the reaper drops a leaked template it drops
|
|
27
|
+
// this role with it. Without the `_tmpl_` segment the role would leak forever.
|
|
19
28
|
function appRoleName(baseName) {
|
|
20
|
-
return `pipework_app_${baseName}
|
|
29
|
+
return `pipework_app_${baseName}_tmpl_${process.pid}_${runNonce}`;
|
|
21
30
|
}
|
|
22
31
|
export async function setupTestDatabases(instance) {
|
|
23
32
|
const databases = [...instance.config.databases()];
|
|
@@ -26,16 +35,19 @@ export async function setupTestDatabases(instance) {
|
|
|
26
35
|
await prepareRun(getAdminUrl(firstDb[1].url));
|
|
27
36
|
}
|
|
28
37
|
for (const [name, dbConfig] of databases) {
|
|
29
|
-
const
|
|
38
|
+
const template = await ensureTemplate(instance, name, dbConfig);
|
|
39
|
+
const testDb = await cloneTestDatabase(name, dbConfig, template);
|
|
30
40
|
testDatabases.set(name, testDb);
|
|
31
41
|
}
|
|
32
42
|
return testDatabases;
|
|
33
43
|
}
|
|
34
44
|
// Acquire this run's advisory lock and reap orphans before provisioning. The
|
|
35
45
|
// lock is taken before the first CREATE DATABASE so a concurrent run's reaper
|
|
36
|
-
// can never mistake this run's freshly-created, backend-less databases
|
|
37
|
-
// orphans. It is held on a dedicated
|
|
38
|
-
// so Postgres releases it only when
|
|
46
|
+
// can never mistake this run's freshly-created, backend-less databases — the
|
|
47
|
+
// per-process template included — for orphans. It is held on a dedicated
|
|
48
|
+
// connection (idle/lifetime timeouts off) so Postgres releases it only when
|
|
49
|
+
// this process dies, and is never unlocked per file: the template outlives
|
|
50
|
+
// every file's database, so the lock that protects it must outlive them too.
|
|
39
51
|
async function prepareRun(adminUrl) {
|
|
40
52
|
if (adminClient === null) {
|
|
41
53
|
adminClient = postgres(adminUrl, { max: 1, onnotice: () => { } });
|
|
@@ -54,99 +66,137 @@ async function prepareRun(adminUrl) {
|
|
|
54
66
|
}
|
|
55
67
|
}
|
|
56
68
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const
|
|
69
|
+
// Build the per-process template for one database, once. Subsequent test files
|
|
70
|
+
// hit the cache and skip straight to cloning. Issue #321.
|
|
71
|
+
async function ensureTemplate(instance, name, dbConfig) {
|
|
72
|
+
const cached = templates.get(name);
|
|
73
|
+
if (cached !== undefined)
|
|
74
|
+
return cached;
|
|
75
|
+
const templateDb = templateDbName(name);
|
|
76
|
+
const templateIdent = quoteIdentifier(templateDb, 'database');
|
|
64
77
|
const admin = drizzle(adminClient);
|
|
65
|
-
await admin.execute(sql.raw(`DROP DATABASE IF EXISTS ${
|
|
66
|
-
await admin.execute(sql.raw(`CREATE DATABASE ${
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
const
|
|
78
|
+
await admin.execute(sql.raw(`DROP DATABASE IF EXISTS ${templateIdent}`));
|
|
79
|
+
await admin.execute(sql.raw(`CREATE DATABASE ${templateIdent}`));
|
|
80
|
+
// #325: a test database is dropped or rolled back — durable commits are pure
|
|
81
|
+
// overhead. `synchronous_commit` is a per-database setting and does not copy
|
|
82
|
+
// with `WITH TEMPLATE`, so it is set on the template and on every clone.
|
|
83
|
+
await admin.execute(sql.raw(`ALTER DATABASE ${templateIdent} SET synchronous_commit = off`));
|
|
84
|
+
const templateUrl = new URL(dbConfig.url);
|
|
85
|
+
templateUrl.pathname = `/${templateDb}`;
|
|
86
|
+
const templateUrlStr = templateUrl.toString();
|
|
87
|
+
const templateClient = postgres(templateUrlStr, { max: 1, onnotice: () => { } });
|
|
88
|
+
const templateDbHandle = drizzle(templateClient);
|
|
72
89
|
if (dbConfig.extensions.length > 0) {
|
|
73
90
|
for (const ext of dbConfig.extensions) {
|
|
74
|
-
await
|
|
91
|
+
await templateDbHandle.execute(sql.raw(`CREATE EXTENSION IF NOT EXISTS ${quoteIdentifier(ext, 'extension')}`));
|
|
75
92
|
}
|
|
76
93
|
}
|
|
77
94
|
if (dbConfig.migrations !== undefined) {
|
|
78
95
|
await applyMigrations({
|
|
79
96
|
migrationsFolder: dbConfig.migrations,
|
|
80
97
|
migrationsTable: dbConfig.migrationTable,
|
|
81
|
-
connectionUrl:
|
|
98
|
+
connectionUrl: templateUrlStr,
|
|
82
99
|
stripConcurrently: true,
|
|
100
|
+
unloggedTables: true,
|
|
83
101
|
});
|
|
84
102
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
103
|
+
// Framework-owned partitioned tables (trace family) are kept out of app
|
|
104
|
+
// migrations (#313) — pipework creates them and their day partitions here so
|
|
105
|
+
// a traced test never hits a missing relation or a missing partition.
|
|
106
|
+
await provisionFrameworkTables(templateDbHandle, instance.config.raw, {
|
|
107
|
+
hotRetentionDays: instance.config.trace.hotRetentionDays,
|
|
108
|
+
errorRetentionDays: instance.config.trace.errorRetentionDays,
|
|
109
|
+
auditRetentionDays: instance.config.audit.retentionDays,
|
|
110
|
+
partitionLeadDays: instance.config.trace.partitionLeadDays,
|
|
111
|
+
}, name === instance.config.defaultDatabaseName());
|
|
112
|
+
await templateClient.end();
|
|
113
|
+
const appRole = appRoleName(name);
|
|
114
|
+
await provisionTemplateRole(adminClient, templateUrlStr, appRole);
|
|
115
|
+
const template = { templateDb, appRole };
|
|
116
|
+
templates.set(name, template);
|
|
117
|
+
return template;
|
|
118
|
+
}
|
|
119
|
+
// Clone one test file's database from the per-process template. A clone copies
|
|
120
|
+
// the template's tables, partitions, and in-database grants; only the cluster
|
|
121
|
+
// catalog's CONNECT privilege has to be re-granted on the new database. Issue #321.
|
|
122
|
+
async function cloneTestDatabase(name, dbConfig, template) {
|
|
123
|
+
const dbName = testDbName(name);
|
|
124
|
+
const dbIdent = quoteIdentifier(dbName, 'database');
|
|
125
|
+
const templateIdent = quoteIdentifier(template.templateDb, 'database');
|
|
126
|
+
const roleIdent = quoteIdentifier(template.appRole, 'role');
|
|
127
|
+
const admin = drizzle(adminClient);
|
|
128
|
+
await admin.execute(sql.raw(`DROP DATABASE IF EXISTS ${dbIdent}`));
|
|
129
|
+
// CREATE ... WITH TEMPLATE refuses to run while any backend is connected to
|
|
130
|
+
// the template; close out stragglers (e.g. a connection still draining).
|
|
131
|
+
await admin.execute(sql `SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = ${template.templateDb} AND pid != pg_backend_pid()`);
|
|
132
|
+
await admin.execute(sql.raw(`CREATE DATABASE ${dbIdent} WITH TEMPLATE ${templateIdent}`));
|
|
133
|
+
await admin.execute(sql.raw(`ALTER DATABASE ${dbIdent} SET synchronous_commit = off`));
|
|
134
|
+
await admin.execute(sql.raw(`GRANT CONNECT ON DATABASE ${dbIdent} TO ${roleIdent}`));
|
|
135
|
+
const testUrl = new URL(dbConfig.url);
|
|
136
|
+
testUrl.pathname = `/${dbName}`;
|
|
137
|
+
const appUrl = new URL(testUrl.toString());
|
|
138
|
+
appUrl.username = template.appRole;
|
|
139
|
+
appUrl.password = 'pipework_test';
|
|
140
|
+
return {
|
|
141
|
+
name,
|
|
142
|
+
url: testUrl.toString(),
|
|
143
|
+
appUrl: appUrl.toString(),
|
|
144
|
+
appRole: template.appRole,
|
|
145
|
+
database: dbName,
|
|
146
|
+
};
|
|
89
147
|
}
|
|
90
|
-
|
|
148
|
+
// Create the app role (cluster-global, once per process) and grant it on the
|
|
149
|
+
// template's tables, sequences, schema, and future objects. Those grants are
|
|
150
|
+
// in-database catalog rows, so every clone of the template inherits them — the
|
|
151
|
+
// role keeps a stable OID for the process lifetime, so the inherited ACL
|
|
152
|
+
// entries stay valid. Issue #321.
|
|
153
|
+
async function provisionTemplateRole(client, templateUrl, roleName) {
|
|
91
154
|
const admin = drizzle(client);
|
|
92
155
|
const roleIdent = quoteIdentifier(roleName, 'role');
|
|
93
|
-
const dbIdent = quoteIdentifier(dbName, 'database');
|
|
94
156
|
await admin.execute(sql.raw(`DO $$ BEGIN ` +
|
|
95
157
|
`IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = '${roleName}') THEN ` +
|
|
96
158
|
`CREATE ROLE ${roleIdent} WITH LOGIN PASSWORD 'pipework_test' NOSUPERUSER NOCREATEDB NOCREATEROLE; ` +
|
|
97
159
|
`END IF; ` +
|
|
98
160
|
`END $$`));
|
|
99
|
-
|
|
100
|
-
const
|
|
101
|
-
|
|
102
|
-
await
|
|
103
|
-
await
|
|
104
|
-
await
|
|
105
|
-
await
|
|
106
|
-
await
|
|
107
|
-
await testClient.end();
|
|
108
|
-
const appUrl = new URL(testUrl);
|
|
109
|
-
appUrl.username = roleName;
|
|
110
|
-
appUrl.password = 'pipework_test';
|
|
111
|
-
return appUrl.toString();
|
|
161
|
+
const templateClient = postgres(templateUrl, { max: 1, onnotice: () => { } });
|
|
162
|
+
const templateDb = drizzle(templateClient);
|
|
163
|
+
await templateDb.execute(sql.raw(`GRANT USAGE ON SCHEMA public TO ${roleIdent}`));
|
|
164
|
+
await templateDb.execute(sql.raw(`GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO ${roleIdent}`));
|
|
165
|
+
await templateDb.execute(sql.raw(`GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO ${roleIdent}`));
|
|
166
|
+
await templateDb.execute(sql.raw(`ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO ${roleIdent}`));
|
|
167
|
+
await templateDb.execute(sql.raw(`ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT USAGE, SELECT ON SEQUENCES TO ${roleIdent}`));
|
|
168
|
+
await templateClient.end();
|
|
112
169
|
}
|
|
170
|
+
// Drop the per-file clones, then close this run's admin and lock connections.
|
|
171
|
+
// The per-process template and its app role deliberately outlive teardown —
|
|
172
|
+
// the next run's reaper drops them. The admin and lock connections must not:
|
|
173
|
+
// both are opened with no idle timeout, so a leaked open socket keeps the Node
|
|
174
|
+
// event loop alive and hangs the process after teardown (#774). Closing
|
|
175
|
+
// `lockClient` also releases the run's advisory lock, which is correct here —
|
|
176
|
+
// every database it guarded is dropped above or now a reapable orphan. Issue #321.
|
|
113
177
|
export async function teardownTestDatabases() {
|
|
114
|
-
if (
|
|
115
|
-
|
|
116
|
-
await lockClient `SELECT pg_advisory_unlock(${runLockKey(runNonce).toString()}::bigint)`;
|
|
117
|
-
}
|
|
118
|
-
catch {
|
|
119
|
-
// Connection already gone — Postgres released the lock when it died.
|
|
120
|
-
}
|
|
121
|
-
await lockClient.end();
|
|
122
|
-
lockClient = null;
|
|
123
|
-
}
|
|
124
|
-
if (!adminClient)
|
|
178
|
+
if (adminClient === null) {
|
|
179
|
+
testDatabases.clear();
|
|
125
180
|
return;
|
|
181
|
+
}
|
|
126
182
|
const admin = drizzle(adminClient);
|
|
127
|
-
const rolesToDrop = [];
|
|
128
183
|
for (const [, testDb] of testDatabases) {
|
|
129
184
|
try {
|
|
130
|
-
const
|
|
131
|
-
await admin.execute(sql `SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = ${testDb.
|
|
132
|
-
await admin.execute(sql.raw(`DROP DATABASE IF EXISTS ${
|
|
185
|
+
const dbIdent = quoteIdentifier(testDb.database, 'database');
|
|
186
|
+
await admin.execute(sql `SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = ${testDb.database} AND pid != pg_backend_pid()`);
|
|
187
|
+
await admin.execute(sql.raw(`DROP DATABASE IF EXISTS ${dbIdent}`));
|
|
133
188
|
}
|
|
134
189
|
catch {
|
|
135
|
-
// Best effort cleanup
|
|
136
|
-
}
|
|
137
|
-
rolesToDrop.push(testDb.appRole);
|
|
138
|
-
}
|
|
139
|
-
for (const roleName of rolesToDrop) {
|
|
140
|
-
try {
|
|
141
|
-
await admin.execute(sql.raw(`DROP ROLE IF EXISTS ${quoteIdentifier(roleName, 'role')}`));
|
|
142
|
-
}
|
|
143
|
-
catch {
|
|
144
|
-
// Best effort cleanup
|
|
190
|
+
// Best effort cleanup — a leftover clone is reaped by the next run.
|
|
145
191
|
}
|
|
146
192
|
}
|
|
147
193
|
testDatabases.clear();
|
|
148
194
|
await adminClient.end();
|
|
149
195
|
adminClient = null;
|
|
196
|
+
if (lockClient !== null) {
|
|
197
|
+
await lockClient.end();
|
|
198
|
+
lockClient = null;
|
|
199
|
+
}
|
|
150
200
|
}
|
|
151
201
|
export function getTestDatabase(name) {
|
|
152
202
|
return testDatabases.get(name);
|
package/dist/test/setup.js.map
CHANGED
|
@@ -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,WAAW,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/test/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coverage-check.d.ts","sourceRoot":"","sources":["../../../src/trace/check/coverage-check.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAc,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAEzD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,SAAS,iBAAiB,EAAE,CAAA;IACjD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAUD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,MAAM,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM,GAC5C,mBAAmB,
|
|
1
|
+
{"version":3,"file":"coverage-check.d.ts","sourceRoot":"","sources":["../../../src/trace/check/coverage-check.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAc,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAEzD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,SAAS,iBAAiB,EAAE,CAAA;IACjD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAUD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,MAAM,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM,GAC5C,mBAAmB,CAmErB"}
|
|
@@ -42,8 +42,10 @@ export function checkCoverage(cwd, sourceFiles, extras = {}) {
|
|
|
42
42
|
let program = null;
|
|
43
43
|
let sites = [];
|
|
44
44
|
try {
|
|
45
|
-
|
|
46
|
-
|
|
45
|
+
// Read the file once — #322: it was being read (and parsed) twice here.
|
|
46
|
+
const source = readFileSync(abs, 'utf-8');
|
|
47
|
+
program = parseProgram(source);
|
|
48
|
+
sites = collectFlowStepSites(source);
|
|
47
49
|
}
|
|
48
50
|
catch {
|
|
49
51
|
// Unparseable — leave syntax errors to the type checker.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coverage-check.js","sourceRoot":"","sources":["../../../src/trace/check/coverage-check.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,+EAA+E;AAC/E,+EAA+E;AAC/E,6DAA6D;AAC7D,EAAE;AACF,uEAAuE;AACvE,yEAAyE;AACzE,wBAAwB;AACxB,EAAE;AACF,aAAa;AACb,4EAA4E;AAC5E,wEAAwE;AACxE,4EAA4E;AAC5E,4EAA4E;AAC5E,6DAA6D;AAC7D,0EAA0E;AAC1E,oCAAoC;AACpC,EAAE;AACF,4EAA4E;AAC5E,0EAA0E;AAC1E,0EAA0E;AAC1E,0CAA0C;AAE1C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAA;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAmC,MAAM,qBAAqB,CAAA;AACnG,OAAO,EAAE,UAAU,EAAe,MAAM,iBAAiB,CAAA;AAsBzD;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,GAAW,EACX,WAA8B,EAC9B,SAA2C,EAAE;IAE7C,MAAM,UAAU,GAAwB,EAAE,CAAA;IAC1C,IAAI,OAAO,GAAG,CAAC,CAAA;IAEf,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QAC3B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAQ;QAE9B,IAAI,OAAO,GAAmB,IAAI,CAAA;QAClC,IAAI,KAAK,GAA4B,EAAE,CAAA;QACvC,IAAI,CAAC;YACH,
|
|
1
|
+
{"version":3,"file":"coverage-check.js","sourceRoot":"","sources":["../../../src/trace/check/coverage-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -53,6 +53,10 @@ export interface FlowStepSite {
|
|
|
53
53
|
/**
|
|
54
54
|
* Parse `code` and return every `@flow_step` site it contains, in source order.
|
|
55
55
|
*
|
|
56
|
+
* Memoized by source text: the flow, cardinality, and coverage checks each scan
|
|
57
|
+
* the same file, and the parse-and-walk produces a bit-identical result every
|
|
58
|
+
* time — the cache collapses it to one parse per file. Issue #322.
|
|
59
|
+
*
|
|
56
60
|
* Throws if `code` is not parseable — callers scanning many files should catch
|
|
57
61
|
* and skip, leaving syntax errors to the type checker.
|
|
58
62
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow-step-site.d.ts","sourceRoot":"","sources":["../../../src/trace/check/flow-step-site.ts"],"names":[],"mappings":"AAOA,OAAO,EAA2B,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAExF,UAAU,QAAQ;IAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,UAAU,cAAc;IACtB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAA;IACxB,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAA;CACvB;AAED,0FAA0F;AAC1F,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACzC,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAA;IAC5B,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAChC;AAaD;;;;;;;;;GASG;AACH,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAE5D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAA;IAC7B,4EAA4E;IAC5E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,4EAA4E;IAC5E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,qDAAqD;IACrD,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,gFAAgF;IAChF,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,mBAAmB,EAAE;QAAE,IAAI,EAAE,iBAAiB,CAAA;KAAE,CAAC,CAAA;IAC9E,iEAAiE;IACjE,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAA;IACjC,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B;
|
|
1
|
+
{"version":3,"file":"flow-step-site.d.ts","sourceRoot":"","sources":["../../../src/trace/check/flow-step-site.ts"],"names":[],"mappings":"AAOA,OAAO,EAA2B,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAExF,UAAU,QAAQ;IAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,UAAU,cAAc;IACtB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAA;IACxB,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAA;CACvB;AAED,0FAA0F;AAC1F,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACzC,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAA;IAC5B,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAChC;AAaD;;;;;;;;;GASG;AACH,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAE5D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAA;IAC7B,4EAA4E;IAC5E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,4EAA4E;IAC5E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,qDAAqD;IACrD,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,gFAAgF;IAChF,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,mBAAmB,EAAE;QAAE,IAAI,EAAE,iBAAiB,CAAA;KAAE,CAAC,CAAA;IAC9E,iEAAiE;IACjE,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAA;IACjC,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B;AAWD;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CAMjE;AA6HD,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,CAIvD"}
|
|
@@ -5,13 +5,26 @@
|
|
|
5
5
|
// one place that answers "where are the flow steps in this file".
|
|
6
6
|
import { parse } from '@typescript-eslint/parser';
|
|
7
7
|
import { parseFlowStepAnnotation } from 'pipework-flow-parser';
|
|
8
|
+
const flowStepSiteCache = new Map();
|
|
8
9
|
/**
|
|
9
10
|
* Parse `code` and return every `@flow_step` site it contains, in source order.
|
|
10
11
|
*
|
|
12
|
+
* Memoized by source text: the flow, cardinality, and coverage checks each scan
|
|
13
|
+
* the same file, and the parse-and-walk produces a bit-identical result every
|
|
14
|
+
* time — the cache collapses it to one parse per file. Issue #322.
|
|
15
|
+
*
|
|
11
16
|
* Throws if `code` is not parseable — callers scanning many files should catch
|
|
12
17
|
* and skip, leaving syntax errors to the type checker.
|
|
13
18
|
*/
|
|
14
19
|
export function collectFlowStepSites(code) {
|
|
20
|
+
const cached = flowStepSiteCache.get(code);
|
|
21
|
+
if (cached !== undefined)
|
|
22
|
+
return cached;
|
|
23
|
+
const sites = parseFlowStepSites(code);
|
|
24
|
+
flowStepSiteCache.set(code, sites);
|
|
25
|
+
return sites;
|
|
26
|
+
}
|
|
27
|
+
function parseFlowStepSites(code) {
|
|
15
28
|
const program = parse(code, {
|
|
16
29
|
range: true,
|
|
17
30
|
loc: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow-step-site.js","sourceRoot":"","sources":["../../../src/trace/check/flow-step-site.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,2EAA2E;AAC3E,8EAA8E;AAC9E,8EAA8E;AAC9E,kEAAkE;AAElE,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAA;AACjD,OAAO,EAAE,uBAAuB,EAA4B,MAAM,sBAAsB,CAAA;AA2ExF
|
|
1
|
+
{"version":3,"file":"flow-step-site.js","sourceRoot":"","sources":["../../../src/trace/check/flow-step-site.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/trace/partition/sync.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAA;AAIhD,OAAO,EAAkB,KAAK,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAGrE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CACpC;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,oBAAoB,EAC5B,GAAG,GAAE,IAAiB,GACrB,OAAO,CAAC,oBAAoB,CAAC,
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/trace/partition/sync.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAA;AAIhD,OAAO,EAAkB,KAAK,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAGrE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CACpC;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,oBAAoB,EAC5B,GAAG,GAAE,IAAiB,GACrB,OAAO,CAAC,oBAAoB,CAAC,CAwC/B"}
|
|
@@ -16,9 +16,15 @@ import { addDays } from './day.js';
|
|
|
16
16
|
* clock. Returns the names created and dropped so a job runner can record them.
|
|
17
17
|
*/
|
|
18
18
|
export async function syncTracePartitions(db, config, now = new Date()) {
|
|
19
|
+
const existingParents = await readExistingParents(db);
|
|
19
20
|
const existing = await readExistingPartitions(db);
|
|
20
21
|
const plan = planPartitions({ now, config, existing });
|
|
21
|
-
|
|
22
|
+
// A parent pipework never provisioned (e.g. `audit` disabled, so no
|
|
23
|
+
// `audit_record`) has no table to attach a partition to — `CREATE TABLE ...
|
|
24
|
+
// PARTITION OF` it would abort the whole pass. Drop those from the plan so
|
|
25
|
+
// the summary reports only partitions actually applied. Issue #313.
|
|
26
|
+
const toCreate = plan.create.filter(partition => existingParents.has(partition.parent));
|
|
27
|
+
for (const partition of toCreate) {
|
|
22
28
|
const child = quoteIdentifier(partition.name, 'trace partition');
|
|
23
29
|
const parent = quoteIdentifier(partition.parent, 'trace table');
|
|
24
30
|
// addDays re-validates the day; the bound is a generated YYYY-MM-DD literal.
|
|
@@ -31,7 +37,7 @@ export async function syncTracePartitions(db, config, now = new Date()) {
|
|
|
31
37
|
await db.execute(sql.raw(`DROP TABLE IF EXISTS ${child}`));
|
|
32
38
|
}
|
|
33
39
|
const summary = {
|
|
34
|
-
created:
|
|
40
|
+
created: toCreate.map(p => p.name),
|
|
35
41
|
dropped: plan.drop.map(p => p.name),
|
|
36
42
|
};
|
|
37
43
|
if (summary.created.length > 0 || summary.dropped.length > 0) {
|
|
@@ -39,6 +45,21 @@ export async function syncTracePartitions(db, config, now = new Date()) {
|
|
|
39
45
|
}
|
|
40
46
|
return summary;
|
|
41
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Which of the partitioned trace parents actually exist as partitioned tables.
|
|
50
|
+
* A parent pipework never provisioned — `audit` disabled, or a non-default
|
|
51
|
+
* database — must be skipped: `CREATE TABLE ... PARTITION OF` a missing parent
|
|
52
|
+
* aborts the maintenance pass. Issue #313.
|
|
53
|
+
*/
|
|
54
|
+
async function readExistingParents(db) {
|
|
55
|
+
const parents = PARTITIONED_TRACE_TABLES.map(t => t.parent);
|
|
56
|
+
const parentList = sql.join(parents.map(p => sql `${p}`), sql `, `);
|
|
57
|
+
const rows = await db.execute(sql `
|
|
58
|
+
SELECT relname FROM pg_class
|
|
59
|
+
WHERE relkind = 'p' AND relname IN (${parentList})
|
|
60
|
+
`);
|
|
61
|
+
return new Set(rows.map(row => row['relname']));
|
|
62
|
+
}
|
|
42
63
|
async function readExistingPartitions(db) {
|
|
43
64
|
const parents = PARTITIONED_TRACE_TABLES.map(t => t.parent);
|
|
44
65
|
const parentList = sql.join(parents.map(p => sql `${p}`), sql `, `);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/trace/partition/sync.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,2EAA2E;AAC3E,yEAAyE;AACzE,8EAA8E;AAC9E,iDAAiD;AAEjD,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAA;AAE1C,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,EAAE,cAAc,EAA6B,MAAM,WAAW,CAAA;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAOlC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,EAAM,EACN,MAA4B,EAC5B,MAAY,IAAI,IAAI,EAAE;IAEtB,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAAC,EAAE,CAAC,CAAA;IACjD,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAA;IAEtD,
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/trace/partition/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,4 +5,11 @@ export interface PartitionedTraceTable {
|
|
|
5
5
|
readonly retention: RetentionClass;
|
|
6
6
|
}
|
|
7
7
|
export declare const PARTITIONED_TRACE_TABLES: readonly PartitionedTraceTable[];
|
|
8
|
+
/**
|
|
9
|
+
* Wire names of the framework-owned partitioned tables. A `pipework generate`
|
|
10
|
+
* must not emit these into an application migration (a bare `CREATE TABLE` of a
|
|
11
|
+
* `PARTITION BY RANGE` table accepts no inserts), and the test harness
|
|
12
|
+
* provisions them — parent plus day partitions — itself. Issue #313.
|
|
13
|
+
*/
|
|
14
|
+
export declare const PARTITIONED_TRACE_TABLE_NAMES: ReadonlySet<string>;
|
|
8
15
|
//# sourceMappingURL=tables.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../../../src/trace/partition/tables.ts"],"names":[],"mappings":"AAkBA,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAA;AAErD,MAAM,WAAW,qBAAqB;IACpC,sEAAsE;IACtE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAA;CACnC;AAED,eAAO,MAAM,wBAAwB,EAAE,SAAS,qBAAqB,EAMpE,CAAA"}
|
|
1
|
+
{"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../../../src/trace/partition/tables.ts"],"names":[],"mappings":"AAkBA,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAA;AAErD,MAAM,WAAW,qBAAqB;IACpC,sEAAsE;IACtE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAA;CACnC;AAED,eAAO,MAAM,wBAAwB,EAAE,SAAS,qBAAqB,EAMpE,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,EAAE,WAAW,CAAC,MAAM,CAE7D,CAAA"}
|
|
@@ -21,4 +21,11 @@ export const PARTITIONED_TRACE_TABLES = [
|
|
|
21
21
|
{ parent: traceStepRetained.$name, retention: 'cold' },
|
|
22
22
|
{ parent: auditRecord.$name, retention: 'audit' },
|
|
23
23
|
];
|
|
24
|
+
/**
|
|
25
|
+
* Wire names of the framework-owned partitioned tables. A `pipework generate`
|
|
26
|
+
* must not emit these into an application migration (a bare `CREATE TABLE` of a
|
|
27
|
+
* `PARTITION BY RANGE` table accepts no inserts), and the test harness
|
|
28
|
+
* provisions them — parent plus day partitions — itself. Issue #313.
|
|
29
|
+
*/
|
|
30
|
+
export const PARTITIONED_TRACE_TABLE_NAMES = new Set(PARTITIONED_TRACE_TABLES.map(t => t.parent));
|
|
24
31
|
//# sourceMappingURL=tables.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tables.js","sourceRoot":"","sources":["../../../src/trace/partition/tables.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,oEAAoE;AACpE,EAAE;AACF,yEAAyE;AACzE,iFAAiF;AACjF,iDAAiD;AACjD,gFAAgF;AAChF,6DAA6D;AAC7D,EAAE;AACF,+EAA+E;AAC/E,2DAA2D;AAE3D,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAA;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAA;AAUhE,MAAM,CAAC,MAAM,wBAAwB,GAAqC;IACxE,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;IACzC,EAAE,MAAM,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;IAC7C,EAAE,MAAM,EAAE,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE;IAClD,EAAE,MAAM,EAAE,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE;IACtD,EAAE,MAAM,EAAE,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE;CAClD,CAAA"}
|
|
1
|
+
{"version":3,"file":"tables.js","sourceRoot":"","sources":["../../../src/trace/partition/tables.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,oEAAoE;AACpE,EAAE;AACF,yEAAyE;AACzE,iFAAiF;AACjF,iDAAiD;AACjD,gFAAgF;AAChF,6DAA6D;AAC7D,EAAE;AACF,+EAA+E;AAC/E,2DAA2D;AAE3D,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAA;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAA;AAUhE,MAAM,CAAC,MAAM,wBAAwB,GAAqC;IACxE,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;IACzC,EAAE,MAAM,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;IAC7C,EAAE,MAAM,EAAE,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE;IAClD,EAAE,MAAM,EAAE,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE;IACtD,EAAE,MAAM,EAAE,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE;CAClD,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAwB,IAAI,GAAG,CACvE,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAC5C,CAAA"}
|
|
@@ -3,6 +3,12 @@ import type { DiffMode } from './changed-files.js';
|
|
|
3
3
|
export interface ScopeResult {
|
|
4
4
|
readonly modules: ReadonlySet<string>;
|
|
5
5
|
readonly all: boolean;
|
|
6
|
+
/**
|
|
7
|
+
* The affected set could not be computed (no git, no base branch, …) so the
|
|
8
|
+
* scope was widened to every module rather than silently scoped to nothing.
|
|
9
|
+
* The caller should log this loudly. Issue #325.
|
|
10
|
+
*/
|
|
11
|
+
readonly failedOpen?: boolean;
|
|
6
12
|
}
|
|
7
13
|
export type ScopeMode = {
|
|
8
14
|
kind: 'all';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"affected.d.ts","sourceRoot":"","sources":["../../src/workspace/affected.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAIlD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IACrC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"affected.d.ts","sourceRoot":"","sources":["../../src/workspace/affected.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAIlD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IACrC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;IACrB;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAC9B;AAED,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GACf;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAA;AAEpC,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,eAAe,EAAE,SAAS,cAAc,EAAE,EAC1C,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,SAAS,GACf,WAAW,CAsCb"}
|
|
@@ -13,6 +13,11 @@ export function resolveAffected(cwd, resolvedModules, projectName, scope) {
|
|
|
13
13
|
return { modules: new Set([scope.path]), all: false };
|
|
14
14
|
}
|
|
15
15
|
const files = changedFiles(cwd, scope.mode);
|
|
16
|
+
if (files === null) {
|
|
17
|
+
// The diff could not be computed — fail open to every module rather than
|
|
18
|
+
// silently check nothing. Issue #325.
|
|
19
|
+
return { modules: allPaths, all: true, failedOpen: true };
|
|
20
|
+
}
|
|
16
21
|
if (files.length === 0) {
|
|
17
22
|
return { modules: new Set(), all: false };
|
|
18
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"affected.js","sourceRoot":"","sources":["../../src/workspace/affected.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"affected.js","sourceRoot":"","sources":["../../src/workspace/affected.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAkBxD,MAAM,UAAU,eAAe,CAC7B,GAAW,EACX,eAA0C,EAC1C,WAAmB,EACnB,KAAgB;IAEhB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAA;IAElE,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACzD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,CAAA;IACzC,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC7C,MAAM,IAAI,KAAK,CACb,mBAAmB,KAAK,CAAC,IAAI,0BAA0B,KAAK,IAAI,CACjE,CAAA;QACH,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAA;IACvD,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;IAC3C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,yEAAyE;QACzE,sCAAsC;QACtC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAA;IAC3D,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAA;IAC3C,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAA;IACnD,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,CAAA;IACzC,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAA;IAC3C,CAAC;IAED,MAAM,KAAK,GAAG,gBAAgB,CAAC,eAAe,EAAE,WAAW,CAAC,CAAA;IAC5D,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAA;AAChE,CAAC"}
|
|
@@ -1,5 +1,17 @@
|
|
|
1
|
-
export type DiffMode = 'uncommitted' | 'staged';
|
|
2
|
-
|
|
1
|
+
export type DiffMode = 'uncommitted' | 'staged' | 'branch';
|
|
2
|
+
/**
|
|
3
|
+
* Files changed under `mode`.
|
|
4
|
+
*
|
|
5
|
+
* `branch` mode (the `--fast` path) returns `null` — never an empty array —
|
|
6
|
+
* when the set cannot be computed (no base branch, unrelated history, no git):
|
|
7
|
+
* the caller must fail open on `null`, widening to everything, never silently
|
|
8
|
+
* scoping to nothing. Issue #325.
|
|
9
|
+
*
|
|
10
|
+
* `uncommitted` / `staged` modes return `[]` on a non-git or empty tree — a
|
|
11
|
+
* clean tree genuinely has nothing to do, and the caller exits 0 (#266). An
|
|
12
|
+
* empty array always means "computed cleanly, nothing changed".
|
|
13
|
+
*/
|
|
14
|
+
export declare function changedFiles(cwd: string, mode: DiffMode): string[] | null;
|
|
3
15
|
export declare function filesToModules(files: readonly string[], modulePaths: readonly string[]): {
|
|
4
16
|
modules: Set<string>;
|
|
5
17
|
rootChanged: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"changed-files.d.ts","sourceRoot":"","sources":["../../src/workspace/changed-files.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,QAAQ,GAAG,aAAa,GAAG,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"changed-files.d.ts","sourceRoot":"","sources":["../../src/workspace/changed-files.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,QAAQ,GAAG,aAAa,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAQ1D;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,EAAE,GAAG,IAAI,CA2BzE;AAmBD,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,WAAW,EAAE,SAAS,MAAM,EAAE,GAC7B;IAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAwBhD"}
|