domainkit 0.1.1 → 0.2.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.
Files changed (67) hide show
  1. package/README.md +87 -83
  2. package/dist/{auth-B0owkrpk.mjs → auth-CZ1pZHMZ.mjs} +212 -20
  3. package/dist/auth-CZ1pZHMZ.mjs.map +1 -0
  4. package/dist/{client-BnD7QLRF.mjs → auth-CzhZ3Cuc.mjs} +235 -131
  5. package/dist/auth-CzhZ3Cuc.mjs.map +1 -0
  6. package/dist/authorization-DOg2Re1D.mjs +247 -0
  7. package/dist/authorization-DOg2Re1D.mjs.map +1 -0
  8. package/dist/canonical-json-CpvqGMcr.mjs +57 -0
  9. package/dist/canonical-json-CpvqGMcr.mjs.map +1 -0
  10. package/dist/{cloudflare-D0-J2MfP.mjs → cloudflare-BedFw4cX.mjs} +26 -3
  11. package/dist/cloudflare-BedFw4cX.mjs.map +1 -0
  12. package/dist/cloudflare-FDl5q7Dm.d.mts +32 -0
  13. package/dist/cloudflare.d.mts +3 -3
  14. package/dist/cloudflare.mjs +2 -2
  15. package/dist/connection-BWrBwqjk.mjs +58 -0
  16. package/dist/connection-BWrBwqjk.mjs.map +1 -0
  17. package/dist/connection-CEqadXSm.d.mts +182 -0
  18. package/dist/connection-CcQokgrd.mjs +186 -0
  19. package/dist/connection-CcQokgrd.mjs.map +1 -0
  20. package/dist/connection-api-DftK7eHo.d.mts +7 -0
  21. package/dist/{dns-record-C_KwGPLf.mjs → dns-record-BLeqo56C.mjs} +23 -3
  22. package/dist/dns-record-BLeqo56C.mjs.map +1 -0
  23. package/dist/effect-cloudflare.d.mts +2 -2
  24. package/dist/effect-cloudflare.mjs +2 -2
  25. package/dist/effect-vercel.d.mts +2 -2
  26. package/dist/effect-vercel.mjs +2 -2
  27. package/dist/effect.d.mts +9 -46
  28. package/dist/effect.mjs +29 -7
  29. package/dist/effect.mjs.map +1 -1
  30. package/dist/{index-D2howbNz.d.mts → index-B1opsgls.d.mts} +53 -6
  31. package/dist/{index-CEzk2gbZ.d.mts → index-Ewc__bQu.d.mts} +58 -7
  32. package/dist/index.d.mts +169 -113
  33. package/dist/index.mjs +201 -139
  34. package/dist/index.mjs.map +1 -1
  35. package/dist/{resolver-BHPsADzE.d.mts → resolver-CJOR9mQ8.d.mts} +620 -263
  36. package/dist/resolver-CxE-VDw4.mjs +598 -0
  37. package/dist/resolver-CxE-VDw4.mjs.map +1 -0
  38. package/dist/testing.d.mts +53 -44
  39. package/dist/testing.mjs +379 -107
  40. package/dist/testing.mjs.map +1 -1
  41. package/dist/{vercel-DD89DCqH.mjs → vercel-CWZ33NUS.mjs} +23 -3
  42. package/dist/vercel-CWZ33NUS.mjs.map +1 -0
  43. package/dist/vercel-DgJaUX9D.d.mts +31 -0
  44. package/dist/vercel.d.mts +3 -3
  45. package/dist/vercel.mjs +2 -2
  46. package/dist/verify-BzpiA0Es.mjs +642 -0
  47. package/dist/verify-BzpiA0Es.mjs.map +1 -0
  48. package/dist/verify-DZWLM91T.d.mts +805 -0
  49. package/dist/zone-discovery-BA5I24vu.d.mts +1390 -0
  50. package/dist/zones-DKHTpX9C.mjs +19 -0
  51. package/dist/zones-DKHTpX9C.mjs.map +1 -0
  52. package/package.json +1 -1
  53. package/dist/auth-B0owkrpk.mjs.map +0 -1
  54. package/dist/client-BnD7QLRF.mjs.map +0 -1
  55. package/dist/cloudflare-CprjjXfm.d.mts +0 -23
  56. package/dist/cloudflare-D0-J2MfP.mjs.map +0 -1
  57. package/dist/dns-record-C_KwGPLf.mjs.map +0 -1
  58. package/dist/manifest-CP85ePFn.d.mts +0 -583
  59. package/dist/receipt-CGSnfZQ6.mjs +0 -28
  60. package/dist/receipt-CGSnfZQ6.mjs.map +0 -1
  61. package/dist/resolver-tEXpKxmH.mjs +0 -200
  62. package/dist/resolver-tEXpKxmH.mjs.map +0 -1
  63. package/dist/vercel-D-E2aqb1.d.mts +0 -22
  64. package/dist/vercel-DD89DCqH.mjs.map +0 -1
  65. package/dist/verify-B80xCBh2.d.mts +0 -1407
  66. package/dist/verify-BXOvXE20.mjs +0 -1388
  67. package/dist/verify-BXOvXE20.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"testing.mjs","names":["make","layer","ConnectionStore.Service","toAsync","ConnectionStore.toAsync","make","layer","ProviderAuthorizationStore.Service","toAsync","ProviderAuthorizationStore.toAsync","make","layer","CredentialStore.Service","toAsync","CredentialStore.toAsync","make","DomainName.parse","layer","DnsProvider.Service","toAsync","DnsProvider.toAsync","make","layer","DnsResolver.Service","toAsync","DnsResolver.toAsync","make","layer","OAuthStateStore.Service","toAsync","OAuthStateStore.toAsync","ReceiptStore.Service","ReceiptStore.toAsync"],"sources":["../src/stores/in-memory-connection.ts","../src/stores/in-memory-authorization.ts","../src/stores/in-memory-credential.ts","../src/provider/in-memory.ts","../src/verification/in-memory.ts","../src/stores/in-memory-oauth-state.ts","../src/stores/in-memory-receipt.ts"],"sourcesContent":["import { Effect, Layer } from \"effect\";\n\nimport type * as Connection from \"../auth/connection.ts\";\nimport * as ConnectionStore from \"./connection.ts\";\n\nexport function make(): ConnectionStore.Interface {\n const connections = new Map<string, Connection.Connection>();\n return {\n delete: Effect.fn(\"InMemoryConnectionStore.delete\")((connectionId) =>\n Effect.sync(() => void connections.delete(connectionId)),\n ),\n find: Effect.fn(\"InMemoryConnectionStore.find\")((ownerId, authorizationId) =>\n Effect.sync(\n () =>\n [...connections.values()].find(\n (connection) =>\n connection.ownerId === ownerId && connection.authorizationId === authorizationId,\n ) ?? null,\n ),\n ),\n get: Effect.fn(\"InMemoryConnectionStore.get\")((connectionId) =>\n Effect.sync(() => connections.get(connectionId) ?? null),\n ),\n listByAuthorizationId: Effect.fn(\"InMemoryConnectionStore.listByAuthorizationId\")(\n (authorizationId) =>\n Effect.sync(() =>\n [...connections.values()].filter(\n (connection) => connection.authorizationId === authorizationId,\n ),\n ),\n ),\n put: Effect.fn(\"InMemoryConnectionStore.put\")((connection) =>\n Effect.sync(() => void connections.set(connection.id, connection)),\n ),\n };\n}\n\nexport const layer = (): Layer.Layer<ConnectionStore.Service> =>\n Layer.succeed(ConnectionStore.Service, make());\n\nexport const toAsync = (\n store: ConnectionStore.Interface = make(),\n): ConnectionStore.AsyncInterface => ConnectionStore.toAsync(store);\n","import { Effect, Layer } from \"effect\";\n\nimport type * as ProviderAuthorization from \"../auth/authorization.ts\";\nimport * as ProviderAuthorizationStore from \"./authorization.ts\";\n\nconst accountKey = (providerId: string, accountId: string): string => `${providerId}\\0${accountId}`;\n\nexport function make(): ProviderAuthorizationStore.Interface {\n const authorizations = new Map<string, ProviderAuthorization.ProviderAuthorization>();\n const accounts = new Map<string, string>();\n return {\n delete: Effect.fn(\"InMemoryProviderAuthorizationStore.delete\")((authorizationId) =>\n Effect.sync(() => {\n const authorization = authorizations.get(authorizationId);\n if (authorization !== undefined) {\n accounts.delete(accountKey(authorization.providerId, authorization.accountId));\n authorizations.delete(authorizationId);\n }\n }),\n ),\n findByProviderAccount: Effect.fn(\"InMemoryProviderAuthorizationStore.findByProviderAccount\")(\n (providerId, accountId) =>\n Effect.sync(() => {\n const id = accounts.get(accountKey(providerId, accountId));\n return id === undefined ? null : (authorizations.get(id) ?? null);\n }),\n ),\n get: Effect.fn(\"InMemoryProviderAuthorizationStore.get\")((authorizationId) =>\n Effect.sync(() => authorizations.get(authorizationId) ?? null),\n ),\n put: Effect.fn(\"InMemoryProviderAuthorizationStore.put\")((authorization) =>\n Effect.sync(() => {\n authorizations.set(authorization.id, authorization);\n accounts.set(\n accountKey(authorization.providerId, authorization.accountId),\n authorization.id,\n );\n }),\n ),\n };\n}\n\nexport const layer = (): Layer.Layer<ProviderAuthorizationStore.Service> =>\n Layer.succeed(ProviderAuthorizationStore.Service, make());\n\nexport const toAsync = (\n store: ProviderAuthorizationStore.Interface = make(),\n): ProviderAuthorizationStore.AsyncInterface => ProviderAuthorizationStore.toAsync(store);\n","import { Effect, Layer } from \"effect\";\n\nimport type * as Connection from \"../auth/connection.ts\";\nimport * as CredentialStore from \"./credential.ts\";\n\nexport function make(): CredentialStore.Interface {\n const credentials = new Map<string, Connection.StoredCredential>();\n return {\n delete: Effect.fn(\"InMemoryCredentialStore.delete\")((authorizationId) =>\n Effect.sync(() => void credentials.delete(authorizationId)),\n ),\n get: Effect.fn(\"InMemoryCredentialStore.get\")((authorizationId) =>\n Effect.sync(() => credentials.get(authorizationId) ?? null),\n ),\n put: Effect.fn(\"InMemoryCredentialStore.put\")((authorizationId, credential) =>\n Effect.sync(() => void credentials.set(authorizationId, credential)),\n ),\n };\n}\n\nexport const layer = (): Layer.Layer<CredentialStore.Service> =>\n Layer.succeed(CredentialStore.Service, make());\n\nexport const toAsync = (\n store: CredentialStore.Interface = make(),\n): CredentialStore.AsyncInterface => CredentialStore.toAsync(store);\n","import { Effect, Layer } from \"effect\";\n\nimport * as DomainName from \"../domain/domain-name.ts\";\nimport type * as DnsRecord from \"../domain/dns-record.ts\";\nimport * as DnsProvider from \"./provider.ts\";\n\nexport interface Options {\n readonly id?: string;\n readonly records?: Readonly<Record<string, ReadonlyArray<DnsRecord.Observed>>>;\n}\n\nexport function make(options: Options = {}): DnsProvider.Interface {\n const id = options.id ?? \"memory\";\n const records = new Map<DomainName.DomainName, Array<DnsRecord.Observed>>();\n const recordIds = new Map<string, DnsRecord.Observed>();\n for (const [zone, initial] of Object.entries(options.records ?? {})) {\n records.set(DomainName.parse(zone), [...initial]);\n for (const [index, record] of initial.entries()) recordIds.set(`${id}:${index + 1}`, record);\n }\n return {\n id,\n listRecords: Effect.fn(\"InMemoryDnsProvider.listRecords\")((zone) =>\n Effect.sync(() => [...(records.get(zone) ?? [])]),\n ),\n createRecord: Effect.fn(\"InMemoryDnsProvider.createRecord\")((zone, record) =>\n Effect.sync(() => {\n const current = records.get(zone) ?? [];\n current.push(record);\n records.set(zone, current);\n const providerRecordId = `${id}:${current.length}`;\n recordIds.set(providerRecordId, record);\n return { providerRecordId };\n }),\n ),\n deleteRecord: Effect.fn(\"InMemoryDnsProvider.deleteRecord\")((zone, providerRecordId) =>\n Effect.sync(() => {\n const record = recordIds.get(providerRecordId);\n if (record === undefined) return;\n records.set(\n zone,\n (records.get(zone) ?? []).filter((candidate) => candidate !== record),\n );\n recordIds.delete(providerRecordId);\n }),\n ),\n getRecord: Effect.fn(\"InMemoryDnsProvider.getRecord\")((_zone, providerRecordId) =>\n Effect.sync(() => recordIds.get(providerRecordId) ?? null),\n ),\n };\n}\n\nexport const layer = (options: Options = {}): Layer.Layer<DnsProvider.Service> =>\n Layer.succeed(DnsProvider.Service, make(options));\n\nexport const toAsync = (options: Options = {}): DnsProvider.AsyncInterface =>\n DnsProvider.toAsync(make(options));\n","import { Effect, Layer } from \"effect\";\n\nimport * as DnsResolver from \"./resolver.ts\";\n\nexport type Resolve = (\n query: DnsResolver.Query,\n) => DnsResolver.Resolution | Effect.Effect<DnsResolver.Resolution, DnsResolver.Error>;\n\nexport function make(resolve: Resolve): DnsResolver.Interface {\n return {\n resolve: Effect.fn(\"InMemoryDnsResolver.resolve\")((query) =>\n Effect.suspend(() => {\n const resolution = resolve(query);\n return Effect.isEffect(resolution) ? resolution : Effect.succeed(resolution);\n }),\n ),\n };\n}\n\nexport const layer = (resolve: Resolve): Layer.Layer<DnsResolver.Service> =>\n Layer.succeed(DnsResolver.Service, make(resolve));\n\nexport const toAsync = (resolve: Resolve): DnsResolver.AsyncInterface =>\n DnsResolver.toAsync(make(resolve));\n","import { Effect, Layer } from \"effect\";\n\nimport type * as Connection from \"../auth/connection.ts\";\nimport * as OAuthStateStore from \"./oauth-state.ts\";\n\nexport function make(): OAuthStateStore.Interface {\n const continuations = new Map<string, Connection.OAuthContinuation>();\n return {\n put: Effect.fn(\"InMemoryOAuthStateStore.put\")((continuation) =>\n Effect.sync(() => void continuations.set(continuation.stateHash, continuation)),\n ),\n consume: Effect.fn(\"InMemoryOAuthStateStore.consume\")((stateHash, now) =>\n Effect.sync(() => {\n const continuation = continuations.get(stateHash) ?? null;\n if (continuation === null) return null;\n continuations.delete(stateHash);\n return continuation.expiresAt > now ? continuation : null;\n }),\n ),\n };\n}\n\nexport const layer = (): Layer.Layer<OAuthStateStore.Service> =>\n Layer.succeed(OAuthStateStore.Service, make());\n\nexport const toAsync = (\n store: OAuthStateStore.Interface = make(),\n): OAuthStateStore.AsyncInterface => OAuthStateStore.toAsync(store);\n","import { Effect, Layer } from \"effect\";\n\nimport type * as DnsPlan from \"../plan/types.ts\";\nimport * as ReceiptStore from \"./receipt.ts\";\n\nexport function make(): ReceiptStore.Interface {\n const receipts = new Map<string, DnsPlan.ApplyReceipt>();\n return {\n get: Effect.fn(\"InMemoryReceiptStore.get\")((planDigest) =>\n Effect.sync(() => receipts.get(planDigest) ?? null),\n ),\n put: Effect.fn(\"InMemoryReceiptStore.put\")((receipt) =>\n Effect.sync(() => void receipts.set(receipt.planDigest, receipt)),\n ),\n };\n}\n\nexport const layer = (): Layer.Layer<ReceiptStore.Service> =>\n Layer.succeed(ReceiptStore.Service, make());\n\nexport const toAsync = (store: ReceiptStore.Interface = make()): ReceiptStore.AsyncInterface =>\n ReceiptStore.toAsync(store);\n"],"mappings":"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"}
1
+ {"version":3,"file":"testing.mjs","names":["Repository.Error","make","layer","Repository.Service","make","make","DomainName.parse","layer","DnsProvider.Service","toAsync","DnsProvider.toAsync","DnsResolver.Service","DnsResolver.toAsync","DnsProvider.fromAsync","Provisioning.create","Provisioning.apply","Provisioning.authorize","Provisioning.PartialApplyError","DnsRecord.equals","Deletion.create","Deletion.apply","Deletion.authorize","Provisioning.ConflictError","Provisioning.StaleError","DnsProvider.Error","DnsProvider.Service","Digest.webCryptoLayer","DnsRecord.parse"],"sources":["../src/stores/in-memory-lifecycle-repository.ts","../src/stores/in-memory-continuation.ts","../src/provider/in-memory.ts","../src/verification/in-memory.ts","../src/testing/provider-conformance.ts"],"sourcesContent":["import { Effect, Layer, Ref, Semaphore } from \"effect\";\n\nimport * as Repository from \"../auth/lifecycle-repository.ts\";\n\nexport interface Options {\n readonly beforeCommit?: (\n operation: string,\n aggregate: Repository.Aggregate | null,\n ) => Effect.Effect<void, Repository.Error>;\n}\n\nfunction missing(operation: string, message: string): Repository.Error {\n return new Repository.Error({\n category: \"storage\",\n message,\n operation,\n retry: \"never\",\n });\n}\n\nexport function make(options: Options = {}): Repository.Interface {\n const state = Effect.runSync(Ref.make<ReadonlyMap<string, Repository.Aggregate>>(new Map()));\n const mutations = Semaphore.makeUnsafe(1);\n const serialize = <A, E, R>(effect: Effect.Effect<A, E, R>) => mutations.withPermit(effect);\n\n const commit = Effect.fn(\"InMemoryAuthorizationLifecycleRepository.commit\")(function* (\n operation: string,\n aggregate: Repository.Aggregate | null,\n ) {\n if (options.beforeCommit !== undefined) yield* options.beforeCommit(operation, aggregate);\n yield* Ref.update(state, (entries) => {\n const next = new Map(entries);\n if (aggregate === null) return next;\n next.set(aggregate.authorization.id, aggregate);\n return next;\n });\n });\n\n const remove = Effect.fn(\"InMemoryAuthorizationLifecycleRepository.remove\")(function* (\n authorizationId: string,\n ) {\n if (options.beforeCommit !== undefined) yield* options.beforeCommit(\"remove\", null);\n yield* Ref.update(state, (entries) => {\n const next = new Map(entries);\n next.delete(authorizationId);\n return next;\n });\n });\n\n const get = Effect.fn(\"AuthorizationLifecycleRepository.get\")((authorizationId: string) =>\n Ref.get(state).pipe(Effect.map((entries) => entries.get(authorizationId) ?? null)),\n );\n\n const getByConnectionId = Effect.fn(\"AuthorizationLifecycleRepository.getByConnectionId\")(\n (connectionId: string) =>\n Ref.get(state).pipe(\n Effect.map(\n (entries) =>\n [...entries.values()].find((aggregate) =>\n aggregate.bindings.some((binding) => binding.id === connectionId),\n ) ?? null,\n ),\n ),\n );\n\n const finishRevocation = Effect.fn(\"AuthorizationLifecycleRepository.finishRevocation\")(\n function* <E>(\n aggregate: Repository.Aggregate,\n revoke: (aggregate: Repository.Aggregate) => Effect.Effect<void, E>,\n ) {\n const pending: Repository.Aggregate = {\n ...aggregate,\n authorization: {\n ...aggregate.authorization,\n revocation:\n aggregate.authorization.revocation._tag === \"Pending\"\n ? aggregate.authorization.revocation\n : { _tag: \"Pending\", requestedAt: new Date() },\n },\n };\n yield* commit(\"prepareRevocation\", pending);\n yield* revoke(pending);\n yield* remove(pending.authorization.id);\n return {\n authorizationId: pending.authorization.id,\n remainingBindings: 0,\n revokedAuthorization: true,\n } satisfies Repository.DetachResult;\n },\n );\n\n return Repository.Service.of({\n bind: Effect.fn(\"AuthorizationLifecycleRepository.bind\")((authorizationId, binding) =>\n serialize(\n Effect.gen(function* () {\n const aggregate = yield* get(authorizationId);\n if (aggregate === null) {\n return yield* missing(\"bind\", \"Authorization aggregate does not exist\");\n }\n const next = {\n ...aggregate,\n bindings: [\n ...aggregate.bindings.filter((candidate) => candidate.id !== binding.id),\n binding,\n ],\n };\n yield* commit(\"bind\", next);\n return next;\n }),\n ),\n ),\n connect: Effect.fn(\"AuthorizationLifecycleRepository.connect\")((aggregate) =>\n serialize(\n Effect.gen(function* () {\n yield* commit(\"connect\", aggregate);\n return aggregate;\n }),\n ),\n ),\n detach: ({ connectionId, revoke }) =>\n serialize(\n Effect.gen(function* () {\n const aggregate = yield* getByConnectionId(connectionId);\n if (aggregate === null) {\n return yield* missing(\"detach\", \"Connection binding does not exist\");\n }\n const remaining = aggregate.bindings.filter((binding) => binding.id !== connectionId);\n if (remaining.length > 0) {\n yield* commit(\"detachBinding\", { ...aggregate, bindings: remaining });\n return {\n authorizationId: aggregate.authorization.id,\n remainingBindings: remaining.length,\n revokedAuthorization: false,\n };\n }\n return yield* finishRevocation(aggregate, revoke);\n }).pipe(Effect.withSpan(\"AuthorizationLifecycleRepository.detach\")),\n ),\n findByProviderAccount: Effect.fn(\"AuthorizationLifecycleRepository.findByProviderAccount\")(\n (providerId: string, providerAccountId: string) =>\n Ref.get(state).pipe(\n Effect.map(\n (entries) =>\n [...entries.values()].find(\n ({ authorization }) =>\n authorization.providerId === providerId &&\n authorization.providerAccountId === providerAccountId,\n ) ?? null,\n ),\n ),\n ),\n get,\n getByConnectionId,\n promoteEvidence: Effect.fn(\"AuthorizationLifecycleRepository.promoteEvidence\")(\n (authorizationId, evidence) =>\n serialize(\n Effect.gen(function* () {\n const aggregate = yield* get(authorizationId);\n if (aggregate === null) {\n return yield* missing(\"promoteEvidence\", \"Authorization aggregate does not exist\");\n }\n const byCapability = new Map(\n aggregate.authorization.capabilityEvidence.map((item) => [item.capability, item]),\n );\n for (const item of evidence) byCapability.set(item.capability, item);\n const next = {\n ...aggregate,\n authorization: {\n ...aggregate.authorization,\n capabilityEvidence: [...byCapability.values()],\n },\n };\n yield* commit(\"promoteEvidence\", next);\n return next;\n }),\n ),\n ),\n recover: ({ authorizationId, revoke }) =>\n serialize(\n Effect.gen(function* () {\n const aggregate = yield* get(authorizationId);\n if (aggregate === null) {\n return yield* missing(\"recover\", \"Authorization aggregate does not exist\");\n }\n if (aggregate.authorization.revocation._tag !== \"Pending\") {\n return yield* missing(\"recover\", \"Authorization is not awaiting revocation\");\n }\n return yield* finishRevocation(aggregate, revoke);\n }).pipe(Effect.withSpan(\"AuthorizationLifecycleRepository.recover\")),\n ),\n rotate: Effect.fn(\"AuthorizationLifecycleRepository.rotate\")(\n (authorizationId, credential, expiresAt) =>\n serialize(\n Effect.gen(function* () {\n const aggregate = yield* get(authorizationId);\n if (aggregate === null) {\n return yield* missing(\"rotate\", \"Authorization aggregate does not exist\");\n }\n const next = {\n ...aggregate,\n authorization: { ...aggregate.authorization, expiresAt },\n credential,\n };\n yield* commit(\"rotate\", next);\n return next;\n }),\n ),\n ),\n });\n}\n\nexport const layer = (options: Options = {}) => Layer.sync(Repository.Service, () => make(options));\n","import { Effect, Ref } from \"effect\";\n\nimport type * as Connection from \"../auth/connect.ts\";\n\nexport function make(): Connection.ContinuationStore {\n const state = Effect.runSync(Ref.make<ReadonlyMap<string, Connection.Continuation>>(new Map()));\n return {\n consume: Effect.fn(\"ConnectionContinuations.consume\")(function* (id, now) {\n return yield* Ref.modify(state, (entries) => {\n const continuation = entries.get(id);\n const next = new Map(entries);\n next.delete(id);\n return [\n continuation !== undefined && continuation.expiresAt > now ? continuation : null,\n next,\n ] as const;\n });\n }),\n put: Effect.fn(\"ConnectionContinuations.put\")((continuation) =>\n Ref.update(state, (entries) => {\n const next = new Map(entries);\n next.set(continuation.id, continuation);\n return next;\n }),\n ),\n };\n}\n","import { Effect, Layer } from \"effect\";\n\nimport * as DomainName from \"../domain/domain-name.ts\";\nimport type * as DnsRecord from \"../domain/dns-record.ts\";\nimport * as DnsProvider from \"./provider.ts\";\n\nexport interface Options {\n readonly id?: string;\n readonly records?: Readonly<Record<string, ReadonlyArray<DnsRecord.Observed>>>;\n}\n\nexport function make(options: Options = {}): DnsProvider.Interface {\n const id = options.id ?? \"memory\";\n const records = new Map<DomainName.DomainName, Array<DnsRecord.Observed>>();\n const recordIds = new Map<string, DnsRecord.Observed>();\n for (const [zone, initial] of Object.entries(options.records ?? {})) {\n records.set(DomainName.parse(zone), [...initial]);\n for (const [index, record] of initial.entries()) recordIds.set(`${id}:${index + 1}`, record);\n }\n return {\n id,\n listRecords: Effect.fn(\"InMemoryDnsProvider.listRecords\")((zone) =>\n Effect.sync(() => [...(records.get(zone) ?? [])]),\n ),\n createRecord: Effect.fn(\"InMemoryDnsProvider.createRecord\")((zone, record) =>\n Effect.sync(() => {\n const current = records.get(zone) ?? [];\n current.push(record);\n records.set(zone, current);\n const providerRecordId = `${id}:${current.length}`;\n recordIds.set(providerRecordId, record);\n return { providerRecordId };\n }),\n ),\n deleteRecord: Effect.fn(\"InMemoryDnsProvider.deleteRecord\")((zone, providerRecordId) =>\n Effect.sync(() => {\n const record = recordIds.get(providerRecordId);\n if (record === undefined) return;\n records.set(\n zone,\n (records.get(zone) ?? []).filter((candidate) => candidate !== record),\n );\n recordIds.delete(providerRecordId);\n }),\n ),\n getRecord: Effect.fn(\"InMemoryDnsProvider.getRecord\")((_zone, providerRecordId) =>\n Effect.sync(() => recordIds.get(providerRecordId) ?? null),\n ),\n };\n}\n\nexport const layer = (options: Options = {}): Layer.Layer<DnsProvider.Service> =>\n Layer.succeed(DnsProvider.Service, make(options));\n\nexport const toAsync = (options: Options = {}): DnsProvider.AsyncInterface =>\n DnsProvider.toAsync(make(options));\n","import { Effect, Layer } from \"effect\";\n\nimport * as DnsResolver from \"./resolver.ts\";\n\nexport type Resolve = (\n query: DnsResolver.Query,\n) => DnsResolver.Resolution | Effect.Effect<DnsResolver.Resolution, DnsResolver.Error>;\n\nexport function make(resolve: Resolve): DnsResolver.Interface {\n return {\n resolve: Effect.fn(\"InMemoryDnsResolver.resolve\")((query) =>\n Effect.suspend(() => {\n const resolution = resolve(query);\n return Effect.isEffect(resolution) ? resolution : Effect.succeed(resolution);\n }),\n ),\n };\n}\n\nexport const layer = (resolve: Resolve): Layer.Layer<DnsResolver.Service> =>\n Layer.succeed(DnsResolver.Service, make(resolve));\n\nexport const toAsync = (resolve: Resolve): DnsResolver.AsyncInterface =>\n DnsResolver.toAsync(make(resolve));\n","import { Effect, Layer, Schema } from \"effect\";\n\nimport * as DomainName from \"../domain/domain-name.ts\";\nimport * as DnsRecord from \"../domain/dns-record.ts\";\nimport * as Deletion from \"../plan/deletion.ts\";\nimport * as Digest from \"../plan/canonical-json.ts\";\nimport * as Provisioning from \"../plan/plan.ts\";\nimport * as DnsProvider from \"../provider/provider.ts\";\n\nexport class Error extends Schema.TaggedError<Error>()(\"ProviderConformanceError\", {\n case: Schema.String,\n message: Schema.String,\n providerId: Schema.String,\n}) {}\n\nexport interface Input {\n readonly makeProvider: () => Effect.Effect<DnsProvider.Interface, DnsProvider.Error>;\n readonly prefix?: string;\n readonly zone: DomainName.DomainName;\n}\n\nexport interface Report {\n readonly cases: ReadonlyArray<string>;\n readonly providerId: string;\n readonly zone: DomainName.DomainName;\n}\n\n/** Adapt a fresh Promise-shaped provider factory for the Effect-native conformance runner. */\nexport function fromAsync(makeProvider: () => DnsProvider.AsyncInterface): Input[\"makeProvider\"] {\n return () => Effect.sync(() => DnsProvider.fromAsync(makeProvider()));\n}\n\nconst cases = [\n \"create-readback-cleanup\",\n \"exact-noop\",\n \"conflict\",\n \"stale-plan\",\n \"partial-apply-cleanup\",\n] as const;\n\n/** Run the deterministic offline contract every DomainKit DNS adapter must satisfy. */\nexport const run = Effect.fn(\"ProviderConformance.run\")(function* (input: Input) {\n const makeProvider = () =>\n Effect.suspend(input.makeProvider).pipe(\n Effect.catchDefect((cause) =>\n Effect.fail(\n new Error({\n case: \"factory\",\n message: cause instanceof globalThis.Error ? cause.message : \"Provider factory failed\",\n providerId: \"unknown\",\n }),\n ),\n ),\n );\n const first = yield* makeProvider();\n const providerId = first.id;\n const prefix = input.prefix ?? \"domainkit-conformance\";\n yield* createReadbackCleanup(first, input.zone, prefix);\n yield* exactNoop(yield* makeProvider(), input.zone, prefix);\n yield* conflict(yield* makeProvider(), input.zone, prefix);\n yield* stalePlan(yield* makeProvider(), input.zone, prefix);\n yield* partialApplyCleanup(yield* makeProvider(), input.zone, prefix);\n return { cases, providerId, zone: input.zone } satisfies Report;\n});\n\nfunction createReadbackCleanup(\n provider: DnsProvider.Interface,\n zone: DomainName.DomainName,\n prefix: string,\n) {\n const requirements = createRequirements(zone, prefix);\n let cleanupRecordIds: ReadonlyArray<string> = [];\n return Effect.gen(function* () {\n const { plan } = yield* Provisioning.create({\n requirements,\n target: Provisioning.Target.ExactZone({ zone }),\n });\n yield* requireTags(provider, \"create-readback-cleanup\", plan.operations, [\"create\", \"create\"]);\n const receipt = yield* Provisioning.apply({\n authorization: yield* Provisioning.authorize(plan),\n plan,\n }).pipe(\n Effect.tapError((failure) =>\n failure instanceof Provisioning.PartialApplyError\n ? Effect.sync(() => {\n cleanupRecordIds = providerRecordIds(failure.receipt.operations);\n })\n : Effect.void,\n ),\n );\n cleanupRecordIds = providerRecordIds(receipt.operations);\n yield* requireCondition(\n provider,\n \"create-readback-cleanup\",\n receipt.status === \"complete\" &&\n receipt.operations.every(({ providerRecordId }) => providerRecordId !== null),\n \"apply must return a complete receipt with provider record IDs\",\n );\n const observed = yield* provider.listRecords(zone);\n yield* requireCondition(\n provider,\n \"create-readback-cleanup\",\n requirements.every((requirement) =>\n observed.some(\n (record) => record._tag !== \"Opaque\" && DnsRecord.equals(record, requirement),\n ),\n ),\n \"listRecords must return every created record, including across provider pages\",\n );\n const deletion = yield* Deletion.create({ plan, receipt });\n const deletionReceipt = yield* Deletion.apply({\n authorization: yield* Deletion.authorize(deletion),\n plan: deletion,\n });\n yield* requireCondition(\n provider,\n \"create-readback-cleanup\",\n deletionReceipt.status === \"complete\" &&\n (yield* recordIdsAbsent(provider, zone, cleanupRecordIds)),\n \"receipt-bound cleanup must remove every created record\",\n );\n }).pipe(\n Effect.ensuring(bestEffortDelete(provider, zone, () => cleanupRecordIds)),\n Effect.provide(providerLayer(provider)),\n );\n}\n\nfunction exactNoop(provider: DnsProvider.Interface, zone: DomainName.DomainName, prefix: string) {\n const requirement = cname(zone, `${prefix}-exact`);\n let cleanupRecordIds: ReadonlyArray<string> = [];\n return Effect.gen(function* () {\n const created = yield* provider.createRecord(zone, requirement);\n cleanupRecordIds = created.providerRecordId === null ? [] : [created.providerRecordId];\n const { plan } = yield* Provisioning.create({\n requirements: [requirement],\n target: Provisioning.Target.ExactZone({ zone }),\n });\n yield* requireTags(provider, \"exact-noop\", plan.operations, [\"noop\"]);\n const receipt = yield* Provisioning.apply({\n authorization: yield* Provisioning.authorize(plan),\n plan,\n });\n yield* requireCondition(\n provider,\n \"exact-noop\",\n receipt.operations.length === 0,\n \"an exact plan must not create another record\",\n );\n yield* deleteCreated(provider, zone, created.providerRecordId, \"exact-noop\");\n }).pipe(\n Effect.ensuring(bestEffortDelete(provider, zone, () => cleanupRecordIds)),\n Effect.provide(providerLayer(provider)),\n );\n}\n\nfunction conflict(provider: DnsProvider.Interface, zone: DomainName.DomainName, prefix: string) {\n const requirement = cname(zone, `${prefix}-conflict`);\n const occupied = txt(zone, `${prefix}-conflict`, \"occupied\");\n let cleanupRecordIds: ReadonlyArray<string> = [];\n return Effect.gen(function* () {\n const created = yield* provider.createRecord(zone, occupied);\n cleanupRecordIds = created.providerRecordId === null ? [] : [created.providerRecordId];\n const { plan } = yield* Provisioning.create({\n requirements: [requirement],\n target: Provisioning.Target.ExactZone({ zone }),\n });\n yield* requireTags(provider, \"conflict\", plan.operations, [\"conflict\"]);\n const failure = yield* Provisioning.apply({\n authorization: yield* Provisioning.authorize(plan),\n plan,\n }).pipe(Effect.flip);\n yield* requireCondition(\n provider,\n \"conflict\",\n failure instanceof Provisioning.ConflictError,\n \"apply must fail closed on incompatible state\",\n );\n yield* deleteCreated(provider, zone, created.providerRecordId, \"conflict\");\n }).pipe(\n Effect.ensuring(bestEffortDelete(provider, zone, () => cleanupRecordIds)),\n Effect.provide(providerLayer(provider)),\n );\n}\n\nfunction stalePlan(provider: DnsProvider.Interface, zone: DomainName.DomainName, prefix: string) {\n const requirement = cname(zone, `${prefix}-stale`);\n let cleanupRecordIds: ReadonlyArray<string> = [];\n return Effect.gen(function* () {\n const { plan } = yield* Provisioning.create({\n requirements: [requirement],\n target: Provisioning.Target.ExactZone({ zone }),\n });\n const authorization = yield* Provisioning.authorize(plan);\n const created = yield* provider.createRecord(zone, requirement);\n cleanupRecordIds = created.providerRecordId === null ? [] : [created.providerRecordId];\n const failure = yield* Provisioning.apply({ authorization, plan }).pipe(Effect.flip);\n yield* requireCondition(\n provider,\n \"stale-plan\",\n failure instanceof Provisioning.StaleError,\n \"apply must reject provider state that changed after authorization\",\n );\n yield* deleteCreated(provider, zone, created.providerRecordId, \"stale-plan\");\n }).pipe(\n Effect.ensuring(bestEffortDelete(provider, zone, () => cleanupRecordIds)),\n Effect.provide(providerLayer(provider)),\n );\n}\n\nfunction partialApplyCleanup(\n provider: DnsProvider.Interface,\n zone: DomainName.DomainName,\n prefix: string,\n) {\n let creates = 0;\n const flaky = DnsProvider.Service.of({\n ...provider,\n createRecord: Effect.fn(\"ProviderConformance.createRecord\")((target, record) => {\n creates += 1;\n return creates === 1\n ? provider.createRecord(target, record)\n : Effect.fail(\n new DnsProvider.Error({\n message: \"injected conformance failure\",\n operation: \"createRecord\",\n providerId: provider.id,\n }),\n );\n }),\n });\n const requirements = [\n cname(zone, `${prefix}-partial-one`),\n txt(zone, `${prefix}-partial-two`, \"domainkit\"),\n ];\n let cleanupRecordIds: ReadonlyArray<string> = [];\n return Effect.gen(function* () {\n const { plan } = yield* Provisioning.create({\n requirements,\n target: Provisioning.Target.ExactZone({ zone }),\n });\n const failure = yield* Provisioning.apply({\n authorization: yield* Provisioning.authorize(plan),\n plan,\n }).pipe(Effect.flip);\n cleanupRecordIds =\n failure instanceof Provisioning.PartialApplyError\n ? providerRecordIds(failure.receipt.operations)\n : [];\n yield* requireCondition(\n provider,\n \"partial-apply-cleanup\",\n failure instanceof Provisioning.PartialApplyError && failure.receipt.operations.length === 1,\n \"a later write failure must preserve the first confirmed write in a partial receipt\",\n );\n if (!(failure instanceof Provisioning.PartialApplyError)) return;\n const deletion = yield* Deletion.create({ plan, receipt: failure.receipt }).pipe(\n Effect.provide(providerLayer(provider)),\n );\n yield* Deletion.apply({\n authorization: yield* Deletion.authorize(deletion),\n plan: deletion,\n }).pipe(Effect.provide(providerLayer(provider)));\n yield* requireCondition(\n provider,\n \"partial-apply-cleanup\",\n yield* recordIdsAbsent(provider, zone, cleanupRecordIds),\n \"partial receipt cleanup must remove the confirmed write\",\n );\n }).pipe(\n Effect.ensuring(bestEffortDelete(provider, zone, () => cleanupRecordIds)),\n Effect.provide(providerLayer(flaky)),\n );\n}\n\nfunction providerRecordIds(\n operations: ReadonlyArray<{ readonly providerRecordId: string | null }>,\n): ReadonlyArray<string> {\n return operations.flatMap(({ providerRecordId }) =>\n providerRecordId === null ? [] : [providerRecordId],\n );\n}\n\nfunction recordIdsAbsent(\n provider: DnsProvider.Interface,\n zone: DomainName.DomainName,\n recordIds: ReadonlyArray<string>,\n) {\n return Effect.forEach(recordIds, (providerRecordId) =>\n provider.getRecord(zone, providerRecordId),\n ).pipe(Effect.map((records) => records.every((record) => record === null)));\n}\n\nfunction bestEffortDelete(\n provider: DnsProvider.Interface,\n zone: DomainName.DomainName,\n recordIds: () => ReadonlyArray<string>,\n) {\n return Effect.suspend(() =>\n Effect.forEach(\n recordIds(),\n (providerRecordId) => provider.deleteRecord(zone, providerRecordId).pipe(Effect.ignore),\n { discard: true },\n ),\n );\n}\n\nfunction providerLayer(provider: DnsProvider.Interface) {\n return Layer.merge(Layer.succeed(DnsProvider.Service, provider), Digest.webCryptoLayer);\n}\n\nfunction createRequirements(zone: DomainName.DomainName, prefix: string) {\n return [cname(zone, `${prefix}-create`), txt(zone, `${prefix}-page`, \"domainkit\")];\n}\n\nfunction cname(zone: DomainName.DomainName, label: string) {\n return DnsRecord.parse({\n _tag: \"CNAME\",\n metadata: { ownership: \"tester\", provenance: \"domainkit\", purpose: \"conformance\" },\n name: `${label}.${zone}`,\n policy: \"exclusive\",\n target: \"target.example.net\",\n ttl: 300,\n });\n}\n\nfunction txt(zone: DomainName.DomainName, label: string, value: string) {\n return DnsRecord.parse({\n _tag: \"TXT\",\n metadata: { ownership: \"tester\", provenance: \"domainkit\", purpose: \"conformance\" },\n name: `${label}.${zone}`,\n policy: \"append\",\n ttl: 300,\n value,\n });\n}\n\nfunction requireTags(\n provider: DnsProvider.Interface,\n testCase: string,\n operations: ReadonlyArray<{ readonly _tag: string }>,\n expected: ReadonlyArray<string>,\n) {\n return requireCondition(\n provider,\n testCase,\n JSON.stringify(operations.map(({ _tag }) => _tag)) === JSON.stringify(expected),\n `expected operations ${expected.join(\", \")}`,\n );\n}\n\nfunction requireCondition(\n provider: DnsProvider.Interface,\n testCase: string,\n condition: boolean,\n message: string,\n) {\n return condition\n ? Effect.void\n : Effect.fail(new Error({ case: testCase, message, providerId: provider.id }));\n}\n\nfunction deleteCreated(\n provider: DnsProvider.Interface,\n zone: DomainName.DomainName,\n providerRecordId: string | null,\n testCase: string,\n) {\n return providerRecordId === null\n ? Effect.fail(\n new Error({\n case: testCase,\n message: \"provider must return record IDs for safe cleanup\",\n providerId: provider.id,\n }),\n )\n : provider.deleteRecord(zone, providerRecordId);\n}\n"],"mappings":"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"}
@@ -1,11 +1,14 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
2
- import { a as integrationMethod$1, i as exchangeCode$1, n as make$1, o as manifest$1, s as tokenMethod$1 } from "./client-BnD7QLRF.mjs";
2
+ import { n as fromEffectFlow, r as fromEffectTokenMethod } from "./connection-CcQokgrd.mjs";
3
+ import { a as manifest$1, i as integrationMethod$1, n as exchangeCode$1, o as tokenConnectionMethod$1, r as integrationFlow$1, s as tokenMethod$1, u as make$1 } from "./auth-CzhZ3Cuc.mjs";
3
4
  import { Effect } from "effect";
4
5
  //#region src/promise/vercel-auth.ts
5
6
  var vercel_auth_exports = /* @__PURE__ */ __exportAll({
6
7
  exchangeCode: () => exchangeCode,
8
+ integrationFlow: () => integrationFlow,
7
9
  integrationMethod: () => integrationMethod,
8
10
  manifest: () => manifest,
11
+ tokenConnectionMethod: () => tokenConnectionMethod,
9
12
  tokenMethod: () => tokenMethod
10
13
  });
11
14
  const integrationMethod = integrationMethod$1;
@@ -14,10 +17,19 @@ const tokenMethod = tokenMethod$1;
14
17
  function exchangeCode(options) {
15
18
  return Effect.runPromise(exchangeCode$1(options));
16
19
  }
20
+ /** Creates Vercel Integration's implementation for the Promise connection facade. */
21
+ function integrationFlow(options) {
22
+ return fromEffectFlow(integrationFlow$1(options));
23
+ }
24
+ /** Creates a Vercel token method for the Promise connection facade. */
25
+ function tokenConnectionMethod(options) {
26
+ return fromEffectTokenMethod(tokenConnectionMethod$1(options));
27
+ }
17
28
  //#endregion
18
29
  //#region src/promise/vercel.ts
19
30
  var vercel_exports = /* @__PURE__ */ __exportAll({
20
31
  Auth: () => vercel_auth_exports,
32
+ discovery: () => discovery,
21
33
  make: () => make
22
34
  });
23
35
  /** Creates a Promise-compatible facade over the Effect-native Vercel client. */
@@ -34,7 +46,15 @@ function make(options) {
34
46
  validateToken: () => Effect.runPromise(client.validateToken())
35
47
  };
36
48
  }
49
+ /** Creates the optional Vercel discovery source for Promise consumers. */
50
+ function discovery(options) {
51
+ const client = make(options);
52
+ return {
53
+ listZones: (name) => client.listZones({ name }),
54
+ provider: client
55
+ };
56
+ }
37
57
  //#endregion
38
- export { vercel_exports as n, vercel_auth_exports as r, make as t };
58
+ export { vercel_auth_exports as i, make as n, vercel_exports as r, discovery as t };
39
59
 
40
- //# sourceMappingURL=vercel-DD89DCqH.mjs.map
60
+ //# sourceMappingURL=vercel-CWZ33NUS.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vercel-CWZ33NUS.mjs","names":["EffectAuth.integrationMethod","EffectAuth.manifest","EffectAuth.tokenMethod","EffectAuth.exchangeCode","Connection.fromEffectFlow","EffectAuth.integrationFlow","Connection.fromEffectTokenMethod","EffectAuth.tokenConnectionMethod","Vercel.make"],"sources":["../src/promise/vercel-auth.ts","../src/promise/vercel.ts"],"sourcesContent":["import { Effect } from \"effect\";\n\nimport * as EffectAuth from \"../providers/vercel/auth.ts\";\nimport * as Connection from \"./connection.ts\";\n\nexport const integrationMethod = EffectAuth.integrationMethod;\nexport const manifest = EffectAuth.manifest;\nexport const tokenMethod = EffectAuth.tokenMethod;\nexport type {\n ExchangeCodeOptions,\n IntegrationCredential,\n IntegrationFlowOptions,\n IntegrationMethodOptions,\n} from \"../providers/vercel/auth.ts\";\n\nexport function exchangeCode(\n options: EffectAuth.ExchangeCodeOptions,\n): Promise<EffectAuth.IntegrationCredential> {\n return Effect.runPromise(EffectAuth.exchangeCode(options));\n}\n\n/** Creates Vercel Integration's implementation for the Promise connection facade. */\nexport function integrationFlow(\n options: EffectAuth.IntegrationFlowOptions,\n): Connection.InteractiveFlow {\n return Connection.fromEffectFlow(EffectAuth.integrationFlow(options));\n}\n\n/** Creates a Vercel token method for the Promise connection facade. */\nexport function tokenConnectionMethod(\n options: EffectAuth.TokenConnectionOptions,\n): Extract<Connection.Method, { readonly _tag: \"Token\" }> {\n return Connection.fromEffectTokenMethod(EffectAuth.tokenConnectionMethod(options));\n}\n","import { Effect } from \"effect\";\n\nimport type * as ProviderAuth from \"../auth/manifest.ts\";\nimport type * as DnsProvider from \"../provider/provider.ts\";\nimport * as Vercel from \"../providers/vercel/index.ts\";\nimport type * as ZoneDiscovery from \"./zone-discovery.ts\";\n\nexport * as Auth from \"./vercel-auth.ts\";\nexport type {\n Account,\n AccountContext,\n Fetch,\n ListZonesInput,\n Options,\n Zone,\n} from \"../providers/vercel/client.ts\";\n\nexport interface Interface extends DnsProvider.AsyncInterface {\n readonly listAccounts: () => Promise<ReadonlyArray<Vercel.Account>>;\n readonly listZones: (input?: Vercel.Client.ListZonesInput) => Promise<ReadonlyArray<Vercel.Zone>>;\n readonly validateToken: () => Promise<ProviderAuth.TokenValidation>;\n}\n\n/** Creates a Promise-compatible facade over the Effect-native Vercel client. */\nexport function make(options: Vercel.Client.Options): Interface {\n const client = Vercel.make(options);\n return {\n id: client.id,\n createRecord: (zone, record) => Effect.runPromise(client.createRecord(zone, record)),\n deleteRecord: (zone, providerRecordId) =>\n Effect.runPromise(client.deleteRecord(zone, providerRecordId)),\n getRecord: (zone, providerRecordId) =>\n Effect.runPromise(client.getRecord(zone, providerRecordId)),\n listAccounts: () => Effect.runPromise(client.listAccounts()),\n listRecords: (zone) => Effect.runPromise(client.listRecords(zone)),\n listZones: (input) => Effect.runPromise(client.listZones(input)),\n validateToken: () => Effect.runPromise(client.validateToken()),\n };\n}\n\n/** Creates the optional Vercel discovery source for Promise consumers. */\nexport function discovery(options: Vercel.Client.Options): ZoneDiscovery.Source {\n const client = make(options);\n return {\n listZones: (name) => client.listZones({ name }),\n provider: client,\n };\n}\n"],"mappings":";;;;;;;;;;;;;AAKA,MAAa,oBAAoBA;AACjC,MAAa,WAAWC;AACxB,MAAa,cAAcC;AAQ3B,SAAgB,aACd,SAC2C;CAC3C,OAAO,OAAO,WAAWC,eAAwB,OAAO,CAAC;AAC3D;;AAGA,SAAgB,gBACd,SAC4B;CAC5B,OAAOC,eAA0BC,kBAA2B,OAAO,CAAC;AACtE;;AAGA,SAAgB,sBACd,SACwD;CACxD,OAAOC,sBAAiCC,wBAAiC,OAAO,CAAC;AACnF;;;;;;;;;ACTA,SAAgB,KAAK,SAA2C;CAC9D,MAAM,SAASC,OAAY,OAAO;CAClC,OAAO;EACL,IAAI,OAAO;EACX,eAAe,MAAM,WAAW,OAAO,WAAW,OAAO,aAAa,MAAM,MAAM,CAAC;EACnF,eAAe,MAAM,qBACnB,OAAO,WAAW,OAAO,aAAa,MAAM,gBAAgB,CAAC;EAC/D,YAAY,MAAM,qBAChB,OAAO,WAAW,OAAO,UAAU,MAAM,gBAAgB,CAAC;EAC5D,oBAAoB,OAAO,WAAW,OAAO,aAAa,CAAC;EAC3D,cAAc,SAAS,OAAO,WAAW,OAAO,YAAY,IAAI,CAAC;EACjE,YAAY,UAAU,OAAO,WAAW,OAAO,UAAU,KAAK,CAAC;EAC/D,qBAAqB,OAAO,WAAW,OAAO,cAAc,CAAC;CAC/D;AACF;;AAGA,SAAgB,UAAU,SAAsD;CAC9E,MAAM,SAAS,KAAK,OAAO;CAC3B,OAAO;EACL,YAAY,SAAS,OAAO,UAAU,EAAE,KAAK,CAAC;EAC9C,UAAU;CACZ;AACF"}
@@ -0,0 +1,31 @@
1
+ import { ct as AsyncInterface, it as TokenValidation } from "./zone-discovery-BA5I24vu.mjs";
2
+ import { a as Source, n as Method, t as InteractiveFlow } from "./connection-CEqadXSm.mjs";
3
+ import { _ as Zone, a as IntegrationMethodOptions, c as integrationMethod$1, d as Account, f as AccountContext, g as Options, h as ListZonesInput, i as IntegrationFlowOptions, l as manifest$1, n as ExchangeCodeOptions, o as TokenConnectionOptions, p as Fetch, r as IntegrationCredential, u as tokenMethod$1 } from "./index-Ewc__bQu.mjs";
4
+ declare namespace vercel_auth_d_exports {
5
+ export { ExchangeCodeOptions, IntegrationCredential, IntegrationFlowOptions, IntegrationMethodOptions, exchangeCode, integrationFlow, integrationMethod, manifest, tokenConnectionMethod, tokenMethod };
6
+ }
7
+ declare const integrationMethod: typeof integrationMethod$1;
8
+ declare const manifest: typeof manifest$1;
9
+ declare const tokenMethod: typeof tokenMethod$1;
10
+ declare function exchangeCode(options: ExchangeCodeOptions): Promise<IntegrationCredential>;
11
+ /** Creates Vercel Integration's implementation for the Promise connection facade. */
12
+ declare function integrationFlow(options: IntegrationFlowOptions): InteractiveFlow;
13
+ /** Creates a Vercel token method for the Promise connection facade. */
14
+ declare function tokenConnectionMethod(options: TokenConnectionOptions): Extract<Method, {
15
+ readonly _tag: "Token";
16
+ }>;
17
+ declare namespace vercel_d_exports {
18
+ export { Account, AccountContext, vercel_auth_d_exports as Auth, Fetch, Interface, ListZonesInput, Options, Zone, discovery, make };
19
+ }
20
+ interface Interface extends AsyncInterface {
21
+ readonly listAccounts: () => Promise<ReadonlyArray<Account>>;
22
+ readonly listZones: (input?: ListZonesInput) => Promise<ReadonlyArray<Zone>>;
23
+ readonly validateToken: () => Promise<TokenValidation>;
24
+ }
25
+ /** Creates a Promise-compatible facade over the Effect-native Vercel client. */
26
+ declare function make(options: Options): Interface;
27
+ /** Creates the optional Vercel discovery source for Promise consumers. */
28
+ declare function discovery(options: Options): Source;
29
+ //#endregion
30
+ export { vercel_auth_d_exports as a, vercel_d_exports as i, discovery as n, make as r, Interface as t };
31
+ //# sourceMappingURL=vercel-DgJaUX9D.d.mts.map
package/dist/vercel.d.mts CHANGED
@@ -1,3 +1,3 @@
1
- import { d as Fetch, h as Zone, l as Account, m as Options, p as ListZonesInput, u as AccountContext } from "./index-CEzk2gbZ.mjs";
2
- import { i as vercel_auth_d_exports, n as make, t as Interface } from "./vercel-D-E2aqb1.mjs";
3
- export { type Account, type AccountContext, vercel_auth_d_exports as Auth, type Fetch, Interface, type ListZonesInput, type Options, type Zone, make };
1
+ import { _ as Zone, d as Account, f as AccountContext, g as Options, h as ListZonesInput, p as Fetch } from "./index-Ewc__bQu.mjs";
2
+ import { a as vercel_auth_d_exports, n as discovery, r as make, t as Interface } from "./vercel-DgJaUX9D.mjs";
3
+ export { type Account, type AccountContext, vercel_auth_d_exports as Auth, type Fetch, Interface, type ListZonesInput, type Options, type Zone, discovery, make };
package/dist/vercel.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { r as vercel_auth_exports, t as make } from "./vercel-DD89DCqH.mjs";
2
- export { vercel_auth_exports as Auth, make };
1
+ import { i as vercel_auth_exports, n as make, t as discovery } from "./vercel-CWZ33NUS.mjs";
2
+ export { vercel_auth_exports as Auth, discovery, make };