@absolutejs/deploy 0.12.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -0
- package/dist/cloudflare.js +34 -1
- package/dist/cloudflare.js.map +2 -2
- package/dist/digitalocean.js +34 -1
- package/dist/digitalocean.js.map +2 -2
- package/dist/digitaloceanDns.js +34 -1
- package/dist/digitaloceanDns.js.map +2 -2
- package/dist/digitaloceanInfrastructure.d.ts +26 -0
- package/dist/digitaloceanInfrastructure.js +543 -0
- package/dist/digitaloceanInfrastructure.js.map +13 -0
- package/dist/dns.js +34 -1
- package/dist/dns.js.map +2 -2
- package/dist/env.js +34 -1
- package/dist/env.js.map +2 -2
- package/dist/gcp.d.ts +23 -0
- package/dist/gcp.js +10474 -0
- package/dist/gcp.js.map +90 -0
- package/dist/hetzner.js +34 -1
- package/dist/hetzner.js.map +2 -2
- package/dist/hetznerDns.js +34 -1
- package/dist/hetznerDns.js.map +2 -2
- package/dist/index.js +34 -1
- package/dist/index.js.map +2 -2
- package/dist/infrastructure.d.ts +35 -0
- package/dist/infrastructure.js +4 -0
- package/dist/infrastructure.js.map +9 -0
- package/dist/linode.js +34 -1
- package/dist/linode.js.map +2 -2
- package/dist/preview.js +34 -1
- package/dist/preview.js.map +2 -2
- package/dist/route53.js +34 -1
- package/dist/route53.js.map +2 -2
- package/dist/tls.d.ts +11 -0
- package/dist/tls.js +44 -4
- package/dist/tls.js.map +3 -3
- package/dist/vultr.js +34 -1
- package/dist/vultr.js.map +2 -2
- package/package.json +20 -2
package/dist/linode.js.map
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"/**\n * Shared \"cloud-provider Target\" plumbing used by the\n * provider-specific adapters (`./digitalocean`, `./hetzner`, future\n * `./linode`, `./vultr`, etc.).\n *\n * The provider supplies a small `CloudTargetHooks` bag that knows\n * the provider's:\n *\n * - find-by-name lookup\n * - create call (closure over create params)\n * - fetch-by-id (used to poll for `active`)\n * - destroy-by-id\n * - status + ipv4 + id extraction from the provider's Server shape\n * - readiness predicate (status reached the terminal \"running\" value)\n *\n * `createCloudTarget()` does the universal machinery: provision-or-\n * reuse, poll until ready + IPv4, wait for SSH probe, build\n * `sshTarget` against the IPv4, return the Target wrapped with\n * `{ id, ipv4, destroy() }`.\n *\n * The public adapter (e.g. `digitalOceanTarget`) is a 30-line facade\n * that wires its provider-specific bits and renames `id` → `dropletId`\n * on the way out.\n */\n\nimport type { Target } from './targets';\nimport { sshTarget } from './targets';\n\n/** Provider-specific hooks. Keep these pure of network IO timing — the helper schedules. */\nexport type CloudTargetHooks<Server, Id = number> = {\n\t/** Find a server by name. Returns undefined if absent. */\n\tfindByName: (name: string) => Promise<Server | undefined>;\n\t/** Create the server. Closure over provider-specific create params. */\n\tcreate: () => Promise<Server>;\n\t/** Fetch a fresh copy of the server by id. Used to poll. */\n\tfetch: (id: Id) => Promise<Server>;\n\t/** Destroy a server by id. 404 should be treated as idempotent success. */\n\tdestroy: (id: Id) => Promise<void>;\n\t/** True when the server has reached its terminal \"running\" status. */\n\tisReady: (server: Server) => boolean;\n\t/** Extract the provider-assigned id (number for DO/Hetzner/Linode, string for Vultr). */\n\tgetId: (server: Server) => Id;\n\t/** Extract the public IPv4. Returns undefined while one is being assigned. */\n\tgetIpv4: (server: Server) => string | undefined;\n\t/** Extract the current status as a string (for log lines). */\n\tgetStatus: (server: Server) => string;\n};\n\nexport type CloudTargetOptions = {\n\t/** Provider's idempotency key (server name). */\n\tname: string;\n\t/** Region / location label — used in the \"creating\" log line. */\n\tregion: string;\n\n\t/** SSH login user. Default `'root'`. */\n\tuser?: string;\n\t/** SSH identity file. */\n\tidentity?: string;\n\t/** SSH port. Default 22. */\n\tport?: number;\n\n\t/** Default 5 min. */\n\tprovisionTimeoutMs?: number;\n\t/** Default 2 min. */\n\tsshReadinessTimeoutMs?: number;\n\t/** Default 5 s. */\n\tpollIntervalMs?: number;\n\n\t/** Called with status updates. */\n\tonLog?: (line: string) => void;\n\t/** Override SSH probe — tests skip real TCP IO. */\n\tprobeSsh?: (host: string, port: number) => Promise<boolean>;\n\t/** Override sleep — tests skip real waits. */\n\tsleep?: (ms: number) => Promise<void>;\n\t/** Override clock — tests inject deterministic timestamps. */\n\tnow?: () => number;\n\n\t/**\n\t * Short log prefix, e.g. `'[do]'` or `'[hetzner]'`. Threaded through\n\t * every log line so multi-provider deploys distinguish output.\n\t */\n\tlogPrefix: string;\n\t/**\n\t * Provider's word for the entity in log copy — `'droplet'` for DO,\n\t * `'server'` for Hetzner. Preserves provider-accurate output.\n\t */\n\tentityWord: string;\n\t/**\n\t * Build the Target's `description` field. Receives the resolved\n\t * IPv4 + the wrapped sshTarget description.\n\t */\n\tdescribeTarget: (sshDescription: string) => string;\n};\n\nexport type CloudTargetResult<Id = number> = {\n\tid: Id;\n\tipv4: string;\n\tdescription: string;\n\texec: Target['exec'];\n\tupload: Target['upload'];\n\tclose?: Target['close'];\n\tdestroy: () => Promise<void>;\n};\n\nconst defaultSleep = (ms: number): Promise<void> =>\n\tnew Promise((resolve) => setTimeout(resolve, ms));\n\nconst defaultProbeSsh = async (host: string, port: number): Promise<boolean> => {\n\tconst PROBE_TIMEOUT_MS = 2_000;\n\treturn new Promise<boolean>((resolve) => {\n\t\tlet settled = false;\n\t\tconst settle = (value: boolean) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tresolve(value);\n\t\t};\n\t\tconst timer = setTimeout(() => settle(false), PROBE_TIMEOUT_MS);\n\t\tBun.connect({\n\t\t\thostname: host,\n\t\t\tport,\n\t\t\tsocket: {\n\t\t\t\tdata: () => {},\n\t\t\t\terror: () => {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\tsettle(false);\n\t\t\t\t},\n\t\t\t\topen: (socket) => {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\tsocket.end();\n\t\t\t\t\tsettle(true);\n\t\t\t\t}\n\t\t\t}\n\t\t}).catch(() => {\n\t\t\tclearTimeout(timer);\n\t\t\tsettle(false);\n\t\t});\n\t});\n};\n\n/**\n * The shared provision-or-reuse + wait-for-ready + wait-for-SSH\n * pipeline. Provider-specific adapters wire their `CloudTargetHooks`\n * + their option-shape mapping and return a typed result.\n */\nexport const createCloudTarget = async <Server, Id = number>(\n\thooks: CloudTargetHooks<Server, Id>,\n\toptions: CloudTargetOptions\n): Promise<CloudTargetResult<Id>> => {\n\tconst log = options.onLog ?? (() => {});\n\tconst probeSsh = options.probeSsh ?? defaultProbeSsh;\n\tconst sleep = options.sleep ?? defaultSleep;\n\tconst now = options.now ?? Date.now;\n\tconst pollMs = options.pollIntervalMs ?? 5_000;\n\tconst provisionTimeout = options.provisionTimeoutMs ?? 5 * 60_000;\n\tconst sshTimeout = options.sshReadinessTimeoutMs ?? 2 * 60_000;\n\tconst port = options.port ?? 22;\n\tconst prefix = options.logPrefix;\n\tconst noun = options.entityWord;\n\n\tconst existing = await hooks.findByName(options.name);\n\tlet current: Server;\n\tif (existing === undefined) {\n\t\tlog(`${prefix} creating ${noun} \"${options.name}\" in ${options.region}`);\n\t\tcurrent = await hooks.create();\n\t} else {\n\t\tlog(\n\t\t\t`${prefix} reusing ${noun} \"${options.name}\" (id ${hooks.getId(existing)}, status ${hooks.getStatus(existing)})`\n\t\t);\n\t\tcurrent = existing;\n\t}\n\n\t// Wait for status=ready AND public IPv4 assigned.\n\tconst provisionStart = now();\n\tlet ipv4 = hooks.getIpv4(current);\n\twhile (!hooks.isReady(current) || ipv4 === undefined) {\n\t\tif (now() - provisionStart > provisionTimeout) {\n\t\t\tthrow new Error(\n\t\t\t\t`${prefix} provision timeout after ${provisionTimeout}ms — ${noun} ${hooks.getId(current)} status \"${hooks.getStatus(current)}\", ipv4 ${ipv4 ?? '(unassigned)'}`\n\t\t\t);\n\t\t}\n\t\tawait sleep(pollMs);\n\t\tcurrent = await hooks.fetch(hooks.getId(current));\n\t\tipv4 = hooks.getIpv4(current);\n\t\tlog(\n\t\t\t`${prefix} poll: status=${hooks.getStatus(current)} ipv4=${ipv4 ?? '(none yet)'}`\n\t\t);\n\t}\n\tlog(`${prefix} ${noun} ready at ${ipv4}`);\n\n\t// Wait for SSH readiness.\n\tconst sshStart = now();\n\twhile (!(await probeSsh(ipv4, port))) {\n\t\tif (now() - sshStart > sshTimeout) {\n\t\t\tthrow new Error(\n\t\t\t\t`${prefix} SSH readiness timeout after ${sshTimeout}ms — ${ipv4}:${port} did not accept connections`\n\t\t\t);\n\t\t}\n\t\tawait sleep(pollMs);\n\t\tlog(`${prefix} waiting on ssh ${ipv4}:${port}`);\n\t}\n\tlog(`${prefix} ssh ready at ${ipv4}:${port}`);\n\n\tconst ssh = sshTarget({\n\t\thost: ipv4,\n\t\t...(options.user !== undefined ? { user: options.user } : {}),\n\t\t...(options.identity !== undefined ? { identity: options.identity } : {}),\n\t\t...(options.port !== undefined ? { port: options.port } : {})\n\t});\n\n\tconst id = hooks.getId(current);\n\tconst resolvedIpv4 = ipv4;\n\n\treturn {\n\t\tdescription: options.describeTarget(ssh.description),\n\t\tdestroy: () =>\n\t\t\thooks.destroy(id).then(() => {\n\t\t\t\tlog(`${prefix} destroyed ${noun} ${id}`);\n\t\t\t}),\n\t\texec: ssh.exec,\n\t\tid,\n\t\tipv4: resolvedIpv4,\n\t\tupload: ssh.upload,\n\t\t...(ssh.close !== undefined ? { close: ssh.close } : {})\n\t};\n};\n",
|
|
7
7
|
"/**\n * @absolutejs/deploy/linode — provision-or-reuse Target adapter for\n * Linode (Akamai Cloud) instances. Sibling to digitalOceanTarget +\n * hetznerTarget; same shape, Linode v4 API mappings.\n *\n * Idempotent by label — Linode allows duplicate labels per account\n * but we treat duplicates as drifted state (throw on the second).\n *\n * Narrow LinodeClientLike interface keeps `@linode/api-v4` out as a\n * hard dep. Default client uses `fetch` against `api.linode.com/v4`.\n */\n\nimport type { Target } from './targets';\nimport { createCloudTarget, type CloudTargetHooks } from './cloudTarget';\n\nconst LINODE_API_BASE = 'https://api.linode.com/v4';\n\nexport type LinodeClientLike = {\n\trequest: <T = unknown>(\n\t\tmethod: 'GET' | 'POST' | 'DELETE',\n\t\tpath: string,\n\t\tbody?: unknown\n\t) => Promise<T>;\n};\n\n/** A Linode instance, narrowed to what we inspect. */\nexport type LinodeInstance = {\n\tid: number;\n\tlabel: string;\n\tstatus:\n\t\t| 'running'\n\t\t| 'offline'\n\t\t| 'booting'\n\t\t| 'rebooting'\n\t\t| 'shutting_down'\n\t\t| 'provisioning'\n\t\t| 'deleting'\n\t\t| 'migrating'\n\t\t| 'rebuilding'\n\t\t| 'cloning'\n\t\t| 'restoring'\n\t\t| 'stopped';\n\t/** Linode returns IPv4 as a flat string array; public IPs first. */\n\tipv4: string[];\n\tregion?: string;\n\ttype?: string;\n\ttags?: string[];\n};\n\nexport type LinodeTargetOptions = {\n\t/** Linode Personal Access Token. Required unless `client` is set. */\n\ttoken?: string;\n\t/** Custom client. Overrides token-built default. */\n\tclient?: LinodeClientLike;\n\n\t// ── Instance shape ──────────────────────────────────────────────\n\t/** Instance label. Idempotency key. */\n\tname: string;\n\t/** Region slug — `'us-east'`, `'us-west'`, `'ap-south'`, etc. */\n\tregion: string;\n\t/** Type slug — `'g6-nanode-1'`, `'g6-standard-1'`, etc. */\n\ttype: string;\n\t/** Image slug — e.g. `'linode/ubuntu22.04'`. */\n\timage: string;\n\t/**\n\t * SSH public keys (raw `ssh-rsa AAAA…` / `ssh-ed25519 AAAA…` strings)\n\t * authorized for root login. At least one required for a usable target.\n\t */\n\tsshKeys: ReadonlyArray<string>;\n\t/** Tags applied to the instance. */\n\ttags?: ReadonlyArray<string>;\n\t/** Cloud-init / StackScript user data, base64-encoded by us. */\n\tuserData?: string;\n\t/**\n\t * Root password. Linode requires a password at creation. Defaults to\n\t * a random 32-char string — you should rely on `sshKeys` and never\n\t * type this. Override only if you have a specific reason.\n\t */\n\trootPass?: string;\n\t/** Enable private IP. Default false. */\n\tprivateIp?: boolean;\n\t/** Enable backups. Default false. */\n\tbackupsEnabled?: boolean;\n\n\t// ── SSH wrap ────────────────────────────────────────────────────\n\t/** SSH login user. Default `'root'`. */\n\tuser?: string;\n\t/** SSH identity file. */\n\tidentity?: string;\n\t/** SSH port. Default 22. */\n\tport?: number;\n\n\t// ── Timing ──────────────────────────────────────────────────────\n\tprovisionTimeoutMs?: number;\n\tsshReadinessTimeoutMs?: number;\n\tpollIntervalMs?: number;\n\n\t// ── Observability + injection ───────────────────────────────────\n\tonLog?: (line: string) => void;\n\tprobeSsh?: (host: string, port: number) => Promise<boolean>;\n\tsleep?: (ms: number) => Promise<void>;\n\tnow?: () => number;\n};\n\nexport type LinodeTarget = Target & {\n\treadonly instanceId: number;\n\treadonly ipv4: string;\n\tdestroy: () => Promise<void>;\n};\n\nexport class LinodeError extends Error {\n\treadonly status: number;\n\treadonly body: unknown;\n\tconstructor(message: string, status: number, body: unknown) {\n\t\tsuper(message);\n\t\tthis.name = 'LinodeError';\n\t\tthis.status = status;\n\t\tthis.body = body;\n\t}\n}\n\nexport const createLinodeClient = (\n\ttoken: string,\n\toptions: { baseUrl?: string; fetch?: typeof fetch } = {}\n): LinodeClientLike => {\n\tconst base = options.baseUrl ?? LINODE_API_BASE;\n\tconst f = options.fetch ?? fetch;\n\treturn {\n\t\trequest: async <T>(\n\t\t\tmethod: 'GET' | 'POST' | 'DELETE',\n\t\t\tpath: string,\n\t\t\tbody?: unknown\n\t\t): Promise<T> => {\n\t\t\tconst init: RequestInit = {\n\t\t\t\theaders: {\n\t\t\t\t\tauthorization: `Bearer ${token}`,\n\t\t\t\t\t'content-type': 'application/json'\n\t\t\t\t},\n\t\t\t\tmethod\n\t\t\t};\n\t\t\tif (body !== undefined) init.body = JSON.stringify(body);\n\t\t\tconst response = await f(`${base}${path}`, init);\n\t\t\tif (response.status === 204) return undefined as T;\n\t\t\tconst text = await response.text();\n\t\t\tconst parsed = text.length > 0 ? JSON.parse(text) : undefined;\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new LinodeError(\n\t\t\t\t\t`Linode API ${method} ${path} failed: ${response.status} ${response.statusText}`,\n\t\t\t\t\tresponse.status,\n\t\t\t\t\tparsed\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn parsed as T;\n\t\t}\n\t};\n};\n\nconst resolveClient = (\n\toptions: Pick<LinodeTargetOptions, 'client' | 'token'>\n): LinodeClientLike => {\n\tif (options.client !== undefined) return options.client;\n\tif (options.token !== undefined && options.token.length > 0) {\n\t\treturn createLinodeClient(options.token);\n\t}\n\tthrow new Error(\n\t\t'[deploy/linode] either `token` or `client` must be provided'\n\t);\n};\n\nconst publicIpv4 = (instance: LinodeInstance): string | undefined => {\n\t// Linode's first IPv4 entry is the primary public address.\n\tfor (const ip of instance.ipv4) {\n\t\t// Skip private RFC1918 + link-local. Crude but good enough.\n\t\tif (\n\t\t\t!ip.startsWith('10.') &&\n\t\t\t!ip.startsWith('192.168.') &&\n\t\t\t!ip.startsWith('172.') &&\n\t\t\t!ip.startsWith('169.254.')\n\t\t) {\n\t\t\treturn ip;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nconst randomPassword = (length: number): string => {\n\tconst chars =\n\t\t'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*';\n\tconst bytes = new Uint8Array(length);\n\tcrypto.getRandomValues(bytes);\n\tlet out = '';\n\tfor (const byte of bytes) out += chars[byte % chars.length];\n\treturn out;\n};\n\n/** Find an instance by label. Throws on ambiguous duplicates. */\nexport const findLinodeInstance = async (\n\tclient: LinodeClientLike,\n\tname: string\n): Promise<LinodeInstance | undefined> => {\n\tconst body = await client.request<{ data: LinodeInstance[] }>(\n\t\t'GET',\n\t\t'/linode/instances?page_size=500'\n\t);\n\tconst matches = body.data.filter((instance) => instance.label === name);\n\tif (matches.length === 0) return undefined;\n\tif (matches.length > 1) {\n\t\tthrow new Error(\n\t\t\t`[deploy/linode] multiple instances labeled \"${name}\" (${matches\n\t\t\t\t.map((instance) => instance.id)\n\t\t\t\t.join(', ')}). Resolve manually before adopting.`\n\t\t);\n\t}\n\treturn matches[0];\n};\n\nexport const listLinodeInstances = async (options: {\n\ttoken?: string;\n\tclient?: LinodeClientLike;\n\ttag?: string;\n}): Promise<LinodeInstance[]> => {\n\tconst client = resolveClient(options);\n\tconst path =\n\t\toptions.tag !== undefined\n\t\t\t? `/linode/instances?tag=${encodeURIComponent(options.tag)}&page_size=500`\n\t\t\t: '/linode/instances?page_size=500';\n\tconst body = await client.request<{ data: LinodeInstance[] }>('GET', path);\n\treturn body.data;\n};\n\nexport const destroyLinodeInstance = async (options: {\n\ttoken?: string;\n\tclient?: LinodeClientLike;\n\tid: number;\n}): Promise<void> => {\n\tconst client = resolveClient(options);\n\ttry {\n\t\tawait client.request('DELETE', `/linode/instances/${options.id}`);\n\t} catch (error) {\n\t\tif (error instanceof LinodeError && error.status === 404) return;\n\t\tthrow error;\n\t}\n};\n\nexport const linodeTarget = async (\n\toptions: LinodeTargetOptions\n): Promise<LinodeTarget> => {\n\tconst client = resolveClient(options);\n\tconst rootPass = options.rootPass ?? randomPassword(32);\n\n\tconst hooks: CloudTargetHooks<LinodeInstance> = {\n\t\tcreate: async () => {\n\t\t\tconst created = await client.request<LinodeInstance>(\n\t\t\t\t'POST',\n\t\t\t\t'/linode/instances',\n\t\t\t\t{\n\t\t\t\t\tauthorized_keys: [...options.sshKeys],\n\t\t\t\t\timage: options.image,\n\t\t\t\t\tlabel: options.name,\n\t\t\t\t\tregion: options.region,\n\t\t\t\t\troot_pass: rootPass,\n\t\t\t\t\ttype: options.type,\n\t\t\t\t\t...(options.tags !== undefined ? { tags: [...options.tags] } : {}),\n\t\t\t\t\t...(options.userData !== undefined\n\t\t\t\t\t\t? { stackscript_data: { user_data: options.userData } }\n\t\t\t\t\t\t: {}),\n\t\t\t\t\t...(options.privateIp === true ? { private_ip: true } : {}),\n\t\t\t\t\t...(options.backupsEnabled === true ? { backups_enabled: true } : {})\n\t\t\t\t}\n\t\t\t);\n\t\t\treturn created;\n\t\t},\n\t\tdestroy: (id) => destroyLinodeInstance({ client, id }),\n\t\tfetch: (id) => client.request<LinodeInstance>('GET', `/linode/instances/${id}`),\n\t\tfindByName: (name) => findLinodeInstance(client, name),\n\t\tgetId: (instance) => instance.id,\n\t\tgetIpv4: publicIpv4,\n\t\tgetStatus: (instance) => instance.status,\n\t\tisReady: (instance) => instance.status === 'running'\n\t};\n\n\tconst result = await createCloudTarget(hooks, {\n\t\tdescribeTarget: (sshDescription) =>\n\t\t\t`linode \"${options.name}\" (${sshDescription})`,\n\t\tentityWord: 'instance',\n\t\tlogPrefix: '[linode]',\n\t\tname: options.name,\n\t\tregion: options.region,\n\t\t...(options.user !== undefined ? { user: options.user } : {}),\n\t\t...(options.identity !== undefined ? { identity: options.identity } : {}),\n\t\t...(options.port !== undefined ? { port: options.port } : {}),\n\t\t...(options.provisionTimeoutMs !== undefined\n\t\t\t? { provisionTimeoutMs: options.provisionTimeoutMs }\n\t\t\t: {}),\n\t\t...(options.sshReadinessTimeoutMs !== undefined\n\t\t\t? { sshReadinessTimeoutMs: options.sshReadinessTimeoutMs }\n\t\t\t: {}),\n\t\t...(options.pollIntervalMs !== undefined\n\t\t\t? { pollIntervalMs: options.pollIntervalMs }\n\t\t\t: {}),\n\t\t...(options.onLog !== undefined ? { onLog: options.onLog } : {}),\n\t\t...(options.probeSsh !== undefined ? { probeSsh: options.probeSsh } : {}),\n\t\t...(options.sleep !== undefined ? { sleep: options.sleep } : {}),\n\t\t...(options.now !== undefined ? { now: options.now } : {})\n\t});\n\n\treturn {\n\t\tdescription: result.description,\n\t\tdestroy: result.destroy,\n\t\texec: result.exec,\n\t\tinstanceId: result.id,\n\t\tipv4: result.ipv4,\n\t\tupload: result.upload,\n\t\t...(result.close !== undefined ? { close: result.close } : {})\n\t};\n};\n"
|
|
8
8
|
],
|
|
9
|
-
"mappings": "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",
|
|
10
|
-
"debugId": "
|
|
9
|
+
"mappings": "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",
|
|
10
|
+
"debugId": "30289B5307DDD5AD64756E2164756E21",
|
|
11
11
|
"names": []
|
|
12
12
|
}
|
package/dist/preview.js
CHANGED
|
@@ -1,4 +1,37 @@
|
|
|
1
1
|
// @bun
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
function __accessProp(key) {
|
|
8
|
+
return this[key];
|
|
9
|
+
}
|
|
10
|
+
var __toESMCache_node;
|
|
11
|
+
var __toESMCache_esm;
|
|
12
|
+
var __toESM = (mod, isNodeMode, target) => {
|
|
13
|
+
var canCache = mod != null && typeof mod === "object";
|
|
14
|
+
if (canCache) {
|
|
15
|
+
var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
|
|
16
|
+
var cached = cache.get(mod);
|
|
17
|
+
if (cached)
|
|
18
|
+
return cached;
|
|
19
|
+
}
|
|
20
|
+
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
21
|
+
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
22
|
+
for (let key of __getOwnPropNames(mod))
|
|
23
|
+
if (!__hasOwnProp.call(to, key))
|
|
24
|
+
__defProp(to, key, {
|
|
25
|
+
get: __accessProp.bind(mod, key),
|
|
26
|
+
enumerable: true
|
|
27
|
+
});
|
|
28
|
+
if (canCache)
|
|
29
|
+
cache.set(mod, to);
|
|
30
|
+
return to;
|
|
31
|
+
};
|
|
32
|
+
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
33
|
+
var __require = import.meta.require;
|
|
34
|
+
|
|
2
35
|
// src/preview.ts
|
|
3
36
|
import {
|
|
4
37
|
existsSync,
|
|
@@ -191,5 +224,5 @@ export {
|
|
|
191
224
|
createFilePreviewStore
|
|
192
225
|
};
|
|
193
226
|
|
|
194
|
-
//# debugId=
|
|
227
|
+
//# debugId=1BF9EBCE13FAA19F64756E2164756E21
|
|
195
228
|
//# sourceMappingURL=preview.js.map
|
package/dist/preview.js.map
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"/**\n * Preview-deploys fleet for `@absolutejs/deploy`.\n *\n * A `PreviewFleet` is a tenant-aware orchestrator that creates,\n * lists, and tears down ephemeral environments — one per PR /\n * branch / commit. It composes the existing `Deployer` (release\n * dirs + atomic symlink swap + rollback) with a `DnsProvider` and a\n * persistent registry so a deploy bot can:\n *\n * const url = await fleet.create({ previewId: 'pr-42', ... });\n *\n * await fleet.teardown('pr-42');\n *\n * await fleet.gc({ olderThanMs: 7 * 24 * 60 * 60 * 1000 });\n *\n * Substrate responsibilities:\n *\n * - allocate a free port from a configurable pool\n * - build the hostname `<previewId>.<baseDomain>`\n * - upsert an A record for that hostname (DNS provider injected)\n * - call a caller-supplied `makeDeployer({ previewId, port,\n * hostname })` factory, then run `deployer.deploy()` so the\n * preview lands as a normal release on disk\n * - persist the preview registry so we can list / GC later\n * - on teardown, run a caller-supplied stop callback, remove the\n * DNS record, drop the registry entry\n *\n * Everything tenant-specific (secrets snapshotting, db seeding,\n * stopping the process) is a caller-supplied hook. The fleet owns\n * fleet bookkeeping, not application logic.\n */\n\nimport {\n\texistsSync,\n\tmkdirSync,\n\treadFileSync,\n\trenameSync,\n\twriteFileSync\n} from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport type {\n\tDeployer,\n\tDeployResult,\n\tReleaseAnnotations\n} from './deployer';\nimport type { DnsProvider, DnsRecord, DnsRecordSpec } from './dns';\n\n// =============================================================================\n// Registry shape\n// =============================================================================\n\nexport type PreviewRecord = {\n\tpreviewId: string;\n\thostname: string;\n\turl: string;\n\tport: number;\n\tdnsRecordId?: string;\n\treleaseId: string;\n\tcommitSha?: string;\n\tcreatedAt: number;\n\tannotations?: ReleaseAnnotations;\n};\n\nexport type PreviewStore = {\n\tlist: () => Promise<PreviewRecord[]>;\n\tget: (previewId: string) => Promise<PreviewRecord | null>;\n\tput: (record: PreviewRecord) => Promise<void>;\n\tremove: (previewId: string) => Promise<void>;\n};\n\n// =============================================================================\n// Hooks + options\n// =============================================================================\n\nexport type PreviewDeployerContext = {\n\tpreviewId: string;\n\tport: number;\n\thostname: string;\n\turl: string;\n};\n\nexport type PreviewFleetOptions = {\n\t/**\n\t * Apex used to build preview hostnames: `<previewId>.<baseDomain>`.\n\t * `previewId` is slugified before use (alphanumeric + `-`).\n\t */\n\tbaseDomain: string;\n\t/**\n\t * Optional URL scheme. Defaults to `'https'`. Set `'http'` for\n\t * local-loop previews behind a localhost proxy.\n\t */\n\tscheme?: 'http' | 'https';\n\t/**\n\t * DNS provider — `cloudflareProvider`, `route53Provider`, etc.\n\t * Optional: when absent, `fleet.create` skips DNS work and the\n\t * caller is responsible for routing requests at the hostname.\n\t */\n\tdns?: DnsProvider;\n\t/**\n\t * Public IPv4 the A record should point at. Required when `dns`\n\t * is set. The fleet calls `dns.upsert({ name, type: 'A',\n\t * content: ipv4 })`.\n\t */\n\tipv4?: string;\n\t/**\n\t * TTL applied to created A records. Default 60s — previews come\n\t * and go and we want low cache lifetime.\n\t */\n\tdnsTtl?: number;\n\t/**\n\t * Proxied flag (Cloudflare orange-cloud). Default `false` — most\n\t * previews want a real IP, not a Cloudflare proxy.\n\t */\n\tdnsProxied?: boolean;\n\t/**\n\t * Port range that the fleet allocates from. Default `[3100, 3899]`\n\t * (3000 squat is documented in memory).\n\t */\n\tportRange?: { start: number; end: number };\n\t/** Override port allocation entirely (e.g. talk to a port-leaser). */\n\tallocatePort?: (record: {\n\t\tpreviewId: string;\n\t\thostname: string;\n\t}) => Promise<number>;\n\t/**\n\t * REQUIRED. Build a `Deployer` for an individual preview. The\n\t * factory receives the resolved id, port, hostname, and URL —\n\t * use them to set the right env, processManager, and target.\n\t */\n\tmakeDeployer: (\n\t\tctx: PreviewDeployerContext\n\t) => Deployer | Promise<Deployer>;\n\t/**\n\t * Stop callback. Called by `teardown` BEFORE DNS removal so the\n\t * preview process stops accepting connections before the record\n\t * disappears. Use it to call `processManager.stop()`, kill the\n\t * port, etc.\n\t */\n\tstop?: (record: PreviewRecord) => Promise<void> | void;\n\t/**\n\t * After-teardown callback. Called after DNS + registry removal —\n\t * good place to delete the release directory, drop a tenant\n\t * schema, clear secrets, etc.\n\t */\n\tafterTeardown?: (record: PreviewRecord) => Promise<void> | void;\n\t/** Registry. Default = filesystem store at `<root>`. */\n\tstore?: PreviewStore;\n\t/** Directory the file-based default store writes into. */\n\tregistryRoot?: string;\n\t/** Override `Date.now()` for tests. */\n\tclock?: () => number;\n};\n\n// =============================================================================\n// File-based PreviewStore (default)\n// =============================================================================\n\n/**\n * Single-file JSON registry. Reads + writes atomically (temp-file\n * + rename). Adequate for a deploy bot on one host — swap in a\n * Postgres-backed store for distributed deploy bots.\n */\nexport const createFilePreviewStore = (root: string): PreviewStore => {\n\tconst path = join(root, 'previews.json');\n\n\tconst readAll = (): PreviewRecord[] => {\n\t\tif (!existsSync(path)) return [];\n\t\ttry {\n\t\t\tconst raw = readFileSync(path, 'utf8');\n\t\t\tif (raw.trim() === '') return [];\n\t\t\tconst parsed = JSON.parse(raw) as { previews?: PreviewRecord[] };\n\t\t\treturn Array.isArray(parsed.previews) ? parsed.previews : [];\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t};\n\n\tconst writeAll = (records: PreviewRecord[]): void => {\n\t\tmkdirSync(dirname(path), { recursive: true });\n\t\tconst tmp = `${path}.tmp-${process.pid}-${Date.now()}`;\n\t\twriteFileSync(tmp, JSON.stringify({ previews: records }, null, 2));\n\t\trenameSync(tmp, path);\n\t};\n\n\treturn {\n\t\tget: async (previewId) =>\n\t\t\treadAll().find((r) => r.previewId === previewId) ?? null,\n\t\tlist: async () => readAll(),\n\t\tput: async (record) => {\n\t\t\tconst records = readAll().filter(\n\t\t\t\t(r) => r.previewId !== record.previewId\n\t\t\t);\n\t\t\trecords.push(record);\n\t\t\twriteAll(records);\n\t\t},\n\t\tremove: async (previewId) => {\n\t\t\tconst records = readAll().filter((r) => r.previewId !== previewId);\n\t\t\twriteAll(records);\n\t\t}\n\t};\n};\n\n// =============================================================================\n// In-memory store (for tests + ephemeral fleets)\n// =============================================================================\n\nexport const createMemoryPreviewStore = (): PreviewStore => {\n\tconst map = new Map<string, PreviewRecord>();\n\treturn {\n\t\tget: async (previewId) => map.get(previewId) ?? null,\n\t\tlist: async () => Array.from(map.values()),\n\t\tput: async (record) => {\n\t\t\tmap.set(record.previewId, record);\n\t\t},\n\t\tremove: async (previewId) => {\n\t\t\tmap.delete(previewId);\n\t\t}\n\t};\n};\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\nconst slugify = (id: string): string =>\n\tid\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9-]+/g, '-')\n\t\t.replace(/^-+|-+$/g, '')\n\t\t.slice(0, 50);\n\nconst defaultAllocatePort = (\n\tused: Set<number>,\n\trange: { start: number; end: number }\n): number => {\n\tfor (let port = range.start; port <= range.end; port += 1) {\n\t\tif (!used.has(port)) return port;\n\t}\n\tthrow new Error(\n\t\t`preview-fleet: no free ports in [${range.start}, ${range.end}] (${used.size} in use)`\n\t);\n};\n\n// =============================================================================\n// Fleet\n// =============================================================================\n\nexport type CreatePreviewInput = {\n\tpreviewId: string;\n\tcommitSha?: string;\n\tannotations?: ReleaseAnnotations;\n\t/**\n\t * Override hostname. Default = `<slug(previewId)>.<baseDomain>`.\n\t * Use this for previews with a vanity name that shouldn't echo\n\t * the PR id directly.\n\t */\n\thostname?: string;\n};\n\nexport type CreatePreviewResult = {\n\trecord: PreviewRecord;\n\tdeploy: DeployResult;\n};\n\nexport type PreviewFleet = {\n\t/**\n\t * Spin up a preview. Idempotent on `previewId` — if a record\n\t * already exists, the fleet re-uses its port + DNS and runs a\n\t * fresh `deployer.deploy()` (so PRs that push new commits roll\n\t * forward).\n\t */\n\tcreate: (input: CreatePreviewInput) => Promise<CreatePreviewResult>;\n\t/** Tear down a single preview (stop → DNS remove → registry remove → afterTeardown). */\n\tteardown: (previewId: string) => Promise<void>;\n\t/** List active previews. */\n\tlist: () => Promise<PreviewRecord[]>;\n\t/** Get one preview by id. */\n\tget: (previewId: string) => Promise<PreviewRecord | null>;\n\t/**\n\t * Tear down all previews older than `olderThanMs`. Returns the\n\t * list of preview ids torn down. Failures on individual previews\n\t * are swallowed and reported on `errors`.\n\t */\n\tgc: (options: { olderThanMs: number }) => Promise<{\n\t\tremoved: string[];\n\t\terrors: { previewId: string; error: Error }[];\n\t}>;\n};\n\nexport const createPreviewFleet = (\n\toptions: PreviewFleetOptions\n): PreviewFleet => {\n\tconst scheme = options.scheme ?? 'https';\n\tconst portRange = options.portRange ?? { end: 3899, start: 3100 };\n\tconst dnsTtl = options.dnsTtl ?? 60;\n\tconst dnsProxied = options.dnsProxied ?? false;\n\tconst clock = options.clock ?? Date.now;\n\tconst store =\n\t\toptions.store ??\n\t\tcreateFilePreviewStore(\n\t\t\toptions.registryRoot ?? join(process.cwd(), '.preview-fleet')\n\t\t);\n\n\tif (options.dns !== undefined && options.ipv4 === undefined) {\n\t\tthrow new Error(\n\t\t\t'preview-fleet: `ipv4` is required when `dns` is configured'\n\t\t);\n\t}\n\n\tconst ensureDns = async (\n\t\thostname: string\n\t): Promise<DnsRecord | undefined> => {\n\t\tif (options.dns === undefined) return undefined;\n\t\tconst spec: DnsRecordSpec = {\n\t\t\tcontent: options.ipv4!,\n\t\t\tname: hostname,\n\t\t\tproxied: dnsProxied,\n\t\t\tttl: dnsTtl,\n\t\t\ttype: 'A'\n\t\t};\n\t\treturn await options.dns.upsert(spec);\n\t};\n\n\tconst removeDns = async (record: PreviewRecord): Promise<void> => {\n\t\tif (options.dns === undefined || record.dnsRecordId === undefined) {\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tawait options.dns.delete(record.dnsRecordId);\n\t\t} catch {\n\t\t\t// Idempotent teardown — the record may already be gone. Don't\n\t\t\t// block the rest of teardown on a stale id.\n\t\t}\n\t};\n\n\tconst buildHostname = (previewId: string, override?: string): string => {\n\t\tif (override !== undefined) return override;\n\t\tconst slug = slugify(previewId);\n\t\tif (slug === '') {\n\t\t\tthrow new Error(\n\t\t\t\t`preview-fleet: previewId ${JSON.stringify(previewId)} slugifies to empty`\n\t\t\t);\n\t\t}\n\t\treturn `${slug}.${options.baseDomain}`;\n\t};\n\n\tconst create = async (\n\t\tinput: CreatePreviewInput\n\t): Promise<CreatePreviewResult> => {\n\t\tconst existing = await store.get(input.previewId);\n\t\tconst hostname = buildHostname(input.previewId, input.hostname);\n\t\tconst url = `${scheme}://${hostname}`;\n\n\t\t// Allocate a port — reuse existing if we're re-deploying.\n\t\tlet port: number;\n\t\tif (existing !== null) {\n\t\t\tport = existing.port;\n\t\t} else if (options.allocatePort !== undefined) {\n\t\t\tport = await options.allocatePort({ hostname, previewId: input.previewId });\n\t\t} else {\n\t\t\tconst used = new Set(\n\t\t\t\t(await store.list()).map((record) => record.port)\n\t\t\t);\n\t\t\tport = defaultAllocatePort(used, portRange);\n\t\t}\n\n\t\tconst deployer = await options.makeDeployer({\n\t\t\thostname,\n\t\t\tport,\n\t\t\tpreviewId: input.previewId,\n\t\t\turl\n\t\t});\n\n\t\tconst deployOptions =\n\t\t\tinput.annotations !== undefined\n\t\t\t\t? { annotations: input.annotations }\n\t\t\t\t: input.commitSha !== undefined\n\t\t\t\t\t? { annotations: { commitSha: input.commitSha } }\n\t\t\t\t\t: undefined;\n\t\tconst deployResult = await deployer.deploy(deployOptions);\n\n\t\t// DNS only after the deploy succeeded — no point flipping the\n\t\t// record at a half-baked release.\n\t\tconst dnsRecord = await ensureDns(hostname);\n\n\t\tconst record: PreviewRecord = {\n\t\t\tcreatedAt: existing?.createdAt ?? clock(),\n\t\t\thostname,\n\t\t\tport,\n\t\t\tpreviewId: input.previewId,\n\t\t\treleaseId: deployResult.releaseId,\n\t\t\turl,\n\t\t\t...(dnsRecord !== undefined ? { dnsRecordId: dnsRecord.id } : {}),\n\t\t\t...(input.commitSha !== undefined ? { commitSha: input.commitSha } : {}),\n\t\t\t...(input.annotations !== undefined\n\t\t\t\t? { annotations: input.annotations }\n\t\t\t\t: {})\n\t\t};\n\n\t\tawait store.put(record);\n\t\treturn { deploy: deployResult, record };\n\t};\n\n\tconst teardown = async (previewId: string): Promise<void> => {\n\t\tconst record = await store.get(previewId);\n\t\tif (record === null) return;\n\n\t\tif (options.stop !== undefined) {\n\t\t\ttry {\n\t\t\t\tawait options.stop(record);\n\t\t\t} catch {\n\t\t\t\t// Don't block DNS removal on a stop failure. The caller\n\t\t\t\t// can see the error via afterTeardown by re-querying.\n\t\t\t}\n\t\t}\n\n\t\tawait removeDns(record);\n\t\tawait store.remove(previewId);\n\n\t\tif (options.afterTeardown !== undefined) {\n\t\t\ttry {\n\t\t\t\tawait options.afterTeardown(record);\n\t\t\t} catch {\n\t\t\t\t// Caller's own teardown errors are their problem; the\n\t\t\t\t// substrate has already removed the record + DNS.\n\t\t\t}\n\t\t}\n\t};\n\n\tconst gc = async ({\n\t\tolderThanMs\n\t}: {\n\t\tolderThanMs: number;\n\t}): Promise<{\n\t\tremoved: string[];\n\t\terrors: { previewId: string; error: Error }[];\n\t}> => {\n\t\tconst cutoff = clock() - olderThanMs;\n\t\tconst all = await store.list();\n\t\tconst expired = all.filter((record) => record.createdAt < cutoff);\n\t\tconst removed: string[] = [];\n\t\tconst errors: { previewId: string; error: Error }[] = [];\n\t\tfor (const record of expired) {\n\t\t\ttry {\n\t\t\t\tawait teardown(record.previewId);\n\t\t\t\tremoved.push(record.previewId);\n\t\t\t} catch (e) {\n\t\t\t\terrors.push({\n\t\t\t\t\terror: e instanceof Error ? e : new Error(String(e)),\n\t\t\t\t\tpreviewId: record.previewId\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn { errors, removed };\n\t};\n\n\treturn {\n\t\tcreate,\n\t\tgc,\n\t\tget: (previewId) => store.get(previewId),\n\t\tlist: () => store.list(),\n\t\tteardown\n\t};\n};\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "1BF9EBCE13FAA19F64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/route53.js
CHANGED
|
@@ -1,4 +1,37 @@
|
|
|
1
1
|
// @bun
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
function __accessProp(key) {
|
|
8
|
+
return this[key];
|
|
9
|
+
}
|
|
10
|
+
var __toESMCache_node;
|
|
11
|
+
var __toESMCache_esm;
|
|
12
|
+
var __toESM = (mod, isNodeMode, target) => {
|
|
13
|
+
var canCache = mod != null && typeof mod === "object";
|
|
14
|
+
if (canCache) {
|
|
15
|
+
var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
|
|
16
|
+
var cached = cache.get(mod);
|
|
17
|
+
if (cached)
|
|
18
|
+
return cached;
|
|
19
|
+
}
|
|
20
|
+
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
21
|
+
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
22
|
+
for (let key of __getOwnPropNames(mod))
|
|
23
|
+
if (!__hasOwnProp.call(to, key))
|
|
24
|
+
__defProp(to, key, {
|
|
25
|
+
get: __accessProp.bind(mod, key),
|
|
26
|
+
enumerable: true
|
|
27
|
+
});
|
|
28
|
+
if (canCache)
|
|
29
|
+
cache.set(mod, to);
|
|
30
|
+
return to;
|
|
31
|
+
};
|
|
32
|
+
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
33
|
+
var __require = import.meta.require;
|
|
34
|
+
|
|
2
35
|
// src/route53.ts
|
|
3
36
|
var ensureFqdn = (name, zoneName) => {
|
|
4
37
|
if (name === "@")
|
|
@@ -166,5 +199,5 @@ export {
|
|
|
166
199
|
route53DnsProvider
|
|
167
200
|
};
|
|
168
201
|
|
|
169
|
-
//# debugId=
|
|
202
|
+
//# debugId=9560FABB96092BEC64756E2164756E21
|
|
170
203
|
//# sourceMappingURL=route53.js.map
|
package/dist/route53.js.map
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"/**\n * @absolutejs/deploy/route53 — AWS Route 53 DNS implementing the\n * {@link DnsProvider} contract from `./dns`.\n *\n * Different shape from Cloudflare/DO/Hetzner DNS: Route 53 has no\n * per-record id. Records are identified by their (Name, Type)\n * composite, and mutations are done via `ChangeResourceRecordSets`\n * with a batch of CREATE / UPSERT / DELETE actions. We exploit\n * Route 53's native `UPSERT` action — one API call replaces the\n * find-then-create-or-update dance the other providers need.\n *\n * Narrow `Route53ClientLike` interface so the package stays free\n * of an `@aws-sdk/client-route-53` dependency. Wire your existing\n * AWS SDK client with a 4-line shim — see README.\n */\n\nimport type {\n\tDnsProvider,\n\tDnsRecord,\n\tDnsRecordFilter,\n\tDnsRecordSpec,\n\tDnsRecordType\n} from './dns';\n\n// =============================================================================\n// AWS API shapes — narrowed to what we use\n// =============================================================================\n\nexport type Route53ResourceRecord = { Value: string };\n\nexport type Route53ResourceRecordSet = {\n\tName: string;\n\tType: string;\n\tTTL?: number;\n\tResourceRecords?: Route53ResourceRecord[];\n\tAliasTarget?: {\n\t\tHostedZoneId: string;\n\t\tDNSName: string;\n\t\tEvaluateTargetHealth: boolean;\n\t};\n\tSetIdentifier?: string;\n};\n\nexport type Route53Change = {\n\tAction: 'CREATE' | 'DELETE' | 'UPSERT';\n\tResourceRecordSet: Route53ResourceRecordSet;\n};\n\nexport type Route53ListInput = {\n\tHostedZoneId: string;\n\tStartRecordName?: string;\n\tStartRecordType?: string;\n\tMaxItems?: string;\n};\n\nexport type Route53ListOutput = {\n\tResourceRecordSets: Route53ResourceRecordSet[];\n\tIsTruncated?: boolean;\n\tNextRecordName?: string;\n\tNextRecordType?: string;\n};\n\nexport type Route53ChangeInput = {\n\tHostedZoneId: string;\n\tChangeBatch: { Changes: Route53Change[]; Comment?: string };\n};\n\nexport type Route53ChangeOutput = {\n\tChangeInfo: { Id: string; Status: string };\n};\n\n/**\n * Minimal subset of the Route 53 client we need. Wire your\n * `@aws-sdk/client-route-53` `Route53Client` with a shim:\n *\n * ```ts\n * import {\n * Route53Client,\n * ListResourceRecordSetsCommand,\n * ChangeResourceRecordSetsCommand,\n * } from '@aws-sdk/client-route-53';\n *\n * const aws = new Route53Client({ region: 'us-east-1' });\n * const client: Route53ClientLike = {\n * listResourceRecordSets: (input) =>\n * aws.send(new ListResourceRecordSetsCommand(input)) as any,\n * changeResourceRecordSets: (input) =>\n * aws.send(new ChangeResourceRecordSetsCommand(input)) as any,\n * };\n * ```\n *\n * Or hand-roll a SigV4-signed fetch client if you want zero deps.\n */\nexport type Route53ClientLike = {\n\tlistResourceRecordSets: (\n\t\tinput: Route53ListInput\n\t) => Promise<Route53ListOutput>;\n\tchangeResourceRecordSets: (\n\t\tinput: Route53ChangeInput\n\t) => Promise<Route53ChangeOutput>;\n};\n\nexport type Route53ProviderOptions = {\n\tclient: Route53ClientLike;\n\t/** Hosted zone id, e.g. `'Z2FDTNDATAQYW2'`. */\n\thostedZoneId: string;\n\t/** Zone name for log + name conversion, e.g. `'example.com'`. */\n\tzoneName: string;\n\t/** Default TTL when `spec.ttl` is omitted. Default 300. */\n\tdefaultTtl?: number;\n};\n\n// =============================================================================\n// Name + TXT-value normalization\n// =============================================================================\n\nconst ensureFqdn = (name: string, zoneName: string): string => {\n\tif (name === '@') return ensureTrailingDot(zoneName);\n\tif (name === zoneName) return ensureTrailingDot(name);\n\tif (name.endsWith('.')) return name;\n\treturn `${name}.`;\n};\n\nconst ensureTrailingDot = (s: string): string => (s.endsWith('.') ? s : `${s}.`);\n\nconst stripTrailingDot = (s: string): string =>\n\ts.endsWith('.') ? s.slice(0, -1) : s;\n\n/**\n * Route 53 TXT values MUST be enclosed in double quotes in the wire\n * format. Strings > 255 chars get split into multiple quoted chunks.\n * Bare unquoted input → wrap. Already-quoted input → pass through.\n */\nconst encodeTxtValue = (raw: string): string => {\n\tif (raw.startsWith('\"') && raw.endsWith('\"')) return raw;\n\tconst CHUNK = 255;\n\tconst chunks: string[] = [];\n\tfor (let i = 0; i < raw.length; i += CHUNK) {\n\t\tchunks.push(`\"${raw.slice(i, i + CHUNK).replaceAll('\"', '\\\\\"')}\"`);\n\t}\n\treturn chunks.join(' ');\n};\n\n/** Inverse of encodeTxtValue: unwrap \" ... \" \" ... \" back to raw. */\nconst decodeTxtValue = (wire: string): string => {\n\tconst parts = wire.match(/\"((?:\\\\.|[^\"])*)\"/g);\n\tif (parts === null) return wire;\n\treturn parts\n\t\t.map((part) => part.slice(1, -1).replaceAll('\\\\\"', '\"'))\n\t\t.join('');\n};\n\n// =============================================================================\n// Synthetic-id encoding — Route 53 has no per-record id\n// =============================================================================\n\n/**\n * Route 53 deletes require the CURRENT record state (Name + Type +\n * TTL + Values), not an opaque id. We encode that state as a\n * base64-JSON synthetic id so the DnsProvider contract (which\n * expects `delete(id)`) works without a second API round-trip.\n */\ntype Route53IdPayload = {\n\tn: string; // Name (FQDN with trailing dot)\n\tt: string; // Type\n\tv: string[]; // Values (as written to ResourceRecords[])\n\tl?: number; // TTL\n};\n\nconst encodeId = (payload: Route53IdPayload): string =>\n\tbtoa(JSON.stringify(payload))\n\t\t.replaceAll('+', '-')\n\t\t.replaceAll('/', '_')\n\t\t.replaceAll('=', '');\n\nconst decodeId = (id: string): Route53IdPayload => {\n\tconst padded = id\n\t\t.replaceAll('-', '+')\n\t\t.replaceAll('_', '/')\n\t\t.padEnd(Math.ceil(id.length / 4) * 4, '=');\n\treturn JSON.parse(atob(padded)) as Route53IdPayload;\n};\n\n// =============================================================================\n// Conversion: AWS RecordSet ↔ DnsRecord\n// =============================================================================\n\nconst toDnsRecord = (\n\tset: Route53ResourceRecordSet,\n\tzoneName: string\n): DnsRecord | undefined => {\n\t// Alias records (no ResourceRecords) don't fit our string-content model.\n\tconst values = set.ResourceRecords?.map((r) => r.Value) ?? [];\n\tif (values.length === 0) return undefined;\n\t// For TXT, decode the wire format back to raw plaintext.\n\tconst content =\n\t\tset.Type === 'TXT' ? decodeTxtValue(values.join(' ')) : (values[0] as string);\n\tconst idPayload: Route53IdPayload = {\n\t\tn: set.Name,\n\t\tt: set.Type,\n\t\tv: values,\n\t\t...(set.TTL !== undefined ? { l: set.TTL } : {})\n\t};\n\tconst fqdn = stripTrailingDot(set.Name);\n\tconst name = fqdn === zoneName ? zoneName : fqdn;\n\treturn {\n\t\tcontent,\n\t\tid: encodeId(idPayload),\n\t\tname,\n\t\ttype: set.Type as DnsRecordType,\n\t\t...(set.TTL !== undefined ? { ttl: set.TTL } : {})\n\t};\n};\n\nconst buildRecordSet = (\n\tspec: DnsRecordSpec,\n\tzoneName: string,\n\tdefaultTtl: number\n): Route53ResourceRecordSet => {\n\tconst Name = ensureFqdn(spec.name, zoneName);\n\tconst ttl = spec.ttl ?? defaultTtl;\n\tconst value = spec.type === 'TXT' ? encodeTxtValue(spec.content) : spec.content;\n\treturn {\n\t\tName,\n\t\tResourceRecords: [{ Value: value }],\n\t\tTTL: ttl,\n\t\tType: spec.type\n\t};\n};\n\n// =============================================================================\n// Provider factory\n// =============================================================================\n\nexport const route53DnsProvider = (\n\toptions: Route53ProviderOptions\n): DnsProvider => {\n\tconst { client, hostedZoneId, zoneName } = options;\n\tconst defaultTtl = options.defaultTtl ?? 300;\n\tconst zoneLabel = zoneName;\n\n\tconst fetchAll = async (\n\t\tfilter?: DnsRecordFilter\n\t): Promise<DnsRecord[]> => {\n\t\tconst out: DnsRecord[] = [];\n\t\tlet startName: string | undefined;\n\t\tlet startType: string | undefined;\n\t\tfor (;;) {\n\t\t\tconst params: Route53ListInput = {\n\t\t\t\tHostedZoneId: hostedZoneId,\n\t\t\t\tMaxItems: '500',\n\t\t\t\t...(startName !== undefined ? { StartRecordName: startName } : {}),\n\t\t\t\t...(startType !== undefined ? { StartRecordType: startType } : {})\n\t\t\t};\n\t\t\tconst page = await client.listResourceRecordSets(params);\n\t\t\tfor (const set of page.ResourceRecordSets) {\n\t\t\t\tconst dnsRecord = toDnsRecord(set, zoneName);\n\t\t\t\tif (dnsRecord === undefined) continue;\n\t\t\t\tif (\n\t\t\t\t\tfilter?.name !== undefined &&\n\t\t\t\t\tdnsRecord.name !== filter.name\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tfilter?.type !== undefined &&\n\t\t\t\t\tdnsRecord.type !== filter.type\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tout.push(dnsRecord);\n\t\t\t}\n\t\t\tif (page.IsTruncated !== true) break;\n\t\t\tstartName = page.NextRecordName;\n\t\t\tstartType = page.NextRecordType;\n\t\t}\n\t\treturn out;\n\t};\n\n\tconst list = (filter?: DnsRecordFilter): Promise<DnsRecord[]> =>\n\t\tfetchAll(filter);\n\n\tconst find = async (key: {\n\t\tname: string;\n\t\ttype: DnsRecordType;\n\t}): Promise<DnsRecord | undefined> => {\n\t\tconst matches = await fetchAll(key);\n\t\tif (matches.length === 0) return undefined;\n\t\tif (matches.length > 1) {\n\t\t\tthrow new Error(\n\t\t\t\t`[deploy/route53] multiple ${key.type} records for \"${key.name}\" in zone ${zoneLabel} — drifted state; resolve manually before upsert.`\n\t\t\t);\n\t\t}\n\t\treturn matches[0];\n\t};\n\n\tconst submitChange = async (change: Route53Change): Promise<void> => {\n\t\tawait client.changeResourceRecordSets({\n\t\t\tChangeBatch: { Changes: [change] },\n\t\t\tHostedZoneId: hostedZoneId\n\t\t});\n\t};\n\n\tconst create = async (spec: DnsRecordSpec): Promise<DnsRecord> => {\n\t\tconst set = buildRecordSet(spec, zoneName, defaultTtl);\n\t\tawait submitChange({ Action: 'CREATE', ResourceRecordSet: set });\n\t\tconst synthesized = toDnsRecord(set, zoneName);\n\t\tif (synthesized === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t'[deploy/route53] internal: built record had no ResourceRecords'\n\t\t\t);\n\t\t}\n\t\treturn synthesized;\n\t};\n\n\tconst upsert = async (spec: DnsRecordSpec): Promise<DnsRecord> => {\n\t\tconst set = buildRecordSet(spec, zoneName, defaultTtl);\n\t\tawait submitChange({ Action: 'UPSERT', ResourceRecordSet: set });\n\t\tconst synthesized = toDnsRecord(set, zoneName);\n\t\tif (synthesized === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t'[deploy/route53] internal: built record had no ResourceRecords'\n\t\t\t);\n\t\t}\n\t\treturn synthesized;\n\t};\n\n\tconst update = async (\n\t\t_id: string,\n\t\tspec: DnsRecordSpec\n\t): Promise<DnsRecord> => upsert(spec);\n\n\tconst deleteRecord = async (id: string): Promise<void> => {\n\t\t// Route 53's DELETE requires the exact current state. We reconstruct\n\t\t// it from the synthetic id we issued at read/write time.\n\t\tconst payload = decodeId(id);\n\t\tconst set: Route53ResourceRecordSet = {\n\t\t\tName: payload.n,\n\t\t\tResourceRecords: payload.v.map((Value) => ({ Value })),\n\t\t\tType: payload.t,\n\t\t\t...(payload.l !== undefined ? { TTL: payload.l } : {})\n\t\t};\n\t\ttry {\n\t\t\tawait submitChange({ Action: 'DELETE', ResourceRecordSet: set });\n\t\t} catch (error) {\n\t\t\t// Route 53 throws InvalidChangeBatch when the record doesn't exist\n\t\t\t// (or its state has drifted from what we encoded). Treat the\n\t\t\t// \"doesn't exist\" subset as idempotent success.\n\t\t\tconst message =\n\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\tif (\n\t\t\t\tmessage.includes('not found') ||\n\t\t\t\tmessage.includes('NoSuchHostedZone') ||\n\t\t\t\tmessage.includes(\n\t\t\t\t\t'but it was not found'\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t};\n\n\treturn {\n\t\tcreate,\n\t\tdelete: deleteRecord,\n\t\tdescription: `route53 zone \"${zoneLabel}\"`,\n\t\tfind,\n\t\tlist,\n\t\tupdate,\n\t\tupsert\n\t};\n};\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "9560FABB96092BEC64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/tls.d.ts
CHANGED
|
@@ -54,6 +54,17 @@ export type IssueCertificateOptions = {
|
|
|
54
54
|
domains: string[];
|
|
55
55
|
/** DNS provider used for DNS-01 challenges (must own the zone). */
|
|
56
56
|
dnsProvider: DnsProvider;
|
|
57
|
+
/**
|
|
58
|
+
* Map the public ACME challenge name to the record name written through
|
|
59
|
+
* `dnsProvider`. Use this for CNAME-delegated DNS-01, where customers point
|
|
60
|
+
* `_acme-challenge.app.example.com` at a platform-owned validation zone.
|
|
61
|
+
* The propagation checker still receives the public challenge name because
|
|
62
|
+
* that is what the certificate authority resolves.
|
|
63
|
+
*/
|
|
64
|
+
mapDnsChallengeRecord?: (context: {
|
|
65
|
+
domain: string;
|
|
66
|
+
recordName: string;
|
|
67
|
+
}) => string;
|
|
57
68
|
/** Contact email for the ACME account. */
|
|
58
69
|
email: string;
|
|
59
70
|
/** ACME directory URL. Default Let's Encrypt production. */
|
package/dist/tls.js
CHANGED
|
@@ -1,4 +1,37 @@
|
|
|
1
1
|
// @bun
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
function __accessProp(key) {
|
|
8
|
+
return this[key];
|
|
9
|
+
}
|
|
10
|
+
var __toESMCache_node;
|
|
11
|
+
var __toESMCache_esm;
|
|
12
|
+
var __toESM = (mod, isNodeMode, target) => {
|
|
13
|
+
var canCache = mod != null && typeof mod === "object";
|
|
14
|
+
if (canCache) {
|
|
15
|
+
var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
|
|
16
|
+
var cached = cache.get(mod);
|
|
17
|
+
if (cached)
|
|
18
|
+
return cached;
|
|
19
|
+
}
|
|
20
|
+
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
21
|
+
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
22
|
+
for (let key of __getOwnPropNames(mod))
|
|
23
|
+
if (!__hasOwnProp.call(to, key))
|
|
24
|
+
__defProp(to, key, {
|
|
25
|
+
get: __accessProp.bind(mod, key),
|
|
26
|
+
enumerable: true
|
|
27
|
+
});
|
|
28
|
+
if (canCache)
|
|
29
|
+
cache.set(mod, to);
|
|
30
|
+
return to;
|
|
31
|
+
};
|
|
32
|
+
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
33
|
+
var __require = import.meta.require;
|
|
34
|
+
|
|
2
35
|
// src/tls.ts
|
|
3
36
|
import { X509Certificate } from "crypto";
|
|
4
37
|
var LETSENCRYPT_PRODUCTION = "https://acme-v02.api.letsencrypt.org/directory";
|
|
@@ -326,16 +359,23 @@ var issueCertificate = async (options) => {
|
|
|
326
359
|
const txtBytes = new Uint8Array(await crypto.subtle.digest("SHA-256", new TextEncoder().encode(keyAuthorization)));
|
|
327
360
|
const txtValue = base64UrlEncode(txtBytes);
|
|
328
361
|
const recordName = `_acme-challenge.${auth.identifier.value}`;
|
|
329
|
-
|
|
362
|
+
const providerRecordName = options.mapDnsChallengeRecord?.({
|
|
363
|
+
domain: auth.identifier.value,
|
|
364
|
+
recordName
|
|
365
|
+
}) ?? recordName;
|
|
366
|
+
if (providerRecordName.trim().length === 0) {
|
|
367
|
+
throw new Error("[deploy/tls] mapped DNS-01 record name must not be empty");
|
|
368
|
+
}
|
|
369
|
+
log(providerRecordName === recordName ? `[tls] DNS-01: setting ${recordName} = "${txtValue}"` : `[tls] DNS-01: setting delegated ${providerRecordName} for ${recordName} = "${txtValue}"`);
|
|
330
370
|
const record = await options.dnsProvider.upsert({
|
|
331
371
|
content: txtValue,
|
|
332
|
-
name:
|
|
372
|
+
name: providerRecordName,
|
|
333
373
|
ttl: 60,
|
|
334
374
|
type: "TXT"
|
|
335
375
|
});
|
|
336
376
|
dnsCreated.push({
|
|
337
377
|
recordId: record.id,
|
|
338
|
-
recordName,
|
|
378
|
+
recordName: providerRecordName,
|
|
339
379
|
recordValue: txtValue
|
|
340
380
|
});
|
|
341
381
|
cleanups.push(() => options.dnsProvider.delete(record.id));
|
|
@@ -525,5 +565,5 @@ export {
|
|
|
525
565
|
AcmeError
|
|
526
566
|
};
|
|
527
567
|
|
|
528
|
-
//# debugId=
|
|
568
|
+
//# debugId=6D2588C0F93BA9DA64756E2164756E21
|
|
529
569
|
//# sourceMappingURL=tls.js.map
|