@absolutejs/deploy 0.24.0 → 0.25.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 +34 -0
- package/dist/appStoreConnect.js +11 -9
- package/dist/appStoreConnect.js.map +2 -2
- package/dist/cloudTarget.d.ts +4 -4
- package/dist/cloudflare.d.ts +2 -2
- package/dist/cloudflare.js +11 -9
- package/dist/cloudflare.js.map +3 -3
- package/dist/deployer.d.ts +9 -9
- package/dist/digitalocean.d.ts +5 -5
- package/dist/digitalocean.js +21 -13
- package/dist/digitalocean.js.map +5 -5
- package/dist/digitaloceanDns.d.ts +2 -2
- package/dist/digitaloceanDns.js +16 -8
- package/dist/digitaloceanDns.js.map +6 -6
- package/dist/digitaloceanEphemeralInfrastructure.js +16 -8
- package/dist/digitaloceanEphemeralInfrastructure.js.map +5 -5
- package/dist/digitaloceanInfrastructure.js +16 -8
- package/dist/digitaloceanInfrastructure.js.map +6 -6
- package/dist/digitaloceanIngress.js +16 -8
- package/dist/digitaloceanIngress.js.map +5 -5
- package/dist/dns.d.ts +1 -1
- package/dist/dns.js +9 -7
- package/dist/dns.js.map +3 -3
- package/dist/edgeIngress.js +11 -9
- package/dist/edgeIngress.js.map +2 -2
- package/dist/env.d.ts +1 -1
- package/dist/env.js +13 -11
- package/dist/env.js.map +3 -3
- package/dist/gcp.js +99 -93
- package/dist/gcp.js.map +3 -3
- package/dist/gcpIngress.js +93 -91
- package/dist/gcpIngress.js.map +2 -2
- package/dist/googlePlay.js +93 -91
- package/dist/googlePlay.js.map +2 -2
- package/dist/hetzner.d.ts +3 -3
- package/dist/hetzner.js +21 -13
- package/dist/hetzner.js.map +5 -5
- package/dist/hetznerDns.d.ts +2 -2
- package/dist/hetznerDns.js +11 -9
- package/dist/hetznerDns.js.map +3 -3
- package/dist/hetznerInfrastructure.js +16 -8
- package/dist/hetznerInfrastructure.js.map +7 -7
- package/dist/index.d.ts +2 -0
- package/dist/index.js +759 -285
- package/dist/index.js.map +7 -6
- package/dist/linode.d.ts +3 -3
- package/dist/linode.js +21 -13
- package/dist/linode.js.map +5 -5
- package/dist/linodeInfrastructure.js +21 -9
- package/dist/linodeInfrastructure.js.map +7 -7
- package/dist/managedPreview.js +9 -7
- package/dist/managedPreview.js.map +2 -2
- package/dist/mobileUpdate.d.ts +109 -0
- package/dist/mobileUpdate.js +464 -0
- package/dist/mobileUpdate.js.map +10 -0
- package/dist/nativeRelease.js +11 -9
- package/dist/nativeRelease.js.map +2 -2
- package/dist/preview.d.ts +3 -3
- package/dist/preview.js +15 -10
- package/dist/preview.js.map +3 -3
- package/dist/processManagers.d.ts +4 -4
- package/dist/releaseArtifact.js +12 -10
- package/dist/releaseArtifact.js.map +2 -2
- package/dist/route53.d.ts +2 -2
- package/dist/route53.js +9 -7
- package/dist/route53.js.map +3 -3
- package/dist/targets.d.ts +1 -1
- package/dist/tls.d.ts +5 -5
- package/dist/tls.js +23 -18
- package/dist/tls.js.map +3 -3
- package/dist/vultr.d.ts +4 -4
- package/dist/vultr.js +21 -13
- package/dist/vultr.js.map +5 -5
- package/dist/vultrInfrastructure.js +16 -8
- package/dist/vultrInfrastructure.js.map +7 -7
- package/package.json +7 -2
package/README.md
CHANGED
|
@@ -112,6 +112,40 @@ version. Serialize release jobs for one Apple app because App Store Connect has
|
|
|
112
112
|
no build-number reservation operation. Internal groups need no review. External
|
|
113
113
|
review is submitted only when explicitly requested.
|
|
114
114
|
|
|
115
|
+
### Signed mobile web-bundle updates (0.25.0)
|
|
116
|
+
|
|
117
|
+
`@absolutejs/deploy/mobile-update` publishes the signed immutable update
|
|
118
|
+
directory created by `absolute mobile update build`. The trusted server verifies
|
|
119
|
+
the ECDSA P-256 signature and every file digest before storing anything, then
|
|
120
|
+
selects staged-rollout cohorts from an anonymous installation ID. Native runtime
|
|
121
|
+
fingerprints prevent a web bundle from crossing a plugin, permission, Auth, or
|
|
122
|
+
local-data ABI boundary.
|
|
123
|
+
|
|
124
|
+
```ts
|
|
125
|
+
import {
|
|
126
|
+
createMobileUpdateHandler,
|
|
127
|
+
createMobileUpdateRegistry,
|
|
128
|
+
} from "@absolutejs/deploy/mobile-update";
|
|
129
|
+
|
|
130
|
+
const updates = createMobileUpdateRegistry({
|
|
131
|
+
publicKeys: { "production-2026": process.env.MOBILE_UPDATE_PUBLIC_KEY! },
|
|
132
|
+
store,
|
|
133
|
+
});
|
|
134
|
+
const handleUpdate = createMobileUpdateHandler({
|
|
135
|
+
appId: "com.example.product",
|
|
136
|
+
channel: "production",
|
|
137
|
+
registry: updates,
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
export default updates;
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Mount `handleUpdate` at
|
|
144
|
+
`/__absolute/mobile/updates/production/*`. Manifests are served without caching;
|
|
145
|
+
release assets are content-verified and immutable. Promotion only changes a
|
|
146
|
+
small channel pointer, and rollback can select a prior release or the embedded
|
|
147
|
+
store build without copying bundle bytes.
|
|
148
|
+
|
|
115
149
|
## Infrastructure providers (0.14.0)
|
|
116
150
|
|
|
117
151
|
Control planes use the normalized `InfrastructureProvider` contract from
|
package/dist/appStoreConnect.js
CHANGED
|
@@ -19,12 +19,14 @@ var __toESM = (mod, isNodeMode, target) => {
|
|
|
19
19
|
}
|
|
20
20
|
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
21
21
|
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
22
|
+
if (mod && typeof mod === "object" || typeof mod === "function") {
|
|
23
|
+
for (let key of __getOwnPropNames(mod))
|
|
24
|
+
if (!__hasOwnProp.call(to, key))
|
|
25
|
+
__defProp(to, key, {
|
|
26
|
+
get: __accessProp.bind(mod, key),
|
|
27
|
+
enumerable: true
|
|
28
|
+
});
|
|
29
|
+
}
|
|
28
30
|
if (canCache)
|
|
29
31
|
cache.set(mod, to);
|
|
30
32
|
return to;
|
|
@@ -576,10 +578,10 @@ var createAppStoreConnectReleasePublisher = (options) => {
|
|
|
576
578
|
};
|
|
577
579
|
};
|
|
578
580
|
export {
|
|
579
|
-
|
|
581
|
+
AppStoreConnectReleaseError,
|
|
580
582
|
createAppStoreConnectClient,
|
|
581
|
-
|
|
583
|
+
createAppStoreConnectReleasePublisher
|
|
582
584
|
};
|
|
583
585
|
|
|
584
|
-
//# debugId=
|
|
586
|
+
//# debugId=EBE7F52FBA3D199564756E2164756E21
|
|
585
587
|
//# sourceMappingURL=appStoreConnect.js.map
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import { createHash, createPrivateKey, sign } from \"node:crypto\";\nimport path from \"node:path\";\nimport type {\n NativeReleaseBlobStore,\n NativeReleasePublication,\n} from \"./nativeRelease\";\n\nconst API_ROOT = \"https://api.appstoreconnect.apple.com/v1\";\nconst DEFAULT_RECEIPT_PREFIX = \"absolutejs/app-store-connect-receipts\";\nconst RECEIPT_FORMAT = 1 as const;\nconst SHA256_PATTERN = /^[a-f0-9]{64}$/;\n\nexport type AppStoreConnectAuth = {\n issuerId: string;\n keyId: string;\n privateKey: string;\n};\n\nexport type AppStoreConnectReleaseTarget = {\n groups?: readonly string[];\n submitForReview?: boolean;\n whatsNew?: readonly { locale: string; text: string }[];\n};\n\nexport type AppStoreConnectReleaseIntent = {\n groups: string[];\n submitForReview: boolean;\n whatsNew: Array<{ locale: string; text: string }>;\n};\n\nexport type AppStoreConnectBuild = {\n id: string;\n processingState: \"PROCESSING\" | \"FAILED\" | \"INVALID\" | \"VALID\";\n version: string;\n};\n\nexport type AppStoreConnectBuildUpload = {\n id: string;\n state: \"AWAITING_UPLOAD\" | \"PROCESSING\" | \"FAILED\" | \"COMPLETE\";\n};\n\nexport type AppStoreConnectTestFlightGroup = {\n id: string;\n isInternal: boolean;\n name: string;\n};\n\nexport type AppStoreConnectReleaseReceipt = {\n appleAppId: string;\n buildId?: string;\n buildNumber: number;\n buildUploadFileId?: string;\n buildUploadId?: string;\n format: typeof RECEIPT_FORMAT;\n intent: AppStoreConnectReleaseIntent;\n marketingVersion: string;\n provider: \"app-store-connect\";\n releaseId: string;\n sha256: string;\n stage:\n | \"preparing\"\n | \"uploading\"\n | \"processing\"\n | \"distributed\"\n | \"review-submitted\";\n updatedAt: string;\n};\n\nexport type AppStoreConnectClient = {\n addBuildToGroup(options: {\n buildId: string;\n groupId: string;\n signal?: AbortSignal;\n }): Promise<void>;\n commitBuildUploadFile(options: {\n fileId: string;\n sha256: string;\n signal?: AbortSignal;\n }): Promise<void>;\n createBuildUpload(options: {\n appId: string;\n buildNumber: number;\n marketingVersion: string;\n signal?: AbortSignal;\n }): Promise<AppStoreConnectBuildUpload>;\n createBuildUploadFile(options: {\n buildUploadId: string;\n bytes: number;\n fileName: string;\n signal?: AbortSignal;\n }): Promise<string>;\n findAppId(options: {\n bundleId: string;\n signal?: AbortSignal;\n }): Promise<string>;\n findBuild(options: {\n appId: string;\n buildNumber: number;\n signal?: AbortSignal;\n }): Promise<AppStoreConnectBuild | null>;\n findBuildUploadFile(options: {\n buildUploadId: string;\n signal?: AbortSignal;\n }): Promise<string | null>;\n findBuildUpload(options: {\n appId: string;\n buildNumber: number;\n marketingVersion: string;\n signal?: AbortSignal;\n }): Promise<AppStoreConnectBuildUpload | null>;\n getBuildUpload(options: {\n buildUploadId: string;\n signal?: AbortSignal;\n }): Promise<AppStoreConnectBuildUpload>;\n hasBetaReviewSubmission(options: {\n buildId: string;\n signal?: AbortSignal;\n }): Promise<boolean>;\n listBuildNumbers(options: {\n appId: string;\n signal?: AbortSignal;\n }): Promise<number[]>;\n resolveGroups(options: {\n appId: string;\n groups: readonly string[];\n signal?: AbortSignal;\n }): Promise<AppStoreConnectTestFlightGroup[]>;\n submitBetaReview(options: {\n buildId: string;\n signal?: AbortSignal;\n }): Promise<void>;\n uploadBuildFile(options: {\n artifactPath: string;\n fileId: string;\n signal?: AbortSignal;\n }): Promise<void>;\n upsertWhatsNew(options: {\n buildId: string;\n locale: string;\n signal?: AbortSignal;\n text: string;\n }): Promise<void>;\n};\n\ntype NativePublisherBase = {\n publish(options: {\n allowUnsigned?: boolean;\n channel?: string;\n releaseRoot: string;\n signal?: AbortSignal;\n [key: string]: unknown;\n }): Promise<NativeReleasePublication>;\n};\n\nexport type AppStoreConnectReleasePublisherOptions = {\n auth?: AppStoreConnectAuth;\n client?: AppStoreConnectClient;\n clock?: () => Date;\n maxWaitMs?: number;\n pollIntervalMs?: number;\n receiptPrefix?: string;\n receiptStore: NativeReleaseBlobStore;\n registry: NativePublisherBase;\n target?: AppStoreConnectReleaseTarget;\n};\n\nexport type AppStoreConnectNativeReleasePublication =\n NativeReleasePublication & {\n appStoreConnect?: {\n receipt: AppStoreConnectReleaseReceipt;\n reused: boolean;\n };\n };\n\nexport type AppStoreConnectNativeReleasePublisher = Omit<\n NativePublisherBase,\n \"publish\"\n> & {\n prepareIosRelease(options: {\n buildIdentity: string;\n bundleId: string;\n marketingVersion: string;\n signal?: AbortSignal;\n }): Promise<{ buildNumber: number }>;\n publish(options: {\n allowUnsigned?: boolean;\n appStoreConnect?: AppStoreConnectReleaseTarget;\n channel?: string;\n releaseRoot: string;\n signal?: AbortSignal;\n [key: string]: unknown;\n }): Promise<AppStoreConnectNativeReleasePublication>;\n};\n\nexport class AppStoreConnectReleaseError extends Error {\n readonly status?: number;\n constructor(message: string, status?: number) {\n super(message);\n this.name = \"AppStoreConnectReleaseError\";\n this.status = status;\n }\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\nconst encodedJson = (value: unknown) =>\n new TextEncoder().encode(`${JSON.stringify(value, null, 2)}\\n`);\nconst decodedJson = (value: Uint8Array) =>\n JSON.parse(new TextDecoder().decode(value)) as unknown;\nconst sha256Bytes = (value: Uint8Array) =>\n createHash(\"sha256\").update(value).digest(\"hex\");\nconst hashIdentity = (value: string) =>\n createHash(\"sha256\").update(value).digest(\"hex\");\nconst isIsoTimestamp = (value: unknown): value is string =>\n typeof value === \"string\" &&\n !Number.isNaN(Date.parse(value)) &&\n new Date(value).toISOString() === value;\n\nconst normalizedPrefix = (value: string) => {\n const prefix = value.replace(/^\\/+|\\/+$/g, \"\");\n if (\n !prefix ||\n prefix.split(\"/\").some((part) => part === \".\" || part === \"..\")\n )\n throw new AppStoreConnectReleaseError(\n \"App Store Connect receipt prefix is invalid\",\n );\n return prefix;\n};\n\nconst normalizedIntent = (\n target: AppStoreConnectReleaseTarget = {},\n): AppStoreConnectReleaseIntent => {\n const groups = [\n ...new Set((target.groups ?? []).map((value) => value.trim())),\n ].sort();\n if (groups.some((value) => !value))\n throw new AppStoreConnectReleaseError(\n \"TestFlight group names or IDs must not be empty\",\n );\n const locales = new Set<string>();\n const whatsNew = [...(target.whatsNew ?? [])]\n .map(({ locale, text }) => ({ locale: locale.trim(), text: text.trim() }))\n .sort((left, right) => left.locale.localeCompare(right.locale));\n for (const item of whatsNew) {\n if (!item.locale || !item.text || locales.has(item.locale))\n throw new AppStoreConnectReleaseError(\n \"TestFlight notes require unique locales and non-empty text\",\n );\n locales.add(item.locale);\n }\n if (target.submitForReview && groups.length === 0)\n throw new AppStoreConnectReleaseError(\n \"TestFlight beta review requires at least one external group\",\n );\n return { groups, submitForReview: target.submitForReview ?? false, whatsNew };\n};\n\nconst parseReceipt = (value: unknown): AppStoreConnectReleaseReceipt => {\n if (\n !isRecord(value) ||\n value.format !== 1 ||\n value.provider !== \"app-store-connect\" ||\n typeof value.appleAppId !== \"string\" ||\n typeof value.releaseId !== \"string\" ||\n typeof value.sha256 !== \"string\" ||\n !SHA256_PATTERN.test(value.sha256) ||\n !Number.isSafeInteger(value.buildNumber) ||\n Number(value.buildNumber) < 1 ||\n typeof value.marketingVersion !== \"string\" ||\n !isIsoTimestamp(value.updatedAt) ||\n ![\n \"preparing\",\n \"uploading\",\n \"processing\",\n \"distributed\",\n \"review-submitted\",\n ].includes(String(value.stage)) ||\n !isRecord(value.intent)\n )\n throw new AppStoreConnectReleaseError(\n \"App Store Connect release receipt is invalid\",\n );\n for (const field of [\"buildId\", \"buildUploadFileId\", \"buildUploadId\"])\n if (value[field] !== undefined && typeof value[field] !== \"string\")\n throw new AppStoreConnectReleaseError(\n \"App Store Connect release receipt is invalid\",\n );\n const buildId = typeof value.buildId === \"string\" ? value.buildId : undefined;\n const buildUploadFileId =\n typeof value.buildUploadFileId === \"string\"\n ? value.buildUploadFileId\n : undefined;\n const buildUploadId =\n typeof value.buildUploadId === \"string\" ? value.buildUploadId : undefined;\n return {\n appleAppId: value.appleAppId,\n buildNumber: Number(value.buildNumber),\n format: 1,\n intent: normalizedIntent(value.intent as AppStoreConnectReleaseTarget),\n marketingVersion: value.marketingVersion,\n provider: \"app-store-connect\",\n releaseId: value.releaseId,\n sha256: value.sha256,\n stage: value.stage as AppStoreConnectReleaseReceipt[\"stage\"],\n updatedAt: value.updatedAt,\n ...(buildId ? { buildId } : {}),\n ...(buildUploadFileId ? { buildUploadFileId } : {}),\n ...(buildUploadId ? { buildUploadId } : {}),\n };\n};\n\nconst base64url = (value: string | Uint8Array) =>\n Buffer.from(value).toString(\"base64url\");\nconst createTokenProvider = (auth: AppStoreConnectAuth, clock: () => Date) => {\n if (!auth.issuerId || !auth.keyId || !auth.privateKey)\n throw new AppStoreConnectReleaseError(\n \"App Store Connect API credentials are incomplete\",\n );\n const key = createPrivateKey(auth.privateKey);\n return () => {\n const issuedAt = Math.floor(clock().getTime() / 1000);\n const header = base64url(\n JSON.stringify({ alg: \"ES256\", kid: auth.keyId, typ: \"JWT\" }),\n );\n const claims = base64url(\n JSON.stringify({\n aud: \"appstoreconnect-v1\",\n exp: issuedAt + 1199,\n iat: issuedAt,\n iss: auth.issuerId,\n }),\n );\n const payload = `${header}.${claims}`;\n return `${payload}.${base64url(sign(\"sha256\", Buffer.from(payload), { dsaEncoding: \"ieee-p1363\", key }))}`;\n };\n};\n\nconst responseError = async (response: Response) => {\n const body = await response.text().catch(() => \"\");\n return new AppStoreConnectReleaseError(\n `App Store Connect request failed (${response.status})${body ? `: ${body}` : \"\"}`,\n response.status,\n );\n};\n\nexport const createAppStoreConnectClient = (options: {\n auth: AppStoreConnectAuth;\n clock?: () => Date;\n fetch?: typeof fetch;\n}): AppStoreConnectClient => {\n const requestFetch = options.fetch ?? fetch;\n const token = createTokenProvider(\n options.auth,\n options.clock ?? (() => new Date()),\n );\n const request = async (route: string, init: RequestInit = {}) => {\n const response = await requestFetch(`${API_ROOT}${route}`, {\n ...init,\n headers: {\n Accept: \"application/json\",\n Authorization: `Bearer ${token()}`,\n ...(init.body ? { \"Content-Type\": \"application/json\" } : {}),\n ...init.headers,\n },\n });\n if (!response.ok) throw await responseError(response);\n return response.status === 204 ? undefined : await response.json();\n };\n const dataList = async (route: string) => {\n const result: Record<string, unknown>[] = [];\n let next: string | undefined = route;\n while (next) {\n const page = (await request(\n next.startsWith(API_ROOT) ? next.slice(API_ROOT.length) : next,\n )) as Record<string, unknown>;\n if (Array.isArray(page.data)) result.push(...page.data.filter(isRecord));\n const links = isRecord(page.links) ? page.links : undefined;\n next = typeof links?.next === \"string\" ? links.next : undefined;\n }\n return result;\n };\n const buildFrom = (data: Record<string, unknown>): AppStoreConnectBuild => {\n const attributes = isRecord(data.attributes) ? data.attributes : {};\n return {\n id: String(data.id),\n processingState: String(\n attributes.processingState,\n ) as AppStoreConnectBuild[\"processingState\"],\n version: String(attributes.version),\n };\n };\n const uploadFrom = (\n data: Record<string, unknown>,\n ): AppStoreConnectBuildUpload => {\n const attributes = isRecord(data.attributes) ? data.attributes : {};\n const state = isRecord(attributes.state)\n ? attributes.state.state\n : attributes.state;\n return {\n id: String(data.id),\n state: String(state) as AppStoreConnectBuildUpload[\"state\"],\n };\n };\n\n return {\n findAppId: async ({ bundleId, signal }) => {\n const items = await dataList(\n `/apps?filter[bundleId]=${encodeURIComponent(bundleId)}&fields[apps]=bundleId&limit=2`,\n );\n const exact = items.filter(\n (item) =>\n isRecord(item.attributes) && item.attributes.bundleId === bundleId,\n );\n if (exact.length !== 1)\n throw new AppStoreConnectReleaseError(\n `Expected one App Store Connect app for bundle ID ${bundleId}`,\n );\n signal?.throwIfAborted();\n return String(exact[0]!.id);\n },\n listBuildNumbers: async ({ appId, signal }) => {\n signal?.throwIfAborted();\n const items = await dataList(\n `/builds?filter[app]=${encodeURIComponent(appId)}&fields[builds]=version&limit=200`,\n );\n return items\n .map((item) =>\n Number(isRecord(item.attributes) ? item.attributes.version : NaN),\n )\n .filter((value) => Number.isSafeInteger(value) && value > 0);\n },\n findBuild: async ({ appId, buildNumber, signal }) => {\n signal?.throwIfAborted();\n const items = await dataList(\n `/builds?filter[app]=${encodeURIComponent(appId)}&filter[version]=${buildNumber}&fields[builds]=version,processingState&limit=2`,\n );\n return items.length ? buildFrom(items[0]!) : null;\n },\n findBuildUpload: async ({\n appId,\n buildNumber,\n marketingVersion,\n signal,\n }) => {\n signal?.throwIfAborted();\n const items = await dataList(\n `/apps/${encodeURIComponent(appId)}/buildUploads?filter[cfBundleVersion]=${buildNumber}&filter[cfBundleShortVersionString]=${encodeURIComponent(marketingVersion)}&filter[platform]=IOS&fields[buildUploads]=state,cfBundleVersion,cfBundleShortVersionString&limit=2`,\n );\n return items.length ? uploadFrom(items[0]!) : null;\n },\n createBuildUpload: async ({\n appId,\n buildNumber,\n marketingVersion,\n signal,\n }) => {\n const response = (await request(\"/buildUploads\", {\n method: \"POST\",\n signal,\n body: JSON.stringify({\n data: {\n type: \"buildUploads\",\n attributes: {\n cfBundleVersion: String(buildNumber),\n cfBundleShortVersionString: marketingVersion,\n platform: \"IOS\",\n },\n relationships: { app: { data: { type: \"apps\", id: appId } } },\n },\n }),\n })) as Record<string, unknown>;\n return uploadFrom(response.data as Record<string, unknown>);\n },\n getBuildUpload: async ({ buildUploadId, signal }) => {\n const response = (await request(\n `/buildUploads/${encodeURIComponent(buildUploadId)}?fields[buildUploads]=state`,\n { signal },\n )) as Record<string, unknown>;\n return uploadFrom(response.data as Record<string, unknown>);\n },\n createBuildUploadFile: async ({\n buildUploadId,\n bytes,\n fileName,\n signal,\n }) => {\n const response = (await request(\"/buildUploadFiles\", {\n method: \"POST\",\n signal,\n body: JSON.stringify({\n data: {\n type: \"buildUploadFiles\",\n attributes: {\n assetType: \"ASSET\",\n fileName,\n fileSize: bytes,\n uti: \"com.apple.ipa\",\n },\n relationships: {\n buildUpload: {\n data: { type: \"buildUploads\", id: buildUploadId },\n },\n },\n },\n }),\n })) as Record<string, unknown>;\n return String((response.data as Record<string, unknown>).id);\n },\n findBuildUploadFile: async ({ buildUploadId, signal }) => {\n signal?.throwIfAborted();\n const items = await dataList(\n `/buildUploads/${encodeURIComponent(buildUploadId)}/buildUploadFiles?fields[buildUploadFiles]=fileName&limit=2`,\n );\n return items.length ? String(items[0]!.id) : null;\n },\n uploadBuildFile: async ({ artifactPath, fileId, signal }) => {\n const response = (await request(\n `/buildUploadFiles/${encodeURIComponent(fileId)}?fields[buildUploadFiles]=uploadOperations`,\n { signal },\n )) as Record<string, unknown>;\n const data = response.data as Record<string, unknown>;\n const attrs = isRecord(data.attributes) ? data.attributes : {};\n const operations = Array.isArray(attrs.uploadOperations)\n ? attrs.uploadOperations.filter(isRecord)\n : [];\n if (!operations.length)\n throw new AppStoreConnectReleaseError(\n \"App Store Connect returned no IPA upload operations\",\n );\n await Promise.all(\n operations.map(async (operation) => {\n const offset = Number(operation.offset);\n const length = Number(operation.length);\n const headers = new Headers();\n if (Array.isArray(operation.requestHeaders))\n for (const entry of operation.requestHeaders)\n if (isRecord(entry))\n headers.set(String(entry.name), String(entry.value));\n const upload = await requestFetch(String(operation.url), {\n method: String(operation.method),\n headers,\n body: Bun.file(artifactPath).slice(offset, offset + length),\n signal,\n });\n if (!upload.ok) throw await responseError(upload);\n }),\n );\n },\n commitBuildUploadFile: async ({ fileId, sha256, signal }) => {\n await request(`/buildUploadFiles/${encodeURIComponent(fileId)}`, {\n method: \"PATCH\",\n signal,\n body: JSON.stringify({\n data: {\n type: \"buildUploadFiles\",\n id: fileId,\n attributes: {\n uploaded: true,\n sourceFileChecksums: {\n file: { algorithm: \"SHA_256\", hash: sha256 },\n },\n },\n },\n }),\n });\n },\n resolveGroups: async ({ appId, groups, signal }) => {\n signal?.throwIfAborted();\n const items = await dataList(\n `/betaGroups?filter[app]=${encodeURIComponent(appId)}&fields[betaGroups]=name,isInternalGroup&limit=200`,\n );\n return groups.map((requested) => {\n const matches = items.filter(\n (item) =>\n item.id === requested ||\n (isRecord(item.attributes) && item.attributes.name === requested),\n );\n if (matches.length !== 1)\n throw new AppStoreConnectReleaseError(\n `Expected one TestFlight group matching ${requested}`,\n );\n const item = matches[0]!;\n const attributes = item.attributes as Record<string, unknown>;\n return {\n id: String(item.id),\n isInternal: attributes.isInternalGroup === true,\n name: String(attributes.name),\n };\n });\n },\n addBuildToGroup: async ({ buildId, groupId, signal }) => {\n await request(\n `/betaGroups/${encodeURIComponent(groupId)}/relationships/builds`,\n {\n method: \"POST\",\n signal,\n body: JSON.stringify({ data: [{ type: \"builds\", id: buildId }] }),\n },\n );\n },\n upsertWhatsNew: async ({ buildId, locale, text, signal }) => {\n const items = await dataList(\n `/builds/${encodeURIComponent(buildId)}/betaBuildLocalizations?fields[betaBuildLocalizations]=locale,whatsNew&limit=200`,\n );\n const existing = items.find(\n (item) =>\n isRecord(item.attributes) && item.attributes.locale === locale,\n );\n if (existing) {\n await request(\n `/betaBuildLocalizations/${encodeURIComponent(String(existing.id))}`,\n {\n method: \"PATCH\",\n signal,\n body: JSON.stringify({\n data: {\n type: \"betaBuildLocalizations\",\n id: existing.id,\n attributes: { whatsNew: text },\n },\n }),\n },\n );\n } else {\n await request(\"/betaBuildLocalizations\", {\n method: \"POST\",\n signal,\n body: JSON.stringify({\n data: {\n type: \"betaBuildLocalizations\",\n attributes: { locale, whatsNew: text },\n relationships: {\n build: { data: { type: \"builds\", id: buildId } },\n },\n },\n }),\n });\n }\n },\n submitBetaReview: async ({ buildId, signal }) => {\n await request(\"/betaAppReviewSubmissions\", {\n method: \"POST\",\n signal,\n body: JSON.stringify({\n data: {\n type: \"betaAppReviewSubmissions\",\n relationships: { build: { data: { type: \"builds\", id: buildId } } },\n },\n }),\n });\n },\n hasBetaReviewSubmission: async ({ buildId, signal }) => {\n const response = (await request(\n `/builds/${encodeURIComponent(buildId)}/relationships/betaAppReviewSubmission`,\n { signal },\n )) as Record<string, unknown>;\n return isRecord(response.data) && typeof response.data.id === \"string\";\n },\n };\n};\n\nexport const createAppStoreConnectReleasePublisher = (\n options: AppStoreConnectReleasePublisherOptions,\n): AppStoreConnectNativeReleasePublisher => {\n const clock = options.clock ?? (() => new Date());\n const client =\n options.client ??\n (options.auth\n ? createAppStoreConnectClient({ auth: options.auth, clock })\n : undefined);\n if (!client)\n throw new AppStoreConnectReleaseError(\n \"App Store Connect auth or client is required\",\n );\n const prefix = normalizedPrefix(\n options.receiptPrefix ?? DEFAULT_RECEIPT_PREFIX,\n );\n const maxWaitMs = options.maxWaitMs ?? 20 * 60_000;\n const pollIntervalMs = options.pollIntervalMs ?? 5_000;\n const preparationKey = (bundleId: string, buildIdentity: string) =>\n `${prefix}/${hashIdentity(bundleId)}/preparations/${hashIdentity(buildIdentity)}.json`;\n const receiptKey = (\n appId: string,\n releaseId: string,\n intent: AppStoreConnectReleaseIntent,\n ) =>\n `${prefix}/${hashIdentity(appId)}/${releaseId}/${hashIdentity(JSON.stringify(intent))}.json`;\n const readStored = async (key: string) => {\n const bytes = await options.receiptStore.get(key);\n if (!bytes) return null;\n const head = await options.receiptStore.head(key);\n if (\n !head ||\n head.size !== bytes.byteLength ||\n head.metadata?.sha256 !== sha256Bytes(bytes)\n )\n throw new AppStoreConnectReleaseError(\n \"Stored App Store Connect state failed integrity verification\",\n );\n return decodedJson(bytes);\n };\n const writeStored = async (key: string, value: unknown, type: string) => {\n const bytes = encodedJson(value);\n await options.receiptStore.put(key, bytes, {\n cacheControl: \"no-cache\",\n contentType: \"application/json\",\n maxBytes: bytes.byteLength,\n metadata: { sha256: sha256Bytes(bytes), type },\n });\n };\n const waitForBuild = async (\n appId: string,\n buildNumber: number,\n buildUploadId: string,\n signal?: AbortSignal,\n ) => {\n const deadline = Date.now() + maxWaitMs;\n while (Date.now() <= deadline) {\n signal?.throwIfAborted();\n const build = await client.findBuild({ appId, buildNumber, signal });\n if (build?.processingState === \"VALID\") return build;\n if (\n build &&\n (build.processingState === \"FAILED\" ||\n build.processingState === \"INVALID\")\n )\n throw new AppStoreConnectReleaseError(\n `Apple rejected build ${buildNumber} during processing (${build.processingState})`,\n );\n const upload = await client.getBuildUpload({ buildUploadId, signal });\n if (upload.state === \"FAILED\")\n throw new AppStoreConnectReleaseError(\n `Apple rejected build upload ${buildUploadId}`,\n );\n await Bun.sleep(pollIntervalMs);\n }\n throw new AppStoreConnectReleaseError(\n `Timed out waiting for Apple to process build ${buildNumber}`,\n );\n };\n\n return {\n ...options.registry,\n prepareIosRelease: async ({ buildIdentity, bundleId, signal }) => {\n if (!buildIdentity)\n throw new AppStoreConnectReleaseError(\n \"App Store Connect build identity is invalid\",\n );\n const key = preparationKey(bundleId, buildIdentity);\n const stored = await readStored(key);\n if (\n isRecord(stored) &&\n stored.bundleId === bundleId &&\n stored.buildIdentity === buildIdentity &&\n Number.isSafeInteger(stored.buildNumber) &&\n Number(stored.buildNumber) > 0\n )\n return { buildNumber: Number(stored.buildNumber) };\n const appleAppId = await client.findAppId({ bundleId, signal });\n const numbers = await client.listBuildNumbers({\n appId: appleAppId,\n signal,\n });\n const highest = numbers.reduce(\n (maximum, value) => Math.max(maximum, value),\n 0,\n );\n if (!Number.isSafeInteger(highest) || highest >= Number.MAX_SAFE_INTEGER)\n throw new AppStoreConnectReleaseError(\n \"App Store Connect cannot allocate another iOS build number\",\n );\n const buildNumber = highest + 1;\n await writeStored(\n key,\n {\n appleAppId,\n buildIdentity,\n buildNumber,\n bundleId,\n format: 1,\n preparedAt: clock().toISOString(),\n },\n \"app-store-connect-build-preparation\",\n );\n return { buildNumber };\n },\n publish: async (input) => {\n const publication = await options.registry.publish(input);\n const metadata = publication.record.metadata;\n const target =\n (input.appStoreConnect as AppStoreConnectReleaseTarget | undefined) ??\n options.target;\n if (!target) return publication;\n if (metadata.platform !== \"ios\" || metadata.type !== \"ipa\")\n throw new AppStoreConnectReleaseError(\n \"App Store Connect publishing requires an iOS IPA release\",\n );\n if (!metadata.signed || !metadata.buildNumber)\n throw new AppStoreConnectReleaseError(\n \"App Store Connect publishing requires a signed, versioned IPA\",\n );\n const intent = normalizedIntent(target);\n const appleAppId = await client.findAppId({\n bundleId: metadata.appId,\n signal: input.signal,\n });\n const key = receiptKey(appleAppId, metadata.releaseId, intent);\n const existingValue = await readStored(key);\n let receipt = existingValue\n ? parseReceipt(existingValue)\n : {\n appleAppId,\n buildNumber: metadata.buildNumber,\n format: 1 as const,\n intent,\n marketingVersion: metadata.marketingVersion,\n provider: \"app-store-connect\" as const,\n releaseId: metadata.releaseId,\n sha256: metadata.sha256,\n stage: \"preparing\" as const,\n updatedAt: clock().toISOString(),\n };\n const writeReceipt = async (\n values: Partial<AppStoreConnectReleaseReceipt>,\n ) => {\n receipt = { ...receipt, ...values, updatedAt: clock().toISOString() };\n await writeStored(key, receipt, \"app-store-connect-release-receipt\");\n };\n if (\n receipt.stage === \"distributed\" ||\n receipt.stage === \"review-submitted\"\n )\n return { ...publication, appStoreConnect: { receipt, reused: true } };\n let upload = receipt.buildUploadId\n ? await client.getBuildUpload({\n buildUploadId: receipt.buildUploadId,\n signal: input.signal,\n })\n : await client.findBuildUpload({\n appId: appleAppId,\n buildNumber: metadata.buildNumber,\n marketingVersion: metadata.marketingVersion,\n signal: input.signal,\n });\n if (!upload)\n upload = await client.createBuildUpload({\n appId: appleAppId,\n buildNumber: metadata.buildNumber,\n marketingVersion: metadata.marketingVersion,\n signal: input.signal,\n });\n await writeReceipt({ buildUploadId: upload.id, stage: \"uploading\" });\n let build = await client.findBuild({\n appId: appleAppId,\n buildNumber: metadata.buildNumber,\n signal: input.signal,\n });\n if (!build || build.processingState !== \"VALID\") {\n let fileId = receipt.buildUploadFileId;\n if (!fileId) {\n fileId =\n (await client.findBuildUploadFile({\n buildUploadId: upload.id,\n signal: input.signal,\n })) ??\n (await client.createBuildUploadFile({\n buildUploadId: upload.id,\n bytes: metadata.bytes,\n fileName: metadata.artifact,\n signal: input.signal,\n }));\n await writeReceipt({ buildUploadFileId: fileId });\n }\n if (upload.state === \"AWAITING_UPLOAD\") {\n const artifactPath = path.join(input.releaseRoot, metadata.artifact);\n await client.uploadBuildFile({\n artifactPath,\n fileId,\n signal: input.signal,\n });\n await client.commitBuildUploadFile({\n fileId,\n sha256: metadata.sha256,\n signal: input.signal,\n });\n }\n await writeReceipt({ stage: \"processing\" });\n build = await waitForBuild(\n appleAppId,\n metadata.buildNumber,\n upload.id,\n input.signal,\n );\n }\n await writeReceipt({ buildId: build.id });\n const groups = await client.resolveGroups({\n appId: appleAppId,\n groups: intent.groups,\n signal: input.signal,\n });\n if (intent.submitForReview && groups.some((group) => group.isInternal))\n throw new AppStoreConnectReleaseError(\n \"TestFlight beta review may only be requested for external groups\",\n );\n for (const note of intent.whatsNew)\n await client.upsertWhatsNew({\n buildId: build.id,\n locale: note.locale,\n text: note.text,\n signal: input.signal,\n });\n for (const group of groups)\n await client.addBuildToGroup({\n buildId: build.id,\n groupId: group.id,\n signal: input.signal,\n });\n if (\n intent.submitForReview &&\n !(await client.hasBetaReviewSubmission({\n buildId: build.id,\n signal: input.signal,\n }))\n )\n await client.submitBetaReview({\n buildId: build.id,\n signal: input.signal,\n });\n await writeReceipt({\n stage: intent.submitForReview ? \"review-submitted\" : \"distributed\",\n });\n return { ...publication, appStoreConnect: { receipt, reused: false } };\n },\n };\n};\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "EBE7F52FBA3D199564756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/cloudTarget.d.ts
CHANGED
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
* that wires its provider-specific bits and renames `id` → `dropletId`
|
|
23
23
|
* on the way out.
|
|
24
24
|
*/
|
|
25
|
-
import type { Target } from
|
|
25
|
+
import type { Target } from "./targets";
|
|
26
26
|
/** Provider-specific hooks. Keep these pure of network IO timing — the helper schedules. */
|
|
27
27
|
export type CloudTargetHooks<Server, Id = number> = {
|
|
28
28
|
/** Find a server by name. Returns undefined if absent. */
|
|
@@ -87,9 +87,9 @@ export type CloudTargetResult<Id = number> = {
|
|
|
87
87
|
id: Id;
|
|
88
88
|
ipv4: string;
|
|
89
89
|
description: string;
|
|
90
|
-
exec: Target[
|
|
91
|
-
upload: Target[
|
|
92
|
-
close?: Target[
|
|
90
|
+
exec: Target["exec"];
|
|
91
|
+
upload: Target["upload"];
|
|
92
|
+
close?: Target["close"];
|
|
93
93
|
destroy: () => Promise<void>;
|
|
94
94
|
};
|
|
95
95
|
/**
|
package/dist/cloudflare.d.ts
CHANGED
|
@@ -12,13 +12,13 @@
|
|
|
12
12
|
* a hard dep. Default client uses `fetch` against
|
|
13
13
|
* `api.cloudflare.com/client/v4`.
|
|
14
14
|
*/
|
|
15
|
-
import type { DnsProvider } from
|
|
15
|
+
import type { DnsProvider } from "./dns";
|
|
16
16
|
/**
|
|
17
17
|
* Minimal subset of Cloudflare API calls. Lets callers BYO a client
|
|
18
18
|
* with retry / observability / etc.
|
|
19
19
|
*/
|
|
20
20
|
export type CloudflareClientLike = {
|
|
21
|
-
request: <T = unknown>(method:
|
|
21
|
+
request: <T = unknown>(method: "GET" | "POST" | "PUT" | "DELETE", path: string, body?: unknown) => Promise<T>;
|
|
22
22
|
};
|
|
23
23
|
export declare class CloudflareError extends Error {
|
|
24
24
|
readonly status: number;
|
package/dist/cloudflare.js
CHANGED
|
@@ -19,12 +19,14 @@ var __toESM = (mod, isNodeMode, target) => {
|
|
|
19
19
|
}
|
|
20
20
|
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
21
21
|
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
22
|
+
if (mod && typeof mod === "object" || typeof mod === "function") {
|
|
23
|
+
for (let key of __getOwnPropNames(mod))
|
|
24
|
+
if (!__hasOwnProp.call(to, key))
|
|
25
|
+
__defProp(to, key, {
|
|
26
|
+
get: __accessProp.bind(mod, key),
|
|
27
|
+
enumerable: true
|
|
28
|
+
});
|
|
29
|
+
}
|
|
28
30
|
if (canCache)
|
|
29
31
|
cache.set(mod, to);
|
|
30
32
|
return to;
|
|
@@ -179,10 +181,10 @@ var cloudflareProvider = (options) => {
|
|
|
179
181
|
};
|
|
180
182
|
};
|
|
181
183
|
export {
|
|
182
|
-
|
|
184
|
+
CloudflareError,
|
|
183
185
|
cloudflareProvider,
|
|
184
|
-
|
|
186
|
+
createCloudflareClient
|
|
185
187
|
};
|
|
186
188
|
|
|
187
|
-
//# debugId=
|
|
189
|
+
//# debugId=FC457D788144923564756E2164756E21
|
|
188
190
|
//# sourceMappingURL=cloudflare.js.map
|
package/dist/cloudflare.js.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/cloudflare.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n * @absolutejs/deploy/cloudflare — Cloudflare DNS adapter implementing\n * the {@link DnsProvider} contract from `./dns`.\n *\n * Scope: one provider instance is bound to one Cloudflare zone. Multi-\n * zone callers construct one provider per zone.\n *\n * Auth: Cloudflare API tokens with `Zone:DNS:Edit` scope. Global API\n * keys are intentionally not supported — tokens are the modern path.\n *\n * Narrow CloudflareClientLike interface keeps `cloudflare` SDK out as\n * a hard dep. Default client uses `fetch` against\n * `api.cloudflare.com/client/v4`.\n */\n\nimport type {\n
|
|
5
|
+
"/**\n * @absolutejs/deploy/cloudflare — Cloudflare DNS adapter implementing\n * the {@link DnsProvider} contract from `./dns`.\n *\n * Scope: one provider instance is bound to one Cloudflare zone. Multi-\n * zone callers construct one provider per zone.\n *\n * Auth: Cloudflare API tokens with `Zone:DNS:Edit` scope. Global API\n * keys are intentionally not supported — tokens are the modern path.\n *\n * Narrow CloudflareClientLike interface keeps `cloudflare` SDK out as\n * a hard dep. Default client uses `fetch` against\n * `api.cloudflare.com/client/v4`.\n */\n\nimport type {\n DnsProvider,\n DnsRecord,\n DnsRecordFilter,\n DnsRecordSpec,\n DnsRecordType,\n} from \"./dns\";\n\nconst CLOUDFLARE_API_BASE = \"https://api.cloudflare.com/client/v4\";\n\n/**\n * Minimal subset of Cloudflare API calls. Lets callers BYO a client\n * with retry / observability / etc.\n */\nexport type CloudflareClientLike = {\n request: <T = unknown>(\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\",\n path: string,\n body?: unknown,\n ) => Promise<T>;\n};\n\n/** Cloudflare's standard envelope on every response. */\ntype CloudflareResponse<T> = {\n success: boolean;\n result: T;\n errors?: Array<{ code: number; message: string }>;\n messages?: Array<{ code: number; message: string }>;\n};\n\n/** Raw record from Cloudflare's API. */\ntype CloudflareDnsRecord = {\n id: string;\n name: string;\n type: string;\n content: string;\n ttl?: number;\n proxied?: boolean;\n comment?: string;\n zone_id?: string;\n zone_name?: string;\n};\n\nexport class CloudflareError extends Error {\n readonly status: number;\n readonly body: unknown;\n constructor(message: string, status: number, body: unknown) {\n super(message);\n this.name = \"CloudflareError\";\n this.status = status;\n this.body = body;\n }\n}\n\n/**\n * fetch-backed default client. Throws CloudflareError on non-2xx OR\n * on a 2xx with `success: false` (Cloudflare returns 200 + an errors\n * array for some validation failures, hence the second check).\n */\nexport const createCloudflareClient = (\n token: string,\n options: { baseUrl?: string; fetch?: typeof fetch } = {},\n): CloudflareClientLike => {\n const base = options.baseUrl ?? CLOUDFLARE_API_BASE;\n const f = options.fetch ?? fetch;\n return {\n request: async <T>(\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\",\n path: string,\n body?: unknown,\n ): Promise<T> => {\n const init: RequestInit = {\n headers: {\n authorization: `Bearer ${token}`,\n \"content-type\": \"application/json\",\n },\n method,\n };\n if (body !== undefined) init.body = JSON.stringify(body);\n const response = await f(`${base}${path}`, init);\n const text = await response.text();\n const parsed = text.length > 0 ? JSON.parse(text) : undefined;\n if (!response.ok) {\n throw new CloudflareError(\n `Cloudflare API ${method} ${path} failed: ${response.status} ${response.statusText}`,\n response.status,\n parsed,\n );\n }\n return parsed as T;\n },\n };\n};\n\nexport type CloudflareProviderOptions = {\n /** API token with `Zone:DNS:Edit` permission. Required unless `client` is set. */\n token?: string;\n /** Custom client. Overrides token-built default. */\n client?: CloudflareClientLike;\n /** Cloudflare Zone ID this provider operates on. */\n zoneId: string;\n /** Optional zone name for log copy. Default uses `zoneId` truncated. */\n zoneName?: string;\n};\n\nconst resolveClient = (\n options: Pick<CloudflareProviderOptions, \"client\" | \"token\">,\n): CloudflareClientLike => {\n if (options.client !== undefined) return options.client;\n if (options.token !== undefined && options.token.length > 0) {\n return createCloudflareClient(options.token);\n }\n throw new Error(\n \"[deploy/cloudflare] either `token` or `client` must be provided\",\n );\n};\n\nconst toDnsRecord = (raw: CloudflareDnsRecord): DnsRecord => ({\n content: raw.content,\n id: raw.id,\n name: raw.name,\n type: raw.type as DnsRecordType,\n ...(raw.ttl !== undefined ? { ttl: raw.ttl } : {}),\n ...(raw.proxied !== undefined ? { proxied: raw.proxied } : {}),\n ...(raw.comment !== undefined ? { comment: raw.comment } : {}),\n});\n\nconst specEqualsRecord = (spec: DnsRecordSpec, record: DnsRecord): boolean => {\n if (record.content !== spec.content) return false;\n if (spec.ttl !== undefined && record.ttl !== spec.ttl) return false;\n if (spec.proxied !== undefined && record.proxied !== spec.proxied)\n return false;\n if (spec.comment !== undefined && record.comment !== spec.comment)\n return false;\n return true;\n};\n\nconst buildQuery = (filter?: DnsRecordFilter): string => {\n const params: string[] = [];\n if (filter?.name !== undefined) {\n params.push(`name=${encodeURIComponent(filter.name)}`);\n }\n if (filter?.type !== undefined) {\n params.push(`type=${encodeURIComponent(filter.type)}`);\n }\n return params.length > 0 ? `?${params.join(\"&\")}` : \"\";\n};\n\n/**\n * Build a {@link DnsProvider} bound to one Cloudflare zone.\n */\nexport const cloudflareProvider = (\n options: CloudflareProviderOptions,\n): DnsProvider => {\n const client = resolveClient(options);\n const { zoneId } = options;\n const zoneLabel = options.zoneName ?? zoneId.slice(0, 8);\n const recordsPath = `/zones/${zoneId}/dns_records`;\n\n const list = async (filter?: DnsRecordFilter): Promise<DnsRecord[]> => {\n const response = await client.request<\n CloudflareResponse<CloudflareDnsRecord[]>\n >(\"GET\", `${recordsPath}${buildQuery(filter)}`);\n return response.result.map(toDnsRecord);\n };\n\n const find = async (key: {\n name: string;\n type: DnsRecordType;\n }): Promise<DnsRecord | undefined> => {\n const matches = await list(key);\n // Cloudflare's filter is sometimes substring-loose on `name`; pin to\n // an exact match here so a `'api.example.com'` lookup never returns\n // `'api.example.com.staging'`.\n const exact = matches.filter(\n (record) => record.name === key.name || record.name === `${key.name}.`,\n );\n if (exact.length === 0) return undefined;\n if (exact.length > 1) {\n throw new Error(\n `[deploy/cloudflare] multiple ${key.type} records for \"${key.name}\" in zone ${zoneLabel} — drifted state; resolve manually before upsert.`,\n );\n }\n return exact[0];\n };\n\n const create = async (spec: DnsRecordSpec): Promise<DnsRecord> => {\n const response = await client.request<\n CloudflareResponse<CloudflareDnsRecord>\n >(\"POST\", recordsPath, {\n content: spec.content,\n name: spec.name,\n type: spec.type,\n ...(spec.ttl !== undefined ? { ttl: spec.ttl } : {}),\n ...(spec.proxied !== undefined ? { proxied: spec.proxied } : {}),\n ...(spec.comment !== undefined ? { comment: spec.comment } : {}),\n });\n return toDnsRecord(response.result);\n };\n\n const update = async (\n id: string,\n spec: DnsRecordSpec,\n ): Promise<DnsRecord> => {\n const response = await client.request<\n CloudflareResponse<CloudflareDnsRecord>\n >(\"PUT\", `${recordsPath}/${id}`, {\n content: spec.content,\n name: spec.name,\n type: spec.type,\n ...(spec.ttl !== undefined ? { ttl: spec.ttl } : {}),\n ...(spec.proxied !== undefined ? { proxied: spec.proxied } : {}),\n ...(spec.comment !== undefined ? { comment: spec.comment } : {}),\n });\n return toDnsRecord(response.result);\n };\n\n const deleteRecord = async (id: string): Promise<void> => {\n try {\n await client.request(\"DELETE\", `${recordsPath}/${id}`);\n } catch (error) {\n if (error instanceof CloudflareError && error.status === 404) {\n return; // already gone — idempotent\n }\n throw error;\n }\n };\n\n const upsert = async (spec: DnsRecordSpec): Promise<DnsRecord> => {\n const existing = await find({ name: spec.name, type: spec.type });\n if (existing === undefined) {\n return create(spec);\n }\n if (specEqualsRecord(spec, existing)) {\n return existing;\n }\n return update(existing.id, spec);\n };\n\n return {\n create,\n delete: deleteRecord,\n description: `cloudflare zone \"${zoneLabel}\"`,\n find,\n list,\n update,\n upsert,\n };\n};\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "FC457D788144923564756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/deployer.d.ts
CHANGED
|
@@ -12,29 +12,29 @@
|
|
|
12
12
|
* reloads the process manager — no re-upload, no re-build, just a fast
|
|
13
13
|
* switch.
|
|
14
14
|
*/
|
|
15
|
-
import type { ProcessManager } from
|
|
16
|
-
import type { Target } from
|
|
15
|
+
import type { ProcessManager } from "./processManagers";
|
|
16
|
+
import type { Target } from "./targets";
|
|
17
17
|
export type Source = {
|
|
18
18
|
/** Local directory to copy. */
|
|
19
|
-
kind:
|
|
19
|
+
kind: "directory";
|
|
20
20
|
root: string;
|
|
21
21
|
/** Globs excluded from upload. Defaults to common dev artifacts. */
|
|
22
22
|
exclude?: string[];
|
|
23
23
|
};
|
|
24
24
|
export type VerifySpec = {
|
|
25
|
-
kind:
|
|
25
|
+
kind: "http";
|
|
26
26
|
url: string;
|
|
27
27
|
retries?: number;
|
|
28
28
|
intervalMs?: number;
|
|
29
29
|
expectStatus?: number;
|
|
30
30
|
} | {
|
|
31
|
-
kind:
|
|
31
|
+
kind: "tcp";
|
|
32
32
|
host: string;
|
|
33
33
|
port: number;
|
|
34
34
|
retries?: number;
|
|
35
35
|
intervalMs?: number;
|
|
36
36
|
} | {
|
|
37
|
-
kind:
|
|
37
|
+
kind: "custom";
|
|
38
38
|
check: (ctx: DeployContext) => Promise<boolean>;
|
|
39
39
|
};
|
|
40
40
|
export type ReleaseAnnotations = {
|
|
@@ -80,7 +80,7 @@ export type DeployHooks = {
|
|
|
80
80
|
releaseId: string;
|
|
81
81
|
durationMs: number;
|
|
82
82
|
}) => void | Promise<void>;
|
|
83
|
-
onLog?: (line: string, stream:
|
|
83
|
+
onLog?: (line: string, stream: "stdout" | "stderr", step: string) => void;
|
|
84
84
|
onError?: (error: {
|
|
85
85
|
step: string;
|
|
86
86
|
releaseId: string;
|
|
@@ -133,7 +133,7 @@ export type DeployerOptions = {
|
|
|
133
133
|
export type ReleaseRecord = {
|
|
134
134
|
releaseId: string;
|
|
135
135
|
annotations: ReleaseAnnotations;
|
|
136
|
-
status:
|
|
136
|
+
status: "in-progress" | "completed" | "failed";
|
|
137
137
|
failedStep?: string;
|
|
138
138
|
completedSteps: string[];
|
|
139
139
|
startedAt: number;
|
|
@@ -157,7 +157,7 @@ export type Deployer = {
|
|
|
157
157
|
/** Stop the active release through the configured process manager. */
|
|
158
158
|
stop: () => Promise<void>;
|
|
159
159
|
/** Best-effort active process status from the configured process manager. */
|
|
160
|
-
status: () => Promise<
|
|
160
|
+
status: () => Promise<"running" | "stopped" | "unknown">;
|
|
161
161
|
listReleases: () => Promise<string[]>;
|
|
162
162
|
/** Read the deploy meta for a specific release (or null if missing). */
|
|
163
163
|
readReleaseMeta: (releaseId: string) => Promise<ReleaseRecord | null>;
|
package/dist/digitalocean.d.ts
CHANGED
|
@@ -20,20 +20,20 @@
|
|
|
20
20
|
* SDK out as a hard dep. Default client uses `fetch` against
|
|
21
21
|
* `api.digitalocean.com`; pass your own for retry / observability.
|
|
22
22
|
*/
|
|
23
|
-
import type { Target } from
|
|
23
|
+
import type { Target } from "./targets";
|
|
24
24
|
/**
|
|
25
25
|
* Minimal subset of DO API calls we make. Lets callers BYO a client
|
|
26
26
|
* with retry / observability / etc. (e.g. wrap got, undici, or a
|
|
27
27
|
* tenant-scoped client that injects different tokens per call).
|
|
28
28
|
*/
|
|
29
29
|
export type DigitalOceanClientLike = {
|
|
30
|
-
request: <T = unknown>(method:
|
|
30
|
+
request: <T = unknown>(method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE", path: string, body?: unknown) => Promise<T>;
|
|
31
31
|
};
|
|
32
32
|
/** A DigitalOcean droplet record, narrowed to what we inspect. */
|
|
33
33
|
export type DigitalOceanDroplet = {
|
|
34
34
|
id: number;
|
|
35
35
|
name: string;
|
|
36
|
-
status:
|
|
36
|
+
status: "new" | "active" | "off" | "archive";
|
|
37
37
|
region?: {
|
|
38
38
|
slug: string;
|
|
39
39
|
};
|
|
@@ -41,11 +41,11 @@ export type DigitalOceanDroplet = {
|
|
|
41
41
|
networks: {
|
|
42
42
|
v4: Array<{
|
|
43
43
|
ip_address: string;
|
|
44
|
-
type:
|
|
44
|
+
type: "public" | "private";
|
|
45
45
|
}>;
|
|
46
46
|
v6?: Array<{
|
|
47
47
|
ip_address: string;
|
|
48
|
-
type:
|
|
48
|
+
type: "public" | "private";
|
|
49
49
|
}>;
|
|
50
50
|
};
|
|
51
51
|
tags?: string[];
|
package/dist/digitalocean.js
CHANGED
|
@@ -19,12 +19,14 @@ var __toESM = (mod, isNodeMode, target) => {
|
|
|
19
19
|
}
|
|
20
20
|
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
21
21
|
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
22
|
+
if (mod && typeof mod === "object" || typeof mod === "function") {
|
|
23
|
+
for (let key of __getOwnPropNames(mod))
|
|
24
|
+
if (!__hasOwnProp.call(to, key))
|
|
25
|
+
__defProp(to, key, {
|
|
26
|
+
get: __accessProp.bind(mod, key),
|
|
27
|
+
enumerable: true
|
|
28
|
+
});
|
|
29
|
+
}
|
|
28
30
|
if (canCache)
|
|
29
31
|
cache.set(mod, to);
|
|
30
32
|
return to;
|
|
@@ -199,7 +201,13 @@ var sshTarget = (options) => {
|
|
|
199
201
|
}
|
|
200
202
|
return;
|
|
201
203
|
}
|
|
202
|
-
const argv = [
|
|
204
|
+
const argv = [
|
|
205
|
+
"scp",
|
|
206
|
+
"-r",
|
|
207
|
+
...sshBaseFlags(options),
|
|
208
|
+
localPath,
|
|
209
|
+
`${remote}:${remotePath}`
|
|
210
|
+
];
|
|
203
211
|
const result = await runSpawn(argv, { timeoutMs: 600000 });
|
|
204
212
|
if (result.exitCode !== 0) {
|
|
205
213
|
throw new Error(`scp upload failed (exit ${result.exitCode}): ${result.stderr || result.stdout}`);
|
|
@@ -436,13 +444,13 @@ var digitalOceanTarget = async (options) => {
|
|
|
436
444
|
};
|
|
437
445
|
};
|
|
438
446
|
export {
|
|
439
|
-
|
|
440
|
-
findDigitalOceanDroplet,
|
|
441
|
-
digitalOceanTarget,
|
|
442
|
-
destroyDigitalOceanDroplet,
|
|
447
|
+
DigitalOceanError,
|
|
443
448
|
createDigitalOceanClient,
|
|
444
|
-
|
|
449
|
+
destroyDigitalOceanDroplet,
|
|
450
|
+
digitalOceanTarget,
|
|
451
|
+
findDigitalOceanDroplet,
|
|
452
|
+
listDigitalOceanDroplets
|
|
445
453
|
};
|
|
446
454
|
|
|
447
|
-
//# debugId=
|
|
455
|
+
//# debugId=42033357F612902564756E2164756E21
|
|
448
456
|
//# sourceMappingURL=digitalocean.js.map
|