@dragonmastery/tamer 0.1.1 → 0.28.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/README.md +569 -18
- package/dist/CFApiClient-DhbyyV71.mjs +868 -0
- package/dist/CFApiClient-DhbyyV71.mjs.map +1 -0
- package/dist/StateManager-DTqtLLVX.mjs +760 -0
- package/dist/StateManager-DTqtLLVX.mjs.map +1 -0
- package/dist/apply-B0b_jjGv.mjs +423 -0
- package/dist/apply-B0b_jjGv.mjs.map +1 -0
- package/dist/applyTarget-BetDYdeS.mjs +152 -0
- package/dist/applyTarget-BetDYdeS.mjs.map +1 -0
- package/dist/bootstrap-CBzPilB1.mjs +33 -0
- package/dist/bootstrap-CBzPilB1.mjs.map +1 -0
- package/dist/buildDispatchUploadForm-BoUB93b3.mjs +38 -0
- package/dist/buildDispatchUploadForm-BoUB93b3.mjs.map +1 -0
- package/dist/cloudflareSnapshot-B4FOaNr0.mjs +163 -0
- package/dist/cloudflareSnapshot-B4FOaNr0.mjs.map +1 -0
- package/dist/deploy-gHEQxhmx.mjs +119 -0
- package/dist/deploy-gHEQxhmx.mjs.map +1 -0
- package/dist/destroy-B21f3wgq.mjs +215 -0
- package/dist/destroy-B21f3wgq.mjs.map +1 -0
- package/dist/destroy-tenant-BW2nasnK.mjs +103 -0
- package/dist/destroy-tenant-BW2nasnK.mjs.map +1 -0
- package/dist/dev-Dt26nzMJ.mjs +103 -0
- package/dist/dev-Dt26nzMJ.mjs.map +1 -0
- package/dist/dns-records.resolve-C2T0m4NG.mjs +3 -0
- package/dist/dns-records.resolve-DwBR_1WI.mjs +47 -0
- package/dist/dns-records.resolve-DwBR_1WI.mjs.map +1 -0
- package/dist/dns-records.sync-Bpzz9H0s.mjs +75 -0
- package/dist/dns-records.sync-Bpzz9H0s.mjs.map +1 -0
- package/dist/doctor-C_hs7k2D.mjs +34 -0
- package/dist/doctor-C_hs7k2D.mjs.map +1 -0
- package/dist/drift-D5qzCTft.mjs +10 -0
- package/dist/drift-D8ZrSgTn.mjs +323 -0
- package/dist/drift-D8ZrSgTn.mjs.map +1 -0
- package/dist/events-BSwGdkGj.mjs +68 -0
- package/dist/events-BSwGdkGj.mjs.map +1 -0
- package/dist/fetchStackImports-B4ZJahOt.mjs +3817 -0
- package/dist/fetchStackImports-B4ZJahOt.mjs.map +1 -0
- package/dist/generator-CIMbcPzv.mjs +77 -0
- package/dist/generator-CIMbcPzv.mjs.map +1 -0
- package/dist/import-BrduwA9Z.mjs +164 -0
- package/dist/import-BrduwA9Z.mjs.map +1 -0
- package/dist/index.d.mts +6592 -56
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +18 -1
- package/dist/index.mjs.map +1 -0
- package/dist/loader-DP7yXqT6.mjs +518 -0
- package/dist/loader-DP7yXqT6.mjs.map +1 -0
- package/dist/logpush-job-xS7270FZ.mjs +1106 -0
- package/dist/logpush-job-xS7270FZ.mjs.map +1 -0
- package/dist/migrate-CahG6BYV.mjs +87 -0
- package/dist/migrate-CahG6BYV.mjs.map +1 -0
- package/dist/normalize-Bx0bpFop.mjs +236 -0
- package/dist/normalize-Bx0bpFop.mjs.map +1 -0
- package/dist/plan-DWvsvy1U.mjs +453 -0
- package/dist/plan-DWvsvy1U.mjs.map +1 -0
- package/dist/planFormat-CJw8Kq2s.mjs +119 -0
- package/dist/planFormat-CJw8Kq2s.mjs.map +1 -0
- package/dist/provision-tenant-WTKo93Y0.mjs +192 -0
- package/dist/provision-tenant-WTKo93Y0.mjs.map +1 -0
- package/dist/r2S3EmptyBucket-DD81ZWQ7.mjs +92 -0
- package/dist/r2S3EmptyBucket-DD81ZWQ7.mjs.map +1 -0
- package/dist/stackOutputs-W9mnnJuj.mjs +69 -0
- package/dist/stackOutputs-W9mnnJuj.mjs.map +1 -0
- package/dist/status-DLwREPjb.mjs +198 -0
- package/dist/status-DLwREPjb.mjs.map +1 -0
- package/dist/sync-f2K2blwm.mjs +90 -0
- package/dist/sync-f2K2blwm.mjs.map +1 -0
- package/dist/tamer.d.mts +1 -0
- package/dist/tamer.mjs +4553 -0
- package/dist/tamer.mjs.map +1 -0
- package/dist/tamerArtifactsR2-Ccgplu2Q.mjs +52 -0
- package/dist/tamerArtifactsR2-Ccgplu2Q.mjs.map +1 -0
- package/dist/types-CqxqYnrT.mjs +44 -0
- package/dist/types-CqxqYnrT.mjs.map +1 -0
- package/dist/verifyPlanFile-c16z1AMH.mjs +33 -0
- package/dist/verifyPlanFile-c16z1AMH.mjs.map +1 -0
- package/dist/wfp-delete-DysvX1u7.mjs +36 -0
- package/dist/wfp-delete-DysvX1u7.mjs.map +1 -0
- package/dist/wfp-put-jaVd_LjO.mjs +52 -0
- package/dist/wfp-put-jaVd_LjO.mjs.map +1 -0
- package/dist/worker-route-Be2IvOdr.mjs +263 -0
- package/dist/worker-route-Be2IvOdr.mjs.map +1 -0
- package/dist/workers-aGILs77X.mjs +87 -0
- package/dist/workers-aGILs77X.mjs.map +1 -0
- package/dist/wranglerSpawn-DmEz0ldT.mjs +24 -0
- package/dist/wranglerSpawn-DmEz0ldT.mjs.map +1 -0
- package/dist/zoneResolver-VoxLHM4N.mjs +32 -0
- package/dist/zoneResolver-VoxLHM4N.mjs.map +1 -0
- package/package.json +42 -4
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { t as getWorkers } from "./loader-DP7yXqT6.mjs";
|
|
2
|
+
import { _ as namingFromConfig, p as resolveWorkerConfig } from "./fetchStackImports-B4ZJahOt.mjs";
|
|
3
|
+
import { t as spawnWranglerSync } from "./wranglerSpawn-DmEz0ldT.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/features/workers/workers.destroy.ts
|
|
6
|
+
/**
|
|
7
|
+
* Remove deployed Workers: dispatch-namespace scripts via CF API, then global scripts via `wrangler delete`.
|
|
8
|
+
* Call before deleting D1/R2/KV/dispatch namespaces so bindings and namespace script counts are cleared.
|
|
9
|
+
*/
|
|
10
|
+
async function workersDestroy(env, baseDir, accountId, config, state, api, _force) {
|
|
11
|
+
const naming = namingFromConfig(config);
|
|
12
|
+
const workers = await getWorkers(config, baseDir);
|
|
13
|
+
const resolved = [];
|
|
14
|
+
for (const [workerKey, workerConfig] of workers) resolved.push(await resolveWorkerConfig(config, workerKey, workerConfig, env, baseDir, accountId, naming, state, { referencesMode: "tolerant" }));
|
|
15
|
+
const inNamespace = resolved.filter((r) => r.dispatchNamespace);
|
|
16
|
+
const globalWorkers = resolved.filter((r) => !r.dispatchNamespace);
|
|
17
|
+
for (const r of inNamespace) {
|
|
18
|
+
const ns = r.dispatchNamespace;
|
|
19
|
+
try {
|
|
20
|
+
await api.dispatchNamespaceScriptDelete(ns, r.workerName, { force: true });
|
|
21
|
+
console.log(`Deleted Worker "${r.workerName}" from dispatch namespace "${ns}"`);
|
|
22
|
+
} catch (err) {
|
|
23
|
+
console.warn(`Failed to delete dispatch Worker "${r.workerName}" in "${ns}":`, err instanceof Error ? err.message : err);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
for (const r of globalWorkers) if (spawnWranglerSync([
|
|
27
|
+
"wrangler",
|
|
28
|
+
"delete",
|
|
29
|
+
r.workerName,
|
|
30
|
+
"--force"
|
|
31
|
+
], {
|
|
32
|
+
cwd: baseDir,
|
|
33
|
+
stdio: "inherit",
|
|
34
|
+
shell: false
|
|
35
|
+
}).status !== 0) console.warn(`wrangler delete failed for "${r.workerName}" (cwd: ${baseDir}); script may not exist.`);
|
|
36
|
+
else console.log(`Deleted Worker "${r.workerName}"`);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
//#endregion
|
|
40
|
+
//#region src/features/workers/workers.drift.ts
|
|
41
|
+
/**
|
|
42
|
+
* Drift for declared **global** Worker scripts (not dispatch-namespace
|
|
43
|
+
* tenant scripts — those are owned by `provision-tenant` / WFP).
|
|
44
|
+
*
|
|
45
|
+
* Tamer does not store deployed worker script ids in state today, so this
|
|
46
|
+
* report only emits `undeployed` (declared but missing on Cloudflare). It
|
|
47
|
+
* never claims `unrecordedInState` for scripts because the state model has
|
|
48
|
+
* no `worker_script` entry to be missing.
|
|
49
|
+
*
|
|
50
|
+
* Returns `null` for `local` env or when there are no global workers (so
|
|
51
|
+
* `computeDriftReport` can skip emitting the section entirely).
|
|
52
|
+
*/
|
|
53
|
+
async function workersDrift(env, config, baseDir, accountId, naming, state, api, opts = {}) {
|
|
54
|
+
if (env === "local") return null;
|
|
55
|
+
const workers = await getWorkers(config, baseDir);
|
|
56
|
+
if (workers.length === 0) return null;
|
|
57
|
+
const drift = {
|
|
58
|
+
kind: "worker_script",
|
|
59
|
+
missingFromCloudflare: [],
|
|
60
|
+
unrecordedInState: [],
|
|
61
|
+
undeployed: []
|
|
62
|
+
};
|
|
63
|
+
let sawGlobalWorker = false;
|
|
64
|
+
for (const [workerKey, wc] of workers) {
|
|
65
|
+
const resolved = await resolveWorkerConfig(config, workerKey, wc, env, baseDir, accountId, naming, state, {
|
|
66
|
+
referencesMode: "tolerant",
|
|
67
|
+
imports: opts.imports
|
|
68
|
+
});
|
|
69
|
+
if (resolved.dispatchNamespace) continue;
|
|
70
|
+
sawGlobalWorker = true;
|
|
71
|
+
let exists;
|
|
72
|
+
try {
|
|
73
|
+
exists = !!await api.workersScriptGet(resolved.workerName);
|
|
74
|
+
} catch {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (!exists) drift.undeployed.push({
|
|
78
|
+
logicalName: workerKey,
|
|
79
|
+
derivedName: resolved.workerName
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
return sawGlobalWorker ? drift : null;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
//#endregion
|
|
86
|
+
export { workersDestroy as n, workersDrift as t };
|
|
87
|
+
//# sourceMappingURL=workers-aGILs77X.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workers-aGILs77X.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,24 @@
|
|
|
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-DmEz0ldT.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wranglerSpawn-DmEz0ldT.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"],"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
//#region src/features/worker-route/worker-route.stateKey.ts
|
|
2
|
+
/** Primary key in `CfiState.resources` for a Cloudflare Workers zone route. */
|
|
3
|
+
function workerRouteStateKey(zoneId, routeId) {
|
|
4
|
+
return `wr_route:${zoneId}:${routeId}`;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
//#endregion
|
|
8
|
+
//#region src/core/routes/zoneResolver.ts
|
|
9
|
+
/**
|
|
10
|
+
* Per-process cache of `zone_name` → `zone_id`. Zone IDs are stable for the
|
|
11
|
+
* life of a Cloudflare account, so caching across a single Tamer invocation is
|
|
12
|
+
* safe and avoids hammering `/zones` once per worker × env.
|
|
13
|
+
*/
|
|
14
|
+
const cache = /* @__PURE__ */ new Map();
|
|
15
|
+
/**
|
|
16
|
+
* Look up a Cloudflare zone ID by exact name. Returns `undefined` if no zone
|
|
17
|
+
* matches under the configured account.
|
|
18
|
+
*
|
|
19
|
+
* Used by API-driven route operations (sync / destroy) when wrangler's
|
|
20
|
+
* `zone_name` route shape needs to be reconciled to a `zone_id`.
|
|
21
|
+
*/
|
|
22
|
+
async function findZoneIdByName(api, zoneName) {
|
|
23
|
+
const cached = cache.get(zoneName);
|
|
24
|
+
if (cached !== void 0) return cached ?? void 0;
|
|
25
|
+
const id = (await api.zonesListByName(zoneName))[0]?.id;
|
|
26
|
+
cache.set(zoneName, id ?? null);
|
|
27
|
+
return id;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
//#endregion
|
|
31
|
+
export { workerRouteStateKey as n, findZoneIdByName as t };
|
|
32
|
+
//# sourceMappingURL=zoneResolver-VoxLHM4N.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zoneResolver-VoxLHM4N.mjs","names":[],"sources":["../src/features/worker-route/worker-route.stateKey.ts","../src/core/routes/zoneResolver.ts"],"sourcesContent":["/** Primary key in `CfiState.resources` for a Cloudflare Workers zone route. */\nexport function workerRouteStateKey(zoneId: string, routeId: string): string {\n return `wr_route:${zoneId}:${routeId}`;\n}\n","import type { CFApiClient } from \"../api/CFApiClient.js\";\n\n/**\n * Per-process cache of `zone_name` → `zone_id`. Zone IDs are stable for the\n * life of a Cloudflare account, so caching across a single Tamer invocation is\n * safe and avoids hammering `/zones` once per worker × env.\n */\nconst cache = new Map<string, string | null>();\n\n/**\n * Look up a Cloudflare zone ID by exact name. Returns `undefined` if no zone\n * matches under the configured account.\n *\n * Used by API-driven route operations (sync / destroy) when wrangler's\n * `zone_name` route shape needs to be reconciled to a `zone_id`.\n */\nexport async function findZoneIdByName(\n api: CFApiClient,\n zoneName: string,\n): Promise<string | undefined> {\n const cached = cache.get(zoneName);\n if (cached !== undefined) return cached ?? undefined;\n const matches = await api.zonesListByName(zoneName);\n const id = matches[0]?.id;\n cache.set(zoneName, id ?? null);\n return id;\n}\n\n/** Test-only: reset the per-process zone cache. */\nexport function resetZoneCache(): void {\n cache.clear();\n}\n"],"mappings":";;AACA,SAAgB,oBAAoB,QAAgB,SAAyB;AAC3E,QAAO,YAAY,OAAO,GAAG;;;;;;;;;;ACK/B,MAAM,wBAAQ,IAAI,KAA4B;;;;;;;;AAS9C,eAAsB,iBACpB,KACA,UAC6B;CAC7B,MAAM,SAAS,MAAM,IAAI,SAAS;AAClC,KAAI,WAAW,OAAW,QAAO,UAAU;CAE3C,MAAM,MADU,MAAM,IAAI,gBAAgB,SAAS,EAChC,IAAI;AACvB,OAAM,IAAI,UAAU,MAAM,KAAK;AAC/B,QAAO"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dragonmastery/tamer",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Tamer
|
|
3
|
+
"version": "0.28.0",
|
|
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",
|
|
7
7
|
"type": "module",
|
|
@@ -15,6 +15,9 @@
|
|
|
15
15
|
"default": "./dist/index.mjs"
|
|
16
16
|
}
|
|
17
17
|
},
|
|
18
|
+
"bin": {
|
|
19
|
+
"tamer": "./dist/tamer.mjs"
|
|
20
|
+
},
|
|
18
21
|
"files": [
|
|
19
22
|
"dist",
|
|
20
23
|
"README.md"
|
|
@@ -30,15 +33,47 @@
|
|
|
30
33
|
"types"
|
|
31
34
|
],
|
|
32
35
|
"scripts": {
|
|
33
|
-
"
|
|
36
|
+
"generate:wrangler-types": "bun run scripts/generate-wrangler-types.ts",
|
|
37
|
+
"npm:build": "bun run generate:wrangler-types && tsdown",
|
|
34
38
|
"build": "bun run npm:build",
|
|
35
39
|
"dev": "tsc --watch",
|
|
36
40
|
"test": "bun test tests/",
|
|
41
|
+
"test:report": "bun -e \"import { mkdirSync } from 'node:fs'; mkdirSync('reports',{recursive:true});\" && bun test tests/ --only-failures --reporter=junit --reporter-outfile=reports/junit.xml",
|
|
42
|
+
"test:coverage": "bun test tests/ --coverage --coverage-reporter=text --coverage-reporter=lcov",
|
|
37
43
|
"typecheck": "tsc -p tsconfig.typecheck.json --noEmit",
|
|
38
|
-
"prepublishOnly": "bun run npm:build"
|
|
44
|
+
"prepublishOnly": "bun run npm:build",
|
|
45
|
+
"tamer": "bun src/cli/index.ts",
|
|
46
|
+
"tamer:bootstrap:platform": "bun --cwd fixtures/platform ../../src/cli/index.ts bootstrap",
|
|
47
|
+
"tamer:platform:sync": "bun --cwd fixtures/platform ../../src/cli/index.ts sync",
|
|
48
|
+
"tamer:platform:apply": "bun --cwd fixtures/platform ../../src/cli/index.ts apply",
|
|
49
|
+
"tamer:platform:migrate": "bun --cwd fixtures/platform ../../src/cli/index.ts migrate",
|
|
50
|
+
"tamer:platform:deploy": "bun --cwd fixtures/platform ../../src/cli/index.ts deploy",
|
|
51
|
+
"tamer:platform:status": "bun --cwd fixtures/platform ../../src/cli/index.ts status",
|
|
52
|
+
"tamer:platform:drift": "bun --cwd fixtures/platform ../../src/cli/index.ts drift",
|
|
53
|
+
"tamer:platform:destroy": "bun --cwd fixtures/platform ../../src/cli/index.ts destroy",
|
|
54
|
+
"tamer:bootstrap:portal": "bun --cwd fixtures/portal ../../src/cli/index.ts bootstrap",
|
|
55
|
+
"tamer:portal:sync": "bun --cwd fixtures/portal ../../src/cli/index.ts sync",
|
|
56
|
+
"tamer:portal:apply": "bun --cwd fixtures/portal ../../src/cli/index.ts apply",
|
|
57
|
+
"tamer:portal:migrate": "bun --cwd fixtures/portal ../../src/cli/index.ts migrate",
|
|
58
|
+
"tamer:portal:deploy": "bun --cwd fixtures/portal ../../src/cli/index.ts deploy",
|
|
59
|
+
"tamer:portal:status": "bun --cwd fixtures/portal ../../src/cli/index.ts status",
|
|
60
|
+
"tamer:portal:drift": "bun --cwd fixtures/portal ../../src/cli/index.ts drift",
|
|
61
|
+
"tamer:portal:destroy": "bun --cwd fixtures/portal ../../src/cli/index.ts destroy",
|
|
62
|
+
"tamer:internal:sync": "bun --cwd fixtures/internal ../../src/cli/index.ts sync",
|
|
63
|
+
"tamer:internal:apply": "bun --cwd fixtures/internal ../../src/cli/index.ts apply",
|
|
64
|
+
"tamer:internal:migrate": "bun --cwd fixtures/internal ../../src/cli/index.ts migrate",
|
|
65
|
+
"tamer:internal:deploy": "bun --cwd fixtures/internal ../../src/cli/index.ts deploy",
|
|
66
|
+
"tamer:internal:status": "bun --cwd fixtures/internal ../../src/cli/index.ts status",
|
|
67
|
+
"tamer:internal:drift": "bun --cwd fixtures/internal ../../src/cli/index.ts drift",
|
|
68
|
+
"tamer:internal:destroy": "bun --cwd fixtures/internal ../../src/cli/index.ts destroy",
|
|
69
|
+
"tamer:seed": "bun scripts/tamer-seed.ts",
|
|
70
|
+
"tamer:up": "bun scripts/tamer-up.ts",
|
|
71
|
+
"tamer:down": "bun scripts/tamer-down.ts"
|
|
39
72
|
},
|
|
40
73
|
"devDependencies": {
|
|
74
|
+
"@apidevtools/json-schema-ref-parser": "15.3.1",
|
|
41
75
|
"@types/bun": "1.3.10",
|
|
76
|
+
"json-schema-to-typescript": "15.0.4",
|
|
42
77
|
"tsdown": "0.18.1",
|
|
43
78
|
"typescript": "5.9.3",
|
|
44
79
|
"wrangler": "4.72.0",
|
|
@@ -53,5 +88,8 @@
|
|
|
53
88
|
},
|
|
54
89
|
"engines": {
|
|
55
90
|
"node": ">=22"
|
|
91
|
+
},
|
|
92
|
+
"dependencies": {
|
|
93
|
+
"@aws-sdk/client-s3": "^3.1037.0"
|
|
56
94
|
}
|
|
57
95
|
}
|