@playcademy/sandbox 0.6.1-beta.6 → 0.6.1-beta.7
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/cli.js +2634 -183
- package/dist/constants.js +1 -1
- package/dist/server.js +2633 -182
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -311,7 +311,7 @@ var init_timeback2 = __esm(() => {
|
|
|
311
311
|
});
|
|
312
312
|
|
|
313
313
|
// ../constants/src/cloudflare.ts
|
|
314
|
-
var WORKER_NAMING, MAX_WORKER_NAME_LENGTH = 63, SECRETS_PREFIX = "secrets_", CLOUDFLARE_COMPATIBILITY_DATE = "2025-10-11";
|
|
314
|
+
var WORKER_NAMING, MAX_WORKER_NAME_LENGTH = 63, SECRETS_PREFIX = "secrets_", CLOUDFLARE_COMPATIBILITY_DATE = "2025-10-11", D1_TIME_TRAVEL_RETENTION_DAYS = 30;
|
|
315
315
|
var init_cloudflare = __esm(() => {
|
|
316
316
|
WORKER_NAMING = {
|
|
317
317
|
STAGING_PREFIX: "staging-",
|
|
@@ -1084,7 +1084,7 @@ var package_default;
|
|
|
1084
1084
|
var init_package = __esm(() => {
|
|
1085
1085
|
package_default = {
|
|
1086
1086
|
name: "@playcademy/sandbox",
|
|
1087
|
-
version: "0.6.1-beta.
|
|
1087
|
+
version: "0.6.1-beta.7",
|
|
1088
1088
|
description: "Local development server for Playcademy game development",
|
|
1089
1089
|
type: "module",
|
|
1090
1090
|
exports: {
|
|
@@ -1153,6 +1153,16 @@ var init_package = __esm(() => {
|
|
|
1153
1153
|
});
|
|
1154
1154
|
|
|
1155
1155
|
// ../api-core/src/errors/domain.error.ts
|
|
1156
|
+
function deployErrorCode(error) {
|
|
1157
|
+
if (!(error instanceof DomainError)) {
|
|
1158
|
+
return null;
|
|
1159
|
+
}
|
|
1160
|
+
const details = error.details;
|
|
1161
|
+
if (typeof details !== "object" || details === null || !("code" in details)) {
|
|
1162
|
+
return null;
|
|
1163
|
+
}
|
|
1164
|
+
return typeof details.code === "string" ? details.code : null;
|
|
1165
|
+
}
|
|
1156
1166
|
var DomainError, BadRequestError, UnauthorizedError, AccessDeniedError, NotFoundError, ConflictError, AlreadyExistsError, ValidationError, RateLimitError, InternalError, ServiceUnavailableError, TimeoutError;
|
|
1157
1167
|
var init_domain_error = __esm(() => {
|
|
1158
1168
|
DomainError = class DomainError extends Error {
|
|
@@ -1235,6 +1245,158 @@ var init_domain_error = __esm(() => {
|
|
|
1235
1245
|
};
|
|
1236
1246
|
});
|
|
1237
1247
|
|
|
1248
|
+
// ../types/src/game.ts
|
|
1249
|
+
var DEPLOY_ERROR_CODES, REFUSAL_CODES, DEPLOY_REFUSAL_CODES, DELETED_ACCOUNT_LABEL = "(deleted account)";
|
|
1250
|
+
var init_game2 = __esm(() => {
|
|
1251
|
+
DEPLOY_ERROR_CODES = {
|
|
1252
|
+
deployIdPayloadMismatch: "deploy-id-payload-mismatch",
|
|
1253
|
+
stateConflict: "deployment-state-conflict",
|
|
1254
|
+
stateDrift: "deployment-state-drift",
|
|
1255
|
+
destructiveSchema: "destructive-schema-changes",
|
|
1256
|
+
upgradeRequired: "deploy-upgrade-required",
|
|
1257
|
+
checksumMismatch: "migration-checksum-mismatch",
|
|
1258
|
+
journalDivergence: "migration-journal-divergence",
|
|
1259
|
+
outOfOrder: "migration-out-of-order",
|
|
1260
|
+
migrationFailed: "migration-failed",
|
|
1261
|
+
strategyMismatch: "strategy-mismatch",
|
|
1262
|
+
pushFailed: "push-failed",
|
|
1263
|
+
pruneUnmanagedSecrets: "secrets-prune-unmanaged",
|
|
1264
|
+
baselineLedgerNotEmpty: "baseline-ledger-not-empty",
|
|
1265
|
+
baselineDatabaseEmpty: "baseline-database-empty",
|
|
1266
|
+
baselineAlreadyAdopted: "baseline-already-adopted",
|
|
1267
|
+
baselineClaimRejected: "baseline-claim-rejected",
|
|
1268
|
+
restoreUnsupported: "restore-unsupported",
|
|
1269
|
+
restoreIncomplete: "restore-incomplete",
|
|
1270
|
+
restoreBlockedByDeploy: "restore-blocked-by-deploy",
|
|
1271
|
+
restoreExpired: "restore-expired"
|
|
1272
|
+
};
|
|
1273
|
+
REFUSAL_CODES = [
|
|
1274
|
+
DEPLOY_ERROR_CODES.deployIdPayloadMismatch,
|
|
1275
|
+
DEPLOY_ERROR_CODES.stateConflict,
|
|
1276
|
+
DEPLOY_ERROR_CODES.stateDrift,
|
|
1277
|
+
DEPLOY_ERROR_CODES.destructiveSchema,
|
|
1278
|
+
DEPLOY_ERROR_CODES.upgradeRequired,
|
|
1279
|
+
DEPLOY_ERROR_CODES.checksumMismatch,
|
|
1280
|
+
DEPLOY_ERROR_CODES.journalDivergence,
|
|
1281
|
+
DEPLOY_ERROR_CODES.outOfOrder,
|
|
1282
|
+
DEPLOY_ERROR_CODES.strategyMismatch,
|
|
1283
|
+
DEPLOY_ERROR_CODES.pruneUnmanagedSecrets,
|
|
1284
|
+
DEPLOY_ERROR_CODES.baselineLedgerNotEmpty,
|
|
1285
|
+
DEPLOY_ERROR_CODES.baselineDatabaseEmpty,
|
|
1286
|
+
DEPLOY_ERROR_CODES.baselineAlreadyAdopted,
|
|
1287
|
+
DEPLOY_ERROR_CODES.baselineClaimRejected
|
|
1288
|
+
];
|
|
1289
|
+
DEPLOY_REFUSAL_CODES = new Set(REFUSAL_CODES);
|
|
1290
|
+
});
|
|
1291
|
+
|
|
1292
|
+
// ../api-core/src/errors/deploy.error.ts
|
|
1293
|
+
var DeployIdConflictError, DeploymentStateConflictError, DeploymentStateDriftError, LegacySchemaUpgradeRequiredError, DestructiveSchemaError, MigrationChecksumMismatchError, MigrationJournalDivergenceError, MigrationOrderError, SecretsPruneUnmanagedError, BaselineLedgerNotEmptyError, BaselineDatabaseEmptyError, BaselineAlreadyAdoptedError, BaselineClaimRejectedError, MigrationExecutionError, PushExecutionError;
|
|
1294
|
+
var init_deploy_error = __esm(() => {
|
|
1295
|
+
init_game2();
|
|
1296
|
+
init_domain_error();
|
|
1297
|
+
DeployIdConflictError = class DeployIdConflictError extends ConflictError {
|
|
1298
|
+
constructor(deployId, existingJobId) {
|
|
1299
|
+
super(`Deploy '${deployId}' was already created with a different payload — ` + "generate a fresh deployId for a new deploy", { code: DEPLOY_ERROR_CODES.deployIdPayloadMismatch, deployId, existingJobId });
|
|
1300
|
+
this.name = "DeployIdConflictError";
|
|
1301
|
+
}
|
|
1302
|
+
};
|
|
1303
|
+
DeploymentStateConflictError = class DeploymentStateConflictError extends ConflictError {
|
|
1304
|
+
constructor(payload) {
|
|
1305
|
+
super("Deployment state conflict: the schema baseline changed since this deploy was " + "prepared — refetch the deployment state, re-diff, and retry", { code: DEPLOY_ERROR_CODES.stateConflict, ...payload });
|
|
1306
|
+
this.name = "DeploymentStateConflictError";
|
|
1307
|
+
}
|
|
1308
|
+
};
|
|
1309
|
+
DeploymentStateDriftError = class DeploymentStateDriftError extends ConflictError {
|
|
1310
|
+
constructor(payload) {
|
|
1311
|
+
super("Deployment state drift: the live database schema does not match the recorded " + "fingerprint (out-of-band change or partial prior apply) — repair the " + "database state before deploying", { code: DEPLOY_ERROR_CODES.stateDrift, ...payload });
|
|
1312
|
+
this.name = "DeploymentStateDriftError";
|
|
1313
|
+
}
|
|
1314
|
+
};
|
|
1315
|
+
LegacySchemaUpgradeRequiredError = class LegacySchemaUpgradeRequiredError extends ValidationError {
|
|
1316
|
+
constructor() {
|
|
1317
|
+
super("This game's database state is server-managed; the legacy schema payload is no " + "longer accepted — update the Playcademy CLI and redeploy", { code: DEPLOY_ERROR_CODES.upgradeRequired });
|
|
1318
|
+
this.name = "LegacySchemaUpgradeRequiredError";
|
|
1319
|
+
}
|
|
1320
|
+
};
|
|
1321
|
+
DestructiveSchemaError = class DestructiveSchemaError extends ValidationError {
|
|
1322
|
+
constructor(statements) {
|
|
1323
|
+
super(`Push contains ${statements.length} destructive statement(s) that can drop data — ` + "review them and re-run with --accept-data-loss to proceed", { code: DEPLOY_ERROR_CODES.destructiveSchema, statements });
|
|
1324
|
+
this.name = "DestructiveSchemaError";
|
|
1325
|
+
}
|
|
1326
|
+
};
|
|
1327
|
+
MigrationChecksumMismatchError = class MigrationChecksumMismatchError extends ConflictError {
|
|
1328
|
+
constructor(mismatches) {
|
|
1329
|
+
const tags = mismatches.map((mismatch) => mismatch.tag).join(", ");
|
|
1330
|
+
super(`Applied migration(s) ${tags} no longer match their recorded checksums.`, {
|
|
1331
|
+
code: DEPLOY_ERROR_CODES.checksumMismatch,
|
|
1332
|
+
mismatches
|
|
1333
|
+
});
|
|
1334
|
+
this.name = "MigrationChecksumMismatchError";
|
|
1335
|
+
}
|
|
1336
|
+
};
|
|
1337
|
+
MigrationJournalDivergenceError = class MigrationJournalDivergenceError extends ConflictError {
|
|
1338
|
+
constructor(tags) {
|
|
1339
|
+
super(`The database ledger records applied migration(s) missing from the deploy's ` + `journal: ${tags.join(", ")}. Restore the missing migration files (or resolve ` + "the ledger) before deploying", { code: DEPLOY_ERROR_CODES.journalDivergence, tags });
|
|
1340
|
+
this.name = "MigrationJournalDivergenceError";
|
|
1341
|
+
}
|
|
1342
|
+
};
|
|
1343
|
+
MigrationOrderError = class MigrationOrderError extends ValidationError {
|
|
1344
|
+
constructor(tags) {
|
|
1345
|
+
super(`Out-of-order migration(s): ${tags.join(", ")} are ordered before migrations that ` + "already applied. This usually means a branch merged with older-numbered " + "migrations — regenerate them after the applied ones and redeploy", { code: DEPLOY_ERROR_CODES.outOfOrder, tags });
|
|
1346
|
+
this.name = "MigrationOrderError";
|
|
1347
|
+
}
|
|
1348
|
+
};
|
|
1349
|
+
SecretsPruneUnmanagedError = class SecretsPruneUnmanagedError extends ValidationError {
|
|
1350
|
+
constructor(keys) {
|
|
1351
|
+
super(`Cannot prune secret(s) not managed by the platform: ${keys.join(", ")}. ` + "Only keys the platform previously pushed can be pruned", { code: DEPLOY_ERROR_CODES.pruneUnmanagedSecrets, keys });
|
|
1352
|
+
this.name = "SecretsPruneUnmanagedError";
|
|
1353
|
+
}
|
|
1354
|
+
};
|
|
1355
|
+
BaselineLedgerNotEmptyError = class BaselineLedgerNotEmptyError extends ConflictError {
|
|
1356
|
+
constructor(tags) {
|
|
1357
|
+
super(`Cannot baseline: the migration ledger already records ${tags.length} applied ` + "migration(s) — this database is already server-managed. Just deploy", { code: DEPLOY_ERROR_CODES.baselineLedgerNotEmpty, tags });
|
|
1358
|
+
this.name = "BaselineLedgerNotEmptyError";
|
|
1359
|
+
}
|
|
1360
|
+
};
|
|
1361
|
+
BaselineDatabaseEmptyError = class BaselineDatabaseEmptyError extends ValidationError {
|
|
1362
|
+
constructor() {
|
|
1363
|
+
super("Cannot baseline an empty database — there is no applied history to claim. " + "An empty database needs no baseline: deploy directly and the full " + "journal (or schema) applies fresh.", { code: DEPLOY_ERROR_CODES.baselineDatabaseEmpty });
|
|
1364
|
+
this.name = "BaselineDatabaseEmptyError";
|
|
1365
|
+
}
|
|
1366
|
+
};
|
|
1367
|
+
BaselineAlreadyAdoptedError = class BaselineAlreadyAdoptedError extends ConflictError {
|
|
1368
|
+
constructor(baselineSource) {
|
|
1369
|
+
super("Cannot baseline: deployment state already records a schema baseline" + `${baselineSource ? ` (source: ${baselineSource})` : ""} — ` + "use realign/resolve to repair drift instead", { code: DEPLOY_ERROR_CODES.baselineAlreadyAdopted, baselineSource });
|
|
1370
|
+
this.name = "BaselineAlreadyAdoptedError";
|
|
1371
|
+
}
|
|
1372
|
+
};
|
|
1373
|
+
BaselineClaimRejectedError = class BaselineClaimRejectedError extends ConflictError {
|
|
1374
|
+
constructor(details) {
|
|
1375
|
+
const [first] = details.contradictions;
|
|
1376
|
+
super(first ? `Cannot baseline: the claim contradicts the live database — ${first.tag} ${first.detail ?? ""}` : "Cannot baseline: the claim includes migrations that cannot be verified against the live database — " + "pass --allow-unverified to record them anyway", { code: DEPLOY_ERROR_CODES.baselineClaimRejected, ...details });
|
|
1377
|
+
this.name = "BaselineClaimRejectedError";
|
|
1378
|
+
}
|
|
1379
|
+
};
|
|
1380
|
+
MigrationExecutionError = class MigrationExecutionError extends ValidationError {
|
|
1381
|
+
tag;
|
|
1382
|
+
offset;
|
|
1383
|
+
constructor(input) {
|
|
1384
|
+
super(`Migration '${input.tag}' failed and rolled back: ${input.d1Message}. ` + "Fix the migration SQL and redeploy — the deploy resumes from this migration", { code: DEPLOY_ERROR_CODES.migrationFailed, ...input });
|
|
1385
|
+
this.name = "MigrationExecutionError";
|
|
1386
|
+
this.tag = input.tag;
|
|
1387
|
+
this.offset = input.offset;
|
|
1388
|
+
}
|
|
1389
|
+
};
|
|
1390
|
+
PushExecutionError = class PushExecutionError extends ValidationError {
|
|
1391
|
+
offset;
|
|
1392
|
+
constructor(input) {
|
|
1393
|
+
super(`Push schema changes failed and rolled back: ${input.d1Message}. ` + "Fix the schema and redeploy — nothing was applied", { code: DEPLOY_ERROR_CODES.pushFailed, ...input });
|
|
1394
|
+
this.name = "PushExecutionError";
|
|
1395
|
+
this.offset = input.offset;
|
|
1396
|
+
}
|
|
1397
|
+
};
|
|
1398
|
+
});
|
|
1399
|
+
|
|
1238
1400
|
// ../api-core/src/errors/api.error.ts
|
|
1239
1401
|
var STATUS_MAP, ApiError;
|
|
1240
1402
|
var init_api_error = __esm(() => {
|
|
@@ -1334,6 +1496,7 @@ var init_api_error = __esm(() => {
|
|
|
1334
1496
|
// ../api-core/src/errors/index.ts
|
|
1335
1497
|
var init_errors = __esm(() => {
|
|
1336
1498
|
init_domain_error();
|
|
1499
|
+
init_deploy_error();
|
|
1337
1500
|
init_api_error();
|
|
1338
1501
|
});
|
|
1339
1502
|
|
|
@@ -5688,7 +5851,8 @@ var init_schema = __esm(() => {
|
|
|
5688
5851
|
ltiTestMode: exports_external.boolean().default(false),
|
|
5689
5852
|
platformServiceJwt: platformServiceJwtConfigSchema.optional(),
|
|
5690
5853
|
uploadBucket: exports_external.string().optional(),
|
|
5691
|
-
queueIngressSecret: exports_external.string().optional()
|
|
5854
|
+
queueIngressSecret: exports_external.string().optional(),
|
|
5855
|
+
secretsManifestPepper: exports_external.string().optional()
|
|
5692
5856
|
}).superRefine((config2, ctx) => {
|
|
5693
5857
|
if (config2.isLocal && !config2.baseUrl) {
|
|
5694
5858
|
ctx.addIssue({
|
|
@@ -11217,7 +11381,7 @@ var init_table4 = __esm(() => {
|
|
|
11217
11381
|
});
|
|
11218
11382
|
|
|
11219
11383
|
// ../data/src/domains/game/table.ts
|
|
11220
|
-
var gamePlatformEnum, gameTypeEnum, gameVisibilityEnum, games, gameMemberRoleEnum, gameMembers, gameMembersRelations, gameDashboardUserRoleEnum, gameDashboardUsers, gameDashboardUsersRelations, deploymentProviderEnum, deploymentTargetEnum, deployJobStatusEnum, gameDeployments, gameDeployJobs, customHostnameStatusEnum, customHostnameSslStatusEnum, customHostnameEnvironmentEnum, gameCustomHostnames;
|
|
11384
|
+
var gamePlatformEnum, gameTypeEnum, gameVisibilityEnum, games, gameMemberRoleEnum, gameMembers, gameMembersRelations, gameDashboardUserRoleEnum, gameDashboardUsers, gameDashboardUsersRelations, deploymentProviderEnum, deploymentTargetEnum, deployJobStatusEnum, gameDeployments, gameDeployJobs, gameDeployEvents, gameDeploymentState, customHostnameStatusEnum, customHostnameSslStatusEnum, customHostnameEnvironmentEnum, gameCustomHostnames;
|
|
11221
11385
|
var init_table5 = __esm(() => {
|
|
11222
11386
|
init_drizzle_orm();
|
|
11223
11387
|
init_pg_core();
|
|
@@ -11306,15 +11470,20 @@ var init_table5 = __esm(() => {
|
|
|
11306
11470
|
target: deploymentTargetEnum("target").notNull().default("game"),
|
|
11307
11471
|
url: text("url").notNull(),
|
|
11308
11472
|
codeHash: text("code_hash"),
|
|
11473
|
+
schemaHash: text("schema_hash"),
|
|
11474
|
+
schemaFingerprint: text("schema_fingerprint"),
|
|
11475
|
+
timeTravelBookmark: text("time_travel_bookmark"),
|
|
11476
|
+
bookmarkCapturedAt: timestamp("bookmark_captured_at", { withTimezone: true }),
|
|
11309
11477
|
isActive: boolean("is_active").notNull().default(false),
|
|
11310
11478
|
resources: jsonb("resources").$type(),
|
|
11311
11479
|
deployedAt: timestamp("deployed_at", { withTimezone: true }).notNull().defaultNow()
|
|
11312
|
-
});
|
|
11480
|
+
}, (table3) => [index("game_deployments_game_target_idx").on(table3.gameId, table3.target)]);
|
|
11313
11481
|
gameDeployJobs = pgTable("game_deploy_jobs", {
|
|
11314
11482
|
id: uuid("id").primaryKey().defaultRandom(),
|
|
11315
11483
|
gameId: uuid("game_id").notNull().references(() => games.id, { onDelete: "cascade" }),
|
|
11316
|
-
userId: text("user_id").
|
|
11484
|
+
userId: text("user_id").references(() => users.id, { onDelete: "set null" }),
|
|
11317
11485
|
status: deployJobStatusEnum("status").notNull().default("pending"),
|
|
11486
|
+
deployId: text("deploy_id"),
|
|
11318
11487
|
request: jsonb("request").$type().notNull(),
|
|
11319
11488
|
events: jsonb("events").$type().notNull().default([]),
|
|
11320
11489
|
error: text("error"),
|
|
@@ -11328,6 +11497,27 @@ var init_table5 = __esm(() => {
|
|
|
11328
11497
|
createdAt: timestamp("created_at", { mode: "date", withTimezone: true }).notNull().defaultNow(),
|
|
11329
11498
|
startedAt: timestamp("started_at", { mode: "date", withTimezone: true }),
|
|
11330
11499
|
completedAt: timestamp("completed_at", { mode: "date", withTimezone: true })
|
|
11500
|
+
}, (table3) => [uniqueIndex("game_deploy_jobs_game_deploy_id_idx").on(table3.gameId, table3.deployId)]);
|
|
11501
|
+
gameDeployEvents = pgTable("game_deploy_events", {
|
|
11502
|
+
id: uuid("id").primaryKey().defaultRandom(),
|
|
11503
|
+
gameId: uuid("game_id").notNull().references(() => games.id, { onDelete: "cascade" }),
|
|
11504
|
+
userId: text("user_id").references(() => users.id, { onDelete: "set null" }),
|
|
11505
|
+
kind: text("kind").$type().notNull(),
|
|
11506
|
+
payload: jsonb("payload").$type().notNull(),
|
|
11507
|
+
createdAt: timestamp("created_at", { mode: "date", withTimezone: true }).notNull().defaultNow()
|
|
11508
|
+
}, (table3) => [index("game_deploy_events_game_idx").on(table3.gameId, table3.createdAt)]);
|
|
11509
|
+
gameDeploymentState = pgTable("game_deployment_state", {
|
|
11510
|
+
id: uuid("id").primaryKey().defaultRandom(),
|
|
11511
|
+
gameId: uuid("game_id").notNull().unique().references(() => games.id, { onDelete: "cascade" }),
|
|
11512
|
+
schemaHash: text("schema_hash"),
|
|
11513
|
+
schemaSnapshot: jsonb("schema_snapshot"),
|
|
11514
|
+
schemaFingerprint: text("schema_fingerprint"),
|
|
11515
|
+
secretsManifest: jsonb("secrets_manifest").$type(),
|
|
11516
|
+
integrationsHash: text("integrations_hash"),
|
|
11517
|
+
buildHash: text("build_hash"),
|
|
11518
|
+
compatibilityDate: text("compatibility_date"),
|
|
11519
|
+
baselineSource: text("baseline_source").$type(),
|
|
11520
|
+
updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow()
|
|
11331
11521
|
});
|
|
11332
11522
|
customHostnameStatusEnum = pgEnum("custom_hostname_status", [
|
|
11333
11523
|
"pending",
|
|
@@ -11490,7 +11680,9 @@ __export(exports_tables_index, {
|
|
|
11490
11680
|
gameMembers: () => gameMembers,
|
|
11491
11681
|
gameMemberRoleEnum: () => gameMemberRoleEnum,
|
|
11492
11682
|
gameDeployments: () => gameDeployments,
|
|
11683
|
+
gameDeploymentState: () => gameDeploymentState,
|
|
11493
11684
|
gameDeployJobs: () => gameDeployJobs,
|
|
11685
|
+
gameDeployEvents: () => gameDeployEvents,
|
|
11494
11686
|
gameDashboardUsersRelations: () => gameDashboardUsersRelations,
|
|
11495
11687
|
gameDashboardUsers: () => gameDashboardUsers,
|
|
11496
11688
|
gameDashboardUserRoleEnum: () => gameDashboardUserRoleEnum,
|
|
@@ -22505,7 +22697,112 @@ var init_zip = __esm(() => {
|
|
|
22505
22697
|
import_jszip = __toESM(require_lib3(), 1);
|
|
22506
22698
|
});
|
|
22507
22699
|
|
|
22700
|
+
// ../utils/src/stages.ts
|
|
22701
|
+
function isPreviewStage(stage) {
|
|
22702
|
+
return PREVIEW_STAGE_PATTERN.test(stage);
|
|
22703
|
+
}
|
|
22704
|
+
var PREVIEW_STAGE_PATTERN;
|
|
22705
|
+
var init_stages = __esm(() => {
|
|
22706
|
+
PREVIEW_STAGE_PATTERN = /^pr-\d+$/;
|
|
22707
|
+
});
|
|
22708
|
+
|
|
22709
|
+
// ../api-core/src/utils/deployment.util.ts
|
|
22710
|
+
function deployJobInstant() {
|
|
22711
|
+
return sql`COALESCE(${gameDeployJobs.completedAt}, ${gameDeployJobs.createdAt})`;
|
|
22712
|
+
}
|
|
22713
|
+
async function findLastSuccessfulDeploy(db2, gameId) {
|
|
22714
|
+
const job = await db2.query.gameDeployJobs.findFirst({
|
|
22715
|
+
where: and(eq(gameDeployJobs.gameId, gameId), eq(gameDeployJobs.status, "succeeded")),
|
|
22716
|
+
orderBy: desc(deployJobInstant()),
|
|
22717
|
+
columns: { userId: true, createdAt: true, completedAt: true }
|
|
22718
|
+
});
|
|
22719
|
+
if (!job) {
|
|
22720
|
+
return null;
|
|
22721
|
+
}
|
|
22722
|
+
return { userId: job.userId, at: job.completedAt ?? job.createdAt };
|
|
22723
|
+
}
|
|
22724
|
+
async function findLastSuccessfulDeployWithEmail(db2, gameId) {
|
|
22725
|
+
const lastDeploy = await findLastSuccessfulDeploy(db2, gameId);
|
|
22726
|
+
if (!lastDeploy) {
|
|
22727
|
+
return null;
|
|
22728
|
+
}
|
|
22729
|
+
const deployer = lastDeploy.userId ? await db2.query.users.findFirst({
|
|
22730
|
+
where: eq(users.id, lastDeploy.userId),
|
|
22731
|
+
columns: { email: true }
|
|
22732
|
+
}) : null;
|
|
22733
|
+
return { ...lastDeploy, email: deployer?.email ?? null };
|
|
22734
|
+
}
|
|
22735
|
+
function getGameDeploymentId(gameSlug, sstStage) {
|
|
22736
|
+
if (sstStage === "production") {
|
|
22737
|
+
return gameSlug;
|
|
22738
|
+
}
|
|
22739
|
+
if (sstStage === "dev" || isPreviewStage(sstStage)) {
|
|
22740
|
+
return `${WORKER_NAMING.STAGING_PREFIX}${gameSlug}`;
|
|
22741
|
+
}
|
|
22742
|
+
return `${WORKER_NAMING.LOCAL_PREFIX}${sstStage}-${gameSlug}`;
|
|
22743
|
+
}
|
|
22744
|
+
function getDashboardDeploymentId(gameSlug, sstStage) {
|
|
22745
|
+
return `${getGameDeploymentId(gameSlug, sstStage)}${DASHBOARD_WORKER_SUFFIX}`;
|
|
22746
|
+
}
|
|
22747
|
+
function getGameWorkerApiKeyName(slug) {
|
|
22748
|
+
return `${GAME_WORKER_KEY_PREFIX}${slug}`.substring(0, 32);
|
|
22749
|
+
}
|
|
22750
|
+
function getDashboardWorkerApiKeyName(slug) {
|
|
22751
|
+
return `${DASHBOARD_WORKER_KEY_PREFIX}${slug}`;
|
|
22752
|
+
}
|
|
22753
|
+
function toBindingName(queueKey) {
|
|
22754
|
+
return `${queueKey.replace(/-/g, "_").toUpperCase()}_QUEUE`;
|
|
22755
|
+
}
|
|
22756
|
+
function isSchemaAdopted(state) {
|
|
22757
|
+
if (!state) {
|
|
22758
|
+
return false;
|
|
22759
|
+
}
|
|
22760
|
+
return state.schemaHash !== null || state.schemaFingerprint !== null || state.schemaSnapshot !== null;
|
|
22761
|
+
}
|
|
22762
|
+
function isPushAdopted(state) {
|
|
22763
|
+
return Boolean(state?.schemaHash);
|
|
22764
|
+
}
|
|
22765
|
+
function isMigrateManaged(state) {
|
|
22766
|
+
return Boolean(state?.schemaFingerprint) && !state?.schemaHash;
|
|
22767
|
+
}
|
|
22768
|
+
function generateDeploymentHash(code) {
|
|
22769
|
+
return sha256Hex(code);
|
|
22770
|
+
}
|
|
22771
|
+
function computeDeployPayloadFingerprint(payload) {
|
|
22772
|
+
return sha256Hex(canonicalJson(payload));
|
|
22773
|
+
}
|
|
22774
|
+
function canonicalJson(value) {
|
|
22775
|
+
if (value === null || typeof value !== "object") {
|
|
22776
|
+
return JSON.stringify(value) ?? "null";
|
|
22777
|
+
}
|
|
22778
|
+
if (Array.isArray(value)) {
|
|
22779
|
+
return `[${value.map((item) => canonicalJson(item)).join(",")}]`;
|
|
22780
|
+
}
|
|
22781
|
+
const entries = Object.entries(value).filter(([, entryValue]) => entryValue !== undefined).toSorted(([a], [b]) => compareKeys(a, b)).map(([key, entryValue]) => `${JSON.stringify(key)}:${canonicalJson(entryValue)}`);
|
|
22782
|
+
return `{${entries.join(",")}}`;
|
|
22783
|
+
}
|
|
22784
|
+
function compareKeys(a, b) {
|
|
22785
|
+
if (a < b) {
|
|
22786
|
+
return -1;
|
|
22787
|
+
}
|
|
22788
|
+
if (a > b) {
|
|
22789
|
+
return 1;
|
|
22790
|
+
}
|
|
22791
|
+
return 0;
|
|
22792
|
+
}
|
|
22793
|
+
var GAME_WORKER_KEY_PREFIX = "game-worker-", DASHBOARD_WORKER_KEY_PREFIX = "dash-worker-";
|
|
22794
|
+
var init_deployment_util = __esm(() => {
|
|
22795
|
+
init_drizzle_orm();
|
|
22796
|
+
init_src();
|
|
22797
|
+
init_tables_index();
|
|
22798
|
+
init_stages();
|
|
22799
|
+
});
|
|
22800
|
+
|
|
22508
22801
|
// ../api-core/src/services/deploy-job.service.ts
|
|
22802
|
+
function isEventDetails(value) {
|
|
22803
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
22804
|
+
}
|
|
22805
|
+
|
|
22509
22806
|
class DeployJobService {
|
|
22510
22807
|
deps;
|
|
22511
22808
|
constructor(deps) {
|
|
@@ -22518,6 +22815,9 @@ class DeployJobService {
|
|
|
22518
22815
|
if (leaseLost) {
|
|
22519
22816
|
return "lease_lost";
|
|
22520
22817
|
}
|
|
22818
|
+
if (DEPLOY_REFUSAL_CODES.has(deployErrorCode(error) ?? "")) {
|
|
22819
|
+
return "refused";
|
|
22820
|
+
}
|
|
22521
22821
|
if (error instanceof DomainError) {
|
|
22522
22822
|
return "domain_error";
|
|
22523
22823
|
}
|
|
@@ -22597,13 +22897,28 @@ class DeployJobService {
|
|
|
22597
22897
|
const bucketName = this.getUploadBucket();
|
|
22598
22898
|
this.deps.storage.deleteObject(bucketName, codeUploadToken).catch(catchAttrs("deploy_job.temp_cleanup"));
|
|
22599
22899
|
}
|
|
22600
|
-
sanitizeRequestForPersistence(request) {
|
|
22601
|
-
const sanitized = {
|
|
22900
|
+
async sanitizeRequestForPersistence(request) {
|
|
22901
|
+
const sanitized = {
|
|
22902
|
+
...request
|
|
22903
|
+
};
|
|
22602
22904
|
delete sanitized._headers;
|
|
22603
22905
|
delete sanitized.code;
|
|
22604
22906
|
delete sanitized.codeUploadToken;
|
|
22907
|
+
const codeFingerprint = await this.computeCodeFingerprint(request);
|
|
22908
|
+
if (codeFingerprint) {
|
|
22909
|
+
sanitized.codeFingerprint = codeFingerprint;
|
|
22910
|
+
}
|
|
22605
22911
|
return sanitized;
|
|
22606
22912
|
}
|
|
22913
|
+
async computeCodeFingerprint(request) {
|
|
22914
|
+
if (request.codeUploadToken) {
|
|
22915
|
+
return `upload:${request.codeUploadToken}`;
|
|
22916
|
+
}
|
|
22917
|
+
if (request.code) {
|
|
22918
|
+
return `sha256:${await generateDeploymentHash(request.code)}`;
|
|
22919
|
+
}
|
|
22920
|
+
return;
|
|
22921
|
+
}
|
|
22607
22922
|
getLeaseExpiry() {
|
|
22608
22923
|
return new Date(Date.now() + DEPLOY_JOB_LEASE_MS);
|
|
22609
22924
|
}
|
|
@@ -22636,8 +22951,36 @@ class DeployJobService {
|
|
|
22636
22951
|
heartbeatAt: null
|
|
22637
22952
|
}).where(and(eq(gameDeployJobs.id, jobId), eq(gameDeployJobs.leaseId, leaseId)));
|
|
22638
22953
|
}
|
|
22954
|
+
async findByDeployId(gameId, deployId) {
|
|
22955
|
+
const job = await this.deps.db.query.gameDeployJobs.findFirst({
|
|
22956
|
+
where: and(eq(gameDeployJobs.gameId, gameId), eq(gameDeployJobs.deployId, deployId))
|
|
22957
|
+
});
|
|
22958
|
+
return job ?? null;
|
|
22959
|
+
}
|
|
22960
|
+
async resolveIdempotentReplay(existing, request) {
|
|
22961
|
+
const [incoming, stored] = await Promise.all([
|
|
22962
|
+
this.sanitizeRequestForPersistence(request).then(computeDeployPayloadFingerprint),
|
|
22963
|
+
computeDeployPayloadFingerprint(existing.request)
|
|
22964
|
+
]);
|
|
22965
|
+
if (incoming !== stored) {
|
|
22966
|
+
setAttribute("app.deploy_job.idempotency", "payload_mismatch");
|
|
22967
|
+
throw new DeployIdConflictError(request.deployId, existing.id);
|
|
22968
|
+
}
|
|
22969
|
+
setAttributes({
|
|
22970
|
+
"app.deploy_job.idempotency": "replayed",
|
|
22971
|
+
"app.deploy_job.id": existing.id,
|
|
22972
|
+
"app.deploy_job.status": existing.status
|
|
22973
|
+
});
|
|
22974
|
+
return this.toResponse(existing);
|
|
22975
|
+
}
|
|
22639
22976
|
async create(slug, request, user) {
|
|
22640
22977
|
const game2 = await this.deps.validateDeveloperAccessBySlug(user, slug);
|
|
22978
|
+
if (request.deployId) {
|
|
22979
|
+
const existing = await this.findByDeployId(game2.id, request.deployId);
|
|
22980
|
+
if (existing) {
|
|
22981
|
+
return this.resolveIdempotentReplay(existing, request);
|
|
22982
|
+
}
|
|
22983
|
+
}
|
|
22641
22984
|
const jobId = crypto.randomUUID();
|
|
22642
22985
|
let codeSource = "none";
|
|
22643
22986
|
if (request.code) {
|
|
@@ -22653,7 +22996,7 @@ class DeployJobService {
|
|
|
22653
22996
|
request.code = await this.loadUploadedCode(request.codeUploadToken, game2.id);
|
|
22654
22997
|
}
|
|
22655
22998
|
setAttribute("app.deploy_job.code_bundle_size", request.code?.length ?? 0);
|
|
22656
|
-
const sanitizedRequest = this.sanitizeRequestForPersistence(request);
|
|
22999
|
+
const sanitizedRequest = await this.sanitizeRequestForPersistence(request);
|
|
22657
23000
|
if (request.code) {
|
|
22658
23001
|
await this.storeCodeBundle(jobId, request.code);
|
|
22659
23002
|
}
|
|
@@ -22663,6 +23006,7 @@ class DeployJobService {
|
|
|
22663
23006
|
id: jobId,
|
|
22664
23007
|
gameId: game2.id,
|
|
22665
23008
|
userId: user.id,
|
|
23009
|
+
deployId: request.deployId ?? null,
|
|
22666
23010
|
request: sanitizedRequest,
|
|
22667
23011
|
events: [
|
|
22668
23012
|
{
|
|
@@ -22674,6 +23018,12 @@ class DeployJobService {
|
|
|
22674
23018
|
}).returning();
|
|
22675
23019
|
} catch (error) {
|
|
22676
23020
|
await this.deleteCodeBundle(jobId);
|
|
23021
|
+
if (request.deployId) {
|
|
23022
|
+
const winner = await this.findByDeployId(game2.id, request.deployId);
|
|
23023
|
+
if (winner) {
|
|
23024
|
+
return this.resolveIdempotentReplay(winner, request);
|
|
23025
|
+
}
|
|
23026
|
+
}
|
|
22677
23027
|
throw error;
|
|
22678
23028
|
}
|
|
22679
23029
|
if (!job) {
|
|
@@ -22788,7 +23138,11 @@ class DeployJobService {
|
|
|
22788
23138
|
"app.deploy_job.error_status": errorClassification?.errorStatus
|
|
22789
23139
|
});
|
|
22790
23140
|
if (!effectiveLeaseLost) {
|
|
22791
|
-
|
|
23141
|
+
const structuredDetails = error instanceof DomainError && isEventDetails(error.details) ? error.details : undefined;
|
|
23142
|
+
await this.addStatusEvent(jobId, "Deployment failed", {
|
|
23143
|
+
error: message,
|
|
23144
|
+
...structuredDetails
|
|
23145
|
+
});
|
|
22792
23146
|
const failed = await this.markFailed(jobId, leaseId, message, errorClassification);
|
|
22793
23147
|
if (!failed) {
|
|
22794
23148
|
await this.clearLease(jobId, leaseId);
|
|
@@ -22801,18 +23155,21 @@ class DeployJobService {
|
|
|
22801
23155
|
displayName: game2.displayName,
|
|
22802
23156
|
error: message,
|
|
22803
23157
|
target,
|
|
22804
|
-
developer: { id: user.id, email: user.email }
|
|
23158
|
+
developer: { id: user.id, email: user.email },
|
|
23159
|
+
errorCode: deployErrorCode(error)
|
|
22805
23160
|
});
|
|
22806
23161
|
}
|
|
22807
23162
|
await this.deleteCodeBundle(jobId);
|
|
22808
23163
|
}
|
|
22809
23164
|
async loadJobActors(job, jobId, leaseId, onMissing) {
|
|
22810
|
-
const game2 = await
|
|
22811
|
-
|
|
22812
|
-
|
|
22813
|
-
|
|
22814
|
-
|
|
22815
|
-
|
|
23165
|
+
const [game2, user] = await Promise.all([
|
|
23166
|
+
this.deps.db.query.games.findFirst({
|
|
23167
|
+
where: eq(games.id, job.gameId)
|
|
23168
|
+
}),
|
|
23169
|
+
job.userId ? this.deps.db.query.users.findFirst({
|
|
23170
|
+
where: eq(users.id, job.userId)
|
|
23171
|
+
}) : undefined
|
|
23172
|
+
]);
|
|
22816
23173
|
if (!game2 || !user) {
|
|
22817
23174
|
const message = !game2 ? "Deploy job game no longer exists" : "Deploy job user no longer exists";
|
|
22818
23175
|
onMissing();
|
|
@@ -22898,7 +23255,8 @@ class DeployJobService {
|
|
|
22898
23255
|
for await (const step of this.deps.runDeploy(game2.slug, request, user, uploadDeps, extractZipToDirectory)) {
|
|
22899
23256
|
assertLease();
|
|
22900
23257
|
if (step.type === "status" && "message" in step.data && typeof step.data.message === "string") {
|
|
22901
|
-
|
|
23258
|
+
const details = "details" in step.data && isEventDetails(step.data.details) ? step.data.details : undefined;
|
|
23259
|
+
await this.addStatusEvent(jobId, step.data.message, details);
|
|
22902
23260
|
}
|
|
22903
23261
|
}
|
|
22904
23262
|
assertLease();
|
|
@@ -22956,8 +23314,10 @@ var init_deploy_job_service = __esm(() => {
|
|
|
22956
23314
|
init_helpers_index();
|
|
22957
23315
|
init_tables_index();
|
|
22958
23316
|
init_spans();
|
|
23317
|
+
init_game2();
|
|
22959
23318
|
init_zip();
|
|
22960
23319
|
init_errors();
|
|
23320
|
+
init_deployment_util();
|
|
22961
23321
|
STATUS_MAP2 = {
|
|
22962
23322
|
BAD_REQUEST: 400,
|
|
22963
23323
|
UNAUTHORIZED: 401,
|
|
@@ -22979,8 +23339,153 @@ var init_deploy_job_service = __esm(() => {
|
|
|
22979
23339
|
DEPLOY_JOB_LEASE_MS = 2 * 60 * 1000;
|
|
22980
23340
|
DEPLOY_JOB_HEARTBEAT_MS = 30 * 1000;
|
|
22981
23341
|
});
|
|
23342
|
+
// ../cloudflare/src/utils/schema.ts
|
|
23343
|
+
function normalizeSqlForChecksum(sql4) {
|
|
23344
|
+
const unified = sql4.replace(/\r\n/g, `
|
|
23345
|
+
`).replace(/\r/g, `
|
|
23346
|
+
`);
|
|
23347
|
+
const stripped = stripSqlComments(unified);
|
|
23348
|
+
return stripped.split(`
|
|
23349
|
+
`).map((line3) => line3.replace(/\s+$/, "")).filter((line3) => line3 !== "").join(`
|
|
23350
|
+
`);
|
|
23351
|
+
}
|
|
23352
|
+
function stripSqlComments(sql4) {
|
|
23353
|
+
let output = "";
|
|
23354
|
+
let i2 = 0;
|
|
23355
|
+
while (i2 < sql4.length) {
|
|
23356
|
+
const char3 = sql4[i2];
|
|
23357
|
+
const next = sql4[i2 + 1];
|
|
23358
|
+
if (char3 === "-" && next === "-") {
|
|
23359
|
+
i2 = skipLineComment(sql4, i2);
|
|
23360
|
+
} else if (char3 === "/" && next === "*") {
|
|
23361
|
+
output += " ";
|
|
23362
|
+
i2 = skipBlockComment(sql4, i2);
|
|
23363
|
+
} else if (char3 === "'" || char3 === '"' || char3 === "`") {
|
|
23364
|
+
const quoted = copyQuoted(sql4, i2, char3);
|
|
23365
|
+
output += quoted.text;
|
|
23366
|
+
i2 = quoted.end;
|
|
23367
|
+
} else if (char3 === "[") {
|
|
23368
|
+
const bracketed = copyBracketed(sql4, i2);
|
|
23369
|
+
output += bracketed.text;
|
|
23370
|
+
i2 = bracketed.end;
|
|
23371
|
+
} else {
|
|
23372
|
+
output += char3;
|
|
23373
|
+
i2++;
|
|
23374
|
+
}
|
|
23375
|
+
}
|
|
23376
|
+
return output;
|
|
23377
|
+
}
|
|
23378
|
+
function skipLineComment(sql4, start2) {
|
|
23379
|
+
let i2 = start2 + 2;
|
|
23380
|
+
while (i2 < sql4.length && sql4[i2] !== `
|
|
23381
|
+
`) {
|
|
23382
|
+
i2++;
|
|
23383
|
+
}
|
|
23384
|
+
return i2;
|
|
23385
|
+
}
|
|
23386
|
+
function skipBlockComment(sql4, start2) {
|
|
23387
|
+
let i2 = start2 + 2;
|
|
23388
|
+
while (i2 < sql4.length && !(sql4[i2] === "*" && sql4[i2 + 1] === "/")) {
|
|
23389
|
+
i2++;
|
|
23390
|
+
}
|
|
23391
|
+
return i2 + 2;
|
|
23392
|
+
}
|
|
23393
|
+
function copyQuoted(sql4, start2, quote) {
|
|
23394
|
+
let text3 = quote;
|
|
23395
|
+
let i2 = start2 + 1;
|
|
23396
|
+
while (i2 < sql4.length) {
|
|
23397
|
+
text3 += sql4[i2];
|
|
23398
|
+
if (sql4[i2] !== quote) {
|
|
23399
|
+
i2++;
|
|
23400
|
+
} else if (sql4[i2 + 1] === quote) {
|
|
23401
|
+
text3 += quote;
|
|
23402
|
+
i2 += 2;
|
|
23403
|
+
} else {
|
|
23404
|
+
i2++;
|
|
23405
|
+
break;
|
|
23406
|
+
}
|
|
23407
|
+
}
|
|
23408
|
+
return { text: text3, end: i2 };
|
|
23409
|
+
}
|
|
23410
|
+
function copyBracketed(sql4, start2) {
|
|
23411
|
+
let text3 = "[";
|
|
23412
|
+
let i2 = start2 + 1;
|
|
23413
|
+
while (i2 < sql4.length) {
|
|
23414
|
+
text3 += sql4[i2];
|
|
23415
|
+
i2++;
|
|
23416
|
+
if (sql4[i2 - 1] === "]") {
|
|
23417
|
+
break;
|
|
23418
|
+
}
|
|
23419
|
+
}
|
|
23420
|
+
return { text: text3, end: i2 };
|
|
23421
|
+
}
|
|
23422
|
+
function findOversizedStatement(statements) {
|
|
23423
|
+
for (const [index2, statement] of statements.entries()) {
|
|
23424
|
+
const byteLength = Buffer.byteLength(statement, "utf8");
|
|
23425
|
+
if (byteLength > D1_MAX_STATEMENT_BYTES) {
|
|
23426
|
+
return { index: index2, byteLength };
|
|
23427
|
+
}
|
|
23428
|
+
}
|
|
23429
|
+
return null;
|
|
23430
|
+
}
|
|
23431
|
+
var MIGRATION_LEDGER_TABLE = "_playcademy_migrations", MIGRATION_CHECKSUM_ALGO = "sha256-v1", D1_MAX_STATEMENT_BYTES;
|
|
23432
|
+
var init_schema3 = __esm(() => {
|
|
23433
|
+
D1_MAX_STATEMENT_BYTES = 100 * 1024;
|
|
23434
|
+
});
|
|
23435
|
+
|
|
22982
23436
|
// ../cloudflare/src/core/namespaces/d1.ts
|
|
22983
|
-
|
|
23437
|
+
function parseD1ErrorOffset(message) {
|
|
23438
|
+
const match = message.match(/at offset (\d+)/);
|
|
23439
|
+
return match ? Number(match[1]) : null;
|
|
23440
|
+
}
|
|
23441
|
+
var MIGRATION_LEDGER_DDL, D1StatementTooLargeError, D1BatchError, D1MigrationError;
|
|
23442
|
+
var init_d1 = __esm(() => {
|
|
23443
|
+
init_schema3();
|
|
23444
|
+
MIGRATION_LEDGER_DDL = `CREATE TABLE IF NOT EXISTS ${MIGRATION_LEDGER_TABLE} (
|
|
23445
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
23446
|
+
tag TEXT NOT NULL UNIQUE,
|
|
23447
|
+
checksum TEXT NOT NULL,
|
|
23448
|
+
checksum_algo TEXT NOT NULL DEFAULT 'sha256-v1',
|
|
23449
|
+
deploy_id TEXT NOT NULL,
|
|
23450
|
+
applied_by TEXT,
|
|
23451
|
+
applied_at TEXT NOT NULL,
|
|
23452
|
+
source TEXT NOT NULL DEFAULT 'deploy',
|
|
23453
|
+
statements_total INTEGER
|
|
23454
|
+
)`;
|
|
23455
|
+
D1StatementTooLargeError = class D1StatementTooLargeError extends Error {
|
|
23456
|
+
name = "D1StatementTooLargeError";
|
|
23457
|
+
statementIndex;
|
|
23458
|
+
byteLength;
|
|
23459
|
+
constructor(tag, statementIndex, byteLength) {
|
|
23460
|
+
super(`Migration '${tag}' statement ${statementIndex} is ${byteLength} bytes — ` + `over D1's ${D1_MAX_STATEMENT_BYTES / 1024} KB per-statement limit. ` + "Split the statement or reduce its size.");
|
|
23461
|
+
this.statementIndex = statementIndex;
|
|
23462
|
+
this.byteLength = byteLength;
|
|
23463
|
+
}
|
|
23464
|
+
};
|
|
23465
|
+
D1BatchError = class D1BatchError extends Error {
|
|
23466
|
+
name = "D1BatchError";
|
|
23467
|
+
d1Message;
|
|
23468
|
+
offset;
|
|
23469
|
+
constructor(d1Message, cause) {
|
|
23470
|
+
super(`Failed to execute batch: ${d1Message}`, { cause });
|
|
23471
|
+
this.d1Message = d1Message;
|
|
23472
|
+
this.offset = parseD1ErrorOffset(d1Message);
|
|
23473
|
+
}
|
|
23474
|
+
};
|
|
23475
|
+
D1MigrationError = class D1MigrationError extends Error {
|
|
23476
|
+
name = "D1MigrationError";
|
|
23477
|
+
tag;
|
|
23478
|
+
d1Message;
|
|
23479
|
+
offset;
|
|
23480
|
+
constructor(tag, d1Message, cause) {
|
|
23481
|
+
super(`Migration '${tag}' failed and rolled back: ${d1Message}`, { cause });
|
|
23482
|
+
this.tag = tag;
|
|
23483
|
+
this.d1Message = d1Message;
|
|
23484
|
+
this.offset = parseD1ErrorOffset(d1Message);
|
|
23485
|
+
}
|
|
23486
|
+
};
|
|
23487
|
+
});
|
|
23488
|
+
|
|
22984
23489
|
// ../cloudflare/src/core/namespaces/kv.ts
|
|
22985
23490
|
var init_kv = () => {};
|
|
22986
23491
|
|
|
@@ -22997,6 +23502,160 @@ var init_assets = __esm(() => {
|
|
|
22997
23502
|
init_mime();
|
|
22998
23503
|
});
|
|
22999
23504
|
|
|
23505
|
+
// ../cloudflare/src/utils/journal.ts
|
|
23506
|
+
function findOutOfOrderTags(orderedTags, applied) {
|
|
23507
|
+
let lastAppliedIndex = -1;
|
|
23508
|
+
orderedTags.forEach((tag, index2) => {
|
|
23509
|
+
if (applied.has(tag)) {
|
|
23510
|
+
lastAppliedIndex = index2;
|
|
23511
|
+
}
|
|
23512
|
+
});
|
|
23513
|
+
return orderedTags.filter((tag, index2) => index2 < lastAppliedIndex && !applied.has(tag));
|
|
23514
|
+
}
|
|
23515
|
+
|
|
23516
|
+
// ../cloudflare/src/utils/sql.ts
|
|
23517
|
+
function detectDestructiveStatements(statements) {
|
|
23518
|
+
return statements.filter((statement) => {
|
|
23519
|
+
const scannable = blankStringLiterals(normalizeSqlForChecksum(statement));
|
|
23520
|
+
return DESTRUCTIVE_SQL_PATTERNS.some((pattern) => pattern.test(scannable));
|
|
23521
|
+
});
|
|
23522
|
+
}
|
|
23523
|
+
function splitSqlStatements(sql4) {
|
|
23524
|
+
const statements = [];
|
|
23525
|
+
let current = "";
|
|
23526
|
+
let i2 = 0;
|
|
23527
|
+
while (i2 < sql4.length) {
|
|
23528
|
+
const char3 = sql4[i2];
|
|
23529
|
+
const next = sql4[i2 + 1];
|
|
23530
|
+
if (char3 === ";") {
|
|
23531
|
+
statements.push(current);
|
|
23532
|
+
current = "";
|
|
23533
|
+
i2++;
|
|
23534
|
+
} else if (char3 === "-" && next === "-") {
|
|
23535
|
+
const end = scanLineCommentEnd(sql4, i2);
|
|
23536
|
+
current += sql4.slice(i2, end);
|
|
23537
|
+
i2 = end;
|
|
23538
|
+
} else if (char3 === "/" && next === "*") {
|
|
23539
|
+
const end = scanBlockCommentEnd(sql4, i2);
|
|
23540
|
+
current += sql4.slice(i2, end);
|
|
23541
|
+
i2 = end;
|
|
23542
|
+
} else if (char3 === "'" || char3 === '"' || char3 === "`") {
|
|
23543
|
+
const end = scanQuoteEnd(sql4, i2, char3);
|
|
23544
|
+
current += sql4.slice(i2, end);
|
|
23545
|
+
i2 = end;
|
|
23546
|
+
} else if (char3 === "[") {
|
|
23547
|
+
const end = scanBracketEnd(sql4, i2);
|
|
23548
|
+
current += sql4.slice(i2, end);
|
|
23549
|
+
i2 = end;
|
|
23550
|
+
} else {
|
|
23551
|
+
current += char3;
|
|
23552
|
+
i2++;
|
|
23553
|
+
}
|
|
23554
|
+
}
|
|
23555
|
+
statements.push(current);
|
|
23556
|
+
return statements.map((statement) => statement.trim()).filter((statement) => normalizeSqlForChecksum(statement).trim() !== "");
|
|
23557
|
+
}
|
|
23558
|
+
function blankStringLiterals(sql4) {
|
|
23559
|
+
let output = "";
|
|
23560
|
+
let i2 = 0;
|
|
23561
|
+
while (i2 < sql4.length) {
|
|
23562
|
+
const char3 = sql4[i2];
|
|
23563
|
+
if (char3 === "'") {
|
|
23564
|
+
output += "''";
|
|
23565
|
+
i2 = scanQuoteEnd(sql4, i2, char3);
|
|
23566
|
+
} else if (char3 === '"' || char3 === "`") {
|
|
23567
|
+
const end = scanQuoteEnd(sql4, i2, char3);
|
|
23568
|
+
output += sql4.slice(i2, end);
|
|
23569
|
+
i2 = end;
|
|
23570
|
+
} else if (char3 === "[") {
|
|
23571
|
+
const end = scanBracketEnd(sql4, i2);
|
|
23572
|
+
output += sql4.slice(i2, end);
|
|
23573
|
+
i2 = end;
|
|
23574
|
+
} else {
|
|
23575
|
+
output += char3;
|
|
23576
|
+
i2++;
|
|
23577
|
+
}
|
|
23578
|
+
}
|
|
23579
|
+
return output;
|
|
23580
|
+
}
|
|
23581
|
+
function scanLineCommentEnd(sql4, start2) {
|
|
23582
|
+
let i2 = start2 + 2;
|
|
23583
|
+
while (i2 < sql4.length && sql4[i2] !== `
|
|
23584
|
+
`) {
|
|
23585
|
+
i2++;
|
|
23586
|
+
}
|
|
23587
|
+
return i2;
|
|
23588
|
+
}
|
|
23589
|
+
function scanBlockCommentEnd(sql4, start2) {
|
|
23590
|
+
let i2 = start2 + 2;
|
|
23591
|
+
while (i2 < sql4.length && !(sql4[i2] === "*" && sql4[i2 + 1] === "/")) {
|
|
23592
|
+
i2++;
|
|
23593
|
+
}
|
|
23594
|
+
return Math.min(i2 + 2, sql4.length);
|
|
23595
|
+
}
|
|
23596
|
+
function scanQuoteEnd(sql4, start2, quote) {
|
|
23597
|
+
let i2 = start2 + 1;
|
|
23598
|
+
while (i2 < sql4.length) {
|
|
23599
|
+
if (sql4[i2] !== quote) {
|
|
23600
|
+
i2++;
|
|
23601
|
+
} else if (sql4[i2 + 1] === quote) {
|
|
23602
|
+
i2 += 2;
|
|
23603
|
+
} else {
|
|
23604
|
+
return i2 + 1;
|
|
23605
|
+
}
|
|
23606
|
+
}
|
|
23607
|
+
return i2;
|
|
23608
|
+
}
|
|
23609
|
+
function scanBracketEnd(sql4, start2) {
|
|
23610
|
+
let i2 = start2 + 1;
|
|
23611
|
+
while (i2 < sql4.length) {
|
|
23612
|
+
if (sql4[i2] === "]") {
|
|
23613
|
+
return i2 + 1;
|
|
23614
|
+
}
|
|
23615
|
+
i2++;
|
|
23616
|
+
}
|
|
23617
|
+
return i2;
|
|
23618
|
+
}
|
|
23619
|
+
function isAlreadyExistsSqlError(message) {
|
|
23620
|
+
return /already exists|duplicate column/i.test(message);
|
|
23621
|
+
}
|
|
23622
|
+
function readIdentifier(groups) {
|
|
23623
|
+
return groups.find((group) => group !== undefined) ?? "";
|
|
23624
|
+
}
|
|
23625
|
+
function extractCreatedObjects(statements) {
|
|
23626
|
+
const tables = [];
|
|
23627
|
+
const columns2 = [];
|
|
23628
|
+
for (const statement of statements) {
|
|
23629
|
+
const scannable = blankStringLiterals(normalizeSqlForChecksum(statement));
|
|
23630
|
+
for (const match of scannable.matchAll(CREATE_TABLE_RE)) {
|
|
23631
|
+
const name2 = readIdentifier(match.slice(1, 5));
|
|
23632
|
+
if (name2 && !name2.startsWith("__new_")) {
|
|
23633
|
+
tables.push(name2);
|
|
23634
|
+
}
|
|
23635
|
+
}
|
|
23636
|
+
for (const match of scannable.matchAll(ADD_COLUMN_RE)) {
|
|
23637
|
+
const table8 = readIdentifier(match.slice(1, 5));
|
|
23638
|
+
const column2 = readIdentifier(match.slice(5, 9));
|
|
23639
|
+
if (table8 && column2 && !table8.startsWith("__new_")) {
|
|
23640
|
+
columns2.push({ table: table8, column: column2 });
|
|
23641
|
+
}
|
|
23642
|
+
}
|
|
23643
|
+
}
|
|
23644
|
+
return { tables, columns: columns2 };
|
|
23645
|
+
}
|
|
23646
|
+
var DESTRUCTIVE_SQL_PATTERNS, IDENTIFIER_SOURCE, CREATE_TABLE_RE, ADD_COLUMN_RE;
|
|
23647
|
+
var init_sql3 = __esm(() => {
|
|
23648
|
+
init_schema3();
|
|
23649
|
+
DESTRUCTIVE_SQL_PATTERNS = [
|
|
23650
|
+
/\bDROP\s+TABLE\b/i,
|
|
23651
|
+
/\bALTER\s+TABLE\b[\s\S]*\bDROP\b/i,
|
|
23652
|
+
/\bCREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?["'`[]?__new_/i
|
|
23653
|
+
];
|
|
23654
|
+
IDENTIFIER_SOURCE = String.raw`(?:"([^"]+)"|\`([^\`]+)\`|\[([^\]]+)\]|([A-Za-z_][\w$]*))`;
|
|
23655
|
+
CREATE_TABLE_RE = new RegExp(String.raw`\bCREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?${IDENTIFIER_SOURCE}`, "gi");
|
|
23656
|
+
ADD_COLUMN_RE = new RegExp(String.raw`\bALTER\s+TABLE\s+${IDENTIFIER_SOURCE}\s+ADD\s+(?:COLUMN\s+)?${IDENTIFIER_SOURCE}`, "gi");
|
|
23657
|
+
});
|
|
23658
|
+
|
|
23000
23659
|
// ../../node_modules/.bun/@fastify+busboy@3.2.0/node_modules/@fastify/busboy/deps/streamsearch/sbmh.js
|
|
23001
23660
|
var require_sbmh = __commonJS((exports, module2) => {
|
|
23002
23661
|
var { EventEmitter } = __require("node:events");
|
|
@@ -24926,6 +25585,8 @@ var init_multipart = __esm(() => {
|
|
|
24926
25585
|
var init_utils5 = __esm(() => {
|
|
24927
25586
|
init_hostname();
|
|
24928
25587
|
init_assets();
|
|
25588
|
+
init_schema3();
|
|
25589
|
+
init_sql3();
|
|
24929
25590
|
init_multipart();
|
|
24930
25591
|
});
|
|
24931
25592
|
|
|
@@ -25080,6 +25741,14 @@ var init_core = __esm(() => {
|
|
|
25080
25741
|
init_client();
|
|
25081
25742
|
});
|
|
25082
25743
|
|
|
25744
|
+
// ../cloudflare/src/index.ts
|
|
25745
|
+
var init_src4 = __esm(() => {
|
|
25746
|
+
init_core();
|
|
25747
|
+
init_namespaces();
|
|
25748
|
+
init_utils5();
|
|
25749
|
+
init_utils5();
|
|
25750
|
+
});
|
|
25751
|
+
|
|
25083
25752
|
// ../cloudflare/src/playcademy/constants.ts
|
|
25084
25753
|
var CUSTOM_DOMAINS_KV_NAME = "cademy-custom-domains", QUEUE_NAME_PREFIX = "playcademy", GAME_WORKER_DOMAIN_PRODUCTION, GAME_WORKER_DOMAIN_STAGING;
|
|
25085
25754
|
var init_constants2 = __esm(() => {
|
|
@@ -27594,46 +28263,324 @@ var init_tunnel = __esm(() => {
|
|
|
27594
28263
|
matchedPorts = new Map;
|
|
27595
28264
|
});
|
|
27596
28265
|
|
|
27597
|
-
// ../
|
|
27598
|
-
function
|
|
27599
|
-
|
|
28266
|
+
// ../api-core/src/utils/baseline-validation.util.ts
|
|
28267
|
+
function assertBaselineClaimValid(args2) {
|
|
28268
|
+
const validation = validateBaselineClaim(args2);
|
|
28269
|
+
const blocked = validation.contradictions.length > 0 || validation.unverified.length > 0 && !args2.allowUnverified;
|
|
28270
|
+
if (blocked) {
|
|
28271
|
+
addEvent("deployment_state.baseline_claim_rejected", {
|
|
28272
|
+
"app.game.id": args2.gameId,
|
|
28273
|
+
"app.deployment_state.baseline_claim_source": args2.source,
|
|
28274
|
+
"app.deployment_state.baseline_contradictions": validation.contradictions.length,
|
|
28275
|
+
"app.deployment_state.baseline_unverified": validation.unverified.length,
|
|
28276
|
+
"app.deployment_state.baseline_suggested_tag": validation.suggestedTag ?? "none"
|
|
28277
|
+
});
|
|
28278
|
+
throw new BaselineClaimRejectedError({
|
|
28279
|
+
contradictions: validation.contradictions,
|
|
28280
|
+
unverified: validation.unverified,
|
|
28281
|
+
suggestedTag: validation.suggestedTag,
|
|
28282
|
+
claimedTag: args2.claimedTag
|
|
28283
|
+
});
|
|
28284
|
+
}
|
|
28285
|
+
if (validation.unverified.length > 0) {
|
|
28286
|
+
addEvent("deployment_state.baseline_unverified_overridden", {
|
|
28287
|
+
"app.game.id": args2.gameId,
|
|
28288
|
+
"app.user.id": args2.userId,
|
|
28289
|
+
"app.deployment_state.baseline_overridden_tags": validation.unverified.map((entry) => entry.tag).join(",")
|
|
28290
|
+
});
|
|
28291
|
+
}
|
|
28292
|
+
}
|
|
28293
|
+
function validateBaselineClaim(args2) {
|
|
28294
|
+
const { claimedTag, evidence, tables, indexes: indexes2, views, lastDeployAt } = args2;
|
|
28295
|
+
const claimedIndex = evidence.findIndex((entry) => entry.tag === claimedTag);
|
|
28296
|
+
const verdicts = [];
|
|
28297
|
+
const unverified = [];
|
|
28298
|
+
evidence.forEach((entry, index2) => {
|
|
28299
|
+
if (claimedIndex === -1 || index2 > claimedIndex) {
|
|
28300
|
+
verdicts.push(judgeBeyond(entry, tables, indexes2, views));
|
|
28301
|
+
return;
|
|
28302
|
+
}
|
|
28303
|
+
const judged = judgeClaimed(entry, tables, lastDeployAt);
|
|
28304
|
+
verdicts.push(judged.verdict);
|
|
28305
|
+
if (judged.unverifiable) {
|
|
28306
|
+
unverified.push(judged.verdict);
|
|
28307
|
+
}
|
|
28308
|
+
});
|
|
28309
|
+
return {
|
|
28310
|
+
verdicts,
|
|
28311
|
+
contradictions: verdicts.filter((verdict) => verdict.verdict === "contradicted"),
|
|
28312
|
+
unverified,
|
|
28313
|
+
suggestedTag: suggestTag(evidence, tables)
|
|
28314
|
+
};
|
|
27600
28315
|
}
|
|
27601
|
-
|
|
27602
|
-
|
|
27603
|
-
|
|
28316
|
+
function judgeClaimed(entry, tables, lastDeployAt) {
|
|
28317
|
+
if (!hasSignal(entry)) {
|
|
28318
|
+
const generated = new Date(entry.generatedAt);
|
|
28319
|
+
if (lastDeployAt && generated > lastDeployAt) {
|
|
28320
|
+
return {
|
|
28321
|
+
verdict: {
|
|
28322
|
+
tag: entry.tag,
|
|
28323
|
+
verdict: "no-signal",
|
|
28324
|
+
detail: `no schema footprint to verify, and it was generated after the last deploy (${lastDeployAt.toISOString()})`
|
|
28325
|
+
},
|
|
28326
|
+
unverifiable: true
|
|
28327
|
+
};
|
|
28328
|
+
}
|
|
28329
|
+
return { verdict: { tag: entry.tag, verdict: "no-signal" }, unverifiable: false };
|
|
28330
|
+
}
|
|
28331
|
+
for (const table8 of entry.createsTables) {
|
|
28332
|
+
const columns2 = tables.get(table8.name);
|
|
28333
|
+
if (!columns2) {
|
|
28334
|
+
return {
|
|
28335
|
+
verdict: {
|
|
28336
|
+
tag: entry.tag,
|
|
28337
|
+
verdict: "contradicted",
|
|
28338
|
+
detail: `creates table \`${table8.name}\`, which is not in the live database`
|
|
28339
|
+
},
|
|
28340
|
+
unverifiable: false
|
|
28341
|
+
};
|
|
28342
|
+
}
|
|
28343
|
+
const missing = table8.columns.filter((column2) => !columns2.includes(column2));
|
|
28344
|
+
if (missing.length > 0) {
|
|
28345
|
+
return {
|
|
28346
|
+
verdict: {
|
|
28347
|
+
tag: entry.tag,
|
|
28348
|
+
verdict: "contradicted",
|
|
28349
|
+
detail: `table \`${table8.name}\` exists but is missing column(s) ${missing.map((column2) => `\`${column2}\``).join(", ")} this migration defines`
|
|
28350
|
+
},
|
|
28351
|
+
unverifiable: false
|
|
28352
|
+
};
|
|
28353
|
+
}
|
|
28354
|
+
}
|
|
28355
|
+
for (const added of entry.addsColumns) {
|
|
28356
|
+
const columns2 = tables.get(added.table);
|
|
28357
|
+
if (columns2 && !columns2.includes(added.column)) {
|
|
28358
|
+
return {
|
|
28359
|
+
verdict: {
|
|
28360
|
+
tag: entry.tag,
|
|
28361
|
+
verdict: "contradicted",
|
|
28362
|
+
detail: `adds column \`${added.column}\` to \`${added.table}\`, which the live table does not have`
|
|
28363
|
+
},
|
|
28364
|
+
unverifiable: false
|
|
28365
|
+
};
|
|
28366
|
+
}
|
|
28367
|
+
}
|
|
28368
|
+
return { verdict: { tag: entry.tag, verdict: "verified" }, unverifiable: false };
|
|
28369
|
+
}
|
|
28370
|
+
function judgeBeyond(entry, tables, indexes2, views) {
|
|
28371
|
+
for (const table8 of entry.createsTables) {
|
|
28372
|
+
if (tables.has(table8.name)) {
|
|
28373
|
+
return {
|
|
28374
|
+
tag: entry.tag,
|
|
28375
|
+
verdict: "contradicted",
|
|
28376
|
+
detail: `is beyond the claim, but the table it creates (\`${table8.name}\`) already exists in the live database — the claim looks too old`
|
|
28377
|
+
};
|
|
28378
|
+
}
|
|
28379
|
+
}
|
|
28380
|
+
for (const added of entry.addsColumns) {
|
|
28381
|
+
const columns2 = tables.get(added.table);
|
|
28382
|
+
if (columns2?.includes(added.column)) {
|
|
28383
|
+
return {
|
|
28384
|
+
tag: entry.tag,
|
|
28385
|
+
verdict: "contradicted",
|
|
28386
|
+
detail: `is beyond the claim, but the column it adds (\`${added.table}.${added.column}\`) already exists — the claim looks too old`
|
|
28387
|
+
};
|
|
28388
|
+
}
|
|
28389
|
+
}
|
|
28390
|
+
for (const index2 of entry.createsIndexes) {
|
|
28391
|
+
if (indexes2.has(index2)) {
|
|
28392
|
+
return {
|
|
28393
|
+
tag: entry.tag,
|
|
28394
|
+
verdict: "contradicted",
|
|
28395
|
+
detail: `is beyond the claim, but the index it creates (\`${index2}\`) already exists — the claim looks too old`
|
|
28396
|
+
};
|
|
28397
|
+
}
|
|
28398
|
+
}
|
|
28399
|
+
for (const view2 of entry.createsViews) {
|
|
28400
|
+
if (views.has(view2)) {
|
|
28401
|
+
return {
|
|
28402
|
+
tag: entry.tag,
|
|
28403
|
+
verdict: "contradicted",
|
|
28404
|
+
detail: `is beyond the claim, but the view it creates (\`${view2}\`) already exists — the claim looks too old`
|
|
28405
|
+
};
|
|
28406
|
+
}
|
|
28407
|
+
}
|
|
28408
|
+
return { tag: entry.tag, verdict: "verified" };
|
|
28409
|
+
}
|
|
28410
|
+
function suggestTag(evidence, tables) {
|
|
28411
|
+
let presentPrefix = 0;
|
|
28412
|
+
while (presentPrefix < evidence.length && evidence[presentPrefix].createsTables.every((table8) => tables.has(table8.name))) {
|
|
28413
|
+
presentPrefix++;
|
|
28414
|
+
}
|
|
28415
|
+
let absentFrom = evidence.length;
|
|
28416
|
+
while (absentFrom > 0 && evidence[absentFrom - 1].createsTables.every((table8) => !tables.has(table8.name))) {
|
|
28417
|
+
absentFrom--;
|
|
28418
|
+
}
|
|
28419
|
+
const candidate = presentPrefix - 1;
|
|
28420
|
+
return candidate >= 0 && candidate >= absentFrom - 1 ? evidence[candidate].tag : null;
|
|
28421
|
+
}
|
|
28422
|
+
function hasSignal(entry) {
|
|
28423
|
+
return entry.createsTables.length > 0 || entry.addsColumns.length > 0 || entry.createsIndexes.length > 0 || entry.createsViews.length > 0;
|
|
28424
|
+
}
|
|
28425
|
+
var init_baseline_validation_util = __esm(() => {
|
|
28426
|
+
init_spans();
|
|
28427
|
+
init_errors();
|
|
27604
28428
|
});
|
|
27605
28429
|
|
|
27606
|
-
// ../api-core/src/utils/
|
|
27607
|
-
function
|
|
27608
|
-
|
|
27609
|
-
|
|
28430
|
+
// ../api-core/src/utils/baseline.util.ts
|
|
28431
|
+
function sliceJournalToTag(journal, lastAppliedMigrationTag) {
|
|
28432
|
+
const index2 = journal.findIndex((entry) => entry.tag === lastAppliedMigrationTag);
|
|
28433
|
+
return index2 === -1 ? null : journal.slice(0, index2 + 1);
|
|
28434
|
+
}
|
|
28435
|
+
function evaluateBaselineGuardrails(input) {
|
|
28436
|
+
if (input.ledgerTags.length > 0) {
|
|
28437
|
+
return "ledger-not-empty";
|
|
27610
28438
|
}
|
|
27611
|
-
if (
|
|
27612
|
-
return
|
|
28439
|
+
if (input.liveTables.length === 0) {
|
|
28440
|
+
return "database-empty";
|
|
27613
28441
|
}
|
|
27614
|
-
return
|
|
28442
|
+
return "ok";
|
|
27615
28443
|
}
|
|
27616
|
-
|
|
27617
|
-
|
|
28444
|
+
|
|
28445
|
+
// ../api-core/src/utils/migration.util.ts
|
|
28446
|
+
function planMigrations(journal, ledger) {
|
|
28447
|
+
const ledgerByTag = new Map(ledger.map((row) => [row.tag, row]));
|
|
28448
|
+
const journalTags = new Set(journal.map((entry) => entry.tag));
|
|
28449
|
+
const pendingTags = [];
|
|
28450
|
+
const checksumMismatches = [];
|
|
28451
|
+
for (const entry of journal) {
|
|
28452
|
+
const applied = ledgerByTag.get(entry.tag);
|
|
28453
|
+
if (!applied) {
|
|
28454
|
+
pendingTags.push(entry.tag);
|
|
28455
|
+
} else {
|
|
28456
|
+
const comparable = applied.checksumAlgo === MIGRATION_CHECKSUM_ALGO;
|
|
28457
|
+
if (comparable && applied.checksum !== entry.checksum) {
|
|
28458
|
+
checksumMismatches.push({
|
|
28459
|
+
tag: entry.tag,
|
|
28460
|
+
ledgerChecksum: applied.checksum,
|
|
28461
|
+
journalChecksum: entry.checksum
|
|
28462
|
+
});
|
|
28463
|
+
}
|
|
28464
|
+
}
|
|
28465
|
+
}
|
|
28466
|
+
const outOfOrderTags = findOutOfOrderTags(journal.map((entry) => entry.tag), new Set(ledgerByTag.keys()));
|
|
28467
|
+
const missingFromJournalTags = ledger.filter((row) => !journalTags.has(row.tag)).map((row) => row.tag);
|
|
28468
|
+
return { pendingTags, checksumMismatches, outOfOrderTags, missingFromJournalTags };
|
|
27618
28469
|
}
|
|
27619
|
-
function
|
|
27620
|
-
|
|
28470
|
+
function assessMigrationAlreadyApplied(statements, liveTables) {
|
|
28471
|
+
const created = extractCreatedObjects(statements);
|
|
28472
|
+
const present = [];
|
|
28473
|
+
const missing = [];
|
|
28474
|
+
for (const table8 of created.tables) {
|
|
28475
|
+
(liveTables.has(table8) ? present : missing).push(`table ${table8}`);
|
|
28476
|
+
}
|
|
28477
|
+
for (const added of created.columns) {
|
|
28478
|
+
const live = Boolean(liveTables.get(added.table)?.includes(added.column));
|
|
28479
|
+
(live ? present : missing).push(`column ${added.table}.${added.column}`);
|
|
28480
|
+
}
|
|
28481
|
+
if (present.length === 0) {
|
|
28482
|
+
return { verdict: "no-signal", present, missing };
|
|
28483
|
+
}
|
|
28484
|
+
return {
|
|
28485
|
+
verdict: missing.length === 0 ? "all-present" : "partial",
|
|
28486
|
+
present,
|
|
28487
|
+
missing
|
|
28488
|
+
};
|
|
27621
28489
|
}
|
|
27622
|
-
function
|
|
27623
|
-
|
|
28490
|
+
function parseMigrationFailure(events) {
|
|
28491
|
+
if (!events) {
|
|
28492
|
+
return null;
|
|
28493
|
+
}
|
|
28494
|
+
for (let i2 = events.length - 1;i2 >= 0; i2--) {
|
|
28495
|
+
const event = events[i2];
|
|
28496
|
+
const failure = event ? parseFailureEvent(event) : null;
|
|
28497
|
+
if (failure) {
|
|
28498
|
+
return failure;
|
|
28499
|
+
}
|
|
28500
|
+
}
|
|
28501
|
+
return null;
|
|
27624
28502
|
}
|
|
27625
|
-
function
|
|
27626
|
-
|
|
28503
|
+
function parseFailureEvent(event) {
|
|
28504
|
+
const details = event.details;
|
|
28505
|
+
if (!details) {
|
|
28506
|
+
return null;
|
|
28507
|
+
}
|
|
28508
|
+
const { code, tag, statementIndex, error, d1Message } = details;
|
|
28509
|
+
if (code !== DEPLOY_ERROR_CODES.migrationFailed || typeof tag !== "string") {
|
|
28510
|
+
return null;
|
|
28511
|
+
}
|
|
28512
|
+
return {
|
|
28513
|
+
tag,
|
|
28514
|
+
error: failureMessage(error, d1Message),
|
|
28515
|
+
statementIndex: typeof statementIndex === "number" ? statementIndex : null,
|
|
28516
|
+
at: event.createdAt
|
|
28517
|
+
};
|
|
27627
28518
|
}
|
|
27628
|
-
function
|
|
27629
|
-
|
|
28519
|
+
function failureMessage(error, d1Message) {
|
|
28520
|
+
if (typeof error === "string") {
|
|
28521
|
+
return error;
|
|
28522
|
+
}
|
|
28523
|
+
if (typeof d1Message === "string") {
|
|
28524
|
+
return d1Message;
|
|
28525
|
+
}
|
|
28526
|
+
return "Migration failed";
|
|
27630
28527
|
}
|
|
27631
|
-
var
|
|
27632
|
-
|
|
27633
|
-
|
|
27634
|
-
init_stages();
|
|
28528
|
+
var init_migration_util = __esm(() => {
|
|
28529
|
+
init_src4();
|
|
28530
|
+
init_errors();
|
|
27635
28531
|
});
|
|
27636
28532
|
|
|
28533
|
+
// ../api-core/src/utils/secrets-manifest.util.ts
|
|
28534
|
+
async function deriveSecretsManifestPepper(platformSecret) {
|
|
28535
|
+
const encoder = new TextEncoder;
|
|
28536
|
+
const keyMaterial = await crypto.subtle.importKey("raw", encoder.encode(platformSecret), "HKDF", false, ["deriveBits"]);
|
|
28537
|
+
const bits = await crypto.subtle.deriveBits({
|
|
28538
|
+
name: "HKDF",
|
|
28539
|
+
hash: "SHA-256",
|
|
28540
|
+
salt: new Uint8Array(32),
|
|
28541
|
+
info: encoder.encode(SECRETS_MANIFEST_HKDF_INFO)
|
|
28542
|
+
}, keyMaterial, 256);
|
|
28543
|
+
return new Uint8Array(bits);
|
|
28544
|
+
}
|
|
28545
|
+
async function computeSecretDigest(pepper, input) {
|
|
28546
|
+
const key = await crypto.subtle.importKey("raw", new Uint8Array(pepper), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
|
|
28547
|
+
const message = JSON.stringify([input.gameId, input.key, input.value]);
|
|
28548
|
+
const signature = await crypto.subtle.sign("HMAC", key, new TextEncoder().encode(message));
|
|
28549
|
+
return [...new Uint8Array(signature)].map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
28550
|
+
}
|
|
28551
|
+
function computeSecretsDiff(input) {
|
|
28552
|
+
const { localDigests, manifest, remoteKeys } = input;
|
|
28553
|
+
const added = [];
|
|
28554
|
+
const changed = [];
|
|
28555
|
+
const unchanged = [];
|
|
28556
|
+
for (const [key, digest] of Object.entries(localDigests)) {
|
|
28557
|
+
const recorded = manifest[key];
|
|
28558
|
+
if (recorded === undefined) {
|
|
28559
|
+
added.push(key);
|
|
28560
|
+
} else if (recorded === digest) {
|
|
28561
|
+
unchanged.push(key);
|
|
28562
|
+
} else {
|
|
28563
|
+
changed.push(key);
|
|
28564
|
+
}
|
|
28565
|
+
}
|
|
28566
|
+
const localKeys = new Set(Object.keys(localDigests));
|
|
28567
|
+
const managedKeys = new Set(Object.keys(manifest));
|
|
28568
|
+
const remoteOnlyManaged = [...managedKeys].filter((key) => !localKeys.has(key));
|
|
28569
|
+
const remoteOnlyUnmanaged = remoteKeys.filter((key) => !managedKeys.has(key) && !localKeys.has(key));
|
|
28570
|
+
return {
|
|
28571
|
+
added: added.toSorted(),
|
|
28572
|
+
changed: changed.toSorted(),
|
|
28573
|
+
unchanged: unchanged.toSorted(),
|
|
28574
|
+
remoteOnlyManaged: remoteOnlyManaged.toSorted(),
|
|
28575
|
+
remoteOnlyUnmanaged: remoteOnlyUnmanaged.toSorted()
|
|
28576
|
+
};
|
|
28577
|
+
}
|
|
28578
|
+
function findUnmanagedPruneKeys(pruneSecrets, manifest) {
|
|
28579
|
+
const managed = new Set(Object.keys(manifest ?? {}));
|
|
28580
|
+
return pruneSecrets.filter((key) => !managed.has(key));
|
|
28581
|
+
}
|
|
28582
|
+
var SECRETS_MANIFEST_HKDF_INFO = "playcademy:secrets-manifest:v1";
|
|
28583
|
+
|
|
27637
28584
|
// ../api-core/src/utils/worker-keys.util.ts
|
|
27638
28585
|
async function sweepDashboardWorkerKeys(deleteApiKeysByName, slug) {
|
|
27639
28586
|
try {
|
|
@@ -27651,6 +28598,9 @@ var init_worker_keys_util = __esm(() => {
|
|
|
27651
28598
|
});
|
|
27652
28599
|
|
|
27653
28600
|
// ../api-core/src/services/deploy.service.ts
|
|
28601
|
+
function hasBinding(binding) {
|
|
28602
|
+
return binding === true || Array.isArray(binding) && binding.length > 0;
|
|
28603
|
+
}
|
|
27654
28604
|
function readDashboardTheme(config2) {
|
|
27655
28605
|
const theme = config2?.dashboard?.theme;
|
|
27656
28606
|
return {
|
|
@@ -27718,7 +28668,7 @@ class DeployService {
|
|
|
27718
28668
|
data: { message: hasBackend ? "Deploying backend code" : "Deploying to platform" }
|
|
27719
28669
|
};
|
|
27720
28670
|
const keepAssets = hasBackend && !hasFrontend;
|
|
27721
|
-
const deploymentOptions = this.mapGameBindingsToOptions(deploymentId, request.bindings
|
|
28671
|
+
const deploymentOptions = this.mapGameBindingsToOptions(deploymentId, request.bindings);
|
|
27722
28672
|
const bindings = deploymentOptions?.bindings;
|
|
27723
28673
|
setAttributes({
|
|
27724
28674
|
"app.deploy.has_d1": Boolean(bindings?.d1?.length),
|
|
@@ -27727,13 +28677,49 @@ class DeployService {
|
|
|
27727
28677
|
"app.deploy.queue_count": bindings?.queues?.length ?? 0,
|
|
27728
28678
|
"app.deploy.dead_letter_queue_count": DeployService.countDeadLetterQueues(bindings)
|
|
27729
28679
|
});
|
|
27730
|
-
const activeDeployment = await
|
|
27731
|
-
|
|
27732
|
-
|
|
27733
|
-
|
|
27734
|
-
|
|
28680
|
+
const [activeDeployment, deploymentState] = await Promise.all([
|
|
28681
|
+
db2.query.gameDeployments.findFirst({
|
|
28682
|
+
where: activeDeploymentWhere(game2.id, "game"),
|
|
28683
|
+
columns: { resources: true }
|
|
28684
|
+
}),
|
|
28685
|
+
db2.query.gameDeploymentState.findFirst({
|
|
28686
|
+
where: eq(gameDeploymentState.gameId, game2.id)
|
|
28687
|
+
})
|
|
28688
|
+
]);
|
|
28689
|
+
if (request.pruneSecrets?.length) {
|
|
28690
|
+
const unmanaged = findUnmanagedPruneKeys(request.pruneSecrets, deploymentState?.secretsManifest);
|
|
28691
|
+
if (unmanaged.length > 0) {
|
|
28692
|
+
throw new SecretsPruneUnmanagedError(unmanaged);
|
|
28693
|
+
}
|
|
28694
|
+
}
|
|
28695
|
+
let state = deploymentState;
|
|
28696
|
+
if (request.baseline) {
|
|
28697
|
+
if (isSchemaAdopted(state)) {
|
|
28698
|
+
addEvent("deploy.baseline_skipped", {
|
|
28699
|
+
"app.deploy.baseline_source": state?.baselineSource ?? "unknown"
|
|
28700
|
+
});
|
|
28701
|
+
} else {
|
|
28702
|
+
state = yield* this.adoptClientBaseline({
|
|
28703
|
+
game: game2,
|
|
28704
|
+
request,
|
|
28705
|
+
user,
|
|
28706
|
+
deploymentId,
|
|
28707
|
+
baseline: request.baseline,
|
|
28708
|
+
existingResources: activeDeployment?.resources ?? undefined
|
|
28709
|
+
});
|
|
28710
|
+
}
|
|
28711
|
+
}
|
|
28712
|
+
if (deploymentOptions?.bindings?.d1?.length && !isSchemaAdopted(state)) {
|
|
27735
28713
|
await this.cleanupOrphanD1Databases(cf, deploymentOptions.bindings.d1, slug, game2.id);
|
|
27736
28714
|
}
|
|
28715
|
+
const databaseOutcome = yield* this.executeDatabaseStep({
|
|
28716
|
+
game: game2,
|
|
28717
|
+
request,
|
|
28718
|
+
user,
|
|
28719
|
+
deploymentId,
|
|
28720
|
+
state,
|
|
28721
|
+
existingResources: activeDeployment?.resources ?? undefined
|
|
28722
|
+
});
|
|
27737
28723
|
const result = await this.deployToCloudflare({
|
|
27738
28724
|
deploymentId,
|
|
27739
28725
|
code: request.code,
|
|
@@ -27741,6 +28727,7 @@ class DeployService {
|
|
|
27741
28727
|
tempDir,
|
|
27742
28728
|
options: {
|
|
27743
28729
|
...deploymentOptions,
|
|
28730
|
+
...databaseOutcome.legacySchema && { schema: databaseOutcome.legacySchema },
|
|
27744
28731
|
compatibilityDate: request.compatibilityDate ?? CLOUDFLARE_COMPATIBILITY_DATE,
|
|
27745
28732
|
compatibilityFlags: request.compatibilityFlags,
|
|
27746
28733
|
existingResources: activeDeployment?.resources ?? undefined,
|
|
@@ -27756,8 +28743,12 @@ class DeployService {
|
|
|
27756
28743
|
result,
|
|
27757
28744
|
request,
|
|
27758
28745
|
user,
|
|
27759
|
-
flags: flags2
|
|
28746
|
+
flags: flags2,
|
|
28747
|
+
database: databaseOutcome
|
|
27760
28748
|
});
|
|
28749
|
+
if (request.pruneSecrets?.length) {
|
|
28750
|
+
yield* this.pruneManagedSecretsStep(game2.id, result.deploymentId, request.pruneSecrets);
|
|
28751
|
+
}
|
|
27761
28752
|
yield { type: "complete", data: updatedGame };
|
|
27762
28753
|
}
|
|
27763
28754
|
async* deployDashboard(context2) {
|
|
@@ -27884,7 +28875,10 @@ class DeployService {
|
|
|
27884
28875
|
"app.deploy.code_size": request.code?.length ?? 0,
|
|
27885
28876
|
"app.deploy.compatibility_date": request.compatibilityDate ?? CLOUDFLARE_COMPATIBILITY_DATE,
|
|
27886
28877
|
"app.deploy.compatibility_flag_count": request.compatibilityFlags?.length ?? 0,
|
|
27887
|
-
"app.deploy.has_schema": Boolean(request.schema)
|
|
28878
|
+
"app.deploy.has_schema": Boolean(request.schema),
|
|
28879
|
+
"app.deploy.has_database_payload": Boolean(request.database),
|
|
28880
|
+
"app.deploy.has_baseline": Boolean(request.baseline),
|
|
28881
|
+
"app.deploy.prune_secret_count": request.pruneSecrets?.length ?? 0
|
|
27888
28882
|
});
|
|
27889
28883
|
if (!hasBackend && !hasFrontend && !hasMetadata) {
|
|
27890
28884
|
throw new ValidationError("Must provide at least one of: uploadToken (frontend), code (backend), or metadata");
|
|
@@ -27921,18 +28915,18 @@ class DeployService {
|
|
|
27921
28915
|
}
|
|
27922
28916
|
return "metadata_only";
|
|
27923
28917
|
}
|
|
27924
|
-
mapGameBindingsToOptions(deploymentId, bindings
|
|
27925
|
-
if (!bindings
|
|
28918
|
+
mapGameBindingsToOptions(deploymentId, bindings) {
|
|
28919
|
+
if (!bindings) {
|
|
27926
28920
|
return;
|
|
27927
28921
|
}
|
|
27928
28922
|
const workerBindings = {};
|
|
27929
|
-
if (bindings
|
|
28923
|
+
if (hasBinding(bindings.database)) {
|
|
27930
28924
|
workerBindings.d1 = [deploymentId];
|
|
27931
28925
|
}
|
|
27932
|
-
if (bindings
|
|
28926
|
+
if (hasBinding(bindings.keyValue)) {
|
|
27933
28927
|
workerBindings.kv = [deploymentId];
|
|
27934
28928
|
}
|
|
27935
|
-
if (bindings
|
|
28929
|
+
if (hasBinding(bindings.bucket)) {
|
|
27936
28930
|
workerBindings.r2 = [deploymentId];
|
|
27937
28931
|
}
|
|
27938
28932
|
if (bindings?.queues) {
|
|
@@ -27961,10 +28955,7 @@ class DeployService {
|
|
|
27961
28955
|
});
|
|
27962
28956
|
}
|
|
27963
28957
|
const hasBindings = workerBindings.d1?.length || workerBindings.kv?.length || workerBindings.r2?.length || workerBindings.queues?.length;
|
|
27964
|
-
return {
|
|
27965
|
-
...hasBindings && { bindings: workerBindings },
|
|
27966
|
-
...schema2 && { schema: schema2 }
|
|
27967
|
-
};
|
|
28958
|
+
return hasBindings ? { bindings: workerBindings } : undefined;
|
|
27968
28959
|
}
|
|
27969
28960
|
static countDeadLetterQueues(bindings) {
|
|
27970
28961
|
return bindings?.queues?.filter((queue) => Boolean(queue.deadLetterQueue)).length ?? 0;
|
|
@@ -27988,6 +28979,473 @@ class DeployService {
|
|
|
27988
28979
|
}
|
|
27989
28980
|
}
|
|
27990
28981
|
}
|
|
28982
|
+
async* executeDatabaseStep(context2) {
|
|
28983
|
+
const { game: game2, request, user, deploymentId, state } = context2;
|
|
28984
|
+
if (request.schema) {
|
|
28985
|
+
if (isSchemaAdopted(state)) {
|
|
28986
|
+
throw new LegacySchemaUpgradeRequiredError;
|
|
28987
|
+
}
|
|
28988
|
+
const legacyDbId = context2.existingResources?.d1?.find((db2) => db2.name === deploymentId)?.id;
|
|
28989
|
+
if (legacyDbId) {
|
|
28990
|
+
const ledger = await this.getCloudflare().d1.readMigrationLedger(legacyDbId);
|
|
28991
|
+
if (ledger.length > 0) {
|
|
28992
|
+
throw new LegacySchemaUpgradeRequiredError;
|
|
28993
|
+
}
|
|
28994
|
+
}
|
|
28995
|
+
setAttribute("app.deploy.db_mode", "legacy");
|
|
28996
|
+
return { ...NO_DATABASE_WORK, legacySchema: request.schema };
|
|
28997
|
+
}
|
|
28998
|
+
const database = request.database;
|
|
28999
|
+
if (!database) {
|
|
29000
|
+
return NO_DATABASE_WORK;
|
|
29001
|
+
}
|
|
29002
|
+
if (!hasBinding(request.bindings?.database)) {
|
|
29003
|
+
throw new ValidationError("The database payload requires a database binding");
|
|
29004
|
+
}
|
|
29005
|
+
if (!request.deployId) {
|
|
29006
|
+
throw new ValidationError("deployId is required when a database payload is present");
|
|
29007
|
+
}
|
|
29008
|
+
setAttribute("app.deploy.db_mode", database.mode);
|
|
29009
|
+
const cf = this.getCloudflare();
|
|
29010
|
+
const persistedId = context2.existingResources?.d1?.find((db2) => db2.name === deploymentId)?.id;
|
|
29011
|
+
const databaseId = persistedId ?? await cf.d1.create(deploymentId);
|
|
29012
|
+
if (database.mode === "migrate") {
|
|
29013
|
+
return yield* this.runMigrateMode({
|
|
29014
|
+
game: game2,
|
|
29015
|
+
user,
|
|
29016
|
+
deployId: request.deployId,
|
|
29017
|
+
databaseId,
|
|
29018
|
+
migrations: database.migrations,
|
|
29019
|
+
state
|
|
29020
|
+
});
|
|
29021
|
+
}
|
|
29022
|
+
return yield* this.runPushMode({ game: game2, databaseId, payload: database, state });
|
|
29023
|
+
}
|
|
29024
|
+
async* runMigrateMode(args2) {
|
|
29025
|
+
const { game: game2, user, deployId, databaseId, migrations, state } = args2;
|
|
29026
|
+
const cf = this.getCloudflare();
|
|
29027
|
+
yield { type: "status", data: { message: "Preparing database migrations" } };
|
|
29028
|
+
await this.assertNoSchemaDrift(databaseId, state);
|
|
29029
|
+
await cf.d1.ensureMigrationLedger(databaseId);
|
|
29030
|
+
const ledger = await cf.d1.readMigrationLedger(databaseId);
|
|
29031
|
+
const plan = planMigrations(migrations.map((migration) => ({ tag: migration.tag, checksum: migration.checksum })), ledger.map((row) => ({
|
|
29032
|
+
tag: row.tag,
|
|
29033
|
+
checksum: row.checksum,
|
|
29034
|
+
checksumAlgo: row.checksum_algo
|
|
29035
|
+
})));
|
|
29036
|
+
setAttributes({
|
|
29037
|
+
"app.deploy.migrations_total": migrations.length,
|
|
29038
|
+
"app.deploy.migrations_applied_before": ledger.length,
|
|
29039
|
+
"app.deploy.migrations_pending": plan.pendingTags.length
|
|
29040
|
+
});
|
|
29041
|
+
if (plan.checksumMismatches.length > 0) {
|
|
29042
|
+
throw new MigrationChecksumMismatchError(plan.checksumMismatches);
|
|
29043
|
+
}
|
|
29044
|
+
if (plan.missingFromJournalTags.length > 0) {
|
|
29045
|
+
throw new MigrationJournalDivergenceError(plan.missingFromJournalTags);
|
|
29046
|
+
}
|
|
29047
|
+
if (plan.outOfOrderTags.length > 0) {
|
|
29048
|
+
throw new MigrationOrderError(plan.outOfOrderTags);
|
|
29049
|
+
}
|
|
29050
|
+
if (plan.pendingTags.length === 0) {
|
|
29051
|
+
yield { type: "status", data: { message: "Database schema is up to date" } };
|
|
29052
|
+
if (ledger.length > 0 && !state?.schemaFingerprint) {
|
|
29053
|
+
const fingerprint2 = await cf.d1.fingerprintSchema(databaseId);
|
|
29054
|
+
await this.persistDeploymentState(game2.id, {
|
|
29055
|
+
schemaFingerprint: fingerprint2.fingerprint
|
|
29056
|
+
});
|
|
29057
|
+
return {
|
|
29058
|
+
...NO_DATABASE_WORK,
|
|
29059
|
+
schemaFingerprint: fingerprint2.fingerprint
|
|
29060
|
+
};
|
|
29061
|
+
}
|
|
29062
|
+
return {
|
|
29063
|
+
...NO_DATABASE_WORK,
|
|
29064
|
+
schemaFingerprint: state?.schemaFingerprint ?? null
|
|
29065
|
+
};
|
|
29066
|
+
}
|
|
29067
|
+
const capture = yield* this.captureBookmarkStep(databaseId);
|
|
29068
|
+
const migrationsByTag = new Map(migrations.map((migration) => [migration.tag, migration]));
|
|
29069
|
+
let appliedCount = 0;
|
|
29070
|
+
for (const tag of plan.pendingTags) {
|
|
29071
|
+
const migration = migrationsByTag.get(tag);
|
|
29072
|
+
const count = migration.statements.length;
|
|
29073
|
+
yield {
|
|
29074
|
+
type: "status",
|
|
29075
|
+
data: { message: `Applying ${tag} (${count} statement${count === 1 ? "" : "s"})` }
|
|
29076
|
+
};
|
|
29077
|
+
const startedAt = Date.now();
|
|
29078
|
+
try {
|
|
29079
|
+
await withSpan("deploy.apply_migration", () => cf.d1.applyMigration(databaseId, {
|
|
29080
|
+
tag,
|
|
29081
|
+
statements: migration.statements,
|
|
29082
|
+
checksum: migration.checksum,
|
|
29083
|
+
deployId,
|
|
29084
|
+
appliedBy: user.id
|
|
29085
|
+
}));
|
|
29086
|
+
} catch (error) {
|
|
29087
|
+
if (appliedCount > 0) {
|
|
29088
|
+
await this.recordAppliedPrefixFingerprint(game2.id, databaseId);
|
|
29089
|
+
}
|
|
29090
|
+
throw await this.toMigrationStepError(databaseId, error, migration);
|
|
29091
|
+
}
|
|
29092
|
+
appliedCount++;
|
|
29093
|
+
const seconds = ((Date.now() - startedAt) / 1000).toFixed(1);
|
|
29094
|
+
yield { type: "status", data: { message: `Applied ${tag} (${seconds}s)` } };
|
|
29095
|
+
}
|
|
29096
|
+
setAttribute("app.deploy.migrations_applied", plan.pendingTags.length);
|
|
29097
|
+
const fingerprint = await cf.d1.fingerprintSchema(databaseId);
|
|
29098
|
+
await this.persistDeploymentState(game2.id, {
|
|
29099
|
+
schemaFingerprint: fingerprint.fingerprint,
|
|
29100
|
+
schemaHash: null,
|
|
29101
|
+
schemaSnapshot: null
|
|
29102
|
+
});
|
|
29103
|
+
return {
|
|
29104
|
+
schemaHash: null,
|
|
29105
|
+
schemaFingerprint: fingerprint.fingerprint,
|
|
29106
|
+
timeTravelBookmark: capture?.bookmark ?? null,
|
|
29107
|
+
bookmarkCapturedAt: capture?.capturedAt ?? null
|
|
29108
|
+
};
|
|
29109
|
+
}
|
|
29110
|
+
async* runPushMode(args2) {
|
|
29111
|
+
const { game: game2, databaseId, payload, state } = args2;
|
|
29112
|
+
const cf = this.getCloudflare();
|
|
29113
|
+
yield { type: "status", data: { message: "Verifying database schema state" } };
|
|
29114
|
+
if (typeof payload.baselineHash !== "string" && payload.baselineHash !== null) {
|
|
29115
|
+
throw new ValidationError("Push deploys require baselineHash (null on first deploy)");
|
|
29116
|
+
}
|
|
29117
|
+
if (isMigrateManaged(state)) {
|
|
29118
|
+
const ledger = await cf.d1.readMigrationLedger(databaseId);
|
|
29119
|
+
throw new ValidationError(`This database is migrate-managed (${ledger.length} applied ` + "migration(s)) and does not accept push-mode SQL.", { code: DEPLOY_ERROR_CODES.strategyMismatch });
|
|
29120
|
+
}
|
|
29121
|
+
const storedHash = state?.schemaHash ?? null;
|
|
29122
|
+
if (payload.baselineHash !== storedHash) {
|
|
29123
|
+
throw await this.buildStateConflictError(game2.id, payload.baselineHash);
|
|
29124
|
+
}
|
|
29125
|
+
const statements = splitSqlStatements(payload.sql);
|
|
29126
|
+
const oversized = findOversizedStatement(statements);
|
|
29127
|
+
if (oversized) {
|
|
29128
|
+
throw new ValidationError(`Push statement ${oversized.index} is ${oversized.byteLength} bytes — over ` + `D1's ${D1_MAX_STATEMENT_BYTES / 1024} KB per-statement limit. Split the ` + "statement or reduce its size.", {
|
|
29129
|
+
code: DEPLOY_ERROR_CODES.pushFailed,
|
|
29130
|
+
statementIndex: oversized.index,
|
|
29131
|
+
offset: null
|
|
29132
|
+
});
|
|
29133
|
+
}
|
|
29134
|
+
const destructive = detectDestructiveStatements(statements);
|
|
29135
|
+
setAttributes({
|
|
29136
|
+
"app.deploy.push_statement_count": statements.length,
|
|
29137
|
+
"app.deploy.push_destructive_count": destructive.length,
|
|
29138
|
+
"app.deploy.push_accept_data_loss": Boolean(payload.acceptDataLoss)
|
|
29139
|
+
});
|
|
29140
|
+
if (destructive.length > 0 && !payload.acceptDataLoss) {
|
|
29141
|
+
throw new DestructiveSchemaError(destructive);
|
|
29142
|
+
}
|
|
29143
|
+
await this.assertNoSchemaDrift(databaseId, state);
|
|
29144
|
+
const reserved = await this.persistPushDeploymentState(game2.id, payload.baselineHash, {
|
|
29145
|
+
schemaFingerprint: PUSH_RESERVATION_FINGERPRINT,
|
|
29146
|
+
schemaHash: payload.nextHash,
|
|
29147
|
+
schemaSnapshot: payload.nextSnapshot
|
|
29148
|
+
});
|
|
29149
|
+
if (!reserved) {
|
|
29150
|
+
throw await this.buildStateConflictError(game2.id, payload.baselineHash);
|
|
29151
|
+
}
|
|
29152
|
+
let capture = null;
|
|
29153
|
+
if (statements.length > 0) {
|
|
29154
|
+
capture = yield* this.captureBookmarkStep(databaseId);
|
|
29155
|
+
yield {
|
|
29156
|
+
type: "status",
|
|
29157
|
+
data: {
|
|
29158
|
+
message: `Applying database schema changes (${statements.length} statements)`
|
|
29159
|
+
}
|
|
29160
|
+
};
|
|
29161
|
+
try {
|
|
29162
|
+
await cf.d1.batch(databaseId, [
|
|
29163
|
+
{ sql: "PRAGMA defer_foreign_keys = on" },
|
|
29164
|
+
...statements.map((statement) => ({ sql: statement })),
|
|
29165
|
+
{ sql: "PRAGMA defer_foreign_keys = off" }
|
|
29166
|
+
]);
|
|
29167
|
+
} catch (error) {
|
|
29168
|
+
await this.persistPushDeploymentState(game2.id, payload.nextHash, {
|
|
29169
|
+
schemaFingerprint: state?.schemaFingerprint ?? null,
|
|
29170
|
+
schemaHash: state?.schemaHash ?? null,
|
|
29171
|
+
schemaSnapshot: state?.schemaSnapshot ?? null
|
|
29172
|
+
});
|
|
29173
|
+
throw this.toPushStepError(error);
|
|
29174
|
+
}
|
|
29175
|
+
}
|
|
29176
|
+
const fingerprint = await cf.d1.fingerprintSchema(databaseId);
|
|
29177
|
+
await this.persistDeploymentState(game2.id, {
|
|
29178
|
+
schemaFingerprint: fingerprint.fingerprint
|
|
29179
|
+
});
|
|
29180
|
+
return {
|
|
29181
|
+
schemaHash: payload.nextHash,
|
|
29182
|
+
schemaFingerprint: fingerprint.fingerprint,
|
|
29183
|
+
timeTravelBookmark: capture?.bookmark ?? null,
|
|
29184
|
+
bookmarkCapturedAt: capture?.capturedAt ?? null
|
|
29185
|
+
};
|
|
29186
|
+
}
|
|
29187
|
+
async* captureBookmarkStep(databaseId) {
|
|
29188
|
+
const cf = this.getCloudflare();
|
|
29189
|
+
const bookmark = await cf.d1.captureBookmark(databaseId);
|
|
29190
|
+
const capturedAt = new Date;
|
|
29191
|
+
setAttribute("app.deploy.db_bookmark_captured", bookmark.captured);
|
|
29192
|
+
if (!bookmark.captured) {
|
|
29193
|
+
yield {
|
|
29194
|
+
type: "status",
|
|
29195
|
+
data: { message: `Time Travel bookmark unavailable (${bookmark.error})` }
|
|
29196
|
+
};
|
|
29197
|
+
return null;
|
|
29198
|
+
}
|
|
29199
|
+
yield {
|
|
29200
|
+
type: "status",
|
|
29201
|
+
data: {
|
|
29202
|
+
message: "Captured Time Travel bookmark",
|
|
29203
|
+
details: { bookmark: bookmark.bookmark }
|
|
29204
|
+
}
|
|
29205
|
+
};
|
|
29206
|
+
return { bookmark: bookmark.bookmark, capturedAt };
|
|
29207
|
+
}
|
|
29208
|
+
async toMigrationStepError(databaseId, error, migration) {
|
|
29209
|
+
if (error instanceof D1StatementTooLargeError) {
|
|
29210
|
+
return new ValidationError(error.message, {
|
|
29211
|
+
code: DEPLOY_ERROR_CODES.migrationFailed,
|
|
29212
|
+
tag: migration.tag,
|
|
29213
|
+
statementIndex: error.statementIndex,
|
|
29214
|
+
offset: null,
|
|
29215
|
+
d1Message: error.message
|
|
29216
|
+
});
|
|
29217
|
+
}
|
|
29218
|
+
if (error instanceof D1MigrationError) {
|
|
29219
|
+
addEvent("deploy.migration_failed", {
|
|
29220
|
+
"app.d1.migration_tag": migration.tag,
|
|
29221
|
+
"app.error.message": error.d1Message,
|
|
29222
|
+
...error.offset !== null && { "app.d1.error_offset": error.offset }
|
|
29223
|
+
});
|
|
29224
|
+
const alreadyApplied = isAlreadyExistsSqlError(error.d1Message) ? await this.assessAlreadyApplied(databaseId, migration.statements) : null;
|
|
29225
|
+
return new MigrationExecutionError({
|
|
29226
|
+
tag: migration.tag,
|
|
29227
|
+
d1Message: error.d1Message,
|
|
29228
|
+
offset: error.offset,
|
|
29229
|
+
...alreadyApplied ? { alreadyApplied } : {}
|
|
29230
|
+
});
|
|
29231
|
+
}
|
|
29232
|
+
return error;
|
|
29233
|
+
}
|
|
29234
|
+
async assessAlreadyApplied(databaseId, statements) {
|
|
29235
|
+
try {
|
|
29236
|
+
const cf = this.getCloudflare();
|
|
29237
|
+
const live = await cf.d1.fingerprintSchema(databaseId);
|
|
29238
|
+
const tables = await cf.d1.readTableColumns(databaseId, live.tables);
|
|
29239
|
+
const assessment = assessMigrationAlreadyApplied(statements, tables);
|
|
29240
|
+
addEvent("deploy.already_applied_assessment", {
|
|
29241
|
+
"app.deploy.already_applied_verdict": assessment.verdict,
|
|
29242
|
+
"app.deploy.already_applied_present": assessment.present.length,
|
|
29243
|
+
"app.deploy.already_applied_missing": assessment.missing.length
|
|
29244
|
+
});
|
|
29245
|
+
return assessment.verdict === "no-signal" ? null : assessment;
|
|
29246
|
+
} catch (assessError) {
|
|
29247
|
+
addEvent("deploy.already_applied_check_failed", {
|
|
29248
|
+
"app.error.message": errorMessage(assessError)
|
|
29249
|
+
});
|
|
29250
|
+
return null;
|
|
29251
|
+
}
|
|
29252
|
+
}
|
|
29253
|
+
toPushStepError(error) {
|
|
29254
|
+
if (error instanceof D1BatchError) {
|
|
29255
|
+
addEvent("deploy.push_failed", {
|
|
29256
|
+
"app.error.message": error.d1Message,
|
|
29257
|
+
...error.offset !== null && { "app.d1.error_offset": error.offset }
|
|
29258
|
+
});
|
|
29259
|
+
return new PushExecutionError({ d1Message: error.d1Message, offset: error.offset });
|
|
29260
|
+
}
|
|
29261
|
+
return error;
|
|
29262
|
+
}
|
|
29263
|
+
async assertNoSchemaDrift(databaseId, state) {
|
|
29264
|
+
if (!state?.schemaFingerprint) {
|
|
29265
|
+
return;
|
|
29266
|
+
}
|
|
29267
|
+
const live = await this.getCloudflare().d1.fingerprintSchema(databaseId);
|
|
29268
|
+
if (live.fingerprint !== state.schemaFingerprint) {
|
|
29269
|
+
addEvent("deploy.state_drift", {
|
|
29270
|
+
"app.deploy.expected_fingerprint": state.schemaFingerprint,
|
|
29271
|
+
"app.deploy.actual_fingerprint": live.fingerprint
|
|
29272
|
+
});
|
|
29273
|
+
throw new DeploymentStateDriftError({
|
|
29274
|
+
expectedFingerprint: state.schemaFingerprint,
|
|
29275
|
+
actualFingerprint: live.fingerprint
|
|
29276
|
+
});
|
|
29277
|
+
}
|
|
29278
|
+
}
|
|
29279
|
+
async buildStateConflictError(gameId, claimedHash) {
|
|
29280
|
+
const [row, lastDeploy] = await Promise.all([
|
|
29281
|
+
this.deps.db.query.gameDeploymentState.findFirst({
|
|
29282
|
+
where: eq(gameDeploymentState.gameId, gameId),
|
|
29283
|
+
columns: { schemaHash: true }
|
|
29284
|
+
}),
|
|
29285
|
+
findLastSuccessfulDeployWithEmail(this.deps.db, gameId)
|
|
29286
|
+
]);
|
|
29287
|
+
const currentHash = row?.schemaHash ?? null;
|
|
29288
|
+
addEvent("deploy.state_conflict", {
|
|
29289
|
+
"app.deploy.baseline_hash": claimedHash ?? "null",
|
|
29290
|
+
"app.deploy.current_hash": currentHash ?? "null"
|
|
29291
|
+
});
|
|
29292
|
+
return new DeploymentStateConflictError({
|
|
29293
|
+
currentHash,
|
|
29294
|
+
lastDeployAt: lastDeploy?.at.toISOString() ?? null,
|
|
29295
|
+
lastDeployBy: lastDeploy?.email ?? lastDeploy?.userId ?? null
|
|
29296
|
+
});
|
|
29297
|
+
}
|
|
29298
|
+
async recordAppliedPrefixFingerprint(gameId, databaseId) {
|
|
29299
|
+
try {
|
|
29300
|
+
const fingerprint = await this.getCloudflare().d1.fingerprintSchema(databaseId);
|
|
29301
|
+
await this.persistDeploymentState(gameId, {
|
|
29302
|
+
schemaFingerprint: fingerprint.fingerprint
|
|
29303
|
+
});
|
|
29304
|
+
} catch (error) {
|
|
29305
|
+
addEvent("deploy.fingerprint_persist_failed", {
|
|
29306
|
+
"exception.type": errorType(error),
|
|
29307
|
+
"app.error.message": errorMessage(error)
|
|
29308
|
+
});
|
|
29309
|
+
}
|
|
29310
|
+
}
|
|
29311
|
+
async persistDeploymentState(gameId, patch) {
|
|
29312
|
+
const set = {
|
|
29313
|
+
...patch,
|
|
29314
|
+
updatedAt: new Date
|
|
29315
|
+
};
|
|
29316
|
+
await this.deps.db.insert(gameDeploymentState).values({ gameId, baselineSource: "deploy", ...set }).onConflictDoUpdate({ target: gameDeploymentState.gameId, set });
|
|
29317
|
+
}
|
|
29318
|
+
async persistArtifactHashes(gameId, patch) {
|
|
29319
|
+
const set = {
|
|
29320
|
+
...patch.buildHash !== undefined && { buildHash: patch.buildHash },
|
|
29321
|
+
...patch.integrationsHash !== undefined && {
|
|
29322
|
+
integrationsHash: patch.integrationsHash
|
|
29323
|
+
}
|
|
29324
|
+
};
|
|
29325
|
+
if (Object.keys(set).length === 0) {
|
|
29326
|
+
return;
|
|
29327
|
+
}
|
|
29328
|
+
await this.deps.db.insert(gameDeploymentState).values({ gameId, ...set, updatedAt: new Date }).onConflictDoUpdate({
|
|
29329
|
+
target: gameDeploymentState.gameId,
|
|
29330
|
+
set: { ...set, updatedAt: new Date }
|
|
29331
|
+
});
|
|
29332
|
+
}
|
|
29333
|
+
async persistPushDeploymentState(gameId, baselineHash, patch) {
|
|
29334
|
+
const set = { ...patch, updatedAt: new Date };
|
|
29335
|
+
if (baselineHash === null) {
|
|
29336
|
+
const claimed2 = await this.deps.db.insert(gameDeploymentState).values({ gameId, baselineSource: "deploy", ...set }).onConflictDoUpdate({
|
|
29337
|
+
target: gameDeploymentState.gameId,
|
|
29338
|
+
set,
|
|
29339
|
+
setWhere: isNull(gameDeploymentState.schemaHash)
|
|
29340
|
+
}).returning({ gameId: gameDeploymentState.gameId });
|
|
29341
|
+
return claimed2.length > 0;
|
|
29342
|
+
}
|
|
29343
|
+
const claimed = await this.deps.db.update(gameDeploymentState).set(set).where(and(eq(gameDeploymentState.gameId, gameId), eq(gameDeploymentState.schemaHash, baselineHash))).returning({ gameId: gameDeploymentState.gameId });
|
|
29344
|
+
return claimed.length > 0;
|
|
29345
|
+
}
|
|
29346
|
+
async* adoptClientBaseline(context2) {
|
|
29347
|
+
const { game: game2, request, user, deploymentId, baseline } = context2;
|
|
29348
|
+
const cf = this.getCloudflare();
|
|
29349
|
+
const persistedId = context2.existingResources?.d1?.find((db2) => db2.name === deploymentId)?.id;
|
|
29350
|
+
const databaseId = persistedId ?? (hasBinding(request.bindings?.database) ? await cf.d1.create(deploymentId) : null);
|
|
29351
|
+
if (baseline.lastAppliedMigrationTag && !databaseId) {
|
|
29352
|
+
throw new ValidationError("Baseline claims applied migrations, but the deploy has no database binding");
|
|
29353
|
+
}
|
|
29354
|
+
const live = databaseId ? await cf.d1.fingerprintSchema(databaseId) : null;
|
|
29355
|
+
let recordedRows = 0;
|
|
29356
|
+
if (databaseId && baseline.lastAppliedMigrationTag) {
|
|
29357
|
+
if (live.tables.length === 0) {
|
|
29358
|
+
throw new BaselineDatabaseEmptyError;
|
|
29359
|
+
}
|
|
29360
|
+
const slice = sliceJournalToTag(baseline.journal ?? [], baseline.lastAppliedMigrationTag);
|
|
29361
|
+
if (!slice) {
|
|
29362
|
+
throw new ValidationError(`Baseline lastAppliedMigrationTag '${baseline.lastAppliedMigrationTag}' ` + "is not in the submitted journal");
|
|
29363
|
+
}
|
|
29364
|
+
if (baseline.evidence?.length) {
|
|
29365
|
+
const [tables, lastDeploy] = await Promise.all([
|
|
29366
|
+
cf.d1.readTableColumns(databaseId, live.tables),
|
|
29367
|
+
findLastSuccessfulDeploy(this.deps.db, game2.id)
|
|
29368
|
+
]);
|
|
29369
|
+
assertBaselineClaimValid({
|
|
29370
|
+
claimedTag: baseline.lastAppliedMigrationTag,
|
|
29371
|
+
evidence: baseline.evidence,
|
|
29372
|
+
tables,
|
|
29373
|
+
indexes: new Set(live.indexes),
|
|
29374
|
+
views: new Set(live.views),
|
|
29375
|
+
lastDeployAt: lastDeploy?.at ?? null,
|
|
29376
|
+
allowUnverified: false,
|
|
29377
|
+
source: "seed",
|
|
29378
|
+
gameId: game2.id,
|
|
29379
|
+
userId: user.id
|
|
29380
|
+
});
|
|
29381
|
+
}
|
|
29382
|
+
await cf.d1.ensureMigrationLedger(databaseId);
|
|
29383
|
+
const ledger = await cf.d1.readMigrationLedger(databaseId);
|
|
29384
|
+
const plan = planMigrations(slice, ledger.map((row) => ({
|
|
29385
|
+
tag: row.tag,
|
|
29386
|
+
checksum: row.checksum,
|
|
29387
|
+
checksumAlgo: row.checksum_algo
|
|
29388
|
+
})));
|
|
29389
|
+
if (plan.checksumMismatches.length > 0) {
|
|
29390
|
+
throw new MigrationChecksumMismatchError(plan.checksumMismatches);
|
|
29391
|
+
}
|
|
29392
|
+
if (plan.missingFromJournalTags.length > 0) {
|
|
29393
|
+
throw new MigrationJournalDivergenceError(plan.missingFromJournalTags);
|
|
29394
|
+
}
|
|
29395
|
+
if (plan.outOfOrderTags.length > 0) {
|
|
29396
|
+
throw new MigrationOrderError(plan.outOfOrderTags);
|
|
29397
|
+
}
|
|
29398
|
+
const checksumByTag = new Map(slice.map((entry) => [entry.tag, entry.checksum]));
|
|
29399
|
+
const rows = plan.pendingTags.map((tag) => ({
|
|
29400
|
+
tag,
|
|
29401
|
+
checksum: checksumByTag.get(tag)
|
|
29402
|
+
}));
|
|
29403
|
+
if (rows.length > 0) {
|
|
29404
|
+
await cf.d1.recordLedgerRows(databaseId, {
|
|
29405
|
+
rows,
|
|
29406
|
+
deployId: `baseline:${request.deployId ?? crypto.randomUUID()}`,
|
|
29407
|
+
appliedBy: user.id,
|
|
29408
|
+
source: "baseline"
|
|
29409
|
+
});
|
|
29410
|
+
}
|
|
29411
|
+
recordedRows = rows.length;
|
|
29412
|
+
}
|
|
29413
|
+
const fingerprint = live?.fingerprint ?? null;
|
|
29414
|
+
const set = {
|
|
29415
|
+
...baseline.schemaHash !== undefined && { schemaHash: baseline.schemaHash },
|
|
29416
|
+
...baseline.schemaSnapshot !== undefined && {
|
|
29417
|
+
schemaSnapshot: baseline.schemaSnapshot
|
|
29418
|
+
},
|
|
29419
|
+
...baseline.integrationsHash !== undefined && {
|
|
29420
|
+
integrationsHash: baseline.integrationsHash
|
|
29421
|
+
},
|
|
29422
|
+
...baseline.buildHash !== undefined && { buildHash: baseline.buildHash },
|
|
29423
|
+
...fingerprint !== null && { schemaFingerprint: fingerprint },
|
|
29424
|
+
baselineSource: "client-baseline",
|
|
29425
|
+
updatedAt: new Date
|
|
29426
|
+
};
|
|
29427
|
+
await this.deps.db.insert(gameDeploymentState).values({ gameId: game2.id, ...set }).onConflictDoUpdate({ target: gameDeploymentState.gameId, set });
|
|
29428
|
+
setAttributes({
|
|
29429
|
+
"app.deploy.baseline_adopted": true,
|
|
29430
|
+
"app.deploy.baseline_ledger_rows": recordedRows,
|
|
29431
|
+
"app.deploy.baseline_has_snapshot": baseline.schemaSnapshot !== undefined
|
|
29432
|
+
});
|
|
29433
|
+
yield {
|
|
29434
|
+
type: "status",
|
|
29435
|
+
data: {
|
|
29436
|
+
message: "Adopted deployment state from client baseline",
|
|
29437
|
+
details: {
|
|
29438
|
+
ledgerRows: recordedRows,
|
|
29439
|
+
...baseline.lastAppliedMigrationTag && {
|
|
29440
|
+
lastAppliedMigrationTag: baseline.lastAppliedMigrationTag
|
|
29441
|
+
}
|
|
29442
|
+
}
|
|
29443
|
+
}
|
|
29444
|
+
};
|
|
29445
|
+
return this.deps.db.query.gameDeploymentState.findFirst({
|
|
29446
|
+
where: eq(gameDeploymentState.gameId, game2.id)
|
|
29447
|
+
});
|
|
29448
|
+
}
|
|
27991
29449
|
async applyGameMetadata(gameId, request, hasFrontend, hasMetadata, deploymentUrl) {
|
|
27992
29450
|
const updates = { updatedAt: new Date };
|
|
27993
29451
|
if (hasFrontend) {
|
|
@@ -28013,7 +29471,8 @@ class DeployService {
|
|
|
28013
29471
|
result,
|
|
28014
29472
|
request,
|
|
28015
29473
|
user,
|
|
28016
|
-
flags: flags2
|
|
29474
|
+
flags: flags2,
|
|
29475
|
+
database
|
|
28017
29476
|
}) {
|
|
28018
29477
|
const { hasBackend, hasFrontend, hasMetadata } = flags2;
|
|
28019
29478
|
const db2 = this.deps.db;
|
|
@@ -28023,9 +29482,17 @@ class DeployService {
|
|
|
28023
29482
|
deploymentId: result.deploymentId,
|
|
28024
29483
|
url: result.url,
|
|
28025
29484
|
codeHash,
|
|
29485
|
+
schemaHash: database.schemaHash,
|
|
29486
|
+
schemaFingerprint: database.schemaFingerprint,
|
|
29487
|
+
timeTravelBookmark: database.timeTravelBookmark,
|
|
29488
|
+
bookmarkCapturedAt: database.bookmarkCapturedAt,
|
|
28026
29489
|
resources: result.resources,
|
|
28027
29490
|
target: "game"
|
|
28028
29491
|
});
|
|
29492
|
+
await this.persistArtifactHashes(game2.id, {
|
|
29493
|
+
buildHash: hasFrontend ? request.buildHash : undefined,
|
|
29494
|
+
integrationsHash: request.integrationsHash
|
|
29495
|
+
});
|
|
28029
29496
|
if (hasBackend) {
|
|
28030
29497
|
await withSpan("deploy.configure_worker_secrets", async () => {
|
|
28031
29498
|
await this.ensureWorkerApiKeyOnWorker(user, DeployService.gameWorkerKeySpec(slug), result.deploymentId);
|
|
@@ -28162,6 +29629,29 @@ class DeployService {
|
|
|
28162
29629
|
const cf = this.getCloudflare();
|
|
28163
29630
|
await cf.setSecrets(deploymentId, { QUEUE_INGRESS_SECRET: secret });
|
|
28164
29631
|
}
|
|
29632
|
+
async* pruneManagedSecretsStep(gameId, deploymentId, pruneSecrets) {
|
|
29633
|
+
const cf = this.getCloudflare();
|
|
29634
|
+
const keys = [...new Set(pruneSecrets)];
|
|
29635
|
+
yield {
|
|
29636
|
+
type: "status",
|
|
29637
|
+
data: {
|
|
29638
|
+
message: `Pruning ${keys.length} managed secret(s)`,
|
|
29639
|
+
details: { keys }
|
|
29640
|
+
}
|
|
29641
|
+
};
|
|
29642
|
+
await withSpan("deploy.prune_secrets", async () => {
|
|
29643
|
+
const existing = await cf.listSecrets(deploymentId);
|
|
29644
|
+
for (const key of keys) {
|
|
29645
|
+
const prefixedKey = `${SECRETS_PREFIX}${key}`;
|
|
29646
|
+
if (existing.includes(prefixedKey)) {
|
|
29647
|
+
await cf.deleteSecret(deploymentId, prefixedKey);
|
|
29648
|
+
}
|
|
29649
|
+
}
|
|
29650
|
+
const pruned = keys.reduce((expr, key) => sql`${expr} - ${key}::text`, sql`coalesce(${gameDeploymentState.secretsManifest}, '{}'::jsonb)`);
|
|
29651
|
+
await this.deps.db.update(gameDeploymentState).set({ secretsManifest: pruned, updatedAt: new Date }).where(eq(gameDeploymentState.gameId, gameId));
|
|
29652
|
+
});
|
|
29653
|
+
setAttribute("app.deploy.pruned_secret_count", keys.length);
|
|
29654
|
+
}
|
|
28165
29655
|
async ensureDashboardSessionSecret(deploymentId, existingSecrets, hasPriorDeployment) {
|
|
28166
29656
|
if (existingSecrets === null && hasPriorDeployment) {
|
|
28167
29657
|
setAttribute("app.deploy.session_secret_outcome", "check_failed_kept");
|
|
@@ -28266,6 +29756,10 @@ class DeployService {
|
|
|
28266
29756
|
target: record.target,
|
|
28267
29757
|
url: record.url,
|
|
28268
29758
|
codeHash: record.codeHash,
|
|
29759
|
+
schemaHash: record.schemaHash ?? null,
|
|
29760
|
+
schemaFingerprint: record.schemaFingerprint ?? null,
|
|
29761
|
+
timeTravelBookmark: record.timeTravelBookmark ?? null,
|
|
29762
|
+
bookmarkCapturedAt: record.bookmarkCapturedAt ?? null,
|
|
28269
29763
|
resources: record.resources,
|
|
28270
29764
|
isActive: true
|
|
28271
29765
|
});
|
|
@@ -28275,8 +29769,10 @@ class DeployService {
|
|
|
28275
29769
|
await this.deps.alerts.notifyDeploymentFailure(failure).catch(catchAttrs("alerts.delivery", { "app.alerts.type": "deployment_failure" }));
|
|
28276
29770
|
}
|
|
28277
29771
|
}
|
|
29772
|
+
var PUSH_RESERVATION_FINGERPRINT = "reserved:push-in-flight", NO_DATABASE_WORK;
|
|
28278
29773
|
var init_deploy_service = __esm(() => {
|
|
28279
29774
|
init_drizzle_orm();
|
|
29775
|
+
init_src4();
|
|
28280
29776
|
init_playcademy();
|
|
28281
29777
|
init_src();
|
|
28282
29778
|
init_helpers_index();
|
|
@@ -28284,9 +29780,17 @@ var init_deploy_service = __esm(() => {
|
|
|
28284
29780
|
init_spans();
|
|
28285
29781
|
init_tunnel();
|
|
28286
29782
|
init_errors();
|
|
29783
|
+
init_baseline_validation_util();
|
|
28287
29784
|
init_dashboard_util();
|
|
28288
29785
|
init_deployment_util();
|
|
29786
|
+
init_migration_util();
|
|
28289
29787
|
init_worker_keys_util();
|
|
29788
|
+
NO_DATABASE_WORK = {
|
|
29789
|
+
schemaHash: null,
|
|
29790
|
+
schemaFingerprint: null,
|
|
29791
|
+
timeTravelBookmark: null,
|
|
29792
|
+
bookmarkCapturedAt: null
|
|
29793
|
+
};
|
|
28290
29794
|
});
|
|
28291
29795
|
|
|
28292
29796
|
// ../api-core/src/services/developer.service.ts
|
|
@@ -29740,7 +31244,7 @@ function createGameServices(deps) {
|
|
|
29740
31244
|
}
|
|
29741
31245
|
};
|
|
29742
31246
|
}
|
|
29743
|
-
var
|
|
31247
|
+
var init_game3 = __esm(() => {
|
|
29744
31248
|
init_dashboard_service();
|
|
29745
31249
|
init_deploy_job_service();
|
|
29746
31250
|
init_deploy_service();
|
|
@@ -29939,16 +31443,37 @@ class AlertsService {
|
|
|
29939
31443
|
await this.sendAlert(discord, embed.build());
|
|
29940
31444
|
}
|
|
29941
31445
|
async notifyDeploymentFailure(failure) {
|
|
29942
|
-
const
|
|
31446
|
+
const refused = DEPLOY_REFUSAL_CODES.has(failure.errorCode ?? "");
|
|
31447
|
+
const discord = this.recordAlert(refused ? "deployment_blocked" : "deployment_failure");
|
|
29943
31448
|
if (!discord) {
|
|
29944
31449
|
return;
|
|
29945
31450
|
}
|
|
29946
|
-
const [
|
|
29947
|
-
const
|
|
31451
|
+
const [noun, subject] = failure.target === "dashboard" ? ["Dashboard Deployment", "Dashboard deployment"] : ["Deployment", "Deployment"];
|
|
31452
|
+
const title = refused ? `\uD83D\uDEA7 ${noun} Blocked` : `❌ ${noun} Failed`;
|
|
31453
|
+
const verb = refused ? "was blocked" : "failed";
|
|
31454
|
+
const embed = new DiscordEmbedBuilder().setTitle(title).setDescription(`${subject} ${verb} for **${failure.displayName || failure.slug}** (**${this.getEnvironment()}**).`).setColor(refused ? DiscordColors.YELLOW : DiscordColors.RED).addField("Slug", failure.slug, true);
|
|
29948
31455
|
if (failure.developer) {
|
|
29949
31456
|
embed.addField("Developer", failure.developer.email || failure.developer.id, true);
|
|
29950
31457
|
}
|
|
29951
|
-
embed.addField("Error", failure.error, false)
|
|
31458
|
+
embed.addField(refused ? "Reason" : "Error", failure.error, false);
|
|
31459
|
+
if (refused) {
|
|
31460
|
+
embed.addField("Next step", "The developer received repair guidance in their terminal", false);
|
|
31461
|
+
}
|
|
31462
|
+
embed.setFooter("Playcademy Developer Platform").setTimestamp();
|
|
31463
|
+
await this.sendAlert(discord, embed.build());
|
|
31464
|
+
}
|
|
31465
|
+
async notifyDeployBlocked(blocked) {
|
|
31466
|
+
const discord = this.recordAlert("deployment_blocked");
|
|
31467
|
+
if (!discord) {
|
|
31468
|
+
return;
|
|
31469
|
+
}
|
|
31470
|
+
const embed = new DiscordEmbedBuilder().setTitle("\uD83D\uDEA7 Deployment Blocked").setDescription(`Deployment was blocked for **${blocked.displayName || blocked.slug}** (**${this.getEnvironment()}**).`).setColor(DiscordColors.YELLOW).addField("Slug", blocked.slug, true);
|
|
31471
|
+
if (blocked.developer) {
|
|
31472
|
+
embed.addField("Developer", blocked.developer.email || blocked.developer.id, true);
|
|
31473
|
+
}
|
|
31474
|
+
embed.addField("Reason", blocked.reason, false);
|
|
31475
|
+
embed.addField("Next step", "The developer received repair guidance in their terminal", false);
|
|
31476
|
+
embed.setFooter("Playcademy Developer Platform").setTimestamp();
|
|
29952
31477
|
await this.sendAlert(discord, embed.build());
|
|
29953
31478
|
}
|
|
29954
31479
|
async notifyGameDeletion(game2) {
|
|
@@ -30009,6 +31534,7 @@ var DISCORD_FIELD_LIMIT = 1024;
|
|
|
30009
31534
|
var init_alerts_service = __esm(() => {
|
|
30010
31535
|
init_discord();
|
|
30011
31536
|
init_spans();
|
|
31537
|
+
init_game2();
|
|
30012
31538
|
});
|
|
30013
31539
|
|
|
30014
31540
|
// ../api-core/src/services/kv-backup.service.ts
|
|
@@ -30441,6 +31967,15 @@ class DatabaseService {
|
|
|
30441
31967
|
constructor(deps) {
|
|
30442
31968
|
this.deps = deps;
|
|
30443
31969
|
}
|
|
31970
|
+
static remapD1Resource(resources, d1ResourceName, databaseId) {
|
|
31971
|
+
return {
|
|
31972
|
+
resources: {
|
|
31973
|
+
...resources,
|
|
31974
|
+
d1: resources.d1?.map((dbResource) => dbResource.name === d1ResourceName ? { ...dbResource, id: databaseId } : dbResource)
|
|
31975
|
+
},
|
|
31976
|
+
timeTravelBookmark: null
|
|
31977
|
+
};
|
|
31978
|
+
}
|
|
30444
31979
|
getD1() {
|
|
30445
31980
|
const d1 = this.deps.cloudflare?.d1;
|
|
30446
31981
|
if (!d1) {
|
|
@@ -30459,11 +31994,7 @@ class DatabaseService {
|
|
|
30459
31994
|
try {
|
|
30460
31995
|
await this.deps.cloudflare.updateD1Binding(dashboardDeployment.deploymentId, databaseId);
|
|
30461
31996
|
if (dashboardDeployment.resources?.d1?.length) {
|
|
30462
|
-
|
|
30463
|
-
...dashboardDeployment.resources,
|
|
30464
|
-
d1: dashboardDeployment.resources.d1.map((dbResource) => dbResource.name === d1ResourceName ? { ...dbResource, id: databaseId } : dbResource)
|
|
30465
|
-
};
|
|
30466
|
-
await this.deps.db.update(gameDeployments).set({ resources: updatedResources }).where(eq(gameDeployments.id, dashboardDeployment.id));
|
|
31997
|
+
await this.deps.db.update(gameDeployments).set(DatabaseService.remapD1Resource(dashboardDeployment.resources, d1ResourceName, databaseId)).where(eq(gameDeployments.id, dashboardDeployment.id));
|
|
30467
31998
|
}
|
|
30468
31999
|
setAttribute("app.database.dashboard_binding", "updated");
|
|
30469
32000
|
} catch (error) {
|
|
@@ -30474,20 +32005,36 @@ class DatabaseService {
|
|
|
30474
32005
|
});
|
|
30475
32006
|
}
|
|
30476
32007
|
}
|
|
30477
|
-
async reset(slug, user,
|
|
32008
|
+
async reset(slug, user, request = {}) {
|
|
32009
|
+
const { schema: schema2, database } = request;
|
|
30478
32010
|
setAttributes({
|
|
30479
32011
|
"app.database.operation": "reset",
|
|
32012
|
+
"app.database.mode": database?.mode ?? (schema2 ? "legacy" : "none"),
|
|
30480
32013
|
"app.database.schema_size": schema2?.sql.length,
|
|
30481
32014
|
"app.database.schema_version": schema2?.hash
|
|
30482
32015
|
});
|
|
30483
32016
|
const d1 = this.getD1();
|
|
30484
32017
|
const game2 = await this.deps.validateDeveloperAccessBySlug(user, slug);
|
|
32018
|
+
const state = await this.deps.db.query.gameDeploymentState.findFirst({
|
|
32019
|
+
where: eq(gameDeploymentState.gameId, game2.id)
|
|
32020
|
+
});
|
|
32021
|
+
if (isSchemaAdopted(state) && !database) {
|
|
32022
|
+
if (schema2) {
|
|
32023
|
+
throw new LegacySchemaUpgradeRequiredError;
|
|
32024
|
+
}
|
|
32025
|
+
throw new ValidationError("This game's database state is server-managed: resetting it requires " + "the mode-aware rebuild payload so the recorded state matches the " + "new database. Run the reset through the Playcademy CLI.");
|
|
32026
|
+
}
|
|
30485
32027
|
const deploymentId = getGameDeploymentId(slug, this.deps.config.sstStage);
|
|
32028
|
+
let resetDatabaseId = null;
|
|
30486
32029
|
try {
|
|
30487
32030
|
const databaseId = await d1.reset(deploymentId);
|
|
32031
|
+
resetDatabaseId = databaseId;
|
|
30488
32032
|
setAttribute("app.database.id", databaseId);
|
|
30489
32033
|
let schemaPushed = false;
|
|
30490
|
-
if (
|
|
32034
|
+
if (database) {
|
|
32035
|
+
await this.rebuildDatabase(databaseId, database, game2.id, user);
|
|
32036
|
+
schemaPushed = true;
|
|
32037
|
+
} else if (schema2?.sql) {
|
|
30491
32038
|
await d1.executeSchema(databaseId, schema2);
|
|
30492
32039
|
schemaPushed = true;
|
|
30493
32040
|
}
|
|
@@ -30503,11 +32050,7 @@ class DatabaseService {
|
|
|
30503
32050
|
});
|
|
30504
32051
|
setAttribute("app.database.active_deployment_found", Boolean(activeDeployment));
|
|
30505
32052
|
if (activeDeployment?.resources?.d1?.length) {
|
|
30506
|
-
|
|
30507
|
-
...activeDeployment.resources,
|
|
30508
|
-
d1: activeDeployment.resources.d1.map((dbResource) => dbResource.name === deploymentId ? { ...dbResource, id: databaseId } : dbResource)
|
|
30509
|
-
};
|
|
30510
|
-
await this.deps.db.update(gameDeployments).set({ resources: updatedResources }).where(eq(gameDeployments.id, activeDeployment.id));
|
|
32053
|
+
await this.deps.db.update(gameDeployments).set(DatabaseService.remapD1Resource(activeDeployment.resources, deploymentId, databaseId)).where(eq(gameDeployments.id, activeDeployment.id));
|
|
30511
32054
|
}
|
|
30512
32055
|
await this.syncDashboardD1Binding(game2.id, deploymentId, databaseId);
|
|
30513
32056
|
setAttributes({
|
|
@@ -30521,18 +32064,81 @@ class DatabaseService {
|
|
|
30521
32064
|
schemaPushed
|
|
30522
32065
|
};
|
|
30523
32066
|
} catch (error) {
|
|
32067
|
+
if (database && resetDatabaseId) {
|
|
32068
|
+
await this.recordLiveFingerprint(game2.id, resetDatabaseId);
|
|
32069
|
+
}
|
|
30524
32070
|
this.deps.alerts.notifyDatabaseResetFailure({
|
|
30525
32071
|
slug,
|
|
30526
32072
|
displayName: game2.displayName,
|
|
30527
32073
|
error: errorMessage(error),
|
|
30528
32074
|
developer: { id: user.id, email: user.email }
|
|
30529
32075
|
}).catch(catchAttrs("alerts.delivery", { "app.alerts.type": "database_reset" }));
|
|
32076
|
+
if (error instanceof DomainError) {
|
|
32077
|
+
throw error;
|
|
32078
|
+
}
|
|
30530
32079
|
throw new ValidationError(`Database reset failed: ${errorMessage(error)}`);
|
|
30531
32080
|
}
|
|
30532
32081
|
}
|
|
32082
|
+
async rebuildDatabase(databaseId, payload, gameId, user) {
|
|
32083
|
+
const d1 = this.getD1();
|
|
32084
|
+
if (payload.mode === "migrate") {
|
|
32085
|
+
const deployId = `reset:${crypto.randomUUID()}`;
|
|
32086
|
+
await d1.ensureMigrationLedger(databaseId);
|
|
32087
|
+
for (const migration of payload.migrations) {
|
|
32088
|
+
await d1.applyMigration(databaseId, {
|
|
32089
|
+
tag: migration.tag,
|
|
32090
|
+
statements: migration.statements,
|
|
32091
|
+
checksum: migration.checksum,
|
|
32092
|
+
deployId,
|
|
32093
|
+
appliedBy: user.id
|
|
32094
|
+
});
|
|
32095
|
+
}
|
|
32096
|
+
setAttribute("app.database.migrations_replayed", payload.migrations.length);
|
|
32097
|
+
const fingerprint2 = await d1.fingerprintSchema(databaseId);
|
|
32098
|
+
await this.persistDeploymentState(gameId, {
|
|
32099
|
+
schemaFingerprint: fingerprint2.fingerprint,
|
|
32100
|
+
schemaHash: null,
|
|
32101
|
+
schemaSnapshot: null
|
|
32102
|
+
});
|
|
32103
|
+
return;
|
|
32104
|
+
}
|
|
32105
|
+
const statements = splitSqlStatements(payload.sql);
|
|
32106
|
+
if (statements.length > 0) {
|
|
32107
|
+
await d1.batch(databaseId, [
|
|
32108
|
+
{ sql: "PRAGMA defer_foreign_keys = on" },
|
|
32109
|
+
...statements.map((statement) => ({ sql: statement })),
|
|
32110
|
+
{ sql: "PRAGMA defer_foreign_keys = off" }
|
|
32111
|
+
]);
|
|
32112
|
+
}
|
|
32113
|
+
setAttribute("app.database.push_statement_count", statements.length);
|
|
32114
|
+
const fingerprint = await d1.fingerprintSchema(databaseId);
|
|
32115
|
+
await this.persistDeploymentState(gameId, {
|
|
32116
|
+
schemaFingerprint: fingerprint.fingerprint,
|
|
32117
|
+
schemaHash: payload.nextHash,
|
|
32118
|
+
schemaSnapshot: payload.nextSnapshot
|
|
32119
|
+
});
|
|
32120
|
+
}
|
|
32121
|
+
async persistDeploymentState(gameId, patch) {
|
|
32122
|
+
const set = { ...patch, updatedAt: new Date };
|
|
32123
|
+
await this.deps.db.insert(gameDeploymentState).values({ gameId, baselineSource: "deploy", ...set }).onConflictDoUpdate({ target: gameDeploymentState.gameId, set });
|
|
32124
|
+
}
|
|
32125
|
+
async recordLiveFingerprint(gameId, databaseId) {
|
|
32126
|
+
try {
|
|
32127
|
+
const fingerprint = await this.getD1().fingerprintSchema(databaseId);
|
|
32128
|
+
await this.persistDeploymentState(gameId, {
|
|
32129
|
+
schemaFingerprint: fingerprint.fingerprint
|
|
32130
|
+
});
|
|
32131
|
+
} catch (error) {
|
|
32132
|
+
addEvent("database.fingerprint_persist_failed", {
|
|
32133
|
+
"exception.type": errorType(error),
|
|
32134
|
+
"app.error.message": errorMessage(error)
|
|
32135
|
+
});
|
|
32136
|
+
}
|
|
32137
|
+
}
|
|
30533
32138
|
}
|
|
30534
32139
|
var init_database_service = __esm(() => {
|
|
30535
32140
|
init_drizzle_orm();
|
|
32141
|
+
init_src4();
|
|
30536
32142
|
init_helpers_index();
|
|
30537
32143
|
init_tables_index();
|
|
30538
32144
|
init_spans();
|
|
@@ -30540,6 +32146,527 @@ var init_database_service = __esm(() => {
|
|
|
30540
32146
|
init_deployment_util();
|
|
30541
32147
|
});
|
|
30542
32148
|
|
|
32149
|
+
// ../api-core/src/utils/secrets.util.ts
|
|
32150
|
+
async function listUserSecretKeys(cloudflare2, deploymentId) {
|
|
32151
|
+
try {
|
|
32152
|
+
const allKeys = await cloudflare2.listSecrets(deploymentId);
|
|
32153
|
+
return allKeys.filter((key) => key.startsWith(SECRETS_PREFIX)).map((key) => key.slice(SECRETS_PREFIX.length));
|
|
32154
|
+
} catch (error) {
|
|
32155
|
+
const message = errorMessage(error);
|
|
32156
|
+
if (message.includes("not found") || message.includes("10007")) {
|
|
32157
|
+
return null;
|
|
32158
|
+
}
|
|
32159
|
+
throw error;
|
|
32160
|
+
}
|
|
32161
|
+
}
|
|
32162
|
+
var init_secrets_util = __esm(() => {
|
|
32163
|
+
init_src();
|
|
32164
|
+
});
|
|
32165
|
+
|
|
32166
|
+
// ../api-core/src/services/deployment-state.service.ts
|
|
32167
|
+
function historyEventEntry(event) {
|
|
32168
|
+
const base = { at: event.createdAt.toISOString(), by: event.email ?? DELETED_ACCOUNT_LABEL };
|
|
32169
|
+
if (event.kind === "restore" && "restoredTo" in event.payload) {
|
|
32170
|
+
return [{ kind: "restore", ...base, restoredTo: event.payload.restoredTo }];
|
|
32171
|
+
}
|
|
32172
|
+
if (event.kind === "blocked" && "code" in event.payload) {
|
|
32173
|
+
return [
|
|
32174
|
+
{ kind: "blocked", ...base, code: event.payload.code, reason: event.payload.reason }
|
|
32175
|
+
];
|
|
32176
|
+
}
|
|
32177
|
+
return [];
|
|
32178
|
+
}
|
|
32179
|
+
function databaseIdFromResources(resources, deploymentId) {
|
|
32180
|
+
const database = resources?.d1?.find((db2) => db2.name === deploymentId) ?? resources?.d1?.[0];
|
|
32181
|
+
return database?.id ?? null;
|
|
32182
|
+
}
|
|
32183
|
+
function restorePointCapturedAt(row) {
|
|
32184
|
+
return row.bookmarkCapturedAt ?? row.deployedAt;
|
|
32185
|
+
}
|
|
32186
|
+
|
|
32187
|
+
class DeploymentStateService {
|
|
32188
|
+
deps;
|
|
32189
|
+
constructor(deps) {
|
|
32190
|
+
this.deps = deps;
|
|
32191
|
+
}
|
|
32192
|
+
async partitionSecretKeys(slug, manifest) {
|
|
32193
|
+
const managedKeys = Object.keys(manifest ?? {});
|
|
32194
|
+
if (!this.deps.cloudflare) {
|
|
32195
|
+
addEvent("deployment_state.secret_keys_unavailable", {
|
|
32196
|
+
"app.error.message": "Cloudflare provider not configured"
|
|
32197
|
+
});
|
|
32198
|
+
return { managedKeys, unmanagedKeys: null };
|
|
32199
|
+
}
|
|
32200
|
+
const deploymentId = getGameDeploymentId(slug, this.deps.config.sstStage);
|
|
32201
|
+
const remoteKeys = await listUserSecretKeys(this.deps.cloudflare, deploymentId);
|
|
32202
|
+
if (remoteKeys === null) {
|
|
32203
|
+
return { managedKeys, unmanagedKeys: [] };
|
|
32204
|
+
}
|
|
32205
|
+
const managed = new Set(managedKeys);
|
|
32206
|
+
return {
|
|
32207
|
+
managedKeys,
|
|
32208
|
+
unmanagedKeys: remoteKeys.filter((key) => !managed.has(key))
|
|
32209
|
+
};
|
|
32210
|
+
}
|
|
32211
|
+
async readAppliedMigrations(slug, resources) {
|
|
32212
|
+
if (!this.deps.cloudflare || !resources?.d1?.length) {
|
|
32213
|
+
return null;
|
|
32214
|
+
}
|
|
32215
|
+
const deploymentId = getGameDeploymentId(slug, this.deps.config.sstStage);
|
|
32216
|
+
const databaseId = databaseIdFromResources(resources, deploymentId);
|
|
32217
|
+
if (!databaseId) {
|
|
32218
|
+
return null;
|
|
32219
|
+
}
|
|
32220
|
+
const ledger = await this.deps.cloudflare.d1.readMigrationLedger(databaseId);
|
|
32221
|
+
setAttributes({ "app.deployment_state.applied_migrations": ledger.length });
|
|
32222
|
+
return ledger.map((row) => ({
|
|
32223
|
+
tag: row.tag,
|
|
32224
|
+
checksum: row.checksum,
|
|
32225
|
+
checksumAlgo: row.checksum_algo
|
|
32226
|
+
}));
|
|
32227
|
+
}
|
|
32228
|
+
async get(slug, user, options = {}) {
|
|
32229
|
+
const game2 = await this.deps.validateDeveloperAccessBySlug(user, slug);
|
|
32230
|
+
const [state, gameDeployment, dashboardDeployment, lastSucceededJob, lastFailedJob] = await Promise.all([
|
|
32231
|
+
this.deps.db.query.gameDeploymentState.findFirst({
|
|
32232
|
+
where: eq(gameDeploymentState.gameId, game2.id)
|
|
32233
|
+
}),
|
|
32234
|
+
this.deps.db.query.gameDeployments.findFirst({
|
|
32235
|
+
where: activeDeploymentWhere(game2.id, "game"),
|
|
32236
|
+
columns: { codeHash: true, url: true, deployedAt: true, resources: true }
|
|
32237
|
+
}),
|
|
32238
|
+
this.deps.db.query.gameDeployments.findFirst({
|
|
32239
|
+
where: activeDeploymentWhere(game2.id, "dashboard"),
|
|
32240
|
+
columns: { url: true, deployedAt: true }
|
|
32241
|
+
}),
|
|
32242
|
+
findLastSuccessfulDeployWithEmail(this.deps.db, game2.id),
|
|
32243
|
+
this.deps.db.query.gameDeployJobs.findFirst({
|
|
32244
|
+
where: and(eq(gameDeployJobs.gameId, game2.id), eq(gameDeployJobs.status, "failed")),
|
|
32245
|
+
orderBy: desc(deployJobInstant()),
|
|
32246
|
+
columns: { events: true }
|
|
32247
|
+
})
|
|
32248
|
+
]);
|
|
32249
|
+
const [secrets, appliedMigrations] = await Promise.all([
|
|
32250
|
+
this.partitionSecretKeys(slug, state?.secretsManifest ?? null),
|
|
32251
|
+
this.readAppliedMigrations(slug, gameDeployment?.resources ?? null)
|
|
32252
|
+
]);
|
|
32253
|
+
setAttributes({
|
|
32254
|
+
"app.deployment_state.seeded": Boolean(state),
|
|
32255
|
+
"app.deployment_state.game_deployed": Boolean(gameDeployment),
|
|
32256
|
+
"app.deployment_state.dashboard_deployed": Boolean(dashboardDeployment)
|
|
32257
|
+
});
|
|
32258
|
+
return {
|
|
32259
|
+
gameId: game2.id,
|
|
32260
|
+
seeded: Boolean(state),
|
|
32261
|
+
game: gameDeployment ? {
|
|
32262
|
+
codeHash: gameDeployment.codeHash,
|
|
32263
|
+
buildHash: state?.buildHash ?? null,
|
|
32264
|
+
url: gameDeployment.url,
|
|
32265
|
+
deployedAt: gameDeployment.deployedAt.toISOString()
|
|
32266
|
+
} : null,
|
|
32267
|
+
dashboard: dashboardDeployment ? {
|
|
32268
|
+
url: dashboardDeployment.url,
|
|
32269
|
+
deployedAt: dashboardDeployment.deployedAt.toISOString()
|
|
32270
|
+
} : null,
|
|
32271
|
+
database: {
|
|
32272
|
+
appliedMigrations,
|
|
32273
|
+
lastFailure: parseMigrationFailure(lastFailedJob?.events ?? null),
|
|
32274
|
+
schemaHash: state?.schemaHash ?? null,
|
|
32275
|
+
schemaFingerprint: state?.schemaFingerprint ?? null,
|
|
32276
|
+
...options.includeSchemaSnapshot && {
|
|
32277
|
+
schemaSnapshot: state?.schemaSnapshot ?? null
|
|
32278
|
+
}
|
|
32279
|
+
},
|
|
32280
|
+
secrets,
|
|
32281
|
+
integrationsHash: state?.integrationsHash ?? null,
|
|
32282
|
+
compatibilityDate: state?.compatibilityDate ?? null,
|
|
32283
|
+
lastDeploy: lastSucceededJob ? {
|
|
32284
|
+
at: lastSucceededJob.at.toISOString(),
|
|
32285
|
+
by: lastSucceededJob.email ?? DELETED_ACCOUNT_LABEL
|
|
32286
|
+
} : null
|
|
32287
|
+
};
|
|
32288
|
+
}
|
|
32289
|
+
requireCloudflare() {
|
|
32290
|
+
if (!this.deps.cloudflare) {
|
|
32291
|
+
throw new ValidationError("Deployment-state operations are not available in this environment");
|
|
32292
|
+
}
|
|
32293
|
+
return this.deps.cloudflare;
|
|
32294
|
+
}
|
|
32295
|
+
async resolveDatabaseId(slug, gameId) {
|
|
32296
|
+
const databaseId = await this.findDatabaseId(slug, gameId);
|
|
32297
|
+
if (!databaseId) {
|
|
32298
|
+
throw new ValidationError("Game has no deployed database — deploy with a database binding first");
|
|
32299
|
+
}
|
|
32300
|
+
return databaseId;
|
|
32301
|
+
}
|
|
32302
|
+
findSchemaHashState(gameId) {
|
|
32303
|
+
return this.deps.db.query.gameDeploymentState.findFirst({
|
|
32304
|
+
where: eq(gameDeploymentState.gameId, gameId),
|
|
32305
|
+
columns: { schemaHash: true }
|
|
32306
|
+
});
|
|
32307
|
+
}
|
|
32308
|
+
async findDatabaseId(slug, gameId) {
|
|
32309
|
+
const deployment = await this.deps.db.query.gameDeployments.findFirst({
|
|
32310
|
+
where: activeDeploymentWhere(gameId, "game"),
|
|
32311
|
+
columns: { resources: true }
|
|
32312
|
+
});
|
|
32313
|
+
return databaseIdFromResources(deployment?.resources, getGameDeploymentId(slug, this.deps.config.sstStage));
|
|
32314
|
+
}
|
|
32315
|
+
async baseline(slug, input, user) {
|
|
32316
|
+
const game2 = await this.deps.validateDeveloperAccessBySlug(user, slug);
|
|
32317
|
+
const cf = this.requireCloudflare();
|
|
32318
|
+
const state = await this.deps.db.query.gameDeploymentState.findFirst({
|
|
32319
|
+
where: eq(gameDeploymentState.gameId, game2.id)
|
|
32320
|
+
});
|
|
32321
|
+
const schemaAdopted = isSchemaAdopted(state);
|
|
32322
|
+
const migrateOnlyClaim = Boolean(input.lastAppliedMigrationTag) && input.schemaHash === undefined && input.schemaSnapshot === undefined;
|
|
32323
|
+
if (schemaAdopted && !migrateOnlyClaim) {
|
|
32324
|
+
throw new BaselineAlreadyAdoptedError(state?.baselineSource ?? null);
|
|
32325
|
+
}
|
|
32326
|
+
const databaseId = await this.resolveDatabaseId(slug, game2.id);
|
|
32327
|
+
const [ledger, live] = await Promise.all([
|
|
32328
|
+
cf.d1.readMigrationLedger(databaseId),
|
|
32329
|
+
cf.d1.fingerprintSchema(databaseId)
|
|
32330
|
+
]);
|
|
32331
|
+
const verdict = evaluateBaselineGuardrails({
|
|
32332
|
+
ledgerTags: ledger.map((row) => row.tag),
|
|
32333
|
+
liveTables: live.tables
|
|
32334
|
+
});
|
|
32335
|
+
if (verdict === "ledger-not-empty") {
|
|
32336
|
+
throw new BaselineLedgerNotEmptyError(ledger.map((row) => row.tag));
|
|
32337
|
+
}
|
|
32338
|
+
if (verdict === "database-empty") {
|
|
32339
|
+
throw new BaselineDatabaseEmptyError;
|
|
32340
|
+
}
|
|
32341
|
+
if (schemaAdopted && state?.schemaFingerprint && live.fingerprint !== state.schemaFingerprint) {
|
|
32342
|
+
throw new DeploymentStateDriftError({
|
|
32343
|
+
expectedFingerprint: state.schemaFingerprint,
|
|
32344
|
+
actualFingerprint: live.fingerprint
|
|
32345
|
+
});
|
|
32346
|
+
}
|
|
32347
|
+
if (input.lastAppliedMigrationTag && input.evidence?.length) {
|
|
32348
|
+
const [tables, lastDeploy] = await Promise.all([
|
|
32349
|
+
cf.d1.readTableColumns(databaseId, live.tables),
|
|
32350
|
+
findLastSuccessfulDeploy(this.deps.db, game2.id)
|
|
32351
|
+
]);
|
|
32352
|
+
assertBaselineClaimValid({
|
|
32353
|
+
claimedTag: input.lastAppliedMigrationTag,
|
|
32354
|
+
evidence: input.evidence,
|
|
32355
|
+
tables,
|
|
32356
|
+
indexes: new Set(live.indexes),
|
|
32357
|
+
views: new Set(live.views),
|
|
32358
|
+
lastDeployAt: lastDeploy?.at ?? null,
|
|
32359
|
+
allowUnverified: Boolean(input.allowUnverified),
|
|
32360
|
+
source: "manual",
|
|
32361
|
+
gameId: game2.id,
|
|
32362
|
+
userId: user.id
|
|
32363
|
+
});
|
|
32364
|
+
}
|
|
32365
|
+
let recordedTags = [];
|
|
32366
|
+
if (input.lastAppliedMigrationTag) {
|
|
32367
|
+
const slice = sliceJournalToTag(input.journal ?? [], input.lastAppliedMigrationTag);
|
|
32368
|
+
if (!slice) {
|
|
32369
|
+
throw new ValidationError(`lastAppliedMigrationTag '${input.lastAppliedMigrationTag}' is not in the ` + "submitted journal");
|
|
32370
|
+
}
|
|
32371
|
+
await cf.d1.ensureMigrationLedger(databaseId);
|
|
32372
|
+
await cf.d1.recordLedgerRows(databaseId, {
|
|
32373
|
+
rows: slice,
|
|
32374
|
+
deployId: `baseline:${crypto.randomUUID()}`,
|
|
32375
|
+
appliedBy: user.id,
|
|
32376
|
+
source: "baseline"
|
|
32377
|
+
});
|
|
32378
|
+
recordedTags = slice.map((entry) => entry.tag);
|
|
32379
|
+
}
|
|
32380
|
+
const graduating = migrateOnlyClaim && isPushAdopted(state);
|
|
32381
|
+
const set = {
|
|
32382
|
+
...graduating ? { schemaHash: null, schemaSnapshot: null } : {
|
|
32383
|
+
...input.schemaHash !== undefined && { schemaHash: input.schemaHash },
|
|
32384
|
+
...input.schemaSnapshot !== undefined && {
|
|
32385
|
+
schemaSnapshot: input.schemaSnapshot
|
|
32386
|
+
}
|
|
32387
|
+
},
|
|
32388
|
+
schemaFingerprint: live.fingerprint,
|
|
32389
|
+
baselineSource: "manual-baseline",
|
|
32390
|
+
updatedAt: new Date
|
|
32391
|
+
};
|
|
32392
|
+
await this.persistDeploymentState(game2.id, set);
|
|
32393
|
+
addEvent("deployment_state.baseline_recorded", {
|
|
32394
|
+
"app.game.id": game2.id,
|
|
32395
|
+
"app.deployment_state.baseline_source": "manual-baseline",
|
|
32396
|
+
"app.deployment_state.baseline_ledger_rows": recordedTags.length,
|
|
32397
|
+
"app.deployment_state.baseline_has_snapshot": input.schemaSnapshot !== undefined,
|
|
32398
|
+
"app.deployment_state.baseline_graduated_from_push": graduating
|
|
32399
|
+
});
|
|
32400
|
+
return this.get(slug, user);
|
|
32401
|
+
}
|
|
32402
|
+
async realignMigration(slug, tag, checksum, user) {
|
|
32403
|
+
const game2 = await this.deps.validateDeveloperAccessBySlug(user, slug);
|
|
32404
|
+
const cf = this.requireCloudflare();
|
|
32405
|
+
const databaseId = await this.resolveDatabaseId(slug, game2.id);
|
|
32406
|
+
const ledger = await cf.d1.readMigrationLedger(databaseId);
|
|
32407
|
+
if (!ledger.some((row) => row.tag === tag)) {
|
|
32408
|
+
throw new NotFoundError("Applied migration", tag);
|
|
32409
|
+
}
|
|
32410
|
+
const updated = await cf.d1.updateLedgerChecksum(databaseId, { tag, checksum });
|
|
32411
|
+
if (!updated) {
|
|
32412
|
+
throw new NotFoundError("Applied migration", tag);
|
|
32413
|
+
}
|
|
32414
|
+
addEvent("deployment_state.migration_realigned", {
|
|
32415
|
+
"app.game.id": game2.id,
|
|
32416
|
+
"app.d1.migration_tag": tag,
|
|
32417
|
+
"app.user.id": user.id
|
|
32418
|
+
});
|
|
32419
|
+
return { tag, checksum, checksumAlgo: MIGRATION_CHECKSUM_ALGO };
|
|
32420
|
+
}
|
|
32421
|
+
async persistDeploymentState(gameId, set) {
|
|
32422
|
+
await this.deps.db.insert(gameDeploymentState).values({ gameId, ...set }).onConflictDoUpdate({ target: gameDeploymentState.gameId, set });
|
|
32423
|
+
}
|
|
32424
|
+
async updateDeploymentState(gameId, set) {
|
|
32425
|
+
const updated = await this.deps.db.update(gameDeploymentState).set(set).where(eq(gameDeploymentState.gameId, gameId)).returning({ gameId: gameDeploymentState.gameId });
|
|
32426
|
+
return updated.length > 0;
|
|
32427
|
+
}
|
|
32428
|
+
async resolveMigration(slug, tag, input, user) {
|
|
32429
|
+
const game2 = await this.deps.validateDeveloperAccessBySlug(user, slug);
|
|
32430
|
+
const cf = this.requireCloudflare();
|
|
32431
|
+
const databaseId = await this.resolveDatabaseId(slug, game2.id);
|
|
32432
|
+
const [ledger, live] = await Promise.all([
|
|
32433
|
+
cf.d1.readMigrationLedger(databaseId),
|
|
32434
|
+
cf.d1.fingerprintSchema(databaseId)
|
|
32435
|
+
]);
|
|
32436
|
+
const exists2 = ledger.some((row) => row.tag === tag);
|
|
32437
|
+
if (input.resolution === "applied") {
|
|
32438
|
+
if (!input.checksum) {
|
|
32439
|
+
throw new ValidationError("Resolving a migration as 'applied' requires its checksum");
|
|
32440
|
+
}
|
|
32441
|
+
if (exists2) {
|
|
32442
|
+
throw new AlreadyExistsError(`Migration '${tag}' is already recorded as applied`);
|
|
32443
|
+
}
|
|
32444
|
+
await cf.d1.ensureMigrationLedger(databaseId);
|
|
32445
|
+
await cf.d1.recordLedgerRows(databaseId, {
|
|
32446
|
+
rows: [{ tag, checksum: input.checksum }],
|
|
32447
|
+
deployId: `resolve:${crypto.randomUUID()}`,
|
|
32448
|
+
appliedBy: user.id,
|
|
32449
|
+
source: "resolve"
|
|
32450
|
+
});
|
|
32451
|
+
} else {
|
|
32452
|
+
if (!exists2) {
|
|
32453
|
+
throw new NotFoundError("Migration ledger row", tag);
|
|
32454
|
+
}
|
|
32455
|
+
await cf.d1.deleteLedgerRow(databaseId, tag);
|
|
32456
|
+
}
|
|
32457
|
+
const fingerprintRecorded = await this.updateDeploymentState(game2.id, {
|
|
32458
|
+
schemaFingerprint: live.fingerprint,
|
|
32459
|
+
updatedAt: new Date
|
|
32460
|
+
});
|
|
32461
|
+
addEvent("deployment_state.migration_resolved", {
|
|
32462
|
+
"app.game.id": game2.id,
|
|
32463
|
+
"app.d1.migration_tag": tag,
|
|
32464
|
+
"app.deployment_state.resolution": input.resolution,
|
|
32465
|
+
"app.deployment_state.fingerprint_rerecorded": fingerprintRecorded,
|
|
32466
|
+
"app.user.id": user.id
|
|
32467
|
+
});
|
|
32468
|
+
return {
|
|
32469
|
+
tag,
|
|
32470
|
+
resolution: input.resolution,
|
|
32471
|
+
schemaFingerprint: live.fingerprint,
|
|
32472
|
+
fingerprintRecorded
|
|
32473
|
+
};
|
|
32474
|
+
}
|
|
32475
|
+
async history(slug, user, options = {}) {
|
|
32476
|
+
const game2 = await this.deps.validateDeveloperAccessBySlug(user, slug);
|
|
32477
|
+
const limit = options.limit ?? 20;
|
|
32478
|
+
const [jobs, events] = await Promise.all([
|
|
32479
|
+
this.deps.db.select({
|
|
32480
|
+
status: gameDeployJobs.status,
|
|
32481
|
+
createdAt: gameDeployJobs.createdAt,
|
|
32482
|
+
completedAt: gameDeployJobs.completedAt,
|
|
32483
|
+
deployId: gameDeployJobs.deployId,
|
|
32484
|
+
error: gameDeployJobs.error,
|
|
32485
|
+
email: users.email
|
|
32486
|
+
}).from(gameDeployJobs).leftJoin(users, eq(gameDeployJobs.userId, users.id)).where(eq(gameDeployJobs.gameId, game2.id)).orderBy(desc(deployJobInstant())).limit(limit),
|
|
32487
|
+
this.deps.db.select({
|
|
32488
|
+
kind: gameDeployEvents.kind,
|
|
32489
|
+
payload: gameDeployEvents.payload,
|
|
32490
|
+
createdAt: gameDeployEvents.createdAt,
|
|
32491
|
+
email: users.email
|
|
32492
|
+
}).from(gameDeployEvents).leftJoin(users, eq(gameDeployEvents.userId, users.id)).where(eq(gameDeployEvents.gameId, game2.id)).orderBy(desc(gameDeployEvents.createdAt)).limit(limit)
|
|
32493
|
+
]);
|
|
32494
|
+
setAttributes({
|
|
32495
|
+
"app.deployment_state.history_jobs": jobs.length,
|
|
32496
|
+
"app.deployment_state.history_events": events.length
|
|
32497
|
+
});
|
|
32498
|
+
const deploys = jobs.map((job) => ({
|
|
32499
|
+
kind: "deploy",
|
|
32500
|
+
status: job.status,
|
|
32501
|
+
at: (job.completedAt ?? job.createdAt).toISOString(),
|
|
32502
|
+
completedAt: job.completedAt?.toISOString() ?? null,
|
|
32503
|
+
by: job.email ?? DELETED_ACCOUNT_LABEL,
|
|
32504
|
+
deployId: job.deployId,
|
|
32505
|
+
error: job.error
|
|
32506
|
+
}));
|
|
32507
|
+
const merged = [...deploys, ...events.flatMap(historyEventEntry)].toSorted((a, b) => a.at < b.at ? 1 : -1).slice(0, limit);
|
|
32508
|
+
return { deploys: merged };
|
|
32509
|
+
}
|
|
32510
|
+
async restorePoints(slug, user) {
|
|
32511
|
+
const game2 = await this.deps.validateDeveloperAccessBySlug(user, slug);
|
|
32512
|
+
const retentionCutoff = new Date(Date.now() - D1_TIME_TRAVEL_RETENTION_DAYS * 24 * 60 * 60 * 1000);
|
|
32513
|
+
const [currentDatabaseId, rows, state] = await Promise.all([
|
|
32514
|
+
this.findDatabaseId(slug, game2.id),
|
|
32515
|
+
this.deps.db.query.gameDeployments.findMany({
|
|
32516
|
+
where: and(eq(gameDeployments.gameId, game2.id), eq(gameDeployments.target, "game"), isNotNull(gameDeployments.timeTravelBookmark), gte(gameDeployments.deployedAt, retentionCutoff)),
|
|
32517
|
+
orderBy: desc(gameDeployments.deployedAt),
|
|
32518
|
+
limit: 100,
|
|
32519
|
+
columns: {
|
|
32520
|
+
id: true,
|
|
32521
|
+
deployedAt: true,
|
|
32522
|
+
bookmarkCapturedAt: true,
|
|
32523
|
+
isActive: true,
|
|
32524
|
+
resources: true
|
|
32525
|
+
}
|
|
32526
|
+
}),
|
|
32527
|
+
this.findSchemaHashState(game2.id)
|
|
32528
|
+
]);
|
|
32529
|
+
if (isPushAdopted(state)) {
|
|
32530
|
+
return { restorePoints: [], restoreUnsupported: true };
|
|
32531
|
+
}
|
|
32532
|
+
if (!currentDatabaseId) {
|
|
32533
|
+
return { restorePoints: [], restoreUnsupported: false };
|
|
32534
|
+
}
|
|
32535
|
+
const deploymentId = getGameDeploymentId(slug, this.deps.config.sstStage);
|
|
32536
|
+
const restorable = rows.filter((row) => databaseIdFromResources(row.resources, deploymentId) === currentDatabaseId && restorePointCapturedAt(row) >= retentionCutoff).slice(0, 20);
|
|
32537
|
+
setAttributes({ "app.deployment_state.restore_points": restorable.length });
|
|
32538
|
+
return {
|
|
32539
|
+
restorePoints: restorable.map((row) => ({
|
|
32540
|
+
id: row.id,
|
|
32541
|
+
capturedAt: restorePointCapturedAt(row).toISOString(),
|
|
32542
|
+
active: row.isActive
|
|
32543
|
+
})),
|
|
32544
|
+
restoreUnsupported: false
|
|
32545
|
+
};
|
|
32546
|
+
}
|
|
32547
|
+
async restoreToBookmark(slug, input, user) {
|
|
32548
|
+
const game2 = await this.deps.validateDeveloperAccessBySlug(user, slug);
|
|
32549
|
+
const cf = this.requireCloudflare();
|
|
32550
|
+
const [row, state, currentDatabaseId, runningJob] = await Promise.all([
|
|
32551
|
+
this.deps.db.query.gameDeployments.findFirst({
|
|
32552
|
+
where: and(eq(gameDeployments.id, input.restorePointId), eq(gameDeployments.gameId, game2.id), eq(gameDeployments.target, "game")),
|
|
32553
|
+
columns: {
|
|
32554
|
+
id: true,
|
|
32555
|
+
timeTravelBookmark: true,
|
|
32556
|
+
deployedAt: true,
|
|
32557
|
+
bookmarkCapturedAt: true,
|
|
32558
|
+
resources: true
|
|
32559
|
+
}
|
|
32560
|
+
}),
|
|
32561
|
+
this.findSchemaHashState(game2.id),
|
|
32562
|
+
this.findDatabaseId(slug, game2.id),
|
|
32563
|
+
this.deps.db.query.gameDeployJobs.findFirst({
|
|
32564
|
+
where: and(eq(gameDeployJobs.gameId, game2.id), or(eq(gameDeployJobs.status, "pending"), and(eq(gameDeployJobs.status, "running"), gt(gameDeployJobs.leaseExpiresAt, new Date)))),
|
|
32565
|
+
columns: { id: true }
|
|
32566
|
+
})
|
|
32567
|
+
]);
|
|
32568
|
+
if (!row?.timeTravelBookmark) {
|
|
32569
|
+
throw new NotFoundError("Bookmark", input.restorePointId);
|
|
32570
|
+
}
|
|
32571
|
+
if (isPushAdopted(state)) {
|
|
32572
|
+
throw new ValidationError("Restore is not supported for push-mode projects: rewinding the " + "database would leave future push deploys diffing against the " + "wrong schema.", { code: DEPLOY_ERROR_CODES.restoreUnsupported });
|
|
32573
|
+
}
|
|
32574
|
+
if (!currentDatabaseId) {
|
|
32575
|
+
throw new ValidationError("Game has no deployed database — deploy with a database binding first");
|
|
32576
|
+
}
|
|
32577
|
+
const databaseId = currentDatabaseId;
|
|
32578
|
+
const deploymentId = getGameDeploymentId(slug, this.deps.config.sstStage);
|
|
32579
|
+
if (databaseIdFromResources(row.resources, deploymentId) !== databaseId) {
|
|
32580
|
+
throw new ValidationError("This bookmark was captured on a previous database (a reset replaced " + "it since) and can no longer be restored");
|
|
32581
|
+
}
|
|
32582
|
+
const retentionCutoff = new Date(Date.now() - D1_TIME_TRAVEL_RETENTION_DAYS * 24 * 60 * 60 * 1000);
|
|
32583
|
+
if (restorePointCapturedAt(row) < retentionCutoff) {
|
|
32584
|
+
throw new ValidationError(`This bookmark is older than Time Travel's ${D1_TIME_TRAVEL_RETENTION_DAYS}-day ` + "retention window and can no longer be restored.", { code: DEPLOY_ERROR_CODES.restoreExpired });
|
|
32585
|
+
}
|
|
32586
|
+
if (runningJob) {
|
|
32587
|
+
throw new ValidationError("A deploy is currently running for this game. Wait for it to finish, " + "then restore.", { code: DEPLOY_ERROR_CODES.restoreBlockedByDeploy });
|
|
32588
|
+
}
|
|
32589
|
+
const restored = await cf.d1.restoreBookmark(databaseId, row.timeTravelBookmark);
|
|
32590
|
+
const restoredTo = restorePointCapturedAt(row).toISOString();
|
|
32591
|
+
let live;
|
|
32592
|
+
let fingerprintRecorded;
|
|
32593
|
+
try {
|
|
32594
|
+
live = await cf.d1.fingerprintSchema(databaseId);
|
|
32595
|
+
fingerprintRecorded = await this.updateDeploymentState(game2.id, {
|
|
32596
|
+
schemaFingerprint: live.fingerprint,
|
|
32597
|
+
updatedAt: new Date
|
|
32598
|
+
});
|
|
32599
|
+
await this.deps.db.insert(gameDeployEvents).values({
|
|
32600
|
+
gameId: game2.id,
|
|
32601
|
+
userId: user.id,
|
|
32602
|
+
kind: "restore",
|
|
32603
|
+
payload: { restoredTo, previousBookmark: restored.previousBookmark }
|
|
32604
|
+
});
|
|
32605
|
+
} catch (error) {
|
|
32606
|
+
throw new ValidationError("The database WAS restored, but re-recording its schema " + `fingerprint failed (${errorMessage(error)}). Run the same ` + "restore again to complete it.", { code: DEPLOY_ERROR_CODES.restoreIncomplete });
|
|
32607
|
+
}
|
|
32608
|
+
addEvent("deployment_state.bookmark_restored", {
|
|
32609
|
+
"app.game.id": game2.id,
|
|
32610
|
+
"app.deployment_state.restore_point": row.id,
|
|
32611
|
+
"app.deployment_state.fingerprint_rerecorded": fingerprintRecorded,
|
|
32612
|
+
"app.user.id": user.id
|
|
32613
|
+
});
|
|
32614
|
+
return {
|
|
32615
|
+
restorePointId: row.id,
|
|
32616
|
+
restoredTo,
|
|
32617
|
+
schemaFingerprint: live.fingerprint,
|
|
32618
|
+
fingerprintRecorded,
|
|
32619
|
+
previousBookmark: restored.previousBookmark
|
|
32620
|
+
};
|
|
32621
|
+
}
|
|
32622
|
+
async reportDeployBlocked(slug, user, report) {
|
|
32623
|
+
const game2 = await this.deps.validateDeveloperAccessBySlug(user, slug);
|
|
32624
|
+
const recent = await this.deps.db.query.gameDeployEvents.findMany({
|
|
32625
|
+
where: and(eq(gameDeployEvents.gameId, game2.id), eq(gameDeployEvents.kind, "blocked"), gt(gameDeployEvents.createdAt, new Date(Date.now() - BLOCKED_ALERT_DEDUP_MS))),
|
|
32626
|
+
orderBy: desc(gameDeployEvents.createdAt),
|
|
32627
|
+
limit: 10,
|
|
32628
|
+
columns: { payload: true }
|
|
32629
|
+
});
|
|
32630
|
+
const duplicate = recent.some((event) => ("code" in event.payload) && event.payload.code === report.code);
|
|
32631
|
+
await this.deps.db.insert(gameDeployEvents).values({
|
|
32632
|
+
gameId: game2.id,
|
|
32633
|
+
userId: user.id,
|
|
32634
|
+
kind: "blocked",
|
|
32635
|
+
payload: { code: report.code, reason: report.reason }
|
|
32636
|
+
});
|
|
32637
|
+
addEvent("deployment_state.deploy_blocked", {
|
|
32638
|
+
"app.game.id": game2.id,
|
|
32639
|
+
"app.deploy.blocked_code": report.code,
|
|
32640
|
+
"app.user.id": user.id,
|
|
32641
|
+
"app.alerts.deduped": duplicate
|
|
32642
|
+
});
|
|
32643
|
+
if (!duplicate) {
|
|
32644
|
+
await this.deps.alerts.notifyDeployBlocked({
|
|
32645
|
+
slug,
|
|
32646
|
+
displayName: game2.displayName,
|
|
32647
|
+
reason: report.reason,
|
|
32648
|
+
developer: { id: user.id, email: user.email ?? null }
|
|
32649
|
+
});
|
|
32650
|
+
}
|
|
32651
|
+
}
|
|
32652
|
+
}
|
|
32653
|
+
var BLOCKED_ALERT_DEDUP_MS;
|
|
32654
|
+
var init_deployment_state_service = __esm(() => {
|
|
32655
|
+
init_drizzle_orm();
|
|
32656
|
+
init_src4();
|
|
32657
|
+
init_src();
|
|
32658
|
+
init_helpers_index();
|
|
32659
|
+
init_tables_index();
|
|
32660
|
+
init_spans();
|
|
32661
|
+
init_game2();
|
|
32662
|
+
init_errors();
|
|
32663
|
+
init_baseline_validation_util();
|
|
32664
|
+
init_deployment_util();
|
|
32665
|
+
init_migration_util();
|
|
32666
|
+
init_secrets_util();
|
|
32667
|
+
BLOCKED_ALERT_DEDUP_MS = 10 * 60 * 1000;
|
|
32668
|
+
});
|
|
32669
|
+
|
|
30543
32670
|
// ../api-core/src/services/domain.service.ts
|
|
30544
32671
|
class DomainService {
|
|
30545
32672
|
deps;
|
|
@@ -30906,6 +33033,7 @@ var init_kv_service = __esm(() => {
|
|
|
30906
33033
|
// ../api-core/src/services/secrets.service.ts
|
|
30907
33034
|
class SecretsService {
|
|
30908
33035
|
deps;
|
|
33036
|
+
pepperPromise = null;
|
|
30909
33037
|
constructor(deps) {
|
|
30910
33038
|
this.deps = deps;
|
|
30911
33039
|
}
|
|
@@ -30918,36 +33046,69 @@ class SecretsService {
|
|
|
30918
33046
|
getGameDeploymentId(slug) {
|
|
30919
33047
|
return getGameDeploymentId(slug, this.deps.config.sstStage);
|
|
30920
33048
|
}
|
|
30921
|
-
|
|
30922
|
-
|
|
30923
|
-
|
|
30924
|
-
|
|
30925
|
-
|
|
30926
|
-
|
|
30927
|
-
|
|
30928
|
-
|
|
30929
|
-
|
|
30930
|
-
|
|
30931
|
-
|
|
30932
|
-
|
|
30933
|
-
|
|
30934
|
-
}
|
|
30935
|
-
|
|
30936
|
-
|
|
33049
|
+
getPepper() {
|
|
33050
|
+
const pepperSecret = this.deps.config.secretsManifestPepper;
|
|
33051
|
+
if (!pepperSecret) {
|
|
33052
|
+
throw new ValidationError("Secrets manifest is not configured (missing manifest pepper secret)");
|
|
33053
|
+
}
|
|
33054
|
+
this.pepperPromise ??= deriveSecretsManifestPepper(pepperSecret);
|
|
33055
|
+
return this.pepperPromise;
|
|
33056
|
+
}
|
|
33057
|
+
async computeManifestEntries(gameId, secrets) {
|
|
33058
|
+
const pepper = await this.getPepper();
|
|
33059
|
+
const entries = {};
|
|
33060
|
+
for (const [key, value] of Object.entries(secrets)) {
|
|
33061
|
+
entries[key] = await computeSecretDigest(pepper, { gameId, key, value });
|
|
33062
|
+
}
|
|
33063
|
+
return entries;
|
|
33064
|
+
}
|
|
33065
|
+
async readManifest(gameId) {
|
|
33066
|
+
const state = await this.deps.db.query.gameDeploymentState.findFirst({
|
|
33067
|
+
where: eq(gameDeploymentState.gameId, gameId),
|
|
33068
|
+
columns: { secretsManifest: true }
|
|
33069
|
+
});
|
|
33070
|
+
return state?.secretsManifest ?? {};
|
|
33071
|
+
}
|
|
33072
|
+
async upsertManifestEntries(gameId, entries) {
|
|
33073
|
+
const merged = sql`coalesce(${gameDeploymentState.secretsManifest}, '{}'::jsonb) || ${JSON.stringify(entries)}::jsonb`;
|
|
33074
|
+
await this.deps.db.insert(gameDeploymentState).values({ gameId, secretsManifest: entries, updatedAt: new Date }).onConflictDoUpdate({
|
|
33075
|
+
target: gameDeploymentState.gameId,
|
|
33076
|
+
set: { secretsManifest: merged, updatedAt: new Date }
|
|
33077
|
+
});
|
|
33078
|
+
}
|
|
33079
|
+
async removeManifestKey(gameId, key) {
|
|
33080
|
+
await this.deps.db.update(gameDeploymentState).set({
|
|
33081
|
+
secretsManifest: sql`coalesce(${gameDeploymentState.secretsManifest}, '{}'::jsonb) - ${key}::text`,
|
|
33082
|
+
updatedAt: new Date
|
|
33083
|
+
}).where(eq(gameDeploymentState.gameId, gameId));
|
|
33084
|
+
}
|
|
33085
|
+
assertNoReservedKeys(keys, operation) {
|
|
33086
|
+
for (const key of keys) {
|
|
33087
|
+
if (INTERNAL_SECRET_KEYS.includes(key)) {
|
|
30937
33088
|
setAttributes({
|
|
30938
|
-
"app.secrets.operation":
|
|
30939
|
-
"app.secrets.
|
|
30940
|
-
"app.secrets.game_deployed": false
|
|
33089
|
+
"app.secrets.operation": operation,
|
|
33090
|
+
"app.secrets.reserved_key_rejected": true
|
|
30941
33091
|
});
|
|
30942
|
-
|
|
33092
|
+
throw new ValidationError(operation === "set" ? `Cannot set reserved secret "${key}"` : `Reserved secret "${key}" cannot be managed — remove it locally`);
|
|
30943
33093
|
}
|
|
30944
|
-
throw error;
|
|
30945
33094
|
}
|
|
30946
33095
|
}
|
|
30947
|
-
async
|
|
33096
|
+
async listKeys(slug, user) {
|
|
30948
33097
|
await this.deps.validateDeveloperAccessBySlug(user, slug);
|
|
30949
33098
|
const cf = this.getCloudflare();
|
|
30950
33099
|
const deploymentId = this.getGameDeploymentId(slug);
|
|
33100
|
+
const userKeys = await listUserSecretKeys(cf, deploymentId);
|
|
33101
|
+
setAttributes({
|
|
33102
|
+
"app.secrets.operation": "list",
|
|
33103
|
+
"app.secrets.count": userKeys?.length ?? 0,
|
|
33104
|
+
"app.secrets.game_deployed": userKeys !== null
|
|
33105
|
+
});
|
|
33106
|
+
return userKeys ?? [];
|
|
33107
|
+
}
|
|
33108
|
+
async setSecrets(slug, newSecrets, user) {
|
|
33109
|
+
const game2 = await this.deps.validateDeveloperAccessBySlug(user, slug);
|
|
33110
|
+
const cf = this.getCloudflare();
|
|
33111
|
+
const deploymentId = this.getGameDeploymentId(slug);
|
|
30951
33112
|
const secretKeys = Object.keys(newSecrets);
|
|
30952
33113
|
if (secretKeys.length === 0) {
|
|
30953
33114
|
throw new ValidationError("At least one secret must be provided");
|
|
@@ -30956,14 +33117,9 @@ class SecretsService {
|
|
|
30956
33117
|
if (typeof value !== "string") {
|
|
30957
33118
|
throw new ValidationError(`Secret value for "${key}" must be a string`);
|
|
30958
33119
|
}
|
|
30959
|
-
if (INTERNAL_SECRET_KEYS.includes(key)) {
|
|
30960
|
-
setAttributes({
|
|
30961
|
-
"app.secrets.operation": "set",
|
|
30962
|
-
"app.secrets.reserved_key_rejected": true
|
|
30963
|
-
});
|
|
30964
|
-
throw new ValidationError(`Cannot set reserved secret "${key}"`);
|
|
30965
|
-
}
|
|
30966
33120
|
}
|
|
33121
|
+
this.assertNoReservedKeys(secretKeys, "set");
|
|
33122
|
+
const manifestEntries = await this.computeManifestEntries(game2.id, newSecrets);
|
|
30967
33123
|
try {
|
|
30968
33124
|
const prefixedSecrets = {};
|
|
30969
33125
|
for (const [key, value] of Object.entries(newSecrets)) {
|
|
@@ -30976,8 +33132,6 @@ class SecretsService {
|
|
|
30976
33132
|
"app.secrets.game_deployed": true,
|
|
30977
33133
|
"app.secrets.reserved_key_rejected": false
|
|
30978
33134
|
});
|
|
30979
|
-
const allKeys = await cf.listSecrets(deploymentId);
|
|
30980
|
-
return allKeys.filter((k) => k.startsWith(SECRETS_PREFIX)).map((k) => k.slice(SECRETS_PREFIX.length));
|
|
30981
33135
|
} catch (error) {
|
|
30982
33136
|
const message = errorMessage(error);
|
|
30983
33137
|
if (message.includes("not found") || message.includes("10007")) {
|
|
@@ -30989,6 +33143,9 @@ class SecretsService {
|
|
|
30989
33143
|
}
|
|
30990
33144
|
throw error;
|
|
30991
33145
|
}
|
|
33146
|
+
await this.upsertManifestEntries(game2.id, manifestEntries);
|
|
33147
|
+
const allKeys = await cf.listSecrets(deploymentId);
|
|
33148
|
+
return allKeys.filter((k) => k.startsWith(SECRETS_PREFIX)).map((k) => k.slice(SECRETS_PREFIX.length));
|
|
30992
33149
|
}
|
|
30993
33150
|
async deleteSecret(slug, key, user) {
|
|
30994
33151
|
if (INTERNAL_SECRET_KEYS.includes(key)) {
|
|
@@ -30998,19 +33155,25 @@ class SecretsService {
|
|
|
30998
33155
|
});
|
|
30999
33156
|
throw new ValidationError(`Cannot delete reserved secret "${key}"`);
|
|
31000
33157
|
}
|
|
31001
|
-
await this.deps.validateDeveloperAccessBySlug(user, slug);
|
|
33158
|
+
const game2 = await this.deps.validateDeveloperAccessBySlug(user, slug);
|
|
31002
33159
|
const cf = this.getCloudflare();
|
|
31003
33160
|
const deploymentId = this.getGameDeploymentId(slug);
|
|
33161
|
+
const manifest = await this.readManifest(game2.id);
|
|
33162
|
+
const managed = key in manifest;
|
|
31004
33163
|
try {
|
|
31005
33164
|
const prefixedKey = `${SECRETS_PREFIX}${key}`;
|
|
31006
33165
|
const existingKeys = await cf.listSecrets(deploymentId);
|
|
31007
|
-
|
|
33166
|
+
const onWorker = existingKeys.includes(prefixedKey);
|
|
33167
|
+
if (!onWorker && !managed) {
|
|
31008
33168
|
throw new NotFoundError("Secret", key);
|
|
31009
33169
|
}
|
|
31010
|
-
|
|
33170
|
+
if (onWorker) {
|
|
33171
|
+
await cf.deleteSecret(deploymentId, prefixedKey);
|
|
33172
|
+
}
|
|
31011
33173
|
setAttributes({
|
|
31012
33174
|
"app.secrets.operation": "delete",
|
|
31013
33175
|
"app.secrets.game_deployed": true,
|
|
33176
|
+
"app.secrets.managed": managed,
|
|
31014
33177
|
"app.secrets.reserved_key_rejected": false
|
|
31015
33178
|
});
|
|
31016
33179
|
} catch (error) {
|
|
@@ -31027,14 +33190,45 @@ class SecretsService {
|
|
|
31027
33190
|
}
|
|
31028
33191
|
throw error;
|
|
31029
33192
|
}
|
|
33193
|
+
if (managed) {
|
|
33194
|
+
await this.removeManifestKey(game2.id, key);
|
|
33195
|
+
}
|
|
33196
|
+
}
|
|
33197
|
+
async diff(slug, localSecrets, user) {
|
|
33198
|
+
const game2 = await this.deps.validateDeveloperAccessBySlug(user, slug);
|
|
33199
|
+
const deploymentId = this.getGameDeploymentId(slug);
|
|
33200
|
+
this.assertNoReservedKeys(Object.keys(localSecrets), "diff");
|
|
33201
|
+
const [manifest, remoteKeys, localDigests] = await Promise.all([
|
|
33202
|
+
this.readManifest(game2.id),
|
|
33203
|
+
this.deps.cloudflare ? listUserSecretKeys(this.deps.cloudflare, deploymentId) : null,
|
|
33204
|
+
this.computeManifestEntries(game2.id, localSecrets)
|
|
33205
|
+
]);
|
|
33206
|
+
const verdicts = computeSecretsDiff({
|
|
33207
|
+
localDigests,
|
|
33208
|
+
manifest,
|
|
33209
|
+
remoteKeys: remoteKeys ?? []
|
|
33210
|
+
});
|
|
33211
|
+
setAttributes({
|
|
33212
|
+
"app.secrets.operation": "diff",
|
|
33213
|
+
"app.secrets.game_deployed": remoteKeys !== null,
|
|
33214
|
+
"app.secrets.diff_added": verdicts.added.length,
|
|
33215
|
+
"app.secrets.diff_changed": verdicts.changed.length,
|
|
33216
|
+
"app.secrets.diff_unchanged": verdicts.unchanged.length,
|
|
33217
|
+
"app.secrets.diff_remote_only_managed": verdicts.remoteOnlyManaged.length,
|
|
33218
|
+
"app.secrets.diff_remote_only_unmanaged": verdicts.remoteOnlyUnmanaged.length
|
|
33219
|
+
});
|
|
33220
|
+
return verdicts;
|
|
31030
33221
|
}
|
|
31031
33222
|
}
|
|
31032
33223
|
var INTERNAL_SECRET_KEYS;
|
|
31033
33224
|
var init_secrets_service = __esm(() => {
|
|
33225
|
+
init_drizzle_orm();
|
|
31034
33226
|
init_src();
|
|
33227
|
+
init_tables_index();
|
|
31035
33228
|
init_spans();
|
|
31036
33229
|
init_errors();
|
|
31037
33230
|
init_deployment_util();
|
|
33231
|
+
init_secrets_util();
|
|
31038
33232
|
INTERNAL_SECRET_KEYS = ["PLAYCADEMY_API_KEY", "GAME_ID", "PLAYCADEMY_BASE_URL"];
|
|
31039
33233
|
});
|
|
31040
33234
|
// ../edge-play/src/game/setup.ts
|
|
@@ -31572,7 +33766,10 @@ var init_emoji = __esm(() => {
|
|
|
31572
33766
|
});
|
|
31573
33767
|
|
|
31574
33768
|
// ../data/src/domains/game/schemas.ts
|
|
31575
|
-
|
|
33769
|
+
function requestsBinding(binding) {
|
|
33770
|
+
return binding === true || Array.isArray(binding) && binding.length > 0;
|
|
33771
|
+
}
|
|
33772
|
+
var HttpUrlSchema, GameEmojiSchema, GameMetadataRecordSchema, InsertGameSchema, UpdateGameSchema, InsertGameDeploymentSchema, InsertGameDeployJobSchema, InsertGameDeploymentStateSchema, UpsertGameMetadataSchema, PatchGameMetadataSchema, AddGameMemberSchema, UpdateGameMemberRoleSchema, AddGameDashboardUserSchema, VerifyGameDashboardLoginSchema, AcceptGameDashboardInviteSchema, AcceptGameDashboardResetSchema, ALLOWED_UPLOAD_EXTENSIONS, InitiateUploadSchema, AddCustomHostnameSchema, SetSecretsRequestSchema, SecretsDiffRequestSchema, SeedRequestSchema, SchemaInfoSchema, VerifyTokenSchema, KVSeedRequestSchema, DeployMigrationSchema, DeployDatabaseSchema, DatabaseResetDatabaseSchema, DatabaseResetRequestSchema, BaselineEvidenceSchema, DeployBaselineSchema, DeploymentStateBaselineSchema, MigrationRealignSchema, MigrationResolveSchema, DatabaseRestoreSchema, DeployBlockedReportSchema, DeployRequestSchema;
|
|
31576
33773
|
var init_schemas2 = __esm(() => {
|
|
31577
33774
|
init_drizzle_zod();
|
|
31578
33775
|
init_esm();
|
|
@@ -31651,6 +33848,9 @@ var init_schemas2 = __esm(() => {
|
|
|
31651
33848
|
InsertGameDeployJobSchema = createInsertSchema(gameDeployJobs, {
|
|
31652
33849
|
status: exports_external.enum(deployJobStatusEnum.enumValues)
|
|
31653
33850
|
});
|
|
33851
|
+
InsertGameDeploymentStateSchema = createInsertSchema(gameDeploymentState, {
|
|
33852
|
+
secretsManifest: exports_external.record(exports_external.string(), exports_external.string()).nullable().optional()
|
|
33853
|
+
});
|
|
31654
33854
|
UpsertGameMetadataSchema = exports_external.object({
|
|
31655
33855
|
displayName: exports_external.string().min(1),
|
|
31656
33856
|
platform: exports_external.enum(gamePlatformEnum.enumValues),
|
|
@@ -31708,6 +33908,9 @@ var init_schemas2 = __esm(() => {
|
|
|
31708
33908
|
hostname: exports_external.string().min(1).max(255)
|
|
31709
33909
|
});
|
|
31710
33910
|
SetSecretsRequestSchema = exports_external.record(exports_external.string().min(1), exports_external.string());
|
|
33911
|
+
SecretsDiffRequestSchema = exports_external.object({
|
|
33912
|
+
secrets: exports_external.record(exports_external.string().min(1), exports_external.string())
|
|
33913
|
+
});
|
|
31711
33914
|
SeedRequestSchema = exports_external.object({
|
|
31712
33915
|
code: exports_external.string().min(1, "Seed code is required"),
|
|
31713
33916
|
secrets: exports_external.record(exports_external.string(), exports_external.string()).optional()
|
|
@@ -31716,9 +33919,6 @@ var init_schemas2 = __esm(() => {
|
|
|
31716
33919
|
sql: exports_external.string(),
|
|
31717
33920
|
hash: exports_external.string()
|
|
31718
33921
|
});
|
|
31719
|
-
DatabaseResetRequestSchema = exports_external.object({
|
|
31720
|
-
schema: SchemaInfoSchema.optional()
|
|
31721
|
-
});
|
|
31722
33922
|
VerifyTokenSchema = exports_external.object({
|
|
31723
33923
|
token: exports_external.string().min(1, "Token is required")
|
|
31724
33924
|
});
|
|
@@ -31730,8 +33930,119 @@ var init_schemas2 = __esm(() => {
|
|
|
31730
33930
|
metadata: exports_external.record(exports_external.unknown()).optional()
|
|
31731
33931
|
}))
|
|
31732
33932
|
});
|
|
33933
|
+
DeployMigrationSchema = exports_external.object({
|
|
33934
|
+
tag: exports_external.string().min(1),
|
|
33935
|
+
statements: exports_external.array(exports_external.string().min(1)).min(1),
|
|
33936
|
+
checksum: exports_external.string().min(1)
|
|
33937
|
+
});
|
|
33938
|
+
DeployDatabaseSchema = exports_external.discriminatedUnion("mode", [
|
|
33939
|
+
exports_external.object({
|
|
33940
|
+
mode: exports_external.literal("push"),
|
|
33941
|
+
sql: exports_external.string(),
|
|
33942
|
+
baselineHash: exports_external.string().nullable(),
|
|
33943
|
+
nextSnapshot: exports_external.record(exports_external.string(), exports_external.unknown()),
|
|
33944
|
+
nextHash: exports_external.string().min(1),
|
|
33945
|
+
acceptDataLoss: exports_external.boolean().optional()
|
|
33946
|
+
}),
|
|
33947
|
+
exports_external.object({
|
|
33948
|
+
mode: exports_external.literal("migrate"),
|
|
33949
|
+
migrations: exports_external.array(DeployMigrationSchema)
|
|
33950
|
+
})
|
|
33951
|
+
]);
|
|
33952
|
+
DatabaseResetDatabaseSchema = exports_external.discriminatedUnion("mode", [
|
|
33953
|
+
exports_external.object({
|
|
33954
|
+
mode: exports_external.literal("push"),
|
|
33955
|
+
sql: exports_external.string(),
|
|
33956
|
+
nextSnapshot: exports_external.record(exports_external.string(), exports_external.unknown()),
|
|
33957
|
+
nextHash: exports_external.string().min(1)
|
|
33958
|
+
}),
|
|
33959
|
+
exports_external.object({
|
|
33960
|
+
mode: exports_external.literal("migrate"),
|
|
33961
|
+
migrations: exports_external.array(DeployMigrationSchema)
|
|
33962
|
+
})
|
|
33963
|
+
]);
|
|
33964
|
+
DatabaseResetRequestSchema = exports_external.object({
|
|
33965
|
+
schema: SchemaInfoSchema.optional(),
|
|
33966
|
+
database: DatabaseResetDatabaseSchema.optional()
|
|
33967
|
+
}).refine((data) => !(data.schema && data.database), {
|
|
33968
|
+
message: "Send either the database payload or the legacy schema field, not both",
|
|
33969
|
+
path: ["database"]
|
|
33970
|
+
});
|
|
33971
|
+
BaselineEvidenceSchema = exports_external.array(exports_external.object({
|
|
33972
|
+
tag: exports_external.string().min(1),
|
|
33973
|
+
generatedAt: exports_external.string().min(1),
|
|
33974
|
+
createsTables: exports_external.array(exports_external.object({
|
|
33975
|
+
name: exports_external.string().min(1),
|
|
33976
|
+
columns: exports_external.array(exports_external.string())
|
|
33977
|
+
})),
|
|
33978
|
+
addsColumns: exports_external.array(exports_external.object({
|
|
33979
|
+
table: exports_external.string().min(1),
|
|
33980
|
+
column: exports_external.string().min(1)
|
|
33981
|
+
})),
|
|
33982
|
+
createsIndexes: exports_external.array(exports_external.string()),
|
|
33983
|
+
createsViews: exports_external.array(exports_external.string())
|
|
33984
|
+
})).optional();
|
|
33985
|
+
DeployBaselineSchema = exports_external.object({
|
|
33986
|
+
lastAppliedMigrationTag: exports_external.string().min(1).optional(),
|
|
33987
|
+
journal: exports_external.array(exports_external.object({
|
|
33988
|
+
tag: exports_external.string().min(1),
|
|
33989
|
+
checksum: exports_external.string().min(1)
|
|
33990
|
+
})).optional(),
|
|
33991
|
+
evidence: BaselineEvidenceSchema,
|
|
33992
|
+
schemaSnapshot: exports_external.unknown().optional(),
|
|
33993
|
+
schemaHash: exports_external.string().min(1).optional(),
|
|
33994
|
+
integrationsHash: exports_external.string().min(1).optional(),
|
|
33995
|
+
buildHash: exports_external.string().min(1).optional()
|
|
33996
|
+
}).refine((data) => !data.lastAppliedMigrationTag === !data.journal, {
|
|
33997
|
+
message: "lastAppliedMigrationTag and journal must be provided together",
|
|
33998
|
+
path: ["journal"]
|
|
33999
|
+
}).refine((data) => data.schemaSnapshot === undefined === !data.schemaHash, {
|
|
34000
|
+
message: "schemaSnapshot and schemaHash must be provided together",
|
|
34001
|
+
path: ["schemaHash"]
|
|
34002
|
+
}).refine((data) => Boolean(data.lastAppliedMigrationTag || data.schemaHash || data.integrationsHash || data.buildHash), {
|
|
34003
|
+
message: "A baseline must claim something — migration history, a schema snapshot, or artifact hashes",
|
|
34004
|
+
path: ["lastAppliedMigrationTag"]
|
|
34005
|
+
});
|
|
34006
|
+
DeploymentStateBaselineSchema = exports_external.object({
|
|
34007
|
+
lastAppliedMigrationTag: exports_external.string().min(1).optional(),
|
|
34008
|
+
journal: exports_external.array(exports_external.object({
|
|
34009
|
+
tag: exports_external.string().min(1),
|
|
34010
|
+
checksum: exports_external.string().min(1)
|
|
34011
|
+
})).optional(),
|
|
34012
|
+
schemaSnapshot: exports_external.unknown().optional(),
|
|
34013
|
+
schemaHash: exports_external.string().min(1).optional(),
|
|
34014
|
+
evidence: BaselineEvidenceSchema,
|
|
34015
|
+
allowUnverified: exports_external.boolean().optional()
|
|
34016
|
+
}).refine((data) => !data.lastAppliedMigrationTag === !data.journal, {
|
|
34017
|
+
message: "lastAppliedMigrationTag and journal must be provided together",
|
|
34018
|
+
path: ["journal"]
|
|
34019
|
+
}).refine((data) => data.schemaSnapshot === undefined === !data.schemaHash, {
|
|
34020
|
+
message: "schemaSnapshot and schemaHash must be provided together",
|
|
34021
|
+
path: ["schemaHash"]
|
|
34022
|
+
}).refine((data) => Boolean(data.lastAppliedMigrationTag) || Boolean(data.schemaHash), {
|
|
34023
|
+
message: "A baseline needs a migration claim, a schema snapshot, or both",
|
|
34024
|
+
path: ["lastAppliedMigrationTag"]
|
|
34025
|
+
});
|
|
34026
|
+
MigrationRealignSchema = exports_external.object({
|
|
34027
|
+
checksum: exports_external.string().min(1)
|
|
34028
|
+
});
|
|
34029
|
+
MigrationResolveSchema = exports_external.object({
|
|
34030
|
+
resolution: exports_external.enum(["applied", "rolled-back"]),
|
|
34031
|
+
checksum: exports_external.string().min(1).optional()
|
|
34032
|
+
}).refine((data) => data.resolution !== "applied" || Boolean(data.checksum), {
|
|
34033
|
+
message: "Resolving a migration as 'applied' requires its checksum",
|
|
34034
|
+
path: ["checksum"]
|
|
34035
|
+
});
|
|
34036
|
+
DatabaseRestoreSchema = exports_external.object({
|
|
34037
|
+
restorePointId: exports_external.string().uuid()
|
|
34038
|
+
});
|
|
34039
|
+
DeployBlockedReportSchema = exports_external.object({
|
|
34040
|
+
code: exports_external.string().regex(/^blocked:[a-z-]+$/).max(64),
|
|
34041
|
+
reason: exports_external.string().min(1).max(2000)
|
|
34042
|
+
});
|
|
31733
34043
|
DeployRequestSchema = exports_external.object({
|
|
31734
34044
|
target: exports_external.enum(deploymentTargetEnum.enumValues).optional().default("game"),
|
|
34045
|
+
deployId: exports_external.string().min(1).optional(),
|
|
31735
34046
|
uploadToken: exports_external.string().optional(),
|
|
31736
34047
|
code: exports_external.string().optional(),
|
|
31737
34048
|
codeUploadToken: exports_external.string().optional(),
|
|
@@ -31758,6 +34069,11 @@ var init_schemas2 = __esm(() => {
|
|
|
31758
34069
|
sql: exports_external.string(),
|
|
31759
34070
|
hash: exports_external.string()
|
|
31760
34071
|
}).optional(),
|
|
34072
|
+
database: DeployDatabaseSchema.optional(),
|
|
34073
|
+
baseline: DeployBaselineSchema.optional(),
|
|
34074
|
+
buildHash: exports_external.string().min(1).optional(),
|
|
34075
|
+
integrationsHash: exports_external.string().min(1).optional(),
|
|
34076
|
+
pruneSecrets: exports_external.array(exports_external.string().min(1)).optional(),
|
|
31761
34077
|
metadata: exports_external.object({
|
|
31762
34078
|
displayName: exports_external.string().optional(),
|
|
31763
34079
|
description: exports_external.string().optional(),
|
|
@@ -31767,9 +34083,24 @@ var init_schemas2 = __esm(() => {
|
|
|
31767
34083
|
}).refine((data) => !(data.code && data.codeUploadToken), {
|
|
31768
34084
|
message: "Specify either code or codeUploadToken, not both",
|
|
31769
34085
|
path: ["codeUploadToken"]
|
|
31770
|
-
}).refine((data) => !(data.target === "dashboard" && (data.schema || data.bindings)), {
|
|
31771
|
-
message: "Dashboard deployments cannot include schema or bindings — they attach to the game deployment’s existing resources",
|
|
34086
|
+
}).refine((data) => !(data.target === "dashboard" && (data.schema || data.bindings || data.database)), {
|
|
34087
|
+
message: "Dashboard deployments cannot include schema, database, or bindings — they attach to the game deployment’s existing resources",
|
|
31772
34088
|
path: ["target"]
|
|
34089
|
+
}).refine((data) => !(data.target === "dashboard" && (data.baseline || data.pruneSecrets)), {
|
|
34090
|
+
message: "Dashboard deployments cannot adopt a baseline or prune secrets",
|
|
34091
|
+
path: ["target"]
|
|
34092
|
+
}).refine((data) => !(data.database && !data.deployId), {
|
|
34093
|
+
message: "deployId is required when a database payload is present",
|
|
34094
|
+
path: ["deployId"]
|
|
34095
|
+
}).refine((data) => !(data.database && data.schema), {
|
|
34096
|
+
message: "Send either the database payload or the legacy schema field, not both",
|
|
34097
|
+
path: ["database"]
|
|
34098
|
+
}).refine((data) => !(data.baseline && data.schema), {
|
|
34099
|
+
message: "The legacy schema field cannot ride a baseline-adopting deploy",
|
|
34100
|
+
path: ["baseline"]
|
|
34101
|
+
}).refine((data) => !(data.database && !requestsBinding(data.bindings?.database)), {
|
|
34102
|
+
message: "The database payload requires a database binding",
|
|
34103
|
+
path: ["database"]
|
|
31773
34104
|
});
|
|
31774
34105
|
});
|
|
31775
34106
|
|
|
@@ -75507,7 +77838,7 @@ var init_pure = __esm(() => {
|
|
|
75507
77838
|
});
|
|
75508
77839
|
|
|
75509
77840
|
// ../utils/src/index.ts
|
|
75510
|
-
var
|
|
77841
|
+
var init_src5 = __esm(() => {
|
|
75511
77842
|
init_pure();
|
|
75512
77843
|
});
|
|
75513
77844
|
|
|
@@ -77464,7 +79795,7 @@ var init_dist5 = __esm(async () => {
|
|
|
77464
79795
|
init_spans();
|
|
77465
79796
|
init_src();
|
|
77466
79797
|
init_spans();
|
|
77467
|
-
|
|
79798
|
+
init_src5();
|
|
77468
79799
|
init_src();
|
|
77469
79800
|
init_spans();
|
|
77470
79801
|
init_spans();
|
|
@@ -78043,7 +80374,7 @@ function selectTimebackMetricDiscrepancyQueueItems(candidates, options) {
|
|
|
78043
80374
|
}
|
|
78044
80375
|
var DATE_INPUT_RE;
|
|
78045
80376
|
var init_timeback_discrepancy_queue_util = __esm(() => {
|
|
78046
|
-
|
|
80377
|
+
init_src5();
|
|
78047
80378
|
init_timeback_util();
|
|
78048
80379
|
DATE_INPUT_RE = /^\d{4}-\d{2}-\d{2}$/;
|
|
78049
80380
|
});
|
|
@@ -80562,7 +82893,7 @@ var init_timeback_admin_service = __esm(async () => {
|
|
|
80562
82893
|
init_constants3();
|
|
80563
82894
|
init_types2();
|
|
80564
82895
|
init_utils6();
|
|
80565
|
-
|
|
82896
|
+
init_src5();
|
|
80566
82897
|
init_timeback3();
|
|
80567
82898
|
init_errors();
|
|
80568
82899
|
init_timeback_admin_metrics_util();
|
|
@@ -83018,8 +85349,15 @@ function createPlatformServices(deps) {
|
|
|
83018
85349
|
validateDeveloperAccess
|
|
83019
85350
|
});
|
|
83020
85351
|
const kv = new KVService({ db: db2, cloudflare: cloudflare2, validateDeveloperAccessBySlug });
|
|
83021
|
-
const secrets = new SecretsService({ config: config4, cloudflare: cloudflare2, validateDeveloperAccessBySlug });
|
|
85352
|
+
const secrets = new SecretsService({ db: db2, config: config4, cloudflare: cloudflare2, validateDeveloperAccessBySlug });
|
|
83022
85353
|
const domain3 = new DomainService({ db: db2, cloudflare: cloudflare2, corsKvs, validateDeveloperAccessBySlug });
|
|
85354
|
+
const deploymentState = new DeploymentStateService({
|
|
85355
|
+
db: db2,
|
|
85356
|
+
config: config4,
|
|
85357
|
+
cloudflare: cloudflare2,
|
|
85358
|
+
alerts,
|
|
85359
|
+
validateDeveloperAccessBySlug
|
|
85360
|
+
});
|
|
83023
85361
|
const database = new DatabaseService({
|
|
83024
85362
|
db: db2,
|
|
83025
85363
|
config: config4,
|
|
@@ -83058,6 +85396,7 @@ function createPlatformServices(deps) {
|
|
|
83058
85396
|
kv,
|
|
83059
85397
|
secrets,
|
|
83060
85398
|
domain: domain3,
|
|
85399
|
+
deploymentState,
|
|
83061
85400
|
database,
|
|
83062
85401
|
seed,
|
|
83063
85402
|
timeback: timeback2,
|
|
@@ -83068,6 +85407,7 @@ function createPlatformServices(deps) {
|
|
|
83068
85407
|
var init_platform2 = __esm(async () => {
|
|
83069
85408
|
init_bucket_service();
|
|
83070
85409
|
init_database_service();
|
|
85410
|
+
init_deployment_state_service();
|
|
83071
85411
|
init_domain_service();
|
|
83072
85412
|
init_kv_service();
|
|
83073
85413
|
init_secrets_service();
|
|
@@ -83800,7 +86140,7 @@ function createServices(ctx) {
|
|
|
83800
86140
|
};
|
|
83801
86141
|
}
|
|
83802
86142
|
var init_factory = __esm(async () => {
|
|
83803
|
-
|
|
86143
|
+
init_game3();
|
|
83804
86144
|
init_infra2();
|
|
83805
86145
|
init_player();
|
|
83806
86146
|
init_standalone();
|
|
@@ -84107,6 +86447,7 @@ function buildConfig(options) {
|
|
|
84107
86447
|
gameDomain: "localhost",
|
|
84108
86448
|
uploadBucket: "sandbox-uploads",
|
|
84109
86449
|
ltiTestMode: true,
|
|
86450
|
+
secretsManifestPepper: "sandbox-secrets-manifest-pepper",
|
|
84110
86451
|
...options.config
|
|
84111
86452
|
});
|
|
84112
86453
|
}
|
|
@@ -101048,7 +103389,7 @@ var __create2, __defProp2, __getOwnPropDesc, __getOwnPropNames2, __getProtoOf2,
|
|
|
101048
103389
|
__defProp2(to, key, { get: () => from[key], enumerable: !(desc2 = __getOwnPropDesc(from, key)) || desc2.enumerable });
|
|
101049
103390
|
}
|
|
101050
103391
|
return to;
|
|
101051
|
-
}, __toESM5 = (mod, isNodeMode, target) => (target = mod != null ? __create2(__getProtoOf2(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp2(target, "default", { value: mod, enumerable: true }) : target, mod)), __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value), ANSI_BACKGROUND_OFFSET, wrapAnsi16, wrapAnsi256, wrapAnsi16m, styles2, modifierNames, foregroundColorNames, backgroundColorNames, colorNames, ansiStyles, ansi_styles_default, init_ansi_styles, env, flagForceColor, supportsColor, supports_color_default, init_supports_color, init_utilities, stdoutColor, stderrColor, GENERATOR, STYLER, IS_EMPTY, levelMapping, styles22, applyOptions, chalkFactory, getModelAnsi, usedModels, proto, createStyler, createBuilder, applyStyle, chalk, chalkStderr, source_default, init_source, require_old, require_fs, require_path, require_balanced_match, require_brace_expansion, require_minimatch, require_inherits_browser2, require_inherits2, require_common3, require_sync, require_wrappy, require_once, require_inflight, require_glob, require_readline, require_src3, require_utils4, require_lodash, require_hanji, originUUID, snapshotVersion, mapValues, mapKeys, mapEntries, customMapEntries, init_global2, util3, objectUtil2, ZodParsedType2, getParsedType4, init_util4, ZodIssueCode4, ZodError5, init_ZodError2, errorMap2, en_default4, init_en4, overrideErrorMap2, init_errors9, makeIssue2, ParseStatus2, INVALID3, DIRTY2, OK2, isAborted2, isDirty2, isValid2, isAsync2, init_parseUtil2, init_typeAliases2, errorUtil2, init_errorUtil2, ParseInputLazyPath2, handleResult2, ZodType4, cuidRegex2, cuid2Regex2, ulidRegex2, uuidRegex2, nanoidRegex2, jwtRegex2, durationRegex2, emailRegex2, _emojiRegex2, emojiRegex2, ipv4Regex2, ipv4CidrRegex2, ipv6Regex2, ipv6CidrRegex2, base64Regex2, base64urlRegex2, dateRegexSource2, dateRegex2, ZodString4, ZodNumber4, ZodBigInt4, ZodBoolean4, ZodDate4, ZodSymbol4, ZodUndefined4, ZodNull4, ZodAny4, ZodUnknown4, ZodNever4, ZodVoid4, ZodArray4, ZodObject4, ZodUnion4, getDiscriminator2, ZodDiscriminatedUnion4, ZodIntersection4, ZodTuple4, ZodRecord4, ZodMap4, ZodSet4, ZodFunction3, ZodLazy4, ZodLiteral4, ZodEnum4, ZodNativeEnum2, ZodPromise4, ZodEffects2, ZodOptional4, ZodNullable4, ZodDefault4, ZodCatch4, ZodNaN4, BRAND2, ZodBranded2, ZodPipeline2, ZodReadonly4, late2, ZodFirstPartyTypeKind3, stringType2, numberType2, nanType2, bigIntType2, booleanType2, dateType2, symbolType2, undefinedType2, nullType2, anyType2, unknownType2, neverType2, voidType2, arrayType2, objectType2, strictObjectType2, unionType2, discriminatedUnionType2, intersectionType2, tupleType2, recordType2, mapType2, setType2, functionType2, lazyType2, literalType2, enumType2, nativeEnumType2, promiseType2, effectsType2, optionalType2, nullableType2, preprocessType2, pipelineType2, coerce2, init_types5, init_external4, init_v32, init_esm2, enumSchema, enumSchemaV1, indexColumn, index2, fk, sequenceSchema, roleSchema, sequenceSquashed, column2, checkConstraint, columnSquashed, compositePK, uniqueConstraint, policy, policySquashed, viewWithOption, matViewWithOption, mergedViewWithOption, view2, table8, schemaHash, kitInternals, gelSchemaExternal, gelSchemaInternal, tableSquashed, gelSchemaSquashed, gelSchema, dryGel, init_gelSchema, index22, fk2, column22, tableV3, compositePK2, uniqueConstraint2, checkConstraint2, tableV4, table22, viewMeta, view22, kitInternals2, dialect2, schemaHash2, schemaInternalV3, schemaInternalV4, schemaInternalV5, schemaInternal, schemaV3, schemaV4, schemaV5, schema2, tableSquashedV4, tableSquashed2, viewSquashed, schemaSquashed, schemaSquashedV4, MySqlSquasher, squashMysqlScheme, mysqlSchema, mysqlSchemaV5, mysqlSchemaSquashed, backwardCompatibleMysqlSchema, dryMySql, init_mysqlSchema, indexV2, columnV2, tableV2, enumSchemaV12, enumSchema2, pgSchemaV2, references, columnV1, tableV1, pgSchemaV1, indexColumn2, index3, indexV4, indexV5, indexV6, fk3, sequenceSchema2, roleSchema2, sequenceSquashed2, columnV7, column3, checkConstraint3, columnSquashed2, tableV32, compositePK3, uniqueConstraint3, policy2, policySquashed2, viewWithOption2, matViewWithOption2, mergedViewWithOption2, view3, tableV42, tableV5, tableV6, tableV7, table32, schemaHash3, kitInternals3, pgSchemaInternalV3, pgSchemaInternalV4, pgSchemaInternalV5, pgSchemaInternalV6, pgSchemaExternal, pgSchemaInternalV7, pgSchemaInternal, tableSquashed3, tableSquashedV42, pgSchemaSquashedV4, pgSchemaSquashedV6, pgSchemaSquashed, pgSchemaV3, pgSchemaV4, pgSchemaV5, pgSchemaV6, pgSchemaV7, pgSchema, backwardCompatiblePgSchema, PgSquasher, squashPgScheme, dryPg, init_pgSchema, index4, column4, compositePK4, uniqueConstraint4, table42, viewMeta2, kitInternals4, dialect22, schemaHash4, schemaInternal2, schema22, tableSquashed4, schemaSquashed2, SingleStoreSquasher, squashSingleStoreScheme, singlestoreSchema, singlestoreSchemaSquashed, backwardCompatibleSingleStoreSchema, drySingleStore, init_singlestoreSchema, index5, fk4, compositePK5, column5, tableV33, uniqueConstraint5, checkConstraint4, table52, view4, dialect3, schemaHash5, schemaInternalV32, schemaInternalV42, schemaInternalV52, kitInternals5, latestVersion, schemaInternal3, schemaV32, schemaV42, schemaV52, schema3, tableSquashed5, schemaSquashed3, SQLiteSquasher, squashSqliteScheme, drySQLite, sqliteSchemaV5, sqliteSchema, SQLiteSchemaSquashed, backwardCompatibleSqliteSchema, init_sqliteSchema, copy, prepareMigrationMeta, schemaRenameKey, tableRenameKey, columnRenameKey, init_utils7, import_hanji, warning, error88, isRenamePromptItem, ResolveColumnSelect, tableKey, ResolveSelectNamed, ResolveSelect, ResolveSchemasSelect, Spinner2, ProgressView, init_views, glob, init_serializer, fillPgSnapshot, init_migrationPreparator, require_heap, require_heap2, require_difflib, require_difflib2, require_util2, require_styles, require_has_flag2, require_supports_colors, require_trap, require_zalgo, require_america, require_zebra, require_rainbow, require_random, require_colors, require_safe, require_colorize, require_lib4, import_json_diff, mapArraysDiff, findAlternationsInTable, alternationsInColumn, init_jsonDiffer, parseType, Convertor, PgCreateRoleConvertor, PgDropRoleConvertor, PgRenameRoleConvertor, PgAlterRoleConvertor, PgCreatePolicyConvertor, PgDropPolicyConvertor, PgRenamePolicyConvertor, PgAlterPolicyConvertor, PgCreateIndPolicyConvertor, PgDropIndPolicyConvertor, PgRenameIndPolicyConvertor, PgAlterIndPolicyConvertor, PgEnableRlsConvertor, PgDisableRlsConvertor, PgCreateTableConvertor, MySqlCreateTableConvertor, SingleStoreCreateTableConvertor, SQLiteCreateTableConvertor, PgCreateViewConvertor, MySqlCreateViewConvertor, SqliteCreateViewConvertor, PgDropViewConvertor, MySqlDropViewConvertor, SqliteDropViewConvertor, MySqlAlterViewConvertor, PgRenameViewConvertor, MySqlRenameViewConvertor, PgAlterViewSchemaConvertor, PgAlterViewAddWithOptionConvertor, PgAlterViewDropWithOptionConvertor, PgAlterViewAlterTablespaceConvertor, PgAlterViewAlterUsingConvertor, PgAlterTableAlterColumnSetGenerated, PgAlterTableAlterColumnDropGenerated, PgAlterTableAlterColumnAlterGenerated, PgAlterTableAddUniqueConstraintConvertor, PgAlterTableDropUniqueConstraintConvertor, PgAlterTableAddCheckConstraintConvertor, PgAlterTableDeleteCheckConstraintConvertor, MySQLAlterTableAddUniqueConstraintConvertor, MySQLAlterTableDropUniqueConstraintConvertor, MySqlAlterTableAddCheckConstraintConvertor, SingleStoreAlterTableAddUniqueConstraintConvertor, SingleStoreAlterTableDropUniqueConstraintConvertor, MySqlAlterTableDeleteCheckConstraintConvertor, CreatePgSequenceConvertor, DropPgSequenceConvertor, RenamePgSequenceConvertor, MovePgSequenceConvertor, AlterPgSequenceConvertor, CreateTypeEnumConvertor, DropTypeEnumConvertor, AlterTypeAddValueConvertor, AlterTypeSetSchemaConvertor, AlterRenameTypeConvertor, AlterTypeDropValueConvertor, PgDropTableConvertor, MySQLDropTableConvertor, SingleStoreDropTableConvertor, SQLiteDropTableConvertor, PgRenameTableConvertor, SqliteRenameTableConvertor, MySqlRenameTableConvertor, SingleStoreRenameTableConvertor, PgAlterTableRenameColumnConvertor, MySqlAlterTableRenameColumnConvertor, SingleStoreAlterTableRenameColumnConvertor, SQLiteAlterTableRenameColumnConvertor, PgAlterTableDropColumnConvertor, MySqlAlterTableDropColumnConvertor, SingleStoreAlterTableDropColumnConvertor, SQLiteAlterTableDropColumnConvertor, PgAlterTableAddColumnConvertor, MySqlAlterTableAddColumnConvertor, SingleStoreAlterTableAddColumnConvertor, SQLiteAlterTableAddColumnConvertor, PgAlterTableAlterColumnSetTypeConvertor, PgAlterTableAlterColumnSetDefaultConvertor, PgAlterTableAlterColumnDropDefaultConvertor, PgAlterTableAlterColumnDropGeneratedConvertor, PgAlterTableAlterColumnSetExpressionConvertor, PgAlterTableAlterColumnAlterrGeneratedConvertor, SqliteAlterTableAlterColumnDropGeneratedConvertor, SqliteAlterTableAlterColumnSetExpressionConvertor, SqliteAlterTableAlterColumnAlterGeneratedConvertor, MySqlAlterTableAlterColumnAlterrGeneratedConvertor, MySqlAlterTableAddPk, MySqlAlterTableDropPk, LibSQLModifyColumn, MySqlModifyColumn, SingleStoreAlterTableAlterColumnAlterrGeneratedConvertor, SingleStoreAlterTableAddPk, SingleStoreAlterTableDropPk, SingleStoreModifyColumn, PgAlterTableCreateCompositePrimaryKeyConvertor, PgAlterTableDeleteCompositePrimaryKeyConvertor, PgAlterTableAlterCompositePrimaryKeyConvertor, MySqlAlterTableCreateCompositePrimaryKeyConvertor, MySqlAlterTableDeleteCompositePrimaryKeyConvertor, MySqlAlterTableAlterCompositePrimaryKeyConvertor, PgAlterTableAlterColumnSetPrimaryKeyConvertor, PgAlterTableAlterColumnDropPrimaryKeyConvertor, PgAlterTableAlterColumnSetNotNullConvertor, PgAlterTableAlterColumnDropNotNullConvertor, PgCreateForeignKeyConvertor, LibSQLCreateForeignKeyConvertor, MySqlCreateForeignKeyConvertor, PgAlterForeignKeyConvertor, PgDeleteForeignKeyConvertor, MySqlDeleteForeignKeyConvertor, CreatePgIndexConvertor, CreateMySqlIndexConvertor, CreateSingleStoreIndexConvertor, CreateSqliteIndexConvertor, PgDropIndexConvertor, PgCreateSchemaConvertor, PgRenameSchemaConvertor, PgDropSchemaConvertor, PgAlterTableSetSchemaConvertor, PgAlterTableSetNewSchemaConvertor, PgAlterTableRemoveFromSchemaConvertor, SqliteDropIndexConvertor, MySqlDropIndexConvertor, SingleStoreDropIndexConvertor, SQLiteRecreateTableConvertor, LibSQLRecreateTableConvertor, SingleStoreRecreateTableConvertor, convertors, init_sqlgenerator, _moveDataStatements, getOldTableName, getNewTableName, logSuggestionsAndReturn, init_sqlitePushUtils, preparePgCreateTableJson, prepareMySqlCreateTableJson, prepareSingleStoreCreateTableJson, prepareSQLiteCreateTable, prepareDropTableJson, prepareRenameTableJson, prepareCreateEnumJson, prepareAddValuesToEnumJson, prepareDropEnumValues, prepareDropEnumJson, prepareMoveEnumJson, prepareRenameEnumJson, prepareCreateSequenceJson, prepareAlterSequenceJson, prepareDropSequenceJson, prepareMoveSequenceJson, prepareRenameSequenceJson, prepareCreateRoleJson, prepareAlterRoleJson, prepareDropRoleJson, prepareRenameRoleJson, prepareCreateSchemasJson, prepareRenameSchemasJson, prepareDeleteSchemasJson, prepareRenameColumns, _prepareDropColumns, _prepareAddColumns, _prepareSqliteAddColumns, prepareAlterColumnsMysql, preparePgAlterColumns, prepareSqliteAlterColumns, prepareRenamePolicyJsons, prepareRenameIndPolicyJsons, prepareCreatePolicyJsons, prepareCreateIndPolicyJsons, prepareDropPolicyJsons, prepareDropIndPolicyJsons, prepareAlterPolicyJson, prepareAlterIndPolicyJson, preparePgCreateIndexesJson, prepareCreateIndexesJson, prepareCreateReferencesJson, prepareLibSQLCreateReferencesJson, prepareDropReferencesJson, prepareLibSQLDropReferencesJson, prepareAlterReferencesJson, prepareDropIndexesJson, prepareAddCompositePrimaryKeySqlite, prepareDeleteCompositePrimaryKeySqlite, prepareAlterCompositePrimaryKeySqlite, prepareAddCompositePrimaryKeyPg, prepareDeleteCompositePrimaryKeyPg, prepareAlterCompositePrimaryKeyPg, prepareAddUniqueConstraintPg, prepareDeleteUniqueConstraintPg, prepareAddCheckConstraint, prepareDeleteCheckConstraint, prepareAddCompositePrimaryKeyMySql, prepareDeleteCompositePrimaryKeyMySql, prepareAlterCompositePrimaryKeyMySql, preparePgCreateViewJson, prepareMySqlCreateViewJson, prepareSqliteCreateViewJson, prepareDropViewJson, prepareRenameViewJson, preparePgAlterViewAlterSchemaJson, preparePgAlterViewAddWithOptionJson, preparePgAlterViewDropWithOptionJson, preparePgAlterViewAlterTablespaceJson, preparePgAlterViewAlterUsingJson, prepareMySqlAlterView, init_jsonStatements, prepareLibSQLRecreateTable, prepareSQLiteRecreateTable, libSQLCombineStatements, sqliteCombineStatements, prepareSingleStoreRecreateTable, singleStoreCombineStatements, init_statementCombiner, snapshotsDiffer_exports, makeChanged, makeSelfOrChanged, makePatched, makeSelfOrPatched, columnSchema, alteredColumnSchema, enumSchema3, changedEnumSchema, tableScheme, alteredTableScheme, alteredViewCommon, alteredPgViewSchema, alteredMySqlViewSchema, diffResultScheme, diffResultSchemeMysql, diffResultSchemeSingleStore, diffResultSchemeSQLite, schemaChangeFor, nameChangeFor, nameSchemaChangeFor, columnChangeFor, applyPgSnapshotsDiff, applyMysqlSnapshotsDiff, applySingleStoreSnapshotsDiff, applySqliteSnapshotsDiff, applyLibSQLSnapshotsDiff, init_snapshotsDiffer, init_words, dialects, dialect4, commonSquashedSchema, commonSchema, init_schemaValidator, sqliteDriversLiterals, postgresqlDriversLiterals, prefixes, prefix, casingTypes, casingType, sqliteDriver, postgresDriver, driver2, configMigrations, configCommonSchema, casing, introspectParams, configIntrospectCliSchema, configGenerateSchema, configPushSchema, init_common2, withStyle, init_outputs, import_hanji2, schemasResolver, tablesResolver, viewsResolver, mySqlViewsResolver, sqliteViewsResolver, sequencesResolver, roleResolver, policyResolver, indPolicyResolver, enumsResolver, columnsResolver, promptColumnsConflicts, promptNamedConflict, promptNamedWithSchemasConflict, promptSchemasConflict, BREAKPOINT, init_migrate, posixClasses, braceEscape, regexpEscape, rangesToString, parseClass, init_brace_expressions, escape, init_escape, unescape, init_unescape, import_brace_expansion, minimatch, starDotExtRE, starDotExtTest, starDotExtTestDot, starDotExtTestNocase, starDotExtTestNocaseDot, starDotStarRE, starDotStarTest, starDotStarTestDot, dotStarRE, dotStarTest, starRE, starTest, starTestDot, qmarksRE, qmarksTestNocase, qmarksTestNocaseDot, qmarksTestDot, qmarksTest, qmarksTestNoExt, qmarksTestNoExtDot, defaultPlatform, path, sep2, GLOBSTAR, plTypes, qmark, star, twoStarDot, twoStarNoDot, charSet, reSpecials, addPatternStartSet, filter, ext, defaults, braceExpand, MAX_PATTERN_LENGTH, assertValidPattern, makeRe, match2, globUnescape, globMagic, regExpEscape, Minimatch, init_mjs, entityKind2, hasOwnEntityKind2, init_entity2, _a3, Column2, init_column2, _a22, ColumnBuilder2, init_column_builder2, TableName2, init_table_utils2, _a32, ForeignKeyBuilder2, _a4, ForeignKey2, init_foreign_keys2, init_tracing_utils2, _a5, UniqueConstraintBuilder, _a6, UniqueOnConstraintBuilder, _a7, UniqueConstraint, init_unique_constraint2, init_array2, _a8, _b, PgColumnBuilder2, _a9, _b2, PgColumn2, _a10, _b3, ExtraConfigColumn2, _a11, IndexedColumn2, _a12, _b4, PgArrayBuilder2, _a13, _b5, _PgArray, PgArray2, init_common22, _a14, _b6, PgEnumObjectColumnBuilder2, _a15, _b7, PgEnumObjectColumn2, isPgEnumSym2, _a16, _b8, PgEnumColumnBuilder2, _a17, _b9, PgEnumColumn2, init_enum2, _a18, Subquery2, _a19, _b10, WithSubquery2, init_subquery2, version4, init_version2, otel2, rawTracer2, tracer2, init_tracing2, ViewBaseConfig2, init_view_common3, Schema2, Columns2, ExtraConfigColumns2, OriginalName2, BaseName2, IsAlias2, ExtraConfigBuilder2, IsDrizzleTable2, _a20, _b11, _c, _d, _e3, _f, _g, _h, _i, _j, Table2, init_table8, _a21, FakePrimitiveParam, _a222, StringChunk2, _a23, _SQL, SQL2, _a24, Name2, noopDecoder2, noopEncoder2, noopMapper2, _a25, Param2, _a26, Placeholder2, IsDrizzleView2, _a27, _b12, _c2, View3, init_sql3, _a28, ColumnAliasProxyHandler2, _a29, TableAliasProxyHandler2, _a30, RelationTableAliasProxyHandler, init_alias3, _a31, _b13, DrizzleError2, DrizzleQueryError, _a322, _b14, TransactionRollbackError2, init_errors22, _a33, ConsoleLogWriter2, _a34, DefaultLogger2, _a35, NoopLogger2, init_logger3, init_operations, _a36, _b15, QueryPromise2, init_query_promise2, textDecoder, init_utils22, _a37, _b16, PgIntColumnBaseBuilder2, init_int_common2, _a38, _b17, PgBigInt53Builder2, _a39, _b18, PgBigInt532, _a40, _b19, PgBigInt64Builder2, _a41, _b20, PgBigInt642, init_bigint2, _a42, _b21, PgBigSerial53Builder2, _a43, _b22, PgBigSerial532, _a44, _b23, PgBigSerial64Builder2, _a45, _b24, PgBigSerial642, init_bigserial2, _a46, _b25, PgBooleanBuilder2, _a47, _b26, PgBoolean2, init_boolean2, _a48, _b27, PgCharBuilder2, _a49, _b28, PgChar2, init_char2, _a50, _b29, PgCidrBuilder2, _a51, _b30, PgCidr2, init_cidr2, _a52, _b31, PgCustomColumnBuilder2, _a53, _b32, PgCustomColumn2, init_custom2, _a54, _b33, PgDateColumnBaseBuilder2, init_date_common2, _a55, _b34, PgDateBuilder2, _a56, _b35, PgDate2, _a57, _b36, PgDateStringBuilder2, _a58, _b37, PgDateString2, init_date2, _a59, _b38, PgDoublePrecisionBuilder2, _a60, _b39, PgDoublePrecision2, init_double_precision2, _a61, _b40, PgInetBuilder2, _a62, _b41, PgInet2, init_inet2, _a63, _b42, PgIntegerBuilder2, _a64, _b43, PgInteger2, init_integer2, _a65, _b44, PgIntervalBuilder2, _a66, _b45, PgInterval2, init_interval2, _a67, _b46, PgJsonBuilder2, _a68, _b47, PgJson2, init_json2, _a69, _b48, PgJsonbBuilder2, _a70, _b49, PgJsonb2, init_jsonb2, _a71, _b50, PgLineBuilder2, _a72, _b51, PgLineTuple2, _a73, _b52, PgLineABCBuilder2, _a74, _b53, PgLineABC2, init_line2, _a75, _b54, PgMacaddrBuilder2, _a76, _b55, PgMacaddr2, init_macaddr2, _a77, _b56, PgMacaddr8Builder2, _a78, _b57, PgMacaddr82, init_macaddr82, _a79, _b58, PgNumericBuilder2, _a80, _b59, PgNumeric2, _a81, _b60, PgNumericNumberBuilder2, _a82, _b61, PgNumericNumber2, _a83, _b62, PgNumericBigIntBuilder2, _a84, _b63, PgNumericBigInt2, init_numeric2, _a85, _b64, PgPointTupleBuilder2, _a86, _b65, PgPointTuple2, _a87, _b66, PgPointObjectBuilder2, _a88, _b67, PgPointObject2, init_point2, init_utils32, _a89, _b68, PgGeometryBuilder2, _a90, _b69, PgGeometry2, _a91, _b70, PgGeometryObjectBuilder2, _a92, _b71, PgGeometryObject2, init_geometry2, _a93, _b72, PgRealBuilder2, _a94, _b73, PgReal2, init_real2, _a95, _b74, PgSerialBuilder2, _a96, _b75, PgSerial2, init_serial2, _a97, _b76, PgSmallIntBuilder2, _a98, _b77, PgSmallInt2, init_smallint2, _a99, _b78, PgSmallSerialBuilder2, _a100, _b79, PgSmallSerial2, init_smallserial2, _a101, _b80, PgTextBuilder2, _a102, _b81, PgText2, init_text2, _a103, _b82, PgTimeBuilder2, _a104, _b83, PgTime2, init_time2, _a105, _b84, PgTimestampBuilder2, _a106, _b85, PgTimestamp2, _a107, _b86, PgTimestampStringBuilder2, _a108, _b87, PgTimestampString2, init_timestamp2, _a109, _b88, PgUUIDBuilder2, _a110, _b89, PgUUID2, init_uuid3, _a111, _b90, PgVarcharBuilder2, _a112, _b91, PgVarchar2, init_varchar2, _a113, _b92, PgBinaryVectorBuilder2, _a114, _b93, PgBinaryVector2, init_bit2, _a115, _b94, PgHalfVectorBuilder2, _a116, _b95, PgHalfVector2, init_halfvec2, _a117, _b96, PgSparseVectorBuilder2, _a118, _b97, PgSparseVector2, init_sparsevec2, _a119, _b98, PgVectorBuilder2, _a120, _b99, PgVector2, init_vector3, init_all2, InlineForeignKeys2, EnableRLS2, _a121, _b100, _c3, _d2, _e22, _f2, PgTable2, pgTable2, init_table22, _a122, PrimaryKeyBuilder2, _a123, PrimaryKey2, init_primary_keys2, eq2, ne4, gt3, gte2, lt4, lte2, init_conditions2, init_select3, init_expressions2, _a124, Relation2, _a125, Relations2, _a126, _b101, _One, One2, _a127, _b102, _Many, Many2, init_relations2, init_aggregate2, init_vector22, init_functions2, init_sql22, dist_exports, init_dist9, init_alias22, _a128, CheckBuilder, _a129, Check, init_checks6, init_columns2, _a130, _SelectionProxyHandler, SelectionProxyHandler2, init_selection_proxy2, _a131, IndexBuilderOn2, _a132, IndexBuilder2, _a133, Index2, init_indexes2, _a134, PgPolicy, init_policies2, PgViewConfig2, init_view_common22, _a135, CasingCache2, init_casing2, _a136, _b103, PgViewBase2, init_view_base2, _a137, PgDialect2, init_dialect2, _a138, TypedQueryBuilder2, init_query_builder3, _a139, PgSelectBuilder2, _a140, _b104, PgSelectQueryBuilderBase2, _a141, _b105, PgSelectBase2, getPgSetOperators2, union22, unionAll2, intersect2, intersectAll2, except2, exceptAll2, init_select22, _a142, QueryBuilder2, init_query_builder22, _a143, DefaultViewBuilderCore, _a144, _b106, ViewBuilder, _a145, _b107, ManualViewBuilder, _a146, MaterializedViewBuilderCore, _a147, _b108, MaterializedViewBuilder, _a148, _b109, ManualMaterializedViewBuilder, _a149, _b110, _c4, PgView2, PgMaterializedViewConfig2, _a150, _b111, _c5, PgMaterializedView, init_view2, init_utils42, _a151, _b112, PgDeleteBase2, init_delete2, _a152, PgInsertBuilder2, _a153, _b113, PgInsertBase2, init_insert2, _a154, _b114, PgRefreshMaterializedView2, init_refresh_materialized_view2, init_select_types, _a155, PgUpdateBuilder2, _a156, _b115, PgUpdateBase2, init_update2, init_query_builders2, _a157, _b116, _c6, _PgCountBuilder, PgCountBuilder2, init_count2, _a158, RelationalQueryBuilder2, _a159, _b117, PgRelationalQuery2, init_query2, _a160, _b118, PgRaw2, init_raw2, _a161, PgDatabase2, init_db2, _a162, PgRole, init_roles2, _a163, PgSequence, init_sequence2, _a164, PgSchema5, init_schema3, _a165, Cache, _a166, _b119, NoopCache, init_cache, _a167, PgPreparedQuery2, _a168, PgSession2, _a169, _b120, PgTransaction2, init_session3, init_subquery22, init_utils52, init_pg_core2, vectorOps, init_vector32, sqlToStr, init_utils62, indexName, generatePgSnapshot, trimChar, fromDatabase, defaultForColumn, getColumnsInfoQuery, init_pgSerializer, import_hanji4, Select, init_selector_ui, init_alias32, _a170, CheckBuilder2, _a171, Check2, init_checks22, _a172, ForeignKeyBuilder22, _a173, ForeignKey22, init_foreign_keys22, _a174, UniqueConstraintBuilder2, _a175, UniqueOnConstraintBuilder2, _a176, UniqueConstraint2, init_unique_constraint22, _a177, _b121, SQLiteColumnBuilder, _a178, _b122, SQLiteColumn, init_common3, _a179, _b123, SQLiteBigIntBuilder, _a180, _b124, SQLiteBigInt, _a181, _b125, SQLiteBlobJsonBuilder, _a182, _b126, SQLiteBlobJson, _a183, _b127, SQLiteBlobBufferBuilder, _a184, _b128, SQLiteBlobBuffer, init_blob, _a185, _b129, SQLiteCustomColumnBuilder, _a186, _b130, SQLiteCustomColumn, init_custom22, _a187, _b131, SQLiteBaseIntegerBuilder, _a188, _b132, SQLiteBaseInteger, _a189, _b133, SQLiteIntegerBuilder, _a190, _b134, SQLiteInteger, _a191, _b135, SQLiteTimestampBuilder, _a192, _b136, SQLiteTimestamp, _a193, _b137, SQLiteBooleanBuilder, _a194, _b138, SQLiteBoolean, init_integer22, _a195, _b139, SQLiteNumericBuilder, _a196, _b140, SQLiteNumeric, _a197, _b141, SQLiteNumericNumberBuilder, _a198, _b142, SQLiteNumericNumber, _a199, _b143, SQLiteNumericBigIntBuilder, _a200, _b144, SQLiteNumericBigInt, init_numeric22, _a201, _b145, SQLiteRealBuilder, _a202, _b146, SQLiteReal, init_real22, _a203, _b147, SQLiteTextBuilder, _a204, _b148, SQLiteText, _a205, _b149, SQLiteTextJsonBuilder, _a206, _b150, SQLiteTextJson, init_text22, init_columns22, init_all22, InlineForeignKeys22, _a207, _b151, _c7, _d3, _e32, SQLiteTable, sqliteTable, init_table32, _a208, IndexBuilderOn22, _a209, IndexBuilder22, _a210, Index4, init_indexes22, _a211, PrimaryKeyBuilder22, _a212, PrimaryKey22, init_primary_keys22, init_utils72, _a213, _b152, SQLiteDeleteBase, init_delete22, _a214, _b153, SQLiteViewBase, init_view_base22, _a215, SQLiteDialect, _a216, _b154, SQLiteSyncDialect, _a217, _b155, SQLiteAsyncDialect, init_dialect22, _a218, SQLiteSelectBuilder, _a219, _b156, SQLiteSelectQueryBuilderBase, _a220, _b157, SQLiteSelectBase, getSQLiteSetOperators, union32, unionAll22, intersect22, except22, init_select32, _a221, QueryBuilder22, init_query_builder32, _a2222, SQLiteInsertBuilder, _a223, _b158, SQLiteInsertBase, init_insert22, init_select_types2, _a224, SQLiteUpdateBuilder, _a225, _b159, SQLiteUpdateBase, init_update22, init_query_builders22, _a226, _b160, _c8, _SQLiteCountBuilder, SQLiteCountBuilder, init_count22, _a227, RelationalQueryBuilder22, _a228, _b161, SQLiteRelationalQuery, _a229, _b162, SQLiteSyncRelationalQuery, init_query22, _a230, _b163, SQLiteRaw, init_raw22, _a231, BaseSQLiteDatabase, init_db22, _a232, _b164, ExecuteResultSync, _a233, SQLitePreparedQuery, _a234, SQLiteSession, _a235, _b165, SQLiteTransaction, init_session22, init_subquery3, _a236, ViewBuilderCore, _a237, _b166, ViewBuilder2, _a238, _b167, ManualViewBuilder2, _a239, _b168, SQLiteView2, init_view22, init_sqlite_core, generateSqliteSnapshot, fromDatabase2, init_sqliteSerializer, getTablesFilterByExtensions, init_getTablesFilterByExtensions, init_alias4, _a240, CheckBuilder3, _a241, Check3, init_checks32, _a242, ForeignKeyBuilder3, _a243, ForeignKey3, init_foreign_keys3, _a244, UniqueConstraintBuilder3, _a245, UniqueOnConstraintBuilder3, _a246, UniqueConstraint3, init_unique_constraint3, _a247, _b169, MySqlColumnBuilder, _a248, _b170, MySqlColumn, _a249, _b171, MySqlColumnBuilderWithAutoIncrement, _a250, _b172, MySqlColumnWithAutoIncrement, init_common4, _a251, _b173, MySqlBigInt53Builder, _a252, _b174, MySqlBigInt53, _a253, _b175, MySqlBigInt64Builder, _a254, _b176, MySqlBigInt64, init_bigint22, _a255, _b177, MySqlBinaryBuilder, _a256, _b178, MySqlBinary, init_binary, _a257, _b179, MySqlBooleanBuilder, _a258, _b180, MySqlBoolean, init_boolean22, _a259, _b181, MySqlCharBuilder, _a260, _b182, MySqlChar, init_char22, _a261, _b183, MySqlCustomColumnBuilder, _a262, _b184, MySqlCustomColumn, init_custom3, _a263, _b185, MySqlDateBuilder, _a264, _b186, MySqlDate, _a265, _b187, MySqlDateStringBuilder, _a266, _b188, MySqlDateString, init_date22, _a267, _b189, MySqlDateTimeBuilder, _a268, _b190, MySqlDateTime, _a269, _b191, MySqlDateTimeStringBuilder, _a270, _b192, MySqlDateTimeString, init_datetime, _a271, _b193, MySqlDecimalBuilder, _a272, _b194, MySqlDecimal, _a273, _b195, MySqlDecimalNumberBuilder, _a274, _b196, MySqlDecimalNumber, _a275, _b197, MySqlDecimalBigIntBuilder, _a276, _b198, MySqlDecimalBigInt, init_decimal, _a277, _b199, MySqlDoubleBuilder, _a278, _b200, MySqlDouble, init_double, _a279, _b201, MySqlEnumColumnBuilder, _a280, _b202, MySqlEnumColumn, _a281, _b203, MySqlEnumObjectColumnBuilder, _a282, _b204, MySqlEnumObjectColumn, init_enum22, _a283, _b205, MySqlFloatBuilder, _a284, _b206, MySqlFloat, init_float, _a285, _b207, MySqlIntBuilder, _a286, _b208, MySqlInt, init_int, _a287, _b209, MySqlJsonBuilder, _a288, _b210, MySqlJson, init_json22, _a289, _b211, MySqlMediumIntBuilder, _a290, _b212, MySqlMediumInt, init_mediumint, _a291, _b213, MySqlRealBuilder, _a292, _b214, MySqlReal, init_real3, _a293, _b215, MySqlSerialBuilder, _a294, _b216, MySqlSerial, init_serial22, _a295, _b217, MySqlSmallIntBuilder, _a296, _b218, MySqlSmallInt, init_smallint22, _a297, _b219, MySqlTextBuilder, _a298, _b220, MySqlText, init_text3, _a299, _b221, MySqlTimeBuilder, _a300, _b222, MySqlTime, init_time22, _a301, _b223, MySqlDateColumnBaseBuilder, _a302, _b224, MySqlDateBaseColumn, init_date_common22, _a303, _b225, MySqlTimestampBuilder, _a304, _b226, MySqlTimestamp, _a305, _b227, MySqlTimestampStringBuilder, _a306, _b228, MySqlTimestampString, init_timestamp22, _a307, _b229, MySqlTinyIntBuilder, _a308, _b230, MySqlTinyInt, init_tinyint, _a309, _b231, MySqlVarBinaryBuilder, _a310, _b232, MySqlVarBinary, init_varbinary, _a311, _b233, MySqlVarCharBuilder, _a312, _b234, MySqlVarChar, init_varchar22, _a313, _b235, MySqlYearBuilder, _a314, _b236, MySqlYear, init_year, init_columns3, _a315, _b237, _c9, _MySqlCountBuilder, MySqlCountBuilder, init_count3, _a316, IndexBuilderOn3, _a317, IndexBuilder3, _a318, Index5, init_indexes3, init_all3, InlineForeignKeys3, _a319, _b238, _c10, _d4, _e4, MySqlTable, mysqlTable, init_table42, _a320, PrimaryKeyBuilder3, _a321, PrimaryKey3, init_primary_keys3, MySqlViewConfig, init_view_common32, init_utils8, _a3222, _b239, MySqlDeleteBase, init_delete3, _a323, _b240, MySqlViewBase, init_view_base3, _a324, MySqlDialect, init_dialect3, _a325, MySqlSelectBuilder, _a326, _b241, MySqlSelectQueryBuilderBase, _a327, _b242, MySqlSelectBase, getMySqlSetOperators, union4, unionAll3, intersect3, intersectAll22, except3, exceptAll22, init_select4, _a328, QueryBuilder3, init_query_builder4, _a329, MySqlInsertBuilder, _a330, _b243, MySqlInsertBase, init_insert3, init_select_types3, _a331, MySqlUpdateBuilder, _a332, _b244, MySqlUpdateBase, init_update3, init_query_builders3, _a333, RelationalQueryBuilder3, _a334, _b245, MySqlRelationalQuery, init_query3, _a335, MySqlDatabase, init_db3, _a336, ViewBuilderCore2, _a337, _b246, ViewBuilder3, _a338, _b247, ManualViewBuilder3, _a339, _b248, _c11, MySqlView2, init_view3, _a340, MySqlSchema5, init_schema22, _a341, MySqlPreparedQuery, _a342, MySqlSession, _a343, _b249, MySqlTransaction, init_session32, init_subquery4, init_mysql_core, handleEnumType, generateMySqlSnapshot, fromDatabase3, init_mysqlSerializer, cliConfigGenerate, pushParams, pullParams, configCheck, cliConfigCheck, init_cli, gelCredentials, init_gel, libSQLCredentials, init_libsql, mysqlCredentials, init_mysql, postgresCredentials, init_postgres, singlestoreCredentials, init_singlestore, sqliteCredentials, init_sqlite, credentials, studioCliParams, studioConfig, init_studio, es5_exports, _3, es5_default, init_es5, import_hanji7, assertES5, safeRegister, migrateConfig, init_utils9, prepareFromExports, init_pgImports, init_alias5, _a344, UniqueConstraintBuilder4, _a345, UniqueOnConstraintBuilder4, _a346, UniqueConstraint4, init_unique_constraint4, _a347, _b250, SingleStoreColumnBuilder, _a348, _b251, SingleStoreColumn, _a349, _b252, SingleStoreColumnBuilderWithAutoIncrement, _a350, _b253, SingleStoreColumnWithAutoIncrement, init_common5, _a351, _b254, SingleStoreBigInt53Builder, _a352, _b255, SingleStoreBigInt53, _a353, _b256, SingleStoreBigInt64Builder, _a354, _b257, SingleStoreBigInt64, init_bigint3, _a355, _b258, SingleStoreBinaryBuilder, _a356, _b259, SingleStoreBinary, init_binary2, _a357, _b260, SingleStoreBooleanBuilder, _a358, _b261, SingleStoreBoolean, init_boolean3, _a359, _b262, SingleStoreCharBuilder, _a360, _b263, SingleStoreChar, init_char3, _a361, _b264, SingleStoreCustomColumnBuilder, _a362, _b265, SingleStoreCustomColumn, init_custom4, _a363, _b266, SingleStoreDateBuilder, _a364, _b267, SingleStoreDate, _a365, _b268, SingleStoreDateStringBuilder, _a366, _b269, SingleStoreDateString, init_date3, _a367, _b270, SingleStoreDateTimeBuilder, _a368, _b271, SingleStoreDateTime, _a369, _b272, SingleStoreDateTimeStringBuilder, _a370, _b273, SingleStoreDateTimeString, init_datetime2, _a371, _b274, SingleStoreDecimalBuilder, _a372, _b275, SingleStoreDecimal, _a373, _b276, SingleStoreDecimalNumberBuilder, _a374, _b277, SingleStoreDecimalNumber, _a375, _b278, SingleStoreDecimalBigIntBuilder, _a376, _b279, SingleStoreDecimalBigInt, init_decimal2, _a377, _b280, SingleStoreDoubleBuilder, _a378, _b281, SingleStoreDouble, init_double2, _a379, _b282, SingleStoreEnumColumnBuilder, _a380, _b283, SingleStoreEnumColumn, init_enum3, _a381, _b284, SingleStoreFloatBuilder, _a382, _b285, SingleStoreFloat, init_float2, _a383, _b286, SingleStoreIntBuilder, _a384, _b287, SingleStoreInt, init_int2, _a385, _b288, SingleStoreJsonBuilder, _a386, _b289, SingleStoreJson, init_json3, _a387, _b290, SingleStoreMediumIntBuilder, _a388, _b291, SingleStoreMediumInt, init_mediumint2, _a389, _b292, SingleStoreRealBuilder, _a390, _b293, SingleStoreReal, init_real4, _a391, _b294, SingleStoreSerialBuilder, _a392, _b295, SingleStoreSerial, init_serial3, _a393, _b296, SingleStoreSmallIntBuilder, _a394, _b297, SingleStoreSmallInt, init_smallint3, _a395, _b298, SingleStoreTextBuilder, _a396, _b299, SingleStoreText, init_text4, _a397, _b300, SingleStoreTimeBuilder, _a398, _b301, SingleStoreTime, init_time3, _a399, _b302, SingleStoreDateColumnBaseBuilder, _a400, _b303, SingleStoreDateBaseColumn, init_date_common3, _a401, _b304, SingleStoreTimestampBuilder, _a402, _b305, SingleStoreTimestamp, _a403, _b306, SingleStoreTimestampStringBuilder, _a404, _b307, SingleStoreTimestampString, init_timestamp3, _a405, _b308, SingleStoreTinyIntBuilder, _a406, _b309, SingleStoreTinyInt, init_tinyint2, _a407, _b310, SingleStoreVarBinaryBuilder, _a408, _b311, SingleStoreVarBinary, init_varbinary2, _a409, _b312, SingleStoreVarCharBuilder, _a410, _b313, SingleStoreVarChar, init_varchar3, _a411, _b314, SingleStoreVectorBuilder, _a412, _b315, SingleStoreVector, init_vector4, _a413, _b316, SingleStoreYearBuilder, _a414, _b317, SingleStoreYear, init_year2, init_columns4, _a415, _b318, _c12, _SingleStoreCountBuilder, SingleStoreCountBuilder, init_count4, _a416, IndexBuilderOn4, _a417, IndexBuilder4, _a418, Index6, init_indexes4, init_all4, _a419, _b319, _c13, _d5, SingleStoreTable, init_table52, _a420, PrimaryKeyBuilder4, _a421, PrimaryKey4, init_primary_keys4, init_utils10, _a422, _b320, SingleStoreDeleteBase, init_delete4, _a423, SingleStoreInsertBuilder, _a424, _b321, SingleStoreInsertBase, init_insert4, _a425, SingleStoreDialect, init_dialect4, _a426, SingleStoreSelectBuilder, _a427, _b322, SingleStoreSelectQueryBuilderBase, _a428, _b323, SingleStoreSelectBase, getSingleStoreSetOperators, union5, unionAll4, intersect4, except4, minus, init_select5, _a429, QueryBuilder4, init_query_builder5, init_select_types4, _a430, SingleStoreUpdateBuilder, _a431, _b324, SingleStoreUpdateBase, init_update4, init_query_builders4, _a432, SingleStoreDatabase, init_db4, _a433, SingleStoreSchema5, init_schema32, _a434, SingleStorePreparedQuery, _a435, SingleStoreSession, _a436, _b325, SingleStoreTransaction, init_session4, init_subquery5, init_singlestore_core, dialect5, generateSingleStoreSnapshot, fromDatabase4, init_singlestoreSerializer, sqliteImports_exports, prepareFromExports2, prepareFromSqliteImports, init_sqliteImports, mysqlImports_exports, prepareFromExports3, prepareFromMySqlImports, init_mysqlImports, mysqlPushUtils_exports, import_hanji8, filterStatements, logSuggestionsAndReturn2, init_mysqlPushUtils, mysqlIntrospect_exports, import_hanji9, mysqlPushIntrospect, init_mysqlIntrospect, singlestoreImports_exports, prepareFromExports4, prepareFromSingleStoreImports, init_singlestoreImports, singlestorePushUtils_exports, import_hanji10, filterStatements2, logSuggestionsAndReturn3, init_singlestorePushUtils, singlestoreIntrospect_exports, import_hanji11, singlestorePushIntrospect, init_singlestoreIntrospect, import_hanji3, pgPushIntrospect = async (db2, filters, schemaFilters, entities, tsSchema) => {
|
|
103392
|
+
}, __toESM5 = (mod, isNodeMode, target) => (target = mod != null ? __create2(__getProtoOf2(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp2(target, "default", { value: mod, enumerable: true }) : target, mod)), __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value), ANSI_BACKGROUND_OFFSET, wrapAnsi16, wrapAnsi256, wrapAnsi16m, styles2, modifierNames, foregroundColorNames, backgroundColorNames, colorNames, ansiStyles, ansi_styles_default, init_ansi_styles, env, flagForceColor, supportsColor, supports_color_default, init_supports_color, init_utilities, stdoutColor, stderrColor, GENERATOR, STYLER, IS_EMPTY, levelMapping, styles22, applyOptions, chalkFactory, getModelAnsi, usedModels, proto, createStyler, createBuilder, applyStyle, chalk, chalkStderr, source_default, init_source, require_old, require_fs, require_path, require_balanced_match, require_brace_expansion, require_minimatch, require_inherits_browser2, require_inherits2, require_common3, require_sync, require_wrappy, require_once, require_inflight, require_glob, require_readline, require_src3, require_utils4, require_lodash, require_hanji, originUUID, snapshotVersion, mapValues, mapKeys, mapEntries, customMapEntries, init_global2, util3, objectUtil2, ZodParsedType2, getParsedType4, init_util4, ZodIssueCode4, ZodError5, init_ZodError2, errorMap2, en_default4, init_en4, overrideErrorMap2, init_errors9, makeIssue2, ParseStatus2, INVALID3, DIRTY2, OK2, isAborted2, isDirty2, isValid2, isAsync2, init_parseUtil2, init_typeAliases2, errorUtil2, init_errorUtil2, ParseInputLazyPath2, handleResult2, ZodType4, cuidRegex2, cuid2Regex2, ulidRegex2, uuidRegex2, nanoidRegex2, jwtRegex2, durationRegex2, emailRegex2, _emojiRegex2, emojiRegex2, ipv4Regex2, ipv4CidrRegex2, ipv6Regex2, ipv6CidrRegex2, base64Regex2, base64urlRegex2, dateRegexSource2, dateRegex2, ZodString4, ZodNumber4, ZodBigInt4, ZodBoolean4, ZodDate4, ZodSymbol4, ZodUndefined4, ZodNull4, ZodAny4, ZodUnknown4, ZodNever4, ZodVoid4, ZodArray4, ZodObject4, ZodUnion4, getDiscriminator2, ZodDiscriminatedUnion4, ZodIntersection4, ZodTuple4, ZodRecord4, ZodMap4, ZodSet4, ZodFunction3, ZodLazy4, ZodLiteral4, ZodEnum4, ZodNativeEnum2, ZodPromise4, ZodEffects2, ZodOptional4, ZodNullable4, ZodDefault4, ZodCatch4, ZodNaN4, BRAND2, ZodBranded2, ZodPipeline2, ZodReadonly4, late2, ZodFirstPartyTypeKind3, stringType2, numberType2, nanType2, bigIntType2, booleanType2, dateType2, symbolType2, undefinedType2, nullType2, anyType2, unknownType2, neverType2, voidType2, arrayType2, objectType2, strictObjectType2, unionType2, discriminatedUnionType2, intersectionType2, tupleType2, recordType2, mapType2, setType2, functionType2, lazyType2, literalType2, enumType2, nativeEnumType2, promiseType2, effectsType2, optionalType2, nullableType2, preprocessType2, pipelineType2, coerce2, init_types5, init_external4, init_v32, init_esm2, enumSchema, enumSchemaV1, indexColumn, index2, fk, sequenceSchema, roleSchema, sequenceSquashed, column2, checkConstraint, columnSquashed, compositePK, uniqueConstraint, policy, policySquashed, viewWithOption, matViewWithOption, mergedViewWithOption, view2, table8, schemaHash, kitInternals, gelSchemaExternal, gelSchemaInternal, tableSquashed, gelSchemaSquashed, gelSchema, dryGel, init_gelSchema, index22, fk2, column22, tableV3, compositePK2, uniqueConstraint2, checkConstraint2, tableV4, table22, viewMeta, view22, kitInternals2, dialect2, schemaHash2, schemaInternalV3, schemaInternalV4, schemaInternalV5, schemaInternal, schemaV3, schemaV4, schemaV5, schema2, tableSquashedV4, tableSquashed2, viewSquashed, schemaSquashed, schemaSquashedV4, MySqlSquasher, squashMysqlScheme, mysqlSchema, mysqlSchemaV5, mysqlSchemaSquashed, backwardCompatibleMysqlSchema, dryMySql, init_mysqlSchema, indexV2, columnV2, tableV2, enumSchemaV12, enumSchema2, pgSchemaV2, references, columnV1, tableV1, pgSchemaV1, indexColumn2, index3, indexV4, indexV5, indexV6, fk3, sequenceSchema2, roleSchema2, sequenceSquashed2, columnV7, column3, checkConstraint3, columnSquashed2, tableV32, compositePK3, uniqueConstraint3, policy2, policySquashed2, viewWithOption2, matViewWithOption2, mergedViewWithOption2, view3, tableV42, tableV5, tableV6, tableV7, table32, schemaHash3, kitInternals3, pgSchemaInternalV3, pgSchemaInternalV4, pgSchemaInternalV5, pgSchemaInternalV6, pgSchemaExternal, pgSchemaInternalV7, pgSchemaInternal, tableSquashed3, tableSquashedV42, pgSchemaSquashedV4, pgSchemaSquashedV6, pgSchemaSquashed, pgSchemaV3, pgSchemaV4, pgSchemaV5, pgSchemaV6, pgSchemaV7, pgSchema, backwardCompatiblePgSchema, PgSquasher, squashPgScheme, dryPg, init_pgSchema, index4, column4, compositePK4, uniqueConstraint4, table42, viewMeta2, kitInternals4, dialect22, schemaHash4, schemaInternal2, schema22, tableSquashed4, schemaSquashed2, SingleStoreSquasher, squashSingleStoreScheme, singlestoreSchema, singlestoreSchemaSquashed, backwardCompatibleSingleStoreSchema, drySingleStore, init_singlestoreSchema, index5, fk4, compositePK5, column5, tableV33, uniqueConstraint5, checkConstraint4, table52, view4, dialect3, schemaHash5, schemaInternalV32, schemaInternalV42, schemaInternalV52, kitInternals5, latestVersion, schemaInternal3, schemaV32, schemaV42, schemaV52, schema3, tableSquashed5, schemaSquashed3, SQLiteSquasher, squashSqliteScheme, drySQLite, sqliteSchemaV5, sqliteSchema, SQLiteSchemaSquashed, backwardCompatibleSqliteSchema, init_sqliteSchema, copy, prepareMigrationMeta, schemaRenameKey, tableRenameKey, columnRenameKey, init_utils7, import_hanji, warning, error88, isRenamePromptItem, ResolveColumnSelect, tableKey, ResolveSelectNamed, ResolveSelect, ResolveSchemasSelect, Spinner2, ProgressView, init_views, glob, init_serializer, fillPgSnapshot, init_migrationPreparator, require_heap, require_heap2, require_difflib, require_difflib2, require_util2, require_styles, require_has_flag2, require_supports_colors, require_trap, require_zalgo, require_america, require_zebra, require_rainbow, require_random, require_colors, require_safe, require_colorize, require_lib4, import_json_diff, mapArraysDiff, findAlternationsInTable, alternationsInColumn, init_jsonDiffer, parseType, Convertor, PgCreateRoleConvertor, PgDropRoleConvertor, PgRenameRoleConvertor, PgAlterRoleConvertor, PgCreatePolicyConvertor, PgDropPolicyConvertor, PgRenamePolicyConvertor, PgAlterPolicyConvertor, PgCreateIndPolicyConvertor, PgDropIndPolicyConvertor, PgRenameIndPolicyConvertor, PgAlterIndPolicyConvertor, PgEnableRlsConvertor, PgDisableRlsConvertor, PgCreateTableConvertor, MySqlCreateTableConvertor, SingleStoreCreateTableConvertor, SQLiteCreateTableConvertor, PgCreateViewConvertor, MySqlCreateViewConvertor, SqliteCreateViewConvertor, PgDropViewConvertor, MySqlDropViewConvertor, SqliteDropViewConvertor, MySqlAlterViewConvertor, PgRenameViewConvertor, MySqlRenameViewConvertor, PgAlterViewSchemaConvertor, PgAlterViewAddWithOptionConvertor, PgAlterViewDropWithOptionConvertor, PgAlterViewAlterTablespaceConvertor, PgAlterViewAlterUsingConvertor, PgAlterTableAlterColumnSetGenerated, PgAlterTableAlterColumnDropGenerated, PgAlterTableAlterColumnAlterGenerated, PgAlterTableAddUniqueConstraintConvertor, PgAlterTableDropUniqueConstraintConvertor, PgAlterTableAddCheckConstraintConvertor, PgAlterTableDeleteCheckConstraintConvertor, MySQLAlterTableAddUniqueConstraintConvertor, MySQLAlterTableDropUniqueConstraintConvertor, MySqlAlterTableAddCheckConstraintConvertor, SingleStoreAlterTableAddUniqueConstraintConvertor, SingleStoreAlterTableDropUniqueConstraintConvertor, MySqlAlterTableDeleteCheckConstraintConvertor, CreatePgSequenceConvertor, DropPgSequenceConvertor, RenamePgSequenceConvertor, MovePgSequenceConvertor, AlterPgSequenceConvertor, CreateTypeEnumConvertor, DropTypeEnumConvertor, AlterTypeAddValueConvertor, AlterTypeSetSchemaConvertor, AlterRenameTypeConvertor, AlterTypeDropValueConvertor, PgDropTableConvertor, MySQLDropTableConvertor, SingleStoreDropTableConvertor, SQLiteDropTableConvertor, PgRenameTableConvertor, SqliteRenameTableConvertor, MySqlRenameTableConvertor, SingleStoreRenameTableConvertor, PgAlterTableRenameColumnConvertor, MySqlAlterTableRenameColumnConvertor, SingleStoreAlterTableRenameColumnConvertor, SQLiteAlterTableRenameColumnConvertor, PgAlterTableDropColumnConvertor, MySqlAlterTableDropColumnConvertor, SingleStoreAlterTableDropColumnConvertor, SQLiteAlterTableDropColumnConvertor, PgAlterTableAddColumnConvertor, MySqlAlterTableAddColumnConvertor, SingleStoreAlterTableAddColumnConvertor, SQLiteAlterTableAddColumnConvertor, PgAlterTableAlterColumnSetTypeConvertor, PgAlterTableAlterColumnSetDefaultConvertor, PgAlterTableAlterColumnDropDefaultConvertor, PgAlterTableAlterColumnDropGeneratedConvertor, PgAlterTableAlterColumnSetExpressionConvertor, PgAlterTableAlterColumnAlterrGeneratedConvertor, SqliteAlterTableAlterColumnDropGeneratedConvertor, SqliteAlterTableAlterColumnSetExpressionConvertor, SqliteAlterTableAlterColumnAlterGeneratedConvertor, MySqlAlterTableAlterColumnAlterrGeneratedConvertor, MySqlAlterTableAddPk, MySqlAlterTableDropPk, LibSQLModifyColumn, MySqlModifyColumn, SingleStoreAlterTableAlterColumnAlterrGeneratedConvertor, SingleStoreAlterTableAddPk, SingleStoreAlterTableDropPk, SingleStoreModifyColumn, PgAlterTableCreateCompositePrimaryKeyConvertor, PgAlterTableDeleteCompositePrimaryKeyConvertor, PgAlterTableAlterCompositePrimaryKeyConvertor, MySqlAlterTableCreateCompositePrimaryKeyConvertor, MySqlAlterTableDeleteCompositePrimaryKeyConvertor, MySqlAlterTableAlterCompositePrimaryKeyConvertor, PgAlterTableAlterColumnSetPrimaryKeyConvertor, PgAlterTableAlterColumnDropPrimaryKeyConvertor, PgAlterTableAlterColumnSetNotNullConvertor, PgAlterTableAlterColumnDropNotNullConvertor, PgCreateForeignKeyConvertor, LibSQLCreateForeignKeyConvertor, MySqlCreateForeignKeyConvertor, PgAlterForeignKeyConvertor, PgDeleteForeignKeyConvertor, MySqlDeleteForeignKeyConvertor, CreatePgIndexConvertor, CreateMySqlIndexConvertor, CreateSingleStoreIndexConvertor, CreateSqliteIndexConvertor, PgDropIndexConvertor, PgCreateSchemaConvertor, PgRenameSchemaConvertor, PgDropSchemaConvertor, PgAlterTableSetSchemaConvertor, PgAlterTableSetNewSchemaConvertor, PgAlterTableRemoveFromSchemaConvertor, SqliteDropIndexConvertor, MySqlDropIndexConvertor, SingleStoreDropIndexConvertor, SQLiteRecreateTableConvertor, LibSQLRecreateTableConvertor, SingleStoreRecreateTableConvertor, convertors, init_sqlgenerator, _moveDataStatements, getOldTableName, getNewTableName, logSuggestionsAndReturn, init_sqlitePushUtils, preparePgCreateTableJson, prepareMySqlCreateTableJson, prepareSingleStoreCreateTableJson, prepareSQLiteCreateTable, prepareDropTableJson, prepareRenameTableJson, prepareCreateEnumJson, prepareAddValuesToEnumJson, prepareDropEnumValues, prepareDropEnumJson, prepareMoveEnumJson, prepareRenameEnumJson, prepareCreateSequenceJson, prepareAlterSequenceJson, prepareDropSequenceJson, prepareMoveSequenceJson, prepareRenameSequenceJson, prepareCreateRoleJson, prepareAlterRoleJson, prepareDropRoleJson, prepareRenameRoleJson, prepareCreateSchemasJson, prepareRenameSchemasJson, prepareDeleteSchemasJson, prepareRenameColumns, _prepareDropColumns, _prepareAddColumns, _prepareSqliteAddColumns, prepareAlterColumnsMysql, preparePgAlterColumns, prepareSqliteAlterColumns, prepareRenamePolicyJsons, prepareRenameIndPolicyJsons, prepareCreatePolicyJsons, prepareCreateIndPolicyJsons, prepareDropPolicyJsons, prepareDropIndPolicyJsons, prepareAlterPolicyJson, prepareAlterIndPolicyJson, preparePgCreateIndexesJson, prepareCreateIndexesJson, prepareCreateReferencesJson, prepareLibSQLCreateReferencesJson, prepareDropReferencesJson, prepareLibSQLDropReferencesJson, prepareAlterReferencesJson, prepareDropIndexesJson, prepareAddCompositePrimaryKeySqlite, prepareDeleteCompositePrimaryKeySqlite, prepareAlterCompositePrimaryKeySqlite, prepareAddCompositePrimaryKeyPg, prepareDeleteCompositePrimaryKeyPg, prepareAlterCompositePrimaryKeyPg, prepareAddUniqueConstraintPg, prepareDeleteUniqueConstraintPg, prepareAddCheckConstraint, prepareDeleteCheckConstraint, prepareAddCompositePrimaryKeyMySql, prepareDeleteCompositePrimaryKeyMySql, prepareAlterCompositePrimaryKeyMySql, preparePgCreateViewJson, prepareMySqlCreateViewJson, prepareSqliteCreateViewJson, prepareDropViewJson, prepareRenameViewJson, preparePgAlterViewAlterSchemaJson, preparePgAlterViewAddWithOptionJson, preparePgAlterViewDropWithOptionJson, preparePgAlterViewAlterTablespaceJson, preparePgAlterViewAlterUsingJson, prepareMySqlAlterView, init_jsonStatements, prepareLibSQLRecreateTable, prepareSQLiteRecreateTable, libSQLCombineStatements, sqliteCombineStatements, prepareSingleStoreRecreateTable, singleStoreCombineStatements, init_statementCombiner, snapshotsDiffer_exports, makeChanged, makeSelfOrChanged, makePatched, makeSelfOrPatched, columnSchema, alteredColumnSchema, enumSchema3, changedEnumSchema, tableScheme, alteredTableScheme, alteredViewCommon, alteredPgViewSchema, alteredMySqlViewSchema, diffResultScheme, diffResultSchemeMysql, diffResultSchemeSingleStore, diffResultSchemeSQLite, schemaChangeFor, nameChangeFor, nameSchemaChangeFor, columnChangeFor, applyPgSnapshotsDiff, applyMysqlSnapshotsDiff, applySingleStoreSnapshotsDiff, applySqliteSnapshotsDiff, applyLibSQLSnapshotsDiff, init_snapshotsDiffer, init_words, dialects, dialect4, commonSquashedSchema, commonSchema, init_schemaValidator, sqliteDriversLiterals, postgresqlDriversLiterals, prefixes, prefix, casingTypes, casingType, sqliteDriver, postgresDriver, driver2, configMigrations, configCommonSchema, casing, introspectParams, configIntrospectCliSchema, configGenerateSchema, configPushSchema, init_common2, withStyle, init_outputs, import_hanji2, schemasResolver, tablesResolver, viewsResolver, mySqlViewsResolver, sqliteViewsResolver, sequencesResolver, roleResolver, policyResolver, indPolicyResolver, enumsResolver, columnsResolver, promptColumnsConflicts, promptNamedConflict, promptNamedWithSchemasConflict, promptSchemasConflict, BREAKPOINT, init_migrate, posixClasses, braceEscape, regexpEscape, rangesToString, parseClass, init_brace_expressions, escape, init_escape, unescape, init_unescape, import_brace_expansion, minimatch, starDotExtRE, starDotExtTest, starDotExtTestDot, starDotExtTestNocase, starDotExtTestNocaseDot, starDotStarRE, starDotStarTest, starDotStarTestDot, dotStarRE, dotStarTest, starRE, starTest, starTestDot, qmarksRE, qmarksTestNocase, qmarksTestNocaseDot, qmarksTestDot, qmarksTest, qmarksTestNoExt, qmarksTestNoExtDot, defaultPlatform, path, sep2, GLOBSTAR, plTypes, qmark, star, twoStarDot, twoStarNoDot, charSet, reSpecials, addPatternStartSet, filter, ext, defaults, braceExpand, MAX_PATTERN_LENGTH, assertValidPattern, makeRe, match2, globUnescape, globMagic, regExpEscape, Minimatch, init_mjs, entityKind2, hasOwnEntityKind2, init_entity2, _a3, Column2, init_column2, _a22, ColumnBuilder2, init_column_builder2, TableName2, init_table_utils2, _a32, ForeignKeyBuilder2, _a4, ForeignKey2, init_foreign_keys2, init_tracing_utils2, _a5, UniqueConstraintBuilder, _a6, UniqueOnConstraintBuilder, _a7, UniqueConstraint, init_unique_constraint2, init_array2, _a8, _b, PgColumnBuilder2, _a9, _b2, PgColumn2, _a10, _b3, ExtraConfigColumn2, _a11, IndexedColumn2, _a12, _b4, PgArrayBuilder2, _a13, _b5, _PgArray, PgArray2, init_common22, _a14, _b6, PgEnumObjectColumnBuilder2, _a15, _b7, PgEnumObjectColumn2, isPgEnumSym2, _a16, _b8, PgEnumColumnBuilder2, _a17, _b9, PgEnumColumn2, init_enum2, _a18, Subquery2, _a19, _b10, WithSubquery2, init_subquery2, version4, init_version2, otel2, rawTracer2, tracer2, init_tracing2, ViewBaseConfig2, init_view_common3, Schema2, Columns2, ExtraConfigColumns2, OriginalName2, BaseName2, IsAlias2, ExtraConfigBuilder2, IsDrizzleTable2, _a20, _b11, _c, _d, _e3, _f, _g, _h, _i, _j, Table2, init_table8, _a21, FakePrimitiveParam, _a222, StringChunk2, _a23, _SQL, SQL2, _a24, Name2, noopDecoder2, noopEncoder2, noopMapper2, _a25, Param2, _a26, Placeholder2, IsDrizzleView2, _a27, _b12, _c2, View3, init_sql4, _a28, ColumnAliasProxyHandler2, _a29, TableAliasProxyHandler2, _a30, RelationTableAliasProxyHandler, init_alias3, _a31, _b13, DrizzleError2, DrizzleQueryError, _a322, _b14, TransactionRollbackError2, init_errors22, _a33, ConsoleLogWriter2, _a34, DefaultLogger2, _a35, NoopLogger2, init_logger3, init_operations, _a36, _b15, QueryPromise2, init_query_promise2, textDecoder, init_utils22, _a37, _b16, PgIntColumnBaseBuilder2, init_int_common2, _a38, _b17, PgBigInt53Builder2, _a39, _b18, PgBigInt532, _a40, _b19, PgBigInt64Builder2, _a41, _b20, PgBigInt642, init_bigint2, _a42, _b21, PgBigSerial53Builder2, _a43, _b22, PgBigSerial532, _a44, _b23, PgBigSerial64Builder2, _a45, _b24, PgBigSerial642, init_bigserial2, _a46, _b25, PgBooleanBuilder2, _a47, _b26, PgBoolean2, init_boolean2, _a48, _b27, PgCharBuilder2, _a49, _b28, PgChar2, init_char2, _a50, _b29, PgCidrBuilder2, _a51, _b30, PgCidr2, init_cidr2, _a52, _b31, PgCustomColumnBuilder2, _a53, _b32, PgCustomColumn2, init_custom2, _a54, _b33, PgDateColumnBaseBuilder2, init_date_common2, _a55, _b34, PgDateBuilder2, _a56, _b35, PgDate2, _a57, _b36, PgDateStringBuilder2, _a58, _b37, PgDateString2, init_date2, _a59, _b38, PgDoublePrecisionBuilder2, _a60, _b39, PgDoublePrecision2, init_double_precision2, _a61, _b40, PgInetBuilder2, _a62, _b41, PgInet2, init_inet2, _a63, _b42, PgIntegerBuilder2, _a64, _b43, PgInteger2, init_integer2, _a65, _b44, PgIntervalBuilder2, _a66, _b45, PgInterval2, init_interval2, _a67, _b46, PgJsonBuilder2, _a68, _b47, PgJson2, init_json2, _a69, _b48, PgJsonbBuilder2, _a70, _b49, PgJsonb2, init_jsonb2, _a71, _b50, PgLineBuilder2, _a72, _b51, PgLineTuple2, _a73, _b52, PgLineABCBuilder2, _a74, _b53, PgLineABC2, init_line2, _a75, _b54, PgMacaddrBuilder2, _a76, _b55, PgMacaddr2, init_macaddr2, _a77, _b56, PgMacaddr8Builder2, _a78, _b57, PgMacaddr82, init_macaddr82, _a79, _b58, PgNumericBuilder2, _a80, _b59, PgNumeric2, _a81, _b60, PgNumericNumberBuilder2, _a82, _b61, PgNumericNumber2, _a83, _b62, PgNumericBigIntBuilder2, _a84, _b63, PgNumericBigInt2, init_numeric2, _a85, _b64, PgPointTupleBuilder2, _a86, _b65, PgPointTuple2, _a87, _b66, PgPointObjectBuilder2, _a88, _b67, PgPointObject2, init_point2, init_utils32, _a89, _b68, PgGeometryBuilder2, _a90, _b69, PgGeometry2, _a91, _b70, PgGeometryObjectBuilder2, _a92, _b71, PgGeometryObject2, init_geometry2, _a93, _b72, PgRealBuilder2, _a94, _b73, PgReal2, init_real2, _a95, _b74, PgSerialBuilder2, _a96, _b75, PgSerial2, init_serial2, _a97, _b76, PgSmallIntBuilder2, _a98, _b77, PgSmallInt2, init_smallint2, _a99, _b78, PgSmallSerialBuilder2, _a100, _b79, PgSmallSerial2, init_smallserial2, _a101, _b80, PgTextBuilder2, _a102, _b81, PgText2, init_text2, _a103, _b82, PgTimeBuilder2, _a104, _b83, PgTime2, init_time2, _a105, _b84, PgTimestampBuilder2, _a106, _b85, PgTimestamp2, _a107, _b86, PgTimestampStringBuilder2, _a108, _b87, PgTimestampString2, init_timestamp2, _a109, _b88, PgUUIDBuilder2, _a110, _b89, PgUUID2, init_uuid3, _a111, _b90, PgVarcharBuilder2, _a112, _b91, PgVarchar2, init_varchar2, _a113, _b92, PgBinaryVectorBuilder2, _a114, _b93, PgBinaryVector2, init_bit2, _a115, _b94, PgHalfVectorBuilder2, _a116, _b95, PgHalfVector2, init_halfvec2, _a117, _b96, PgSparseVectorBuilder2, _a118, _b97, PgSparseVector2, init_sparsevec2, _a119, _b98, PgVectorBuilder2, _a120, _b99, PgVector2, init_vector3, init_all2, InlineForeignKeys2, EnableRLS2, _a121, _b100, _c3, _d2, _e22, _f2, PgTable2, pgTable2, init_table22, _a122, PrimaryKeyBuilder2, _a123, PrimaryKey2, init_primary_keys2, eq2, ne4, gt3, gte2, lt4, lte2, init_conditions2, init_select3, init_expressions2, _a124, Relation2, _a125, Relations2, _a126, _b101, _One, One2, _a127, _b102, _Many, Many2, init_relations2, init_aggregate2, init_vector22, init_functions2, init_sql22, dist_exports, init_dist9, init_alias22, _a128, CheckBuilder, _a129, Check, init_checks6, init_columns2, _a130, _SelectionProxyHandler, SelectionProxyHandler2, init_selection_proxy2, _a131, IndexBuilderOn2, _a132, IndexBuilder2, _a133, Index2, init_indexes2, _a134, PgPolicy, init_policies2, PgViewConfig2, init_view_common22, _a135, CasingCache2, init_casing2, _a136, _b103, PgViewBase2, init_view_base2, _a137, PgDialect2, init_dialect2, _a138, TypedQueryBuilder2, init_query_builder3, _a139, PgSelectBuilder2, _a140, _b104, PgSelectQueryBuilderBase2, _a141, _b105, PgSelectBase2, getPgSetOperators2, union22, unionAll2, intersect2, intersectAll2, except2, exceptAll2, init_select22, _a142, QueryBuilder2, init_query_builder22, _a143, DefaultViewBuilderCore, _a144, _b106, ViewBuilder, _a145, _b107, ManualViewBuilder, _a146, MaterializedViewBuilderCore, _a147, _b108, MaterializedViewBuilder, _a148, _b109, ManualMaterializedViewBuilder, _a149, _b110, _c4, PgView2, PgMaterializedViewConfig2, _a150, _b111, _c5, PgMaterializedView, init_view2, init_utils42, _a151, _b112, PgDeleteBase2, init_delete2, _a152, PgInsertBuilder2, _a153, _b113, PgInsertBase2, init_insert2, _a154, _b114, PgRefreshMaterializedView2, init_refresh_materialized_view2, init_select_types, _a155, PgUpdateBuilder2, _a156, _b115, PgUpdateBase2, init_update2, init_query_builders2, _a157, _b116, _c6, _PgCountBuilder, PgCountBuilder2, init_count2, _a158, RelationalQueryBuilder2, _a159, _b117, PgRelationalQuery2, init_query2, _a160, _b118, PgRaw2, init_raw2, _a161, PgDatabase2, init_db2, _a162, PgRole, init_roles2, _a163, PgSequence, init_sequence2, _a164, PgSchema5, init_schema4, _a165, Cache, _a166, _b119, NoopCache, init_cache, _a167, PgPreparedQuery2, _a168, PgSession2, _a169, _b120, PgTransaction2, init_session3, init_subquery22, init_utils52, init_pg_core2, vectorOps, init_vector32, sqlToStr, init_utils62, indexName, generatePgSnapshot, trimChar, fromDatabase, defaultForColumn, getColumnsInfoQuery, init_pgSerializer, import_hanji4, Select, init_selector_ui, init_alias32, _a170, CheckBuilder2, _a171, Check2, init_checks22, _a172, ForeignKeyBuilder22, _a173, ForeignKey22, init_foreign_keys22, _a174, UniqueConstraintBuilder2, _a175, UniqueOnConstraintBuilder2, _a176, UniqueConstraint2, init_unique_constraint22, _a177, _b121, SQLiteColumnBuilder, _a178, _b122, SQLiteColumn, init_common3, _a179, _b123, SQLiteBigIntBuilder, _a180, _b124, SQLiteBigInt, _a181, _b125, SQLiteBlobJsonBuilder, _a182, _b126, SQLiteBlobJson, _a183, _b127, SQLiteBlobBufferBuilder, _a184, _b128, SQLiteBlobBuffer, init_blob, _a185, _b129, SQLiteCustomColumnBuilder, _a186, _b130, SQLiteCustomColumn, init_custom22, _a187, _b131, SQLiteBaseIntegerBuilder, _a188, _b132, SQLiteBaseInteger, _a189, _b133, SQLiteIntegerBuilder, _a190, _b134, SQLiteInteger, _a191, _b135, SQLiteTimestampBuilder, _a192, _b136, SQLiteTimestamp, _a193, _b137, SQLiteBooleanBuilder, _a194, _b138, SQLiteBoolean, init_integer22, _a195, _b139, SQLiteNumericBuilder, _a196, _b140, SQLiteNumeric, _a197, _b141, SQLiteNumericNumberBuilder, _a198, _b142, SQLiteNumericNumber, _a199, _b143, SQLiteNumericBigIntBuilder, _a200, _b144, SQLiteNumericBigInt, init_numeric22, _a201, _b145, SQLiteRealBuilder, _a202, _b146, SQLiteReal, init_real22, _a203, _b147, SQLiteTextBuilder, _a204, _b148, SQLiteText, _a205, _b149, SQLiteTextJsonBuilder, _a206, _b150, SQLiteTextJson, init_text22, init_columns22, init_all22, InlineForeignKeys22, _a207, _b151, _c7, _d3, _e32, SQLiteTable, sqliteTable, init_table32, _a208, IndexBuilderOn22, _a209, IndexBuilder22, _a210, Index4, init_indexes22, _a211, PrimaryKeyBuilder22, _a212, PrimaryKey22, init_primary_keys22, init_utils72, _a213, _b152, SQLiteDeleteBase, init_delete22, _a214, _b153, SQLiteViewBase, init_view_base22, _a215, SQLiteDialect, _a216, _b154, SQLiteSyncDialect, _a217, _b155, SQLiteAsyncDialect, init_dialect22, _a218, SQLiteSelectBuilder, _a219, _b156, SQLiteSelectQueryBuilderBase, _a220, _b157, SQLiteSelectBase, getSQLiteSetOperators, union32, unionAll22, intersect22, except22, init_select32, _a221, QueryBuilder22, init_query_builder32, _a2222, SQLiteInsertBuilder, _a223, _b158, SQLiteInsertBase, init_insert22, init_select_types2, _a224, SQLiteUpdateBuilder, _a225, _b159, SQLiteUpdateBase, init_update22, init_query_builders22, _a226, _b160, _c8, _SQLiteCountBuilder, SQLiteCountBuilder, init_count22, _a227, RelationalQueryBuilder22, _a228, _b161, SQLiteRelationalQuery, _a229, _b162, SQLiteSyncRelationalQuery, init_query22, _a230, _b163, SQLiteRaw, init_raw22, _a231, BaseSQLiteDatabase, init_db22, _a232, _b164, ExecuteResultSync, _a233, SQLitePreparedQuery, _a234, SQLiteSession, _a235, _b165, SQLiteTransaction, init_session22, init_subquery3, _a236, ViewBuilderCore, _a237, _b166, ViewBuilder2, _a238, _b167, ManualViewBuilder2, _a239, _b168, SQLiteView2, init_view22, init_sqlite_core, generateSqliteSnapshot, fromDatabase2, init_sqliteSerializer, getTablesFilterByExtensions, init_getTablesFilterByExtensions, init_alias4, _a240, CheckBuilder3, _a241, Check3, init_checks32, _a242, ForeignKeyBuilder3, _a243, ForeignKey3, init_foreign_keys3, _a244, UniqueConstraintBuilder3, _a245, UniqueOnConstraintBuilder3, _a246, UniqueConstraint3, init_unique_constraint3, _a247, _b169, MySqlColumnBuilder, _a248, _b170, MySqlColumn, _a249, _b171, MySqlColumnBuilderWithAutoIncrement, _a250, _b172, MySqlColumnWithAutoIncrement, init_common4, _a251, _b173, MySqlBigInt53Builder, _a252, _b174, MySqlBigInt53, _a253, _b175, MySqlBigInt64Builder, _a254, _b176, MySqlBigInt64, init_bigint22, _a255, _b177, MySqlBinaryBuilder, _a256, _b178, MySqlBinary, init_binary, _a257, _b179, MySqlBooleanBuilder, _a258, _b180, MySqlBoolean, init_boolean22, _a259, _b181, MySqlCharBuilder, _a260, _b182, MySqlChar, init_char22, _a261, _b183, MySqlCustomColumnBuilder, _a262, _b184, MySqlCustomColumn, init_custom3, _a263, _b185, MySqlDateBuilder, _a264, _b186, MySqlDate, _a265, _b187, MySqlDateStringBuilder, _a266, _b188, MySqlDateString, init_date22, _a267, _b189, MySqlDateTimeBuilder, _a268, _b190, MySqlDateTime, _a269, _b191, MySqlDateTimeStringBuilder, _a270, _b192, MySqlDateTimeString, init_datetime, _a271, _b193, MySqlDecimalBuilder, _a272, _b194, MySqlDecimal, _a273, _b195, MySqlDecimalNumberBuilder, _a274, _b196, MySqlDecimalNumber, _a275, _b197, MySqlDecimalBigIntBuilder, _a276, _b198, MySqlDecimalBigInt, init_decimal, _a277, _b199, MySqlDoubleBuilder, _a278, _b200, MySqlDouble, init_double, _a279, _b201, MySqlEnumColumnBuilder, _a280, _b202, MySqlEnumColumn, _a281, _b203, MySqlEnumObjectColumnBuilder, _a282, _b204, MySqlEnumObjectColumn, init_enum22, _a283, _b205, MySqlFloatBuilder, _a284, _b206, MySqlFloat, init_float, _a285, _b207, MySqlIntBuilder, _a286, _b208, MySqlInt, init_int, _a287, _b209, MySqlJsonBuilder, _a288, _b210, MySqlJson, init_json22, _a289, _b211, MySqlMediumIntBuilder, _a290, _b212, MySqlMediumInt, init_mediumint, _a291, _b213, MySqlRealBuilder, _a292, _b214, MySqlReal, init_real3, _a293, _b215, MySqlSerialBuilder, _a294, _b216, MySqlSerial, init_serial22, _a295, _b217, MySqlSmallIntBuilder, _a296, _b218, MySqlSmallInt, init_smallint22, _a297, _b219, MySqlTextBuilder, _a298, _b220, MySqlText, init_text3, _a299, _b221, MySqlTimeBuilder, _a300, _b222, MySqlTime, init_time22, _a301, _b223, MySqlDateColumnBaseBuilder, _a302, _b224, MySqlDateBaseColumn, init_date_common22, _a303, _b225, MySqlTimestampBuilder, _a304, _b226, MySqlTimestamp, _a305, _b227, MySqlTimestampStringBuilder, _a306, _b228, MySqlTimestampString, init_timestamp22, _a307, _b229, MySqlTinyIntBuilder, _a308, _b230, MySqlTinyInt, init_tinyint, _a309, _b231, MySqlVarBinaryBuilder, _a310, _b232, MySqlVarBinary, init_varbinary, _a311, _b233, MySqlVarCharBuilder, _a312, _b234, MySqlVarChar, init_varchar22, _a313, _b235, MySqlYearBuilder, _a314, _b236, MySqlYear, init_year, init_columns3, _a315, _b237, _c9, _MySqlCountBuilder, MySqlCountBuilder, init_count3, _a316, IndexBuilderOn3, _a317, IndexBuilder3, _a318, Index5, init_indexes3, init_all3, InlineForeignKeys3, _a319, _b238, _c10, _d4, _e4, MySqlTable, mysqlTable, init_table42, _a320, PrimaryKeyBuilder3, _a321, PrimaryKey3, init_primary_keys3, MySqlViewConfig, init_view_common32, init_utils8, _a3222, _b239, MySqlDeleteBase, init_delete3, _a323, _b240, MySqlViewBase, init_view_base3, _a324, MySqlDialect, init_dialect3, _a325, MySqlSelectBuilder, _a326, _b241, MySqlSelectQueryBuilderBase, _a327, _b242, MySqlSelectBase, getMySqlSetOperators, union4, unionAll3, intersect3, intersectAll22, except3, exceptAll22, init_select4, _a328, QueryBuilder3, init_query_builder4, _a329, MySqlInsertBuilder, _a330, _b243, MySqlInsertBase, init_insert3, init_select_types3, _a331, MySqlUpdateBuilder, _a332, _b244, MySqlUpdateBase, init_update3, init_query_builders3, _a333, RelationalQueryBuilder3, _a334, _b245, MySqlRelationalQuery, init_query3, _a335, MySqlDatabase, init_db3, _a336, ViewBuilderCore2, _a337, _b246, ViewBuilder3, _a338, _b247, ManualViewBuilder3, _a339, _b248, _c11, MySqlView2, init_view3, _a340, MySqlSchema5, init_schema22, _a341, MySqlPreparedQuery, _a342, MySqlSession, _a343, _b249, MySqlTransaction, init_session32, init_subquery4, init_mysql_core, handleEnumType, generateMySqlSnapshot, fromDatabase3, init_mysqlSerializer, cliConfigGenerate, pushParams, pullParams, configCheck, cliConfigCheck, init_cli, gelCredentials, init_gel, libSQLCredentials, init_libsql, mysqlCredentials, init_mysql, postgresCredentials, init_postgres, singlestoreCredentials, init_singlestore, sqliteCredentials, init_sqlite, credentials, studioCliParams, studioConfig, init_studio, es5_exports, _3, es5_default, init_es5, import_hanji7, assertES5, safeRegister, migrateConfig, init_utils9, prepareFromExports, init_pgImports, init_alias5, _a344, UniqueConstraintBuilder4, _a345, UniqueOnConstraintBuilder4, _a346, UniqueConstraint4, init_unique_constraint4, _a347, _b250, SingleStoreColumnBuilder, _a348, _b251, SingleStoreColumn, _a349, _b252, SingleStoreColumnBuilderWithAutoIncrement, _a350, _b253, SingleStoreColumnWithAutoIncrement, init_common5, _a351, _b254, SingleStoreBigInt53Builder, _a352, _b255, SingleStoreBigInt53, _a353, _b256, SingleStoreBigInt64Builder, _a354, _b257, SingleStoreBigInt64, init_bigint3, _a355, _b258, SingleStoreBinaryBuilder, _a356, _b259, SingleStoreBinary, init_binary2, _a357, _b260, SingleStoreBooleanBuilder, _a358, _b261, SingleStoreBoolean, init_boolean3, _a359, _b262, SingleStoreCharBuilder, _a360, _b263, SingleStoreChar, init_char3, _a361, _b264, SingleStoreCustomColumnBuilder, _a362, _b265, SingleStoreCustomColumn, init_custom4, _a363, _b266, SingleStoreDateBuilder, _a364, _b267, SingleStoreDate, _a365, _b268, SingleStoreDateStringBuilder, _a366, _b269, SingleStoreDateString, init_date3, _a367, _b270, SingleStoreDateTimeBuilder, _a368, _b271, SingleStoreDateTime, _a369, _b272, SingleStoreDateTimeStringBuilder, _a370, _b273, SingleStoreDateTimeString, init_datetime2, _a371, _b274, SingleStoreDecimalBuilder, _a372, _b275, SingleStoreDecimal, _a373, _b276, SingleStoreDecimalNumberBuilder, _a374, _b277, SingleStoreDecimalNumber, _a375, _b278, SingleStoreDecimalBigIntBuilder, _a376, _b279, SingleStoreDecimalBigInt, init_decimal2, _a377, _b280, SingleStoreDoubleBuilder, _a378, _b281, SingleStoreDouble, init_double2, _a379, _b282, SingleStoreEnumColumnBuilder, _a380, _b283, SingleStoreEnumColumn, init_enum3, _a381, _b284, SingleStoreFloatBuilder, _a382, _b285, SingleStoreFloat, init_float2, _a383, _b286, SingleStoreIntBuilder, _a384, _b287, SingleStoreInt, init_int2, _a385, _b288, SingleStoreJsonBuilder, _a386, _b289, SingleStoreJson, init_json3, _a387, _b290, SingleStoreMediumIntBuilder, _a388, _b291, SingleStoreMediumInt, init_mediumint2, _a389, _b292, SingleStoreRealBuilder, _a390, _b293, SingleStoreReal, init_real4, _a391, _b294, SingleStoreSerialBuilder, _a392, _b295, SingleStoreSerial, init_serial3, _a393, _b296, SingleStoreSmallIntBuilder, _a394, _b297, SingleStoreSmallInt, init_smallint3, _a395, _b298, SingleStoreTextBuilder, _a396, _b299, SingleStoreText, init_text4, _a397, _b300, SingleStoreTimeBuilder, _a398, _b301, SingleStoreTime, init_time3, _a399, _b302, SingleStoreDateColumnBaseBuilder, _a400, _b303, SingleStoreDateBaseColumn, init_date_common3, _a401, _b304, SingleStoreTimestampBuilder, _a402, _b305, SingleStoreTimestamp, _a403, _b306, SingleStoreTimestampStringBuilder, _a404, _b307, SingleStoreTimestampString, init_timestamp3, _a405, _b308, SingleStoreTinyIntBuilder, _a406, _b309, SingleStoreTinyInt, init_tinyint2, _a407, _b310, SingleStoreVarBinaryBuilder, _a408, _b311, SingleStoreVarBinary, init_varbinary2, _a409, _b312, SingleStoreVarCharBuilder, _a410, _b313, SingleStoreVarChar, init_varchar3, _a411, _b314, SingleStoreVectorBuilder, _a412, _b315, SingleStoreVector, init_vector4, _a413, _b316, SingleStoreYearBuilder, _a414, _b317, SingleStoreYear, init_year2, init_columns4, _a415, _b318, _c12, _SingleStoreCountBuilder, SingleStoreCountBuilder, init_count4, _a416, IndexBuilderOn4, _a417, IndexBuilder4, _a418, Index6, init_indexes4, init_all4, _a419, _b319, _c13, _d5, SingleStoreTable, init_table52, _a420, PrimaryKeyBuilder4, _a421, PrimaryKey4, init_primary_keys4, init_utils10, _a422, _b320, SingleStoreDeleteBase, init_delete4, _a423, SingleStoreInsertBuilder, _a424, _b321, SingleStoreInsertBase, init_insert4, _a425, SingleStoreDialect, init_dialect4, _a426, SingleStoreSelectBuilder, _a427, _b322, SingleStoreSelectQueryBuilderBase, _a428, _b323, SingleStoreSelectBase, getSingleStoreSetOperators, union5, unionAll4, intersect4, except4, minus, init_select5, _a429, QueryBuilder4, init_query_builder5, init_select_types4, _a430, SingleStoreUpdateBuilder, _a431, _b324, SingleStoreUpdateBase, init_update4, init_query_builders4, _a432, SingleStoreDatabase, init_db4, _a433, SingleStoreSchema5, init_schema32, _a434, SingleStorePreparedQuery, _a435, SingleStoreSession, _a436, _b325, SingleStoreTransaction, init_session4, init_subquery5, init_singlestore_core, dialect5, generateSingleStoreSnapshot, fromDatabase4, init_singlestoreSerializer, sqliteImports_exports, prepareFromExports2, prepareFromSqliteImports, init_sqliteImports, mysqlImports_exports, prepareFromExports3, prepareFromMySqlImports, init_mysqlImports, mysqlPushUtils_exports, import_hanji8, filterStatements, logSuggestionsAndReturn2, init_mysqlPushUtils, mysqlIntrospect_exports, import_hanji9, mysqlPushIntrospect, init_mysqlIntrospect, singlestoreImports_exports, prepareFromExports4, prepareFromSingleStoreImports, init_singlestoreImports, singlestorePushUtils_exports, import_hanji10, filterStatements2, logSuggestionsAndReturn3, init_singlestorePushUtils, singlestoreIntrospect_exports, import_hanji11, singlestorePushIntrospect, init_singlestoreIntrospect, import_hanji3, pgPushIntrospect = async (db2, filters, schemaFilters, entities, tsSchema) => {
|
|
101052
103393
|
const matchers = filters.map((it3) => {
|
|
101053
103394
|
return new Minimatch(it3);
|
|
101054
103395
|
});
|
|
@@ -121474,7 +123815,7 @@ globstar while`, file3, fr, pattern, pr2, swallowee);
|
|
|
121474
123815
|
});
|
|
121475
123816
|
}
|
|
121476
123817
|
});
|
|
121477
|
-
|
|
123818
|
+
init_sql4 = __esm2({
|
|
121478
123819
|
"../drizzle-orm/dist/sql/sql.js"() {
|
|
121479
123820
|
init_entity2();
|
|
121480
123821
|
init_enum2();
|
|
@@ -121827,7 +124168,7 @@ globstar while`, file3, fr, pattern, pr2, swallowee);
|
|
|
121827
124168
|
"../drizzle-orm/dist/alias.js"() {
|
|
121828
124169
|
init_column2();
|
|
121829
124170
|
init_entity2();
|
|
121830
|
-
|
|
124171
|
+
init_sql4();
|
|
121831
124172
|
init_table8();
|
|
121832
124173
|
init_view_common3();
|
|
121833
124174
|
_a28 = entityKind2;
|
|
@@ -122001,7 +124342,7 @@ params: ${params}`);
|
|
|
122001
124342
|
"../drizzle-orm/dist/utils.js"() {
|
|
122002
124343
|
init_column2();
|
|
122003
124344
|
init_entity2();
|
|
122004
|
-
|
|
124345
|
+
init_sql4();
|
|
122005
124346
|
init_subquery2();
|
|
122006
124347
|
init_table8();
|
|
122007
124348
|
init_view_common3();
|
|
@@ -122260,7 +124601,7 @@ params: ${params}`);
|
|
|
122260
124601
|
init_date_common2 = __esm2({
|
|
122261
124602
|
"../drizzle-orm/dist/pg-core/columns/date.common.js"() {
|
|
122262
124603
|
init_entity2();
|
|
122263
|
-
|
|
124604
|
+
init_sql4();
|
|
122264
124605
|
init_common22();
|
|
122265
124606
|
PgDateColumnBaseBuilder2 = class extends (_b33 = PgColumnBuilder2, _a54 = entityKind2, _b33) {
|
|
122266
124607
|
defaultNow() {
|
|
@@ -123045,7 +125386,7 @@ params: ${params}`);
|
|
|
123045
125386
|
init_uuid3 = __esm2({
|
|
123046
125387
|
"../drizzle-orm/dist/pg-core/columns/uuid.js"() {
|
|
123047
125388
|
init_entity2();
|
|
123048
|
-
|
|
125389
|
+
init_sql4();
|
|
123049
125390
|
init_common22();
|
|
123050
125391
|
PgUUIDBuilder2 = class extends (_b88 = PgColumnBuilder2, _a109 = entityKind2, _b88) {
|
|
123051
125392
|
constructor(name22) {
|
|
@@ -123316,7 +125657,7 @@ params: ${params}`);
|
|
|
123316
125657
|
init_column2();
|
|
123317
125658
|
init_entity2();
|
|
123318
125659
|
init_table8();
|
|
123319
|
-
|
|
125660
|
+
init_sql4();
|
|
123320
125661
|
eq2 = (left, right) => {
|
|
123321
125662
|
return sql4`${left} = ${bindIfParam2(right, left)}`;
|
|
123322
125663
|
};
|
|
@@ -123339,7 +125680,7 @@ params: ${params}`);
|
|
|
123339
125680
|
});
|
|
123340
125681
|
init_select3 = __esm2({
|
|
123341
125682
|
"../drizzle-orm/dist/sql/expressions/select.js"() {
|
|
123342
|
-
|
|
125683
|
+
init_sql4();
|
|
123343
125684
|
}
|
|
123344
125685
|
});
|
|
123345
125686
|
init_expressions2 = __esm2({
|
|
@@ -123355,7 +125696,7 @@ params: ${params}`);
|
|
|
123355
125696
|
init_entity2();
|
|
123356
125697
|
init_primary_keys2();
|
|
123357
125698
|
init_expressions2();
|
|
123358
|
-
|
|
125699
|
+
init_sql4();
|
|
123359
125700
|
_a124 = entityKind2;
|
|
123360
125701
|
Relation2 = class {
|
|
123361
125702
|
constructor(sourceTable, referencedTable, relationName) {
|
|
@@ -123409,12 +125750,12 @@ params: ${params}`);
|
|
|
123409
125750
|
"../drizzle-orm/dist/sql/functions/aggregate.js"() {
|
|
123410
125751
|
init_column2();
|
|
123411
125752
|
init_entity2();
|
|
123412
|
-
|
|
125753
|
+
init_sql4();
|
|
123413
125754
|
}
|
|
123414
125755
|
});
|
|
123415
125756
|
init_vector22 = __esm2({
|
|
123416
125757
|
"../drizzle-orm/dist/sql/functions/vector.js"() {
|
|
123417
|
-
|
|
125758
|
+
init_sql4();
|
|
123418
125759
|
}
|
|
123419
125760
|
});
|
|
123420
125761
|
init_functions2 = __esm2({
|
|
@@ -123427,7 +125768,7 @@ params: ${params}`);
|
|
|
123427
125768
|
"../drizzle-orm/dist/sql/index.js"() {
|
|
123428
125769
|
init_expressions2();
|
|
123429
125770
|
init_functions2();
|
|
123430
|
-
|
|
125771
|
+
init_sql4();
|
|
123431
125772
|
}
|
|
123432
125773
|
});
|
|
123433
125774
|
dist_exports = {};
|
|
@@ -123644,7 +125985,7 @@ params: ${params}`);
|
|
|
123644
125985
|
init_alias3();
|
|
123645
125986
|
init_column2();
|
|
123646
125987
|
init_entity2();
|
|
123647
|
-
|
|
125988
|
+
init_sql4();
|
|
123648
125989
|
init_subquery2();
|
|
123649
125990
|
init_view_common3();
|
|
123650
125991
|
_a130 = entityKind2;
|
|
@@ -123703,7 +126044,7 @@ params: ${params}`);
|
|
|
123703
126044
|
});
|
|
123704
126045
|
init_indexes2 = __esm2({
|
|
123705
126046
|
"../drizzle-orm/dist/pg-core/indexes.js"() {
|
|
123706
|
-
|
|
126047
|
+
init_sql4();
|
|
123707
126048
|
init_entity2();
|
|
123708
126049
|
init_columns2();
|
|
123709
126050
|
_a131 = entityKind2;
|
|
@@ -123866,7 +126207,7 @@ params: ${params}`);
|
|
|
123866
126207
|
init_view_base2 = __esm2({
|
|
123867
126208
|
"../drizzle-orm/dist/pg-core/view-base.js"() {
|
|
123868
126209
|
init_entity2();
|
|
123869
|
-
|
|
126210
|
+
init_sql4();
|
|
123870
126211
|
PgViewBase2 = class extends (_b103 = View3, _a136 = entityKind2, _b103) {
|
|
123871
126212
|
};
|
|
123872
126213
|
__publicField(PgViewBase2, _a136, "PgViewBase");
|
|
@@ -123883,7 +126224,7 @@ params: ${params}`);
|
|
|
123883
126224
|
init_table22();
|
|
123884
126225
|
init_relations2();
|
|
123885
126226
|
init_sql22();
|
|
123886
|
-
|
|
126227
|
+
init_sql4();
|
|
123887
126228
|
init_subquery2();
|
|
123888
126229
|
init_table8();
|
|
123889
126230
|
init_utils22();
|
|
@@ -124467,7 +126808,7 @@ params: ${params}`);
|
|
|
124467
126808
|
init_query_builder3();
|
|
124468
126809
|
init_query_promise2();
|
|
124469
126810
|
init_selection_proxy2();
|
|
124470
|
-
|
|
126811
|
+
init_sql4();
|
|
124471
126812
|
init_subquery2();
|
|
124472
126813
|
init_table8();
|
|
124473
126814
|
init_tracing2();
|
|
@@ -125088,7 +127429,7 @@ params: ${params}`);
|
|
|
125088
127429
|
"../drizzle-orm/dist/pg-core/utils.js"() {
|
|
125089
127430
|
init_entity2();
|
|
125090
127431
|
init_table22();
|
|
125091
|
-
|
|
127432
|
+
init_sql4();
|
|
125092
127433
|
init_subquery2();
|
|
125093
127434
|
init_table8();
|
|
125094
127435
|
init_view_common3();
|
|
@@ -125176,7 +127517,7 @@ params: ${params}`);
|
|
|
125176
127517
|
init_entity2();
|
|
125177
127518
|
init_query_promise2();
|
|
125178
127519
|
init_selection_proxy2();
|
|
125179
|
-
|
|
127520
|
+
init_sql4();
|
|
125180
127521
|
init_table8();
|
|
125181
127522
|
init_tracing2();
|
|
125182
127523
|
init_utils22();
|
|
@@ -125370,7 +127711,7 @@ params: ${params}`);
|
|
|
125370
127711
|
init_table22();
|
|
125371
127712
|
init_query_promise2();
|
|
125372
127713
|
init_selection_proxy2();
|
|
125373
|
-
|
|
127714
|
+
init_sql4();
|
|
125374
127715
|
init_subquery2();
|
|
125375
127716
|
init_table8();
|
|
125376
127717
|
init_utils22();
|
|
@@ -125544,7 +127885,7 @@ params: ${params}`);
|
|
|
125544
127885
|
init_count2 = __esm2({
|
|
125545
127886
|
"../drizzle-orm/dist/pg-core/query-builders/count.js"() {
|
|
125546
127887
|
init_entity2();
|
|
125547
|
-
|
|
127888
|
+
init_sql4();
|
|
125548
127889
|
_PgCountBuilder = class _PgCountBuilder2 extends (_c6 = SQL2, _b116 = entityKind2, _a157 = Symbol.toStringTag, _c6) {
|
|
125549
127890
|
constructor(params) {
|
|
125550
127891
|
super(_PgCountBuilder2.buildEmbeddedCount(params.source, params.filters).queryChunks);
|
|
@@ -125712,7 +128053,7 @@ params: ${params}`);
|
|
|
125712
128053
|
init_entity2();
|
|
125713
128054
|
init_query_builders2();
|
|
125714
128055
|
init_selection_proxy2();
|
|
125715
|
-
|
|
128056
|
+
init_sql4();
|
|
125716
128057
|
init_subquery2();
|
|
125717
128058
|
init_count2();
|
|
125718
128059
|
init_query2();
|
|
@@ -125884,10 +128225,10 @@ params: ${params}`);
|
|
|
125884
128225
|
__publicField(PgSequence, _a163, "PgSequence");
|
|
125885
128226
|
}
|
|
125886
128227
|
});
|
|
125887
|
-
|
|
128228
|
+
init_schema4 = __esm2({
|
|
125888
128229
|
"../drizzle-orm/dist/pg-core/schema.js"() {
|
|
125889
128230
|
init_entity2();
|
|
125890
|
-
|
|
128231
|
+
init_sql4();
|
|
125891
128232
|
init_enum2();
|
|
125892
128233
|
init_sequence2();
|
|
125893
128234
|
init_table22();
|
|
@@ -126103,7 +128444,7 @@ params: ${params}`);
|
|
|
126103
128444
|
init_primary_keys2();
|
|
126104
128445
|
init_query_builders2();
|
|
126105
128446
|
init_roles2();
|
|
126106
|
-
|
|
128447
|
+
init_schema4();
|
|
126107
128448
|
init_sequence2();
|
|
126108
128449
|
init_session3();
|
|
126109
128450
|
init_subquery22();
|
|
@@ -127911,7 +130252,7 @@ ORDER BY
|
|
|
127911
130252
|
init_integer22 = __esm2({
|
|
127912
130253
|
"../drizzle-orm/dist/sqlite-core/columns/integer.js"() {
|
|
127913
130254
|
init_entity2();
|
|
127914
|
-
|
|
130255
|
+
init_sql4();
|
|
127915
130256
|
init_utils22();
|
|
127916
130257
|
init_common3();
|
|
127917
130258
|
SQLiteBaseIntegerBuilder = class extends (_b131 = SQLiteColumnBuilder, _a187 = entityKind2, _b131) {
|
|
@@ -128274,7 +130615,7 @@ ORDER BY
|
|
|
128274
130615
|
init_utils72 = __esm2({
|
|
128275
130616
|
"../drizzle-orm/dist/sqlite-core/utils.js"() {
|
|
128276
130617
|
init_entity2();
|
|
128277
|
-
|
|
130618
|
+
init_sql4();
|
|
128278
130619
|
init_subquery2();
|
|
128279
130620
|
init_table8();
|
|
128280
130621
|
init_view_common3();
|
|
@@ -128368,7 +130709,7 @@ ORDER BY
|
|
|
128368
130709
|
init_view_base22 = __esm2({
|
|
128369
130710
|
"../drizzle-orm/dist/sqlite-core/view-base.js"() {
|
|
128370
130711
|
init_entity2();
|
|
128371
|
-
|
|
130712
|
+
init_sql4();
|
|
128372
130713
|
SQLiteViewBase = class extends (_b153 = View3, _a214 = entityKind2, _b153) {
|
|
128373
130714
|
};
|
|
128374
130715
|
__publicField(SQLiteViewBase, _a214, "SQLiteViewBase");
|
|
@@ -128383,7 +130724,7 @@ ORDER BY
|
|
|
128383
130724
|
init_errors22();
|
|
128384
130725
|
init_relations2();
|
|
128385
130726
|
init_sql22();
|
|
128386
|
-
|
|
130727
|
+
init_sql4();
|
|
128387
130728
|
init_columns22();
|
|
128388
130729
|
init_table32();
|
|
128389
130730
|
init_subquery2();
|
|
@@ -128963,7 +131304,7 @@ ORDER BY
|
|
|
128963
131304
|
init_query_builder3();
|
|
128964
131305
|
init_query_promise2();
|
|
128965
131306
|
init_selection_proxy2();
|
|
128966
|
-
|
|
131307
|
+
init_sql4();
|
|
128967
131308
|
init_subquery2();
|
|
128968
131309
|
init_table8();
|
|
128969
131310
|
init_utils22();
|
|
@@ -129326,7 +131667,7 @@ ORDER BY
|
|
|
129326
131667
|
"../drizzle-orm/dist/sqlite-core/query-builders/insert.js"() {
|
|
129327
131668
|
init_entity2();
|
|
129328
131669
|
init_query_promise2();
|
|
129329
|
-
|
|
131670
|
+
init_sql4();
|
|
129330
131671
|
init_table32();
|
|
129331
131672
|
init_table8();
|
|
129332
131673
|
init_utils22();
|
|
@@ -129573,7 +131914,7 @@ ORDER BY
|
|
|
129573
131914
|
init_count22 = __esm2({
|
|
129574
131915
|
"../drizzle-orm/dist/sqlite-core/query-builders/count.js"() {
|
|
129575
131916
|
init_entity2();
|
|
129576
|
-
|
|
131917
|
+
init_sql4();
|
|
129577
131918
|
_SQLiteCountBuilder = class _SQLiteCountBuilder2 extends (_c8 = SQL2, _b160 = entityKind2, _a226 = Symbol.toStringTag, _c8) {
|
|
129578
131919
|
constructor(params) {
|
|
129579
131920
|
super(_SQLiteCountBuilder2.buildEmbeddedCount(params.source, params.filters).queryChunks);
|
|
@@ -129742,7 +132083,7 @@ ORDER BY
|
|
|
129742
132083
|
"../drizzle-orm/dist/sqlite-core/db.js"() {
|
|
129743
132084
|
init_entity2();
|
|
129744
132085
|
init_selection_proxy2();
|
|
129745
|
-
|
|
132086
|
+
init_sql4();
|
|
129746
132087
|
init_query_builders22();
|
|
129747
132088
|
init_subquery2();
|
|
129748
132089
|
init_count22();
|
|
@@ -131713,7 +134054,7 @@ ${withStyle.errorWarning(`We've found duplicated view name across ${source_defau
|
|
|
131713
134054
|
init_date_common22 = __esm2({
|
|
131714
134055
|
"../drizzle-orm/dist/mysql-core/columns/date.common.js"() {
|
|
131715
134056
|
init_entity2();
|
|
131716
|
-
|
|
134057
|
+
init_sql4();
|
|
131717
134058
|
init_common4();
|
|
131718
134059
|
MySqlDateColumnBaseBuilder = class extends (_b223 = MySqlColumnBuilder, _a301 = entityKind2, _b223) {
|
|
131719
134060
|
defaultNow() {
|
|
@@ -131939,7 +134280,7 @@ ${withStyle.errorWarning(`We've found duplicated view name across ${source_defau
|
|
|
131939
134280
|
init_count3 = __esm2({
|
|
131940
134281
|
"../drizzle-orm/dist/mysql-core/query-builders/count.js"() {
|
|
131941
134282
|
init_entity2();
|
|
131942
|
-
|
|
134283
|
+
init_sql4();
|
|
131943
134284
|
_MySqlCountBuilder = class _MySqlCountBuilder2 extends (_c9 = SQL2, _b237 = entityKind2, _a315 = Symbol.toStringTag, _c9) {
|
|
131944
134285
|
constructor(params) {
|
|
131945
134286
|
super(_MySqlCountBuilder2.buildEmbeddedCount(params.source, params.filters).queryChunks);
|
|
@@ -132201,7 +134542,7 @@ ${withStyle.errorWarning(`We've found duplicated view name across ${source_defau
|
|
|
132201
134542
|
init_view_base3 = __esm2({
|
|
132202
134543
|
"../drizzle-orm/dist/mysql-core/view-base.js"() {
|
|
132203
134544
|
init_entity2();
|
|
132204
|
-
|
|
134545
|
+
init_sql4();
|
|
132205
134546
|
MySqlViewBase = class extends (_b240 = View3, _a323 = entityKind2, _b240) {
|
|
132206
134547
|
};
|
|
132207
134548
|
__publicField(MySqlViewBase, _a323, "MySqlViewBase");
|
|
@@ -132216,7 +134557,7 @@ ${withStyle.errorWarning(`We've found duplicated view name across ${source_defau
|
|
|
132216
134557
|
init_errors22();
|
|
132217
134558
|
init_relations2();
|
|
132218
134559
|
init_expressions2();
|
|
132219
|
-
|
|
134560
|
+
init_sql4();
|
|
132220
134561
|
init_subquery2();
|
|
132221
134562
|
init_table8();
|
|
132222
134563
|
init_utils22();
|
|
@@ -132982,7 +135323,7 @@ ${withStyle.errorWarning(`We've found duplicated view name across ${source_defau
|
|
|
132982
135323
|
init_query_builder3();
|
|
132983
135324
|
init_query_promise2();
|
|
132984
135325
|
init_selection_proxy2();
|
|
132985
|
-
|
|
135326
|
+
init_sql4();
|
|
132986
135327
|
init_subquery2();
|
|
132987
135328
|
init_table8();
|
|
132988
135329
|
init_utils22();
|
|
@@ -133383,7 +135724,7 @@ ${withStyle.errorWarning(`We've found duplicated view name across ${source_defau
|
|
|
133383
135724
|
"../drizzle-orm/dist/mysql-core/query-builders/insert.js"() {
|
|
133384
135725
|
init_entity2();
|
|
133385
135726
|
init_query_promise2();
|
|
133386
|
-
|
|
135727
|
+
init_sql4();
|
|
133387
135728
|
init_table8();
|
|
133388
135729
|
init_utils22();
|
|
133389
135730
|
init_utils8();
|
|
@@ -133663,7 +136004,7 @@ ${withStyle.errorWarning(`We've found duplicated view name across ${source_defau
|
|
|
133663
136004
|
"../drizzle-orm/dist/mysql-core/db.js"() {
|
|
133664
136005
|
init_entity2();
|
|
133665
136006
|
init_selection_proxy2();
|
|
133666
|
-
|
|
136007
|
+
init_sql4();
|
|
133667
136008
|
init_subquery2();
|
|
133668
136009
|
init_count3();
|
|
133669
136010
|
init_query_builders3();
|
|
@@ -133892,7 +136233,7 @@ ${withStyle.errorWarning(`We've found duplicated view name across ${source_defau
|
|
|
133892
136233
|
init_cache();
|
|
133893
136234
|
init_entity2();
|
|
133894
136235
|
init_errors22();
|
|
133895
|
-
|
|
136236
|
+
init_sql4();
|
|
133896
136237
|
init_db3();
|
|
133897
136238
|
_a341 = entityKind2;
|
|
133898
136239
|
MySqlPreparedQuery = class {
|
|
@@ -135915,7 +138256,7 @@ AND
|
|
|
135915
138256
|
init_date_common3 = __esm2({
|
|
135916
138257
|
"../drizzle-orm/dist/singlestore-core/columns/date.common.js"() {
|
|
135917
138258
|
init_entity2();
|
|
135918
|
-
|
|
138259
|
+
init_sql4();
|
|
135919
138260
|
init_common5();
|
|
135920
138261
|
SingleStoreDateColumnBaseBuilder = class extends (_b302 = SingleStoreColumnBuilder, _a399 = entityKind2, _b302) {
|
|
135921
138262
|
defaultNow() {
|
|
@@ -135940,7 +138281,7 @@ AND
|
|
|
135940
138281
|
init_timestamp3 = __esm2({
|
|
135941
138282
|
"../drizzle-orm/dist/singlestore-core/columns/timestamp.js"() {
|
|
135942
138283
|
init_entity2();
|
|
135943
|
-
|
|
138284
|
+
init_sql4();
|
|
135944
138285
|
init_utils22();
|
|
135945
138286
|
init_date_common3();
|
|
135946
138287
|
SingleStoreTimestampBuilder = class extends (_b304 = SingleStoreDateColumnBaseBuilder, _a401 = entityKind2, _b304) {
|
|
@@ -136175,7 +138516,7 @@ AND
|
|
|
136175
138516
|
init_count4 = __esm2({
|
|
136176
138517
|
"../drizzle-orm/dist/singlestore-core/query-builders/count.js"() {
|
|
136177
138518
|
init_entity2();
|
|
136178
|
-
|
|
138519
|
+
init_sql4();
|
|
136179
138520
|
_SingleStoreCountBuilder = class _SingleStoreCountBuilder2 extends (_c12 = SQL2, _b318 = entityKind2, _a415 = Symbol.toStringTag, _c12) {
|
|
136180
138521
|
constructor(params) {
|
|
136181
138522
|
super(_SingleStoreCountBuilder2.buildEmbeddedCount(params.source, params.filters).queryChunks);
|
|
@@ -136345,7 +138686,7 @@ AND
|
|
|
136345
138686
|
init_utils10 = __esm2({
|
|
136346
138687
|
"../drizzle-orm/dist/singlestore-core/utils.js"() {
|
|
136347
138688
|
init_entity2();
|
|
136348
|
-
|
|
138689
|
+
init_sql4();
|
|
136349
138690
|
init_subquery2();
|
|
136350
138691
|
init_table8();
|
|
136351
138692
|
init_indexes4();
|
|
@@ -136423,7 +138764,7 @@ AND
|
|
|
136423
138764
|
"../drizzle-orm/dist/singlestore-core/query-builders/insert.js"() {
|
|
136424
138765
|
init_entity2();
|
|
136425
138766
|
init_query_promise2();
|
|
136426
|
-
|
|
138767
|
+
init_sql4();
|
|
136427
138768
|
init_table8();
|
|
136428
138769
|
init_utils22();
|
|
136429
138770
|
init_utils10();
|
|
@@ -136520,7 +138861,7 @@ AND
|
|
|
136520
138861
|
init_errors22();
|
|
136521
138862
|
init_relations2();
|
|
136522
138863
|
init_expressions2();
|
|
136523
|
-
|
|
138864
|
+
init_sql4();
|
|
136524
138865
|
init_subquery2();
|
|
136525
138866
|
init_table8();
|
|
136526
138867
|
init_utils22();
|
|
@@ -137051,7 +139392,7 @@ AND
|
|
|
137051
139392
|
init_query_builder3();
|
|
137052
139393
|
init_query_promise2();
|
|
137053
139394
|
init_selection_proxy2();
|
|
137054
|
-
|
|
139395
|
+
init_sql4();
|
|
137055
139396
|
init_subquery2();
|
|
137056
139397
|
init_table8();
|
|
137057
139398
|
init_utils22();
|
|
@@ -137509,7 +139850,7 @@ AND
|
|
|
137509
139850
|
"../drizzle-orm/dist/singlestore-core/db.js"() {
|
|
137510
139851
|
init_entity2();
|
|
137511
139852
|
init_selection_proxy2();
|
|
137512
|
-
|
|
139853
|
+
init_sql4();
|
|
137513
139854
|
init_subquery2();
|
|
137514
139855
|
init_count4();
|
|
137515
139856
|
init_query_builders4();
|
|
@@ -137623,7 +139964,7 @@ AND
|
|
|
137623
139964
|
init_cache();
|
|
137624
139965
|
init_entity2();
|
|
137625
139966
|
init_errors22();
|
|
137626
|
-
|
|
139967
|
+
init_sql4();
|
|
137627
139968
|
init_db4();
|
|
137628
139969
|
_a434 = entityKind2;
|
|
137629
139970
|
SingleStorePreparedQuery = class {
|
|
@@ -139898,7 +142239,7 @@ function requireUserId(userId) {
|
|
|
139898
142239
|
return userId;
|
|
139899
142240
|
}
|
|
139900
142241
|
var init_params_util = __esm(() => {
|
|
139901
|
-
|
|
142242
|
+
init_src5();
|
|
139902
142243
|
init_errors();
|
|
139903
142244
|
});
|
|
139904
142245
|
|
|
@@ -139951,6 +142292,7 @@ var init_utils11 = __esm(() => {
|
|
|
139951
142292
|
init_lti_util();
|
|
139952
142293
|
init_lti_provisioning();
|
|
139953
142294
|
init_params_util();
|
|
142295
|
+
init_secrets_util();
|
|
139954
142296
|
init_timeback_util();
|
|
139955
142297
|
init_validation_util();
|
|
139956
142298
|
});
|
|
@@ -140138,7 +142480,7 @@ var init_database_controller = __esm(() => {
|
|
|
140138
142480
|
throw ApiError.unprocessableEntity("Validation failed", details);
|
|
140139
142481
|
}
|
|
140140
142482
|
}
|
|
140141
|
-
return ctx.services.database.reset(slug2, ctx.user, body2
|
|
142483
|
+
return ctx.services.database.reset(slug2, ctx.user, body2);
|
|
140142
142484
|
});
|
|
140143
142485
|
database = defineControllerNames("database", {
|
|
140144
142486
|
reset
|
|
@@ -140191,6 +142533,85 @@ var init_deploy_controller = __esm(() => {
|
|
|
140191
142533
|
});
|
|
140192
142534
|
});
|
|
140193
142535
|
|
|
142536
|
+
// ../api-core/src/controllers/deployment-state.controller.ts
|
|
142537
|
+
var get, baseline, realignMigration, resolveMigration, history, restorePoints, restore, reportBlocked, deploymentState;
|
|
142538
|
+
var init_deployment_state_controller = __esm(() => {
|
|
142539
|
+
init_schemas_index();
|
|
142540
|
+
init_errors();
|
|
142541
|
+
init_utils11();
|
|
142542
|
+
get = requireDeveloper(async (ctx) => {
|
|
142543
|
+
const slug2 = requireSlug(ctx.params.slug);
|
|
142544
|
+
const include = ctx.url.searchParams.getAll("include").flatMap((value) => value.split(",")).filter(Boolean);
|
|
142545
|
+
const unsupported = include.filter((value) => value !== "schemaSnapshot");
|
|
142546
|
+
if (unsupported.length > 0) {
|
|
142547
|
+
throw ApiError.badRequest(`Unsupported include value(s): ${unsupported.join(", ")}`);
|
|
142548
|
+
}
|
|
142549
|
+
return ctx.services.deploymentState.get(slug2, ctx.user, {
|
|
142550
|
+
includeSchemaSnapshot: include.includes("schemaSnapshot")
|
|
142551
|
+
});
|
|
142552
|
+
});
|
|
142553
|
+
baseline = requireDeveloper(async (ctx) => {
|
|
142554
|
+
const slug2 = requireSlug(ctx.params.slug);
|
|
142555
|
+
const body2 = await parseRequestBody(ctx.request, DeploymentStateBaselineSchema);
|
|
142556
|
+
return ctx.services.deploymentState.baseline(slug2, body2, ctx.user);
|
|
142557
|
+
});
|
|
142558
|
+
realignMigration = requireDeveloper(async (ctx) => {
|
|
142559
|
+
const slug2 = requireSlug(ctx.params.slug);
|
|
142560
|
+
const tag = ctx.params.tag;
|
|
142561
|
+
if (!tag) {
|
|
142562
|
+
throw ApiError.badRequest("Missing migration tag");
|
|
142563
|
+
}
|
|
142564
|
+
const body2 = await parseRequestBody(ctx.request, MigrationRealignSchema);
|
|
142565
|
+
return ctx.services.deploymentState.realignMigration(slug2, tag, body2.checksum, ctx.user);
|
|
142566
|
+
});
|
|
142567
|
+
resolveMigration = requireDeveloper(async (ctx) => {
|
|
142568
|
+
const slug2 = requireSlug(ctx.params.slug);
|
|
142569
|
+
const tag = ctx.params.tag;
|
|
142570
|
+
if (!tag) {
|
|
142571
|
+
throw ApiError.badRequest("Missing migration tag");
|
|
142572
|
+
}
|
|
142573
|
+
const body2 = await parseRequestBody(ctx.request, MigrationResolveSchema);
|
|
142574
|
+
return ctx.services.deploymentState.resolveMigration(slug2, tag, body2, ctx.user);
|
|
142575
|
+
});
|
|
142576
|
+
history = requireDeveloper(async (ctx) => {
|
|
142577
|
+
const slug2 = requireSlug(ctx.params.slug);
|
|
142578
|
+
const limitParam = ctx.url.searchParams.get("limit");
|
|
142579
|
+
let limit;
|
|
142580
|
+
if (limitParam !== null) {
|
|
142581
|
+
limit = Number(limitParam);
|
|
142582
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > 100) {
|
|
142583
|
+
throw ApiError.badRequest("limit must be an integer between 1 and 100");
|
|
142584
|
+
}
|
|
142585
|
+
}
|
|
142586
|
+
return ctx.services.deploymentState.history(slug2, ctx.user, { limit });
|
|
142587
|
+
});
|
|
142588
|
+
restorePoints = requireDeveloper(async (ctx) => {
|
|
142589
|
+
const slug2 = requireSlug(ctx.params.slug);
|
|
142590
|
+
return ctx.services.deploymentState.restorePoints(slug2, ctx.user);
|
|
142591
|
+
});
|
|
142592
|
+
restore = requireDeveloper(async (ctx) => {
|
|
142593
|
+
const slug2 = requireSlug(ctx.params.slug);
|
|
142594
|
+
const body2 = await parseRequestBody(ctx.request, DatabaseRestoreSchema);
|
|
142595
|
+
return ctx.services.deploymentState.restoreToBookmark(slug2, body2, ctx.user);
|
|
142596
|
+
});
|
|
142597
|
+
reportBlocked = requireDeveloper(async (ctx) => {
|
|
142598
|
+
const slug2 = requireSlug(ctx.params.slug);
|
|
142599
|
+
const body2 = await parseRequestBody(ctx.request, DeployBlockedReportSchema);
|
|
142600
|
+
await ctx.services.deploymentState.reportDeployBlocked(slug2, ctx.user, body2);
|
|
142601
|
+
return { recorded: true };
|
|
142602
|
+
});
|
|
142603
|
+
deploymentState = defineControllerNames("deploymentState", {
|
|
142604
|
+
get,
|
|
142605
|
+
baseline,
|
|
142606
|
+
realignMigration,
|
|
142607
|
+
resolveMigration,
|
|
142608
|
+
history,
|
|
142609
|
+
restorePoints,
|
|
142610
|
+
restore,
|
|
142611
|
+
reportBlocked
|
|
142612
|
+
});
|
|
142613
|
+
});
|
|
142614
|
+
|
|
140194
142615
|
// ../api-core/src/controllers/developer.controller.ts
|
|
140195
142616
|
var apply, getStatus, developer;
|
|
140196
142617
|
var init_developer_controller = __esm(() => {
|
|
@@ -140657,7 +143078,7 @@ var init_lti_controller = __esm(() => {
|
|
|
140657
143078
|
});
|
|
140658
143079
|
|
|
140659
143080
|
// ../api-core/src/controllers/secrets.controller.ts
|
|
140660
|
-
var listKeys2, setSecrets, deleteSecret, secrets;
|
|
143081
|
+
var listKeys2, setSecrets, deleteSecret, diff, secrets;
|
|
140661
143082
|
var init_secrets_controller = __esm(() => {
|
|
140662
143083
|
init_esm();
|
|
140663
143084
|
init_schemas_index();
|
|
@@ -140703,10 +143124,19 @@ var init_secrets_controller = __esm(() => {
|
|
|
140703
143124
|
await ctx.services.secrets.deleteSecret(slug2, key, ctx.user);
|
|
140704
143125
|
return { success: true };
|
|
140705
143126
|
});
|
|
143127
|
+
diff = requireDeveloper(async (ctx) => {
|
|
143128
|
+
const slug2 = ctx.params.slug;
|
|
143129
|
+
if (!slug2) {
|
|
143130
|
+
throw ApiError.badRequest("Missing game slug");
|
|
143131
|
+
}
|
|
143132
|
+
const body2 = await parseRequestBody(ctx.request, SecretsDiffRequestSchema);
|
|
143133
|
+
return ctx.services.secrets.diff(slug2, body2.secrets, ctx.user);
|
|
143134
|
+
});
|
|
140706
143135
|
secrets = defineControllerNames("secrets", {
|
|
140707
143136
|
listKeys: listKeys2,
|
|
140708
143137
|
setSecrets,
|
|
140709
|
-
deleteSecret
|
|
143138
|
+
deleteSecret,
|
|
143139
|
+
diff
|
|
140710
143140
|
});
|
|
140711
143141
|
});
|
|
140712
143142
|
|
|
@@ -140781,7 +143211,7 @@ var populateStudent, getUser, getUserEnrollments, getUserById, setupIntegration,
|
|
|
140781
143211
|
var init_timeback_controller = __esm(() => {
|
|
140782
143212
|
init_esm();
|
|
140783
143213
|
init_schemas_index();
|
|
140784
|
-
|
|
143214
|
+
init_src5();
|
|
140785
143215
|
init_timeback3();
|
|
140786
143216
|
init_errors();
|
|
140787
143217
|
init_utils11();
|
|
@@ -141548,6 +143978,7 @@ var init_controllers = __esm(() => {
|
|
|
141548
143978
|
init_dashboard_controller();
|
|
141549
143979
|
init_database_controller();
|
|
141550
143980
|
init_deploy_controller();
|
|
143981
|
+
init_deployment_state_controller();
|
|
141551
143982
|
init_developer_controller();
|
|
141552
143983
|
init_domain_controller();
|
|
141553
143984
|
init_game_member_controller();
|
|
@@ -142082,6 +144513,23 @@ var init_deploy = __esm(async () => {
|
|
|
142082
144513
|
});
|
|
142083
144514
|
});
|
|
142084
144515
|
|
|
144516
|
+
// src/routes/platform/games/deployment-state.ts
|
|
144517
|
+
var gameDeploymentStateRouter;
|
|
144518
|
+
var init_deployment_state = __esm(async () => {
|
|
144519
|
+
init_dist7();
|
|
144520
|
+
init_controllers();
|
|
144521
|
+
await init_api3();
|
|
144522
|
+
gameDeploymentStateRouter = new Hono2;
|
|
144523
|
+
gameDeploymentStateRouter.get("/:slug/deployment-state", handle2(deploymentState.get));
|
|
144524
|
+
gameDeploymentStateRouter.post("/:slug/deployment-state/baseline", handle2(deploymentState.baseline));
|
|
144525
|
+
gameDeploymentStateRouter.post("/:slug/deployment-state/migrations/:tag/realign", handle2(deploymentState.realignMigration));
|
|
144526
|
+
gameDeploymentStateRouter.post("/:slug/deployment-state/migrations/:tag/resolve", handle2(deploymentState.resolveMigration));
|
|
144527
|
+
gameDeploymentStateRouter.get("/:slug/deployments", handle2(deploymentState.history));
|
|
144528
|
+
gameDeploymentStateRouter.post("/:slug/deployments/blocked", handle2(deploymentState.reportBlocked));
|
|
144529
|
+
gameDeploymentStateRouter.get("/:slug/database/restore-points", handle2(deploymentState.restorePoints));
|
|
144530
|
+
gameDeploymentStateRouter.post("/:slug/database/restore", handle2(deploymentState.restore));
|
|
144531
|
+
});
|
|
144532
|
+
|
|
142085
144533
|
// src/routes/platform/games/domains.ts
|
|
142086
144534
|
var gameDomainsRouter;
|
|
142087
144535
|
var init_domains2 = __esm(async () => {
|
|
@@ -142127,6 +144575,7 @@ var init_secrets = __esm(async () => {
|
|
|
142127
144575
|
gameSecretsRouter = new Hono2;
|
|
142128
144576
|
gameSecretsRouter.get("/:slug/secrets", handle2(secrets.listKeys));
|
|
142129
144577
|
gameSecretsRouter.post("/:slug/secrets", handle2(secrets.setSecrets));
|
|
144578
|
+
gameSecretsRouter.post("/:slug/secrets/diff", handle2(secrets.diff));
|
|
142130
144579
|
gameSecretsRouter.delete("/:slug/secrets/:key", handle2(secrets.deleteSecret));
|
|
142131
144580
|
});
|
|
142132
144581
|
|
|
@@ -142329,6 +144778,7 @@ var init_games2 = __esm(async () => {
|
|
|
142329
144778
|
await __promiseAll([
|
|
142330
144779
|
init_crud(),
|
|
142331
144780
|
init_deploy(),
|
|
144781
|
+
init_deployment_state(),
|
|
142332
144782
|
init_domains2(),
|
|
142333
144783
|
init_logs(),
|
|
142334
144784
|
init_scores(),
|
|
@@ -142343,6 +144793,7 @@ var init_games2 = __esm(async () => {
|
|
|
142343
144793
|
gamesRouter.route("/", gameVerifyRouter);
|
|
142344
144794
|
gamesRouter.route("/", gameUploadsRouter);
|
|
142345
144795
|
gamesRouter.route("/", gameDeployRouter);
|
|
144796
|
+
gamesRouter.route("/", gameDeploymentStateRouter);
|
|
142346
144797
|
gamesRouter.route("/", gameDomainsRouter);
|
|
142347
144798
|
gamesRouter.route("/", gameLogsRouter);
|
|
142348
144799
|
gamesRouter.route("/", gameScoresRouter);
|
|
@@ -144689,7 +147140,7 @@ function printBanner(options) {
|
|
|
144689
147140
|
}
|
|
144690
147141
|
|
|
144691
147142
|
// src/cli/options.ts
|
|
144692
|
-
|
|
147143
|
+
init_src5();
|
|
144693
147144
|
import { resolve as resolve3 } from "node:path";
|
|
144694
147145
|
|
|
144695
147146
|
// ../utils/src/file-loader.ts
|