@vrplatform/kysely 1.3.45-5769 → 1.3.45-5788
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/build/main/control-plane/index.d.ts +18 -17
- package/build/main/control-plane/index.js +61 -0
- package/build/main/control-plane/index.js.map +1 -1
- package/build/main/index.d.ts +4 -2
- package/build/main/index.js +2 -1
- package/build/main/index.js.map +1 -1
- package/build/main/isomorphic.d.ts +4 -2
- package/build/main/isomorphic.js.map +1 -1
- package/build/main/local/digest.d.ts +3 -3
- package/build/main/local/digest.js.map +1 -1
- package/build/main/local/index.d.ts +5 -1
- package/build/main/local/index.js +208 -0
- package/build/main/local/index.js.map +1 -1
- package/build/main/regional.d.ts +6 -1
- package/build/main/regional.js +13 -9
- package/build/main/regional.js.map +1 -1
- package/build/main/test/index.d.ts +4 -6
- package/build/main/test/index.js.map +1 -1
- package/build/main/transaction.d.ts +3 -3
- package/build/main/transaction.js.map +1 -1
- package/build/module/control-plane/index.d.ts +18 -17
- package/build/module/control-plane/index.js +49 -1
- package/build/module/control-plane/index.js.map +1 -1
- package/build/module/index.d.ts +4 -2
- package/build/module/index.js +2 -1
- package/build/module/index.js.map +1 -1
- package/build/module/isomorphic.d.ts +4 -2
- package/build/module/isomorphic.js.map +1 -1
- package/build/module/local/digest.d.ts +3 -3
- package/build/module/local/digest.js.map +1 -1
- package/build/module/local/index.d.ts +5 -1
- package/build/module/local/index.js +209 -1
- package/build/module/local/index.js.map +1 -1
- package/build/module/regional.d.ts +6 -1
- package/build/module/regional.js +13 -9
- package/build/module/regional.js.map +1 -1
- package/build/module/test/index.d.ts +4 -6
- package/build/module/test/index.js +1 -1
- package/build/module/test/index.js.map +1 -1
- package/build/module/transaction.d.ts +3 -3
- package/build/module/transaction.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type ColumnType, type Kysely } from 'kysely';
|
|
2
2
|
export type Generated<T> = T extends ColumnType<infer S, infer I, infer U> ? ColumnType<S, I | undefined, U> : ColumnType<T, T | undefined, T>;
|
|
3
3
|
export type Json = JsonValue;
|
|
4
4
|
export type JsonArray = JsonValue[];
|
|
@@ -172,19 +172,20 @@ export interface ControlPlaneUser {
|
|
|
172
172
|
updatedAt: Generated<Timestamp | null>;
|
|
173
173
|
}
|
|
174
174
|
export interface ControlPlaneDB {
|
|
175
|
-
'
|
|
176
|
-
'
|
|
177
|
-
'
|
|
178
|
-
'
|
|
179
|
-
'
|
|
180
|
-
'
|
|
181
|
-
'
|
|
182
|
-
'
|
|
183
|
-
'
|
|
184
|
-
'
|
|
185
|
-
'
|
|
186
|
-
'
|
|
187
|
-
'
|
|
188
|
-
'
|
|
189
|
-
'
|
|
190
|
-
}
|
|
175
|
+
'controlPlane.app': ControlPlaneApp;
|
|
176
|
+
'controlPlane.bookingChannel': ControlPlaneBookingChannel;
|
|
177
|
+
'controlPlane.bookingChannelIconCandidate': ControlPlaneBookingChannelIconCandidate;
|
|
178
|
+
'controlPlane.connectionRoute': ControlPlaneConnectionRoute;
|
|
179
|
+
'controlPlane.controlPlaneOutbox': ControlPlaneOutbox;
|
|
180
|
+
'controlPlane.currency': ControlPlaneCurrency;
|
|
181
|
+
'controlPlane.events': ControlPlaneEvent;
|
|
182
|
+
'controlPlane.feature': ControlPlaneFeature;
|
|
183
|
+
'controlPlane.featureApproval': ControlPlaneFeatureApproval;
|
|
184
|
+
'controlPlane.featureEnabledTeam': ControlPlaneFeatureEnabledTeam;
|
|
185
|
+
'controlPlane.tenant': ControlPlaneTenant;
|
|
186
|
+
'controlPlane.tenantUser': ControlPlaneTenantUser;
|
|
187
|
+
'controlPlane.token': ControlPlaneToken;
|
|
188
|
+
'controlPlane.user': ControlPlaneUser;
|
|
189
|
+
'controlPlaneCore.issueMessageOverwrite': ControlPlaneIssueMessageOverwrite;
|
|
190
|
+
}
|
|
191
|
+
export declare function withControlPlaneSchema(kysely: Kysely<ControlPlaneDB>, schema: string, issueMessageOverwriteSchema?: string): Kysely<ControlPlaneDB>;
|
|
@@ -1,3 +1,64 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
+
};
|
|
8
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
+
};
|
|
13
|
+
var _ControlPlaneSchemaPlugin_transformer;
|
|
2
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.withControlPlaneSchema = withControlPlaneSchema;
|
|
16
|
+
const kysely_1 = require("kysely");
|
|
17
|
+
class ControlPlaneSchemaTransformer extends kysely_1.OperationNodeTransformer {
|
|
18
|
+
constructor(schema, issueMessageOverwriteSchema) {
|
|
19
|
+
super();
|
|
20
|
+
this.schema = schema;
|
|
21
|
+
this.issueMessageOverwriteSchema = issueMessageOverwriteSchema;
|
|
22
|
+
}
|
|
23
|
+
transformSchemableIdentifier(node, queryId) {
|
|
24
|
+
const transformed = super.transformSchemableIdentifier(node, queryId);
|
|
25
|
+
if (transformed.schema?.name === 'controlPlane' ||
|
|
26
|
+
transformed.schema?.name === 'control_plane') {
|
|
27
|
+
return { ...transformed, schema: kysely_1.IdentifierNode.create(this.schema) };
|
|
28
|
+
}
|
|
29
|
+
if (transformed.schema?.name === 'controlPlaneCore' ||
|
|
30
|
+
transformed.schema?.name === 'control_plane_core') {
|
|
31
|
+
return {
|
|
32
|
+
...transformed,
|
|
33
|
+
schema: kysely_1.IdentifierNode.create(this.issueMessageOverwriteSchema),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return transformed;
|
|
37
|
+
}
|
|
38
|
+
transformFunction(node, queryId) {
|
|
39
|
+
const transformed = super.transformFunction(node, queryId);
|
|
40
|
+
return node.func.startsWith('controlPlane.')
|
|
41
|
+
? {
|
|
42
|
+
...transformed,
|
|
43
|
+
func: `${this.schema}.${transformed.func.slice('controlPlane.'.length)}`,
|
|
44
|
+
}
|
|
45
|
+
: transformed;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
class ControlPlaneSchemaPlugin {
|
|
49
|
+
constructor(schema, issueMessageOverwriteSchema) {
|
|
50
|
+
_ControlPlaneSchemaPlugin_transformer.set(this, void 0);
|
|
51
|
+
__classPrivateFieldSet(this, _ControlPlaneSchemaPlugin_transformer, new ControlPlaneSchemaTransformer(schema, issueMessageOverwriteSchema), "f");
|
|
52
|
+
}
|
|
53
|
+
transformQuery(args) {
|
|
54
|
+
return __classPrivateFieldGet(this, _ControlPlaneSchemaPlugin_transformer, "f").transformNode(args.node, args.queryId);
|
|
55
|
+
}
|
|
56
|
+
async transformResult(args) {
|
|
57
|
+
return args.result;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
_ControlPlaneSchemaPlugin_transformer = new WeakMap();
|
|
61
|
+
function withControlPlaneSchema(kysely, schema, issueMessageOverwriteSchema = 'core') {
|
|
62
|
+
return kysely.withPlugin(new ControlPlaneSchemaPlugin(schema, issueMessageOverwriteSchema));
|
|
63
|
+
}
|
|
3
64
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"src/","sources":["control-plane/index.ts"],"names":[],"mappings":"","sourcesContent":["import type { ColumnType } from 'kysely';\n\nexport type Generated<T> =\n T extends ColumnType<infer S, infer I, infer U>\n ? ColumnType<S, I | undefined, U>\n : ColumnType<T, T | undefined, T>;\n\nexport type Json = JsonValue;\n\nexport type JsonArray = JsonValue[];\n\nexport type JsonObject = {\n [x: string]: JsonValue | undefined;\n};\n\nexport type JsonPrimitive = boolean | number | string | null;\n\nexport type JsonValue = JsonArray | JsonObject | JsonPrimitive;\n\nexport type Timestamp = ColumnType<Date | string, Date | string, Date | string>;\n\nexport interface ControlPlaneApp {\n authentication: Generated<Json>;\n category: string | null;\n color: string | null;\n createdAt: Generated<Timestamp>;\n icon: string | null;\n iconRound: string | null;\n id: Generated<string>;\n info: Json | null;\n name: string;\n type: string;\n version: Generated<number>;\n}\n\nexport interface ControlPlaneBookingChannel {\n channelRef: string | null;\n color: string | null;\n createdAt: Generated<Timestamp>;\n icon: string | null;\n iconProvider: string | null;\n id: Generated<string>;\n lastGenerateRun: Timestamp | null;\n logo: string | null;\n logoProvider: string | null;\n selectedBookingChannelIconCandidateId: string | null;\n selectedBookingChannelLogoCandidateId: string | null;\n uniqueRef: string;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneBookingChannelIconCandidate {\n bookingChannelId: string;\n cloudflareImageId: string | null;\n color: string | null;\n comment: string | null;\n createdAt: Generated<Timestamp>;\n externalIcon: string | null;\n height: number | null;\n id: Generated<string>;\n provider: Generated<string>;\n source: string | null;\n updatedAt: Generated<Timestamp>;\n width: number | null;\n}\n\nexport interface ControlPlaneCurrency {\n name: string;\n}\n\nexport interface ControlPlaneEvent {\n createdAt: Generated<Timestamp>;\n id: Generated<string>;\n name: string;\n packageName: string;\n props: Json;\n tenantId: string | null;\n timestamp: Generated<Timestamp>;\n trackedAt: Generated<Timestamp | null>;\n userId: string | null;\n}\n\nexport interface ControlPlaneConnectionRoute {\n connectionId: string;\n createdAt: Generated<Timestamp>;\n tenantId: string;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneFeature {\n createdAt: Generated<Timestamp>;\n description: string | null;\n id: Generated<string>;\n issueUrl: string | null;\n requiredApprovals: Generated<Json | null>;\n status: Generated<string | null>;\n tenantId: string | null;\n title: string;\n updatedAt: Generated<Timestamp>;\n url: string | null;\n}\n\nexport interface ControlPlaneFeatureEnabledTeam {\n createdAt: Generated<Timestamp>;\n featureId: string;\n id: Generated<string>;\n status: Generated<string | null>;\n tenantId: string;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneFeatureApproval {\n createdAt: Generated<Timestamp>;\n featureId: string;\n id: Generated<string>;\n status: Generated<string | null>;\n updatedAt: Generated<Timestamp>;\n userId: string;\n}\n\nexport interface ControlPlaneIssueMessageOverwrite {\n createdAt: Generated<Timestamp>;\n id: Generated<string>;\n message: string;\n pattern: string;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneOutbox {\n aggregateId: string;\n aggregateType: string;\n attempts: Generated<number>;\n createdAt: Generated<Timestamp>;\n dataRegion: string | null;\n eventType: string;\n eventVersion: number;\n id: Generated<string>;\n lastError: string | null;\n payload: Generated<Json>;\n publishedAt: Timestamp | null;\n}\n\nexport interface ControlPlaneTenant {\n billingPartnerId: string | null;\n billingPlan: string | null;\n createdAt: Generated<Timestamp>;\n dataRegion: Generated<string>;\n id: Generated<string>;\n name: string;\n partnerId: string | null;\n slug: string;\n status: Generated<string | null>;\n storageRealm: Generated<string>;\n type: Generated<string | null>;\n uniqueRef: string | null;\n updatedAt: Generated<Timestamp | null>;\n}\n\nexport interface ControlPlaneTenantUser {\n createdAt: Generated<Timestamp | null>;\n id: Generated<string>;\n lastInvitedAt: Timestamp | null;\n role: Generated<string | null>;\n status: Generated<string | null>;\n tenantId: string;\n updatedAt: Generated<Timestamp | null>;\n userId: string;\n}\n\nexport interface ControlPlaneToken {\n createdAt: Generated<Timestamp>;\n expiresAt: Timestamp | null;\n id: Generated<string>;\n nanoId: Generated<string>;\n payload: Generated<Json>;\n tenantId: string | null;\n type: string | null;\n userId: string | null;\n}\n\nexport interface ControlPlaneUser {\n clerkId: string | null;\n createdAt: Generated<Timestamp | null>;\n email: string | null;\n firstName: string | null;\n id: Generated<string>;\n isAdmin: Generated<boolean>;\n lastName: string | null;\n lastSeen: Timestamp | null;\n name: string | null;\n partnerId: string | null;\n phone: string | null;\n secondaryEmails: Generated<Json>;\n status: Generated<string | null>;\n sub: string | null;\n type: Generated<string | null>;\n updatedAt: Generated<Timestamp | null>;\n}\n\nexport interface ControlPlaneDB {\n 'core.issueMessageOverwrite': ControlPlaneIssueMessageOverwrite;\n 'public.app': ControlPlaneApp;\n 'public.bookingChannel': ControlPlaneBookingChannel;\n 'public.bookingChannelIconCandidate': ControlPlaneBookingChannelIconCandidate;\n 'public.connectionRoute': ControlPlaneConnectionRoute;\n 'public.currency': ControlPlaneCurrency;\n 'public.events': ControlPlaneEvent;\n 'public.feature': ControlPlaneFeature;\n 'public.featureApproval': ControlPlaneFeatureApproval;\n 'public.featureEnabledTeam': ControlPlaneFeatureEnabledTeam;\n 'public.controlPlaneOutbox': ControlPlaneOutbox;\n 'public.tenant': ControlPlaneTenant;\n 'public.tenantUser': ControlPlaneTenantUser;\n 'public.token': ControlPlaneToken;\n 'public.user': ControlPlaneUser;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"src/","sources":["control-plane/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAySA,wDAQC;AAjTD,mCAcgB;AAyNhB,MAAM,6BAA8B,SAAQ,iCAAwB;IAClE,YACW,MAAc,EACd,2BAAmC;QAE5C,KAAK,EAAE,CAAC;QAHC,WAAM,GAAN,MAAM,CAAQ;QACd,gCAA2B,GAA3B,2BAA2B,CAAQ;IAG9C,CAAC;IAEkB,4BAA4B,CAC7C,IAA6B,EAC7B,OAAgB;QAEhB,MAAM,WAAW,GAAG,KAAK,CAAC,4BAA4B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACtE,IACE,WAAW,CAAC,MAAM,EAAE,IAAI,KAAK,cAAc;YAC3C,WAAW,CAAC,MAAM,EAAE,IAAI,KAAK,eAAe,EAC5C,CAAC;YACD,OAAO,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE,uBAAc,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACxE,CAAC;QACD,IACE,WAAW,CAAC,MAAM,EAAE,IAAI,KAAK,kBAAkB;YAC/C,WAAW,CAAC,MAAM,EAAE,IAAI,KAAK,oBAAoB,EACjD,CAAC;YACD,OAAO;gBACL,GAAG,WAAW;gBACd,MAAM,EAAE,uBAAc,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC;aAChE,CAAC;QACJ,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;IAEkB,iBAAiB,CAClC,IAAkB,EAClB,OAAgB;QAEhB,MAAM,WAAW,GAAG,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;YAC1C,CAAC,CAAC;gBACE,GAAG,WAAW;gBACd,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE;aACzE;YACH,CAAC,CAAC,WAAW,CAAC;IAClB,CAAC;CACF;AAED,MAAM,wBAAwB;IAG5B,YAAY,MAAc,EAAE,2BAAmC;QAFtD,wDAA4C;QAGnD,uBAAA,IAAI,yCAAgB,IAAI,6BAA6B,CACnD,MAAM,EACN,2BAA2B,CAC5B,MAAA,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,IAA8B;QAC3C,OAAO,uBAAA,IAAI,6CAAa,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,IAA+B;QAE/B,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;;AAED,SAAgB,sBAAsB,CACpC,MAA8B,EAC9B,MAAc,EACd,2BAA2B,GAAG,MAAM;IAEpC,OAAO,MAAM,CAAC,UAAU,CACtB,IAAI,wBAAwB,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAClE,CAAC;AACJ,CAAC","sourcesContent":["import {\n type ColumnType,\n type FunctionNode,\n IdentifierNode,\n type Kysely,\n type KyselyPlugin,\n OperationNodeTransformer,\n type PluginTransformQueryArgs,\n type PluginTransformResultArgs,\n type QueryId,\n type QueryResult,\n type RootOperationNode,\n type SchemableIdentifierNode,\n type UnknownRow,\n} from 'kysely';\n\nexport type Generated<T> =\n T extends ColumnType<infer S, infer I, infer U>\n ? ColumnType<S, I | undefined, U>\n : ColumnType<T, T | undefined, T>;\n\nexport type Json = JsonValue;\n\nexport type JsonArray = JsonValue[];\n\nexport type JsonObject = {\n [x: string]: JsonValue | undefined;\n};\n\nexport type JsonPrimitive = boolean | number | string | null;\n\nexport type JsonValue = JsonArray | JsonObject | JsonPrimitive;\n\nexport type Timestamp = ColumnType<Date | string, Date | string, Date | string>;\n\nexport interface ControlPlaneApp {\n authentication: Generated<Json>;\n category: string | null;\n color: string | null;\n createdAt: Generated<Timestamp>;\n icon: string | null;\n iconRound: string | null;\n id: Generated<string>;\n info: Json | null;\n name: string;\n type: string;\n version: Generated<number>;\n}\n\nexport interface ControlPlaneBookingChannel {\n channelRef: string | null;\n color: string | null;\n createdAt: Generated<Timestamp>;\n icon: string | null;\n iconProvider: string | null;\n id: Generated<string>;\n lastGenerateRun: Timestamp | null;\n logo: string | null;\n logoProvider: string | null;\n selectedBookingChannelIconCandidateId: string | null;\n selectedBookingChannelLogoCandidateId: string | null;\n uniqueRef: string;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneBookingChannelIconCandidate {\n bookingChannelId: string;\n cloudflareImageId: string | null;\n color: string | null;\n comment: string | null;\n createdAt: Generated<Timestamp>;\n externalIcon: string | null;\n height: number | null;\n id: Generated<string>;\n provider: Generated<string>;\n source: string | null;\n updatedAt: Generated<Timestamp>;\n width: number | null;\n}\n\nexport interface ControlPlaneCurrency {\n name: string;\n}\n\nexport interface ControlPlaneEvent {\n createdAt: Generated<Timestamp>;\n id: Generated<string>;\n name: string;\n packageName: string;\n props: Json;\n tenantId: string | null;\n timestamp: Generated<Timestamp>;\n trackedAt: Generated<Timestamp | null>;\n userId: string | null;\n}\n\nexport interface ControlPlaneConnectionRoute {\n connectionId: string;\n createdAt: Generated<Timestamp>;\n tenantId: string;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneFeature {\n createdAt: Generated<Timestamp>;\n description: string | null;\n id: Generated<string>;\n issueUrl: string | null;\n requiredApprovals: Generated<Json | null>;\n status: Generated<string | null>;\n tenantId: string | null;\n title: string;\n updatedAt: Generated<Timestamp>;\n url: string | null;\n}\n\nexport interface ControlPlaneFeatureEnabledTeam {\n createdAt: Generated<Timestamp>;\n featureId: string;\n id: Generated<string>;\n status: Generated<string | null>;\n tenantId: string;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneFeatureApproval {\n createdAt: Generated<Timestamp>;\n featureId: string;\n id: Generated<string>;\n status: Generated<string | null>;\n updatedAt: Generated<Timestamp>;\n userId: string;\n}\n\nexport interface ControlPlaneIssueMessageOverwrite {\n createdAt: Generated<Timestamp>;\n id: Generated<string>;\n message: string;\n pattern: string;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneOutbox {\n aggregateId: string;\n aggregateType: string;\n attempts: Generated<number>;\n createdAt: Generated<Timestamp>;\n dataRegion: string | null;\n eventType: string;\n eventVersion: number;\n id: Generated<string>;\n lastError: string | null;\n payload: Generated<Json>;\n publishedAt: Timestamp | null;\n}\n\nexport interface ControlPlaneTenant {\n billingPartnerId: string | null;\n billingPlan: string | null;\n createdAt: Generated<Timestamp>;\n dataRegion: Generated<string>;\n id: Generated<string>;\n name: string;\n partnerId: string | null;\n slug: string;\n status: Generated<string | null>;\n storageRealm: Generated<string>;\n type: Generated<string | null>;\n uniqueRef: string | null;\n updatedAt: Generated<Timestamp | null>;\n}\n\nexport interface ControlPlaneTenantUser {\n createdAt: Generated<Timestamp | null>;\n id: Generated<string>;\n lastInvitedAt: Timestamp | null;\n role: Generated<string | null>;\n status: Generated<string | null>;\n tenantId: string;\n updatedAt: Generated<Timestamp | null>;\n userId: string;\n}\n\nexport interface ControlPlaneToken {\n createdAt: Generated<Timestamp>;\n expiresAt: Timestamp | null;\n id: Generated<string>;\n nanoId: Generated<string>;\n payload: Generated<Json>;\n tenantId: string | null;\n type: string | null;\n userId: string | null;\n}\n\nexport interface ControlPlaneUser {\n clerkId: string | null;\n createdAt: Generated<Timestamp | null>;\n email: string | null;\n firstName: string | null;\n id: Generated<string>;\n isAdmin: Generated<boolean>;\n lastName: string | null;\n lastSeen: Timestamp | null;\n name: string | null;\n partnerId: string | null;\n phone: string | null;\n secondaryEmails: Generated<Json>;\n status: Generated<string | null>;\n sub: string | null;\n type: Generated<string | null>;\n updatedAt: Generated<Timestamp | null>;\n}\n\nexport interface ControlPlaneDB {\n 'controlPlane.app': ControlPlaneApp;\n 'controlPlane.bookingChannel': ControlPlaneBookingChannel;\n 'controlPlane.bookingChannelIconCandidate': ControlPlaneBookingChannelIconCandidate;\n 'controlPlane.connectionRoute': ControlPlaneConnectionRoute;\n 'controlPlane.controlPlaneOutbox': ControlPlaneOutbox;\n 'controlPlane.currency': ControlPlaneCurrency;\n 'controlPlane.events': ControlPlaneEvent;\n 'controlPlane.feature': ControlPlaneFeature;\n 'controlPlane.featureApproval': ControlPlaneFeatureApproval;\n 'controlPlane.featureEnabledTeam': ControlPlaneFeatureEnabledTeam;\n 'controlPlane.tenant': ControlPlaneTenant;\n 'controlPlane.tenantUser': ControlPlaneTenantUser;\n 'controlPlane.token': ControlPlaneToken;\n 'controlPlane.user': ControlPlaneUser;\n 'controlPlaneCore.issueMessageOverwrite': ControlPlaneIssueMessageOverwrite;\n}\n\nclass ControlPlaneSchemaTransformer extends OperationNodeTransformer {\n constructor(\n readonly schema: string,\n readonly issueMessageOverwriteSchema: string\n ) {\n super();\n }\n\n protected override transformSchemableIdentifier(\n node: SchemableIdentifierNode,\n queryId: QueryId\n ): SchemableIdentifierNode {\n const transformed = super.transformSchemableIdentifier(node, queryId);\n if (\n transformed.schema?.name === 'controlPlane' ||\n transformed.schema?.name === 'control_plane'\n ) {\n return { ...transformed, schema: IdentifierNode.create(this.schema) };\n }\n if (\n transformed.schema?.name === 'controlPlaneCore' ||\n transformed.schema?.name === 'control_plane_core'\n ) {\n return {\n ...transformed,\n schema: IdentifierNode.create(this.issueMessageOverwriteSchema),\n };\n }\n return transformed;\n }\n\n protected override transformFunction(\n node: FunctionNode,\n queryId: QueryId\n ): FunctionNode {\n const transformed = super.transformFunction(node, queryId);\n return node.func.startsWith('controlPlane.')\n ? {\n ...transformed,\n func: `${this.schema}.${transformed.func.slice('controlPlane.'.length)}`,\n }\n : transformed;\n }\n}\n\nclass ControlPlaneSchemaPlugin implements KyselyPlugin {\n readonly #transformer: ControlPlaneSchemaTransformer;\n\n constructor(schema: string, issueMessageOverwriteSchema: string) {\n this.#transformer = new ControlPlaneSchemaTransformer(\n schema,\n issueMessageOverwriteSchema\n );\n }\n\n transformQuery(args: PluginTransformQueryArgs): RootOperationNode {\n return this.#transformer.transformNode(args.node, args.queryId);\n }\n\n async transformResult(\n args: PluginTransformResultArgs\n ): Promise<QueryResult<UnknownRow>> {\n return args.result;\n }\n}\n\nexport function withControlPlaneSchema(\n kysely: Kysely<ControlPlaneDB>,\n schema: string,\n issueMessageOverwriteSchema = 'core'\n) {\n return kysely.withPlugin(\n new ControlPlaneSchemaPlugin(schema, issueMessageOverwriteSchema)\n );\n}\n"]}
|
package/build/main/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { Kysely as K, LogConfig } from 'kysely';
|
|
1
|
+
import type { Kysely as K, LogConfig, Transaction as T } from 'kysely';
|
|
2
2
|
import postgres, { type Sql } from 'postgres';
|
|
3
|
-
import type
|
|
3
|
+
import { type ControlPlaneDB } from './control-plane';
|
|
4
4
|
export type { Insertable, LogEvent } from 'kysely';
|
|
5
5
|
export * from './error';
|
|
6
6
|
export * from './isomorphic';
|
|
@@ -20,6 +20,8 @@ type PgOpt = {
|
|
|
20
20
|
retries?: false | number;
|
|
21
21
|
};
|
|
22
22
|
export type Kysely = K<DB>;
|
|
23
|
+
export type ControlPlaneKysely = K<ControlPlaneDB>;
|
|
24
|
+
export type ControlPlaneTransaction = T<ControlPlaneDB>;
|
|
23
25
|
export declare function useKysely<Database = DB>(postgres: Sql, options?: KyselyOpts): K<Database>;
|
|
24
26
|
export declare function useAsyncPostgres(connectionString: string, opt?: PgOpt): Promise<postgres.Sql<{}>>;
|
|
25
27
|
export declare function useAsyncKysely(connectionString: string, opt?: PgOpt & KyselyOpts): Promise<K<DB>>;
|
package/build/main/index.js
CHANGED
|
@@ -25,6 +25,7 @@ exports.forceCloseAllPostgres = forceCloseAllPostgres;
|
|
|
25
25
|
const exponential_backoff_1 = require("exponential-backoff");
|
|
26
26
|
const kysely_postgres_js_1 = require("kysely-postgres-js");
|
|
27
27
|
const postgres_1 = __importDefault(require("postgres"));
|
|
28
|
+
const control_plane_1 = require("./control-plane");
|
|
28
29
|
const error_1 = require("./error");
|
|
29
30
|
const plugins_1 = require("./plugins");
|
|
30
31
|
__exportStar(require("./error"), exports);
|
|
@@ -128,7 +129,7 @@ async function useAsyncKysely(connectionString, opt) {
|
|
|
128
129
|
}
|
|
129
130
|
async function useAsyncControlPlaneKysely(connectionString, opt) {
|
|
130
131
|
const sql = await useAsyncPostgres(connectionString, opt);
|
|
131
|
-
return useKysely(sql, opt);
|
|
132
|
+
return (0, control_plane_1.withControlPlaneSchema)(useKysely(sql, opt), 'public');
|
|
132
133
|
}
|
|
133
134
|
async function forceCloseAllPostgres(timeoutMs = 5000) {
|
|
134
135
|
await Promise.race([
|
package/build/main/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"src/","sources":["index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"src/","sources":["index.ts"],"names":[],"mappings":"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","sourcesContent":["import { backOff } from 'exponential-backoff';\nimport type { Kysely as K, LogConfig, Transaction as T } from 'kysely';\nimport { PostgresJSDialect } from 'kysely-postgres-js';\nimport postgres, { type Sql } from 'postgres';\nimport { type ControlPlaneDB, withControlPlaneSchema } from './control-plane';\nimport { KyselyError } from './error';\nimport { getKysely } from './plugins';\n\nexport type { Insertable, LogEvent } from 'kysely';\nexport * from './error';\nexport * from './isomorphic';\nexport * from './postgres-error';\nexport * from './query';\nexport * from './regional';\nexport * from './transaction';\n\nimport { parseDuration } from '@vrplatform/utils';\nimport type { DB } from './v1.generated';\n\ntype KyselyOpts = {\n repositoryName?: string;\n log?: true | LogConfig;\n};\n\ntype PgOpt = {\n forceDisableSSL?: boolean;\n hyperdrive?: true;\n probe?: true;\n retries?: false | number;\n};\n\nconst retryableMessages = [\n 'CONNECTION_CLOSED',\n 'CONNECT_TIMEOUT',\n 'Idle connection closed by Hyperdrive.',\n];\n\nexport type Kysely = K<DB>;\nexport type ControlPlaneKysely = K<ControlPlaneDB>;\nexport type ControlPlaneTransaction = T<ControlPlaneDB>;\nexport function useKysely<Database = DB>(postgres: Sql, options?: KyselyOpts) {\n console.debug('Creating Kysely instance');\n const kysely = getKysely<Database>(\n new PostgresJSDialect({\n postgres,\n onReserveConnection: async (connection) => {\n const executeQuery = connection.executeQuery.bind(connection);\n connection.executeQuery = (arg) =>\n backOff(async () => await executeQuery(arg), {\n numOfAttempts: 3,\n startingDelay: parseDuration('1s'),\n maxDelay: parseDuration('5s'),\n retry: (error) => {\n const message =\n error instanceof Error ? error.message : String(error);\n if (\n retryableMessages.some((m) => message?.includes(m)) ||\n (arg.query.kind === 'SelectQueryNode' &&\n (message ===\n 'Egress connection severed outside of Hyperdrive' ||\n message === 'Network connection lost.'))\n ) {\n return true;\n }\n return false;\n },\n });\n },\n }),\n {\n repositoryName: options?.repositoryName,\n log: options?.log,\n }\n );\n kysely.destroy = async () => {\n console.debug('Closing Kysely connection');\n await postgres.end({ timeout: 5 }).catch(() => undefined);\n const index = _connections.indexOf(postgres);\n if (index !== -1) _connections.splice(index, 1);\n };\n\n return kysely;\n}\n\nlet _connections: postgres.Sql[] = [];\nexport async function useAsyncPostgres(connectionString: string, opt?: PgOpt) {\n const delayMs = 2500;\n const probe = opt?.probe === true;\n const retries = probe ? (opt?.retries === false ? 0 : opt?.retries || 3) : 1;\n const ssl = opt?.forceDisableSSL !== true && opt?.hyperdrive !== true;\n const url = new URL(connectionString);\n\n console.debug(\n `Creating Postgres connection with probe=${probe}, ${retries} attempts, ssl=${ssl}, and port=${url.port}`\n );\n if (_connections.length > 0)\n console.warn(`We already have ${_connections.length} Postgres connections`);\n\n for (let attempt = 1; attempt <= retries; attempt++) {\n try {\n const sql = postgres(connectionString, {\n ssl: ssl ? 'require' : false,\n target_session_attrs: 'read-write',\n // enable prepare statements, pgbouncer on crunchy allows for prepared statements\n prepare: true,\n ...(opt?.hyperdrive\n ? {\n max: 5,\n // Retire idle clients before Hyperdrive can close them asynchronously.\n idle_timeout: 10,\n }\n : {\n connect_timeout: 10,\n idle_timeout: 60,\n }),\n });\n\n if (probe) {\n await sql`select 1`;\n }\n // statement_timeout/lock_timeout are role-level settings on the cluster\n // (ALTER ROLE application SET ...) so they cover every pooled\n // connection; per-session SETs here only ever applied to one of them\n\n _connections.push(sql);\n return sql;\n } catch (err) {\n if (attempt === retries) throw err;\n console.warn(\n `Postgres connection failed (attempt ${attempt}), retrying...`\n );\n console.error('error', err);\n await new Promise((res) => setTimeout(res, delayMs));\n }\n }\n throw new KyselyError('Unable to connect to Postgres');\n}\n\nexport async function useAsyncKysely(\n connectionString: string,\n opt?: PgOpt & KyselyOpts\n) {\n const sql = await useAsyncPostgres(connectionString, opt);\n return useKysely(sql, opt);\n}\n\nexport async function useAsyncControlPlaneKysely(\n connectionString: string,\n opt?: PgOpt & KyselyOpts\n) {\n const sql = await useAsyncPostgres(connectionString, opt);\n return withControlPlaneSchema(useKysely<ControlPlaneDB>(sql, opt), 'public');\n}\n\nexport async function forceCloseAllPostgres(timeoutMs = 5000) {\n await Promise.race([\n Promise.all(\n _connections.map((pg) =>\n pg.end({ timeout: timeoutMs }).catch(() => undefined)\n )\n ),\n new Promise((res) => setTimeout(res, timeoutMs + 1000)),\n ]);\n _connections = [];\n}\n"]}
|
|
@@ -4,7 +4,9 @@ export { jsonArrayFrom } from 'kysely/helpers/postgres';
|
|
|
4
4
|
export * from './domain';
|
|
5
5
|
export * from './v1.generated';
|
|
6
6
|
import type { DB } from './v1.generated';
|
|
7
|
-
export type
|
|
7
|
+
export type DatabaseKysely<Database> = K<Database>;
|
|
8
|
+
export type DatabaseTransaction<Database> = T<Database>;
|
|
9
|
+
export type Transaction = DatabaseTransaction<DB>;
|
|
8
10
|
export type ControlledTransaction<S extends string[] = string[]> = CT<DB, S>;
|
|
9
11
|
export { sql } from 'kysely';
|
|
10
|
-
export type Kysely =
|
|
12
|
+
export type Kysely = DatabaseKysely<DB>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isomorphic.js","sourceRoot":"src/","sources":["isomorphic.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AA2BA,oDAAwD;AAA/C,yGAAA,aAAa,OAAA;AACtB,2CAAyB;AACzB,iDAA+B;
|
|
1
|
+
{"version":3,"file":"isomorphic.js","sourceRoot":"src/","sources":["isomorphic.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AA2BA,oDAAwD;AAA/C,yGAAA,aAAa,OAAA;AACtB,2CAAyB;AACzB,iDAA+B;AAQ/B,iCAA6B;AAApB,6FAAA,GAAG,OAAA","sourcesContent":["import type {\n ControlledTransaction as CT,\n Kysely as K,\n Transaction as T,\n} from 'kysely';\n\nexport type {\n ColumnType,\n Expression,\n ExpressionBuilder,\n ExpressionOrFactory,\n Generated,\n Insertable,\n JSONColumnType,\n KyselyPlugin,\n Nullable,\n OperandExpression,\n PluginTransformQueryArgs,\n PluginTransformResultArgs,\n QueryResult,\n RootOperationNode,\n Selectable,\n SelectQueryBuilder,\n SqlBool,\n UnknownRow,\n Updateable,\n} from 'kysely';\nexport { jsonArrayFrom } from 'kysely/helpers/postgres';\nexport * from './domain';\nexport * from './v1.generated';\n\nimport type { DB } from './v1.generated';\n\nexport type DatabaseKysely<Database> = K<Database>;\nexport type DatabaseTransaction<Database> = T<Database>;\nexport type Transaction = DatabaseTransaction<DB>;\nexport type ControlledTransaction<S extends string[] = string[]> = CT<DB, S>;\nexport { sql } from 'kysely';\n\nexport type Kysely = DatabaseKysely<DB>;\n"]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
export declare function ensureDigestFunction(kysely:
|
|
3
|
-
export declare function ensureGenRandomBytesFunction(kysely:
|
|
1
|
+
import { type DatabaseKysely } from '../isomorphic';
|
|
2
|
+
export declare function ensureDigestFunction<Database>(kysely: DatabaseKysely<Database>): Promise<void>;
|
|
3
|
+
export declare function ensureGenRandomBytesFunction<Database>(kysely: DatabaseKysely<Database>): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"digest.js","sourceRoot":"src/","sources":["local/digest.ts"],"names":[],"mappings":";;AAEA,
|
|
1
|
+
{"version":3,"file":"digest.js","sourceRoot":"src/","sources":["local/digest.ts"],"names":[],"mappings":";;AAEA,oDAiBC;AAED,oEA0BC;AA/CD,8CAAyD;AAElD,KAAK,UAAU,oBAAoB,CACxC,MAAgC;IAEhC,IAAI,CAAC;QACH,MAAM,IAAA,gBAAG,EAAA,6BAA6B,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAA,gBAAG,EAAA;;;;;;;;;KASR,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,4BAA4B,CAChD,MAAgC;IAEhC,IAAI,CAAC;QACH,MAAM,IAAA,gBAAG,EAAA,4BAA4B,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAA,gBAAG,EAAA;;;;;;;;;;;;;;;;;;KAkBR,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACpB,CAAC;AACH,CAAC","sourcesContent":["import { type DatabaseKysely, sql } from '../isomorphic';\n\nexport async function ensureDigestFunction<Database>(\n kysely: DatabaseKysely<Database>\n) {\n try {\n await sql`select digest('', 'sha256')`.execute(kysely);\n } catch {\n await sql`\n create or replace function digest(input text, algo text)\n returns bytea\n language sql\n immutable\n strict\n as $$\n select '\\\\x0000000000000000000000000000000000000000000000000000000000000000'::bytea;\n $$;\n `.execute(kysely);\n }\n}\n\nexport async function ensureGenRandomBytesFunction<Database>(\n kysely: DatabaseKysely<Database>\n) {\n try {\n await sql`select gen_random_bytes(1)`.execute(kysely);\n } catch {\n await sql`\n create or replace function gen_random_bytes(p_len integer)\n returns bytea\n language sql\n stable\n strict\n as $$\n select substring(\n decode(\n repeat(\n md5(random()::text || now()::text),\n ((p_len + 15) / 16)\n ),\n 'hex'\n )\n from 1 for p_len\n );\n $$;\n `.execute(kysely);\n }\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type LogConfig } from 'kysely';
|
|
2
|
+
import type { ControlPlaneKysely } from '../index';
|
|
2
3
|
import type { DB } from '../v1.generated';
|
|
3
4
|
export declare const root: string;
|
|
4
5
|
export declare const dumpPath: string;
|
|
@@ -6,4 +7,7 @@ export type UseLocalKyselyOptions = {
|
|
|
6
7
|
repositoryName?: string;
|
|
7
8
|
log?: true | LogConfig;
|
|
8
9
|
};
|
|
9
|
-
export
|
|
10
|
+
export type LocalKysely = import('kysely').Kysely<DB> & {
|
|
11
|
+
controlPlaneKysely: ControlPlaneKysely;
|
|
12
|
+
};
|
|
13
|
+
export declare function useLocalKysely(args?: UseLocalKyselyOptions): Promise<LocalKysely>;
|
|
@@ -40,6 +40,7 @@ const path = __importStar(require("node:path"));
|
|
|
40
40
|
const pglite_1 = require("@electric-sql/pglite");
|
|
41
41
|
const kysely_1 = require("kysely");
|
|
42
42
|
const kysely_pglite_dialect_1 = require("kysely-pglite-dialect");
|
|
43
|
+
const control_plane_1 = require("../control-plane");
|
|
43
44
|
const migration_1 = require("../migration");
|
|
44
45
|
const plugins_1 = require("../plugins");
|
|
45
46
|
const digest_1 = require("./digest");
|
|
@@ -77,6 +78,213 @@ async function useLocalKysely(args = {}) {
|
|
|
77
78
|
await (0, digest_1.ensureDigestFunction)(kysely);
|
|
78
79
|
await (0, digest_1.ensureGenRandomBytesFunction)(kysely);
|
|
79
80
|
await migrateToLatest(kysely);
|
|
81
|
+
await (0, kysely_1.sql) `alter schema public rename to regional_public`.execute(kysely);
|
|
82
|
+
await (0, kysely_1.sql) `alter schema core rename to regional_core`.execute(kysely);
|
|
83
|
+
await (0, kysely_1.sql) `create schema public`.execute(kysely);
|
|
84
|
+
await (0, kysely_1.sql) `create schema core`.execute(kysely);
|
|
85
|
+
const controlPlaneBootstrapKysely = (0, plugins_1.getKysely)(dialect, {
|
|
86
|
+
repositoryName: `${args.repositoryName ?? 'localTesting'}/control-plane-bootstrap`,
|
|
87
|
+
});
|
|
88
|
+
const controlPlaneMigrator = new kysely_1.Migrator({
|
|
89
|
+
db: controlPlaneBootstrapKysely,
|
|
90
|
+
migrationTableSchema: 'public',
|
|
91
|
+
migrationTableName: 'control_plane_kysely_migration',
|
|
92
|
+
migrationLockTableName: 'control_plane_kysely_migration_lock',
|
|
93
|
+
provider: new kysely_1.FileMigrationProvider({
|
|
94
|
+
fs: node_fs_1.promises,
|
|
95
|
+
path,
|
|
96
|
+
migrationFolder: path.join(exports.root, 'control-plane-migrations'),
|
|
97
|
+
}),
|
|
98
|
+
});
|
|
99
|
+
const { error: controlPlaneMigrationError } = await controlPlaneMigrator.migrateToLatest();
|
|
100
|
+
if (controlPlaneMigrationError) {
|
|
101
|
+
throw controlPlaneMigrationError;
|
|
102
|
+
}
|
|
103
|
+
await (0, kysely_1.sql) `alter table core.issue_message_overwrite set schema public`.execute(controlPlaneBootstrapKysely);
|
|
104
|
+
await (0, kysely_1.sql) `drop schema core`.execute(controlPlaneBootstrapKysely);
|
|
105
|
+
await (0, kysely_1.sql) `alter schema public rename to control_plane`.execute(controlPlaneBootstrapKysely);
|
|
106
|
+
await (0, kysely_1.sql) `alter schema regional_public rename to public`.execute(controlPlaneBootstrapKysely);
|
|
107
|
+
await (0, kysely_1.sql) `alter schema regional_core rename to core`.execute(controlPlaneBootstrapKysely);
|
|
108
|
+
await (0, kysely_1.sql) `
|
|
109
|
+
do $$
|
|
110
|
+
declare
|
|
111
|
+
definition text;
|
|
112
|
+
begin
|
|
113
|
+
select pg_get_functiondef(
|
|
114
|
+
'control_plane.normalize_tenant_slug(text)'::regprocedure
|
|
115
|
+
) into definition;
|
|
116
|
+
execute replace(definition, 'public.', 'control_plane.');
|
|
117
|
+
|
|
118
|
+
select pg_get_functiondef(
|
|
119
|
+
'control_plane.build_unique_tenant_slug(text,uuid)'::regprocedure
|
|
120
|
+
) into definition;
|
|
121
|
+
execute replace(definition, 'public.', 'control_plane.');
|
|
122
|
+
end;
|
|
123
|
+
$$;
|
|
124
|
+
`.execute(controlPlaneBootstrapKysely);
|
|
125
|
+
await (0, kysely_1.sql) `
|
|
126
|
+
insert into control_plane.app (
|
|
127
|
+
authentication,
|
|
128
|
+
category,
|
|
129
|
+
color,
|
|
130
|
+
created_at,
|
|
131
|
+
icon,
|
|
132
|
+
icon_round,
|
|
133
|
+
id,
|
|
134
|
+
info,
|
|
135
|
+
name,
|
|
136
|
+
type,
|
|
137
|
+
version
|
|
138
|
+
)
|
|
139
|
+
select
|
|
140
|
+
authentication,
|
|
141
|
+
category,
|
|
142
|
+
color,
|
|
143
|
+
created_at,
|
|
144
|
+
icon,
|
|
145
|
+
icon_round,
|
|
146
|
+
id,
|
|
147
|
+
info,
|
|
148
|
+
name,
|
|
149
|
+
type,
|
|
150
|
+
version
|
|
151
|
+
from public.app
|
|
152
|
+
on conflict (id) do nothing;
|
|
153
|
+
`.execute(controlPlaneBootstrapKysely);
|
|
154
|
+
await (0, kysely_1.sql) `
|
|
155
|
+
insert into control_plane.currency (name)
|
|
156
|
+
select name
|
|
157
|
+
from public.currency
|
|
158
|
+
on conflict (name) do nothing;
|
|
159
|
+
`.execute(controlPlaneBootstrapKysely);
|
|
160
|
+
await (0, kysely_1.sql) `
|
|
161
|
+
insert into control_plane.booking_channel (
|
|
162
|
+
channel_ref,
|
|
163
|
+
color,
|
|
164
|
+
created_at,
|
|
165
|
+
icon,
|
|
166
|
+
icon_provider,
|
|
167
|
+
id,
|
|
168
|
+
last_generate_run,
|
|
169
|
+
logo,
|
|
170
|
+
logo_provider,
|
|
171
|
+
selected_booking_channel_icon_candidate_id,
|
|
172
|
+
selected_booking_channel_logo_candidate_id,
|
|
173
|
+
unique_ref,
|
|
174
|
+
updated_at
|
|
175
|
+
)
|
|
176
|
+
select
|
|
177
|
+
channel_ref,
|
|
178
|
+
color,
|
|
179
|
+
created_at,
|
|
180
|
+
icon,
|
|
181
|
+
icon_provider,
|
|
182
|
+
id,
|
|
183
|
+
last_generate_run,
|
|
184
|
+
logo,
|
|
185
|
+
logo_provider,
|
|
186
|
+
selected_booking_channel_icon_candidate_id,
|
|
187
|
+
selected_booking_channel_logo_candidate_id,
|
|
188
|
+
unique_ref,
|
|
189
|
+
updated_at
|
|
190
|
+
from public.booking_channel
|
|
191
|
+
on conflict (id) do nothing;
|
|
192
|
+
`.execute(controlPlaneBootstrapKysely);
|
|
193
|
+
await (0, kysely_1.sql) `
|
|
194
|
+
insert into control_plane.booking_channel_icon_candidate (
|
|
195
|
+
booking_channel_id,
|
|
196
|
+
cloudflare_image_id,
|
|
197
|
+
color,
|
|
198
|
+
comment,
|
|
199
|
+
created_at,
|
|
200
|
+
external_icon,
|
|
201
|
+
height,
|
|
202
|
+
id,
|
|
203
|
+
provider,
|
|
204
|
+
source,
|
|
205
|
+
updated_at,
|
|
206
|
+
width
|
|
207
|
+
)
|
|
208
|
+
select
|
|
209
|
+
booking_channel_id,
|
|
210
|
+
cloudflare_image_id,
|
|
211
|
+
color,
|
|
212
|
+
comment,
|
|
213
|
+
created_at,
|
|
214
|
+
external_icon,
|
|
215
|
+
height,
|
|
216
|
+
id,
|
|
217
|
+
provider,
|
|
218
|
+
source,
|
|
219
|
+
updated_at,
|
|
220
|
+
width
|
|
221
|
+
from public.booking_channel_icon_candidate
|
|
222
|
+
on conflict (id) do nothing;
|
|
223
|
+
`.execute(controlPlaneBootstrapKysely);
|
|
224
|
+
await (0, kysely_1.sql) `
|
|
225
|
+
insert into control_plane.tenant (
|
|
226
|
+
billing_partner_id,
|
|
227
|
+
billing_plan,
|
|
228
|
+
created_at,
|
|
229
|
+
data_region,
|
|
230
|
+
id,
|
|
231
|
+
name,
|
|
232
|
+
partner_id,
|
|
233
|
+
slug,
|
|
234
|
+
status,
|
|
235
|
+
storage_realm,
|
|
236
|
+
type,
|
|
237
|
+
unique_ref,
|
|
238
|
+
updated_at
|
|
239
|
+
)
|
|
240
|
+
select
|
|
241
|
+
billing_partner_id,
|
|
242
|
+
billing_plan,
|
|
243
|
+
created_at,
|
|
244
|
+
data_region,
|
|
245
|
+
id,
|
|
246
|
+
name,
|
|
247
|
+
partner_id,
|
|
248
|
+
slug,
|
|
249
|
+
status,
|
|
250
|
+
storage_realm,
|
|
251
|
+
type,
|
|
252
|
+
unique_ref,
|
|
253
|
+
updated_at
|
|
254
|
+
from public.tenant
|
|
255
|
+
on conflict (id) do nothing;
|
|
256
|
+
`.execute(controlPlaneBootstrapKysely);
|
|
257
|
+
await (0, kysely_1.sql) `
|
|
258
|
+
insert into control_plane.token (
|
|
259
|
+
created_at,
|
|
260
|
+
expires_at,
|
|
261
|
+
id,
|
|
262
|
+
nano_id,
|
|
263
|
+
payload,
|
|
264
|
+
tenant_id,
|
|
265
|
+
type,
|
|
266
|
+
user_id
|
|
267
|
+
)
|
|
268
|
+
select
|
|
269
|
+
created_at,
|
|
270
|
+
expires_at,
|
|
271
|
+
id,
|
|
272
|
+
nano_id,
|
|
273
|
+
payload,
|
|
274
|
+
tenant_id,
|
|
275
|
+
type,
|
|
276
|
+
user_id
|
|
277
|
+
from public.token
|
|
278
|
+
on conflict (id) do nothing;
|
|
279
|
+
`.execute(controlPlaneBootstrapKysely);
|
|
280
|
+
const controlPlaneKysely = (0, control_plane_1.withControlPlaneSchema)((0, plugins_1.getKysely)(dialect, {
|
|
281
|
+
repositoryName: `${args.repositoryName ?? 'localTesting'}/control-plane`,
|
|
282
|
+
log: args.log,
|
|
283
|
+
}), 'control_plane', 'control_plane');
|
|
284
|
+
controlPlaneKysely.destroy = async () => { };
|
|
285
|
+
Object.defineProperty(kysely, 'controlPlaneKysely', {
|
|
286
|
+
value: controlPlaneKysely,
|
|
287
|
+
});
|
|
80
288
|
const originalDestroy = kysely.destroy.bind(kysely);
|
|
81
289
|
kysely.destroy = async () => {
|
|
82
290
|
if (isDestroyed)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"src/","sources":["local/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA,wCAgCC;AArED,qCAAyC;AACzC,gDAAkC;AAClC,iDAA8C;AAC9C,mCAAyE;AACzE,iEAAsD;AACtD,4CAAiD;AACjD,wCAAuC;AAEvC,qCAA8E;AAEjE,QAAA,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AACrC,QAAA,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAI,EAAE,WAAW,CAAC,CAAC;AAOrD,KAAK,UAAU,eAAe,CAAC,MAAmC;IAChE,MAAM,QAAQ,GAAG,IAAI,iBAAQ,CAAC;QAC5B,EAAE,EAAE,MAAM;QACV,oBAAoB,EAAE,6BAAiB,CAAC,WAAW;QACnD,kBAAkB,EAAE,6BAAiB,CAAC,SAAS;QAC/C,sBAAsB,EAAE,6BAAiB,CAAC,aAAa;QACvD,QAAQ,EAAE,IAAI,8BAAqB,CAAC;YAClC,EAAE,EAAF,kBAAE;YACF,IAAI;YACJ,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,YAAI,EAAE,6BAAiB,CAAC,MAAM,CAAC;SAC3D,CAAC;KACH,CAAC,CAAC;IAEH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,eAAe,EAAE,CAAC;IACnD,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,cAAc,CAAC,OAA8B,EAAE;IACnE,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,iCAAiC;IAEjC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,gBAAQ,CAAC,CAAC;IAEhC,MAAM,MAAM,GAAG,IAAI,eAAM,CAAC;QACxB,WAAW,EAAE,IAAI;KAClB,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,IAAI,qCAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAA,mBAAS,EAAC,OAAO,EAAE;QAChC,cAAc,EAAE,IAAI,EAAE,cAAc,IAAI,cAAc;QACtD,GAAG,EAAE,IAAI,EAAE,GAAG;KACf,CAAC,CAAC;IACH,MAAM,IAAA,6BAAoB,EAAC,MAAM,CAAC,CAAC;IACnC,MAAM,IAAA,qCAA4B,EAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,eAAe,CAAC,MAAqC,CAAC,CAAC;IAE7D,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,CAAC,OAAO,GAAG,KAAK,IAAI,EAAE;QAC1B,IAAI,WAAW;YAAE,OAAO;QACxB,WAAW,GAAG,IAAI,CAAC;QACnB,wCAAwC;QACxC,MAAM,eAAe,EAAE,CAAC;QACxB,cAAc;QACd,0EAA0E;QAC1E,IAAI;IACN,CAAC,CAAC;IAEF,iFAAiF;IAEjF,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport { PGlite } from '@electric-sql/pglite';\nimport { FileMigrationProvider, type LogConfig, Migrator } from 'kysely';\nimport { PGliteDialect } from 'kysely-pglite-dialect';\nimport { appMigrationEpoch } from '../migration';\nimport { getKysely } from '../plugins';\nimport type { DB } from '../v1.generated';\nimport { ensureDigestFunction, ensureGenRandomBytesFunction } from './digest';\n\nexport const root = path.join(__dirname, '../..');\nexport const dumpPath = path.join(root, '.data.tar');\n\nexport type UseLocalKyselyOptions = {\n repositoryName?: string;\n log?: true | LogConfig;\n};\n\nasync function migrateToLatest(kysely: import('kysely').Kysely<DB>) {\n const migrator = new Migrator({\n db: kysely,\n migrationTableSchema: appMigrationEpoch.tableSchema,\n migrationTableName: appMigrationEpoch.tableName,\n migrationLockTableName: appMigrationEpoch.lockTableName,\n provider: new FileMigrationProvider({\n fs,\n path,\n migrationFolder: path.join(root, appMigrationEpoch.folder),\n }),\n });\n\n const { error } = await migrator.migrateToLatest();\n if (error) {\n throw error;\n }\n}\n\nexport async function useLocalKysely(args: UseLocalKyselyOptions = {}) {\n let isDestroyed = false;\n // const now = performance.now();\n\n const dump = Bun.file(dumpPath);\n\n const pglite = new PGlite({\n loadDataDir: dump,\n });\n const dialect = new PGliteDialect(pglite);\n const kysely = getKysely(dialect, {\n repositoryName: args?.repositoryName ?? 'localTesting',\n log: args?.log,\n });\n await ensureDigestFunction(kysely);\n await ensureGenRandomBytesFunction(kysely);\n await migrateToLatest(kysely as import('kysely').Kysely<DB>);\n\n const originalDestroy = kysely.destroy.bind(kysely);\n kysely.destroy = async () => {\n if (isDestroyed) return;\n isDestroyed = true;\n //const destroyTime = performance.now();\n await originalDestroy();\n //console.log(\n // `Database destroyed: ${Math.round(performance.now() - destroyTime)}ms`\n //);\n };\n\n // console.log(`Database initialized: ${Math.round(performance.now() - now)}ms`);\n\n return kysely;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"src/","sources":["local/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport { PGlite } from '@electric-sql/pglite';\nimport { FileMigrationProvider, type LogConfig, Migrator, sql } from 'kysely';\nimport { PGliteDialect } from 'kysely-pglite-dialect';\nimport { type ControlPlaneDB, withControlPlaneSchema } from '../control-plane';\nimport type { ControlPlaneKysely } from '../index';\nimport { appMigrationEpoch } from '../migration';\nimport { getKysely } from '../plugins';\nimport type { DB } from '../v1.generated';\nimport { ensureDigestFunction, ensureGenRandomBytesFunction } from './digest';\n\nexport const root = path.join(__dirname, '../..');\nexport const dumpPath = path.join(root, '.data.tar');\n\nexport type UseLocalKyselyOptions = {\n repositoryName?: string;\n log?: true | LogConfig;\n};\n\nexport type LocalKysely = import('kysely').Kysely<DB> & {\n controlPlaneKysely: ControlPlaneKysely;\n};\n\nasync function migrateToLatest<Database>(\n kysely: import('kysely').Kysely<Database>\n) {\n const migrator = new Migrator({\n db: kysely,\n migrationTableSchema: appMigrationEpoch.tableSchema,\n migrationTableName: appMigrationEpoch.tableName,\n migrationLockTableName: appMigrationEpoch.lockTableName,\n provider: new FileMigrationProvider({\n fs,\n path,\n migrationFolder: path.join(root, appMigrationEpoch.folder),\n }),\n });\n\n const { error } = await migrator.migrateToLatest();\n if (error) {\n throw error;\n }\n}\n\nexport async function useLocalKysely(\n args: UseLocalKyselyOptions = {}\n): Promise<LocalKysely> {\n let isDestroyed = false;\n // const now = performance.now();\n\n const dump = Bun.file(dumpPath);\n\n const pglite = new PGlite({\n loadDataDir: dump,\n });\n const dialect = new PGliteDialect(pglite);\n const kysely = getKysely<DB>(dialect, {\n repositoryName: args?.repositoryName ?? 'localTesting',\n log: args?.log,\n });\n await ensureDigestFunction(kysely);\n await ensureGenRandomBytesFunction(kysely);\n await migrateToLatest(kysely);\n\n await sql`alter schema public rename to regional_public`.execute(kysely);\n await sql`alter schema core rename to regional_core`.execute(kysely);\n await sql`create schema public`.execute(kysely);\n await sql`create schema core`.execute(kysely);\n\n const controlPlaneBootstrapKysely = getKysely<ControlPlaneDB>(dialect, {\n repositoryName: `${args.repositoryName ?? 'localTesting'}/control-plane-bootstrap`,\n });\n const controlPlaneMigrator = new Migrator({\n db: controlPlaneBootstrapKysely,\n migrationTableSchema: 'public',\n migrationTableName: 'control_plane_kysely_migration',\n migrationLockTableName: 'control_plane_kysely_migration_lock',\n provider: new FileMigrationProvider({\n fs,\n path,\n migrationFolder: path.join(root, 'control-plane-migrations'),\n }),\n });\n const { error: controlPlaneMigrationError } =\n await controlPlaneMigrator.migrateToLatest();\n if (controlPlaneMigrationError) {\n throw controlPlaneMigrationError;\n }\n\n await sql`alter table core.issue_message_overwrite set schema public`.execute(\n controlPlaneBootstrapKysely\n );\n await sql`drop schema core`.execute(controlPlaneBootstrapKysely);\n await sql`alter schema public rename to control_plane`.execute(\n controlPlaneBootstrapKysely\n );\n await sql`alter schema regional_public rename to public`.execute(\n controlPlaneBootstrapKysely\n );\n await sql`alter schema regional_core rename to core`.execute(\n controlPlaneBootstrapKysely\n );\n await sql`\n do $$\n declare\n definition text;\n begin\n select pg_get_functiondef(\n 'control_plane.normalize_tenant_slug(text)'::regprocedure\n ) into definition;\n execute replace(definition, 'public.', 'control_plane.');\n\n select pg_get_functiondef(\n 'control_plane.build_unique_tenant_slug(text,uuid)'::regprocedure\n ) into definition;\n execute replace(definition, 'public.', 'control_plane.');\n end;\n $$;\n `.execute(controlPlaneBootstrapKysely);\n await sql`\n insert into control_plane.app (\n authentication,\n category,\n color,\n created_at,\n icon,\n icon_round,\n id,\n info,\n name,\n type,\n version\n )\n select\n authentication,\n category,\n color,\n created_at,\n icon,\n icon_round,\n id,\n info,\n name,\n type,\n version\n from public.app\n on conflict (id) do nothing;\n `.execute(controlPlaneBootstrapKysely);\n await sql`\n insert into control_plane.currency (name)\n select name\n from public.currency\n on conflict (name) do nothing;\n `.execute(controlPlaneBootstrapKysely);\n await sql`\n insert into control_plane.booking_channel (\n channel_ref,\n color,\n created_at,\n icon,\n icon_provider,\n id,\n last_generate_run,\n logo,\n logo_provider,\n selected_booking_channel_icon_candidate_id,\n selected_booking_channel_logo_candidate_id,\n unique_ref,\n updated_at\n )\n select\n channel_ref,\n color,\n created_at,\n icon,\n icon_provider,\n id,\n last_generate_run,\n logo,\n logo_provider,\n selected_booking_channel_icon_candidate_id,\n selected_booking_channel_logo_candidate_id,\n unique_ref,\n updated_at\n from public.booking_channel\n on conflict (id) do nothing;\n `.execute(controlPlaneBootstrapKysely);\n await sql`\n insert into control_plane.booking_channel_icon_candidate (\n booking_channel_id,\n cloudflare_image_id,\n color,\n comment,\n created_at,\n external_icon,\n height,\n id,\n provider,\n source,\n updated_at,\n width\n )\n select\n booking_channel_id,\n cloudflare_image_id,\n color,\n comment,\n created_at,\n external_icon,\n height,\n id,\n provider,\n source,\n updated_at,\n width\n from public.booking_channel_icon_candidate\n on conflict (id) do nothing;\n `.execute(controlPlaneBootstrapKysely);\n await sql`\n insert into control_plane.tenant (\n billing_partner_id,\n billing_plan,\n created_at,\n data_region,\n id,\n name,\n partner_id,\n slug,\n status,\n storage_realm,\n type,\n unique_ref,\n updated_at\n )\n select\n billing_partner_id,\n billing_plan,\n created_at,\n data_region,\n id,\n name,\n partner_id,\n slug,\n status,\n storage_realm,\n type,\n unique_ref,\n updated_at\n from public.tenant\n on conflict (id) do nothing;\n `.execute(controlPlaneBootstrapKysely);\n await sql`\n insert into control_plane.token (\n created_at,\n expires_at,\n id,\n nano_id,\n payload,\n tenant_id,\n type,\n user_id\n )\n select\n created_at,\n expires_at,\n id,\n nano_id,\n payload,\n tenant_id,\n type,\n user_id\n from public.token\n on conflict (id) do nothing;\n `.execute(controlPlaneBootstrapKysely);\n\n const controlPlaneKysely = withControlPlaneSchema(\n getKysely<ControlPlaneDB>(dialect, {\n repositoryName: `${args.repositoryName ?? 'localTesting'}/control-plane`,\n log: args.log,\n }),\n 'control_plane',\n 'control_plane'\n );\n controlPlaneKysely.destroy = async () => {};\n Object.defineProperty(kysely, 'controlPlaneKysely', {\n value: controlPlaneKysely,\n });\n\n const originalDestroy = kysely.destroy.bind(kysely);\n kysely.destroy = async () => {\n if (isDestroyed) return;\n isDestroyed = true;\n //const destroyTime = performance.now();\n await originalDestroy();\n //console.log(\n // `Database destroyed: ${Math.round(performance.now() - destroyTime)}ms`\n //);\n };\n\n // console.log(`Database initialized: ${Math.round(performance.now() - now)}ms`);\n\n return kysely as LocalKysely;\n}\n"]}
|
package/build/main/regional.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Kysely } from './index';
|
|
1
|
+
import type { ControlPlaneKysely, Kysely } from './index';
|
|
2
2
|
export declare const tenantDataRegions: readonly ["ap", "crunchy", "eu", "hostaway", "us"];
|
|
3
3
|
export type TenantDataRegion = (typeof tenantDataRegions)[number];
|
|
4
4
|
export type RegionEnvironment = Record<string, string | undefined>;
|
|
@@ -10,6 +10,10 @@ type UseAsyncRegionalKysely = (connectionString: string, options?: {
|
|
|
10
10
|
repositoryName?: string;
|
|
11
11
|
probe?: true;
|
|
12
12
|
}) => Promise<Kysely>;
|
|
13
|
+
type UseAsyncControlPlaneKysely = (connectionString: string, options?: {
|
|
14
|
+
repositoryName?: string;
|
|
15
|
+
probe?: true;
|
|
16
|
+
}) => Promise<ControlPlaneKysely>;
|
|
13
17
|
export declare function useTenantDatabaseKysely(dataRegion: TenantDataRegion, repositoryName: string, env: RegionEnvironment, options?: {
|
|
14
18
|
useAsyncKysely?: UseAsyncRegionalKysely;
|
|
15
19
|
probe?: true;
|
|
@@ -32,6 +36,7 @@ export declare function resolveTenantKysely({ connectionId, slug, tenantId, repo
|
|
|
32
36
|
tenantId?: string;
|
|
33
37
|
repositoryName: string;
|
|
34
38
|
env: RegionEnvironment;
|
|
39
|
+
useAsyncControlPlaneKysely?: UseAsyncControlPlaneKysely;
|
|
35
40
|
useAsyncKysely?: UseAsyncRegionalKysely;
|
|
36
41
|
probe?: true;
|
|
37
42
|
}): Promise<TenantKysely>;
|
package/build/main/regional.js
CHANGED
|
@@ -117,6 +117,10 @@ async function defaultUseAsyncKysely(connectionString, options) {
|
|
|
117
117
|
const { useAsyncKysely } = await Promise.resolve().then(() => __importStar(require('./index')));
|
|
118
118
|
return await useAsyncKysely(connectionString, options);
|
|
119
119
|
}
|
|
120
|
+
async function defaultUseAsyncControlPlaneKysely(connectionString, options) {
|
|
121
|
+
const { useAsyncControlPlaneKysely } = await Promise.resolve().then(() => __importStar(require('./index')));
|
|
122
|
+
return await useAsyncControlPlaneKysely(connectionString, options);
|
|
123
|
+
}
|
|
120
124
|
async function useTenantDatabaseKysely(dataRegion, repositoryName, env, options = {}) {
|
|
121
125
|
const open = options.useAsyncKysely ?? defaultUseAsyncKysely;
|
|
122
126
|
return await open(resolveTenantDatabaseUrl(dataRegion, env), {
|
|
@@ -137,26 +141,26 @@ async function resolveTenantKysely({ connectionId, slug, tenantId, repositoryNam
|
|
|
137
141
|
const controlPlaneDatabaseUrl = env.CONTROL_PLANE_DATABASE_URL;
|
|
138
142
|
if (!controlPlaneDatabaseUrl)
|
|
139
143
|
throw new Error('CONTROL_PLANE_DATABASE_URL is required');
|
|
140
|
-
const controlPlane = await (options.
|
|
144
|
+
const controlPlane = await (options.useAsyncControlPlaneKysely ?? defaultUseAsyncControlPlaneKysely)(controlPlaneDatabaseUrl, {
|
|
141
145
|
repositoryName: `${repositoryName}/control-plane`,
|
|
142
146
|
probe: options.probe,
|
|
143
147
|
});
|
|
144
148
|
let tenant;
|
|
145
149
|
try {
|
|
146
150
|
const query = controlPlane
|
|
147
|
-
.selectFrom('
|
|
151
|
+
.selectFrom('controlPlane.tenant as tenant')
|
|
148
152
|
.select([
|
|
149
|
-
'
|
|
150
|
-
'
|
|
151
|
-
'
|
|
153
|
+
'tenant.id as id',
|
|
154
|
+
'tenant.slug as slug',
|
|
155
|
+
'tenant.dataRegion as dataRegion',
|
|
152
156
|
]);
|
|
153
157
|
tenant = await (slug
|
|
154
|
-
? query.where('
|
|
158
|
+
? query.where('tenant.slug', '=', slug)
|
|
155
159
|
: connectionId
|
|
156
160
|
? query
|
|
157
|
-
.innerJoin('
|
|
158
|
-
.where('
|
|
159
|
-
: query.where('
|
|
161
|
+
.innerJoin('controlPlane.connectionRoute as connectionRoute', 'connectionRoute.tenantId', 'tenant.id')
|
|
162
|
+
.where('connectionRoute.connectionId', '=', connectionId)
|
|
163
|
+
: query.where('tenant.id', '=', tenantId)).executeTakeFirst();
|
|
160
164
|
}
|
|
161
165
|
finally {
|
|
162
166
|
await controlPlane.destroy();
|