domainkit 0.7.0 → 0.9.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 (165) hide show
  1. package/README.md +214 -39
  2. package/dist/Approval.mjs +34 -0
  3. package/dist/Approval.mjs.map +1 -0
  4. package/dist/Cleanup.mjs +97 -0
  5. package/dist/Cleanup.mjs.map +1 -0
  6. package/dist/Cloudflare.mjs +225 -0
  7. package/dist/Cloudflare.mjs.map +1 -0
  8. package/dist/Connect.mjs +463 -0
  9. package/dist/Connect.mjs.map +1 -0
  10. package/dist/Custody.mjs +64 -0
  11. package/dist/Custody.mjs.map +1 -0
  12. package/dist/DnsRecord.mjs +213 -0
  13. package/dist/DnsRecord.mjs.map +1 -0
  14. package/dist/DomainKit.mjs +34 -0
  15. package/dist/DomainKit.mjs.map +1 -0
  16. package/dist/DomainName.mjs +100 -0
  17. package/dist/DomainName.mjs.map +1 -0
  18. package/dist/Plan.mjs +102 -0
  19. package/dist/Plan.mjs.map +1 -0
  20. package/dist/Principal.mjs +23 -0
  21. package/dist/Principal.mjs.map +1 -0
  22. package/dist/Provider.mjs +130 -0
  23. package/dist/Provider.mjs.map +1 -0
  24. package/dist/Providers.mjs +40 -0
  25. package/dist/Providers.mjs.map +1 -0
  26. package/dist/Provision.mjs +93 -0
  27. package/dist/Provision.mjs.map +1 -0
  28. package/dist/Reason.mjs +162 -0
  29. package/dist/Reason.mjs.map +1 -0
  30. package/dist/Receipt.mjs +71 -0
  31. package/dist/Receipt.mjs.map +1 -0
  32. package/dist/Resolver.mjs +75 -0
  33. package/dist/Resolver.mjs.map +1 -0
  34. package/dist/Server.mjs +516 -0
  35. package/dist/Server.mjs.map +1 -0
  36. package/dist/Storage.mjs +236 -0
  37. package/dist/Storage.mjs.map +1 -0
  38. package/dist/Testing.mjs +226 -0
  39. package/dist/Testing.mjs.map +1 -0
  40. package/dist/Transport.mjs +187 -0
  41. package/dist/Transport.mjs.map +1 -0
  42. package/dist/Vercel.mjs +116 -0
  43. package/dist/Vercel.mjs.map +1 -0
  44. package/dist/Verify.mjs +292 -0
  45. package/dist/Verify.mjs.map +1 -0
  46. package/dist/{rolldown-runtime-D7D4PA-g.mjs → _virtual/_rolldown/runtime.mjs} +1 -1
  47. package/dist/entry/client.mjs +2 -0
  48. package/dist/entry/server.mjs +2 -0
  49. package/dist/entry/testing.mjs +3 -0
  50. package/dist/index.mjs +33 -356
  51. package/dist/index.mjs.map +1 -1
  52. package/dist/internal/aes.mjs +61 -0
  53. package/dist/internal/aes.mjs.map +1 -0
  54. package/dist/internal/attempts.mjs +284 -0
  55. package/dist/internal/attempts.mjs.map +1 -0
  56. package/dist/internal/cloudflare/client.mjs +100 -0
  57. package/dist/internal/cloudflare/client.mjs.map +1 -0
  58. package/dist/internal/cloudflare/protocol.mjs +59 -0
  59. package/dist/internal/cloudflare/protocol.mjs.map +1 -0
  60. package/dist/internal/cloudflare/records.mjs +156 -0
  61. package/dist/internal/cloudflare/records.mjs.map +1 -0
  62. package/dist/internal/config.mjs +13 -0
  63. package/dist/internal/config.mjs.map +1 -0
  64. package/dist/internal/conformance/provider.mjs +207 -0
  65. package/dist/internal/conformance/provider.mjs.map +1 -0
  66. package/dist/internal/conformance/storage.mjs +428 -0
  67. package/dist/internal/conformance/storage.mjs.map +1 -0
  68. package/dist/internal/digest.mjs +25 -0
  69. package/dist/internal/digest.mjs.map +1 -0
  70. package/dist/internal/doh.mjs +152 -0
  71. package/dist/internal/doh.mjs.map +1 -0
  72. package/dist/internal/error.mjs +69 -0
  73. package/dist/internal/error.mjs.map +1 -0
  74. package/dist/internal/http.mjs +89 -0
  75. package/dist/internal/http.mjs.map +1 -0
  76. package/dist/internal/ids.mjs +8 -0
  77. package/dist/internal/ids.mjs.map +1 -0
  78. package/dist/internal/oauth.mjs +113 -0
  79. package/dist/internal/oauth.mjs.map +1 -0
  80. package/dist/internal/planner.mjs +88 -0
  81. package/dist/internal/planner.mjs.map +1 -0
  82. package/dist/internal/provider-async.mjs +83 -0
  83. package/dist/internal/provider-async.mjs.map +1 -0
  84. package/dist/internal/storage-memory.mjs +302 -0
  85. package/dist/internal/storage-memory.mjs.map +1 -0
  86. package/dist/internal/vercel/client.mjs +122 -0
  87. package/dist/internal/vercel/client.mjs.map +1 -0
  88. package/dist/internal/vercel/protocol.mjs +80 -0
  89. package/dist/internal/vercel/protocol.mjs.map +1 -0
  90. package/dist/internal/vercel/records.mjs +151 -0
  91. package/dist/internal/vercel/records.mjs.map +1 -0
  92. package/dist/package.mjs +6 -0
  93. package/dist/package.mjs.map +1 -0
  94. package/dist/types/Approval.d.ts +26 -0
  95. package/dist/types/Cleanup.d.ts +41 -0
  96. package/dist/types/Cloudflare.d.ts +36 -0
  97. package/dist/types/Connect.d.ts +506 -0
  98. package/dist/types/Custody.d.ts +38 -0
  99. package/dist/types/DnsRecord.d.ts +158 -0
  100. package/dist/types/DomainKit.d.ts +31 -0
  101. package/dist/types/DomainName.d.ts +27 -0
  102. package/dist/types/Plan.d.ts +76 -0
  103. package/dist/types/Principal.d.ts +18 -0
  104. package/dist/types/Provider.d.ts +248 -0
  105. package/dist/types/Providers.d.ts +16 -0
  106. package/dist/types/Provision.d.ts +75 -0
  107. package/dist/types/Reason.d.ts +118 -0
  108. package/dist/types/Receipt.d.ts +55 -0
  109. package/dist/types/Resolver.d.ts +135 -0
  110. package/dist/types/Server.d.ts +6523 -0
  111. package/dist/types/Storage.d.ts +314 -0
  112. package/dist/types/Testing.d.ts +84 -0
  113. package/dist/types/Transport.d.ts +124 -0
  114. package/dist/types/Vercel.d.ts +25 -0
  115. package/dist/types/Verify.d.ts +109 -0
  116. package/dist/types/entry/client.d.ts +2 -0
  117. package/dist/types/entry/server.d.ts +2 -0
  118. package/dist/types/entry/testing.d.ts +3 -0
  119. package/dist/types/index.d.ts +21 -0
  120. package/dist/types/internal/aes.d.ts +8 -0
  121. package/dist/types/internal/attempts.d.ts +40 -0
  122. package/dist/types/internal/cloudflare/client.d.ts +23 -0
  123. package/dist/types/internal/cloudflare/protocol.d.ts +71 -0
  124. package/dist/types/internal/cloudflare/records.d.ts +8 -0
  125. package/dist/types/internal/config.d.ts +4 -0
  126. package/dist/types/internal/conformance/provider.d.ts +12 -0
  127. package/dist/types/internal/conformance/storage.d.ts +14 -0
  128. package/dist/types/internal/digest.d.ts +10 -0
  129. package/dist/types/internal/doh.d.ts +19 -0
  130. package/dist/types/internal/error.d.ts +24 -0
  131. package/dist/types/internal/http.d.ts +27 -0
  132. package/dist/types/internal/ids.d.ts +3 -0
  133. package/dist/types/internal/oauth.d.ts +58 -0
  134. package/dist/types/internal/planner.d.ts +22 -0
  135. package/dist/types/internal/provider-async.d.ts +78 -0
  136. package/dist/types/internal/storage-memory.d.ts +2 -0
  137. package/dist/types/internal/vercel/client.d.ts +29 -0
  138. package/dist/types/internal/vercel/protocol.d.ts +124 -0
  139. package/dist/types/internal/vercel/records.d.ts +7 -0
  140. package/package.json +88 -12
  141. package/dist/canonical-json-CQYKsZw7.mjs +0 -310
  142. package/dist/canonical-json-CQYKsZw7.mjs.map +0 -1
  143. package/dist/connect-10vHuShV.d.mts +0 -1401
  144. package/dist/connect-oI8hcMxc.mjs +0 -185
  145. package/dist/connect-oI8hcMxc.mjs.map +0 -1
  146. package/dist/connection-C0xsU41C.d.mts +0 -186
  147. package/dist/connection-api-DW7xUJdj.d.mts +0 -26
  148. package/dist/index.d.mts +0 -882
  149. package/dist/managed-dns-connections-C3A_GBaz.mjs +0 -99
  150. package/dist/managed-dns-connections-C3A_GBaz.mjs.map +0 -1
  151. package/dist/promise.d.mts +0 -378
  152. package/dist/promise.mjs +0 -598
  153. package/dist/promise.mjs.map +0 -1
  154. package/dist/resolver-DPJs8h0a.mjs +0 -859
  155. package/dist/resolver-DPJs8h0a.mjs.map +0 -1
  156. package/dist/resolver-DRrLm_hB.d.mts +0 -3734
  157. package/dist/server.d.mts +0 -128
  158. package/dist/server.mjs +0 -319
  159. package/dist/server.mjs.map +0 -1
  160. package/dist/testing.d.mts +0 -62
  161. package/dist/testing.mjs +0 -507
  162. package/dist/testing.mjs.map +0 -1
  163. package/dist/verify-C3V_GtzL.d.mts +0 -1268
  164. package/dist/verify-DDnK8U7C.mjs +0 -2396
  165. package/dist/verify-DDnK8U7C.mjs.map +0 -1
@@ -0,0 +1,80 @@
1
+ import { Schema } from "effect";
2
+ //#region src/internal/vercel/protocol.ts
3
+ const Pagination = Schema.Struct({
4
+ count: Schema.Number,
5
+ next: Schema.NullOr(Schema.Number),
6
+ prev: Schema.NullOr(Schema.Number)
7
+ });
8
+ const ErrorDetail = Schema.Struct({
9
+ code: Schema.String,
10
+ message: Schema.String,
11
+ limit: Schema.optionalKey(Schema.Struct({
12
+ remaining: Schema.Number,
13
+ reset: Schema.optionalKey(Schema.Number),
14
+ resetMs: Schema.optionalKey(Schema.Number),
15
+ total: Schema.Number
16
+ }))
17
+ });
18
+ const ErrorEnvelope = Schema.Struct({ error: ErrorDetail });
19
+ const User = Schema.Struct({
20
+ id: Schema.String,
21
+ name: Schema.NullOr(Schema.String),
22
+ username: Schema.String
23
+ });
24
+ const UserEnvelope = Schema.Struct({ user: User });
25
+ const Team = Schema.Struct({
26
+ id: Schema.String,
27
+ name: Schema.NullOr(Schema.String),
28
+ slug: Schema.String
29
+ });
30
+ const TeamListEnvelope = Schema.Struct({
31
+ pagination: Pagination,
32
+ teams: Schema.Array(Team)
33
+ });
34
+ const Domain = Schema.Struct({
35
+ id: Schema.String,
36
+ intendedNameservers: Schema.Array(Schema.String),
37
+ name: Schema.String,
38
+ nameservers: Schema.Array(Schema.String),
39
+ serviceType: Schema.Literals([
40
+ "zeit.world",
41
+ "external",
42
+ "na"
43
+ ]),
44
+ teamId: Schema.NullOr(Schema.String),
45
+ userId: Schema.String,
46
+ verified: Schema.Boolean,
47
+ zone: Schema.optionalKey(Schema.Boolean)
48
+ });
49
+ const DomainListEnvelope = Schema.Struct({
50
+ domains: Schema.Array(Domain),
51
+ pagination: Pagination
52
+ });
53
+ const Record = Schema.Struct({
54
+ id: Schema.String,
55
+ mxPriority: Schema.optionalKey(Schema.Number),
56
+ name: Schema.String,
57
+ priority: Schema.optionalKey(Schema.Number),
58
+ ttl: Schema.optionalKey(Schema.Number),
59
+ type: Schema.String,
60
+ value: Schema.String
61
+ });
62
+ const RecordListEnvelope = Schema.Struct({
63
+ pagination: Schema.optionalKey(Pagination),
64
+ records: Schema.Array(Record)
65
+ });
66
+ const CreateRecordEnvelope = Schema.Struct({
67
+ uid: Schema.String,
68
+ updated: Schema.optionalKey(Schema.Number)
69
+ });
70
+ const IntegrationToken = Schema.Struct({
71
+ access_token: Schema.String,
72
+ installation_id: Schema.optionalKey(Schema.String),
73
+ team_id: Schema.NullOr(Schema.String),
74
+ token_type: Schema.optionalKey(Schema.String),
75
+ user_id: Schema.String
76
+ });
77
+ //#endregion
78
+ export { CreateRecordEnvelope, Domain, DomainListEnvelope, ErrorDetail, ErrorEnvelope, IntegrationToken, Pagination, Record, RecordListEnvelope, Team, TeamListEnvelope, User, UserEnvelope };
79
+
80
+ //# sourceMappingURL=protocol.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.mjs","names":["S"],"sources":["../../../src/internal/vercel/protocol.ts"],"sourcesContent":["import { Schema as S } from \"effect\";\n\nexport const Pagination = S.Struct({\n count: S.Number,\n next: S.NullOr(S.Number),\n prev: S.NullOr(S.Number),\n});\n\nexport const ErrorDetail = S.Struct({\n code: S.String,\n message: S.String,\n limit: S.optionalKey(\n S.Struct({\n remaining: S.Number,\n reset: S.optionalKey(S.Number),\n resetMs: S.optionalKey(S.Number),\n total: S.Number,\n }),\n ),\n});\n\nexport const ErrorEnvelope = S.Struct({ error: ErrorDetail });\n\nexport const User = S.Struct({ id: S.String, name: S.NullOr(S.String), username: S.String });\nexport const UserEnvelope = S.Struct({ user: User });\n\nexport const Team = S.Struct({ id: S.String, name: S.NullOr(S.String), slug: S.String });\nexport const TeamListEnvelope = S.Struct({ pagination: Pagination, teams: S.Array(Team) });\n\nexport const Domain = S.Struct({\n id: S.String,\n intendedNameservers: S.Array(S.String),\n name: S.String,\n nameservers: S.Array(S.String),\n serviceType: S.Literals([\"zeit.world\", \"external\", \"na\"]),\n teamId: S.NullOr(S.String),\n userId: S.String,\n verified: S.Boolean,\n zone: S.optionalKey(S.Boolean),\n});\nexport type Domain = typeof Domain.Type;\n\nexport const DomainListEnvelope = S.Struct({ domains: S.Array(Domain), pagination: Pagination });\n\nexport const Record = S.Struct({\n id: S.String,\n mxPriority: S.optionalKey(S.Number),\n name: S.String,\n priority: S.optionalKey(S.Number),\n ttl: S.optionalKey(S.Number),\n type: S.String,\n value: S.String,\n});\nexport type Record = typeof Record.Type;\n\nexport const RecordListEnvelope = S.Struct({\n pagination: S.optionalKey(Pagination),\n records: S.Array(Record),\n});\n\nexport const CreateRecordEnvelope = S.Struct({ uid: S.String, updated: S.optionalKey(S.Number) });\n\nexport const IntegrationToken = S.Struct({\n access_token: S.String,\n installation_id: S.optionalKey(S.String),\n team_id: S.NullOr(S.String),\n token_type: S.optionalKey(S.String),\n user_id: S.String,\n});\n"],"mappings":";;AAEA,MAAa,aAAaA,OAAE,OAAO;CACjC,OAAOA,OAAE;CACT,MAAMA,OAAE,OAAOA,OAAE,MAAM;CACvB,MAAMA,OAAE,OAAOA,OAAE,MAAM;AACzB,CAAC;AAED,MAAa,cAAcA,OAAE,OAAO;CAClC,MAAMA,OAAE;CACR,SAASA,OAAE;CACX,OAAOA,OAAE,YACPA,OAAE,OAAO;EACP,WAAWA,OAAE;EACb,OAAOA,OAAE,YAAYA,OAAE,MAAM;EAC7B,SAASA,OAAE,YAAYA,OAAE,MAAM;EAC/B,OAAOA,OAAE;CACX,CAAC,CACH;AACF,CAAC;AAED,MAAa,gBAAgBA,OAAE,OAAO,EAAE,OAAO,YAAY,CAAC;AAE5D,MAAa,OAAOA,OAAE,OAAO;CAAE,IAAIA,OAAE;CAAQ,MAAMA,OAAE,OAAOA,OAAE,MAAM;CAAG,UAAUA,OAAE;AAAO,CAAC;AAC3F,MAAa,eAAeA,OAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAEnD,MAAa,OAAOA,OAAE,OAAO;CAAE,IAAIA,OAAE;CAAQ,MAAMA,OAAE,OAAOA,OAAE,MAAM;CAAG,MAAMA,OAAE;AAAO,CAAC;AACvF,MAAa,mBAAmBA,OAAE,OAAO;CAAE,YAAY;CAAY,OAAOA,OAAE,MAAM,IAAI;AAAE,CAAC;AAEzF,MAAa,SAASA,OAAE,OAAO;CAC7B,IAAIA,OAAE;CACN,qBAAqBA,OAAE,MAAMA,OAAE,MAAM;CACrC,MAAMA,OAAE;CACR,aAAaA,OAAE,MAAMA,OAAE,MAAM;CAC7B,aAAaA,OAAE,SAAS;EAAC;EAAc;EAAY;CAAI,CAAC;CACxD,QAAQA,OAAE,OAAOA,OAAE,MAAM;CACzB,QAAQA,OAAE;CACV,UAAUA,OAAE;CACZ,MAAMA,OAAE,YAAYA,OAAE,OAAO;AAC/B,CAAC;AAGD,MAAa,qBAAqBA,OAAE,OAAO;CAAE,SAASA,OAAE,MAAM,MAAM;CAAG,YAAY;AAAW,CAAC;AAE/F,MAAa,SAASA,OAAE,OAAO;CAC7B,IAAIA,OAAE;CACN,YAAYA,OAAE,YAAYA,OAAE,MAAM;CAClC,MAAMA,OAAE;CACR,UAAUA,OAAE,YAAYA,OAAE,MAAM;CAChC,KAAKA,OAAE,YAAYA,OAAE,MAAM;CAC3B,MAAMA,OAAE;CACR,OAAOA,OAAE;AACX,CAAC;AAGD,MAAa,qBAAqBA,OAAE,OAAO;CACzC,YAAYA,OAAE,YAAY,UAAU;CACpC,SAASA,OAAE,MAAM,MAAM;AACzB,CAAC;AAED,MAAa,uBAAuBA,OAAE,OAAO;CAAE,KAAKA,OAAE;CAAQ,SAASA,OAAE,YAAYA,OAAE,MAAM;AAAE,CAAC;AAEhG,MAAa,mBAAmBA,OAAE,OAAO;CACvC,cAAcA,OAAE;CAChB,iBAAiBA,OAAE,YAAYA,OAAE,MAAM;CACvC,SAASA,OAAE,OAAOA,OAAE,MAAM;CAC1B,YAAYA,OAAE,YAAYA,OAAE,MAAM;CAClC,SAASA,OAAE;AACb,CAAC"}
@@ -0,0 +1,151 @@
1
+ import { Opaque, a, aaaa, caa, cname, mx, ns, srv, txt } from "../../DnsRecord.mjs";
2
+ import { rejected } from "../http.mjs";
3
+ import { Effect } from "effect";
4
+ //#region src/internal/vercel/records.ts
5
+ const decode = (zone, record) => Effect.sync(() => ({
6
+ record: decodeRecord(zone, record),
7
+ providerRecordId: record.id
8
+ }));
9
+ const decodeRecord = (zone, record) => {
10
+ const name = absoluteName(zone, record.name);
11
+ const opaque = new Opaque({
12
+ name,
13
+ type: record.type,
14
+ raw: record
15
+ });
16
+ const ttl = record.ttl === void 0 ? {} : { ttl: record.ttl };
17
+ try {
18
+ switch (record.type) {
19
+ case "A": return a({
20
+ name,
21
+ address: record.value,
22
+ ...ttl
23
+ });
24
+ case "AAAA": return aaaa({
25
+ name,
26
+ address: record.value,
27
+ ...ttl
28
+ });
29
+ case "CNAME": return cname({
30
+ name,
31
+ target: record.value,
32
+ ...ttl
33
+ });
34
+ case "NS": return ns({
35
+ name,
36
+ nameserver: record.value,
37
+ ...ttl
38
+ });
39
+ case "TXT": return txt({
40
+ name,
41
+ value: record.value,
42
+ ...ttl
43
+ });
44
+ case "MX": return mx({
45
+ name,
46
+ exchange: record.value,
47
+ priority: required(record.mxPriority ?? record.priority),
48
+ ...ttl
49
+ });
50
+ case "CAA": {
51
+ const match = record.value.match(/^(\d{1,3})\s+(\S+)\s+(?:"((?:\\.|[^"])*)"|(\S.*))$/);
52
+ if (match === null) return opaque;
53
+ return caa({
54
+ name,
55
+ flags: Number(match[1]),
56
+ tag: required(match[2]),
57
+ value: unescapeQuoted(match[3] ?? match[4] ?? ""),
58
+ ...ttl
59
+ });
60
+ }
61
+ case "SRV": {
62
+ const parts = record.value.trim().split(/\s+/);
63
+ const [priority, weight, port, target] = parts.length === 4 ? parts : [
64
+ String(record.priority ?? ""),
65
+ parts[0],
66
+ parts[1],
67
+ parts[2]
68
+ ];
69
+ return srv({
70
+ name,
71
+ target: required(target),
72
+ port: Number(port),
73
+ priority: Number(priority),
74
+ weight: Number(weight),
75
+ ...ttl
76
+ });
77
+ }
78
+ default: return opaque;
79
+ }
80
+ } catch {
81
+ return opaque;
82
+ }
83
+ };
84
+ const encode = (zone, record) => Effect.sync(() => {
85
+ const common = {
86
+ name: relativeName(zone, record.name),
87
+ ...record.ttl === null ? {} : { ttl: record.ttl },
88
+ type: record._tag
89
+ };
90
+ switch (record._tag) {
91
+ case "A":
92
+ case "AAAA": return {
93
+ ...common,
94
+ value: record.address
95
+ };
96
+ case "CNAME": return {
97
+ ...common,
98
+ value: record.target
99
+ };
100
+ case "NS": return {
101
+ ...common,
102
+ value: record.nameserver
103
+ };
104
+ case "TXT": return {
105
+ ...common,
106
+ value: record.value
107
+ };
108
+ case "MX": return {
109
+ ...common,
110
+ mxPriority: record.priority,
111
+ value: record.exchange
112
+ };
113
+ case "CAA": return {
114
+ ...common,
115
+ value: `${record.flags} ${record.tag} "${escapeQuoted(record.value)}"`
116
+ };
117
+ case "SRV": return {
118
+ ...common,
119
+ srv: {
120
+ port: record.port,
121
+ priority: record.priority,
122
+ target: record.target,
123
+ weight: record.weight
124
+ }
125
+ };
126
+ }
127
+ });
128
+ const outsideZone = (zone, name) => rejected("vercel", `DNS record ${name} is outside Vercel zone ${zone}`, "outside-zone");
129
+ function absoluteName(zone, name) {
130
+ return name === "" || name === "@" ? zone : name === zone || name.endsWith(`.${zone}`) ? name : `${name}.${zone}`;
131
+ }
132
+ function relativeName(zone, name) {
133
+ if (name === zone) return "";
134
+ const suffix = `.${zone}`;
135
+ if (!name.endsWith(suffix)) throw new Error(`DNS record ${name} is outside Vercel zone ${zone}`);
136
+ return name.slice(0, -suffix.length);
137
+ }
138
+ function required(value) {
139
+ if (value === void 0) throw new Error("Vercel record field is missing");
140
+ return value;
141
+ }
142
+ function escapeQuoted(value) {
143
+ return value.replaceAll("\\", "\\\\").replaceAll("\"", "\\\"");
144
+ }
145
+ function unescapeQuoted(value) {
146
+ return value.replace(/\\([\\"])/g, "$1");
147
+ }
148
+ //#endregion
149
+ export { decode, encode, outsideZone };
150
+
151
+ //# sourceMappingURL=records.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"records.mjs","names":["DnsRecord.Opaque","DnsRecord.a","DnsRecord.aaaa","DnsRecord.cname","DnsRecord.ns","DnsRecord.txt","DnsRecord.mx","DnsRecord.caa","DnsRecord.srv"],"sources":["../../../src/internal/vercel/records.ts"],"sourcesContent":["import { Effect } from \"effect\";\n\nimport * as DnsRecord from \"../../DnsRecord.ts\";\nimport type * as Provider from \"../../Provider.ts\";\nimport { rejected } from \"../http.ts\";\nimport type * as Protocol from \"./protocol.ts\";\n\nexport const decode = (\n zone: string,\n record: Protocol.Record,\n): Effect.Effect<Provider.ObservedRecord> =>\n Effect.sync(() => ({ record: decodeRecord(zone, record), providerRecordId: record.id }));\n\nconst decodeRecord = (zone: string, record: Protocol.Record): DnsRecord.Observed => {\n const name = absoluteName(zone, record.name);\n const opaque = new DnsRecord.Opaque({ name, type: record.type, raw: record });\n const ttl = record.ttl === undefined ? {} : { ttl: record.ttl };\n try {\n switch (record.type) {\n case \"A\":\n return DnsRecord.a({ name, address: record.value, ...ttl });\n case \"AAAA\":\n return DnsRecord.aaaa({ name, address: record.value, ...ttl });\n case \"CNAME\":\n return DnsRecord.cname({ name, target: record.value, ...ttl });\n case \"NS\":\n return DnsRecord.ns({ name, nameserver: record.value, ...ttl });\n case \"TXT\":\n return DnsRecord.txt({ name, value: record.value, ...ttl });\n case \"MX\":\n return DnsRecord.mx({\n name,\n exchange: record.value,\n priority: required(record.mxPriority ?? record.priority),\n ...ttl,\n });\n case \"CAA\": {\n const match = record.value.match(/^(\\d{1,3})\\s+(\\S+)\\s+(?:\"((?:\\\\.|[^\"])*)\"|(\\S.*))$/);\n if (match === null) return opaque;\n return DnsRecord.caa({\n name,\n flags: Number(match[1]),\n tag: required(match[2]),\n value: unescapeQuoted(match[3] ?? match[4] ?? \"\"),\n ...ttl,\n });\n }\n case \"SRV\": {\n const parts = record.value.trim().split(/\\s+/);\n const [priority, weight, port, target] =\n parts.length === 4\n ? parts\n : [String(record.priority ?? \"\"), parts[0], parts[1], parts[2]];\n return DnsRecord.srv({\n name,\n target: required(target),\n port: Number(port),\n priority: Number(priority),\n weight: Number(weight),\n ...ttl,\n });\n }\n default:\n return opaque;\n }\n } catch {\n return opaque;\n }\n};\n\nexport const encode = (\n zone: string,\n record: DnsRecord.Model,\n): Effect.Effect<Record<string, unknown>, never> =>\n Effect.sync(() => {\n const common = {\n name: relativeName(zone, record.name),\n ...(record.ttl === null ? {} : { ttl: record.ttl }),\n type: record._tag,\n };\n switch (record._tag) {\n case \"A\":\n case \"AAAA\":\n return { ...common, value: record.address };\n case \"CNAME\":\n return { ...common, value: record.target };\n case \"NS\":\n return { ...common, value: record.nameserver };\n case \"TXT\":\n return { ...common, value: record.value };\n case \"MX\":\n return { ...common, mxPriority: record.priority, value: record.exchange };\n case \"CAA\":\n return {\n ...common,\n value: `${record.flags} ${record.tag} \"${escapeQuoted(record.value)}\"`,\n };\n case \"SRV\":\n return {\n ...common,\n srv: {\n port: record.port,\n priority: record.priority,\n target: record.target,\n weight: record.weight,\n },\n };\n }\n });\n\nexport const outsideZone = (zone: string, name: string) =>\n rejected(\"vercel\", `DNS record ${name} is outside Vercel zone ${zone}`, \"outside-zone\");\n\nfunction absoluteName(zone: string, name: string): string {\n return name === \"\" || name === \"@\"\n ? zone\n : name === zone || name.endsWith(`.${zone}`)\n ? name\n : `${name}.${zone}`;\n}\n\nfunction relativeName(zone: string, name: string): string {\n if (name === zone) return \"\";\n const suffix = `.${zone}`;\n if (!name.endsWith(suffix)) throw new Error(`DNS record ${name} is outside Vercel zone ${zone}`);\n return name.slice(0, -suffix.length);\n}\n\nfunction required<A>(value: A | undefined): A {\n if (value === undefined) throw new Error(\"Vercel record field is missing\");\n return value;\n}\n\nfunction escapeQuoted(value: string): string {\n return value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll('\"', '\\\\\"');\n}\n\nfunction unescapeQuoted(value: string): string {\n return value.replace(/\\\\([\\\\\"])/g, \"$1\");\n}\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ //#region package.json
2
+ var version = "0.9.0";
3
+ //#endregion
4
+ export { version };
5
+
6
+ //# sourceMappingURL=package.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.mjs","names":[],"sources":["../package.json"],"sourcesContent":[""],"mappings":""}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * A principal's consent to apply a specific plan digest. `Provision.apply` and `Cleanup.apply`
3
+ * accept only an Approval. The word "authorization" is reserved for provider OAuth.
4
+ */
5
+ import { Effect, Schema } from "effect";
6
+ import * as Errors from "./internal/error.ts";
7
+ export declare const ApprovalId: Schema.brand<Schema.String, "@domainkit/ApprovalId">;
8
+ export type ApprovalId = typeof ApprovalId.Type;
9
+ declare const Model_base: Schema.Class<Model, Schema.Struct<{
10
+ readonly id: Schema.brand<Schema.String, "@domainkit/ApprovalId">;
11
+ readonly version: Schema.Literal<"domainkit.approval.v2">;
12
+ readonly kind: Schema.Literals<readonly ["provisioning", "cleanup"]>;
13
+ readonly planId: Schema.brand<Schema.String, "@domainkit/PlanId">;
14
+ readonly digest: Schema.brand<Schema.String, "@domainkit/Digest">;
15
+ /** Subset of the plan's write operations; the full set unless partial approval was requested. */
16
+ readonly operationIds: Schema.$Array<Schema.brand<Schema.String, "@domainkit/OperationId">>;
17
+ readonly approvedBy: Schema.String;
18
+ readonly approvedAt: Schema.DateTimeUtcFromString;
19
+ readonly expiresAt: Schema.DateTimeUtcFromString;
20
+ }>, {}>;
21
+ export declare class Model extends Model_base {
22
+ }
23
+ export type Encoded = typeof Model.Encoded;
24
+ export declare const decode: (input: unknown) => Effect.Effect<Model, Errors.DomainKitError>;
25
+ export declare const encode: (approval: Model) => Encoded;
26
+ export {};
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Remove only what a receipt proves DomainKit created, with its own plan, approval, and receipt.
3
+ * Same three verbs as Provision; the plan is built from a receipt instead of requirements.
4
+ */
5
+ import { Context, Effect, Layer } from "effect";
6
+ import type * as Approval from "./Approval.ts";
7
+ import * as Connect from "./Connect.ts";
8
+ import * as Errors from "./internal/error.ts";
9
+ import * as Attempts from "./internal/attempts.ts";
10
+ import type * as Plan from "./Plan.ts";
11
+ import type * as Principal from "./Principal.ts";
12
+ import * as Provision from "./Provision.ts";
13
+ import * as Receipt from "./Receipt.ts";
14
+ import * as Storage from "./Storage.ts";
15
+ type Fx<A> = Effect.Effect<A, Errors.DomainKitError, Principal.Service>;
16
+ export interface Interface {
17
+ /** Read back every receipt record; records that no longer match exactly become `Conflict`. */
18
+ readonly plan: (input: {
19
+ readonly receiptId: Receipt.ReceiptId;
20
+ } | {
21
+ readonly domain: string;
22
+ }) => Fx<Plan.Model>;
23
+ readonly approve: (plan: Plan.Model | Plan.PlanId, options?: Attempts.ApproveOptions) => Fx<Approval.Model>;
24
+ /** Decline the cleanup plan; terminal, same rules as `Provision.reject`. */
25
+ readonly reject: (plan: Plan.Model | Plan.PlanId, options?: Provision.RejectOptions) => Fx<Provision.Attempt>;
26
+ readonly apply: (approval: Approval.Model | Approval.ApprovalId) => Fx<Receipt.Model>;
27
+ }
28
+ declare const Service_base: Context.ServiceClass<Service, "@domainkit/Cleanup", Interface>;
29
+ export declare class Service extends Service_base {
30
+ }
31
+ export declare const make: Effect.Effect<Interface, never, Storage.Service | Connect.Service>;
32
+ export declare const layer: Layer.Layer<Service, never, Storage.Service | Connect.Service>;
33
+ export declare const plan: (input: {
34
+ readonly receiptId: Receipt.ReceiptId;
35
+ } | {
36
+ readonly domain: string;
37
+ }) => Effect.Effect<Plan.Model, Errors.DomainKitError, Principal.Service | Service>;
38
+ export declare const approve: (plan: Plan.Model | (string & import("effect/Brand").Brand<"@domainkit/PlanId">), options?: Attempts.ApproveOptions | undefined) => Effect.Effect<Approval.Model, Errors.DomainKitError, Principal.Service | Service>;
39
+ export declare const reject: (plan: Plan.Model | (string & import("effect/Brand").Brand<"@domainkit/PlanId">), options?: Provision.RejectOptions | undefined) => Effect.Effect<Provision.Attempt, Errors.DomainKitError, Principal.Service | Service>;
40
+ export declare const apply: (approval: Approval.Model | (string & import("effect/Brand").Brand<"@domainkit/ApprovalId">)) => Effect.Effect<Receipt.Model, Errors.DomainKitError, Principal.Service | Service>;
41
+ export {};
@@ -0,0 +1,36 @@
1
+ /** Cloudflare: personal API tokens and OAuth. */
2
+ import { type Config, Redacted, Schema } from "effect";
3
+ import type { Fetch } from "./internal/http.ts";
4
+ import * as OAuth from "./internal/oauth.ts";
5
+ import * as Provider from "./Provider.ts";
6
+ /**
7
+ * Authorization context: `accountId` is `null` when the credential spans several accounts or
8
+ * none yet. Target context: the zone's account and zone id.
9
+ */
10
+ export declare const AccountContext: Schema.Struct<{
11
+ readonly accountId: Schema.NullOr<Schema.String>;
12
+ /** How the token was verified: user tokens span accounts, account tokens are pinned. */
13
+ readonly tokenKind: Schema.optionalKey<Schema.Literals<readonly ["user", "account"]>>;
14
+ readonly zoneId: Schema.optionalKey<Schema.String>;
15
+ }>;
16
+ /** Token-method input: the API token, and the account id for account-owned tokens. */
17
+ export declare const TokenFields: Schema.Struct<{
18
+ readonly token: Schema.RedactedFromValue<Schema.String>;
19
+ readonly accountId: Schema.optionalKey<Schema.String>;
20
+ }>;
21
+ export type AccountContext = typeof AccountContext.Type;
22
+ export interface Options {
23
+ /** Omit to offer tokens only. */
24
+ readonly oauth?: {
25
+ readonly clientId: string | Config.Config<string>;
26
+ readonly clientSecret: Redacted.Redacted<string> | Config.Config<Redacted.Redacted<string>>;
27
+ /** Scope ids assigned to the OAuth client. Default: `zone:read`, `dns_records:edit`, `offline_access`. */
28
+ readonly scopes?: ReadonlyArray<string>;
29
+ /** Default `client_secret_basic`. */
30
+ readonly clientAuth?: OAuth.ClientAuth;
31
+ };
32
+ readonly fetch?: Fetch;
33
+ readonly baseUrl?: string;
34
+ }
35
+ export declare const server: OAuth.Server;
36
+ export declare const provider: (options?: Options) => Provider.Definition<AccountContext>;