@dragonmastery/tamer 0.36.7 → 0.37.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-DNrNhXc-.mjs → apply-ByHaKpxD.mjs} +11 -11
- package/dist/{apply-DNrNhXc-.mjs.map → apply-ByHaKpxD.mjs.map} +1 -1
- package/dist/{applyTarget-91EYUetp.mjs → applyTarget-BkBg8MFW.mjs} +2 -2
- package/dist/{applyTarget-91EYUetp.mjs.map → applyTarget-BkBg8MFW.mjs.map} +1 -1
- package/dist/{bootstrap-BYxkCI8L.mjs → bootstrap-DvOce6vA.mjs} +3 -3
- package/dist/{bootstrap-BYxkCI8L.mjs.map → bootstrap-DvOce6vA.mjs.map} +1 -1
- package/dist/{buildDispatchUploadForm-BNDcS5_9.mjs → buildDispatchUploadForm-D9ZrefZX.mjs} +1 -1
- package/dist/{buildDispatchUploadForm-BNDcS5_9.mjs.map → buildDispatchUploadForm-D9ZrefZX.mjs.map} +1 -1
- package/dist/{cloudflareSnapshot-B6WFaaih.mjs → cloudflareSnapshot-CjXNMr4X.mjs} +4 -4
- package/dist/{cloudflareSnapshot-B6WFaaih.mjs.map → cloudflareSnapshot-CjXNMr4X.mjs.map} +1 -1
- package/dist/{deploy-UM9jazjs.mjs → deploy-C4NOE5S1.mjs} +8 -8
- package/dist/{deploy-UM9jazjs.mjs.map → deploy-C4NOE5S1.mjs.map} +1 -1
- package/dist/{destroy-BsvERMdR.mjs → destroy-BeOYY2U6.mjs} +75 -22
- package/dist/destroy-BeOYY2U6.mjs.map +1 -0
- package/dist/{destroy-tenant-CT_uzdl7.mjs → destroy-tenant-B9ZTeUDk.mjs} +2 -2
- package/dist/{destroy-tenant-CT_uzdl7.mjs.map → destroy-tenant-B9ZTeUDk.mjs.map} +1 -1
- package/dist/{dev-DoB7r93_.mjs → dev-0zkF2iqF.mjs} +6 -6
- package/dist/{dev-DoB7r93_.mjs.map → dev-0zkF2iqF.mjs.map} +1 -1
- package/dist/{dns-records.sync-PoahWQjY.mjs → dns-records.sync-FyzKl-Ph.mjs} +2 -2
- package/dist/{dns-records.sync-PoahWQjY.mjs.map → dns-records.sync-FyzKl-Ph.mjs.map} +1 -1
- package/dist/{doctor-BnsOxqnA.mjs → doctor-fm_vGe2C.mjs} +2 -2
- package/dist/{doctor-BnsOxqnA.mjs.map → doctor-fm_vGe2C.mjs.map} +1 -1
- package/dist/{drift-Bl51ml0_.mjs → drift-Ci368_WQ.mjs} +5 -5
- package/dist/{drift-Bl51ml0_.mjs.map → drift-Ci368_WQ.mjs.map} +1 -1
- package/dist/{drift-BFBQj1jH.mjs → drift-CryXFwSh.mjs} +4 -4
- package/dist/{emit-X6pAAeqe.mjs → emit-DDTQVfi_.mjs} +3 -3
- package/dist/{emit-X6pAAeqe.mjs.map → emit-DDTQVfi_.mjs.map} +1 -1
- package/dist/env-gc-DlQxkZPj.mjs +122 -0
- package/dist/env-gc-DlQxkZPj.mjs.map +1 -0
- package/dist/env-list-DhbYisDn.mjs +32 -0
- package/dist/env-list-DhbYisDn.mjs.map +1 -0
- package/dist/{events-B0bvWdiQ.mjs → events-C7wAGJae.mjs} +2 -2
- package/dist/{events-B0bvWdiQ.mjs.map → events-C7wAGJae.mjs.map} +1 -1
- package/dist/{generator-Bu8sQJie.mjs → generator-MX8MAHd9.mjs} +2 -2
- package/dist/{generator-Bu8sQJie.mjs.map → generator-MX8MAHd9.mjs.map} +1 -1
- package/dist/{import-DIkhDk5y.mjs → import-Bzow4TPf.mjs} +3 -3
- package/dist/{import-DIkhDk5y.mjs.map → import-Bzow4TPf.mjs.map} +1 -1
- package/dist/{migrate-B_HSxaRD.mjs → migrate-YfRtATkG.mjs} +5 -5
- package/dist/{migrate-B_HSxaRD.mjs.map → migrate-YfRtATkG.mjs.map} +1 -1
- package/dist/{plan-wJDEX_LX.mjs → plan-C0XRZK_J.mjs} +8 -8
- package/dist/{plan-wJDEX_LX.mjs.map → plan-C0XRZK_J.mjs.map} +1 -1
- package/dist/{provision-tenant-Dh3-p5ZK.mjs → provision-tenant-B4VgWlbl.mjs} +4 -4
- package/dist/{provision-tenant-Dh3-p5ZK.mjs.map → provision-tenant-B4VgWlbl.mjs.map} +1 -1
- package/dist/{registry-BF1E6sk5.mjs → registry-BrOxbA2i.mjs} +36 -6
- package/dist/registry-BrOxbA2i.mjs.map +1 -0
- package/dist/{stackOutputs-CuLa76D4.mjs → stackOutputs-CkpNSng8.mjs} +2 -2
- package/dist/{stackOutputs-CuLa76D4.mjs.map → stackOutputs-CkpNSng8.mjs.map} +1 -1
- package/dist/{status-Xd2gJtII.mjs → status-Ck6Xo8aV.mjs} +4 -4
- package/dist/{status-Xd2gJtII.mjs.map → status-Ck6Xo8aV.mjs.map} +1 -1
- package/dist/sync-Bky8pptf.mjs +7 -0
- package/dist/{sync-B4wfsPIQ.mjs → sync-kl7MaCQV.mjs} +6 -7
- package/dist/{sync-B4wfsPIQ.mjs.map → sync-kl7MaCQV.mjs.map} +1 -1
- package/dist/tamer.mjs +101 -19
- package/dist/tamer.mjs.map +1 -1
- package/dist/{tamerArtifactsR2-7qUbhOLD.mjs → tamerArtifactsR2-COndFmk5.mjs} +1 -1
- package/dist/{tamerArtifactsR2-7qUbhOLD.mjs.map → tamerArtifactsR2-COndFmk5.mjs.map} +1 -1
- package/dist/{types-m1Wz_vz_.mjs → types-BZkoBzpD.mjs} +5 -5
- package/dist/{types-m1Wz_vz_.mjs.map → types-BZkoBzpD.mjs.map} +1 -1
- package/dist/{verifyPlanFile-BYZts3kA.mjs → verifyPlanFile-D_-Qbh1J.mjs} +2 -2
- package/dist/{verifyPlanFile-BYZts3kA.mjs.map → verifyPlanFile-D_-Qbh1J.mjs.map} +1 -1
- package/dist/{wfp-delete-DJXpe2B7.mjs → wfp-delete-BmibnUuz.mjs} +2 -2
- package/dist/{wfp-delete-DJXpe2B7.mjs.map → wfp-delete-BmibnUuz.mjs.map} +1 -1
- package/dist/{wfp-put-BMSAGpZ6.mjs → wfp-put-B7MW5m64.mjs} +3 -3
- package/dist/{wfp-put-BMSAGpZ6.mjs.map → wfp-put-B7MW5m64.mjs.map} +1 -1
- package/dist/{worker-route-C7kgtUXH.mjs → worker-route-CUQBu9xe.mjs} +2 -2
- package/dist/{worker-route-C7kgtUXH.mjs.map → worker-route-CUQBu9xe.mjs.map} +1 -1
- package/dist/{workers-Bq1AY8aB.mjs → workers-DWXnZAzG.mjs} +3 -3
- package/dist/{workers-Bq1AY8aB.mjs.map → workers-DWXnZAzG.mjs.map} +1 -1
- package/dist/{wranglerSpawn-CqVNGkA9.mjs → wranglerSpawn-Dx4I0Wu-.mjs} +1 -1
- package/dist/{wranglerSpawn-CqVNGkA9.mjs.map → wranglerSpawn-Dx4I0Wu-.mjs.map} +1 -1
- package/package.json +1 -1
- package/dist/destroy-BsvERMdR.mjs.map +0 -1
- package/dist/registry-BF1E6sk5.mjs.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { n as materializeTamerResolvable } from "./normalize-DVSTRZhO.mjs";
|
|
2
|
-
import {
|
|
2
|
+
import { j as resolveReferencesInString } from "./tamer.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/core/outputs/stackOutputs.ts
|
|
5
5
|
/**
|
|
@@ -66,4 +66,4 @@ function buildOutputsView(config, state) {
|
|
|
66
66
|
|
|
67
67
|
//#endregion
|
|
68
68
|
export { resolveStackOutputs as n, buildOutputsView as t };
|
|
69
|
-
//# sourceMappingURL=stackOutputs-
|
|
69
|
+
//# sourceMappingURL=stackOutputs-CkpNSng8.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stackOutputs-
|
|
1
|
+
{"version":3,"file":"stackOutputs-CkpNSng8.mjs","names":["out: Record<string, CfiStackOutputValue>","rows: StackOutputRow[]","status: StackOutputRow[\"status\"]"],"sources":["../src/core/outputs/stackOutputs.ts"],"sourcesContent":["/**\n * Tamer's CloudFormation `Outputs` analogue.\n *\n * `tamer.config.ts > outputs` declares named exports as Tamer reference\n * strings (e.g. `\"${tamer:d1:users.id}\"`). After a successful `apply` the\n * engine resolves every entry against the just-completed state and persists\n * the literal under {@link CfiState.stackOutputs}. Sibling stacks consume\n * them via `${tamer:import:<stackName>.<outputName>}` (added separately).\n *\n * Resolution is **strict**: any unresolved/unknown reference fails the\n * apply (and rolls back when `--rollback-on-failure` is set). Read-only\n * commands like `status` use {@link buildOutputsView} which is tolerant\n * and shows the placeholder verbatim alongside the persisted value.\n */\nimport type {\n CfiConfig,\n CfiStackOutputValue,\n} from \"../../types.js\";\nimport { materializeTamerResolvable } from \"../../dx/normalize.js\";\nimport type { NamingEngine } from \"../naming/NamingEngine.js\";\nimport type { StateManager } from \"../state/StateManager.js\";\nimport {\n resolveReferencesInString,\n TamerReferenceError,\n} from \"../references/references.js\";\n\n/**\n * Resolve every `outputs:` entry against the current state. Throws\n * {@link TamerReferenceError} on the first unresolved reference so a failed\n * apply can roll back instead of silently persisting half-resolved values.\n *\n * Pass an explicit `now` only from tests — production code should let it\n * default to wall-clock so `resolvedAt` reflects the real persist time.\n */\nexport function resolveStackOutputs(\n config: CfiConfig,\n ctx: {\n env: string;\n state: StateManager;\n naming: NamingEngine;\n /**\n * Outputs from sibling stacks pre-fetched by `fetchStackImports`.\n * An output may chain through an import (e.g.\n * `outputs: { region: \"${tamer:import:net.region}\" }`) — strict\n * resolution requires the sibling row to be hydrated already.\n */\n imports?: Record<string, Record<string, string>>;\n /** Same as wrangler / apply `accountId` (for `${tamer:config:stack.account_id}` in outputs). */\n accountId?: string;\n },\n now: () => string = () => new Date().toISOString(),\n): Record<string, CfiStackOutputValue> {\n const outputs = config.outputs;\n if (!outputs || Object.keys(outputs).length === 0) return {};\n const refCtx = {\n config,\n env: ctx.env,\n state: ctx.state,\n naming: ctx.naming,\n tolerant: false,\n imports: ctx.imports,\n accountId: ctx.accountId,\n };\n const resolvedAt = now();\n const out: Record<string, CfiStackOutputValue> = {};\n for (const [name, source] of Object.entries(outputs)) {\n const sourceStr = materializeTamerResolvable(source);\n const value = resolveReferencesInString(\n sourceStr,\n refCtx,\n `outputs.${name}`,\n );\n out[name] = { value, source: sourceStr, resolvedAt };\n }\n return out;\n}\n\n/**\n * One row in the `tamer status` outputs panel. Combines the *declared*\n * source (from `tamer.config.ts`) with the *persisted* value (from state)\n * so operators can see drift between \"what the config says\" and \"what we\n * last resolved\". `value` is `null` when the output is declared but has\n * never been resolved (no `apply` yet), or when a stale persisted entry\n * exists for an output that has since been removed from config.\n */\nexport interface StackOutputRow {\n name: string;\n /** Live source from `tamer.config.ts > outputs[name]`, if still declared. */\n declaredSource: string | undefined;\n /** Persisted resolved literal, if `apply` has run for this output. */\n value: string | null;\n /** Source string at last persist (drifts vs. `declaredSource` after edits). */\n persistedSource: string | undefined;\n /** ISO timestamp of last persist (undefined when never resolved). */\n resolvedAt: string | undefined;\n /**\n * `\"resolved\"` when persisted matches declared source, `\"stale\"` when\n * source has drifted since persist (re-run apply), `\"orphan\"` when\n * persisted but no longer declared, `\"pending\"` when declared but never\n * resolved.\n */\n status: \"resolved\" | \"stale\" | \"orphan\" | \"pending\";\n}\n\n/**\n * Tolerant union of declared + persisted outputs for `tamer status` and the\n * machine-readable `--json` envelope. Never throws.\n */\nexport function buildOutputsView(\n config: CfiConfig,\n state: StateManager,\n): StackOutputRow[] {\n const declared = config.outputs ?? {};\n const persisted = state.getStackOutputs();\n const names = new Set<string>([\n ...Object.keys(declared),\n ...Object.keys(persisted),\n ]);\n const rows: StackOutputRow[] = [];\n for (const name of [...names].sort()) {\n const rawDeclared = declared[name];\n const declaredSource =\n rawDeclared !== undefined ? materializeTamerResolvable(rawDeclared) : undefined;\n const p = persisted[name];\n let status: StackOutputRow[\"status\"];\n if (declaredSource && !p) status = \"pending\";\n else if (!declaredSource && p) status = \"orphan\";\n else if (declaredSource && p && declaredSource !== p.source) status = \"stale\";\n else status = \"resolved\";\n rows.push({\n name,\n declaredSource,\n value: p?.value ?? null,\n persistedSource: p?.source,\n resolvedAt: p?.resolvedAt,\n status,\n });\n }\n return rows;\n}\n\nexport { TamerReferenceError };\n"],"mappings":";;;;;;;;;;;;AAkCA,SAAgB,oBACd,QACA,KAcA,6BAA0B,IAAI,MAAM,EAAC,aAAa,EACb;CACrC,MAAM,UAAU,OAAO;AACvB,KAAI,CAAC,WAAW,OAAO,KAAK,QAAQ,CAAC,WAAW,EAAG,QAAO,EAAE;CAC5D,MAAM,SAAS;EACb;EACA,KAAK,IAAI;EACT,OAAO,IAAI;EACX,QAAQ,IAAI;EACZ,UAAU;EACV,SAAS,IAAI;EACb,WAAW,IAAI;EAChB;CACD,MAAM,aAAa,KAAK;CACxB,MAAMA,MAA2C,EAAE;AACnD,MAAK,MAAM,CAAC,MAAM,WAAW,OAAO,QAAQ,QAAQ,EAAE;EACpD,MAAM,YAAY,2BAA2B,OAAO;AAMpD,MAAI,QAAQ;GAAE,OALA,0BACZ,WACA,QACA,WAAW,OACZ;GACoB,QAAQ;GAAW;GAAY;;AAEtD,QAAO;;;;;;AAkCT,SAAgB,iBACd,QACA,OACkB;CAClB,MAAM,WAAW,OAAO,WAAW,EAAE;CACrC,MAAM,YAAY,MAAM,iBAAiB;CACzC,MAAM,QAAQ,IAAI,IAAY,CAC5B,GAAG,OAAO,KAAK,SAAS,EACxB,GAAG,OAAO,KAAK,UAAU,CAC1B,CAAC;CACF,MAAMC,OAAyB,EAAE;AACjC,MAAK,MAAM,QAAQ,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE;EACpC,MAAM,cAAc,SAAS;EAC7B,MAAM,iBACJ,gBAAgB,SAAY,2BAA2B,YAAY,GAAG;EACxE,MAAM,IAAI,UAAU;EACpB,IAAIC;AACJ,MAAI,kBAAkB,CAAC,EAAG,UAAS;WAC1B,CAAC,kBAAkB,EAAG,UAAS;WAC/B,kBAAkB,KAAK,mBAAmB,EAAE,OAAQ,UAAS;MACjE,UAAS;AACd,OAAK,KAAK;GACR;GACA;GACA,OAAO,GAAG,SAAS;GACnB,iBAAiB,GAAG;GACpB,YAAY,GAAG;GACf;GACD,CAAC;;AAEJ,QAAO"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { f as getDispatchNamespaces, m as getLogpushJobs, p as getDnsRecords } from "./normalize-DVSTRZhO.mjs";
|
|
2
|
-
import { B as
|
|
3
|
-
import { n as resourceModules } from "./registry-
|
|
2
|
+
import { B as getConfigBaseDir, E as mergeWorkerConfigForResourcePick, H as loadConfig, L as CFApiClient, O as resolveDeployedWorkerName, R as cloudflareAccountIdFromEnv, V as getWorkers, f as fetchStackImports, h as StateManager, m as scanConfigForImports, u as namingFromConfig, w as stackNameForConfig, y as tenantStateKey } from "./tamer.mjs";
|
|
3
|
+
import { n as resourceModules } from "./registry-BrOxbA2i.mjs";
|
|
4
4
|
import "./r2S3EmptyBucket-B9_pHfvB.mjs";
|
|
5
5
|
import { r as dnsRecordStateKey, t as dnsRecordAppliesToEnv } from "./dns-records.resolve-DV6XBZf3.mjs";
|
|
6
6
|
import { t as logpushJobStatus } from "./logpush-job-GqVKG_HI.mjs";
|
|
7
|
-
import { t as buildOutputsView } from "./stackOutputs-
|
|
7
|
+
import { t as buildOutputsView } from "./stackOutputs-CkpNSng8.mjs";
|
|
8
8
|
|
|
9
9
|
//#region src/features/dispatch-namespace/dispatch-namespace.status.ts
|
|
10
10
|
function dispatchNamespaceStatus(resources, _env, state, _naming) {
|
|
@@ -193,4 +193,4 @@ async function runStatus(options) {
|
|
|
193
193
|
|
|
194
194
|
//#endregion
|
|
195
195
|
export { runStatus };
|
|
196
|
-
//# sourceMappingURL=status-
|
|
196
|
+
//# sourceMappingURL=status-Ck6Xo8aV.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status-Xd2gJtII.mjs","names":["results: Array<{\n logicalName: string;\n namespace: string;\n status: ResourceStatus;\n }>","rows: DnsRecordStatusRow[]","meta: string[]","siblingImports: Record<string, Record<string, string>>","logpushLive:\n | Awaited<ReturnType<CFApiClient[\"logpushAccountJobsList\"]>>\n | undefined","hints: string[]"],"sources":["../src/features/dispatch-namespace/dispatch-namespace.status.ts","../src/features/dns-records/dns-records.status.ts","../src/cli/commands/status.ts"],"sourcesContent":["import type { DispatchNamespaceResourceConfig } from \"../../types.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { ResourceStatus } from \"../../types.js\";\n\nexport function dispatchNamespaceStatus(\n resources: DispatchNamespaceResourceConfig[],\n _env: string,\n state: StateManager,\n _naming: NamingEngine,\n): Array<{ logicalName: string; namespace: string; status: ResourceStatus }> {\n const results: Array<{\n logicalName: string;\n namespace: string;\n status: ResourceStatus;\n }> = [];\n\n for (const config of resources) {\n const key = `dispatch_ns:${config.namespace}`;\n const entry = state.get(key);\n results.push({\n logicalName: config.logicalName,\n namespace: config.namespace,\n status:\n entry?.type === \"dispatch_namespace\" ? \"ok\" : \"missing\",\n });\n }\n\n return results;\n}\n","import type { DnsRecordResourceConfig, ResourceStatus } from \"../../types.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport {\n dnsRecordAppliesToEnv,\n dnsRecordStateKey,\n} from \"./dns-records.resolve.js\";\n\nexport interface DnsRecordStatusRow {\n logicalName: string;\n type: string;\n name: string;\n recordId?: string;\n status: ResourceStatus;\n}\n\nexport function dnsRecordStatus(\n resources: DnsRecordResourceConfig[],\n env: string,\n state: StateManager,\n): DnsRecordStatusRow[] {\n const rows: DnsRecordStatusRow[] = [];\n for (const config of resources) {\n if (!dnsRecordAppliesToEnv(config, env)) {\n rows.push({\n logicalName: config.logicalName,\n type: config.type,\n name: config.name,\n status: \"ok\",\n });\n continue;\n }\n const entry = state.get(\n dnsRecordStateKey(config.zoneId, config.type, config.name),\n );\n if (entry?.type === \"dns_record\") {\n rows.push({\n logicalName: config.logicalName,\n type: entry.recordType,\n name: entry.name,\n recordId: entry.recordId,\n status: \"ok\",\n });\n } else {\n rows.push({\n logicalName: config.logicalName,\n type: config.type,\n name: config.name,\n status: \"missing\",\n });\n }\n }\n return rows;\n}\n","import { loadConfig, getWorkers, getConfigBaseDir } from \"../../core/config/loader.js\";\nimport { cloudflareAccountIdFromEnv } from \"../../core/cloudflareEnv.js\";\nimport { namingFromConfig } from \"../../core/config/namingFromConfig.js\";\nimport { StateManager } from \"../../core/state/StateManager.js\";\nimport { stackNameForConfig } from \"../../core/state/stackName.js\";\nimport { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport { dispatchNamespaceStatus } from \"../../features/dispatch-namespace/index.js\";\nimport { dnsRecordStatus } from \"../../features/dns-records/index.js\";\nimport { getDispatchNamespaces, getDnsRecords, getLogpushJobs } from \"../../types.js\";\nimport { logpushJobStatus } from \"../../features/logpush-job/index.js\";\nimport { tenantStateKey } from \"../../core/tenant/tenantKeys.js\";\nimport { resourceModules } from \"../../core/registry/registry.js\";\nimport {\n resolveDeployedWorkerName,\n mergeWorkerConfigForResourcePick,\n} from \"../../core/config/resolver.js\";\nimport { buildOutputsView } from \"../../core/outputs/stackOutputs.js\";\nimport {\n fetchStackImports,\n scanConfigForImports,\n} from \"../../core/imports/fetchStackImports.js\";\n\nexport async function runStatus(options: {\n env?: string;\n configPath?: string;\n /** `product:workspace` — show only this workspace tenant from state. */\n tenant?: string;\n}): Promise<void> {\n const env = options.env ?? \"local\";\n const configPath = options.configPath;\n\n const config = await loadConfig(configPath, { env });\n const baseDir = getConfigBaseDir();\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 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\n const workers = await getWorkers(config, baseDir);\n console.log(\n `\\nStatus for ${config.tenant.name} (${config.tenant.slug}) — env: ${env}\\n`,\n );\n\n if (options.tenant?.trim()) {\n const raw = options.tenant.trim();\n const colon = raw.indexOf(\":\");\n if (colon < 1) {\n throw new Error(\n 'status --tenant expects \"product:workspace\" (e.g. todo:acme)',\n );\n }\n const product = raw.slice(0, colon);\n const workspace = raw.slice(colon + 1);\n const t = state.getTenant(product, workspace);\n console.log(`Workspace tenant ${tenantStateKey(product, workspace)}:`);\n if (!t) {\n console.log(\" (no record in tamer state)\\n\");\n return;\n }\n console.log(` status: ${t.provisioningStatus}`);\n console.log(` dispatch namespace: ${t.dispatchNamespaceName}`);\n console.log(` script: ${t.scriptName}`);\n if (t.d1Shards?.length) {\n console.log(\" D1 shards:\");\n for (const s of t.d1Shards) {\n console.log(` ${s.role}: ${s.derivedName} [${s.cfId}]`);\n }\n }\n console.log();\n return;\n }\n\n const outputRows = buildOutputsView(config, state);\n if (outputRows.length > 0) {\n console.log(\"Stack outputs:\");\n for (const r of outputRows) {\n const valueText =\n r.value === null\n ? \"(unresolved — run apply)\"\n : r.value;\n const meta: string[] = [r.status];\n if (r.status === \"stale\" && r.declaredSource) {\n meta.push(`source drifted → ${r.declaredSource}`);\n }\n console.log(` ${r.name}: ${valueText} [${meta.join(\", \")}]`);\n }\n console.log();\n }\n\n // Inbound imports — show every `${tamer:import:<stack>.<output>}`\n // referenced by config, grouped by source stack. We tolerate fetch\n // failures so `tamer status` still works in offline / partial-cred\n // environments; a missing sibling row just displays \"(unresolved)\".\n const importRefs = scanConfigForImports(config);\n let siblingImports: Record<string, Record<string, string>> = {};\n try {\n siblingImports = await fetchStackImports(api, config, env);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`(could not pre-fetch imported stacks: ${msg})`);\n }\n if (importRefs.length > 0) {\n console.log(\"Stack imports:\");\n const byStack = new Map<string, Set<string>>();\n for (const r of importRefs) {\n if (!byStack.has(r.stack)) byStack.set(r.stack, new Set());\n byStack.get(r.stack)!.add(r.output);\n }\n for (const [stack, outputs] of [...byStack].sort(([a], [b]) =>\n a.localeCompare(b),\n )) {\n console.log(` from stack \"${stack}\":`);\n const stackOutputs = siblingImports[stack] ?? {};\n for (const out of [...outputs].sort()) {\n const v = stackOutputs[out];\n const status = v === undefined ? \"unresolved\" : \"resolved\";\n const value = v ?? \"(missing — run `tamer apply` on that stack)\";\n console.log(` ${out}: ${value} [${status}]`);\n }\n }\n console.log();\n }\n\n const dns = dispatchNamespaceStatus(\n getDispatchNamespaces(config),\n env,\n state,\n naming,\n );\n if (dns.length > 0) {\n console.log(\"Dispatch namespaces:\");\n for (const r of dns) {\n console.log(` ${r.logicalName} (${r.namespace}) [${r.status}]`);\n }\n console.log();\n }\n\n const dnsRows = dnsRecordStatus(getDnsRecords(config), env, state);\n if (dnsRows.length > 0) {\n console.log(\"DNS records:\");\n for (const r of dnsRows) {\n const id = r.recordId ? ` [${r.recordId}]` : \"\";\n console.log(` ${r.logicalName}: ${r.type} ${r.name}${id} [${r.status}]`);\n }\n console.log();\n }\n\n let logpushLive:\n | Awaited<ReturnType<CFApiClient[\"logpushAccountJobsList\"]>>\n | undefined;\n if (env !== \"local\") {\n try {\n logpushLive = await api.logpushAccountJobsList();\n } catch {\n // Token may lack Logpush list; state-only rows still print.\n }\n }\n const logpushRows = logpushJobStatus(\n getLogpushJobs(config),\n config.tenant,\n env,\n state,\n logpushLive,\n );\n if (logpushRows.length > 0) {\n console.log(\"Logpush jobs:\");\n for (const r of logpushRows) {\n const id = r.cfJobId != null ? ` [id ${r.cfJobId}]` : \"\";\n const hints: string[] = [];\n if (r.cfEnabled === false) hints.push(\"disabled on Cloudflare\");\n if (r.cfError) hints.push(`CF error: ${r.cfError}`);\n const hint = hints.length > 0 ? ` — ${hints.join(\"; \")}` : \"\";\n console.log(` ${r.logicalName}: ${r.jobName}${id} [${r.status}]${hint}`);\n }\n console.log();\n }\n\n for (const [workerKey, workerConfig] of workers) {\n console.log(`Worker: ${workerKey}`);\n const deployedName = resolveDeployedWorkerName(\n config,\n workerKey,\n workerConfig,\n env,\n naming,\n );\n const mergedWorker = mergeWorkerConfigForResourcePick(\n config,\n workerKey,\n workerConfig,\n env,\n accountId,\n naming,\n state,\n { referencesMode: \"tolerant\", imports: siblingImports },\n );\n let printedAny = false;\n for (const mod of resourceModules) {\n const resources = mod.pickResources(mergedWorker);\n if (resources.length === 0) continue;\n const rows = mod.status({\n resources,\n env,\n state,\n naming,\n worker: { workerKey, deployedName },\n });\n if (rows.length === 0) continue;\n printedAny = true;\n console.log(` ${mod.label}:`);\n for (const r of rows) {\n console.log(` ${r.binding}: ${r.name} [${r.status}]`);\n }\n }\n if (!printedAny) console.log(\" (no resources)\");\n console.log();\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"status-Ck6Xo8aV.mjs","names":["results: Array<{\n logicalName: string;\n namespace: string;\n status: ResourceStatus;\n }>","rows: DnsRecordStatusRow[]","meta: string[]","siblingImports: Record<string, Record<string, string>>","logpushLive:\n | Awaited<ReturnType<CFApiClient[\"logpushAccountJobsList\"]>>\n | undefined","hints: string[]"],"sources":["../src/features/dispatch-namespace/dispatch-namespace.status.ts","../src/features/dns-records/dns-records.status.ts","../src/cli/commands/status.ts"],"sourcesContent":["import type { DispatchNamespaceResourceConfig } from \"../../types.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { ResourceStatus } from \"../../types.js\";\n\nexport function dispatchNamespaceStatus(\n resources: DispatchNamespaceResourceConfig[],\n _env: string,\n state: StateManager,\n _naming: NamingEngine,\n): Array<{ logicalName: string; namespace: string; status: ResourceStatus }> {\n const results: Array<{\n logicalName: string;\n namespace: string;\n status: ResourceStatus;\n }> = [];\n\n for (const config of resources) {\n const key = `dispatch_ns:${config.namespace}`;\n const entry = state.get(key);\n results.push({\n logicalName: config.logicalName,\n namespace: config.namespace,\n status:\n entry?.type === \"dispatch_namespace\" ? \"ok\" : \"missing\",\n });\n }\n\n return results;\n}\n","import type { DnsRecordResourceConfig, ResourceStatus } from \"../../types.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport {\n dnsRecordAppliesToEnv,\n dnsRecordStateKey,\n} from \"./dns-records.resolve.js\";\n\nexport interface DnsRecordStatusRow {\n logicalName: string;\n type: string;\n name: string;\n recordId?: string;\n status: ResourceStatus;\n}\n\nexport function dnsRecordStatus(\n resources: DnsRecordResourceConfig[],\n env: string,\n state: StateManager,\n): DnsRecordStatusRow[] {\n const rows: DnsRecordStatusRow[] = [];\n for (const config of resources) {\n if (!dnsRecordAppliesToEnv(config, env)) {\n rows.push({\n logicalName: config.logicalName,\n type: config.type,\n name: config.name,\n status: \"ok\",\n });\n continue;\n }\n const entry = state.get(\n dnsRecordStateKey(config.zoneId, config.type, config.name),\n );\n if (entry?.type === \"dns_record\") {\n rows.push({\n logicalName: config.logicalName,\n type: entry.recordType,\n name: entry.name,\n recordId: entry.recordId,\n status: \"ok\",\n });\n } else {\n rows.push({\n logicalName: config.logicalName,\n type: config.type,\n name: config.name,\n status: \"missing\",\n });\n }\n }\n return rows;\n}\n","import { loadConfig, getWorkers, getConfigBaseDir } from \"../../core/config/loader.js\";\nimport { cloudflareAccountIdFromEnv } from \"../../core/cloudflareEnv.js\";\nimport { namingFromConfig } from \"../../core/config/namingFromConfig.js\";\nimport { StateManager } from \"../../core/state/StateManager.js\";\nimport { stackNameForConfig } from \"../../core/state/stackName.js\";\nimport { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport { dispatchNamespaceStatus } from \"../../features/dispatch-namespace/index.js\";\nimport { dnsRecordStatus } from \"../../features/dns-records/index.js\";\nimport { getDispatchNamespaces, getDnsRecords, getLogpushJobs } from \"../../types.js\";\nimport { logpushJobStatus } from \"../../features/logpush-job/index.js\";\nimport { tenantStateKey } from \"../../core/tenant/tenantKeys.js\";\nimport { resourceModules } from \"../../core/registry/registry.js\";\nimport {\n resolveDeployedWorkerName,\n mergeWorkerConfigForResourcePick,\n} from \"../../core/config/resolver.js\";\nimport { buildOutputsView } from \"../../core/outputs/stackOutputs.js\";\nimport {\n fetchStackImports,\n scanConfigForImports,\n} from \"../../core/imports/fetchStackImports.js\";\n\nexport async function runStatus(options: {\n env?: string;\n configPath?: string;\n /** `product:workspace` — show only this workspace tenant from state. */\n tenant?: string;\n}): Promise<void> {\n const env = options.env ?? \"local\";\n const configPath = options.configPath;\n\n const config = await loadConfig(configPath, { env });\n const baseDir = getConfigBaseDir();\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 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\n const workers = await getWorkers(config, baseDir);\n console.log(\n `\\nStatus for ${config.tenant.name} (${config.tenant.slug}) — env: ${env}\\n`,\n );\n\n if (options.tenant?.trim()) {\n const raw = options.tenant.trim();\n const colon = raw.indexOf(\":\");\n if (colon < 1) {\n throw new Error(\n 'status --tenant expects \"product:workspace\" (e.g. todo:acme)',\n );\n }\n const product = raw.slice(0, colon);\n const workspace = raw.slice(colon + 1);\n const t = state.getTenant(product, workspace);\n console.log(`Workspace tenant ${tenantStateKey(product, workspace)}:`);\n if (!t) {\n console.log(\" (no record in tamer state)\\n\");\n return;\n }\n console.log(` status: ${t.provisioningStatus}`);\n console.log(` dispatch namespace: ${t.dispatchNamespaceName}`);\n console.log(` script: ${t.scriptName}`);\n if (t.d1Shards?.length) {\n console.log(\" D1 shards:\");\n for (const s of t.d1Shards) {\n console.log(` ${s.role}: ${s.derivedName} [${s.cfId}]`);\n }\n }\n console.log();\n return;\n }\n\n const outputRows = buildOutputsView(config, state);\n if (outputRows.length > 0) {\n console.log(\"Stack outputs:\");\n for (const r of outputRows) {\n const valueText =\n r.value === null\n ? \"(unresolved — run apply)\"\n : r.value;\n const meta: string[] = [r.status];\n if (r.status === \"stale\" && r.declaredSource) {\n meta.push(`source drifted → ${r.declaredSource}`);\n }\n console.log(` ${r.name}: ${valueText} [${meta.join(\", \")}]`);\n }\n console.log();\n }\n\n // Inbound imports — show every `${tamer:import:<stack>.<output>}`\n // referenced by config, grouped by source stack. We tolerate fetch\n // failures so `tamer status` still works in offline / partial-cred\n // environments; a missing sibling row just displays \"(unresolved)\".\n const importRefs = scanConfigForImports(config);\n let siblingImports: Record<string, Record<string, string>> = {};\n try {\n siblingImports = await fetchStackImports(api, config, env);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`(could not pre-fetch imported stacks: ${msg})`);\n }\n if (importRefs.length > 0) {\n console.log(\"Stack imports:\");\n const byStack = new Map<string, Set<string>>();\n for (const r of importRefs) {\n if (!byStack.has(r.stack)) byStack.set(r.stack, new Set());\n byStack.get(r.stack)!.add(r.output);\n }\n for (const [stack, outputs] of [...byStack].sort(([a], [b]) =>\n a.localeCompare(b),\n )) {\n console.log(` from stack \"${stack}\":`);\n const stackOutputs = siblingImports[stack] ?? {};\n for (const out of [...outputs].sort()) {\n const v = stackOutputs[out];\n const status = v === undefined ? \"unresolved\" : \"resolved\";\n const value = v ?? \"(missing — run `tamer apply` on that stack)\";\n console.log(` ${out}: ${value} [${status}]`);\n }\n }\n console.log();\n }\n\n const dns = dispatchNamespaceStatus(\n getDispatchNamespaces(config),\n env,\n state,\n naming,\n );\n if (dns.length > 0) {\n console.log(\"Dispatch namespaces:\");\n for (const r of dns) {\n console.log(` ${r.logicalName} (${r.namespace}) [${r.status}]`);\n }\n console.log();\n }\n\n const dnsRows = dnsRecordStatus(getDnsRecords(config), env, state);\n if (dnsRows.length > 0) {\n console.log(\"DNS records:\");\n for (const r of dnsRows) {\n const id = r.recordId ? ` [${r.recordId}]` : \"\";\n console.log(` ${r.logicalName}: ${r.type} ${r.name}${id} [${r.status}]`);\n }\n console.log();\n }\n\n let logpushLive:\n | Awaited<ReturnType<CFApiClient[\"logpushAccountJobsList\"]>>\n | undefined;\n if (env !== \"local\") {\n try {\n logpushLive = await api.logpushAccountJobsList();\n } catch {\n // Token may lack Logpush list; state-only rows still print.\n }\n }\n const logpushRows = logpushJobStatus(\n getLogpushJobs(config),\n config.tenant,\n env,\n state,\n logpushLive,\n );\n if (logpushRows.length > 0) {\n console.log(\"Logpush jobs:\");\n for (const r of logpushRows) {\n const id = r.cfJobId != null ? ` [id ${r.cfJobId}]` : \"\";\n const hints: string[] = [];\n if (r.cfEnabled === false) hints.push(\"disabled on Cloudflare\");\n if (r.cfError) hints.push(`CF error: ${r.cfError}`);\n const hint = hints.length > 0 ? ` — ${hints.join(\"; \")}` : \"\";\n console.log(` ${r.logicalName}: ${r.jobName}${id} [${r.status}]${hint}`);\n }\n console.log();\n }\n\n for (const [workerKey, workerConfig] of workers) {\n console.log(`Worker: ${workerKey}`);\n const deployedName = resolveDeployedWorkerName(\n config,\n workerKey,\n workerConfig,\n env,\n naming,\n );\n const mergedWorker = mergeWorkerConfigForResourcePick(\n config,\n workerKey,\n workerConfig,\n env,\n accountId,\n naming,\n state,\n { referencesMode: \"tolerant\", imports: siblingImports },\n );\n let printedAny = false;\n for (const mod of resourceModules) {\n const resources = mod.pickResources(mergedWorker);\n if (resources.length === 0) continue;\n const rows = mod.status({\n resources,\n env,\n state,\n naming,\n worker: { workerKey, deployedName },\n });\n if (rows.length === 0) continue;\n printedAny = true;\n console.log(` ${mod.label}:`);\n for (const r of rows) {\n console.log(` ${r.binding}: ${r.name} [${r.status}]`);\n }\n }\n if (!printedAny) console.log(\" (no resources)\");\n console.log();\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { f as getDispatchNamespaces, m as getLogpushJobs, p as getDnsRecords } from "./normalize-DVSTRZhO.mjs";
|
|
2
|
-
import { B as
|
|
3
|
-
import { n as resourceModules } from "./registry-
|
|
4
|
-
import "./
|
|
5
|
-
import { n as dispatchNamespaceSync, t as dnsRecordSync } from "./dns-records.sync-PoahWQjY.mjs";
|
|
2
|
+
import { B as getConfigBaseDir, E as mergeWorkerConfigForResourcePick, H as loadConfig, L as CFApiClient, R as cloudflareAccountIdFromEnv, V as getWorkers, f as fetchStackImports, h as StateManager, u as namingFromConfig, w as stackNameForConfig } from "./tamer.mjs";
|
|
3
|
+
import { n as resourceModules } from "./registry-BrOxbA2i.mjs";
|
|
4
|
+
import { n as dispatchNamespaceSync, t as dnsRecordSync } from "./dns-records.sync-FyzKl-Ph.mjs";
|
|
6
5
|
import { i as logpushJobSync } from "./logpush-job-GqVKG_HI.mjs";
|
|
7
|
-
import { i as workerRouteSync } from "./worker-route-
|
|
6
|
+
import { i as workerRouteSync } from "./worker-route-CUQBu9xe.mjs";
|
|
8
7
|
|
|
9
8
|
//#region src/cli/commands/sync.ts
|
|
10
9
|
async function runSync(options) {
|
|
@@ -84,5 +83,5 @@ async function runSync(options) {
|
|
|
84
83
|
}
|
|
85
84
|
|
|
86
85
|
//#endregion
|
|
87
|
-
export { runSync };
|
|
88
|
-
//# sourceMappingURL=sync-
|
|
86
|
+
export { runSync as t };
|
|
87
|
+
//# sourceMappingURL=sync-kl7MaCQV.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-
|
|
1
|
+
{"version":3,"file":"sync-kl7MaCQV.mjs","names":[],"sources":["../src/cli/commands/sync.ts"],"sourcesContent":["import { loadConfig, getWorkers, getConfigBaseDir } from \"../../core/config/loader.js\";\nimport { cloudflareAccountIdFromEnv } from \"../../core/cloudflareEnv.js\";\nimport { namingFromConfig } from \"../../core/config/namingFromConfig.js\";\nimport { StateManager } from \"../../core/state/StateManager.js\";\nimport { stackNameForConfig } from \"../../core/state/stackName.js\";\nimport { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport { dispatchNamespaceSync } from \"../../features/dispatch-namespace/index.js\";\nimport { dnsRecordSync } from \"../../features/dns-records/index.js\";\nimport { getDispatchNamespaces, getDnsRecords, getLogpushJobs } from \"../../types.js\";\nimport { logpushJobSync } from \"../../features/logpush-job/index.js\";\nimport { workerRouteSync } from \"../../features/worker-route/index.js\";\nimport { resourceModules } from \"../../core/registry/registry.js\";\nimport { fetchStackImports } from \"../../core/imports/fetchStackImports.js\";\nimport { mergeWorkerConfigForResourcePick } from \"../../core/config/resolver.js\";\n\nexport async function runSync(options: {\n env?: string;\n configPath?: string;\n}): Promise<void> {\n const env = options.env ?? \"local\";\n const configPath = options.configPath;\n\n const config = await loadConfig(configPath, { env });\n const baseDir = getConfigBaseDir();\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 // Tolerant pre-fetch: sync runs against existing cloud state, so we\n // pass real import values into worker-route resolution to avoid\n // matching against `${tamer:import:…}` placeholders.\n const imports = await fetchStackImports(api, config, env).catch((err) => {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[sync] skipping cross-stack imports: ${msg}`);\n return {} as Record<string, Record<string, string>>;\n });\n\n async function safeList<T>(\n label: string,\n fn: () => Promise<T[]>,\n ): Promise<T[]> {\n try {\n return await fn();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[sync] skipping ${label}: ${msg}`);\n return [];\n }\n }\n\n const lists = await Promise.all(\n resourceModules.map((m) =>\n safeList(`${m.label} list`, () => m.fetchAll(api)),\n ),\n );\n\n if (getDispatchNamespaces(config).length > 0) {\n try {\n await dispatchNamespaceSync(\n getDispatchNamespaces(config),\n config.tenant,\n env,\n api,\n state,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[sync] skipping dispatch namespaces: ${msg}`);\n }\n }\n\n if (getDnsRecords(config).length > 0) {\n try {\n await dnsRecordSync(\n getDnsRecords(config),\n config.tenant,\n env,\n api,\n state,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[sync] skipping dns records: ${msg}`);\n }\n }\n\n if (getLogpushJobs(config).length > 0 && env !== \"local\") {\n try {\n await logpushJobSync(\n getLogpushJobs(config),\n config.tenant,\n env,\n api,\n state,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[sync] skipping logpush jobs: ${msg}`);\n }\n }\n\n const workers = await getWorkers(config, baseDir);\n for (const [workerKey, workerConfig] of workers) {\n const mergedWorker = mergeWorkerConfigForResourcePick(\n config,\n workerKey,\n workerConfig,\n env,\n accountId,\n naming,\n state,\n { referencesMode: \"tolerant\", imports },\n );\n resourceModules.forEach((mod, i) => {\n const resources = mod.pickResources(mergedWorker);\n if (resources.length === 0) return;\n mod.sync({\n resources,\n all: lists[i],\n tenant: config.tenant,\n env,\n api,\n state,\n naming,\n config,\n baseDir,\n });\n });\n }\n\n try {\n await workerRouteSync(env, config, baseDir, accountId, naming, state, api, {\n imports,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[sync] skipping worker routes: ${msg}`);\n }\n\n await state.persist(api);\n console.log(`Synced state for env: ${env}`);\n}\n"],"mappings":";;;;;;;;AAeA,eAAsB,QAAQ,SAGZ;CAChB,MAAM,MAAM,QAAQ,OAAO;CAC3B,MAAM,aAAa,QAAQ;CAE3B,MAAM,SAAS,MAAM,WAAW,YAAY,EAAE,KAAK,CAAC;CACpD,MAAM,UAAU,kBAAkB;CAClC,MAAM,YACJ,OAAO,cAAc,4BAA4B;AACnD,KAAI,CAAC,UACH,OAAM,IAAI,MACR,iEACD;CAGH,MAAM,MAAM,IAAI,YAAY,UAAU;CACtC,MAAM,SAAS,iBAAiB,OAAO;CACvC,MAAM,QAAQ,IAAI,aAChB,OAAO,OAAO,IACd,KACA,mBAAmB,OAAO,CAC3B;AACD,OAAM,MAAM,QAAQ,IAAI;CAIxB,MAAM,UAAU,MAAM,kBAAkB,KAAK,QAAQ,IAAI,CAAC,OAAO,QAAQ;EACvE,MAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC5D,UAAQ,KAAK,wCAAwC,MAAM;AAC3D,SAAO,EAAE;GACT;CAEF,eAAe,SACb,OACA,IACc;AACd,MAAI;AACF,UAAO,MAAM,IAAI;WACV,KAAK;GACZ,MAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC5D,WAAQ,KAAK,mBAAmB,MAAM,IAAI,MAAM;AAChD,UAAO,EAAE;;;CAIb,MAAM,QAAQ,MAAM,QAAQ,IAC1B,gBAAgB,KAAK,MACnB,SAAS,GAAG,EAAE,MAAM,cAAc,EAAE,SAAS,IAAI,CAAC,CACnD,CACF;AAED,KAAI,sBAAsB,OAAO,CAAC,SAAS,EACzC,KAAI;AACF,QAAM,sBACJ,sBAAsB,OAAO,EAC7B,OAAO,QACP,KACA,KACA,MACD;UACM,KAAK;EACZ,MAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC5D,UAAQ,KAAK,wCAAwC,MAAM;;AAI/D,KAAI,cAAc,OAAO,CAAC,SAAS,EACjC,KAAI;AACF,QAAM,cACJ,cAAc,OAAO,EACrB,OAAO,QACP,KACA,KACA,MACD;UACM,KAAK;EACZ,MAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC5D,UAAQ,KAAK,gCAAgC,MAAM;;AAIvD,KAAI,eAAe,OAAO,CAAC,SAAS,KAAK,QAAQ,QAC/C,KAAI;AACF,QAAM,eACJ,eAAe,OAAO,EACtB,OAAO,QACP,KACA,KACA,MACD;UACM,KAAK;EACZ,MAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC5D,UAAQ,KAAK,iCAAiC,MAAM;;CAIxD,MAAM,UAAU,MAAM,WAAW,QAAQ,QAAQ;AACjD,MAAK,MAAM,CAAC,WAAW,iBAAiB,SAAS;EAC/C,MAAM,eAAe,iCACnB,QACA,WACA,cACA,KACA,WACA,QACA,OACA;GAAE,gBAAgB;GAAY;GAAS,CACxC;AACD,kBAAgB,SAAS,KAAK,MAAM;GAClC,MAAM,YAAY,IAAI,cAAc,aAAa;AACjD,OAAI,UAAU,WAAW,EAAG;AAC5B,OAAI,KAAK;IACP;IACA,KAAK,MAAM;IACX,QAAQ,OAAO;IACf;IACA;IACA;IACA;IACA;IACA;IACD,CAAC;IACF;;AAGJ,KAAI;AACF,QAAM,gBAAgB,KAAK,QAAQ,SAAS,WAAW,QAAQ,OAAO,KAAK,EACzE,SACD,CAAC;UACK,KAAK;EACZ,MAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC5D,UAAQ,KAAK,kCAAkC,MAAM;;AAGvD,OAAM,MAAM,QAAQ,IAAI;AACxB,SAAQ,IAAI,yBAAyB,MAAM"}
|
package/dist/tamer.mjs
CHANGED
|
@@ -4874,6 +4874,26 @@ var CFApiClient = class {
|
|
|
4874
4874
|
await this.request(`/accounts/${this.accountId}/r2/buckets/${bucketName}`, { method: "DELETE" });
|
|
4875
4875
|
}
|
|
4876
4876
|
/**
|
|
4877
|
+
* List objects in an R2 bucket via the CF REST API (not S3).
|
|
4878
|
+
* Uses the existing CLOUDFLARE_API_TOKEN — no separate S3 keys needed.
|
|
4879
|
+
*/
|
|
4880
|
+
async r2ListObjects(bucketName, cursor) {
|
|
4881
|
+
const params = new URLSearchParams({ per_page: "1000" });
|
|
4882
|
+
if (cursor) params.set("cursor", cursor);
|
|
4883
|
+
const data = await this.request(`/accounts/${this.accountId}/r2/buckets/${encodeURIComponent(bucketName)}/objects?${params}`, { method: "GET" });
|
|
4884
|
+
return {
|
|
4885
|
+
objects: data.result ?? [],
|
|
4886
|
+
cursor: data.result_info?.cursor
|
|
4887
|
+
};
|
|
4888
|
+
}
|
|
4889
|
+
/**
|
|
4890
|
+
* Delete an object from an R2 bucket via the CF REST API.
|
|
4891
|
+
*/
|
|
4892
|
+
async r2DeleteObject(bucketName, objectKey) {
|
|
4893
|
+
const pathEncoded = objectKey.split("/").map((seg) => encodeURIComponent(seg)).join("/");
|
|
4894
|
+
await this.request(`/accounts/${this.accountId}/r2/buckets/${encodeURIComponent(bucketName)}/objects/${pathEncoded}`, { method: "DELETE" });
|
|
4895
|
+
}
|
|
4896
|
+
/**
|
|
4877
4897
|
* Download an object from R2 (HTTP API).
|
|
4878
4898
|
* @see https://developers.cloudflare.com/api/resources/r2/subresources/buckets/subresources/objects/methods/get/
|
|
4879
4899
|
*/
|
|
@@ -6753,6 +6773,45 @@ async function deleteEnvStateRows(api, env) {
|
|
|
6753
6773
|
await api.d1Query(uuid$1, `DELETE FROM tamer_kv WHERE k LIKE ?`, [`cfi_state:${env}:%`]);
|
|
6754
6774
|
return true;
|
|
6755
6775
|
}
|
|
6776
|
+
/**
|
|
6777
|
+
* List all envs that have state rows in the shared `tamer-state` D1.
|
|
6778
|
+
* Queries `cfi_state:{env}:{stackName}` row keys and parses the JSON value
|
|
6779
|
+
* for metadata. Used by `tamer env list` and `tamer env gc`.
|
|
6780
|
+
*/
|
|
6781
|
+
async function listEnvRows(api) {
|
|
6782
|
+
const uuid$1 = await findTamerStateDatabaseUuid(api);
|
|
6783
|
+
if (!uuid$1) return [];
|
|
6784
|
+
const { rows } = await api.d1Query(uuid$1, `SELECT k, v FROM tamer_kv WHERE k LIKE 'cfi_state:%'`);
|
|
6785
|
+
const out = [];
|
|
6786
|
+
for (const row of rows) {
|
|
6787
|
+
const key = String(row.k ?? "");
|
|
6788
|
+
if (!key.startsWith("cfi_state:")) continue;
|
|
6789
|
+
const rest$1 = key.slice(10);
|
|
6790
|
+
const colonIdx = rest$1.indexOf(":");
|
|
6791
|
+
const env = colonIdx >= 0 ? rest$1.slice(0, colonIdx) : rest$1;
|
|
6792
|
+
const stackName = colonIdx >= 0 ? rest$1.slice(colonIdx + 1) : "default";
|
|
6793
|
+
let syncedAt = "";
|
|
6794
|
+
let resourceCount = 0;
|
|
6795
|
+
let lastOperationStatus;
|
|
6796
|
+
let lastOperationCommand;
|
|
6797
|
+
try {
|
|
6798
|
+
const parsed = JSON.parse(String(row.v ?? "{}"));
|
|
6799
|
+
syncedAt = parsed.syncedAt ?? "";
|
|
6800
|
+
resourceCount = parsed.resources ? Object.keys(parsed.resources).length : 0;
|
|
6801
|
+
lastOperationStatus = parsed.lastOperation?.status;
|
|
6802
|
+
lastOperationCommand = parsed.lastOperation?.command;
|
|
6803
|
+
} catch {}
|
|
6804
|
+
out.push({
|
|
6805
|
+
env,
|
|
6806
|
+
stackName,
|
|
6807
|
+
syncedAt,
|
|
6808
|
+
resourceCount,
|
|
6809
|
+
lastOperationStatus,
|
|
6810
|
+
lastOperationCommand
|
|
6811
|
+
});
|
|
6812
|
+
}
|
|
6813
|
+
return out;
|
|
6814
|
+
}
|
|
6756
6815
|
|
|
6757
6816
|
//#endregion
|
|
6758
6817
|
//#region src/core/tenant/tenantKeys.ts
|
|
@@ -8828,19 +8887,23 @@ function parseBootstrapArgs(argv) {
|
|
|
8828
8887
|
const args = process.argv.slice(2);
|
|
8829
8888
|
const command = args[0];
|
|
8830
8889
|
const rest = args.slice(1);
|
|
8890
|
+
function parseStringFlag(argv, flag) {
|
|
8891
|
+
const idx = argv.indexOf(flag);
|
|
8892
|
+
if (idx >= 0 && idx + 1 < argv.length) return argv[idx + 1];
|
|
8893
|
+
}
|
|
8831
8894
|
async function main() {
|
|
8832
8895
|
let exitStatus = 0;
|
|
8833
8896
|
try {
|
|
8834
8897
|
switch (command) {
|
|
8835
8898
|
case "bootstrap":
|
|
8836
|
-
await import("./bootstrap-
|
|
8899
|
+
await import("./bootstrap-DvOce6vA.mjs").then((m) => m.runBootstrap(parseBootstrapArgs(rest)));
|
|
8837
8900
|
break;
|
|
8838
8901
|
case "sync":
|
|
8839
|
-
await import("./sync-
|
|
8902
|
+
await import("./sync-Bky8pptf.mjs").then((m) => m.runSync(parseSyncArgs(rest)));
|
|
8840
8903
|
break;
|
|
8841
8904
|
case "apply": {
|
|
8842
8905
|
const a = parseApplyArgs(rest);
|
|
8843
|
-
await import("./apply-
|
|
8906
|
+
await import("./apply-ByHaKpxD.mjs").then((m) => m.runApply({
|
|
8844
8907
|
env: a.env,
|
|
8845
8908
|
addShard: a.addShard,
|
|
8846
8909
|
configPath: a.configPath,
|
|
@@ -8852,11 +8915,11 @@ async function main() {
|
|
|
8852
8915
|
break;
|
|
8853
8916
|
}
|
|
8854
8917
|
case "dev":
|
|
8855
|
-
await import("./dev-
|
|
8918
|
+
await import("./dev-0zkF2iqF.mjs").then((m) => m.runDev(parseDevArgs(rest)));
|
|
8856
8919
|
break;
|
|
8857
8920
|
case "deploy": {
|
|
8858
8921
|
const d = parseDeployArgs(rest);
|
|
8859
|
-
await import("./deploy-
|
|
8922
|
+
await import("./deploy-C4NOE5S1.mjs").then((m) => m.runDeploy({
|
|
8860
8923
|
worker: d.worker,
|
|
8861
8924
|
env: d.env,
|
|
8862
8925
|
configPath: d.configPath,
|
|
@@ -8865,23 +8928,23 @@ async function main() {
|
|
|
8865
8928
|
break;
|
|
8866
8929
|
}
|
|
8867
8930
|
case "migrate":
|
|
8868
|
-
await import("./migrate-
|
|
8931
|
+
await import("./migrate-YfRtATkG.mjs").then((m) => m.runMigrate(parseMigrateArgs(rest)));
|
|
8869
8932
|
break;
|
|
8870
8933
|
case "types":
|
|
8871
|
-
await import("./types-
|
|
8934
|
+
await import("./types-BZkoBzpD.mjs").then((m) => m.runTypes(parseTypesArgs(rest)));
|
|
8872
8935
|
break;
|
|
8873
8936
|
case "status":
|
|
8874
|
-
await import("./status-
|
|
8937
|
+
await import("./status-Ck6Xo8aV.mjs").then((m) => m.runStatus(parseStatusArgs(rest)));
|
|
8875
8938
|
break;
|
|
8876
8939
|
case "events":
|
|
8877
|
-
await import("./events-
|
|
8940
|
+
await import("./events-C7wAGJae.mjs").then((m) => m.runEvents(parseEventsArgs(rest)));
|
|
8878
8941
|
break;
|
|
8879
8942
|
case "drift":
|
|
8880
|
-
exitStatus = await import("./drift-
|
|
8943
|
+
exitStatus = await import("./drift-CryXFwSh.mjs").then((m) => m.runDrift(parseDriftArgs(rest)));
|
|
8881
8944
|
break;
|
|
8882
8945
|
case "plan": {
|
|
8883
8946
|
const p = parsePlanArgs(rest);
|
|
8884
|
-
exitStatus = await import("./plan-
|
|
8947
|
+
exitStatus = await import("./plan-C0XRZK_J.mjs").then((m) => m.runPlan({
|
|
8885
8948
|
env: p.env,
|
|
8886
8949
|
configPath: p.configPath,
|
|
8887
8950
|
json: p.json,
|
|
@@ -8893,14 +8956,14 @@ async function main() {
|
|
|
8893
8956
|
break;
|
|
8894
8957
|
}
|
|
8895
8958
|
case "import":
|
|
8896
|
-
await import("./import-
|
|
8959
|
+
await import("./import-Bzow4TPf.mjs").then((m) => m.runImport(parseImportArgs(rest)));
|
|
8897
8960
|
break;
|
|
8898
8961
|
case "doctor":
|
|
8899
|
-
exitStatus = await import("./doctor-
|
|
8962
|
+
exitStatus = await import("./doctor-fm_vGe2C.mjs").then((m) => m.runDoctor(parseDoctorArgs(rest)));
|
|
8900
8963
|
break;
|
|
8901
8964
|
case "provision-tenant": {
|
|
8902
8965
|
const p = parseProvisionTenantArgs(rest);
|
|
8903
|
-
await import("./provision-tenant-
|
|
8966
|
+
await import("./provision-tenant-B4VgWlbl.mjs").then((m) => m.runProvisionTenant({
|
|
8904
8967
|
env: p.env,
|
|
8905
8968
|
product: p.product,
|
|
8906
8969
|
workspace: p.workspace,
|
|
@@ -8917,7 +8980,7 @@ async function main() {
|
|
|
8917
8980
|
}
|
|
8918
8981
|
case "destroy-tenant": {
|
|
8919
8982
|
const t = parseDestroyTenantArgs(rest);
|
|
8920
|
-
await import("./destroy-tenant-
|
|
8983
|
+
await import("./destroy-tenant-B9ZTeUDk.mjs").then((m) => m.runDestroyTenant({
|
|
8921
8984
|
env: t.env,
|
|
8922
8985
|
product: t.product,
|
|
8923
8986
|
workspace: t.workspace,
|
|
@@ -8930,7 +8993,7 @@ async function main() {
|
|
|
8930
8993
|
}
|
|
8931
8994
|
case "destroy": {
|
|
8932
8995
|
const d = parseDestroyArgs(rest);
|
|
8933
|
-
await import("./destroy-
|
|
8996
|
+
await import("./destroy-BeOYY2U6.mjs").then((m) => m.runDestroy({
|
|
8934
8997
|
env: d.env,
|
|
8935
8998
|
force: d.force,
|
|
8936
8999
|
skipWorkers: d.skipWorkers,
|
|
@@ -8945,12 +9008,12 @@ async function main() {
|
|
|
8945
9008
|
case "wfp": {
|
|
8946
9009
|
const [sub, ...wfpRest] = rest;
|
|
8947
9010
|
if (sub === "put") {
|
|
8948
|
-
const { parseWfpPutArgs, runWfpPut } = await import("./wfp-put-
|
|
9011
|
+
const { parseWfpPutArgs, runWfpPut } = await import("./wfp-put-B7MW5m64.mjs");
|
|
8949
9012
|
await runWfpPut(parseWfpPutArgs(wfpRest));
|
|
8950
9013
|
break;
|
|
8951
9014
|
}
|
|
8952
9015
|
if (sub === "delete") {
|
|
8953
|
-
const { parseWfpDeleteArgs, runWfpDelete } = await import("./wfp-delete-
|
|
9016
|
+
const { parseWfpDeleteArgs, runWfpDelete } = await import("./wfp-delete-BmibnUuz.mjs");
|
|
8954
9017
|
await runWfpDelete(parseWfpDeleteArgs(wfpRest));
|
|
8955
9018
|
break;
|
|
8956
9019
|
}
|
|
@@ -8960,6 +9023,23 @@ async function main() {
|
|
|
8960
9023
|
case "secrets":
|
|
8961
9024
|
exitStatus = await import("./secrets-CnzjvndT.mjs").then((m) => m.runSecrets(rest));
|
|
8962
9025
|
break;
|
|
9026
|
+
case "env":
|
|
9027
|
+
if (rest[0] === "list") await import("./env-list-DhbYisDn.mjs").then((m) => m.runEnvList({
|
|
9028
|
+
configPath: parseStringFlag(rest, "--config"),
|
|
9029
|
+
json: rest.includes("--json")
|
|
9030
|
+
}));
|
|
9031
|
+
else if (rest[0] === "gc") await import("./env-gc-DlQxkZPj.mjs").then((m) => m.runEnvGc({
|
|
9032
|
+
maxAge: parseStringFlag(rest, "--max-age") ?? "72h",
|
|
9033
|
+
force: rest.includes("--force"),
|
|
9034
|
+
dryRun: rest.includes("--dry-run"),
|
|
9035
|
+
configPath: parseStringFlag(rest, "--config"),
|
|
9036
|
+
json: rest.includes("--json")
|
|
9037
|
+
}));
|
|
9038
|
+
else {
|
|
9039
|
+
console.error("Usage: tamer env <list|gc> [options]");
|
|
9040
|
+
exitStatus = 1;
|
|
9041
|
+
}
|
|
9042
|
+
break;
|
|
8963
9043
|
case "help":
|
|
8964
9044
|
case "-h":
|
|
8965
9045
|
case "--help":
|
|
@@ -8986,6 +9066,8 @@ Commands:
|
|
|
8986
9066
|
provision-tenant Runtime: create per-tenant D1 shards declared in tenant.d1Shards + upload dispatch script (--main or --artifact-key); --shards a,b trims to a subset of the configured layout (omit for all); --json emits machine-readable result for Cloudflare Container callers
|
|
8987
9067
|
destroy-tenant Runtime: remove tenant script + D1 + state (shared envs need --confirm-tenant); --json emits machine-readable result
|
|
8988
9068
|
destroy Delete all resources for an env (use with caution)
|
|
9069
|
+
env list List all environments from state (with ages and resource counts)
|
|
9070
|
+
env gc Destroy ephemeral envs older than --max-age (default 72h; --dry-run, --force, --json)
|
|
8989
9071
|
secrets Encrypted secrets vault (init, set, load, get, list, rm, verify, push)
|
|
8990
9072
|
wfp put Upload a single-module user Worker to a dispatch namespace (multipart API)
|
|
8991
9073
|
wfp delete Delete a user Worker from a dispatch namespace
|
|
@@ -9050,5 +9132,5 @@ Environment variables (same as Wrangler):
|
|
|
9050
9132
|
main();
|
|
9051
9133
|
|
|
9052
9134
|
//#endregion
|
|
9053
|
-
export {
|
|
9135
|
+
export { rewriteIntraStackServiceTargets as A, getConfigBaseDir as B, listEnvRows as C, mergedWorkerConfigForEnv as D, mergeWorkerConfigForResourcePick as E, deleteEnvSecretRows as F, loadConfig as H, ensureTamerSecretsDatabase as I, CFApiClient as L, wranglerConfigCliArgs as M, effectiveDispatchNamespaceName as N, resolveDeployedWorkerName as O, isEphemeralEnv as P, cloudflareAccountIdFromEnv as R, ensureTamerStateDatabase as S, buildIntraStackScriptNameMap as T, getWorkers as V, tenantDispatchScriptName as _, reconcileSecrets as a, createEmptyCfiState as b, vaultReaderFromMap as c, requiredSecretsForWorker as d, fetchStackImports as f, parseTenantShardRoles as g, StateManager as h, pushSecretsForDeploy as i, resolveReferencesInString as j, resolveWorkerConfig as k, createDeploySecretsResources as l, scanConfigForImports as m, parseSecretsArgs as n, secretsDrift as o, importedStackNames as p, runSecrets as r, secretsPlanItems as s, SECRETS_USAGE as t, namingFromConfig as u, tenantShardDatabaseName as v, stackNameForConfig as w, deleteEnvStateRows as x, tenantStateKey as y, cloudflareApiTokenFromEnv as z };
|
|
9054
9136
|
//# sourceMappingURL=tamer.mjs.map
|