From f39f8cd33c3df2dfe09e52bd0ba0bfc3f73ee5fe Mon Sep 17 00:00:00 2001 From: Philipp Kunz Date: Sat, 15 Jun 2024 19:47:09 +0200 Subject: [PATCH] switch to official cloudflare api client while keeping class based approach --- package.json | 3 +- pnpm-lock.yaml | 102 +++++++++++-- test/test.ts | 1 + ts/cloudflare.classes.account.ts | 203 +++++++------------------ ts/cloudflare.classes.zone.ts | 45 +----- ts/cloudflare.plugins.ts | 12 ++ ts/interfaces/cloudflare.api.record.ts | 15 -- ts/interfaces/cloudflare.api.zone.ts | 41 ----- ts/interfaces/index.ts | 2 - 9 files changed, 160 insertions(+), 264 deletions(-) delete mode 100644 ts/interfaces/cloudflare.api.record.ts delete mode 100644 ts/interfaces/cloudflare.api.zone.ts diff --git a/package.json b/package.json index 65bbf63..5e8fec4 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,8 @@ "@push.rocks/smartpromise": "^4.0.2", "@push.rocks/smartrequest": "^2.0.15", "@push.rocks/smartstring": "^4.0.5", - "@tsclass/tsclass": "^4.0.42" + "@tsclass/tsclass": "^4.0.58", + "cloudflare": "^3.2.0" }, "devDependencies": { "@git.zone/tsbuild": "^2.1.66", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1332049..ac67ca1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,8 +24,11 @@ importers: specifier: ^4.0.5 version: 4.0.15 '@tsclass/tsclass': - specifier: ^4.0.42 - version: 4.0.55 + specifier: ^4.0.58 + version: 4.0.58 + cloudflare: + specifier: ^3.2.0 + version: 3.2.0 devDependencies: '@git.zone/tsbuild': specifier: ^2.1.66 @@ -629,8 +632,8 @@ packages: '@tsclass/tsclass@3.0.48': resolution: {integrity: sha512-hC65UvDlp9qvsl6OcIZXz0JNiWZ0gyzsTzbXpg215sGxopgbkOLCr6E0s4qCTnweYm95gt2AdY95uP7M7kExaQ==} - '@tsclass/tsclass@4.0.55': - resolution: {integrity: sha512-zg774JF90/3/rJ7xk4LyGgxcUzxdKIQcwtBVxez4LhvegESxvHiFmX42WL105iBpE53ISJ8sctLWlwG1JQZdlA==} + '@tsclass/tsclass@4.0.58': + resolution: {integrity: sha512-H9b9m83TXMEF+xrW4IdGO0vGgIdC6t/Cv55bHHzUbbFxR+AgcPxMxMKtEYjkwrwtl4QNYez3Q5VuomF3WqaiIA==} '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -770,6 +773,12 @@ packages: '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + '@types/node-fetch@2.6.11': + resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} + + '@types/node@18.19.34': + resolution: {integrity: sha512-eXF4pfBNV5DAMKGbI02NnDtWrQ40hAN558/2vvS4gMpMIxaf6JmD7YjnZbq0Q9TDSSkKBamime8ewRoomHdt4g==} + '@types/node@20.14.2': resolution: {integrity: sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==} @@ -865,6 +874,10 @@ packages: resolution: {integrity: sha512-G0D3mv9jvR+5xILENchPP9v1ZjBf3QVlzarMLR5jedCNbgntzcayF0LeW5wh5uyafGZJH28cYm9jGrJvGipoPQ==} engines: {node: '>=18.0.0'} + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -1085,6 +1098,9 @@ packages: resolution: {integrity: sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=} engines: {node: '>=0.8'} + cloudflare@3.2.0: + resolution: {integrity: sha512-L6X3ky8rj+vFv6wf+/MxVVkwzMcxm+rjHtPAznHejYp3UC3ESovv+z8a6SZv6uXIXkAXHbCMCsbegiM4NNvXsg==} + co-body@6.2.0: resolution: {integrity: sha512-Kbpv2Yd1NdL1V/V4cwLVxraHDV6K8ayohr2rmH0J87Er8+zJjcTa6dAn9QMPC9CRgU8+aNajKbSf1TzDB1yKPA==} engines: {node: '>=8.0.0'} @@ -1385,6 +1401,10 @@ packages: resolution: {integrity: sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=} engines: {node: '>= 0.6'} + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} @@ -1466,6 +1486,9 @@ packages: resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} engines: {node: '>=14'} + form-data-encoder@1.7.2: + resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} + form-data-encoder@2.1.4: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} @@ -1478,6 +1501,10 @@ packages: resolution: {integrity: sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=} engines: {node: '>=0.4.x'} + formdata-node@4.4.1: + resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} + engines: {node: '>= 12.20'} + forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -2183,6 +2210,10 @@ packages: no-case@2.3.2: resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + node-fetch@2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} @@ -2887,6 +2918,14 @@ packages: web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + web-streams-polyfill@4.0.0-beta.3: + resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} + engines: {node: '>= 14'} + webidl-conversions@3.0.1: resolution: {integrity: sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=} @@ -3080,7 +3119,7 @@ snapshots: '@push.rocks/taskbuffer': 3.1.7 '@push.rocks/webrequest': 3.0.37 '@push.rocks/webstore': 2.0.20 - '@tsclass/tsclass': 4.0.55 + '@tsclass/tsclass': 4.0.58 '@types/express': 4.17.21 body-parser: 1.20.2 cors: 2.8.5 @@ -3587,7 +3626,7 @@ snapshots: '@push.rocks/smartlog-interfaces@3.0.2': dependencies: '@api.global/typedrequest-interfaces': 2.0.2 - '@tsclass/tsclass': 4.0.55 + '@tsclass/tsclass': 4.0.58 '@push.rocks/smartlog@3.0.7': dependencies: @@ -3667,7 +3706,7 @@ snapshots: '@push.rocks/smartpromise': 4.0.3 '@push.rocks/smartpuppeteer': 2.0.2 '@push.rocks/smartunique': 3.0.9 - '@tsclass/tsclass': 4.0.55 + '@tsclass/tsclass': 4.0.58 '@types/express': 4.17.21 express: 4.19.2 pdf-lib: 1.17.1 @@ -3725,7 +3764,7 @@ snapshots: '@push.rocks/smartxml': 1.0.8 '@push.rocks/smartyaml': 2.0.5 '@push.rocks/webrequest': 3.0.37 - '@tsclass/tsclass': 4.0.55 + '@tsclass/tsclass': 4.0.58 '@push.rocks/smartsocket@2.0.27': dependencies: @@ -3859,7 +3898,7 @@ snapshots: dependencies: '@pushrocks/smartdelay': 3.0.1 '@pushrocks/smartpromise': 4.0.2 - '@tsclass/tsclass': 4.0.55 + '@tsclass/tsclass': 4.0.58 '@push.rocks/webstore@2.0.20': dependencies: @@ -4035,7 +4074,7 @@ snapshots: dependencies: type-fest: 2.19.0 - '@tsclass/tsclass@4.0.55': + '@tsclass/tsclass@4.0.58': dependencies: type-fest: 4.20.0 @@ -4198,6 +4237,15 @@ snapshots: '@types/ms@0.7.34': {} + '@types/node-fetch@2.6.11': + dependencies: + '@types/node': 20.14.2 + form-data: 4.0.0 + + '@types/node@18.19.34': + dependencies: + undici-types: 5.26.5 + '@types/node@20.14.2': dependencies: undici-types: 5.26.5 @@ -4349,6 +4397,10 @@ snapshots: - supports-color - utf-8-validate + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + accepts@1.3.8: dependencies: mime-types: 2.1.35 @@ -4575,6 +4627,21 @@ snapshots: clone@2.1.2: {} + cloudflare@3.2.0: + dependencies: + '@types/node': 18.19.34 + '@types/node-fetch': 2.6.11 + '@types/qs': 6.9.15 + abort-controller: 3.0.0 + agentkeepalive: 4.5.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + qs: 6.12.1 + web-streams-polyfill: 3.3.3 + transitivePeerDependencies: + - encoding + co-body@6.2.0: dependencies: '@hapi/bourne': 3.0.0 @@ -4847,6 +4914,8 @@ snapshots: etag@1.8.1: {} + event-target-shim@5.0.1: {} + eventemitter3@4.0.7: {} express-force-ssl@0.3.2: @@ -4980,6 +5049,8 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 + form-data-encoder@1.7.2: {} + form-data-encoder@2.1.4: {} form-data@4.0.0: @@ -4990,6 +5061,11 @@ snapshots: format@0.2.2: {} + formdata-node@4.4.1: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + forwarded@0.2.0: {} fresh@0.5.2: {} @@ -5955,6 +6031,8 @@ snapshots: dependencies: lower-case: 1.1.4 + node-domexception@1.0.0: {} + node-fetch@2.6.7: dependencies: whatwg-url: 5.0.0 @@ -6701,6 +6779,10 @@ snapshots: web-namespaces@2.0.1: {} + web-streams-polyfill@3.3.3: {} + + web-streams-polyfill@4.0.0-beta.3: {} + webidl-conversions@3.0.1: {} webidl-conversions@4.0.2: {} diff --git a/test/test.ts b/test/test.ts index 71a6a36..91ea13f 100644 --- a/test/test.ts +++ b/test/test.ts @@ -18,6 +18,7 @@ tap.test('.listZones() -> should display an entire account', async (tools) => { tools.timeout(600000); const result = await testCloudflareAccount.convenience.listZones(); console.log(result); + await tools.delayFor(10000); }); tap.test( diff --git a/ts/cloudflare.classes.account.ts b/ts/cloudflare.classes.account.ts index cae2d23..4d6fef0 100644 --- a/ts/cloudflare.classes.account.ts +++ b/ts/cloudflare.classes.account.ts @@ -13,24 +13,17 @@ export class CloudflareAccount { public workerManager = new WorkerManager(this); public zoneManager = new ZoneManager(this); + public apiAccount: plugins.cloudflare.Cloudflare; + /** * constructor sets auth information on the CloudflareAccountInstance * @param optionsArg */ constructor(authTokenArg: string) { this.authToken = authTokenArg; - } - - /** - * gets you the account identifier - */ - public async getAccountIdentifier() { - if (!this.accountIdentifier) { - const route = `/accounts?page=1&per_page=20&direction=desc`; - const response: any = await this.request('GET', route); - this.accountIdentifier = response.result[0].id; - } - return this.accountIdentifier; + this.apiAccount = new plugins.cloudflare.Cloudflare({ + apiToken: this.authToken, + }); } public convenience = { @@ -59,7 +52,7 @@ export class CloudflareAccount { getRecord: async ( domainNameArg: string, typeArg: plugins.tsclass.network.TDnsRecordType - ): Promise => { + ): Promise => { const domain = new plugins.smartstring.Domain(domainNameArg); const recordArrayArg = await this.convenience.listRecords(domain.zoneName); const filteredResponse = recordArrayArg.filter((recordArg) => { @@ -77,18 +70,14 @@ export class CloudflareAccount { ttlArg = 1 ): Promise => { const domain = new plugins.smartstring.Domain(domainNameArg); - const domainIdArg = await this.convenience.getZoneId(domain.zoneName); - const dataObject = { + const zoneId = await this.convenience.getZoneId(domain.zoneName); + const response = await this.apiAccount.dns.records.create({ + zone_id: zoneId, + type: typeArg as any, name: domain.fullName, - type: typeArg, content: contentArg, ttl: ttlArg, - }; - const response = await this.request( - 'POST', - '/zones/' + domainIdArg + '/dns_records', - dataObject - ); + }) return response; }, /** @@ -101,20 +90,36 @@ export class CloudflareAccount { typeArg: plugins.tsclass.network.TDnsRecordType ): Promise => { const domain = new plugins.smartstring.Domain(domainNameArg); - const cflareRecord = await this.convenience.getRecord(domain.fullName, typeArg); - if (cflareRecord) { - const requestRoute: string = `/zones/${cflareRecord.zone_id}/dns_records/${cflareRecord.id}`; - return await this.request('DELETE', requestRoute); + const zoneId = await this.convenience.getZoneId(domain.zoneName); + const records = await this.convenience.listRecords(domain.zoneName); + const recordToDelete = records.find((recordArg) => { + return recordArg.name === domainNameArg && recordArg.type === typeArg; + }); + if (recordToDelete) { + await this.apiAccount.dns.records.delete(recordToDelete.id, { + zone_id: zoneId, + }); } else { - throw new Error(`could not remove record for ${domainNameArg} with type ${typeArg}`); + logger.log('warn', `record ${domainNameArg} of type ${typeArg} not found`); } }, + /** * cleanrecord allows the cleaning of any previous records to avoid unwanted sideeffects */ cleanRecord: async (domainNameArg: string, typeArg: plugins.tsclass.network.TDnsRecordType) => { console.log(`cleaning record for ${domainNameArg}`); + const records = await this.convenience.listRecords(domainNameArg); + const recordsToDelete = records.filter((recordArg) => { + return recordArg.type === typeArg; + }); + for (const recordToDelete of recordsToDelete) { + await this.apiAccount.dns.records.delete(recordToDelete.id, { + zone_id: recordToDelete.zone_id, + }); + } }, + /** * updates a record * @param domainNameArg @@ -133,45 +138,40 @@ export class CloudflareAccount { * list all records of a specified domain name * @param domainNameArg - the domain name that you want to get the records from */ - listRecords: async (domainNameArg: string): Promise => { + listRecords: async (domainNameArg: string) => { const domain = new plugins.smartstring.Domain(domainNameArg); - const domainId = await this.convenience.getZoneId(domain.zoneName); - const responseArg: any = await this.request( - 'GET', - '/zones/' + domainId + '/dns_records?per_page=100' - ); - const result: interfaces.ICflareRecord[] = responseArg.result; - return result; + const zoneId = await this.convenience.getZoneId(domain.zoneName); + const records: plugins.ICloudflareTypes['Record'][] = []; + for await (const record of this.apiAccount.dns.records.list({ + zone_id: zoneId, + })) { + records.push(record); + } + return records; }, /** * list all zones in the associated authenticated account * @param domainName */ - listZones: async (domainName?: string): Promise => { - // TODO: handle pagination - let requestRoute = `/zones?per_page=50`; - - // may be optionally filtered by domain name - if (domainName) { - requestRoute = `${requestRoute}&name=${domainName}`; + listZones: async (domainName?: string) => { + const zones: plugins.ICloudflareTypes['Zone'][] = []; + for await (const zone of this.apiAccount.zones.list()) { + zones.push(zone); } - - const response: any = await this.request('GET', requestRoute); - const result = response.result; - return result; + return zones; }, /** * purges a zone */ purgeZone: async (domainName: string): Promise => { const domain = new plugins.smartstring.Domain(domainName); - const domainId = await this.convenience.getZoneId(domain.zoneName); - const requestUrl = `/zones/${domainId}/purge_cache`; - const payload = { + const zoneId = await this.convenience.getZoneId(domain.zoneName); + await this.apiAccount.cache.purge({ + zone_id: zoneId, purge_everything: true, - }; - const respone = await this.request('DELETE', requestUrl, payload); + }); }, + // acme convenience functions acmeSetDnsChallenge: async (dnsChallenge: plugins.tsclass.network.IDnsChallenge) => { await this.convenience.cleanRecord(dnsChallenge.hostName, 'TXT'); @@ -186,105 +186,4 @@ export class CloudflareAccount { await this.convenience.removeRecord(dnsChallenge.hostName, 'TXT'); }, }; - - public async request( - methodArg: string, - routeArg: string, - dataArg: any = {}, - requestHeadersArg = {} - ): Promise { - const options: plugins.smartrequest.ISmartRequestOptions = { - method: methodArg, - headers: { - 'Content-Type': 'application/json', - Authorization: `Bearer ${this.authToken}`, - 'Content-Length': Buffer.byteLength(JSON.stringify(dataArg)), - ...requestHeadersArg, - }, - requestBody: dataArg, - }; - - // route analysis - const routeWithoutQuery = routeArg.split('?')[0]; - let queryParams: string[] = []; - if (routeArg.split('?').length > 1) { - queryParams = routeArg.split('?')[1].split('&'); - } - - // console.log(options); - - let retryCount = 0; // count the amount of retries - let pageCount = 1; - - const getQueryParams = () => { - let result = ''; - if (queryParams.length > 0) { - result += '?'; - } else { - return result; - } - - let isFirst = true; - for (const queryParam of queryParams) { - if (!isFirst) { - result += '&'; - } - isFirst = false; - const queryParamSerialized = queryParam.split('='); - if (queryParam === 'page') { - result += `page=${pageCount}`; - } else { - result += queryParam; - } - } - return result; - }; - - const makeRequest = async (): Promise => { - const requestUrl = `https://api.cloudflare.com/client/v4${routeWithoutQuery}${getQueryParams()}`; - const response = await plugins.smartrequest.request(requestUrl, options); - if (response.statusCode === 200) { - if (response.body.result_info) { - const rI = response.body.result_info; - if (rI.total_count / rI.per_page > pageCount) { - pageCount++; - const subresponse = await makeRequest(); - response.body.result = response.body.result.concat(subresponse.body.result); - return response; - } else { - return response; - } - } else { - return response; - } - } else if (response.statusCode === 429) { - console.log('rate limited! Waiting for retry!'); - return await retryRequest(); - } else if (response.statusCode === 400) { - console.log(`bad request for route ${requestUrl}!`); - console.log(response.body); - throw new Error(`request failed for ${requestUrl}`); - } else { - console.log(response.body); - throw new Error(`request failed for ${requestUrl} with status${response.statusCode}}`); - } - }; - - const retryRequest = async ( - delayTimeArg = Math.floor(Math.random() * (60000 - 8000) + 8000) - ) => { - console.log(`retry started and waiting for ${delayTimeArg} ms`); - await plugins.smartdelay.delayFor(delayTimeArg); - if (retryCount < 10) { - retryCount++; - return await makeRequest(); - } - }; - const response = await makeRequest(); - return response.body; - } - - private authCheck() { - return !!this.authToken; // check if auth is available - } } diff --git a/ts/cloudflare.classes.zone.ts b/ts/cloudflare.classes.zone.ts index a6528b2..7729ceb 100644 --- a/ts/cloudflare.classes.zone.ts +++ b/ts/cloudflare.classes.zone.ts @@ -1,50 +1,9 @@ import * as plugins from './cloudflare.plugins.js'; -import * as interfaces from './interfaces/index.js'; -export class CloudflareZone implements interfaces.ICflareZone { - public static createFromApiObject(apiObject: interfaces.ICflareZone) { +export class CloudflareZone { + public static createFromApiObject(apiObject: plugins.ICloudflareTypes['Zone']) { const cloudflareZone = new CloudflareZone(); Object.assign(cloudflareZone, apiObject); return cloudflareZone; } - - id: string; - name: string; - development_mode: number; - original_name_servers: string[]; - original_registrar: string; - original_dnshost: string; - created_on: string; - modified_on: string; - name_servers: string[]; - owner: { - id: string; - email: string; - owner_type: string; - }; - permissions: string[]; - plan: { - id: string; - name: string; - price: number; - currency: string; - frequency: string; - legacy_id: string; - is_subscribed: boolean; - can_subscribe: boolean; - }; - plan_pending: { - id: string; - name: string; - price: number; - currency: string; - frequency: string; - legacy_id: string; - is_subscribed: string; - can_subscribe: string; - }; - status: string; - paused: boolean; - type: string; - checked_on: string; } diff --git a/ts/cloudflare.plugins.ts b/ts/cloudflare.plugins.ts index 588f27b..de30a91 100644 --- a/ts/cloudflare.plugins.ts +++ b/ts/cloudflare.plugins.ts @@ -6,3 +6,15 @@ import * as smartstring from '@push.rocks/smartstring'; import * as tsclass from '@tsclass/tsclass'; export { smartlog, smartpromise, smartdelay, smartrequest, smartstring, tsclass }; + +// third party +import * as cloudflare from 'cloudflare'; +import type { Zone } from 'cloudflare/resources/zones/zones.js'; +import type { Record } from 'cloudflare/resources/dns/records.js'; + +export interface ICloudflareTypes { + Zone: Zone; + Record: Record; +} + +export { cloudflare }; diff --git a/ts/interfaces/cloudflare.api.record.ts b/ts/interfaces/cloudflare.api.record.ts deleted file mode 100644 index 786376f..0000000 --- a/ts/interfaces/cloudflare.api.record.ts +++ /dev/null @@ -1,15 +0,0 @@ -export interface ICflareRecord { - id: string; - type: string; - name: string; - content: string; - proxiable: boolean; - proxied: boolean; - ttl: number; - locked: boolean; - zone_id: string; - zone_name: string; - created_on: string; - modified_on: string; - data: any; -} diff --git a/ts/interfaces/cloudflare.api.zone.ts b/ts/interfaces/cloudflare.api.zone.ts deleted file mode 100644 index 052a317..0000000 --- a/ts/interfaces/cloudflare.api.zone.ts +++ /dev/null @@ -1,41 +0,0 @@ -export interface ICflareZone { - id: string; - name: string; - development_mode: number; - original_name_servers: string[]; - original_registrar: string; - original_dnshost: string; - created_on: string; - modified_on: string; - name_servers: string[]; - owner: { - id: string; - email: string; - owner_type: string; - }; - permissions: string[]; - plan: { - id: string; - name: string; - price: number; - currency: string; - frequency: string; - legacy_id: string; - is_subscribed: boolean; - can_subscribe: boolean; - }; - plan_pending: { - id: string; - name: string; - price: number; - currency: string; - frequency: string; - legacy_id: string; - is_subscribed: string; - can_subscribe: string; - }; - status: string; - paused: boolean; - type: string; - checked_on: string; -} diff --git a/ts/interfaces/index.ts b/ts/interfaces/index.ts index f48cd33..1c8a339 100644 --- a/ts/interfaces/index.ts +++ b/ts/interfaces/index.ts @@ -1,3 +1 @@ -export * from './cloudflare.api.record.js'; -export * from './cloudflare.api.zone.js'; export * from './cloudflare.api.workerroute.js';