@dragonmastery/tamer 0.33.0 → 0.34.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/{deploy-BP65Wvm1.mjs → deploy-dNygCucr.mjs} +17 -3
- package/dist/deploy-dNygCucr.mjs.map +1 -0
- package/dist/{destroy-DPSuQg9v.mjs → destroy-C0cKkpWe.mjs} +2 -2
- package/dist/{destroy-DPSuQg9v.mjs.map → destroy-C0cKkpWe.mjs.map} +1 -1
- package/dist/{drift-Bp-P13-B.mjs → drift-B5y9LF5X.mjs} +2 -2
- package/dist/{drift-Bp-P13-B.mjs.map → drift-B5y9LF5X.mjs.map} +1 -1
- package/dist/{drift-RM0vq3uF.mjs → drift-DENAf1Oe.mjs} +2 -2
- package/dist/index.d.mts +23 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/{migrate-ODEnh6Tv.mjs → migrate-DWyUVN1I.mjs} +2 -2
- package/dist/{migrate-ODEnh6Tv.mjs.map → migrate-DWyUVN1I.mjs.map} +1 -1
- package/dist/normalize-DVSTRZhO.mjs.map +1 -1
- package/dist/{plan-BuG21Atq.mjs → plan-Blxn-yKr.mjs} +3 -3
- package/dist/{plan-BuG21Atq.mjs.map → plan-Blxn-yKr.mjs.map} +1 -1
- package/dist/tamer.mjs +6 -6
- package/dist/{types-DuK39eYA.mjs → types-CADr4Kck.mjs} +2 -2
- package/dist/{types-DuK39eYA.mjs.map → types-CADr4Kck.mjs.map} +1 -1
- package/dist/{workers-DAv1ze8_.mjs → workers-y9RTOzbC.mjs} +2 -2
- package/dist/{workers-DAv1ze8_.mjs.map → workers-y9RTOzbC.mjs.map} +1 -1
- package/dist/wranglerSpawn-CqVNGkA9.mjs +42 -0
- package/dist/{wranglerSpawn-B3TKjpt2.mjs.map → wranglerSpawn-CqVNGkA9.mjs.map} +1 -1
- package/package.json +1 -1
- package/dist/deploy-BP65Wvm1.mjs.map +0 -1
- package/dist/wranglerSpawn-B3TKjpt2.mjs +0 -24
package/dist/tamer.mjs
CHANGED
|
@@ -8677,7 +8677,7 @@ async function main() {
|
|
|
8677
8677
|
break;
|
|
8678
8678
|
case "deploy": {
|
|
8679
8679
|
const d = parseDeployArgs(rest);
|
|
8680
|
-
await import("./deploy-
|
|
8680
|
+
await import("./deploy-dNygCucr.mjs").then((m) => m.runDeploy({
|
|
8681
8681
|
worker: d.worker,
|
|
8682
8682
|
env: d.env,
|
|
8683
8683
|
configPath: d.configPath,
|
|
@@ -8686,10 +8686,10 @@ async function main() {
|
|
|
8686
8686
|
break;
|
|
8687
8687
|
}
|
|
8688
8688
|
case "migrate":
|
|
8689
|
-
await import("./migrate-
|
|
8689
|
+
await import("./migrate-DWyUVN1I.mjs").then((m) => m.runMigrate(parseMigrateArgs(rest)));
|
|
8690
8690
|
break;
|
|
8691
8691
|
case "types":
|
|
8692
|
-
await import("./types-
|
|
8692
|
+
await import("./types-CADr4Kck.mjs").then((m) => m.runTypes(parseTypesArgs(rest)));
|
|
8693
8693
|
break;
|
|
8694
8694
|
case "status":
|
|
8695
8695
|
await import("./status-PlMHsDzT.mjs").then((m) => m.runStatus(parseStatusArgs(rest)));
|
|
@@ -8698,11 +8698,11 @@ async function main() {
|
|
|
8698
8698
|
await import("./events-B7Lencm8.mjs").then((m) => m.runEvents(parseEventsArgs(rest)));
|
|
8699
8699
|
break;
|
|
8700
8700
|
case "drift":
|
|
8701
|
-
exitStatus = await import("./drift-
|
|
8701
|
+
exitStatus = await import("./drift-DENAf1Oe.mjs").then((m) => m.runDrift(parseDriftArgs(rest)));
|
|
8702
8702
|
break;
|
|
8703
8703
|
case "plan": {
|
|
8704
8704
|
const p = parsePlanArgs(rest);
|
|
8705
|
-
exitStatus = await import("./plan-
|
|
8705
|
+
exitStatus = await import("./plan-Blxn-yKr.mjs").then((m) => m.runPlan({
|
|
8706
8706
|
env: p.env,
|
|
8707
8707
|
configPath: p.configPath,
|
|
8708
8708
|
json: p.json,
|
|
@@ -8751,7 +8751,7 @@ async function main() {
|
|
|
8751
8751
|
}
|
|
8752
8752
|
case "destroy": {
|
|
8753
8753
|
const d = parseDestroyArgs(rest);
|
|
8754
|
-
await import("./destroy-
|
|
8754
|
+
await import("./destroy-C0cKkpWe.mjs").then((m) => m.runDestroy({
|
|
8755
8755
|
env: d.env,
|
|
8756
8756
|
force: d.force,
|
|
8757
8757
|
skipWorkers: d.skipWorkers,
|
|
@@ -2,7 +2,7 @@ import { B as getWorkers, L as CFApiClient, M as wranglerConfigCliArgs, R as clo
|
|
|
2
2
|
import "./registry-BlHEOKlN.mjs";
|
|
3
3
|
import "./r2S3EmptyBucket-B9_pHfvB.mjs";
|
|
4
4
|
import { n as writeWranglerJson, t as generateWranglerConfig } from "./generator-ZTEeHlft.mjs";
|
|
5
|
-
import {
|
|
5
|
+
import { n as spawnWranglerSync } from "./wranglerSpawn-CqVNGkA9.mjs";
|
|
6
6
|
|
|
7
7
|
//#region src/cli/commands/types.ts
|
|
8
8
|
async function runTypes(options) {
|
|
@@ -39,4 +39,4 @@ async function runTypes(options) {
|
|
|
39
39
|
|
|
40
40
|
//#endregion
|
|
41
41
|
export { runTypes };
|
|
42
|
-
//# sourceMappingURL=types-
|
|
42
|
+
//# sourceMappingURL=types-CADr4Kck.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types-
|
|
1
|
+
{"version":3,"file":"types-CADr4Kck.mjs","names":[],"sources":["../src/cli/commands/types.ts"],"sourcesContent":["import { loadConfig, getWorkers } from \"../../core/config/loader.js\";\nimport { cloudflareAccountIdFromEnv } from \"../../core/cloudflareEnv.js\";\nimport { namingFromConfig } from \"../../core/config/namingFromConfig.js\";\nimport { wranglerConfigCliArgs } from \"../../core/wrangler/wranglerOutFile.js\";\nimport { spawnWranglerSync } from \"../../core/wrangler/wranglerSpawn.js\";\nimport { StateManager } from \"../../core/state/StateManager.js\";\nimport { stackNameForConfig } from \"../../core/state/stackName.js\";\nimport { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport { resolveWorkerConfig } from \"../../core/config/resolver.js\";\nimport { fetchStackImports } from \"../../core/imports/fetchStackImports.js\";\nimport {\n generateWranglerConfig,\n writeWranglerJson,\n} from \"../../core/wrangler/generator.js\";\n\nexport async function runTypes(options: {\n worker?: string;\n env?: string;\n configPath?: string;\n}): Promise<void> {\n const workerFilter = options.worker;\n const env = options.env ?? \"local\";\n const configPath = options.configPath;\n const baseDir = process.cwd();\n\n const config = await loadConfig(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 naming = namingFromConfig(config);\n const api = new CFApiClient(accountId);\n const state = new StateManager(\n config.tenant.id,\n env,\n stackNameForConfig(config),\n );\n await state.hydrate(api);\n const imports = await fetchStackImports(api, config, env);\n\n const workers = await getWorkers(config, baseDir);\n const toRun = workerFilter\n ? workers.filter(([k]) => k === workerFilter)\n : workers;\n\n if (toRun.length === 0) {\n throw new Error(\n workerFilter\n ? `Worker \"${workerFilter}\" not found`\n : \"No workers configured\",\n );\n }\n\n for (const [workerKey, workerConfig] of toRun) {\n const resolved = await resolveWorkerConfig(\n config,\n workerKey,\n workerConfig,\n env,\n baseDir,\n accountId,\n naming,\n state,\n { imports },\n );\n const wranglerConfig = generateWranglerConfig(resolved, state, naming);\n writeWranglerJson(resolved.workerDir, wranglerConfig, resolved.wranglerOutFile);\n\n const typesArgs = [\n \"wrangler\",\n ...wranglerConfigCliArgs(resolved.wranglerOutFile),\n \"types\",\n ];\n const result = spawnWranglerSync(typesArgs, {\n cwd: resolved.workerDir,\n stdio: \"inherit\",\n });\n if (result.status !== 0) {\n throw new Error(`wrangler types failed for ${workerKey}`);\n }\n console.log(`Generated types for ${workerKey}`);\n }\n}\n"],"mappings":";;;;;;;AAeA,eAAsB,SAAS,SAIb;CAChB,MAAM,eAAe,QAAQ;CAC7B,MAAM,MAAM,QAAQ,OAAO;CAC3B,MAAM,aAAa,QAAQ;CAC3B,MAAM,UAAU,QAAQ,KAAK;CAE7B,MAAM,SAAS,MAAM,WAAW,YAAY,EAAE,KAAK,CAAC;CACpD,MAAM,YACJ,OAAO,cAAc,4BAA4B;AACnD,KAAI,CAAC,UACH,OAAM,IAAI,MACR,iEACD;CAGH,MAAM,SAAS,iBAAiB,OAAO;CACvC,MAAM,MAAM,IAAI,YAAY,UAAU;CACtC,MAAM,QAAQ,IAAI,aAChB,OAAO,OAAO,IACd,KACA,mBAAmB,OAAO,CAC3B;AACD,OAAM,MAAM,QAAQ,IAAI;CACxB,MAAM,UAAU,MAAM,kBAAkB,KAAK,QAAQ,IAAI;CAEzD,MAAM,UAAU,MAAM,WAAW,QAAQ,QAAQ;CACjD,MAAM,QAAQ,eACV,QAAQ,QAAQ,CAAC,OAAO,MAAM,aAAa,GAC3C;AAEJ,KAAI,MAAM,WAAW,EACnB,OAAM,IAAI,MACR,eACI,WAAW,aAAa,eACxB,wBACL;AAGH,MAAK,MAAM,CAAC,WAAW,iBAAiB,OAAO;EAC7C,MAAM,WAAW,MAAM,oBACrB,QACA,WACA,cACA,KACA,SACA,WACA,QACA,OACA,EAAE,SAAS,CACZ;EACD,MAAM,iBAAiB,uBAAuB,UAAU,OAAO,OAAO;AACtE,oBAAkB,SAAS,WAAW,gBAAgB,SAAS,gBAAgB;AAW/E,MAJe,kBALG;GAChB;GACA,GAAG,sBAAsB,SAAS,gBAAgB;GAClD;GACD,EAC2C;GAC1C,KAAK,SAAS;GACd,OAAO;GACR,CAAC,CACS,WAAW,EACpB,OAAM,IAAI,MAAM,6BAA6B,YAAY;AAE3D,UAAQ,IAAI,uBAAuB,YAAY"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { B as getWorkers, k as resolveWorkerConfig, u as namingFromConfig } from "./tamer.mjs";
|
|
2
|
-
import {
|
|
2
|
+
import { n as spawnWranglerSync } from "./wranglerSpawn-CqVNGkA9.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/features/workers/workers.destroy.ts
|
|
5
5
|
/**
|
|
@@ -83,4 +83,4 @@ async function workersDrift(env, config, baseDir, accountId, naming, state, api,
|
|
|
83
83
|
|
|
84
84
|
//#endregion
|
|
85
85
|
export { workersDestroy as n, workersDrift as t };
|
|
86
|
-
//# sourceMappingURL=workers-
|
|
86
|
+
//# sourceMappingURL=workers-y9RTOzbC.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workers-
|
|
1
|
+
{"version":3,"file":"workers-y9RTOzbC.mjs","names":["resolved: Awaited<ReturnType<typeof resolveWorkerConfig>>[]","drift: ResourceDrift","exists: boolean"],"sources":["../src/features/workers/workers.destroy.ts","../src/features/workers/workers.drift.ts"],"sourcesContent":["import type { CfiConfig } from \"../../types.js\";\nimport type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport { getWorkers } from \"../../core/config/loader.js\";\nimport { namingFromConfig } from \"../../core/config/namingFromConfig.js\";\nimport { resolveWorkerConfig } from \"../../core/config/resolver.js\";\nimport { spawnWranglerSync } from \"../../core/wrangler/wranglerSpawn.js\";\n\n/**\n * Remove deployed Workers: dispatch-namespace scripts via CF API, then global scripts via `wrangler delete`.\n * Call before deleting D1/R2/KV/dispatch namespaces so bindings and namespace script counts are cleared.\n */\nexport async function workersDestroy(\n env: string,\n baseDir: string,\n accountId: string,\n config: CfiConfig,\n state: StateManager,\n api: CFApiClient,\n _force?: boolean,\n): Promise<void> {\n const naming = namingFromConfig(config);\n const workers = await getWorkers(config, baseDir);\n const resolved: Awaited<ReturnType<typeof resolveWorkerConfig>>[] = [];\n\n for (const [workerKey, workerConfig] of workers) {\n // Tolerant resolution: destroy only consumes `workerName` and\n // `dispatchNamespace` — both derived from naming, not references —\n // so unresolved `${tamer:import:…}` placeholders in `vars` /\n // `tamerRoutes` must not crash teardown of a stack whose siblings\n // have already been destroyed.\n resolved.push(\n await resolveWorkerConfig(\n config,\n workerKey,\n workerConfig,\n env,\n baseDir,\n accountId,\n naming,\n state,\n { referencesMode: \"tolerant\" },\n ),\n );\n }\n\n const inNamespace = resolved.filter((r) => r.dispatchNamespace);\n const globalWorkers = resolved.filter((r) => !r.dispatchNamespace);\n\n for (const r of inNamespace) {\n const ns = r.dispatchNamespace!;\n try {\n await api.dispatchNamespaceScriptDelete(ns, r.workerName, {\n force: true,\n });\n console.log(`Deleted Worker \"${r.workerName}\" from dispatch namespace \"${ns}\"`);\n } catch (err) {\n console.warn(\n `Failed to delete dispatch Worker \"${r.workerName}\" in \"${ns}\":`,\n err instanceof Error ? err.message : err,\n );\n }\n }\n\n for (const r of globalWorkers) {\n // Do not pass `--config` here: per-worker `wrangler.*.json` files are often\n // absent (gitignored / only emitted by apply/deploy). `wrangler delete` only\n // needs the script name plus account credentials from the environment.\n // Using `cwd: baseDir` keeps `.env` loading consistent with other commands\n // (stack root). Passing `--config` with a missing file also breaks on\n // Windows (malformed path: cwd + absolute config).\n const args = [\"wrangler\", \"delete\", r.workerName, \"--force\"];\n const result = spawnWranglerSync(args, {\n cwd: baseDir,\n stdio: \"inherit\",\n shell: false,\n });\n if (result.status !== 0) {\n console.warn(\n `wrangler delete failed for \"${r.workerName}\" (cwd: ${baseDir}); script may not exist.`,\n );\n } else {\n console.log(`Deleted Worker \"${r.workerName}\"`);\n }\n }\n}\n","import type { CfiConfig } from \"../../types.js\";\nimport type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { ResourceDrift } from \"../../core/drift/drift.types.js\";\nimport { getWorkers } from \"../../core/config/loader.js\";\nimport { resolveWorkerConfig } from \"../../core/config/resolver.js\";\n\n/**\n * Drift for declared **global** Worker scripts (not dispatch-namespace\n * tenant scripts — those are owned by `provision-tenant` / WFP).\n *\n * Tamer does not store deployed worker script ids in state today, so this\n * report only emits `undeployed` (declared but missing on Cloudflare). It\n * never claims `unrecordedInState` for scripts because the state model has\n * no `worker_script` entry to be missing.\n *\n * Returns `null` for `local` env or when there are no global workers (so\n * `computeDriftReport` can skip emitting the section entirely).\n */\nexport async function workersDrift(\n env: string,\n config: CfiConfig,\n baseDir: string,\n accountId: string,\n naming: NamingEngine,\n state: StateManager,\n api: CFApiClient,\n opts: {\n /** Pre-fetched sibling stack outputs; tolerant lookup. */\n imports?: Record<string, Record<string, string>>;\n } = {},\n): Promise<ResourceDrift | null> {\n if (env === \"local\") return null;\n\n const workers = await getWorkers(config, baseDir);\n if (workers.length === 0) return null;\n\n const drift: ResourceDrift = {\n kind: \"worker_script\",\n missingFromCloudflare: [],\n unrecordedInState: [],\n undeployed: [],\n };\n\n let sawGlobalWorker = false;\n for (const [workerKey, wc] of workers) {\n const resolved = await resolveWorkerConfig(\n config,\n workerKey,\n wc,\n env,\n baseDir,\n accountId,\n naming,\n state,\n { referencesMode: \"tolerant\", imports: opts.imports },\n );\n if (resolved.dispatchNamespace) continue;\n sawGlobalWorker = true;\n\n let exists: boolean;\n try {\n const script = await api.workersScriptGet(resolved.workerName);\n exists = !!script;\n } catch {\n continue;\n }\n if (!exists) {\n drift.undeployed.push({\n logicalName: workerKey,\n derivedName: resolved.workerName,\n });\n }\n }\n\n return sawGlobalWorker ? drift : null;\n}\n"],"mappings":";;;;;;;;AAYA,eAAsB,eACpB,KACA,SACA,WACA,QACA,OACA,KACA,QACe;CACf,MAAM,SAAS,iBAAiB,OAAO;CACvC,MAAM,UAAU,MAAM,WAAW,QAAQ,QAAQ;CACjD,MAAMA,WAA8D,EAAE;AAEtE,MAAK,MAAM,CAAC,WAAW,iBAAiB,QAMtC,UAAS,KACP,MAAM,oBACJ,QACA,WACA,cACA,KACA,SACA,WACA,QACA,OACA,EAAE,gBAAgB,YAAY,CAC/B,CACF;CAGH,MAAM,cAAc,SAAS,QAAQ,MAAM,EAAE,kBAAkB;CAC/D,MAAM,gBAAgB,SAAS,QAAQ,MAAM,CAAC,EAAE,kBAAkB;AAElE,MAAK,MAAM,KAAK,aAAa;EAC3B,MAAM,KAAK,EAAE;AACb,MAAI;AACF,SAAM,IAAI,8BAA8B,IAAI,EAAE,YAAY,EACxD,OAAO,MACR,CAAC;AACF,WAAQ,IAAI,mBAAmB,EAAE,WAAW,6BAA6B,GAAG,GAAG;WACxE,KAAK;AACZ,WAAQ,KACN,qCAAqC,EAAE,WAAW,QAAQ,GAAG,KAC7D,eAAe,QAAQ,IAAI,UAAU,IACtC;;;AAIL,MAAK,MAAM,KAAK,cAad,KALe,kBADF;EAAC;EAAY;EAAU,EAAE;EAAY;EAAU,EACrB;EACrC,KAAK;EACL,OAAO;EACP,OAAO;EACR,CAAC,CACS,WAAW,EACpB,SAAQ,KACN,+BAA+B,EAAE,WAAW,UAAU,QAAQ,0BAC/D;KAED,SAAQ,IAAI,mBAAmB,EAAE,WAAW,GAAG;;;;;;;;;;;;;;;;;AC9DrD,eAAsB,aACpB,KACA,QACA,SACA,WACA,QACA,OACA,KACA,OAGI,EAAE,EACyB;AAC/B,KAAI,QAAQ,QAAS,QAAO;CAE5B,MAAM,UAAU,MAAM,WAAW,QAAQ,QAAQ;AACjD,KAAI,QAAQ,WAAW,EAAG,QAAO;CAEjC,MAAMC,QAAuB;EAC3B,MAAM;EACN,uBAAuB,EAAE;EACzB,mBAAmB,EAAE;EACrB,YAAY,EAAE;EACf;CAED,IAAI,kBAAkB;AACtB,MAAK,MAAM,CAAC,WAAW,OAAO,SAAS;EACrC,MAAM,WAAW,MAAM,oBACrB,QACA,WACA,IACA,KACA,SACA,WACA,QACA,OACA;GAAE,gBAAgB;GAAY,SAAS,KAAK;GAAS,CACtD;AACD,MAAI,SAAS,kBAAmB;AAChC,oBAAkB;EAElB,IAAIC;AACJ,MAAI;AAEF,YAAS,CAAC,CADK,MAAM,IAAI,iBAAiB,SAAS,WAAW;UAExD;AACN;;AAEF,MAAI,CAAC,OACH,OAAM,WAAW,KAAK;GACpB,aAAa;GACb,aAAa,SAAS;GACvB,CAAC;;AAIN,QAAO,kBAAkB,QAAQ"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { spawnSync } from "child_process";
|
|
2
|
+
|
|
3
|
+
//#region src/core/wrangler/wranglerSpawn.ts
|
|
4
|
+
/** Injectable spawn for unit tests (defaults to Node `spawnSync`). */
|
|
5
|
+
const wranglerSpawnDeps = { spawnSync };
|
|
6
|
+
/**
|
|
7
|
+
* Spawn Wrangler via `bunx wrangler …` so the project-local peer/devDependency
|
|
8
|
+
* resolves like npm/bun scripts (`node_modules/.bin`).
|
|
9
|
+
*/
|
|
10
|
+
function spawnWranglerSync(argv, options) {
|
|
11
|
+
return wranglerSpawnDeps.spawnSync("bunx", argv, {
|
|
12
|
+
cwd: options.cwd,
|
|
13
|
+
stdio: options.stdio,
|
|
14
|
+
env: options.env ? {
|
|
15
|
+
...process.env,
|
|
16
|
+
...options.env
|
|
17
|
+
} : process.env,
|
|
18
|
+
shell: options.shell ?? true
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Spawn an arbitrary shell command (e.g. `vite build`) for workers that declare
|
|
23
|
+
* a {@link WorkerBuildConfig} pre-deploy step. Uses the same injectable spawn
|
|
24
|
+
* as {@link spawnWranglerSync} so unit tests capture it via the wrangler spawn
|
|
25
|
+
* mock. Runs with `shell: true` so the `command` string is interpreted by the
|
|
26
|
+
* shell (pipes, `&&`, env-prefixes all work).
|
|
27
|
+
*/
|
|
28
|
+
function spawnBuildSync(command, options) {
|
|
29
|
+
return wranglerSpawnDeps.spawnSync(command, [], {
|
|
30
|
+
cwd: options.cwd,
|
|
31
|
+
stdio: options.stdio,
|
|
32
|
+
env: options.env ? {
|
|
33
|
+
...process.env,
|
|
34
|
+
...options.env
|
|
35
|
+
} : process.env,
|
|
36
|
+
shell: true
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
//#endregion
|
|
41
|
+
export { spawnWranglerSync as n, spawnBuildSync as t };
|
|
42
|
+
//# sourceMappingURL=wranglerSpawn-CqVNGkA9.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wranglerSpawn-
|
|
1
|
+
{"version":3,"file":"wranglerSpawn-CqVNGkA9.mjs","names":["nodeSpawnSync"],"sources":["../src/core/wrangler/wranglerSpawn.ts"],"sourcesContent":["import {\n spawnSync as nodeSpawnSync,\n type SpawnSyncOptions,\n} from \"child_process\";\n\n/** Narrow spawn signature used by `spawnWranglerSync` (easier to mock in tests). */\nexport type WranglerSpawnSyncFn = (\n command: string,\n args: readonly string[],\n options: SpawnSyncOptions,\n) => ReturnType<typeof nodeSpawnSync>;\n\n/** Injectable spawn for unit tests (defaults to Node `spawnSync`). */\nexport const wranglerSpawnDeps = {\n spawnSync: nodeSpawnSync as WranglerSpawnSyncFn,\n};\n\nexport type SpawnWranglerSyncOptions = Pick<\n SpawnSyncOptions,\n \"cwd\" | \"stdio\" | \"env\"\n> & {\n /**\n * Default `true`. Use `false` where avoiding the shell matters (e.g. some\n * Windows paths with `wrangler delete`).\n */\n shell?: boolean;\n};\n\n/**\n * Spawn Wrangler via `bunx wrangler …` so the project-local peer/devDependency\n * resolves like npm/bun scripts (`node_modules/.bin`).\n */\nexport function spawnWranglerSync(\n argv: string[],\n options: SpawnWranglerSyncOptions,\n): ReturnType<typeof nodeSpawnSync> {\n return wranglerSpawnDeps.spawnSync(\"bunx\", argv, {\n cwd: options.cwd,\n stdio: options.stdio,\n env: options.env ? { ...process.env, ...options.env } : process.env,\n shell: options.shell ?? true,\n });\n}\n\n/**\n * Spawn an arbitrary shell command (e.g. `vite build`) for workers that declare\n * a {@link WorkerBuildConfig} pre-deploy step. Uses the same injectable spawn\n * as {@link spawnWranglerSync} so unit tests capture it via the wrangler spawn\n * mock. Runs with `shell: true` so the `command` string is interpreted by the\n * shell (pipes, `&&`, env-prefixes all work).\n */\nexport function spawnBuildSync(\n command: string,\n options: SpawnWranglerSyncOptions,\n): ReturnType<typeof nodeSpawnSync> {\n return wranglerSpawnDeps.spawnSync(command, [], {\n cwd: options.cwd,\n stdio: options.stdio,\n env: options.env ? { ...process.env, ...options.env } : process.env,\n shell: true,\n });\n}\n"],"mappings":";;;;AAaA,MAAa,oBAAoB,EACpBA,WACZ;;;;;AAiBD,SAAgB,kBACd,MACA,SACkC;AAClC,QAAO,kBAAkB,UAAU,QAAQ,MAAM;EAC/C,KAAK,QAAQ;EACb,OAAO,QAAQ;EACf,KAAK,QAAQ,MAAM;GAAE,GAAG,QAAQ;GAAK,GAAG,QAAQ;GAAK,GAAG,QAAQ;EAChE,OAAO,QAAQ,SAAS;EACzB,CAAC;;;;;;;;;AAUJ,SAAgB,eACd,SACA,SACkC;AAClC,QAAO,kBAAkB,UAAU,SAAS,EAAE,EAAE;EAC9C,KAAK,QAAQ;EACb,OAAO,QAAQ;EACf,KAAK,QAAQ,MAAM;GAAE,GAAG,QAAQ;GAAK,GAAG,QAAQ;GAAK,GAAG,QAAQ;EAChE,OAAO;EACR,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dragonmastery/tamer",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.34.0",
|
|
4
4
|
"description": "Tamer: Cloudflare Workers infra CLI (sync, apply, deploy, migrate, destroy) and Wrangler-oriented TypeScript types.",
|
|
5
5
|
"author": "DragonMastery",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-BP65Wvm1.mjs","names":["out: WorkerEntry[]","deploySecrets: Awaited<\n ReturnType<typeof createDeploySecretsResources>\n > | null"],"sources":["../src/cli/commands/deploy.ts"],"sourcesContent":["import { loadConfig, getWorkers } from \"../../core/config/loader.js\";\nimport { cloudflareAccountIdFromEnv } from \"../../core/cloudflareEnv.js\";\nimport { namingFromConfig } from \"../../core/config/namingFromConfig.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport { wranglerConfigCliArgs } from \"../../core/wrangler/wranglerOutFile.js\";\nimport { spawnWranglerSync } from \"../../core/wrangler/wranglerSpawn.js\";\nimport { StateManager } from \"../../core/state/StateManager.js\";\nimport { stackNameForConfig } from \"../../core/state/stackName.js\";\nimport { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport {\n buildIntraStackScriptNameMap,\n mergedWorkerConfigForEnv,\n resolveDeployedWorkerName,\n resolveWorkerConfig,\n rewriteIntraStackServiceTargets,\n} from \"../../core/config/resolver.js\";\nimport { requiredSecretsForWorker } from \"../../core/secrets/declared.js\";\nimport { createDeploySecretsResources } from \"./secrets/context.js\";\nimport { pushSecretsForDeploy } from \"./secrets/push.js\";\nimport {\n generateWranglerConfig,\n writeWranglerJson,\n} from \"../../core/wrangler/generator.js\";\nimport { runSync } from \"./sync.js\";\nimport { workerRoutesApply } from \"../../features/worker-route/index.js\";\nimport { fetchStackImports } from \"../../core/imports/fetchStackImports.js\";\nimport { assertShardRegistryPresentForDeploy } from \"../../core/codegen/shardRegistry/index.js\";\nimport type { CfiConfig, WorkerConfig } from \"../../types.js\";\n\ntype WorkerEntry = [string, WorkerConfig];\n\n/**\n * Topologically sort workers by `services[].service` so that dependencies\n * deploy before dependents. Cloudflare rejects deploys that reference\n * service bindings to workers that don't yet exist on the account.\n * Cross-config dependencies (services not in this monorepo) are ignored.\n */\nexport function topoSortWorkersByServiceBindings(\n workers: WorkerEntry[],\n config: CfiConfig,\n naming: NamingEngine,\n env: string,\n): WorkerEntry[] {\n const intraMap = buildIntraStackScriptNameMap(config, env, naming);\n const scriptNameToKey = new Map<string, string>();\n for (const [key, cfg] of workers) {\n const name = resolveDeployedWorkerName(config, key, cfg, env, naming);\n scriptNameToKey.set(name, key);\n }\n\n const byKey = new Map(workers);\n const visited = new Set<string>();\n const visiting = new Set<string>();\n const out: WorkerEntry[] = [];\n\n function visit(key: string): void {\n if (visited.has(key)) return;\n if (visiting.has(key)) return;\n visiting.add(key);\n const cfg = byKey.get(key);\n if (cfg) {\n const merged = rewriteIntraStackServiceTargets(\n mergedWorkerConfigForEnv(cfg, env, config.tenant),\n intraMap,\n );\n const deps = merged.services?.map((s) => s.service) ?? [];\n for (const dep of deps) {\n const depKey = scriptNameToKey.get(dep);\n if (depKey && depKey !== key) visit(depKey);\n }\n visiting.delete(key);\n visited.add(key);\n out.push([key, cfg]);\n }\n }\n\n for (const [key] of workers) visit(key);\n return out;\n}\n\nexport async function runDeploy(options: {\n worker?: string;\n env?: string;\n configPath?: string;\n /** Passed to `wrangler deploy --dispatch-namespace` when the worker has no `dispatchNamespace` in config. */\n dispatchNamespace?: string;\n}): Promise<void> {\n const workerFilter = options.worker;\n // `--env` is intentionally required (no silent default to \"prod\") to\n // match every other Tamer command and to avoid the classic \"ran\n // `tamer deploy` from the wrong shell, shipped a half-tested branch\n // to production\" footgun.\n const env = options.env;\n if (!env) {\n throw new Error(\n \"deploy: --env is required (e.g. --env staging). \" +\n \"Tamer no longer defaults to prod — pass the env explicitly.\",\n );\n }\n const configPath = options.configPath;\n const baseDir = process.cwd();\n\n const config = await loadConfig(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 console.log(`Syncing state for env: ${env}...`);\n await runSync({ env, configPath });\n\n const naming = namingFromConfig(config);\n const api = new CFApiClient(accountId);\n const state = new StateManager(\n config.tenant.id,\n env,\n stackNameForConfig(config),\n );\n await state.hydrate(api);\n const imports = await fetchStackImports(api, config, env);\n state.beginOperation(\"deploy\", workerFilter ? `worker:${workerFilter}` : undefined);\n\n try {\n\n const workers = await getWorkers(config, baseDir);\n const toDeploy = workerFilter\n ? workers.filter(([k]) => k === workerFilter)\n : workers;\n\n if (toDeploy.length === 0) {\n throw new Error(\n workerFilter\n ? `Worker \"${workerFilter}\" not found`\n : \"No workers configured\",\n );\n }\n\n const ordered = topoSortWorkersByServiceBindings(\n toDeploy,\n config,\n naming,\n env,\n );\n\n await assertShardRegistryPresentForDeploy({\n config,\n env,\n baseDir,\n accountId,\n naming,\n state,\n imports,\n workers,\n });\n\n let deploySecrets: Awaited<\n ReturnType<typeof createDeploySecretsResources>\n > | null = null;\n\n for (const [workerKey, workerConfig] of ordered) {\n const mergedForSecrets = mergedWorkerConfigForEnv(\n workerConfig,\n env,\n config.tenant,\n );\n const requiredSecrets = requiredSecretsForWorker(mergedForSecrets);\n\n if (requiredSecrets.length > 0 && env !== \"local\") {\n if (!deploySecrets) {\n deploySecrets = await createDeploySecretsResources(api, env);\n }\n const deployedName = resolveDeployedWorkerName(\n config,\n workerKey,\n workerConfig,\n env,\n naming,\n );\n await pushSecretsForDeploy({\n workerKey,\n deployedName,\n required: requiredSecrets,\n vault: deploySecrets.vault,\n state,\n api,\n masterKey: deploySecrets.masterKey,\n });\n }\n\n const resolved = await resolveWorkerConfig(\n config,\n workerKey,\n workerConfig,\n env,\n baseDir,\n accountId,\n naming,\n state,\n { imports },\n );\n const wranglerConfig = generateWranglerConfig(resolved, state, naming);\n writeWranglerJson(resolved.workerDir, wranglerConfig, resolved.wranglerOutFile);\n\n const typesArgs = [\n \"wrangler\",\n ...wranglerConfigCliArgs(resolved.wranglerOutFile),\n \"types\",\n ];\n const typesResult = spawnWranglerSync(typesArgs, {\n cwd: resolved.workerDir,\n stdio: \"inherit\",\n });\n if (typesResult.status !== 0) {\n throw new Error(`wrangler types failed for ${workerKey}`);\n }\n\n const dispatchNs =\n resolved.dispatchNamespace ?? options.dispatchNamespace;\n const deployArgs = [\n \"wrangler\",\n ...wranglerConfigCliArgs(resolved.wranglerOutFile),\n \"deploy\",\n ];\n if (dispatchNs) {\n deployArgs.push(\"--dispatch-namespace\", dispatchNs);\n }\n\n const deployResult = spawnWranglerSync(deployArgs, {\n cwd: resolved.workerDir,\n stdio: \"inherit\",\n });\n if (deployResult.status !== 0) {\n throw new Error(`wrangler deploy failed for ${workerKey}`);\n }\n console.log(`Deployed ${workerKey}`);\n }\n\n if (env !== \"local\") {\n try {\n await workerRoutesApply(\n env,\n config,\n baseDir,\n accountId,\n naming,\n state,\n api,\n { imports },\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new Error(`worker routes apply failed after deploy: ${msg}`);\n }\n }\n\n state.finishOperation();\n await state.persist(api);\n console.log(`Deploy complete for env: ${env}`);\n } catch (err) {\n state.failOperation(err instanceof Error ? err.message : String(err));\n try {\n await state.persist(api);\n } catch {\n /* swallow secondary persist failure */\n }\n throw err;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { spawnSync } from "child_process";
|
|
2
|
-
|
|
3
|
-
//#region src/core/wrangler/wranglerSpawn.ts
|
|
4
|
-
/** Injectable spawn for unit tests (defaults to Node `spawnSync`). */
|
|
5
|
-
const wranglerSpawnDeps = { spawnSync };
|
|
6
|
-
/**
|
|
7
|
-
* Spawn Wrangler via `bunx wrangler …` so the project-local peer/devDependency
|
|
8
|
-
* resolves like npm/bun scripts (`node_modules/.bin`).
|
|
9
|
-
*/
|
|
10
|
-
function spawnWranglerSync(argv, options) {
|
|
11
|
-
return wranglerSpawnDeps.spawnSync("bunx", argv, {
|
|
12
|
-
cwd: options.cwd,
|
|
13
|
-
stdio: options.stdio,
|
|
14
|
-
env: options.env ? {
|
|
15
|
-
...process.env,
|
|
16
|
-
...options.env
|
|
17
|
-
} : process.env,
|
|
18
|
-
shell: options.shell ?? true
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
//#endregion
|
|
23
|
-
export { spawnWranglerSync as t };
|
|
24
|
-
//# sourceMappingURL=wranglerSpawn-B3TKjpt2.mjs.map
|