@serve.zone/dcrouter 13.5.0 → 13.7.1

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 (136) hide show
  1. package/dist_serve/bundle.js +1705 -1365
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts/classes.dcrouter.d.ts +2 -5
  4. package/dist_ts/classes.dcrouter.js +41 -10
  5. package/dist_ts/db/documents/classes.dns-provider.doc.d.ts +22 -0
  6. package/dist_ts/db/documents/classes.dns-provider.doc.js +134 -0
  7. package/dist_ts/db/documents/classes.dns-record.doc.d.ts +21 -0
  8. package/dist_ts/db/documents/classes.dns-record.doc.js +143 -0
  9. package/dist_ts/db/documents/classes.domain.doc.d.ts +22 -0
  10. package/dist_ts/db/documents/classes.domain.doc.js +146 -0
  11. package/dist_ts/db/documents/index.d.ts +3 -0
  12. package/dist_ts/db/documents/index.js +5 -1
  13. package/dist_ts/dns/index.d.ts +2 -0
  14. package/dist_ts/dns/index.js +3 -0
  15. package/dist_ts/dns/manager.dns.d.ts +227 -0
  16. package/dist_ts/dns/manager.dns.js +747 -0
  17. package/dist_ts/dns/providers/cloudflare.provider.d.ts +21 -0
  18. package/dist_ts/dns/providers/cloudflare.provider.js +106 -0
  19. package/dist_ts/dns/providers/factory.d.ts +23 -0
  20. package/dist_ts/dns/providers/factory.js +38 -0
  21. package/dist_ts/dns/providers/index.d.ts +3 -0
  22. package/dist_ts/dns/providers/index.js +4 -0
  23. package/dist_ts/dns/providers/interfaces.d.ts +54 -0
  24. package/dist_ts/dns/providers/interfaces.js +2 -0
  25. package/dist_ts/opsserver/classes.opsserver.d.ts +3 -0
  26. package/dist_ts/opsserver/classes.opsserver.js +7 -1
  27. package/dist_ts/opsserver/handlers/config.handler.js +11 -2
  28. package/dist_ts/opsserver/handlers/dns-provider.handler.d.ts +16 -0
  29. package/dist_ts/opsserver/handlers/dns-provider.handler.js +119 -0
  30. package/dist_ts/opsserver/handlers/dns-record.handler.d.ts +13 -0
  31. package/dist_ts/opsserver/handlers/dns-record.handler.js +98 -0
  32. package/dist_ts/opsserver/handlers/domain.handler.d.ts +13 -0
  33. package/dist_ts/opsserver/handlers/domain.handler.js +124 -0
  34. package/dist_ts/opsserver/handlers/index.d.ts +3 -0
  35. package/dist_ts/opsserver/handlers/index.js +4 -1
  36. package/dist_ts_interfaces/data/dns-provider.d.ts +112 -0
  37. package/dist_ts_interfaces/data/dns-provider.js +27 -0
  38. package/dist_ts_interfaces/data/dns-record.d.ts +40 -0
  39. package/dist_ts_interfaces/data/dns-record.js +2 -0
  40. package/dist_ts_interfaces/data/domain.d.ts +34 -0
  41. package/dist_ts_interfaces/data/domain.js +2 -0
  42. package/dist_ts_interfaces/data/index.d.ts +3 -0
  43. package/dist_ts_interfaces/data/index.js +4 -1
  44. package/dist_ts_interfaces/data/route-management.d.ts +1 -1
  45. package/dist_ts_interfaces/requests/dns-providers.d.ts +117 -0
  46. package/dist_ts_interfaces/requests/dns-providers.js +2 -0
  47. package/dist_ts_interfaces/requests/dns-records.d.ts +89 -0
  48. package/dist_ts_interfaces/requests/dns-records.js +2 -0
  49. package/dist_ts_interfaces/requests/domains.d.ts +118 -0
  50. package/dist_ts_interfaces/requests/domains.js +2 -0
  51. package/dist_ts_interfaces/requests/index.d.ts +3 -0
  52. package/dist_ts_interfaces/requests/index.js +4 -1
  53. package/dist_ts_web/00_commitinfo_data.js +1 -1
  54. package/dist_ts_web/appstate.d.ts +72 -0
  55. package/dist_ts_web/appstate.js +308 -6
  56. package/dist_ts_web/elements/access/ops-view-apitokens.js +1 -1
  57. package/dist_ts_web/elements/access/ops-view-users.js +1 -1
  58. package/dist_ts_web/elements/domains/dns-provider-form.d.ts +58 -0
  59. package/dist_ts_web/elements/domains/dns-provider-form.js +268 -0
  60. package/dist_ts_web/elements/domains/index.d.ts +5 -0
  61. package/dist_ts_web/elements/domains/index.js +6 -0
  62. package/dist_ts_web/elements/{ops-view-certificates.d.ts → domains/ops-view-certificates.d.ts} +1 -1
  63. package/dist_ts_web/elements/{ops-view-certificates.js → domains/ops-view-certificates.js} +5 -5
  64. package/dist_ts_web/elements/domains/ops-view-dns.d.ts +17 -0
  65. package/dist_ts_web/elements/domains/ops-view-dns.js +304 -0
  66. package/dist_ts_web/elements/domains/ops-view-domains.d.ts +18 -0
  67. package/dist_ts_web/elements/domains/ops-view-domains.js +361 -0
  68. package/dist_ts_web/elements/domains/ops-view-providers.d.ts +21 -0
  69. package/dist_ts_web/elements/domains/ops-view-providers.js +316 -0
  70. package/dist_ts_web/elements/email/ops-view-email-security.js +1 -1
  71. package/dist_ts_web/elements/email/ops-view-emails.js +1 -1
  72. package/dist_ts_web/elements/index.d.ts +1 -1
  73. package/dist_ts_web/elements/index.js +2 -2
  74. package/dist_ts_web/elements/network/ops-view-network-activity.js +1 -1
  75. package/dist_ts_web/elements/network/ops-view-networktargets.js +1 -1
  76. package/dist_ts_web/elements/network/ops-view-remoteingress.js +1 -1
  77. package/dist_ts_web/elements/network/ops-view-routes.js +1 -1
  78. package/dist_ts_web/elements/network/ops-view-sourceprofiles.js +1 -1
  79. package/dist_ts_web/elements/network/ops-view-targetprofiles.js +1 -1
  80. package/dist_ts_web/elements/network/ops-view-vpn.js +1 -1
  81. package/dist_ts_web/elements/ops-dashboard.js +14 -5
  82. package/dist_ts_web/elements/ops-view-logs.js +1 -1
  83. package/dist_ts_web/elements/overview/ops-view-config.js +3 -3
  84. package/dist_ts_web/elements/overview/ops-view-overview.js +1 -1
  85. package/dist_ts_web/elements/security/ops-view-security-authentication.js +1 -1
  86. package/dist_ts_web/elements/security/ops-view-security-blocked.js +1 -1
  87. package/dist_ts_web/elements/security/ops-view-security-overview.js +1 -1
  88. package/dist_ts_web/router.d.ts +1 -1
  89. package/dist_ts_web/router.js +4 -2
  90. package/package.json +2 -2
  91. package/ts/00_commitinfo_data.ts +1 -1
  92. package/ts/classes.dcrouter.ts +46 -17
  93. package/ts/db/documents/classes.dns-provider.doc.ts +63 -0
  94. package/ts/db/documents/classes.dns-record.doc.ts +62 -0
  95. package/ts/db/documents/classes.domain.doc.ts +66 -0
  96. package/ts/db/documents/index.ts +5 -0
  97. package/ts/dns/index.ts +2 -0
  98. package/ts/dns/manager.dns.ts +869 -0
  99. package/ts/dns/providers/cloudflare.provider.ts +131 -0
  100. package/ts/dns/providers/factory.ts +48 -0
  101. package/ts/dns/providers/index.ts +3 -0
  102. package/ts/dns/providers/interfaces.ts +67 -0
  103. package/ts/opsserver/classes.opsserver.ts +6 -0
  104. package/ts/opsserver/handlers/config.handler.ts +10 -1
  105. package/ts/opsserver/handlers/dns-provider.handler.ts +159 -0
  106. package/ts/opsserver/handlers/dns-record.handler.ts +127 -0
  107. package/ts/opsserver/handlers/domain.handler.ts +161 -0
  108. package/ts/opsserver/handlers/index.ts +4 -1
  109. package/ts_web/00_commitinfo_data.ts +1 -1
  110. package/ts_web/appstate.ts +403 -5
  111. package/ts_web/elements/access/ops-view-apitokens.ts +1 -1
  112. package/ts_web/elements/access/ops-view-users.ts +1 -1
  113. package/ts_web/elements/domains/dns-provider-form.ts +216 -0
  114. package/ts_web/elements/domains/index.ts +5 -0
  115. package/ts_web/elements/{ops-view-certificates.ts → domains/ops-view-certificates.ts} +4 -4
  116. package/ts_web/elements/domains/ops-view-dns.ts +273 -0
  117. package/ts_web/elements/domains/ops-view-domains.ts +335 -0
  118. package/ts_web/elements/domains/ops-view-providers.ts +284 -0
  119. package/ts_web/elements/email/ops-view-email-security.ts +1 -1
  120. package/ts_web/elements/email/ops-view-emails.ts +1 -1
  121. package/ts_web/elements/index.ts +1 -1
  122. package/ts_web/elements/network/ops-view-network-activity.ts +1 -1
  123. package/ts_web/elements/network/ops-view-networktargets.ts +1 -1
  124. package/ts_web/elements/network/ops-view-remoteingress.ts +1 -1
  125. package/ts_web/elements/network/ops-view-routes.ts +1 -1
  126. package/ts_web/elements/network/ops-view-sourceprofiles.ts +1 -1
  127. package/ts_web/elements/network/ops-view-targetprofiles.ts +1 -1
  128. package/ts_web/elements/network/ops-view-vpn.ts +1 -1
  129. package/ts_web/elements/ops-dashboard.ts +14 -4
  130. package/ts_web/elements/ops-view-logs.ts +1 -1
  131. package/ts_web/elements/overview/ops-view-config.ts +2 -2
  132. package/ts_web/elements/overview/ops-view-overview.ts +1 -1
  133. package/ts_web/elements/security/ops-view-security-authentication.ts +1 -1
  134. package/ts_web/elements/security/ops-view-security-blocked.ts +1 -1
  135. package/ts_web/elements/security/ops-view-security-overview.ts +1 -1
  136. package/ts_web/router.ts +3 -1
@@ -0,0 +1,98 @@
1
+ import * as plugins from '../../plugins.js';
2
+ import * as interfaces from '../../../dist_ts_interfaces/index.js';
3
+ /**
4
+ * CRUD handlers for DnsRecordDoc.
5
+ */
6
+ export class DnsRecordHandler {
7
+ opsServerRef;
8
+ typedrouter = new plugins.typedrequest.TypedRouter();
9
+ constructor(opsServerRef) {
10
+ this.opsServerRef = opsServerRef;
11
+ this.opsServerRef.typedrouter.addTypedRouter(this.typedrouter);
12
+ this.registerHandlers();
13
+ }
14
+ async requireAuth(request, requiredScope) {
15
+ if (request.identity?.jwt) {
16
+ try {
17
+ const isAdmin = await this.opsServerRef.adminHandler.adminIdentityGuard.exec({
18
+ identity: request.identity,
19
+ });
20
+ if (isAdmin)
21
+ return request.identity.userId;
22
+ }
23
+ catch { /* fall through */ }
24
+ }
25
+ if (request.apiToken) {
26
+ const tokenManager = this.opsServerRef.dcRouterRef.apiTokenManager;
27
+ if (tokenManager) {
28
+ const token = await tokenManager.validateToken(request.apiToken);
29
+ if (token) {
30
+ if (!requiredScope || tokenManager.hasScope(token, requiredScope)) {
31
+ return token.createdBy;
32
+ }
33
+ throw new plugins.typedrequest.TypedResponseError('insufficient scope');
34
+ }
35
+ }
36
+ }
37
+ throw new plugins.typedrequest.TypedResponseError('unauthorized');
38
+ }
39
+ registerHandlers() {
40
+ // Get records by domain
41
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('getDnsRecords', async (dataArg) => {
42
+ await this.requireAuth(dataArg, 'dns-records:read');
43
+ const dnsManager = this.opsServerRef.dcRouterRef.dnsManager;
44
+ if (!dnsManager)
45
+ return { records: [] };
46
+ const docs = await dnsManager.listRecordsForDomain(dataArg.domainId);
47
+ return { records: docs.map((d) => dnsManager.toPublicRecord(d)) };
48
+ }));
49
+ // Get single record
50
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('getDnsRecord', async (dataArg) => {
51
+ await this.requireAuth(dataArg, 'dns-records:read');
52
+ const dnsManager = this.opsServerRef.dcRouterRef.dnsManager;
53
+ if (!dnsManager)
54
+ return { record: null };
55
+ const doc = await dnsManager.getRecord(dataArg.id);
56
+ return { record: doc ? dnsManager.toPublicRecord(doc) : null };
57
+ }));
58
+ // Create record
59
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('createDnsRecord', async (dataArg) => {
60
+ const userId = await this.requireAuth(dataArg, 'dns-records:write');
61
+ const dnsManager = this.opsServerRef.dcRouterRef.dnsManager;
62
+ if (!dnsManager)
63
+ return { success: false, message: 'DnsManager not initialized' };
64
+ return await dnsManager.createRecord({
65
+ domainId: dataArg.domainId,
66
+ name: dataArg.name,
67
+ type: dataArg.type,
68
+ value: dataArg.value,
69
+ ttl: dataArg.ttl,
70
+ proxied: dataArg.proxied,
71
+ createdBy: userId,
72
+ });
73
+ }));
74
+ // Update record
75
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('updateDnsRecord', async (dataArg) => {
76
+ await this.requireAuth(dataArg, 'dns-records:write');
77
+ const dnsManager = this.opsServerRef.dcRouterRef.dnsManager;
78
+ if (!dnsManager)
79
+ return { success: false, message: 'DnsManager not initialized' };
80
+ return await dnsManager.updateRecord({
81
+ id: dataArg.id,
82
+ name: dataArg.name,
83
+ value: dataArg.value,
84
+ ttl: dataArg.ttl,
85
+ proxied: dataArg.proxied,
86
+ });
87
+ }));
88
+ // Delete record
89
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('deleteDnsRecord', async (dataArg) => {
90
+ await this.requireAuth(dataArg, 'dns-records:write');
91
+ const dnsManager = this.opsServerRef.dcRouterRef.dnsManager;
92
+ if (!dnsManager)
93
+ return { success: false, message: 'DnsManager not initialized' };
94
+ return await dnsManager.deleteRecord(dataArg.id);
95
+ }));
96
+ }
97
+ }
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5zLXJlY29yZC5oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHMvb3Bzc2VydmVyL2hhbmRsZXJzL2Rucy1yZWNvcmQuaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBRTVDLE9BQU8sS0FBSyxVQUFVLE1BQU0saUNBQWlDLENBQUM7QUFFOUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBR1A7SUFGYixXQUFXLEdBQUcsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBRTVELFlBQW9CLFlBQXVCO1FBQXZCLGlCQUFZLEdBQVosWUFBWSxDQUFXO1FBQ3pDLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVPLEtBQUssQ0FBQyxXQUFXLENBQ3ZCLE9BQW9FLEVBQ3BFLGFBQThDO1FBRTlDLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7b0JBQzNFLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtpQkFDM0IsQ0FBQyxDQUFDO2dCQUNILElBQUksT0FBTztvQkFBRSxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQzlDLENBQUM7WUFBQyxNQUFNLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNyQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFB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
@@ -0,0 +1,13 @@
1
+ import * as plugins from '../../plugins.js';
2
+ import type { OpsServer } from '../classes.opsserver.js';
3
+ import * as interfaces from '../../../dist_ts_interfaces/index.js';
4
+ /**
5
+ * CRUD handlers for DomainDoc.
6
+ */
7
+ export declare class DomainHandler {
8
+ private opsServerRef;
9
+ typedrouter: plugins.typedrequest.TypedRouter<interfaces.typedrequestInterfaces.ITypedRequest>;
10
+ constructor(opsServerRef: OpsServer);
11
+ private requireAuth;
12
+ private registerHandlers;
13
+ }
@@ -0,0 +1,124 @@
1
+ import * as plugins from '../../plugins.js';
2
+ import * as interfaces from '../../../dist_ts_interfaces/index.js';
3
+ /**
4
+ * CRUD handlers for DomainDoc.
5
+ */
6
+ export class DomainHandler {
7
+ opsServerRef;
8
+ typedrouter = new plugins.typedrequest.TypedRouter();
9
+ constructor(opsServerRef) {
10
+ this.opsServerRef = opsServerRef;
11
+ this.opsServerRef.typedrouter.addTypedRouter(this.typedrouter);
12
+ this.registerHandlers();
13
+ }
14
+ async requireAuth(request, requiredScope) {
15
+ if (request.identity?.jwt) {
16
+ try {
17
+ const isAdmin = await this.opsServerRef.adminHandler.adminIdentityGuard.exec({
18
+ identity: request.identity,
19
+ });
20
+ if (isAdmin)
21
+ return request.identity.userId;
22
+ }
23
+ catch { /* fall through */ }
24
+ }
25
+ if (request.apiToken) {
26
+ const tokenManager = this.opsServerRef.dcRouterRef.apiTokenManager;
27
+ if (tokenManager) {
28
+ const token = await tokenManager.validateToken(request.apiToken);
29
+ if (token) {
30
+ if (!requiredScope || tokenManager.hasScope(token, requiredScope)) {
31
+ return token.createdBy;
32
+ }
33
+ throw new plugins.typedrequest.TypedResponseError('insufficient scope');
34
+ }
35
+ }
36
+ }
37
+ throw new plugins.typedrequest.TypedResponseError('unauthorized');
38
+ }
39
+ registerHandlers() {
40
+ // Get all domains
41
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('getDomains', async (dataArg) => {
42
+ await this.requireAuth(dataArg, 'domains:read');
43
+ const dnsManager = this.opsServerRef.dcRouterRef.dnsManager;
44
+ if (!dnsManager)
45
+ return { domains: [] };
46
+ const docs = await dnsManager.listDomains();
47
+ return { domains: docs.map((d) => dnsManager.toPublicDomain(d)) };
48
+ }));
49
+ // Get single domain
50
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('getDomain', async (dataArg) => {
51
+ await this.requireAuth(dataArg, 'domains:read');
52
+ const dnsManager = this.opsServerRef.dcRouterRef.dnsManager;
53
+ if (!dnsManager)
54
+ return { domain: null };
55
+ const doc = await dnsManager.getDomain(dataArg.id);
56
+ return { domain: doc ? dnsManager.toPublicDomain(doc) : null };
57
+ }));
58
+ // Create manual domain
59
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('createDomain', async (dataArg) => {
60
+ const userId = await this.requireAuth(dataArg, 'domains:write');
61
+ const dnsManager = this.opsServerRef.dcRouterRef.dnsManager;
62
+ if (!dnsManager)
63
+ return { success: false, message: 'DnsManager not initialized' };
64
+ try {
65
+ const id = await dnsManager.createManualDomain({
66
+ name: dataArg.name,
67
+ description: dataArg.description,
68
+ createdBy: userId,
69
+ });
70
+ return { success: true, id };
71
+ }
72
+ catch (err) {
73
+ return { success: false, message: err.message };
74
+ }
75
+ }));
76
+ // Import domains from a provider
77
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('importDomain', async (dataArg) => {
78
+ const userId = await this.requireAuth(dataArg, 'domains:write');
79
+ const dnsManager = this.opsServerRef.dcRouterRef.dnsManager;
80
+ if (!dnsManager)
81
+ return { success: false, message: 'DnsManager not initialized' };
82
+ try {
83
+ const importedIds = await dnsManager.importDomainsFromProvider({
84
+ providerId: dataArg.providerId,
85
+ domainNames: dataArg.domainNames,
86
+ createdBy: userId,
87
+ });
88
+ return { success: true, importedIds };
89
+ }
90
+ catch (err) {
91
+ return { success: false, message: err.message };
92
+ }
93
+ }));
94
+ // Update domain metadata
95
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('updateDomain', async (dataArg) => {
96
+ await this.requireAuth(dataArg, 'domains:write');
97
+ const dnsManager = this.opsServerRef.dcRouterRef.dnsManager;
98
+ if (!dnsManager)
99
+ return { success: false, message: 'DnsManager not initialized' };
100
+ const ok = await dnsManager.updateDomain(dataArg.id, {
101
+ description: dataArg.description,
102
+ });
103
+ return ok ? { success: true } : { success: false, message: 'Domain not found' };
104
+ }));
105
+ // Delete domain
106
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('deleteDomain', async (dataArg) => {
107
+ await this.requireAuth(dataArg, 'domains:write');
108
+ const dnsManager = this.opsServerRef.dcRouterRef.dnsManager;
109
+ if (!dnsManager)
110
+ return { success: false, message: 'DnsManager not initialized' };
111
+ const ok = await dnsManager.deleteDomain(dataArg.id);
112
+ return ok ? { success: true } : { success: false, message: 'Domain not found' };
113
+ }));
114
+ // Force-resync provider domain
115
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('syncDomain', async (dataArg) => {
116
+ await this.requireAuth(dataArg, 'domains:write');
117
+ const dnsManager = this.opsServerRef.dcRouterRef.dnsManager;
118
+ if (!dnsManager)
119
+ return { success: false, message: 'DnsManager not initialized' };
120
+ return await dnsManager.syncDomain(dataArg.id);
121
+ }));
122
+ }
123
+ }
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tYWluLmhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9vcHNzZXJ2ZXIvaGFuZGxlcnMvZG9tYWluLmhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUU1QyxPQUFPLEtBQUssVUFBVSxNQUFNLGlDQUFpQyxDQUFDO0FBRTlEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGFBQWE7SUFHSjtJQUZiLFdBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7SUFFNUQsWUFBb0IsWUFBdUI7UUFBdkIsaUJBQVksR0FBWixZQUFZLENBQVc7UUFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU8sS0FBSyxDQUFDLFdBQVcsQ0FDdkIsT0FBb0UsRUFDcEUsYUFBOEM7UUFFOUMsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQztnQkFDSCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztvQkFDM0UsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO2lCQUMzQixDQUFDLENBQUM7Z0JBQ0gsSUFBSSxPQUFPO29CQUFFLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFDOUMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FB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
@@ -14,3 +14,6 @@ export * from './source-profile.handler.js';
14
14
  export * from './target-profile.handler.js';
15
15
  export * from './network-target.handler.js';
16
16
  export * from './users.handler.js';
17
+ export * from './dns-provider.handler.js';
18
+ export * from './domain.handler.js';
19
+ export * from './dns-record.handler.js';
@@ -14,4 +14,7 @@ export * from './source-profile.handler.js';
14
14
  export * from './target-profile.handler.js';
15
15
  export * from './network-target.handler.js';
16
16
  export * from './users.handler.js';
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9vcHNzZXJ2ZXIvaGFuZGxlcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxvQkFBb0IsQ0FBQyJ9
17
+ export * from './dns-provider.handler.js';
18
+ export * from './domain.handler.js';
19
+ export * from './dns-record.handler.js';
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9vcHNzZXJ2ZXIvaGFuZGxlcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyx5QkFBeUIsQ0FBQyJ9
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Supported DNS provider types. Initially Cloudflare; the abstraction is
3
+ * designed so additional providers (Route53, Gandi, DigitalOcean…) can be
4
+ * added by implementing the IDnsProvider class interface in ts/dns/providers/.
5
+ */
6
+ export type TDnsProviderType = 'cloudflare';
7
+ /**
8
+ * Status of the last connection test against a provider.
9
+ */
10
+ export type TDnsProviderStatus = 'untested' | 'ok' | 'error';
11
+ /**
12
+ * Cloudflare-specific credential shape.
13
+ */
14
+ export interface ICloudflareCredentials {
15
+ apiToken: string;
16
+ }
17
+ /**
18
+ * Discriminated union of all supported provider credential shapes.
19
+ * Persisted opaquely on `IDnsProvider.credentials`.
20
+ */
21
+ export type TDnsProviderCredentials = ({
22
+ type: 'cloudflare';
23
+ } & ICloudflareCredentials);
24
+ /**
25
+ * A registered DNS provider account. Holds the credentials needed to
26
+ * call the provider's API and a snapshot of its last health check.
27
+ */
28
+ export interface IDnsProvider {
29
+ id: string;
30
+ name: string;
31
+ type: TDnsProviderType;
32
+ /** Opaque credentials object — shape depends on `type`. */
33
+ credentials: TDnsProviderCredentials;
34
+ status: TDnsProviderStatus;
35
+ lastTestedAt?: number;
36
+ lastError?: string;
37
+ createdAt: number;
38
+ updatedAt: number;
39
+ createdBy: string;
40
+ }
41
+ /**
42
+ * A redacted view of IDnsProvider safe to send to the UI / over the wire.
43
+ * Strips secret fields from `credentials` while preserving the rest.
44
+ */
45
+ export interface IDnsProviderPublic {
46
+ id: string;
47
+ name: string;
48
+ type: TDnsProviderType;
49
+ status: TDnsProviderStatus;
50
+ lastTestedAt?: number;
51
+ lastError?: string;
52
+ createdAt: number;
53
+ updatedAt: number;
54
+ createdBy: string;
55
+ /** Whether credentials are configured (true after creation). Never the secret itself. */
56
+ hasCredentials: boolean;
57
+ }
58
+ /**
59
+ * A domain reported by a provider's API (not yet imported into dcrouter).
60
+ */
61
+ export interface IProviderDomainListing {
62
+ /** FQDN of the zone (e.g. 'example.com'). */
63
+ name: string;
64
+ /** Provider's internal zone identifier (zone_id for Cloudflare). */
65
+ externalId: string;
66
+ /** Authoritative nameservers reported by the provider. */
67
+ nameservers: string[];
68
+ }
69
+ /**
70
+ * Schema entry for a single credential field, used by the OpsServer UI to
71
+ * render a provider's credential form dynamically.
72
+ */
73
+ export interface IDnsProviderCredentialField {
74
+ /** Key under which the value is stored in the credentials object. */
75
+ key: string;
76
+ /** Label shown to the user. */
77
+ label: string;
78
+ /** Optional inline help text. */
79
+ helpText?: string;
80
+ /** Whether the field must be filled. */
81
+ required: boolean;
82
+ /** True for secret fields (rendered as password input, never echoed back). */
83
+ secret: boolean;
84
+ }
85
+ /**
86
+ * Metadata describing a DNS provider type. Drives:
87
+ * - the OpsServer UI's provider type picker + credential form,
88
+ * - documentation of which credentials each provider needs,
89
+ * - end-to-end consistency between the type union, the discriminated
90
+ * credentials union, the runtime factory, and the form rendering.
91
+ *
92
+ * To add a new provider, append a new entry to `dnsProviderTypeDescriptors`
93
+ * below — and follow the checklist in `ts/dns/providers/factory.ts`.
94
+ */
95
+ export interface IDnsProviderTypeDescriptor {
96
+ type: TDnsProviderType;
97
+ /** Human-readable name for the UI. */
98
+ displayName: string;
99
+ /** One-line description shown next to the type picker. */
100
+ description: string;
101
+ /** Schema for the credentials form. */
102
+ credentialFields: IDnsProviderCredentialField[];
103
+ }
104
+ /**
105
+ * Single source of truth for which DNS provider types exist and what
106
+ * credentials each one needs. Used by both backend and frontend.
107
+ */
108
+ export declare const dnsProviderTypeDescriptors: ReadonlyArray<IDnsProviderTypeDescriptor>;
109
+ /**
110
+ * Look up the descriptor for a given provider type.
111
+ */
112
+ export declare function getDnsProviderTypeDescriptor(type: TDnsProviderType): IDnsProviderTypeDescriptor | undefined;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Single source of truth for which DNS provider types exist and what
3
+ * credentials each one needs. Used by both backend and frontend.
4
+ */
5
+ export const dnsProviderTypeDescriptors = [
6
+ {
7
+ type: 'cloudflare',
8
+ displayName: 'Cloudflare',
9
+ description: 'Manages records via the Cloudflare API. Provider stays authoritative; dcrouter pushes record changes.',
10
+ credentialFields: [
11
+ {
12
+ key: 'apiToken',
13
+ label: 'API Token',
14
+ helpText: 'A Cloudflare API token with Zone:Read and DNS:Edit permissions for the target zones.',
15
+ required: true,
16
+ secret: true,
17
+ },
18
+ ],
19
+ },
20
+ ];
21
+ /**
22
+ * Look up the descriptor for a given provider type.
23
+ */
24
+ export function getDnsProviderTypeDescriptor(type) {
25
+ return dnsProviderTypeDescriptors.find((d) => d.type === type);
26
+ }
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5zLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfaW50ZXJmYWNlcy9kYXRhL2Rucy1wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUErR0E7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQThDO0lBQ25GO1FBQ0UsSUFBSSxFQUFFLFlBQVk7UUFDbEIsV0FBVyxFQUFFLFlBQVk7UUFDekIsV0FBVyxFQUNULHVHQUF1RztRQUN6RyxnQkFBZ0IsRUFBRTtZQUNoQjtnQkFDRSxHQUFHLEVBQUUsVUFBVTtnQkFDZixLQUFLLEVBQUUsV0FBVztnQkFDbEIsUUFBUSxFQUNOLHNGQUFzRjtnQkFDeEYsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsTUFBTSxFQUFFLElBQUk7YUFDYjtTQUNGO0tBQ0Y7Q0FDRixDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLFVBQVUsNEJBQTRCLENBQzFDLElBQXNCO0lBRXRCLE9BQU8sMEJBQTBCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO0FBQ2pFLENBQUMifQ==
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Supported DNS record types.
3
+ */
4
+ export type TDnsRecordType = 'A' | 'AAAA' | 'CNAME' | 'MX' | 'TXT' | 'NS' | 'SOA' | 'CAA';
5
+ /**
6
+ * Where a DNS record came from.
7
+ *
8
+ * - 'manual' → created in the dcrouter UI / API
9
+ * - 'synced' → pulled from a provider during a sync operation
10
+ */
11
+ export type TDnsRecordSource = 'manual' | 'synced';
12
+ /**
13
+ * A DNS record. For manual (authoritative) domains, the record is registered
14
+ * with the embedded smartdns.DnsServer. For provider-managed domains, the
15
+ * record is mirrored from / pushed to the provider API and `providerRecordId`
16
+ * holds the provider's internal record id (for updates and deletes).
17
+ */
18
+ export interface IDnsRecord {
19
+ id: string;
20
+ /** ID of the parent IDomain. */
21
+ domainId: string;
22
+ /** Fully qualified record name (e.g. 'www.example.com'). */
23
+ name: string;
24
+ type: TDnsRecordType;
25
+ /**
26
+ * Record value as a string. For MX records, formatted as
27
+ * `<priority> <exchange>` (e.g. `10 mail.example.com`).
28
+ */
29
+ value: string;
30
+ /** TTL in seconds. */
31
+ ttl: number;
32
+ /** Cloudflare-specific: whether the record is proxied through Cloudflare. */
33
+ proxied?: boolean;
34
+ source: TDnsRecordSource;
35
+ /** Provider's internal record id (for updates/deletes). Only set for provider records. */
36
+ providerRecordId?: string;
37
+ createdAt: number;
38
+ updatedAt: number;
39
+ createdBy: string;
40
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5zLXJlY29yZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX2ludGVyZmFjZXMvZGF0YS9kbnMtcmVjb3JkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Where a domain came from / how it is managed.
3
+ *
4
+ * - 'manual' → operator added the domain manually. dcrouter is the
5
+ * authoritative DNS server for it; records are served by
6
+ * the embedded smartdns.DnsServer.
7
+ * - 'provider' → domain was imported from an external DNS provider
8
+ * (e.g. Cloudflare). The provider stays authoritative;
9
+ * dcrouter only reads/writes records via the provider API.
10
+ */
11
+ export type TDomainSource = 'manual' | 'provider';
12
+ /**
13
+ * A domain under management by dcrouter.
14
+ */
15
+ export interface IDomain {
16
+ id: string;
17
+ /** Fully qualified domain name (e.g. 'example.com'). */
18
+ name: string;
19
+ source: TDomainSource;
20
+ /** ID of the DnsProvider that owns this domain — only set when source === 'provider'. */
21
+ providerId?: string;
22
+ /** True when dcrouter is the authoritative DNS server for this domain (source === 'manual'). */
23
+ authoritative: boolean;
24
+ /** Authoritative nameservers (display only — populated from provider for imported domains). */
25
+ nameservers?: string[];
26
+ /** Provider's internal zone identifier — only set when source === 'provider'. */
27
+ externalZoneId?: string;
28
+ /** Last time records were synced from the provider — only set when source === 'provider'. */
29
+ lastSyncedAt?: number;
30
+ description?: string;
31
+ createdAt: number;
32
+ updatedAt: number;
33
+ createdBy: string;
34
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tYWluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfaW50ZXJmYWNlcy9kYXRhL2RvbWFpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -4,3 +4,6 @@ export * from './remoteingress.js';
4
4
  export * from './route-management.js';
5
5
  export * from './target-profile.js';
6
6
  export * from './vpn.js';
7
+ export * from './dns-provider.js';
8
+ export * from './domain.js';
9
+ export * from './dns-record.js';
@@ -4,4 +4,7 @@ export * from './remoteingress.js';
4
4
  export * from './route-management.js';
5
5
  export * from './target-profile.js';
6
6
  export * from './vpn.js';
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19pbnRlcmZhY2VzL2RhdGEvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxVQUFVLENBQUMifQ==
7
+ export * from './dns-provider.js';
8
+ export * from './domain.js';
9
+ export * from './dns-record.js';
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19pbnRlcmZhY2VzL2RhdGEvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGlCQUFpQixDQUFDIn0=
@@ -1,7 +1,7 @@
1
1
  import type { IRouteConfig } from '@push.rocks/smartproxy';
2
2
  import type { IDcRouterRouteConfig } from './remoteingress.js';
3
3
  export type IRouteSecurity = NonNullable<IRouteConfig['security']>;
4
- export type TApiTokenScope = 'routes:read' | 'routes:write' | 'config:read' | 'tokens:read' | 'tokens:manage' | 'source-profiles:read' | 'source-profiles:write' | 'target-profiles:read' | 'target-profiles:write' | 'targets:read' | 'targets:write';
4
+ export type TApiTokenScope = 'routes:read' | 'routes:write' | 'config:read' | 'tokens:read' | 'tokens:manage' | 'source-profiles:read' | 'source-profiles:write' | 'target-profiles:read' | 'target-profiles:write' | 'targets:read' | 'targets:write' | 'dns-providers:read' | 'dns-providers:write' | 'domains:read' | 'domains:write' | 'dns-records:read' | 'dns-records:write';
5
5
  /**
6
6
  * A reusable, named source profile that can be referenced by routes.
7
7
  * Stores the full IRouteSecurity shape from SmartProxy.
@@ -0,0 +1,117 @@
1
+ import * as plugins from '../plugins.js';
2
+ import type * as authInterfaces from '../data/auth.js';
3
+ import type { IDnsProviderPublic, IProviderDomainListing, TDnsProviderType, TDnsProviderCredentials } from '../data/dns-provider.js';
4
+ /**
5
+ * Get all DNS providers (public view, no secrets).
6
+ */
7
+ export interface IReq_GetDnsProviders extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_GetDnsProviders> {
8
+ method: 'getDnsProviders';
9
+ request: {
10
+ identity?: authInterfaces.IIdentity;
11
+ apiToken?: string;
12
+ };
13
+ response: {
14
+ providers: IDnsProviderPublic[];
15
+ };
16
+ }
17
+ /**
18
+ * Get a single DNS provider by id.
19
+ */
20
+ export interface IReq_GetDnsProvider extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_GetDnsProvider> {
21
+ method: 'getDnsProvider';
22
+ request: {
23
+ identity?: authInterfaces.IIdentity;
24
+ apiToken?: string;
25
+ id: string;
26
+ };
27
+ response: {
28
+ provider: IDnsProviderPublic | null;
29
+ };
30
+ }
31
+ /**
32
+ * Create a new DNS provider.
33
+ */
34
+ export interface IReq_CreateDnsProvider extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_CreateDnsProvider> {
35
+ method: 'createDnsProvider';
36
+ request: {
37
+ identity?: authInterfaces.IIdentity;
38
+ apiToken?: string;
39
+ name: string;
40
+ type: TDnsProviderType;
41
+ credentials: TDnsProviderCredentials;
42
+ };
43
+ response: {
44
+ success: boolean;
45
+ id?: string;
46
+ message?: string;
47
+ };
48
+ }
49
+ /**
50
+ * Update a DNS provider. Only supplied fields are updated.
51
+ * Pass `credentials` to rotate the secret.
52
+ */
53
+ export interface IReq_UpdateDnsProvider extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_UpdateDnsProvider> {
54
+ method: 'updateDnsProvider';
55
+ request: {
56
+ identity?: authInterfaces.IIdentity;
57
+ apiToken?: string;
58
+ id: string;
59
+ name?: string;
60
+ credentials?: TDnsProviderCredentials;
61
+ };
62
+ response: {
63
+ success: boolean;
64
+ message?: string;
65
+ };
66
+ }
67
+ /**
68
+ * Delete a DNS provider. Fails if any IDomain still references it
69
+ * unless `force: true` is set.
70
+ */
71
+ export interface IReq_DeleteDnsProvider extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_DeleteDnsProvider> {
72
+ method: 'deleteDnsProvider';
73
+ request: {
74
+ identity?: authInterfaces.IIdentity;
75
+ apiToken?: string;
76
+ id: string;
77
+ force?: boolean;
78
+ };
79
+ response: {
80
+ success: boolean;
81
+ message?: string;
82
+ };
83
+ }
84
+ /**
85
+ * Test the connection to a DNS provider. Used both for newly-saved
86
+ * providers and on demand from the UI.
87
+ */
88
+ export interface IReq_TestDnsProvider extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_TestDnsProvider> {
89
+ method: 'testDnsProvider';
90
+ request: {
91
+ identity?: authInterfaces.IIdentity;
92
+ apiToken?: string;
93
+ id: string;
94
+ };
95
+ response: {
96
+ ok: boolean;
97
+ error?: string;
98
+ testedAt: number;
99
+ };
100
+ }
101
+ /**
102
+ * List the domains visible to a DNS provider's API account.
103
+ * Used when importing — does NOT persist anything.
104
+ */
105
+ export interface IReq_ListProviderDomains extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_ListProviderDomains> {
106
+ method: 'listProviderDomains';
107
+ request: {
108
+ identity?: authInterfaces.IIdentity;
109
+ apiToken?: string;
110
+ providerId: string;
111
+ };
112
+ response: {
113
+ success: boolean;
114
+ domains?: IProviderDomainListing[];
115
+ message?: string;
116
+ };
117
+ }
@@ -0,0 +1,2 @@
1
+ import * as plugins from '../plugins.js';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5zLXByb3ZpZGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX2ludGVyZmFjZXMvcmVxdWVzdHMvZG5zLXByb3ZpZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQyJ9