@coffre/db 0.4.5 → 0.5.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/dist/connect.d.ts +1 -1
- package/dist/{database-edkMkG02.d.ts → database-C63WjCrC.d.ts} +1 -1
- package/dist/dialect.d.ts +7 -1
- package/dist/dialect.js +12 -1
- package/dist/grants.d.ts +105 -10
- package/dist/grants.js +207 -7
- package/dist/hyperdrive.d.ts +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/log.d.ts +392 -2
- package/dist/log.js +53 -1
- package/dist/migrations/postgres/0002_instance_roles.sql +4 -0
- package/dist/migrations/postgres/0003_credential_scopes.sql +4 -0
- package/dist/migrations/postgres/meta/0002_snapshot.json +2860 -0
- package/dist/migrations/postgres/meta/0003_snapshot.json +2872 -0
- package/dist/migrations/postgres/meta/_journal.json +14 -0
- package/dist/migrations/sqlite/0002_instance_roles.sql +2 -0
- package/dist/migrations/sqlite/0003_credential_scopes.sql +2 -0
- package/dist/migrations/sqlite/meta/0002_snapshot.json +2594 -0
- package/dist/migrations/sqlite/meta/0003_snapshot.json +2608 -0
- package/dist/migrations/sqlite/meta/_journal.json +14 -0
- package/dist/portable.d.ts +2 -2
- package/dist/{schema-BqCB3XFm.d.ts → schema-a7PkFgea.d.ts} +68 -0
- package/dist/schema-sqlite.d.ts +76 -0
- package/dist/schema-sqlite.js +4 -0
- package/dist/schema-version.d.ts +1 -1
- package/dist/schema-version.js +60 -26
- package/dist/schema.d.ts +1 -1
- package/dist/schema.js +4 -0
- package/package.json +2 -2
- package/src/dialect.ts +14 -0
- package/src/grants.ts +272 -11
- package/src/log.ts +66 -2
- package/src/migrations/postgres/0002_instance_roles.sql +4 -0
- package/src/migrations/postgres/0003_credential_scopes.sql +4 -0
- package/src/migrations/postgres/meta/0002_snapshot.json +2860 -0
- package/src/migrations/postgres/meta/0003_snapshot.json +2872 -0
- package/src/migrations/postgres/meta/_journal.json +14 -0
- package/src/migrations/sqlite/0002_instance_roles.sql +2 -0
- package/src/migrations/sqlite/0003_credential_scopes.sql +2 -0
- package/src/migrations/sqlite/meta/0002_snapshot.json +2594 -0
- package/src/migrations/sqlite/meta/0003_snapshot.json +2608 -0
- package/src/migrations/sqlite/meta/_journal.json +14 -0
- package/src/schema.sqlite.ts +6 -0
- package/src/schema.ts +11 -1
|
@@ -15,6 +15,20 @@
|
|
|
15
15
|
"when": 1791242675074,
|
|
16
16
|
"tag": "0001_mcp_approvals",
|
|
17
17
|
"breakpoints": true
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"idx": 2,
|
|
21
|
+
"version": "6",
|
|
22
|
+
"when": 1791619334012,
|
|
23
|
+
"tag": "0002_instance_roles",
|
|
24
|
+
"breakpoints": true
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"idx": 3,
|
|
28
|
+
"version": "6",
|
|
29
|
+
"when": 1791676487593,
|
|
30
|
+
"tag": "0003_credential_scopes",
|
|
31
|
+
"breakpoints": true
|
|
18
32
|
}
|
|
19
33
|
]
|
|
20
34
|
}
|
package/dist/portable.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { m as schema_d_exports } from "./schema-
|
|
2
|
-
import { t as Database } from "./database-
|
|
1
|
+
import { m as schema_d_exports } from "./schema-a7PkFgea.js";
|
|
2
|
+
import { t as Database } from "./database-C63WjCrC.js";
|
|
3
3
|
import { t as schema_sqlite_d_exports } from "./schema-sqlite.js";
|
|
4
4
|
import { LibSQLDatabase } from "drizzle-orm/libsql";
|
|
5
5
|
//#region src/portable.d.ts
|
|
@@ -811,6 +811,40 @@ declare const vaultMembers: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
|
811
811
|
identity: undefined;
|
|
812
812
|
generated: undefined;
|
|
813
813
|
}, {}, {}>;
|
|
814
|
+
role: import("drizzle-orm/pg-core").PgColumn<{
|
|
815
|
+
name: "role";
|
|
816
|
+
tableName: "vault_members";
|
|
817
|
+
dataType: "string";
|
|
818
|
+
columnType: "PgText";
|
|
819
|
+
data: string;
|
|
820
|
+
driverParam: string;
|
|
821
|
+
notNull: false;
|
|
822
|
+
hasDefault: false;
|
|
823
|
+
isPrimaryKey: false;
|
|
824
|
+
isAutoincrement: false;
|
|
825
|
+
hasRuntimeDefault: false;
|
|
826
|
+
enumValues: [string, ...string[]];
|
|
827
|
+
baseColumn: never;
|
|
828
|
+
identity: undefined;
|
|
829
|
+
generated: undefined;
|
|
830
|
+
}, {}, {}>;
|
|
831
|
+
scope: import("drizzle-orm/pg-core").PgColumn<{
|
|
832
|
+
name: "scope";
|
|
833
|
+
tableName: "vault_members";
|
|
834
|
+
dataType: "string";
|
|
835
|
+
columnType: "PgText";
|
|
836
|
+
data: string;
|
|
837
|
+
driverParam: string;
|
|
838
|
+
notNull: false;
|
|
839
|
+
hasDefault: false;
|
|
840
|
+
isPrimaryKey: false;
|
|
841
|
+
isAutoincrement: false;
|
|
842
|
+
hasRuntimeDefault: false;
|
|
843
|
+
enumValues: [string, ...string[]];
|
|
844
|
+
baseColumn: never;
|
|
845
|
+
identity: undefined;
|
|
846
|
+
generated: undefined;
|
|
847
|
+
}, {}, {}>;
|
|
814
848
|
generation: import("drizzle-orm/pg-core").PgColumn<{
|
|
815
849
|
name: "generation";
|
|
816
850
|
tableName: "vault_members";
|
|
@@ -2106,6 +2140,23 @@ declare const serviceBindings: import("drizzle-orm/pg-core").PgTableWithColumns<
|
|
|
2106
2140
|
identity: undefined;
|
|
2107
2141
|
generated: undefined;
|
|
2108
2142
|
}, {}, {}>;
|
|
2143
|
+
scope: import("drizzle-orm/pg-core").PgColumn<{
|
|
2144
|
+
name: "scope";
|
|
2145
|
+
tableName: "service_bindings";
|
|
2146
|
+
dataType: "string";
|
|
2147
|
+
columnType: "PgText";
|
|
2148
|
+
data: string;
|
|
2149
|
+
driverParam: string;
|
|
2150
|
+
notNull: false;
|
|
2151
|
+
hasDefault: false;
|
|
2152
|
+
isPrimaryKey: false;
|
|
2153
|
+
isAutoincrement: false;
|
|
2154
|
+
hasRuntimeDefault: false;
|
|
2155
|
+
enumValues: [string, ...string[]];
|
|
2156
|
+
baseColumn: never;
|
|
2157
|
+
identity: undefined;
|
|
2158
|
+
generated: undefined;
|
|
2159
|
+
}, {}, {}>;
|
|
2109
2160
|
label: import("drizzle-orm/pg-core").PgColumn<{
|
|
2110
2161
|
name: "label";
|
|
2111
2162
|
tableName: "service_bindings";
|
|
@@ -3128,6 +3179,23 @@ declare const credentials: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
|
3128
3179
|
identity: undefined;
|
|
3129
3180
|
generated: undefined;
|
|
3130
3181
|
}, {}, {}>;
|
|
3182
|
+
scope: import("drizzle-orm/pg-core").PgColumn<{
|
|
3183
|
+
name: "scope";
|
|
3184
|
+
tableName: "credentials";
|
|
3185
|
+
dataType: "string";
|
|
3186
|
+
columnType: "PgText";
|
|
3187
|
+
data: string;
|
|
3188
|
+
driverParam: string;
|
|
3189
|
+
notNull: false;
|
|
3190
|
+
hasDefault: false;
|
|
3191
|
+
isPrimaryKey: false;
|
|
3192
|
+
isAutoincrement: false;
|
|
3193
|
+
hasRuntimeDefault: false;
|
|
3194
|
+
enumValues: [string, ...string[]];
|
|
3195
|
+
baseColumn: never;
|
|
3196
|
+
identity: undefined;
|
|
3197
|
+
generated: undefined;
|
|
3198
|
+
}, {}, {}>;
|
|
3131
3199
|
label: import("drizzle-orm/pg-core").PgColumn<{
|
|
3132
3200
|
name: "label";
|
|
3133
3201
|
tableName: "credentials";
|
package/dist/schema-sqlite.d.ts
CHANGED
|
@@ -840,6 +840,44 @@ export declare const vaultMembers: import("drizzle-orm/sqlite-core").SQLiteTable
|
|
|
840
840
|
identity: undefined;
|
|
841
841
|
generated: undefined;
|
|
842
842
|
}, {}, {}>;
|
|
843
|
+
role: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
844
|
+
name: "role";
|
|
845
|
+
tableName: "vault_members";
|
|
846
|
+
dataType: "string";
|
|
847
|
+
columnType: "SQLiteText";
|
|
848
|
+
data: string;
|
|
849
|
+
driverParam: string;
|
|
850
|
+
notNull: false;
|
|
851
|
+
hasDefault: false;
|
|
852
|
+
isPrimaryKey: false;
|
|
853
|
+
isAutoincrement: false;
|
|
854
|
+
hasRuntimeDefault: false;
|
|
855
|
+
enumValues: [string, ...string[]];
|
|
856
|
+
baseColumn: never;
|
|
857
|
+
identity: undefined;
|
|
858
|
+
generated: undefined;
|
|
859
|
+
}, {}, {
|
|
860
|
+
length: undefined;
|
|
861
|
+
}>;
|
|
862
|
+
scope: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
863
|
+
name: "scope";
|
|
864
|
+
tableName: "vault_members";
|
|
865
|
+
dataType: "string";
|
|
866
|
+
columnType: "SQLiteText";
|
|
867
|
+
data: string;
|
|
868
|
+
driverParam: string;
|
|
869
|
+
notNull: false;
|
|
870
|
+
hasDefault: false;
|
|
871
|
+
isPrimaryKey: false;
|
|
872
|
+
isAutoincrement: false;
|
|
873
|
+
hasRuntimeDefault: false;
|
|
874
|
+
enumValues: [string, ...string[]];
|
|
875
|
+
baseColumn: never;
|
|
876
|
+
identity: undefined;
|
|
877
|
+
generated: undefined;
|
|
878
|
+
}, {}, {
|
|
879
|
+
length: undefined;
|
|
880
|
+
}>;
|
|
843
881
|
generation: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
844
882
|
name: "generation";
|
|
845
883
|
tableName: "vault_members";
|
|
@@ -2193,6 +2231,25 @@ export declare const serviceBindings: import("drizzle-orm/sqlite-core").SQLiteTa
|
|
|
2193
2231
|
}, {}, {
|
|
2194
2232
|
length: undefined;
|
|
2195
2233
|
}>;
|
|
2234
|
+
scope: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
2235
|
+
name: "scope";
|
|
2236
|
+
tableName: "service_bindings";
|
|
2237
|
+
dataType: "string";
|
|
2238
|
+
columnType: "SQLiteText";
|
|
2239
|
+
data: string;
|
|
2240
|
+
driverParam: string;
|
|
2241
|
+
notNull: false;
|
|
2242
|
+
hasDefault: false;
|
|
2243
|
+
isPrimaryKey: false;
|
|
2244
|
+
isAutoincrement: false;
|
|
2245
|
+
hasRuntimeDefault: false;
|
|
2246
|
+
enumValues: [string, ...string[]];
|
|
2247
|
+
baseColumn: never;
|
|
2248
|
+
identity: undefined;
|
|
2249
|
+
generated: undefined;
|
|
2250
|
+
}, {}, {
|
|
2251
|
+
length: undefined;
|
|
2252
|
+
}>;
|
|
2196
2253
|
label: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
2197
2254
|
name: "label";
|
|
2198
2255
|
tableName: "service_bindings";
|
|
@@ -3237,6 +3294,25 @@ export declare const credentials: import("drizzle-orm/sqlite-core").SQLiteTableW
|
|
|
3237
3294
|
}, {}, {
|
|
3238
3295
|
length: number | undefined;
|
|
3239
3296
|
}>;
|
|
3297
|
+
scope: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
3298
|
+
name: "scope";
|
|
3299
|
+
tableName: "credentials";
|
|
3300
|
+
dataType: "string";
|
|
3301
|
+
columnType: "SQLiteText";
|
|
3302
|
+
data: string;
|
|
3303
|
+
driverParam: string;
|
|
3304
|
+
notNull: false;
|
|
3305
|
+
hasDefault: false;
|
|
3306
|
+
isPrimaryKey: false;
|
|
3307
|
+
isAutoincrement: false;
|
|
3308
|
+
hasRuntimeDefault: false;
|
|
3309
|
+
enumValues: [string, ...string[]];
|
|
3310
|
+
baseColumn: never;
|
|
3311
|
+
identity: undefined;
|
|
3312
|
+
generated: undefined;
|
|
3313
|
+
}, {}, {
|
|
3314
|
+
length: undefined;
|
|
3315
|
+
}>;
|
|
3240
3316
|
label: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
3241
3317
|
name: "label";
|
|
3242
3318
|
tableName: "credentials";
|
package/dist/schema-sqlite.js
CHANGED
|
@@ -148,6 +148,8 @@ const vaultMembers = sqliteTable("vault_members", {
|
|
|
148
148
|
principal: text().primaryKey(),
|
|
149
149
|
status: text().notNull(),
|
|
150
150
|
owner: flag("owner").notNull().default(false),
|
|
151
|
+
role: text(),
|
|
152
|
+
scope: text(),
|
|
151
153
|
generation: integer().notNull().default(0),
|
|
152
154
|
createdAt: integer("created_at", { mode: "number" }).notNull(),
|
|
153
155
|
createdBy: text("created_by").notNull(),
|
|
@@ -350,6 +352,7 @@ const serviceBindings = sqliteTable("service_bindings", {
|
|
|
350
352
|
issuer: text().notNull(),
|
|
351
353
|
jwksUri: text("jwks_uri").notNull(),
|
|
352
354
|
claims: text().notNull(),
|
|
355
|
+
scope: text(),
|
|
353
356
|
label: text(),
|
|
354
357
|
createdAt: createdAt(),
|
|
355
358
|
createdBy: text("created_by").notNull(),
|
|
@@ -467,6 +470,7 @@ const credentials = sqliteTable("credentials", {
|
|
|
467
470
|
generation: integer().notNull(),
|
|
468
471
|
principal: text().notNull(),
|
|
469
472
|
identityId: text("identity_id"),
|
|
473
|
+
scope: text(),
|
|
470
474
|
label: text(),
|
|
471
475
|
createdAt: createdAt(),
|
|
472
476
|
createdBy: text("created_by").notNull(),
|
package/dist/schema-version.d.ts
CHANGED
package/dist/schema-version.js
CHANGED
|
@@ -8,32 +8,66 @@ import { count, sql } from "drizzle-orm";
|
|
|
8
8
|
* too.
|
|
9
9
|
*/
|
|
10
10
|
const KNOWN_MIGRATIONS = {
|
|
11
|
-
postgres: [
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
11
|
+
postgres: [
|
|
12
|
+
{
|
|
13
|
+
"idx": 0,
|
|
14
|
+
"version": "7",
|
|
15
|
+
"when": 1791237720902,
|
|
16
|
+
"tag": "0000_baseline",
|
|
17
|
+
"breakpoints": true
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"idx": 1,
|
|
21
|
+
"version": "7",
|
|
22
|
+
"when": 1791242674488,
|
|
23
|
+
"tag": "0001_mcp_approvals",
|
|
24
|
+
"breakpoints": true
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"idx": 2,
|
|
28
|
+
"version": "7",
|
|
29
|
+
"when": 1791619333441,
|
|
30
|
+
"tag": "0002_instance_roles",
|
|
31
|
+
"breakpoints": true
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"idx": 3,
|
|
35
|
+
"version": "7",
|
|
36
|
+
"when": 1791676486914,
|
|
37
|
+
"tag": "0003_credential_scopes",
|
|
38
|
+
"breakpoints": true
|
|
39
|
+
}
|
|
40
|
+
].map((entry) => entry.tag),
|
|
41
|
+
sqlite: [
|
|
42
|
+
{
|
|
43
|
+
"idx": 0,
|
|
44
|
+
"version": "6",
|
|
45
|
+
"when": 1791237724735,
|
|
46
|
+
"tag": "0000_baseline",
|
|
47
|
+
"breakpoints": true
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"idx": 1,
|
|
51
|
+
"version": "6",
|
|
52
|
+
"when": 1791242675074,
|
|
53
|
+
"tag": "0001_mcp_approvals",
|
|
54
|
+
"breakpoints": true
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"idx": 2,
|
|
58
|
+
"version": "6",
|
|
59
|
+
"when": 1791619334012,
|
|
60
|
+
"tag": "0002_instance_roles",
|
|
61
|
+
"breakpoints": true
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"idx": 3,
|
|
65
|
+
"version": "6",
|
|
66
|
+
"when": 1791676487593,
|
|
67
|
+
"tag": "0003_credential_scopes",
|
|
68
|
+
"breakpoints": true
|
|
69
|
+
}
|
|
70
|
+
].map((entry) => entry.tag)
|
|
37
71
|
};
|
|
38
72
|
/**
|
|
39
73
|
* Whether the database has applied every migration this version ships:
|
package/dist/schema.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { _ as secrets, a as deviceAuthorizations, b as vaultGrants, c as environmentsRelations, d as mcpConnections, f as oauthClients, g as secretVersions, h as secretReferences, i as credentials, l as identities, n as auditLog, o as dismissedKeys, p as projects, r as consumedTokens, s as environments, t as auditChainHead, u as mcpApprovals, v as secretsRelations, x as vaultMembers, y as serviceBindings } from "./schema-
|
|
1
|
+
import { _ as secrets, a as deviceAuthorizations, b as vaultGrants, c as environmentsRelations, d as mcpConnections, f as oauthClients, g as secretVersions, h as secretReferences, i as credentials, l as identities, n as auditLog, o as dismissedKeys, p as projects, r as consumedTokens, s as environments, t as auditChainHead, u as mcpApprovals, v as secretsRelations, x as vaultMembers, y as serviceBindings } from "./schema-a7PkFgea.js";
|
|
2
2
|
export { auditChainHead, auditLog, consumedTokens, credentials, deviceAuthorizations, dismissedKeys, environments, environmentsRelations, identities, mcpApprovals, mcpConnections, oauthClients, projects, secretReferences, secretVersions, secrets, secretsRelations, serviceBindings, vaultGrants, vaultMembers };
|
package/dist/schema.js
CHANGED
|
@@ -169,6 +169,8 @@ const vaultMembers = pgTable("vault_members", {
|
|
|
169
169
|
principal: text().primaryKey(),
|
|
170
170
|
status: text().notNull(),
|
|
171
171
|
owner: boolean().notNull().default(false),
|
|
172
|
+
role: text(),
|
|
173
|
+
scope: text(),
|
|
172
174
|
generation: integer().notNull().default(0),
|
|
173
175
|
createdAt: bigint("created_at", { mode: "number" }).notNull(),
|
|
174
176
|
createdBy: text("created_by").notNull(),
|
|
@@ -398,6 +400,7 @@ const serviceBindings = pgTable("service_bindings", {
|
|
|
398
400
|
issuer: text().notNull(),
|
|
399
401
|
jwksUri: text("jwks_uri").notNull(),
|
|
400
402
|
claims: text().notNull(),
|
|
403
|
+
scope: text(),
|
|
401
404
|
label: text(),
|
|
402
405
|
createdAt: createdAt(),
|
|
403
406
|
createdBy: text("created_by").notNull(),
|
|
@@ -533,6 +536,7 @@ const credentials = pgTable("credentials", {
|
|
|
533
536
|
generation: integer().notNull(),
|
|
534
537
|
principal: text().notNull(),
|
|
535
538
|
identityId: uuid("identity_id"),
|
|
539
|
+
scope: text(),
|
|
536
540
|
label: text(),
|
|
537
541
|
createdAt: createdAt(),
|
|
538
542
|
createdBy: text("created_by").notNull(),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@coffre/db",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "coffre's database: the schema, its migrations and the connections, on Postgres or SQLite.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
"drizzle-orm": "0.45.2",
|
|
80
80
|
"pg": "8.16.3",
|
|
81
81
|
"pg-connection-string": "2.14.0",
|
|
82
|
-
"@coffre/core": "0.
|
|
82
|
+
"@coffre/core": "0.5.0"
|
|
83
83
|
},
|
|
84
84
|
"devDependencies": {
|
|
85
85
|
"@types/node": "26.1.1",
|
package/src/dialect.ts
CHANGED
|
@@ -156,6 +156,20 @@ export function clockMillis(db: Queryable): SQL<number> {
|
|
|
156
156
|
}
|
|
157
157
|
}
|
|
158
158
|
|
|
159
|
+
/**
|
|
160
|
+
* Whether a timestamp column is still ahead of the database clock as the
|
|
161
|
+
* statement runs: a condition, for a write that must not land once the
|
|
162
|
+
* time it names has passed.
|
|
163
|
+
*/
|
|
164
|
+
export function ahead(db: Queryable, column: SQLWrapper): SQL {
|
|
165
|
+
switch (engineOf(db)) {
|
|
166
|
+
case 'postgres':
|
|
167
|
+
return sql`${column} > clock_timestamp()`;
|
|
168
|
+
case 'sqlite':
|
|
169
|
+
return sql`${column} > CAST(unixepoch('subsec') * 1000 AS INTEGER)`;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
159
173
|
/**
|
|
160
174
|
* The migrator's own ledger, read by readiness to tell a database that is
|
|
161
175
|
* up but not yet migrated from one that is ready. Drizzle keeps it in a
|