@dragonmastery/tamer 0.35.2 → 0.35.4
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-Cz1lxAOp.mjs → apply-BL5JfcZI.mjs} +11 -11
- package/dist/apply-BL5JfcZI.mjs.map +1 -0
- package/dist/{applyTarget-BI6QAVwA.mjs → applyTarget-BJlVrED9.mjs} +2 -2
- package/dist/{applyTarget-BI6QAVwA.mjs.map → applyTarget-BJlVrED9.mjs.map} +1 -1
- package/dist/{bootstrap-CsL4IT9Z.mjs → bootstrap-BYxkCI8L.mjs} +2 -2
- package/dist/{bootstrap-CsL4IT9Z.mjs.map → bootstrap-BYxkCI8L.mjs.map} +1 -1
- package/dist/{cloudflareSnapshot-CpNFH4zd.mjs → cloudflareSnapshot-CjPk6xYL.mjs} +3 -3
- package/dist/{cloudflareSnapshot-CpNFH4zd.mjs.map → cloudflareSnapshot-CjPk6xYL.mjs.map} +1 -1
- package/dist/{deploy-D2tQrtN9.mjs → deploy-DxUCsnnc.mjs} +8 -8
- package/dist/deploy-DxUCsnnc.mjs.map +1 -0
- package/dist/{destroy-CEv14T0X.mjs → destroy-BtHfgI6x.mjs} +9 -9
- package/dist/destroy-BtHfgI6x.mjs.map +1 -0
- package/dist/{destroy-tenant-Ugu7Y1EH.mjs → destroy-tenant-CT_uzdl7.mjs} +2 -2
- package/dist/{destroy-tenant-Ugu7Y1EH.mjs.map → destroy-tenant-CT_uzdl7.mjs.map} +1 -1
- package/dist/{dev-vGQIP7tD.mjs → dev-BTBTiCyd.mjs} +7 -7
- package/dist/dev-BTBTiCyd.mjs.map +1 -0
- package/dist/{drift-C3wIrNyg.mjs → drift-1nXkTBh5.mjs} +4 -4
- package/dist/{drift-C7pgj4Iw.mjs → drift-pb0PoOfK.mjs} +6 -6
- package/dist/drift-pb0PoOfK.mjs.map +1 -0
- package/dist/{emit-vpibELHm.mjs → emit-TUYG7bi5.mjs} +2 -2
- package/dist/{emit-vpibELHm.mjs.map → emit-TUYG7bi5.mjs.map} +1 -1
- package/dist/{events-yk4J3l0M.mjs → events-B0bvWdiQ.mjs} +2 -2
- package/dist/{events-yk4J3l0M.mjs.map → events-B0bvWdiQ.mjs.map} +1 -1
- package/dist/{generator-7b97QsuM.mjs → generator-ZTEeHlft.mjs} +2 -2
- package/dist/{generator-7b97QsuM.mjs.map → generator-ZTEeHlft.mjs.map} +1 -1
- package/dist/{import-CZ6509_t.mjs → import-yXAfQXg2.mjs} +4 -4
- package/dist/import-yXAfQXg2.mjs.map +1 -0
- package/dist/{migrate-DDBMzPtR.mjs → migrate-C0xs4MUW.mjs} +5 -5
- package/dist/migrate-C0xs4MUW.mjs.map +1 -0
- package/dist/{plan-Dot2VV7R.mjs → plan-C8oQWM35.mjs} +8 -8
- package/dist/{plan-Dot2VV7R.mjs.map → plan-C8oQWM35.mjs.map} +1 -1
- package/dist/{provision-tenant-C2EL79oz.mjs → provision-tenant-Dh3-p5ZK.mjs} +2 -2
- package/dist/{provision-tenant-C2EL79oz.mjs.map → provision-tenant-Dh3-p5ZK.mjs.map} +1 -1
- package/dist/{registry-D-vo1TTV.mjs → registry-BlHEOKlN.mjs} +2 -2
- package/dist/{registry-D-vo1TTV.mjs.map → registry-BlHEOKlN.mjs.map} +1 -1
- package/dist/{status-_k3a77Fw.mjs → status-CZBPBtNy.mjs} +4 -4
- package/dist/status-CZBPBtNy.mjs.map +1 -0
- package/dist/{sync-C5RjLfgk.mjs → sync-Cjml_emC.mjs} +5 -5
- package/dist/sync-Cjml_emC.mjs.map +1 -0
- package/dist/tamer.mjs +97 -55
- package/dist/tamer.mjs.map +1 -1
- package/dist/{types-CqmFeIBf.mjs → types-CN3DpOC2.mjs} +5 -5
- package/dist/types-CN3DpOC2.mjs.map +1 -0
- package/dist/{verifyPlanFile-DSO-yS64.mjs → verifyPlanFile-DxO0Ad6o.mjs} +2 -2
- package/dist/{verifyPlanFile-DSO-yS64.mjs.map → verifyPlanFile-DxO0Ad6o.mjs.map} +1 -1
- package/dist/{wfp-delete-C-1pIY3Z.mjs → wfp-delete-DJXpe2B7.mjs} +2 -2
- package/dist/{wfp-delete-C-1pIY3Z.mjs.map → wfp-delete-DJXpe2B7.mjs.map} +1 -1
- package/dist/{wfp-put-D0tDs0J5.mjs → wfp-put-BMSAGpZ6.mjs} +2 -2
- package/dist/{wfp-put-D0tDs0J5.mjs.map → wfp-put-BMSAGpZ6.mjs.map} +1 -1
- package/dist/{worker-route-RexL6xCk.mjs → worker-route-C7kgtUXH.mjs} +2 -2
- package/dist/{worker-route-RexL6xCk.mjs.map → worker-route-C7kgtUXH.mjs.map} +1 -1
- package/dist/{workers-CS0tlbdk.mjs → workers-Bq1AY8aB.mjs} +2 -2
- package/dist/{workers-CS0tlbdk.mjs.map → workers-Bq1AY8aB.mjs.map} +1 -1
- package/package.json +1 -1
- package/dist/apply-Cz1lxAOp.mjs.map +0 -1
- package/dist/deploy-D2tQrtN9.mjs.map +0 -1
- package/dist/destroy-CEv14T0X.mjs.map +0 -1
- package/dist/dev-vGQIP7tD.mjs.map +0 -1
- package/dist/drift-C7pgj4Iw.mjs.map +0 -1
- package/dist/import-CZ6509_t.mjs.map +0 -1
- package/dist/migrate-DDBMzPtR.mjs.map +0 -1
- package/dist/status-_k3a77Fw.mjs.map +0 -1
- package/dist/sync-C5RjLfgk.mjs.map +0 -1
- package/dist/types-CqmFeIBf.mjs.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
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 getWorkers, C as stackNameForConfig, D as resolveDeployedWorkerName, I as CFApiClient, L as cloudflareAccountIdFromEnv, T as mergeWorkerConfigForResourcePick, V as loadConfig, f as fetchStackImports, h as StateManager, m as scanConfigForImports, u as namingFromConfig, y as tenantStateKey, z as getConfigBaseDir } from "./tamer.mjs";
|
|
3
|
+
import { n as resourceModules } from "./registry-BlHEOKlN.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";
|
|
@@ -58,8 +58,8 @@ function dnsRecordStatus(resources, env, state) {
|
|
|
58
58
|
async function runStatus(options) {
|
|
59
59
|
const env = options.env ?? "local";
|
|
60
60
|
const configPath = options.configPath;
|
|
61
|
-
const baseDir = process.cwd();
|
|
62
61
|
const config = await loadConfig(configPath, { env });
|
|
62
|
+
const baseDir = getConfigBaseDir();
|
|
63
63
|
const accountId = config.account_id ?? cloudflareAccountIdFromEnv();
|
|
64
64
|
if (!accountId) throw new Error("account_id required in config or CLOUDFLARE_ACCOUNT_ID env var");
|
|
65
65
|
const naming = namingFromConfig(config);
|
|
@@ -193,4 +193,4 @@ async function runStatus(options) {
|
|
|
193
193
|
|
|
194
194
|
//#endregion
|
|
195
195
|
export { runStatus };
|
|
196
|
-
//# sourceMappingURL=status-
|
|
196
|
+
//# sourceMappingURL=status-CZBPBtNy.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-CZBPBtNy.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,17 +1,17 @@
|
|
|
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 getWorkers, C as stackNameForConfig, I as CFApiClient, L as cloudflareAccountIdFromEnv, T as mergeWorkerConfigForResourcePick, V as loadConfig, f as fetchStackImports, h as StateManager, u as namingFromConfig, z as getConfigBaseDir } from "./tamer.mjs";
|
|
3
|
+
import { n as resourceModules } from "./registry-BlHEOKlN.mjs";
|
|
4
4
|
import "./r2S3EmptyBucket-B9_pHfvB.mjs";
|
|
5
5
|
import { n as dispatchNamespaceSync, t as dnsRecordSync } from "./dns-records.sync-PoahWQjY.mjs";
|
|
6
6
|
import { i as logpushJobSync } from "./logpush-job-GqVKG_HI.mjs";
|
|
7
|
-
import { i as workerRouteSync } from "./worker-route-
|
|
7
|
+
import { i as workerRouteSync } from "./worker-route-C7kgtUXH.mjs";
|
|
8
8
|
|
|
9
9
|
//#region src/cli/commands/sync.ts
|
|
10
10
|
async function runSync(options) {
|
|
11
11
|
const env = options.env ?? "local";
|
|
12
12
|
const configPath = options.configPath;
|
|
13
|
-
const baseDir = process.cwd();
|
|
14
13
|
const config = await loadConfig(configPath, { env });
|
|
14
|
+
const baseDir = getConfigBaseDir();
|
|
15
15
|
const accountId = config.account_id ?? cloudflareAccountIdFromEnv();
|
|
16
16
|
if (!accountId) throw new Error("account_id required in config or CLOUDFLARE_ACCOUNT_ID env var");
|
|
17
17
|
const api = new CFApiClient(accountId);
|
|
@@ -85,4 +85,4 @@ async function runSync(options) {
|
|
|
85
85
|
|
|
86
86
|
//#endregion
|
|
87
87
|
export { runSync };
|
|
88
|
-
//# sourceMappingURL=sync-
|
|
88
|
+
//# sourceMappingURL=sync-Cjml_emC.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-Cjml_emC.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
|
@@ -4206,7 +4206,41 @@ function rejectLegacyTamerConfigFile(context) {
|
|
|
4206
4206
|
throw new Error(`${context}: tamer.config.ts is not supported. Move the default export to tamer/project.config.ts and optional per-env overlays to tamer/env/<env>.config.ts (or use tamer.project.config.ts at the repo root with optional tamer.env.<env>.ts).`);
|
|
4207
4207
|
}
|
|
4208
4208
|
/**
|
|
4209
|
-
*
|
|
4209
|
+
* Check a single directory for Tamer config files. Returns the resolved
|
|
4210
|
+
* sources if found, or undefined to continue walking up.
|
|
4211
|
+
*/
|
|
4212
|
+
function checkDir(dir, env) {
|
|
4213
|
+
const nestedProject = resolve(dir, "tamer", "project.config.ts");
|
|
4214
|
+
if (existsSync(nestedProject)) {
|
|
4215
|
+
let overlay = null;
|
|
4216
|
+
if (env) {
|
|
4217
|
+
const candidate = overlayPathForNestedLayout(dirname(nestedProject), env);
|
|
4218
|
+
if (existsSync(candidate)) overlay = candidate;
|
|
4219
|
+
}
|
|
4220
|
+
return {
|
|
4221
|
+
mode: "merged",
|
|
4222
|
+
projectPath: nestedProject,
|
|
4223
|
+
overlayPath: overlay
|
|
4224
|
+
};
|
|
4225
|
+
}
|
|
4226
|
+
const flatProject = resolve(dir, "tamer.project.config.ts");
|
|
4227
|
+
if (existsSync(flatProject)) {
|
|
4228
|
+
let overlay = null;
|
|
4229
|
+
if (env) {
|
|
4230
|
+
const candidate = overlayPathForFlatLayout(dir, env);
|
|
4231
|
+
if (existsSync(candidate)) overlay = candidate;
|
|
4232
|
+
}
|
|
4233
|
+
return {
|
|
4234
|
+
mode: "merged",
|
|
4235
|
+
projectPath: flatProject,
|
|
4236
|
+
overlayPath: overlay
|
|
4237
|
+
};
|
|
4238
|
+
}
|
|
4239
|
+
if (existsSync(resolve(dir, "tamer.config.ts"))) rejectLegacyTamerConfigFile("Config discovery");
|
|
4240
|
+
}
|
|
4241
|
+
/**
|
|
4242
|
+
* Resolve which config file(s) to load. Walks up from `cwd` to the filesystem
|
|
4243
|
+
* root, so commands work from any subdirectory (like `git` or `npm`).
|
|
4210
4244
|
*
|
|
4211
4245
|
* - **Merged:** `tamer/project.config.ts` or `tamer.project.config.ts`, plus optional env overlay.
|
|
4212
4246
|
* - **Single:** explicit `--config` path to any `.ts` file **except** `tamer.config.ts` (e.g. alternate snapshots in tests).
|
|
@@ -4237,34 +4271,15 @@ function resolveConfigSources(cwd, explicitConfigPath, env) {
|
|
|
4237
4271
|
path: abs
|
|
4238
4272
|
};
|
|
4239
4273
|
}
|
|
4240
|
-
|
|
4241
|
-
|
|
4242
|
-
|
|
4243
|
-
if (
|
|
4244
|
-
|
|
4245
|
-
|
|
4246
|
-
|
|
4247
|
-
return {
|
|
4248
|
-
mode: "merged",
|
|
4249
|
-
projectPath: nestedProject,
|
|
4250
|
-
overlayPath: overlay
|
|
4251
|
-
};
|
|
4252
|
-
}
|
|
4253
|
-
const flatProject = resolve(cwd, "tamer.project.config.ts");
|
|
4254
|
-
if (existsSync(flatProject)) {
|
|
4255
|
-
let overlay = null;
|
|
4256
|
-
if (env) {
|
|
4257
|
-
const candidate = overlayPathForFlatLayout(cwd, env);
|
|
4258
|
-
if (existsSync(candidate)) overlay = candidate;
|
|
4259
|
-
}
|
|
4260
|
-
return {
|
|
4261
|
-
mode: "merged",
|
|
4262
|
-
projectPath: flatProject,
|
|
4263
|
-
overlayPath: overlay
|
|
4264
|
-
};
|
|
4274
|
+
let dir = cwd;
|
|
4275
|
+
for (;;) {
|
|
4276
|
+
const found = checkDir(dir, env);
|
|
4277
|
+
if (found) return found;
|
|
4278
|
+
const parent = dirname(dir);
|
|
4279
|
+
if (parent === dir) break;
|
|
4280
|
+
dir = parent;
|
|
4265
4281
|
}
|
|
4266
|
-
|
|
4267
|
-
throw new Error(`No Tamer project config under ${cwd}. Create tamer/project.config.ts (or tamer.project.config.ts at the repo root).`);
|
|
4282
|
+
throw new Error(`No Tamer project config found walking up from ${cwd}. Create tamer/project.config.ts (or tamer.project.config.ts at the repo root).`);
|
|
4268
4283
|
}
|
|
4269
4284
|
|
|
4270
4285
|
//#endregion
|
|
@@ -4546,8 +4561,23 @@ const CfiConfigSchema = object({
|
|
|
4546
4561
|
worker: WorkerConfigSchema.optional(),
|
|
4547
4562
|
workers: record(string(), WorkerConfigSchema).optional()
|
|
4548
4563
|
}).refine((data) => (data.worker ?? data.workers) && !(data.worker && data.workers), { error: "Must have either worker or workers, not both" });
|
|
4564
|
+
/**
|
|
4565
|
+
* Directory where the config was discovered. When config is found via
|
|
4566
|
+
* walk-up from a subdirectory, this is the parent directory containing the
|
|
4567
|
+
* config — use it as `baseDir` for worker `path` resolution instead of
|
|
4568
|
+
* `process.cwd()`.
|
|
4569
|
+
*/
|
|
4570
|
+
let _configBaseDir = process.cwd();
|
|
4571
|
+
function getConfigBaseDir() {
|
|
4572
|
+
return _configBaseDir;
|
|
4573
|
+
}
|
|
4549
4574
|
async function loadConfig(configPath, options = {}) {
|
|
4550
|
-
const
|
|
4575
|
+
const cwd = options.cwd ?? process.cwd();
|
|
4576
|
+
const sources = resolveConfigSources(cwd, configPath, options.env);
|
|
4577
|
+
if (sources.mode === "merged") {
|
|
4578
|
+
const projectDir = dirname(sources.projectPath);
|
|
4579
|
+
_configBaseDir = basename(projectDir) === "tamer" ? dirname(projectDir) : projectDir;
|
|
4580
|
+
} else _configBaseDir = cwd;
|
|
4551
4581
|
let raw;
|
|
4552
4582
|
if (sources.mode === "single") {
|
|
4553
4583
|
raw = (await import(sources.path)).default;
|
|
@@ -7615,7 +7645,7 @@ function assertSecretName(name) {
|
|
|
7615
7645
|
}
|
|
7616
7646
|
/** Resolve worker dir + declared secret names for `secrets load`. */
|
|
7617
7647
|
async function resolveWorkerSecretsLoadTarget(ctx, workerKey, options) {
|
|
7618
|
-
const baseDir =
|
|
7648
|
+
const baseDir = getConfigBaseDir();
|
|
7619
7649
|
const workers = await getWorkers(ctx.config, baseDir);
|
|
7620
7650
|
const hit = workers.find(([key]) => key === workerKey);
|
|
7621
7651
|
if (!hit) {
|
|
@@ -8170,8 +8200,17 @@ const STATUS_LABEL = {
|
|
|
8170
8200
|
removed_from_vault: "removed from vault",
|
|
8171
8201
|
undeclared_on_worker: "not in secrets.required"
|
|
8172
8202
|
};
|
|
8173
|
-
|
|
8174
|
-
|
|
8203
|
+
/**
|
|
8204
|
+
* Only `declared_no_value` (secret declared in config but missing from vault)
|
|
8205
|
+
* is a hard failure — that's the "you forgot to set a secret" case that
|
|
8206
|
+
* should block CI before deploy.
|
|
8207
|
+
*
|
|
8208
|
+
* `never_deployed` and `rotated_not_deployed` are normal pre-deploy states:
|
|
8209
|
+
* the secret IS in the vault, deploy will push it. They're reported
|
|
8210
|
+
* informationally but don't fail the command.
|
|
8211
|
+
*/
|
|
8212
|
+
function isDeclaredFailure(status) {
|
|
8213
|
+
return status === "declared_no_value" || status === "removed_from_vault";
|
|
8175
8214
|
}
|
|
8176
8215
|
function sortEntries(entries) {
|
|
8177
8216
|
return [...entries].sort((a, b) => secretDerivedName(a.worker, a.name).localeCompare(secretDerivedName(b.worker, b.name)));
|
|
@@ -8218,13 +8257,16 @@ async function runSecretsVerify(options) {
|
|
|
8218
8257
|
for (const entry of onWorkerOnly) printEntry(entry);
|
|
8219
8258
|
console.log("");
|
|
8220
8259
|
}
|
|
8221
|
-
const
|
|
8222
|
-
|
|
8223
|
-
|
|
8224
|
-
|
|
8260
|
+
const failures = declared.filter((e) => isDeclaredFailure(e.status));
|
|
8261
|
+
const pending = declared.filter((e) => !isDeclaredFailure(e.status) && e.status !== "in_sync");
|
|
8262
|
+
if (failures.length === 0) {
|
|
8263
|
+
const parts = ["All declared secrets are in the vault."];
|
|
8264
|
+
if (pending.length > 0) parts.push(`${pending.length} will be pushed on next deploy.`);
|
|
8265
|
+
if (onWorkerOnly.length > 0) parts.push(`${onWorkerOnly.length} on worker but not in config (informational only).`);
|
|
8266
|
+
console.log(`${parts.join(" ")}\n`);
|
|
8225
8267
|
return 0;
|
|
8226
8268
|
}
|
|
8227
|
-
console.log(`${
|
|
8269
|
+
console.log(`${failures.length} declared secret(s) missing from vault — run \`tamer secrets set\` or \`tamer secrets load\` before deploying.\n`);
|
|
8228
8270
|
return 1;
|
|
8229
8271
|
}
|
|
8230
8272
|
|
|
@@ -8704,14 +8746,14 @@ async function main() {
|
|
|
8704
8746
|
try {
|
|
8705
8747
|
switch (command) {
|
|
8706
8748
|
case "bootstrap":
|
|
8707
|
-
await import("./bootstrap-
|
|
8749
|
+
await import("./bootstrap-BYxkCI8L.mjs").then((m) => m.runBootstrap(parseBootstrapArgs(rest)));
|
|
8708
8750
|
break;
|
|
8709
8751
|
case "sync":
|
|
8710
|
-
await import("./sync-
|
|
8752
|
+
await import("./sync-Cjml_emC.mjs").then((m) => m.runSync(parseSyncArgs(rest)));
|
|
8711
8753
|
break;
|
|
8712
8754
|
case "apply": {
|
|
8713
8755
|
const a = parseApplyArgs(rest);
|
|
8714
|
-
await import("./apply-
|
|
8756
|
+
await import("./apply-BL5JfcZI.mjs").then((m) => m.runApply({
|
|
8715
8757
|
env: a.env,
|
|
8716
8758
|
addShard: a.addShard,
|
|
8717
8759
|
configPath: a.configPath,
|
|
@@ -8723,11 +8765,11 @@ async function main() {
|
|
|
8723
8765
|
break;
|
|
8724
8766
|
}
|
|
8725
8767
|
case "dev":
|
|
8726
|
-
await import("./dev-
|
|
8768
|
+
await import("./dev-BTBTiCyd.mjs").then((m) => m.runDev(parseDevArgs(rest)));
|
|
8727
8769
|
break;
|
|
8728
8770
|
case "deploy": {
|
|
8729
8771
|
const d = parseDeployArgs(rest);
|
|
8730
|
-
await import("./deploy-
|
|
8772
|
+
await import("./deploy-DxUCsnnc.mjs").then((m) => m.runDeploy({
|
|
8731
8773
|
worker: d.worker,
|
|
8732
8774
|
env: d.env,
|
|
8733
8775
|
configPath: d.configPath,
|
|
@@ -8736,23 +8778,23 @@ async function main() {
|
|
|
8736
8778
|
break;
|
|
8737
8779
|
}
|
|
8738
8780
|
case "migrate":
|
|
8739
|
-
await import("./migrate-
|
|
8781
|
+
await import("./migrate-C0xs4MUW.mjs").then((m) => m.runMigrate(parseMigrateArgs(rest)));
|
|
8740
8782
|
break;
|
|
8741
8783
|
case "types":
|
|
8742
|
-
await import("./types-
|
|
8784
|
+
await import("./types-CN3DpOC2.mjs").then((m) => m.runTypes(parseTypesArgs(rest)));
|
|
8743
8785
|
break;
|
|
8744
8786
|
case "status":
|
|
8745
|
-
await import("./status-
|
|
8787
|
+
await import("./status-CZBPBtNy.mjs").then((m) => m.runStatus(parseStatusArgs(rest)));
|
|
8746
8788
|
break;
|
|
8747
8789
|
case "events":
|
|
8748
|
-
await import("./events-
|
|
8790
|
+
await import("./events-B0bvWdiQ.mjs").then((m) => m.runEvents(parseEventsArgs(rest)));
|
|
8749
8791
|
break;
|
|
8750
8792
|
case "drift":
|
|
8751
|
-
exitStatus = await import("./drift-
|
|
8793
|
+
exitStatus = await import("./drift-1nXkTBh5.mjs").then((m) => m.runDrift(parseDriftArgs(rest)));
|
|
8752
8794
|
break;
|
|
8753
8795
|
case "plan": {
|
|
8754
8796
|
const p = parsePlanArgs(rest);
|
|
8755
|
-
exitStatus = await import("./plan-
|
|
8797
|
+
exitStatus = await import("./plan-C8oQWM35.mjs").then((m) => m.runPlan({
|
|
8756
8798
|
env: p.env,
|
|
8757
8799
|
configPath: p.configPath,
|
|
8758
8800
|
json: p.json,
|
|
@@ -8764,14 +8806,14 @@ async function main() {
|
|
|
8764
8806
|
break;
|
|
8765
8807
|
}
|
|
8766
8808
|
case "import":
|
|
8767
|
-
await import("./import-
|
|
8809
|
+
await import("./import-yXAfQXg2.mjs").then((m) => m.runImport(parseImportArgs(rest)));
|
|
8768
8810
|
break;
|
|
8769
8811
|
case "doctor":
|
|
8770
8812
|
exitStatus = await import("./doctor-BnsOxqnA.mjs").then((m) => m.runDoctor(parseDoctorArgs(rest)));
|
|
8771
8813
|
break;
|
|
8772
8814
|
case "provision-tenant": {
|
|
8773
8815
|
const p = parseProvisionTenantArgs(rest);
|
|
8774
|
-
await import("./provision-tenant-
|
|
8816
|
+
await import("./provision-tenant-Dh3-p5ZK.mjs").then((m) => m.runProvisionTenant({
|
|
8775
8817
|
env: p.env,
|
|
8776
8818
|
product: p.product,
|
|
8777
8819
|
workspace: p.workspace,
|
|
@@ -8788,7 +8830,7 @@ async function main() {
|
|
|
8788
8830
|
}
|
|
8789
8831
|
case "destroy-tenant": {
|
|
8790
8832
|
const t = parseDestroyTenantArgs(rest);
|
|
8791
|
-
await import("./destroy-tenant-
|
|
8833
|
+
await import("./destroy-tenant-CT_uzdl7.mjs").then((m) => m.runDestroyTenant({
|
|
8792
8834
|
env: t.env,
|
|
8793
8835
|
product: t.product,
|
|
8794
8836
|
workspace: t.workspace,
|
|
@@ -8801,7 +8843,7 @@ async function main() {
|
|
|
8801
8843
|
}
|
|
8802
8844
|
case "destroy": {
|
|
8803
8845
|
const d = parseDestroyArgs(rest);
|
|
8804
|
-
await import("./destroy-
|
|
8846
|
+
await import("./destroy-BtHfgI6x.mjs").then((m) => m.runDestroy({
|
|
8805
8847
|
env: d.env,
|
|
8806
8848
|
force: d.force,
|
|
8807
8849
|
skipWorkers: d.skipWorkers,
|
|
@@ -8816,12 +8858,12 @@ async function main() {
|
|
|
8816
8858
|
case "wfp": {
|
|
8817
8859
|
const [sub, ...wfpRest] = rest;
|
|
8818
8860
|
if (sub === "put") {
|
|
8819
|
-
const { parseWfpPutArgs, runWfpPut } = await import("./wfp-put-
|
|
8861
|
+
const { parseWfpPutArgs, runWfpPut } = await import("./wfp-put-BMSAGpZ6.mjs");
|
|
8820
8862
|
await runWfpPut(parseWfpPutArgs(wfpRest));
|
|
8821
8863
|
break;
|
|
8822
8864
|
}
|
|
8823
8865
|
if (sub === "delete") {
|
|
8824
|
-
const { parseWfpDeleteArgs, runWfpDelete } = await import("./wfp-delete-
|
|
8866
|
+
const { parseWfpDeleteArgs, runWfpDelete } = await import("./wfp-delete-DJXpe2B7.mjs");
|
|
8825
8867
|
await runWfpDelete(parseWfpDeleteArgs(wfpRest));
|
|
8826
8868
|
break;
|
|
8827
8869
|
}
|
|
@@ -8921,5 +8963,5 @@ Environment variables (same as Wrangler):
|
|
|
8921
8963
|
main();
|
|
8922
8964
|
|
|
8923
8965
|
//#endregion
|
|
8924
|
-
export { resolveReferencesInString as A,
|
|
8966
|
+
export { resolveReferencesInString as A, getWorkers as B, stackNameForConfig as C, resolveDeployedWorkerName as D, mergedWorkerConfigForEnv as E, ensureTamerSecretsDatabase as F, CFApiClient as I, cloudflareAccountIdFromEnv as L, effectiveDispatchNamespaceName as M, isEphemeralEnv as N, resolveWorkerConfig as O, deleteEnvSecretRows as P, cloudflareApiTokenFromEnv as R, ensureTamerStateDatabase as S, mergeWorkerConfigForResourcePick as T, loadConfig 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, wranglerConfigCliArgs as j, rewriteIntraStackServiceTargets 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, buildIntraStackScriptNameMap as w, deleteEnvStateRows as x, tenantStateKey as y, getConfigBaseDir as z };
|
|
8925
8967
|
//# sourceMappingURL=tamer.mjs.map
|