velocious 1.0.698 → 1.0.700

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/README.md +2 -2
  2. package/build/configuration-types.js +23 -0
  3. package/build/configuration.js +136 -1
  4. package/build/database/advisory-lock-backend-policy.js +204 -0
  5. package/build/database/advisory-lock-file-backend.js +348 -0
  6. package/build/database/advisory-lock-runner.js +239 -16
  7. package/build/database/drivers/base.js +318 -15
  8. package/build/database/drivers/mssql/index.js +1 -1
  9. package/build/database/drivers/mysql/index.js +4 -2
  10. package/build/database/drivers/pgsql/index.js +4 -2
  11. package/build/database/drivers/sqlite/base.js +13 -129
  12. package/build/database/drivers/sqlite/index.js +41 -62
  13. package/build/database/migrator.js +120 -50
  14. package/build/database/record/attachments/store.js +84 -1
  15. package/build/environment-handlers/base.js +13 -0
  16. package/build/environment-handlers/node.js +11 -0
  17. package/build/http-server/server-lock.js +21 -115
  18. package/build/src/configuration-types.d.ts +68 -0
  19. package/build/src/configuration-types.d.ts.map +1 -1
  20. package/build/src/configuration-types.js +21 -1
  21. package/build/src/configuration.d.ts +100 -1
  22. package/build/src/configuration.d.ts.map +1 -1
  23. package/build/src/configuration.js +124 -2
  24. package/build/src/database/advisory-lock-backend-policy.d.ts +145 -0
  25. package/build/src/database/advisory-lock-backend-policy.d.ts.map +1 -0
  26. package/build/src/database/advisory-lock-backend-policy.js +184 -0
  27. package/build/src/database/advisory-lock-file-backend.d.ts +194 -0
  28. package/build/src/database/advisory-lock-file-backend.d.ts.map +1 -0
  29. package/build/src/database/advisory-lock-file-backend.js +313 -0
  30. package/build/src/database/advisory-lock-runner.d.ts +116 -15
  31. package/build/src/database/advisory-lock-runner.d.ts.map +1 -1
  32. package/build/src/database/advisory-lock-runner.js +190 -17
  33. package/build/src/database/drivers/base.d.ts +125 -4
  34. package/build/src/database/drivers/base.d.ts.map +1 -1
  35. package/build/src/database/drivers/base.js +282 -17
  36. package/build/src/database/drivers/mssql/index.d.ts +1 -1
  37. package/build/src/database/drivers/mssql/index.d.ts.map +1 -1
  38. package/build/src/database/drivers/mssql/index.js +2 -2
  39. package/build/src/database/drivers/mysql/index.d.ts +4 -2
  40. package/build/src/database/drivers/mysql/index.d.ts.map +1 -1
  41. package/build/src/database/drivers/mysql/index.js +5 -3
  42. package/build/src/database/drivers/pgsql/index.d.ts +4 -2
  43. package/build/src/database/drivers/pgsql/index.d.ts.map +1 -1
  44. package/build/src/database/drivers/pgsql/index.js +5 -3
  45. package/build/src/database/drivers/sqlite/base.d.ts +11 -49
  46. package/build/src/database/drivers/sqlite/base.d.ts.map +1 -1
  47. package/build/src/database/drivers/sqlite/base.js +14 -114
  48. package/build/src/database/drivers/sqlite/index.d.ts +28 -19
  49. package/build/src/database/drivers/sqlite/index.d.ts.map +1 -1
  50. package/build/src/database/drivers/sqlite/index.js +41 -59
  51. package/build/src/database/migrator.d.ts.map +1 -1
  52. package/build/src/database/migrator.js +110 -56
  53. package/build/src/database/record/attachments/store.d.ts +0 -3
  54. package/build/src/database/record/attachments/store.d.ts.map +1 -1
  55. package/build/src/database/record/attachments/store.js +71 -2
  56. package/build/src/environment-handlers/base.d.ts +14 -0
  57. package/build/src/environment-handlers/base.d.ts.map +1 -1
  58. package/build/src/environment-handlers/base.js +13 -1
  59. package/build/src/environment-handlers/node.d.ts +11 -0
  60. package/build/src/environment-handlers/node.d.ts.map +1 -1
  61. package/build/src/environment-handlers/node.js +11 -1
  62. package/build/src/http-server/server-lock.d.ts +13 -37
  63. package/build/src/http-server/server-lock.d.ts.map +1 -1
  64. package/build/src/http-server/server-lock.js +22 -109
  65. package/build/src/testing/test-runner.d.ts +74 -0
  66. package/build/src/testing/test-runner.d.ts.map +1 -1
  67. package/build/src/testing/test-runner.js +140 -1
  68. package/build/src/testing/test-tenant-database-pool.d.ts +183 -0
  69. package/build/src/testing/test-tenant-database-pool.d.ts.map +1 -0
  70. package/build/src/testing/test-tenant-database-pool.js +388 -0
  71. package/build/src/testing/velocious-attempt-executor.d.ts.map +1 -1
  72. package/build/src/testing/velocious-attempt-executor.js +43 -1
  73. package/build/testing/test-runner.js +152 -0
  74. package/build/testing/test-tenant-database-pool.js +438 -0
  75. package/build/testing/velocious-attempt-executor.js +44 -0
  76. package/package.json +1 -1
  77. package/src/configuration-types.js +23 -0
  78. package/src/configuration.js +136 -1
  79. package/src/database/advisory-lock-backend-policy.js +204 -0
  80. package/src/database/advisory-lock-file-backend.js +348 -0
  81. package/src/database/advisory-lock-runner.js +239 -16
  82. package/src/database/drivers/base.js +318 -15
  83. package/src/database/drivers/mssql/index.js +1 -1
  84. package/src/database/drivers/mysql/index.js +4 -2
  85. package/src/database/drivers/pgsql/index.js +4 -2
  86. package/src/database/drivers/sqlite/base.js +13 -129
  87. package/src/database/drivers/sqlite/index.js +41 -62
  88. package/src/database/migrator.js +120 -50
  89. package/src/database/record/attachments/store.js +84 -1
  90. package/src/environment-handlers/base.js +13 -0
  91. package/src/environment-handlers/node.js +11 -0
  92. package/src/http-server/server-lock.js +21 -115
  93. package/src/testing/test-runner.js +152 -0
  94. package/src/testing/test-tenant-database-pool.js +438 -0
  95. package/src/testing/velocious-attempt-executor.js +44 -0
@@ -0,0 +1,183 @@
1
+ export type TestTenantPoolConfiguration = import("../configuration-types.js").TestTenantPoolConfiguration;
2
+ export type TestTenantPoolLease = {
3
+ /**
4
+ * - Tenant database identifier the lease belongs to.
5
+ */
6
+ databaseIdentifier: string;
7
+ /**
8
+ * - The pool member's tenant descriptor.
9
+ */
10
+ tenant: ReturnType<typeof JSON.parse>;
11
+ /**
12
+ * - Internal pool member backing the lease.
13
+ */
14
+ member: TestTenantPoolMember;
15
+ };
16
+ export type TestTenantPoolMember = {
17
+ /**
18
+ * - Whether the member is currently held by a lease.
19
+ */
20
+ leased: boolean;
21
+ /**
22
+ * - Tenant descriptor resolved by the app's tenantDatabaseResolver.
23
+ */
24
+ tenant: ReturnType<typeof JSON.parse>;
25
+ };
26
+ /**
27
+ * Reusable pool of pre-provisioned test tenant databases (STC-135 "keep a couple for
28
+ * re-use"). Instead of create + full structure load + drop per test, the pool provisions
29
+ * N tenant databases once per suite and resets each one between tests with
30
+ * truncate + migration-ledger baseline — the framework generalization of the
31
+ * captured-structure fast path consuming apps had to hand-roll.
32
+ *
33
+ * Provisioning runs the tenant provider's `createDatabase` hook (or the framework
34
+ * default provisioning), then loads the default database's captured structure SQL in
35
+ * one pass via {@link StructureSqlLoader} and baselines the tenant's
36
+ * `schema_migrations` ledger from the default database. Apps whose tenant schema
37
+ * differs from the default database (subset tables, FK-free clones) override
38
+ * `provisionTenant`/`resetTenant` in the pool configuration.
39
+ *
40
+ * Leases are deterministic: acquisition takes the first free member in configured
41
+ * order, so a suite that acquires and releases one lease per test reuses the same
42
+ * members in the same order. Acquisition is synchronous after provisioning, so
43
+ * concurrent acquires can never double-lease one member; exhaustion throws instead
44
+ * of queueing, because a test that holds a lease while waiting would deadlock the
45
+ * single-threaded runner.
46
+ */
47
+ export default class TestTenantDatabasePool {
48
+ configuration: import("../configuration.js").default;
49
+ databaseIdentifier: string;
50
+ poolConfiguration: import("../configuration-types.js").TestTenantPoolConfiguration;
51
+ /** @type {TestTenantPoolMember[]} */
52
+ members: TestTenantPoolMember[];
53
+ /** @type {Map<string, TestTenantPoolMember>} */
54
+ membersByTenantKey: Map<string, TestTenantPoolMember>;
55
+ /** @type {Promise<void> | undefined} */
56
+ provisioningPromise: Promise<void> | undefined;
57
+ /** @type {Promise<string | null> | undefined} */
58
+ structureSqlPromise: Promise<string | null> | undefined;
59
+ dropped: boolean;
60
+ /**
61
+ * Creates a pool for one tenant database identifier.
62
+ * @param {object} args - Pool arguments.
63
+ * @param {import("../configuration.js").default} args.configuration - Configuration owning the tenant resolver.
64
+ * @param {string} args.databaseIdentifier - Tenant-only database identifier to pool.
65
+ * @param {TestTenantPoolConfiguration} args.poolConfiguration - Pool size (via `tenants`) and optional provisioning overrides.
66
+ */
67
+ constructor({ configuration, databaseIdentifier, poolConfiguration }: {
68
+ configuration: import("../configuration.js").default;
69
+ databaseIdentifier: string;
70
+ poolConfiguration: TestTenantPoolConfiguration;
71
+ });
72
+ /**
73
+ * Number of pool members.
74
+ * @returns {number} - Pool size.
75
+ */
76
+ size(): number;
77
+ /**
78
+ * Acquires one pool member as a lease. The first free member in configured order is
79
+ * taken; when every member is leased the acquisition fails loudly instead of queueing.
80
+ * @param {{tenant?: ReturnType<typeof JSON.parse>}} [args] - Optional explicit pool tenant to pin.
81
+ * @returns {Promise<TestTenantPoolLease>} - Held lease; pass it to {@link release}.
82
+ */
83
+ acquire({ tenant }?: {
84
+ tenant?: ReturnType<typeof JSON.parse>;
85
+ }): Promise<TestTenantPoolLease>;
86
+ /**
87
+ * Resets a leased member (truncate + ledger baseline, or the configured `resetTenant`
88
+ * override) and returns it to the free pool. Idempotent for an already-free member.
89
+ * A failed reset is followed by a full re-provision so a corrupted member cannot be
90
+ * handed to the next test; if re-provisioning also fails the member stays leased and
91
+ * the aggregated error is thrown.
92
+ * @param {TestTenantPoolLease} lease - Lease returned by {@link acquire}.
93
+ * @returns {Promise<void>} - Resolves once the member is clean and free again.
94
+ */
95
+ release(lease: TestTenantPoolLease): Promise<void>;
96
+ /**
97
+ * Drops every pool member's tenant database through the provider's `dropDatabase`
98
+ * hook (or the framework default) and closes the pool. Idempotent.
99
+ * @returns {Promise<void>} - Resolves after all members were dropped.
100
+ */
101
+ teardown(): Promise<void>;
102
+ /**
103
+ * Provisions every member exactly once (concurrent acquisitions share one
104
+ * provisioning pass).
105
+ * @returns {Promise<void>} - Resolves when all members are provisioned.
106
+ */
107
+ ensureProvisioned(): Promise<void>;
108
+ /**
109
+ * Provisions one member: creates the physical tenant database, then loads or clones
110
+ * the default database's structure and baselines the ledger.
111
+ * @param {TestTenantPoolMember} member - Pool member to provision.
112
+ * @returns {Promise<void>} - Resolves when the member's tenant database is ready.
113
+ */
114
+ provisionMember(member: TestTenantPoolMember): Promise<void>;
115
+ /**
116
+ * Creates the physical tenant database via the provider's `createDatabase` hook or
117
+ * the framework default provisioning.
118
+ * @param {TestTenantPoolMember} member - Pool member whose database must exist.
119
+ * @returns {Promise<void>} - Resolves when the tenant database exists.
120
+ */
121
+ createTenantDatabaseForMember(member: TestTenantPoolMember): Promise<void>;
122
+ /**
123
+ * Loads the captured default-database structure into the current tenant connection
124
+ * and baselines its ledger. Drivers without a structure-SQL generator fall back to
125
+ * {@link SchemaCloner} over every default table.
126
+ * @param {Record<string, import("../database/drivers/base.js").default>} dbs - Active connections (must include `default` and the pool identifier).
127
+ * @returns {Promise<void>} - Resolves when the tenant schema and ledger are baselined.
128
+ */
129
+ applyDefaultStructure(dbs: Record<string, import("../database/drivers/base.js").default>): Promise<void>;
130
+ /**
131
+ * Resets one member between tests: truncate every tenant table (the ledger table is
132
+ * preserved by `truncateAllTables`) and re-baseline the ledger from the default
133
+ * database, so the next test starts from the same schema state without a structure load.
134
+ * @param {TestTenantPoolMember} member - Leased member to clean.
135
+ * @returns {Promise<void>} - Resolves when the member is empty and ledger-current.
136
+ */
137
+ resetMember(member: TestTenantPoolMember): Promise<void>;
138
+ /**
139
+ * Baselines a tenant connection's ledger from the default database. Skips when the
140
+ * default database has no ledger yet (nothing to baseline from).
141
+ * @param {import("../database/drivers/base.js").default} tenantDb - Tenant connection whose ledger is refreshed.
142
+ * @returns {Promise<void>} - Resolves when the ledger matches the default database.
143
+ */
144
+ baselineLedger(tenantDb: import("../database/drivers/base.js").default): Promise<void>;
145
+ /**
146
+ * Drops one member's tenant database through the provider's `dropDatabase` hook or
147
+ * the framework default.
148
+ * @param {TestTenantPoolMember} member - Pool member to drop.
149
+ * @returns {Promise<void>} - Resolves when the tenant database is gone.
150
+ */
151
+ dropMember(member: TestTenantPoolMember): Promise<void>;
152
+ /**
153
+ * Captures the default database's structure SQL once per pool (the framework
154
+ * generalization of the consuming apps' captured-structure fast path). Returns null
155
+ * for drivers without a structure generator, which selects the SchemaCloner fallback.
156
+ * @returns {Promise<string | null>} - Captured structure SQL or null.
157
+ */
158
+ capturedStructureSql(): Promise<string | null>;
159
+ /**
160
+ * Runs tenant connection.
161
+ * @param {Record<string, import("../database/drivers/base.js").default>} dbs - Active connections.
162
+ * @returns {import("../database/drivers/base.js").default} - The pool identifier's connection.
163
+ */
164
+ tenantConnection(dbs: Record<string, import("../database/drivers/base.js").default>): import("../database/drivers/base.js").default;
165
+ /**
166
+ * Runs default connection.
167
+ * @param {Record<string, import("../database/drivers/base.js").default>} dbs - Active connections.
168
+ * @returns {import("../database/drivers/base.js").default} - The default connection (ledger baseline source).
169
+ */
170
+ defaultConnection(dbs: Record<string, import("../database/drivers/base.js").default>): import("../database/drivers/base.js").default;
171
+ /**
172
+ * Runs with a dedicated physical connection for one member. The reset path truncates
173
+ * committed data, so it must not reuse a test-pinned or async-context connection that
174
+ * a later rollback would undo — it checks out through the pool exactly like
175
+ * `registerTransactionalTenant` does and releases the connection back to the pool.
176
+ * @param {ReturnType<typeof JSON.parse>} tenant - Pool member tenant descriptor.
177
+ * @template T
178
+ * @param {(db: import("../database/drivers/base.js").default) => Promise<T>} callback - Operation on the dedicated connection.
179
+ * @returns {Promise<T>} - Callback result.
180
+ */
181
+ withMemberConnection<T>(tenant: ReturnType<typeof JSON.parse>, callback: (db: import("../database/drivers/base.js").default) => Promise<T>): Promise<T>;
182
+ }
183
+ //# sourceMappingURL=test-tenant-database-pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-tenant-database-pool.d.ts","sourceRoot":"","sources":["../../../src/testing/test-tenant-database-pool.js"],"names":[],"mappings":"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"}