@dragonmastery/tamer 0.40.0 → 0.41.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{apply-CV4_3Jv4.mjs → apply-Mk9usR-U.mjs} +14 -14
- package/dist/{apply-CV4_3Jv4.mjs.map → apply-Mk9usR-U.mjs.map} +1 -1
- package/dist/{applyTarget-B1YPgkb3.mjs → applyTarget-CJSn9DeJ.mjs} +3 -3
- package/dist/{applyTarget-B1YPgkb3.mjs.map → applyTarget-CJSn9DeJ.mjs.map} +1 -1
- package/dist/{bootstrap-ilkixdmD.mjs → bootstrap-BCy6B-B6.mjs} +3 -3
- package/dist/{bootstrap-ilkixdmD.mjs.map → bootstrap-BCy6B-B6.mjs.map} +1 -1
- package/dist/{buildDispatchUploadForm-D_fM8JaL.mjs → buildDispatchUploadForm-XO8AxhXJ.mjs} +2 -6
- package/dist/buildDispatchUploadForm-XO8AxhXJ.mjs.map +1 -0
- package/dist/{cloudflareSnapshot-BAeNVohz.mjs → cloudflareSnapshot-DqP8v_xG.mjs} +4 -4
- package/dist/{cloudflareSnapshot-BAeNVohz.mjs.map → cloudflareSnapshot-DqP8v_xG.mjs.map} +1 -1
- package/dist/{deploy-BEaNADU6.mjs → deploy-DbXBHpCG.mjs} +9 -9
- package/dist/{deploy-BEaNADU6.mjs.map → deploy-DbXBHpCG.mjs.map} +1 -1
- package/dist/{destroy-Krf35oqE.mjs → destroy-CesVkyxf.mjs} +10 -10
- package/dist/{destroy-Krf35oqE.mjs.map → destroy-CesVkyxf.mjs.map} +1 -1
- package/dist/{destroy-tenant-C95ljuon.mjs → destroy-tenant-DMynv_u-.mjs} +1 -1
- package/dist/{destroy-tenant-C95ljuon.mjs.map → destroy-tenant-DMynv_u-.mjs.map} +1 -1
- package/dist/{dev-C__1rLos.mjs → dev-sk6JGKe4.mjs} +7 -7
- package/dist/{dev-C__1rLos.mjs.map → dev-sk6JGKe4.mjs.map} +1 -1
- package/dist/{dns-records.resolve-DwBR_1WI.mjs → dns-records.resolve-SPYGYNHa.mjs} +1 -1
- package/dist/{dns-records.resolve-DwBR_1WI.mjs.map → dns-records.resolve-SPYGYNHa.mjs.map} +1 -1
- package/dist/{dns-records.resolve-C2T0m4NG.mjs → dns-records.resolve-jECsH6N-.mjs} +1 -1
- package/dist/{dns-records.sync-Dfwk76J_.mjs → dns-records.sync-BORRvLky.mjs} +2 -2
- package/dist/{dns-records.sync-Dfwk76J_.mjs.map → dns-records.sync-BORRvLky.mjs.map} +1 -1
- package/dist/{doctor-BIaLEVFR.mjs → doctor-BgqnscIE.mjs} +1 -1
- package/dist/{doctor-BIaLEVFR.mjs.map → doctor-BgqnscIE.mjs.map} +1 -1
- package/dist/{drift-CLsSBorO.mjs → drift-C5r1cKxV.mjs} +6 -6
- package/dist/{drift-CLsSBorO.mjs.map → drift-C5r1cKxV.mjs.map} +1 -1
- package/dist/drift-oOUlh0u8.mjs +8 -0
- package/dist/{emit-Dh68dvo5.mjs → emit-C7KXAVP0.mjs} +2 -2
- package/dist/{emit-Dh68dvo5.mjs.map → emit-C7KXAVP0.mjs.map} +1 -1
- package/dist/{env-gc-0vX5Av4i.mjs → env-gc-DE4EV7j7.mjs} +10 -10
- package/dist/{env-gc-0vX5Av4i.mjs.map → env-gc-DE4EV7j7.mjs.map} +1 -1
- package/dist/{env-list-DYCprcLb.mjs → env-list-DKseThiA.mjs} +1 -1
- package/dist/{env-list-DYCprcLb.mjs.map → env-list-DKseThiA.mjs.map} +1 -1
- package/dist/{events-CnWvxyX_.mjs → events-CqbN9sbT.mjs} +1 -1
- package/dist/{events-CnWvxyX_.mjs.map → events-CqbN9sbT.mjs.map} +1 -1
- package/dist/{generator-DAU5K77L.mjs → generator-CbH3UZ3K.mjs} +2 -2
- package/dist/{generator-DAU5K77L.mjs.map → generator-CbH3UZ3K.mjs.map} +1 -1
- package/dist/{import-BNbHjR9t.mjs → import-leVD9Ryg.mjs} +5 -5
- package/dist/{import-BNbHjR9t.mjs.map → import-leVD9Ryg.mjs.map} +1 -1
- package/dist/index.d.mts +20 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/loader-B5iVsP6t.mjs +3 -0
- package/dist/{logpush-job-C_6uzGUC.mjs → logpush-job-Dqlt-wEw.mjs} +2 -2
- package/dist/{logpush-job-C_6uzGUC.mjs.map → logpush-job-Dqlt-wEw.mjs.map} +1 -1
- package/dist/{migrate-EVfFlJOM.mjs → migrate-DyrTw9ep.mjs} +5 -5
- package/dist/{migrate-EVfFlJOM.mjs.map → migrate-DyrTw9ep.mjs.map} +1 -1
- package/dist/normalize-DVSTRZhO.mjs.map +1 -1
- package/dist/{plan-tnUWkiM1.mjs → plan-D7UyLznb.mjs} +11 -11
- package/dist/{plan-tnUWkiM1.mjs.map → plan-D7UyLznb.mjs.map} +1 -1
- package/dist/{planFormat-DpA8XhzX.mjs → planFormat-CJw8Kq2s.mjs} +1 -1
- package/dist/{planFormat-DpA8XhzX.mjs.map → planFormat-CJw8Kq2s.mjs.map} +1 -1
- package/dist/{provision-tenant-DW4eg-7P.mjs → provision-tenant-z4DLxYAM.mjs} +25 -37
- package/dist/provision-tenant-z4DLxYAM.mjs.map +1 -0
- package/dist/{r2S3EmptyBucket-CXLmOrYF.mjs → r2S3EmptyBucket-DD81ZWQ7.mjs} +1 -1
- package/dist/{r2S3EmptyBucket-CXLmOrYF.mjs.map → r2S3EmptyBucket-DD81ZWQ7.mjs.map} +1 -1
- package/dist/{registry-X9dlQxG3.mjs → registry-CTerXUza.mjs} +81 -33
- package/dist/registry-CTerXUza.mjs.map +1 -0
- package/dist/resolveTenantBindings-BypqzcSn.mjs +65 -0
- package/dist/resolveTenantBindings-BypqzcSn.mjs.map +1 -0
- package/dist/{stackOutputs-CU2oxjpU.mjs → stackOutputs-BLp-dyzl.mjs} +1 -1
- package/dist/{stackOutputs-CU2oxjpU.mjs.map → stackOutputs-BLp-dyzl.mjs.map} +1 -1
- package/dist/{status-srUxsBIB.mjs → status-WMG5abrN.mjs} +6 -6
- package/dist/{status-srUxsBIB.mjs.map → status-WMG5abrN.mjs.map} +1 -1
- package/dist/sync-DSgJGQh1.mjs +7 -0
- package/dist/{sync-DfJGkOME.mjs → sync-Dii9n2nJ.mjs} +5 -5
- package/dist/{sync-DfJGkOME.mjs.map → sync-Dii9n2nJ.mjs.map} +1 -1
- package/dist/tamer.mjs +66 -25
- package/dist/tamer.mjs.map +1 -1
- package/dist/{tamerArtifactsR2-B9myb-IA.mjs → tamerArtifactsR2-B3X21TGV.mjs} +2 -2
- package/dist/{tamerArtifactsR2-B9myb-IA.mjs.map → tamerArtifactsR2-B3X21TGV.mjs.map} +1 -1
- package/dist/{tenant-MWIs0esz.mjs → tenant-WNYMWmIe.mjs} +1 -1
- package/dist/{tenant-MWIs0esz.mjs.map → tenant-WNYMWmIe.mjs.map} +1 -1
- package/dist/{tenant-migrate-CT-qyTUD.mjs → tenant-migrate-DBxTsvJ8.mjs} +20 -34
- package/dist/tenant-migrate-DBxTsvJ8.mjs.map +1 -0
- package/dist/{types-BPxuutXk.mjs → types-HPpAxgub.mjs} +5 -5
- package/dist/{types-BPxuutXk.mjs.map → types-HPpAxgub.mjs.map} +1 -1
- package/dist/{verifyPlanFile-CoAOsD3W.mjs → verifyPlanFile-B9VCcFIJ.mjs} +2 -2
- package/dist/{verifyPlanFile-CoAOsD3W.mjs.map → verifyPlanFile-B9VCcFIJ.mjs.map} +1 -1
- package/dist/{wfp-delete-CwWQFxxj.mjs → wfp-delete-TSVBw9XF.mjs} +1 -1
- package/dist/{wfp-delete-CwWQFxxj.mjs.map → wfp-delete-TSVBw9XF.mjs.map} +1 -1
- package/dist/{wfp-put-BBitXJep.mjs → wfp-put-5XZ-KC3g.mjs} +2 -2
- package/dist/{wfp-put-BBitXJep.mjs.map → wfp-put-5XZ-KC3g.mjs.map} +1 -1
- package/dist/{worker-route-CvuUPq1k.mjs → worker-route-BapxsQyX.mjs} +2 -2
- package/dist/{worker-route-CvuUPq1k.mjs.map → worker-route-BapxsQyX.mjs.map} +1 -1
- package/dist/{workers-DSlrKeNL.mjs → workers-D7ow_joN.mjs} +7 -13
- package/dist/{workers-DSlrKeNL.mjs.map → workers-D7ow_joN.mjs.map} +1 -1
- package/dist/wranglerSpawn-CfPkFLP3.mjs +3 -0
- package/dist/{wranglerSpawn-DWdgrsmQ.mjs → wranglerSpawn-VkSL0gZd.mjs} +1 -1
- package/dist/{wranglerSpawn-DWdgrsmQ.mjs.map → wranglerSpawn-VkSL0gZd.mjs.map} +1 -1
- package/dist/{zoneResolver-VoxLHM4N.mjs → zoneResolver-CamXJpSB.mjs} +1 -1
- package/dist/{zoneResolver-VoxLHM4N.mjs.map → zoneResolver-CamXJpSB.mjs.map} +1 -1
- package/package.json +5 -2
- package/dist/buildDispatchUploadForm-D_fM8JaL.mjs.map +0 -1
- package/dist/drift-08k11FV6.mjs +0 -8
- package/dist/provision-tenant-DW4eg-7P.mjs.map +0 -1
- package/dist/registry-X9dlQxG3.mjs.map +0 -1
- package/dist/resolveTenantBindings-DJDPhILD.mjs +0 -80
- package/dist/resolveTenantBindings-DJDPhILD.mjs.map +0 -1
- package/dist/sync-CfNyelDN.mjs +0 -7
- package/dist/tenant-migrate-CT-qyTUD.mjs.map +0 -1
- package/dist/wranglerSpawn-aARBLHpA.mjs +0 -3
- /package/dist/{secrets-2Hy5LMHs.mjs → secrets-DJ1yUy01.mjs} +0 -0
- /package/dist/{wranglerOutFile-f08VsoAj.mjs → wranglerOutFile-DDFKeKwO.mjs} +0 -0
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { n as materializeTamerResolvable } from "./normalize-DVSTRZhO.mjs";
|
|
2
|
-
import { j as resolveReferencesInString } from "./tamer.mjs";
|
|
3
|
-
|
|
4
|
-
//#region src/core/tenant/resolveTenantBindings.ts
|
|
5
|
-
/**
|
|
6
|
-
* Collect all D1 resource configs across all workers in the stack.
|
|
7
|
-
* Returns a map of `registryRole` → `{ binding, migrationsDir, migrationsTable }`.
|
|
8
|
-
*/
|
|
9
|
-
function collectD1RegistryRoles(config) {
|
|
10
|
-
const out = /* @__PURE__ */ new Map();
|
|
11
|
-
const workers = config.workers ? config.workers : config.worker ? { default: config.worker } : {};
|
|
12
|
-
for (const wc of Object.values(workers)) {
|
|
13
|
-
const d1s = wc.resources?.d1;
|
|
14
|
-
if (!d1s) continue;
|
|
15
|
-
for (const d1 of d1s) {
|
|
16
|
-
const role = d1.registryRole ?? d1.logicalName;
|
|
17
|
-
const binding = d1.binding?.trim() || `DB_${role.toUpperCase()}`;
|
|
18
|
-
if (!out.has(role)) out.set(role, {
|
|
19
|
-
binding,
|
|
20
|
-
migrationsDir: d1.migrationsDir,
|
|
21
|
-
migrationsTable: d1.migrationsTable
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
return out;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Resolve D1 bindings for the tenant dispatch script.
|
|
29
|
-
* Matches shard roles to `resources.d1[].registryRole` and produces
|
|
30
|
-
* `{ name: binding, id: cfId }` entries for the multipart metadata.
|
|
31
|
-
*/
|
|
32
|
-
function resolveTenantD1Bindings(config, shards, naming) {
|
|
33
|
-
const registryRoles = collectD1RegistryRoles(config);
|
|
34
|
-
return shards.map((shard) => {
|
|
35
|
-
return {
|
|
36
|
-
name: registryRoles.get(shard.role)?.binding ?? naming.workflowBindingKey(shard.role),
|
|
37
|
-
id: shard.cfId
|
|
38
|
-
};
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Resolve all dispatch script bindings (D1 + vars + services).
|
|
43
|
-
* References in vars/services are resolved against state.
|
|
44
|
-
*/
|
|
45
|
-
function resolveTenantBindings(config, shards, naming, state, env, accountId) {
|
|
46
|
-
const bindings = {};
|
|
47
|
-
const d1Bindings = resolveTenantD1Bindings(config, shards, naming);
|
|
48
|
-
if (d1Bindings.length > 0) bindings.d1_databases = d1Bindings;
|
|
49
|
-
if (config.tenant.dispatchVars) {
|
|
50
|
-
const refCtx = {
|
|
51
|
-
config,
|
|
52
|
-
env,
|
|
53
|
-
state,
|
|
54
|
-
naming,
|
|
55
|
-
accountId
|
|
56
|
-
};
|
|
57
|
-
const vars = {};
|
|
58
|
-
for (const [key, value] of Object.entries(config.tenant.dispatchVars)) vars[key] = resolveReferencesInString(materializeTamerResolvable(value), refCtx, `tenant.dispatchVars.${key}`);
|
|
59
|
-
if (Object.keys(vars).length > 0) bindings.vars = vars;
|
|
60
|
-
}
|
|
61
|
-
if (config.tenant.dispatchServices?.length) {
|
|
62
|
-
const refCtx = {
|
|
63
|
-
config,
|
|
64
|
-
env,
|
|
65
|
-
state,
|
|
66
|
-
naming,
|
|
67
|
-
accountId
|
|
68
|
-
};
|
|
69
|
-
bindings.services = config.tenant.dispatchServices.map((s) => ({
|
|
70
|
-
name: s.name,
|
|
71
|
-
service: resolveReferencesInString(materializeTamerResolvable(s.service), refCtx, `tenant.dispatchServices.${s.name}.service`),
|
|
72
|
-
...s.environment ? { environment: s.environment } : {}
|
|
73
|
-
}));
|
|
74
|
-
}
|
|
75
|
-
return bindings;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
//#endregion
|
|
79
|
-
export { resolveTenantBindings, resolveTenantD1Bindings };
|
|
80
|
-
//# sourceMappingURL=resolveTenantBindings-DJDPhILD.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resolveTenantBindings-DJDPhILD.mjs","names":["workers: Record<string, WorkerConfig>","bindings: DispatchScriptBindings","refCtx: ReferenceContext","vars: Record<string, string>"],"sources":["../src/core/tenant/resolveTenantBindings.ts"],"sourcesContent":["/**\n * Resolve dispatch script bindings for a provisioned tenant.\n *\n * D1 bindings derive automatically from `resources.d1[].registryRole`\n * matched to the tenant's shard roles. Vars and services come from\n * `tenant.dispatchVars` / `tenant.dispatchServices` (resolved against\n * state for `${tamer:...}` references).\n */\nimport type { CfiConfig, WorkerConfig, WorkerResources, TamerResolvableString } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { TenantD1ShardRef } from \"../../types.js\";\nimport type { DispatchScriptBindings } from \"../../core/wfp/buildDispatchUploadForm.js\";\nimport { materializeTamerResolvable } from \"../../dx/normalize.js\";\nimport {\n resolveReferencesInString,\n type ReferenceContext,\n} from \"../../core/references/references.js\";\n\n/**\n * Collect all D1 resource configs across all workers in the stack.\n * Returns a map of `registryRole` → `{ binding, migrationsDir, migrationsTable }`.\n */\nfunction collectD1RegistryRoles(\n config: CfiConfig,\n): Map<string, { binding: string; migrationsDir?: string; migrationsTable?: string }> {\n const out = new Map<\n string,\n { binding: string; migrationsDir?: string; migrationsTable?: string }\n >();\n const workers: Record<string, WorkerConfig> = config.workers\n ? (config.workers as Record<string, WorkerConfig>)\n : config.worker\n ? { default: config.worker as WorkerConfig }\n : {};\n for (const wc of Object.values(workers)) {\n const d1s = (wc as WorkerConfig & { resources?: WorkerResources }).resources?.d1;\n if (!d1s) continue;\n for (const d1 of d1s) {\n const role = d1.registryRole ?? d1.logicalName;\n const binding = d1.binding?.trim() || `DB_${role.toUpperCase()}`;\n if (!out.has(role)) {\n out.set(role, {\n binding,\n migrationsDir: d1.migrationsDir,\n migrationsTable: d1.migrationsTable,\n });\n }\n }\n }\n return out;\n}\n\n/**\n * Resolve D1 bindings for the tenant dispatch script.\n * Matches shard roles to `resources.d1[].registryRole` and produces\n * `{ name: binding, id: cfId }` entries for the multipart metadata.\n */\nexport function resolveTenantD1Bindings(\n config: CfiConfig,\n shards: TenantD1ShardRef[],\n naming: NamingEngine,\n): Array<{ name: string; id: string }> {\n const registryRoles = collectD1RegistryRoles(config);\n return shards.map((shard) => {\n const roleInfo = registryRoles.get(shard.role);\n const binding = roleInfo?.binding ?? naming.workflowBindingKey(shard.role);\n return { name: binding, id: shard.cfId };\n });\n}\n\n/**\n * Resolve all dispatch script bindings (D1 + vars + services).\n * References in vars/services are resolved against state.\n */\nexport function resolveTenantBindings(\n config: CfiConfig,\n shards: TenantD1ShardRef[],\n naming: NamingEngine,\n state: StateManager,\n env: string,\n accountId: string,\n): DispatchScriptBindings {\n const bindings: DispatchScriptBindings = {};\n\n // D1 bindings from shard roles\n const d1Bindings = resolveTenantD1Bindings(config, shards, naming);\n if (d1Bindings.length > 0) {\n bindings.d1_databases = d1Bindings;\n }\n\n // Vars from config.tenant.dispatchVars\n if (config.tenant.dispatchVars) {\n const refCtx: ReferenceContext = {\n config,\n env,\n state,\n naming,\n accountId,\n };\n const vars: Record<string, string> = {};\n for (const [key, value] of Object.entries(config.tenant.dispatchVars)) {\n vars[key] = resolveReferencesInString(\n materializeTamerResolvable(value),\n refCtx,\n `tenant.dispatchVars.${key}`,\n );\n }\n if (Object.keys(vars).length > 0) {\n bindings.vars = vars;\n }\n }\n\n // Service bindings from config.tenant.dispatchServices\n if (config.tenant.dispatchServices?.length) {\n const refCtx: ReferenceContext = {\n config,\n env,\n state,\n naming,\n accountId,\n };\n bindings.services = config.tenant.dispatchServices.map((s) => ({\n name: s.name,\n service: resolveReferencesInString(\n materializeTamerResolvable(s.service),\n refCtx,\n `tenant.dispatchServices.${s.name}.service`,\n ),\n ...(s.environment ? { environment: s.environment } : {}),\n }));\n }\n\n return bindings;\n}\n"],"mappings":";;;;;;;;AAuBA,SAAS,uBACP,QACoF;CACpF,MAAM,sBAAM,IAAI,KAGb;CACH,MAAMA,UAAwC,OAAO,UAChD,OAAO,UACR,OAAO,SACL,EAAE,SAAS,OAAO,QAAwB,GAC1C,EAAE;AACR,MAAK,MAAM,MAAM,OAAO,OAAO,QAAQ,EAAE;EACvC,MAAM,MAAO,GAAsD,WAAW;AAC9E,MAAI,CAAC,IAAK;AACV,OAAK,MAAM,MAAM,KAAK;GACpB,MAAM,OAAO,GAAG,gBAAgB,GAAG;GACnC,MAAM,UAAU,GAAG,SAAS,MAAM,IAAI,MAAM,KAAK,aAAa;AAC9D,OAAI,CAAC,IAAI,IAAI,KAAK,CAChB,KAAI,IAAI,MAAM;IACZ;IACA,eAAe,GAAG;IAClB,iBAAiB,GAAG;IACrB,CAAC;;;AAIR,QAAO;;;;;;;AAQT,SAAgB,wBACd,QACA,QACA,QACqC;CACrC,MAAM,gBAAgB,uBAAuB,OAAO;AACpD,QAAO,OAAO,KAAK,UAAU;AAG3B,SAAO;GAAE,MAFQ,cAAc,IAAI,MAAM,KAAK,EACpB,WAAW,OAAO,mBAAmB,MAAM,KAAK;GAClD,IAAI,MAAM;GAAM;GACxC;;;;;;AAOJ,SAAgB,sBACd,QACA,QACA,QACA,OACA,KACA,WACwB;CACxB,MAAMC,WAAmC,EAAE;CAG3C,MAAM,aAAa,wBAAwB,QAAQ,QAAQ,OAAO;AAClE,KAAI,WAAW,SAAS,EACtB,UAAS,eAAe;AAI1B,KAAI,OAAO,OAAO,cAAc;EAC9B,MAAMC,SAA2B;GAC/B;GACA;GACA;GACA;GACA;GACD;EACD,MAAMC,OAA+B,EAAE;AACvC,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,OAAO,aAAa,CACnE,MAAK,OAAO,0BACV,2BAA2B,MAAM,EACjC,QACA,uBAAuB,MACxB;AAEH,MAAI,OAAO,KAAK,KAAK,CAAC,SAAS,EAC7B,UAAS,OAAO;;AAKpB,KAAI,OAAO,OAAO,kBAAkB,QAAQ;EAC1C,MAAMD,SAA2B;GAC/B;GACA;GACA;GACA;GACA;GACD;AACD,WAAS,WAAW,OAAO,OAAO,iBAAiB,KAAK,OAAO;GAC7D,MAAM,EAAE;GACR,SAAS,0BACP,2BAA2B,EAAE,QAAQ,EACrC,QACA,2BAA2B,EAAE,KAAK,UACnC;GACD,GAAI,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,GAAG,EAAE;GACxD,EAAE;;AAGL,QAAO"}
|
package/dist/sync-CfNyelDN.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tenant-migrate-CT-qyTUD.mjs","names":[],"sources":["../src/cli/commands/tenant-migrate.ts"],"sourcesContent":["import { loadConfig } from \"../../core/config/loader.js\";\nimport { cloudflareAccountIdFromEnv } from \"../../core/cloudflareEnv.js\";\nimport { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport { StateManager } from \"../../core/state/StateManager.js\";\nimport { stackNameForConfig } from \"../../core/state/stackName.js\";\nimport { namingFromConfig } from \"../../core/config/namingFromConfig.js\";\nimport { resolveTenantD1Bindings } from \"../../core/tenant/resolveTenantBindings.js\";\nimport { spawnWranglerSync } from \"../../core/wrangler/wranglerSpawn.js\";\nimport { wranglerConfigCliArgs } from \"../../core/wrangler/wranglerOutFile.js\";\nimport { writeFileSync, unlinkSync, mkdirSync } from \"fs\";\nimport { join } from \"path\";\nimport { tmpdir } from \"os\";\n\n/**\n * `tamer wfp tenant migrate --env dev --product X --workspace Y`\n *\n * Runs D1 migrations on each shard for the named tenant. Matches shard roles\n * to `resources.d1[].registryRole` → `migrationsDir` to find the migration\n * source directory. Writes a temporary wrangler.json with the shard binding\n * and invokes `wrangler d1 migrations apply --remote`.\n */\nexport async function runTenantMigrate(options: {\n env?: string;\n product: string;\n workspace: string;\n configPath?: string;\n}): Promise<void> {\n const env = options.env;\n if (!env) {\n throw new Error(\"tenant migrate: --env is required\");\n }\n if (env === \"local\") {\n throw new Error(\"tenant migrate requires a non-local --env.\");\n }\n\n const config = await loadConfig(options.configPath, { env });\n const accountId =\n config.account_id ?? cloudflareAccountIdFromEnv();\n if (!accountId) {\n throw new Error(\n \"account_id required in config or CLOUDFLARE_ACCOUNT_ID env var\",\n );\n }\n\n const api = new CFApiClient(accountId);\n const naming = namingFromConfig(config);\n const state = new StateManager(\n config.tenant.id,\n env,\n stackNameForConfig(config),\n );\n await state.hydrate(api);\n\n const tenant = state.getTenant(options.product, options.workspace);\n if (!tenant) {\n throw new Error(\n `Tenant \"${options.product}:${options.workspace}\" not found in env ${env}.`,\n );\n }\n if (!tenant.d1Shards || tenant.d1Shards.length === 0) {\n console.log(`Tenant \"${options.product}:${options.workspace}\" has no D1 shards.`);\n return;\n }\n\n // Collect migration dirs from config: registryRole → migrationsDir\n const workers = config.workers\n ? Object.values(config.workers as Record<string, unknown>)\n : config.worker\n ? [config.worker]\n : [];\n const roleToMigrations = new Map<string, { dir?: string; table?: string }>();\n for (const wc of workers) {\n const d1s = (wc as {\n resources?: { d1?: Array<{ registryRole?: string; migrationsDir?: string; migrationsTable?: string }> };\n }).resources?.d1;\n if (!d1s) continue;\n for (const d1 of d1s) {\n const role = d1.registryRole ?? \"\";\n if (role) {\n roleToMigrations.set(role, { dir: d1.migrationsDir, table: d1.migrationsTable });\n }\n }\n }\n\n const d1Bindings = resolveTenantD1Bindings(config, tenant.d1Shards, naming);\n const tempDir = join(tmpdir(), `tamer-tenant-migrate-${Date.now()}`);\n mkdirSync(tempDir, { recursive: true });\n\n let migrated = 0;\n let skipped = 0;\n\n for (let i = 0; i < tenant.d1Shards.length; i++) {\n const shard = tenant.d1Shards[i]!;\n const binding = d1Bindings[i]!;\n const migInfo = roleToMigrations.get(shard.role);\n if (!migInfo?.dir) {\n console.log(` migrate: skipping ${shard.role} (no migrationsDir configured)`);\n skipped++;\n continue;\n }\n\n const tempWrangler = join(tempDir, `wrangler.${shard.role}.json`);\n const tempConfig = {\n name: `tenant-migrate-${shard.role}`,\n d1_databases: [{ name: binding.name, database_id: shard.cfId }],\n compatibility_date: config.compatibility_date ?? \"2024-01-01\",\n };\n writeFileSync(tempWrangler, JSON.stringify(tempConfig, null, 2));\n\n const migrateArgs = [\n \"wrangler\",\n ...wranglerConfigCliArgs(`wrangler.${shard.role}.json`),\n \"d1\",\n \"migrations\",\n \"apply\",\n binding.name,\n \"--remote\",\n ];\n if (migInfo.table) {\n migrateArgs.push(\"--migrations-table\", migInfo.table);\n }\n\n console.log(` migrate: applying for ${shard.role} (${shard.derivedName})...`);\n const result = spawnWranglerSync(migrateArgs, {\n cwd: migInfo.dir!,\n stdio: \"inherit\",\n });\n if (result.status === 0) {\n migrated++;\n } else {\n console.warn(` migrate: failed for ${shard.role} (exit ${result.status})`);\n }\n try {\n unlinkSync(tempWrangler);\n } catch {\n /* best-effort */\n }\n }\n\n try {\n unlinkSync(tempDir);\n } catch {\n /* best-effort */\n }\n\n console.log(\n `\\nMigrations complete: ${migrated} shard(s) migrated, ${skipped} skipped.`,\n );\n}\n"],"mappings":"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"}
|
|
File without changes
|
|
File without changes
|