@hasna/microservices 0.0.16 → 0.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +143 -23
- package/bin/index.js +711 -13998
- package/bin/mcp.js +228 -10987
- package/dist/index.js +166 -10056
- package/package.json +25 -25
- package/microservices/microservice-ads/package.json +0 -28
- package/microservices/microservice-ads/src/cli/index.ts +0 -605
- package/microservices/microservice-ads/src/db/campaigns.ts +0 -797
- package/microservices/microservice-ads/src/db/database.ts +0 -91
- package/microservices/microservice-ads/src/db/migrations.ts +0 -60
- package/microservices/microservice-ads/src/index.ts +0 -39
- package/microservices/microservice-ads/src/mcp/index.ts +0 -480
- package/microservices/microservice-analytics/package.json +0 -28
- package/microservices/microservice-analytics/src/cli/index.ts +0 -373
- package/microservices/microservice-analytics/src/db/analytics.ts +0 -564
- package/microservices/microservice-analytics/src/db/database.ts +0 -91
- package/microservices/microservice-analytics/src/db/migrations.ts +0 -50
- package/microservices/microservice-analytics/src/index.ts +0 -37
- package/microservices/microservice-analytics/src/mcp/index.ts +0 -334
- package/microservices/microservice-assets/package.json +0 -28
- package/microservices/microservice-assets/src/cli/index.ts +0 -375
- package/microservices/microservice-assets/src/db/assets.ts +0 -370
- package/microservices/microservice-assets/src/db/database.ts +0 -91
- package/microservices/microservice-assets/src/db/migrations.ts +0 -51
- package/microservices/microservice-assets/src/index.ts +0 -32
- package/microservices/microservice-assets/src/mcp/index.ts +0 -346
- package/microservices/microservice-bookkeeping/package.json +0 -28
- package/microservices/microservice-bookkeeping/src/cli/index.ts +0 -386
- package/microservices/microservice-bookkeeping/src/db/bookkeeping.ts +0 -591
- package/microservices/microservice-bookkeeping/src/db/database.ts +0 -91
- package/microservices/microservice-bookkeeping/src/db/migrations.ts +0 -52
- package/microservices/microservice-bookkeeping/src/index.ts +0 -32
- package/microservices/microservice-bookkeeping/src/mcp/index.ts +0 -284
- package/microservices/microservice-calendar/package.json +0 -28
- package/microservices/microservice-calendar/src/cli/index.ts +0 -287
- package/microservices/microservice-calendar/src/db/calendar.ts +0 -328
- package/microservices/microservice-calendar/src/db/database.ts +0 -91
- package/microservices/microservice-calendar/src/db/migrations.ts +0 -47
- package/microservices/microservice-calendar/src/index.ts +0 -24
- package/microservices/microservice-calendar/src/mcp/index.ts +0 -226
- package/microservices/microservice-company/package.json +0 -28
- package/microservices/microservice-company/src/cli/index.ts +0 -1126
- package/microservices/microservice-company/src/db/company.ts +0 -854
- package/microservices/microservice-company/src/db/database.ts +0 -91
- package/microservices/microservice-company/src/db/migrations.ts +0 -214
- package/microservices/microservice-company/src/db/workflow-migrations.ts +0 -44
- package/microservices/microservice-company/src/index.ts +0 -60
- package/microservices/microservice-company/src/lib/audit.ts +0 -168
- package/microservices/microservice-company/src/lib/finance.ts +0 -299
- package/microservices/microservice-company/src/lib/settings.ts +0 -85
- package/microservices/microservice-company/src/lib/workflows.ts +0 -698
- package/microservices/microservice-company/src/mcp/index.ts +0 -991
- package/microservices/microservice-compliance/package.json +0 -28
- package/microservices/microservice-compliance/src/cli/index.ts +0 -467
- package/microservices/microservice-compliance/src/db/compliance.ts +0 -633
- package/microservices/microservice-compliance/src/db/database.ts +0 -91
- package/microservices/microservice-compliance/src/db/migrations.ts +0 -63
- package/microservices/microservice-compliance/src/index.ts +0 -46
- package/microservices/microservice-compliance/src/mcp/index.ts +0 -438
- package/microservices/microservice-contacts/package.json +0 -28
- package/microservices/microservice-contacts/src/cli/index.ts +0 -393
- package/microservices/microservice-contacts/src/db/companies.ts +0 -167
- package/microservices/microservice-contacts/src/db/contacts.ts +0 -249
- package/microservices/microservice-contacts/src/db/database.ts +0 -91
- package/microservices/microservice-contacts/src/db/migrations.ts +0 -71
- package/microservices/microservice-contacts/src/db/relationships.ts +0 -53
- package/microservices/microservice-contacts/src/index.ts +0 -42
- package/microservices/microservice-contacts/src/mcp/index.ts +0 -303
- package/microservices/microservice-contracts/package.json +0 -28
- package/microservices/microservice-contracts/src/cli/index.ts +0 -770
- package/microservices/microservice-contracts/src/db/contracts.ts +0 -925
- package/microservices/microservice-contracts/src/db/database.ts +0 -91
- package/microservices/microservice-contracts/src/db/migrations.ts +0 -141
- package/microservices/microservice-contracts/src/index.ts +0 -43
- package/microservices/microservice-contracts/src/mcp/index.ts +0 -617
- package/microservices/microservice-crm/package.json +0 -28
- package/microservices/microservice-crm/src/cli/index.ts +0 -396
- package/microservices/microservice-crm/src/db/database.ts +0 -91
- package/microservices/microservice-crm/src/db/migrations.ts +0 -66
- package/microservices/microservice-crm/src/db/pipeline.ts +0 -397
- package/microservices/microservice-crm/src/index.ts +0 -34
- package/microservices/microservice-crm/src/mcp/index.ts +0 -294
- package/microservices/microservice-documents/package.json +0 -28
- package/microservices/microservice-documents/src/cli/index.ts +0 -246
- package/microservices/microservice-documents/src/db/database.ts +0 -91
- package/microservices/microservice-documents/src/db/documents.ts +0 -316
- package/microservices/microservice-documents/src/db/migrations.ts +0 -49
- package/microservices/microservice-documents/src/index.ts +0 -24
- package/microservices/microservice-documents/src/mcp/index.ts +0 -202
- package/microservices/microservice-domains/package.json +0 -28
- package/microservices/microservice-domains/src/cli/index.ts +0 -1111
- package/microservices/microservice-domains/src/db/database.ts +0 -91
- package/microservices/microservice-domains/src/db/domains.ts +0 -1164
- package/microservices/microservice-domains/src/db/migrations.ts +0 -60
- package/microservices/microservice-domains/src/index.ts +0 -65
- package/microservices/microservice-domains/src/lib/brandsight.ts +0 -350
- package/microservices/microservice-domains/src/lib/godaddy.ts +0 -338
- package/microservices/microservice-domains/src/lib/namecheap.ts +0 -262
- package/microservices/microservice-domains/src/lib/registrar.ts +0 -355
- package/microservices/microservice-domains/src/mcp/index.ts +0 -781
- package/microservices/microservice-expenses/package.json +0 -28
- package/microservices/microservice-expenses/src/cli/index.ts +0 -267
- package/microservices/microservice-expenses/src/db/database.ts +0 -91
- package/microservices/microservice-expenses/src/db/expenses.ts +0 -345
- package/microservices/microservice-expenses/src/db/migrations.ts +0 -45
- package/microservices/microservice-expenses/src/index.ts +0 -25
- package/microservices/microservice-expenses/src/mcp/index.ts +0 -196
- package/microservices/microservice-habits/package.json +0 -28
- package/microservices/microservice-habits/src/cli/index.ts +0 -315
- package/microservices/microservice-habits/src/db/database.ts +0 -91
- package/microservices/microservice-habits/src/db/habits.ts +0 -451
- package/microservices/microservice-habits/src/db/migrations.ts +0 -46
- package/microservices/microservice-habits/src/index.ts +0 -31
- package/microservices/microservice-habits/src/mcp/index.ts +0 -313
- package/microservices/microservice-health/package.json +0 -28
- package/microservices/microservice-health/src/cli/index.ts +0 -484
- package/microservices/microservice-health/src/db/database.ts +0 -91
- package/microservices/microservice-health/src/db/health.ts +0 -708
- package/microservices/microservice-health/src/db/migrations.ts +0 -70
- package/microservices/microservice-health/src/index.ts +0 -63
- package/microservices/microservice-health/src/mcp/index.ts +0 -437
- package/microservices/microservice-hiring/package.json +0 -28
- package/microservices/microservice-hiring/src/cli/index.ts +0 -741
- package/microservices/microservice-hiring/src/db/database.ts +0 -91
- package/microservices/microservice-hiring/src/db/hiring.ts +0 -1085
- package/microservices/microservice-hiring/src/db/migrations.ts +0 -89
- package/microservices/microservice-hiring/src/index.ts +0 -80
- package/microservices/microservice-hiring/src/lib/scoring.ts +0 -206
- package/microservices/microservice-hiring/src/mcp/index.ts +0 -709
- package/microservices/microservice-inventory/package.json +0 -28
- package/microservices/microservice-inventory/src/cli/index.ts +0 -365
- package/microservices/microservice-inventory/src/db/database.ts +0 -91
- package/microservices/microservice-inventory/src/db/inventory.ts +0 -393
- package/microservices/microservice-inventory/src/db/migrations.ts +0 -54
- package/microservices/microservice-inventory/src/index.ts +0 -28
- package/microservices/microservice-inventory/src/mcp/index.ts +0 -250
- package/microservices/microservice-invoices/dashboard/index.html +0 -12
- package/microservices/microservice-invoices/dashboard/package.json +0 -29
- package/microservices/microservice-invoices/dashboard/tsconfig.json +0 -14
- package/microservices/microservice-invoices/dashboard/vite.config.ts +0 -15
- package/microservices/microservice-invoices/package.json +0 -31
- package/microservices/microservice-invoices/src/cli/index.ts +0 -308
- package/microservices/microservice-invoices/src/db/business.ts +0 -241
- package/microservices/microservice-invoices/src/db/clients.ts +0 -127
- package/microservices/microservice-invoices/src/db/database.ts +0 -91
- package/microservices/microservice-invoices/src/db/invoices.ts +0 -345
- package/microservices/microservice-invoices/src/db/migrations.ts +0 -184
- package/microservices/microservice-invoices/src/index.ts +0 -56
- package/microservices/microservice-invoices/src/mcp/index.ts +0 -242
- package/microservices/microservice-invoices/src/server/index.ts +0 -162
- package/microservices/microservice-leads/package.json +0 -28
- package/microservices/microservice-leads/src/cli/index.ts +0 -596
- package/microservices/microservice-leads/src/db/database.ts +0 -91
- package/microservices/microservice-leads/src/db/leads.ts +0 -520
- package/microservices/microservice-leads/src/db/lists.ts +0 -151
- package/microservices/microservice-leads/src/db/migrations.ts +0 -93
- package/microservices/microservice-leads/src/index.ts +0 -65
- package/microservices/microservice-leads/src/lib/enrichment.ts +0 -202
- package/microservices/microservice-leads/src/lib/scoring.ts +0 -134
- package/microservices/microservice-leads/src/mcp/index.ts +0 -533
- package/microservices/microservice-notes/package.json +0 -28
- package/microservices/microservice-notes/src/cli/index.ts +0 -63
- package/microservices/microservice-notes/src/db/database.ts +0 -91
- package/microservices/microservice-notes/src/db/migrations.ts +0 -40
- package/microservices/microservice-notes/src/db/notes.ts +0 -114
- package/microservices/microservice-notes/src/index.ts +0 -2
- package/microservices/microservice-notes/src/mcp/index.ts +0 -37
- package/microservices/microservice-notifications/package.json +0 -28
- package/microservices/microservice-notifications/src/cli/index.ts +0 -349
- package/microservices/microservice-notifications/src/db/database.ts +0 -91
- package/microservices/microservice-notifications/src/db/migrations.ts +0 -62
- package/microservices/microservice-notifications/src/db/notifications.ts +0 -509
- package/microservices/microservice-notifications/src/index.ts +0 -41
- package/microservices/microservice-notifications/src/mcp/index.ts +0 -422
- package/microservices/microservice-payments/package.json +0 -28
- package/microservices/microservice-payments/src/cli/index.ts +0 -609
- package/microservices/microservice-payments/src/db/database.ts +0 -91
- package/microservices/microservice-payments/src/db/migrations.ts +0 -81
- package/microservices/microservice-payments/src/db/payments.ts +0 -1204
- package/microservices/microservice-payments/src/index.ts +0 -51
- package/microservices/microservice-payments/src/mcp/index.ts +0 -683
- package/microservices/microservice-payroll/package.json +0 -28
- package/microservices/microservice-payroll/src/cli/index.ts +0 -643
- package/microservices/microservice-payroll/src/db/database.ts +0 -91
- package/microservices/microservice-payroll/src/db/migrations.ts +0 -95
- package/microservices/microservice-payroll/src/db/payroll.ts +0 -1377
- package/microservices/microservice-payroll/src/index.ts +0 -48
- package/microservices/microservice-payroll/src/mcp/index.ts +0 -666
- package/microservices/microservice-products/package.json +0 -28
- package/microservices/microservice-products/src/cli/index.ts +0 -416
- package/microservices/microservice-products/src/db/categories.ts +0 -154
- package/microservices/microservice-products/src/db/database.ts +0 -91
- package/microservices/microservice-products/src/db/migrations.ts +0 -58
- package/microservices/microservice-products/src/db/pricing-tiers.ts +0 -66
- package/microservices/microservice-products/src/db/products.ts +0 -452
- package/microservices/microservice-products/src/index.ts +0 -53
- package/microservices/microservice-products/src/mcp/index.ts +0 -453
- package/microservices/microservice-projects/package.json +0 -28
- package/microservices/microservice-projects/src/cli/index.ts +0 -480
- package/microservices/microservice-projects/src/db/database.ts +0 -91
- package/microservices/microservice-projects/src/db/migrations.ts +0 -65
- package/microservices/microservice-projects/src/db/projects.ts +0 -715
- package/microservices/microservice-projects/src/index.ts +0 -57
- package/microservices/microservice-projects/src/mcp/index.ts +0 -501
- package/microservices/microservice-proposals/package.json +0 -28
- package/microservices/microservice-proposals/src/cli/index.ts +0 -400
- package/microservices/microservice-proposals/src/db/database.ts +0 -91
- package/microservices/microservice-proposals/src/db/migrations.ts +0 -52
- package/microservices/microservice-proposals/src/db/proposals.ts +0 -532
- package/microservices/microservice-proposals/src/index.ts +0 -37
- package/microservices/microservice-proposals/src/mcp/index.ts +0 -375
- package/microservices/microservice-reading/package.json +0 -28
- package/microservices/microservice-reading/src/cli/index.ts +0 -464
- package/microservices/microservice-reading/src/db/database.ts +0 -91
- package/microservices/microservice-reading/src/db/migrations.ts +0 -59
- package/microservices/microservice-reading/src/db/reading.ts +0 -524
- package/microservices/microservice-reading/src/index.ts +0 -51
- package/microservices/microservice-reading/src/mcp/index.ts +0 -368
- package/microservices/microservice-shipping/package.json +0 -28
- package/microservices/microservice-shipping/src/cli/index.ts +0 -606
- package/microservices/microservice-shipping/src/db/database.ts +0 -91
- package/microservices/microservice-shipping/src/db/migrations.ts +0 -69
- package/microservices/microservice-shipping/src/db/shipping.ts +0 -1093
- package/microservices/microservice-shipping/src/index.ts +0 -53
- package/microservices/microservice-shipping/src/mcp/index.ts +0 -533
- package/microservices/microservice-social/package.json +0 -29
- package/microservices/microservice-social/src/cli/index.ts +0 -1583
- package/microservices/microservice-social/src/db/database.ts +0 -91
- package/microservices/microservice-social/src/db/migrations.ts +0 -160
- package/microservices/microservice-social/src/db/social.ts +0 -1076
- package/microservices/microservice-social/src/index.ts +0 -46
- package/microservices/microservice-social/src/lib/audience.ts +0 -353
- package/microservices/microservice-social/src/lib/content-ai.ts +0 -278
- package/microservices/microservice-social/src/lib/media.ts +0 -311
- package/microservices/microservice-social/src/lib/mentions.ts +0 -434
- package/microservices/microservice-social/src/lib/metrics-sync.ts +0 -264
- package/microservices/microservice-social/src/lib/publisher.ts +0 -377
- package/microservices/microservice-social/src/lib/scheduler.ts +0 -229
- package/microservices/microservice-social/src/lib/sentiment.ts +0 -256
- package/microservices/microservice-social/src/lib/threads.ts +0 -291
- package/microservices/microservice-social/src/mcp/index.ts +0 -1425
- package/microservices/microservice-social/src/server/index.ts +0 -441
- package/microservices/microservice-subscriptions/package.json +0 -28
- package/microservices/microservice-subscriptions/src/cli/index.ts +0 -715
- package/microservices/microservice-subscriptions/src/db/database.ts +0 -91
- package/microservices/microservice-subscriptions/src/db/migrations.ts +0 -125
- package/microservices/microservice-subscriptions/src/db/subscriptions.ts +0 -1256
- package/microservices/microservice-subscriptions/src/index.ts +0 -41
- package/microservices/microservice-subscriptions/src/mcp/index.ts +0 -631
- package/microservices/microservice-timesheets/package.json +0 -28
- package/microservices/microservice-timesheets/src/cli/index.ts +0 -373
- package/microservices/microservice-timesheets/src/db/database.ts +0 -91
- package/microservices/microservice-timesheets/src/db/locale.ts +0 -217
- package/microservices/microservice-timesheets/src/db/migrations.ts +0 -74
- package/microservices/microservice-timesheets/src/db/timesheets.ts +0 -447
- package/microservices/microservice-timesheets/src/index.ts +0 -44
- package/microservices/microservice-timesheets/src/mcp/index.ts +0 -269
- package/microservices/microservice-transcriber/package.json +0 -29
- package/microservices/microservice-transcriber/src/cli/index.ts +0 -1593
- package/microservices/microservice-transcriber/src/db/annotations.ts +0 -37
- package/microservices/microservice-transcriber/src/db/comments.ts +0 -166
- package/microservices/microservice-transcriber/src/db/database.ts +0 -91
- package/microservices/microservice-transcriber/src/db/migrations.ts +0 -118
- package/microservices/microservice-transcriber/src/db/proofread.ts +0 -119
- package/microservices/microservice-transcriber/src/db/transcripts.ts +0 -395
- package/microservices/microservice-transcriber/src/index.ts +0 -43
- package/microservices/microservice-transcriber/src/lib/config.ts +0 -77
- package/microservices/microservice-transcriber/src/lib/diff.ts +0 -91
- package/microservices/microservice-transcriber/src/lib/downloader.ts +0 -638
- package/microservices/microservice-transcriber/src/lib/feeds.ts +0 -62
- package/microservices/microservice-transcriber/src/lib/live.ts +0 -94
- package/microservices/microservice-transcriber/src/lib/notion.ts +0 -129
- package/microservices/microservice-transcriber/src/lib/proofread.ts +0 -296
- package/microservices/microservice-transcriber/src/lib/providers.ts +0 -713
- package/microservices/microservice-transcriber/src/lib/summarizer.ts +0 -147
- package/microservices/microservice-transcriber/src/lib/translator.ts +0 -75
- package/microservices/microservice-transcriber/src/lib/webhook.ts +0 -37
- package/microservices/microservice-transcriber/src/mcp/index.ts +0 -1330
- package/microservices/microservice-transcriber/src/server/index.ts +0 -199
- package/microservices/microservice-travel/package.json +0 -28
- package/microservices/microservice-travel/src/cli/index.ts +0 -505
- package/microservices/microservice-travel/src/db/database.ts +0 -91
- package/microservices/microservice-travel/src/db/migrations.ts +0 -77
- package/microservices/microservice-travel/src/db/travel.ts +0 -802
- package/microservices/microservice-travel/src/index.ts +0 -60
- package/microservices/microservice-travel/src/mcp/index.ts +0 -495
- package/microservices/microservice-wiki/package.json +0 -28
- package/microservices/microservice-wiki/src/cli/index.ts +0 -345
- package/microservices/microservice-wiki/src/db/database.ts +0 -91
- package/microservices/microservice-wiki/src/db/migrations.ts +0 -55
- package/microservices/microservice-wiki/src/db/wiki.ts +0 -395
- package/microservices/microservice-wiki/src/index.ts +0 -32
- package/microservices/microservice-wiki/src/mcp/index.ts +0 -344
|
@@ -1,338 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GoDaddy API integration for microservice-domains
|
|
3
|
-
*
|
|
4
|
-
* Uses the Connector SDK pattern from connect-godaddy.
|
|
5
|
-
* When @hasna/connect-godaddy is published to npm, replace the
|
|
6
|
-
* relative connector import with the package import.
|
|
7
|
-
*
|
|
8
|
-
* Environment variables:
|
|
9
|
-
* GODADDY_API_KEY — GoDaddy API key
|
|
10
|
-
* GODADDY_API_SECRET — GoDaddy API secret
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import type {
|
|
14
|
-
CreateDomainInput,
|
|
15
|
-
UpdateDomainInput,
|
|
16
|
-
Domain,
|
|
17
|
-
} from "../db/domains.js";
|
|
18
|
-
|
|
19
|
-
// Re-export types used by consumers
|
|
20
|
-
export type {
|
|
21
|
-
GoDaddyDomain,
|
|
22
|
-
GoDaddyDomainDetail,
|
|
23
|
-
GoDaddyDnsRecord,
|
|
24
|
-
GoDaddyAvailability,
|
|
25
|
-
GoDaddyRenewResponse,
|
|
26
|
-
} from "../../../../../open-connectors/connectors/connect-godaddy/src/index.js";
|
|
27
|
-
|
|
28
|
-
import {
|
|
29
|
-
GoDaddy,
|
|
30
|
-
GoDaddyApiError,
|
|
31
|
-
type GoDaddyDomain,
|
|
32
|
-
type GoDaddyDomainDetail,
|
|
33
|
-
type GoDaddyDnsRecord,
|
|
34
|
-
type GoDaddyAvailability,
|
|
35
|
-
type GoDaddyConfig,
|
|
36
|
-
} from "../../../../../open-connectors/connectors/connect-godaddy/src/index.js";
|
|
37
|
-
|
|
38
|
-
export { GoDaddyApiError };
|
|
39
|
-
|
|
40
|
-
// ============================================================
|
|
41
|
-
// Sync Result Type (microservice-specific)
|
|
42
|
-
// ============================================================
|
|
43
|
-
|
|
44
|
-
export interface GoDaddySyncResult {
|
|
45
|
-
synced: number;
|
|
46
|
-
created: number;
|
|
47
|
-
updated: number;
|
|
48
|
-
errors: string[];
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// ============================================================
|
|
52
|
-
// Internal fetch override (allows test injection)
|
|
53
|
-
// ============================================================
|
|
54
|
-
|
|
55
|
-
type FetchFn = typeof globalThis.fetch;
|
|
56
|
-
|
|
57
|
-
let _overriddenFetch: FetchFn | null = null;
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Override the fetch implementation (for testing).
|
|
61
|
-
* Pass `null` to restore the default.
|
|
62
|
-
*/
|
|
63
|
-
export function _setFetch(fn: FetchFn | null): void {
|
|
64
|
-
_overriddenFetch = fn;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// ============================================================
|
|
68
|
-
// Connector Instance Management
|
|
69
|
-
// ============================================================
|
|
70
|
-
|
|
71
|
-
function createConnector(): GoDaddy {
|
|
72
|
-
// Use fromEnv() which reads GODADDY_API_KEY and GODADDY_API_SECRET
|
|
73
|
-
return GoDaddy.fromEnv();
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// ============================================================
|
|
77
|
-
// API Functions (thin wrappers around connector)
|
|
78
|
-
// ============================================================
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* List all domains in the GoDaddy account.
|
|
82
|
-
*/
|
|
83
|
-
export async function listGoDaddyDomains(): Promise<GoDaddyDomain[]> {
|
|
84
|
-
if (_overriddenFetch) {
|
|
85
|
-
return _legacyApiRequest<GoDaddyDomain[]>("GET", "/v1/domains");
|
|
86
|
-
}
|
|
87
|
-
const connector = createConnector();
|
|
88
|
-
return connector.domains.list();
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Get detailed info for a single domain.
|
|
93
|
-
*/
|
|
94
|
-
export async function getDomainInfo(
|
|
95
|
-
domain: string
|
|
96
|
-
): Promise<GoDaddyDomainDetail> {
|
|
97
|
-
if (_overriddenFetch) {
|
|
98
|
-
return _legacyApiRequest<GoDaddyDomainDetail>(
|
|
99
|
-
"GET",
|
|
100
|
-
`/v1/domains/${encodeURIComponent(domain)}`
|
|
101
|
-
);
|
|
102
|
-
}
|
|
103
|
-
const connector = createConnector();
|
|
104
|
-
return connector.domains.getInfo(domain);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Renew a domain for 1 year.
|
|
109
|
-
*/
|
|
110
|
-
export async function renewDomain(
|
|
111
|
-
domain: string
|
|
112
|
-
): Promise<{ orderId: number; itemCount: number; total: number }> {
|
|
113
|
-
if (_overriddenFetch) {
|
|
114
|
-
return _legacyApiRequest(
|
|
115
|
-
"POST",
|
|
116
|
-
`/v1/domains/${encodeURIComponent(domain)}/renew`,
|
|
117
|
-
{ period: 1 }
|
|
118
|
-
);
|
|
119
|
-
}
|
|
120
|
-
const connector = createConnector();
|
|
121
|
-
return connector.domains.renew(domain);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Get DNS records for a domain, optionally filtered by type.
|
|
126
|
-
*/
|
|
127
|
-
export async function getDnsRecords(
|
|
128
|
-
domain: string,
|
|
129
|
-
type?: string
|
|
130
|
-
): Promise<GoDaddyDnsRecord[]> {
|
|
131
|
-
if (_overriddenFetch) {
|
|
132
|
-
const path = type
|
|
133
|
-
? `/v1/domains/${encodeURIComponent(domain)}/records/${encodeURIComponent(type)}`
|
|
134
|
-
: `/v1/domains/${encodeURIComponent(domain)}/records`;
|
|
135
|
-
return _legacyApiRequest<GoDaddyDnsRecord[]>("GET", path);
|
|
136
|
-
}
|
|
137
|
-
const connector = createConnector();
|
|
138
|
-
return type
|
|
139
|
-
? connector.dns.getRecords(domain, type)
|
|
140
|
-
: connector.dns.getRecords(domain);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* Replace all DNS records for a domain.
|
|
145
|
-
*/
|
|
146
|
-
export async function setDnsRecords(
|
|
147
|
-
domain: string,
|
|
148
|
-
records: GoDaddyDnsRecord[]
|
|
149
|
-
): Promise<void> {
|
|
150
|
-
if (_overriddenFetch) {
|
|
151
|
-
await _legacyApiRequest<void>(
|
|
152
|
-
"PUT",
|
|
153
|
-
`/v1/domains/${encodeURIComponent(domain)}/records`,
|
|
154
|
-
records
|
|
155
|
-
);
|
|
156
|
-
return;
|
|
157
|
-
}
|
|
158
|
-
const connector = createConnector();
|
|
159
|
-
await connector.dns.replaceAllRecords(domain, records);
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* Check domain availability for purchase.
|
|
164
|
-
*/
|
|
165
|
-
export async function checkAvailability(
|
|
166
|
-
domain: string
|
|
167
|
-
): Promise<GoDaddyAvailability> {
|
|
168
|
-
if (_overriddenFetch) {
|
|
169
|
-
return _legacyApiRequest<GoDaddyAvailability>(
|
|
170
|
-
"GET",
|
|
171
|
-
`/v1/domains/available?domain=${encodeURIComponent(domain)}`
|
|
172
|
-
);
|
|
173
|
-
}
|
|
174
|
-
const connector = createConnector();
|
|
175
|
-
return connector.domains.checkAvailability(domain);
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
// ============================================================
|
|
179
|
-
// Legacy fetch helper (for test injection compatibility)
|
|
180
|
-
// ============================================================
|
|
181
|
-
|
|
182
|
-
const GODADDY_API_BASE = "https://api.godaddy.com";
|
|
183
|
-
|
|
184
|
-
function _getCredentials(): { key: string; secret: string } {
|
|
185
|
-
const key = process.env["GODADDY_API_KEY"];
|
|
186
|
-
const secret = process.env["GODADDY_API_SECRET"];
|
|
187
|
-
|
|
188
|
-
if (!key || !secret) {
|
|
189
|
-
throw new Error(
|
|
190
|
-
"GoDaddy API credentials not configured. Set GODADDY_API_KEY and GODADDY_API_SECRET environment variables."
|
|
191
|
-
);
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
return { key, secret };
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
function _getHeaders(): Record<string, string> {
|
|
198
|
-
const { key, secret } = _getCredentials();
|
|
199
|
-
return {
|
|
200
|
-
Authorization: `sso-key ${key}:${secret}`,
|
|
201
|
-
"Content-Type": "application/json",
|
|
202
|
-
Accept: "application/json",
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
async function _legacyApiRequest<T>(
|
|
207
|
-
method: string,
|
|
208
|
-
path: string,
|
|
209
|
-
body?: unknown
|
|
210
|
-
): Promise<T> {
|
|
211
|
-
const fetchFn = _overriddenFetch || globalThis.fetch;
|
|
212
|
-
const url = `${GODADDY_API_BASE}${path}`;
|
|
213
|
-
const headers = _getHeaders();
|
|
214
|
-
|
|
215
|
-
const options: RequestInit = { method, headers };
|
|
216
|
-
if (body !== undefined) {
|
|
217
|
-
options.body = JSON.stringify(body);
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
const response = await fetchFn(url, options);
|
|
221
|
-
|
|
222
|
-
if (!response.ok) {
|
|
223
|
-
const text = await response.text();
|
|
224
|
-
throw new GoDaddyApiError(
|
|
225
|
-
`GoDaddy API ${method} ${path} failed with status ${response.status}: ${text}`,
|
|
226
|
-
response.status,
|
|
227
|
-
{ responseBody: text }
|
|
228
|
-
);
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
// Some endpoints return 204 No Content
|
|
232
|
-
if (response.status === 204) {
|
|
233
|
-
return undefined as unknown as T;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
return (await response.json()) as T;
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
// ============================================================
|
|
240
|
-
// Sync to Local DB (microservice business logic)
|
|
241
|
-
// ============================================================
|
|
242
|
-
|
|
243
|
-
/**
|
|
244
|
-
* Maps GoDaddy status strings to local domain statuses.
|
|
245
|
-
*/
|
|
246
|
-
function mapGoDaddyStatus(
|
|
247
|
-
gdStatus: string
|
|
248
|
-
): "active" | "expired" | "transferring" | "redemption" {
|
|
249
|
-
const s = gdStatus.toUpperCase();
|
|
250
|
-
if (s === "ACTIVE") return "active";
|
|
251
|
-
if (s === "EXPIRED") return "expired";
|
|
252
|
-
if (
|
|
253
|
-
s === "TRANSFERRED_OUT" ||
|
|
254
|
-
s === "TRANSFERRING" ||
|
|
255
|
-
s === "PENDING_TRANSFER"
|
|
256
|
-
)
|
|
257
|
-
return "transferring";
|
|
258
|
-
if (s === "REDEMPTION" || s === "PENDING_REDEMPTION") return "redemption";
|
|
259
|
-
return "active";
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
/**
|
|
263
|
-
* Sync all GoDaddy domains into the local database.
|
|
264
|
-
*
|
|
265
|
-
* Accepts DB helpers so the caller can inject the actual CRUD functions.
|
|
266
|
-
*/
|
|
267
|
-
export async function syncToLocalDb(dbFns: {
|
|
268
|
-
getDomainByName: (name: string) => Domain | null;
|
|
269
|
-
createDomain: (input: CreateDomainInput) => Domain;
|
|
270
|
-
updateDomain: (id: string, input: UpdateDomainInput) => Domain | null;
|
|
271
|
-
}): Promise<GoDaddySyncResult> {
|
|
272
|
-
const result: GoDaddySyncResult = {
|
|
273
|
-
synced: 0,
|
|
274
|
-
created: 0,
|
|
275
|
-
updated: 0,
|
|
276
|
-
errors: [],
|
|
277
|
-
};
|
|
278
|
-
|
|
279
|
-
let gdDomains: GoDaddyDomain[];
|
|
280
|
-
try {
|
|
281
|
-
gdDomains = await listGoDaddyDomains();
|
|
282
|
-
} catch (err) {
|
|
283
|
-
result.errors.push(
|
|
284
|
-
`Failed to list domains: ${err instanceof Error ? err.message : String(err)}`
|
|
285
|
-
);
|
|
286
|
-
return result;
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
for (const gd of gdDomains) {
|
|
290
|
-
try {
|
|
291
|
-
// Fetch full detail for each domain via connector
|
|
292
|
-
let detail: GoDaddyDomainDetail;
|
|
293
|
-
try {
|
|
294
|
-
detail = await getDomainInfo(gd.domain);
|
|
295
|
-
} catch {
|
|
296
|
-
// Fall back to list-level data if detail fetch fails
|
|
297
|
-
detail = gd as GoDaddyDomainDetail;
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
const existing = dbFns.getDomainByName(gd.domain);
|
|
301
|
-
|
|
302
|
-
const domainData = {
|
|
303
|
-
name: gd.domain,
|
|
304
|
-
registrar: "GoDaddy",
|
|
305
|
-
status: mapGoDaddyStatus(gd.status),
|
|
306
|
-
expires_at: gd.expires
|
|
307
|
-
? new Date(gd.expires).toISOString()
|
|
308
|
-
: undefined,
|
|
309
|
-
auto_renew: gd.renewAuto,
|
|
310
|
-
nameservers: gd.nameServers || [],
|
|
311
|
-
registered_at: detail.createdAt
|
|
312
|
-
? new Date(detail.createdAt).toISOString()
|
|
313
|
-
: undefined,
|
|
314
|
-
metadata: {
|
|
315
|
-
godaddy_domain_id: (detail as GoDaddyDomainDetail).domainId,
|
|
316
|
-
provider: "godaddy",
|
|
317
|
-
locked: (detail as GoDaddyDomainDetail).locked,
|
|
318
|
-
privacy: (detail as GoDaddyDomainDetail).privacy,
|
|
319
|
-
},
|
|
320
|
-
};
|
|
321
|
-
|
|
322
|
-
if (existing) {
|
|
323
|
-
dbFns.updateDomain(existing.id, domainData);
|
|
324
|
-
result.updated++;
|
|
325
|
-
} else {
|
|
326
|
-
dbFns.createDomain(domainData);
|
|
327
|
-
result.created++;
|
|
328
|
-
}
|
|
329
|
-
result.synced++;
|
|
330
|
-
} catch (err) {
|
|
331
|
-
result.errors.push(
|
|
332
|
-
`Failed to sync ${gd.domain}: ${err instanceof Error ? err.message : String(err)}`
|
|
333
|
-
);
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
return result;
|
|
338
|
-
}
|
|
@@ -1,262 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Namecheap API integration for domain management
|
|
3
|
-
*
|
|
4
|
-
* Uses the Connector SDK pattern from connect-namecheap.
|
|
5
|
-
* When @hasna/connect-namecheap is published to npm, replace the
|
|
6
|
-
* relative connector import with the package import.
|
|
7
|
-
*
|
|
8
|
-
* Requires environment variables:
|
|
9
|
-
* NAMECHEAP_API_KEY — API key from Namecheap
|
|
10
|
-
* NAMECHEAP_USERNAME — Namecheap account username
|
|
11
|
-
* NAMECHEAP_CLIENT_IP — Whitelisted client IP address
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
// Re-export types used by consumers (CLI, MCP, registrar)
|
|
15
|
-
export type {
|
|
16
|
-
ConnectorConfig as NamecheapConfig,
|
|
17
|
-
Domain as NamecheapDomain,
|
|
18
|
-
DomainInfo as NamecheapDomainInfo,
|
|
19
|
-
DnsRecord as NamecheapDnsRecord,
|
|
20
|
-
AvailabilityResult as NamecheapAvailability,
|
|
21
|
-
RenewResult as NamecheapRenewResult,
|
|
22
|
-
} from "../../../../../open-connectors/connectors/connect-namecheap/src/index.js";
|
|
23
|
-
|
|
24
|
-
import {
|
|
25
|
-
Connector,
|
|
26
|
-
type ConnectorConfig,
|
|
27
|
-
type Domain as NamecheapDomain,
|
|
28
|
-
type DomainInfo as NamecheapDomainInfo,
|
|
29
|
-
type DnsRecord as NamecheapDnsRecord,
|
|
30
|
-
} from "../../../../../open-connectors/connectors/connect-namecheap/src/index.js";
|
|
31
|
-
|
|
32
|
-
// ============================================================
|
|
33
|
-
// Sync Result Type (microservice-specific, not in connector)
|
|
34
|
-
// ============================================================
|
|
35
|
-
|
|
36
|
-
export interface NamecheapSyncResult {
|
|
37
|
-
synced: number;
|
|
38
|
-
errors: string[];
|
|
39
|
-
domains: string[];
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// ============================================================
|
|
43
|
-
// Connector Instance Management
|
|
44
|
-
// ============================================================
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Create a Namecheap connector from environment variables.
|
|
48
|
-
* Wraps Connector.fromEnv() with the same env var validation.
|
|
49
|
-
*/
|
|
50
|
-
export function getConfig(): ConnectorConfig {
|
|
51
|
-
const apiKey = process.env["NAMECHEAP_API_KEY"];
|
|
52
|
-
const username = process.env["NAMECHEAP_USERNAME"];
|
|
53
|
-
const clientIp = process.env["NAMECHEAP_CLIENT_IP"];
|
|
54
|
-
|
|
55
|
-
if (!apiKey) throw new Error("NAMECHEAP_API_KEY environment variable is not set");
|
|
56
|
-
if (!username) throw new Error("NAMECHEAP_USERNAME environment variable is not set");
|
|
57
|
-
if (!clientIp) throw new Error("NAMECHEAP_CLIENT_IP environment variable is not set");
|
|
58
|
-
|
|
59
|
-
return {
|
|
60
|
-
apiKey,
|
|
61
|
-
username,
|
|
62
|
-
clientIp,
|
|
63
|
-
sandbox: process.env["NAMECHEAP_SANDBOX"] === "true",
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function createConnector(config?: ConnectorConfig): Connector {
|
|
68
|
-
return new Connector(config || getConfig());
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// ============================================================
|
|
72
|
-
// API Functions (thin wrappers around connector)
|
|
73
|
-
// ============================================================
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* List all domains in the Namecheap account
|
|
77
|
-
*/
|
|
78
|
-
export async function listNamecheapDomains(config?: ConnectorConfig): Promise<NamecheapDomain[]> {
|
|
79
|
-
const connector = createConnector(config);
|
|
80
|
-
return connector.domains.list();
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Get detailed info for a specific domain
|
|
85
|
-
*/
|
|
86
|
-
export async function getDomainInfo(domain: string, config?: ConnectorConfig): Promise<NamecheapDomainInfo> {
|
|
87
|
-
const connector = createConnector(config);
|
|
88
|
-
return connector.domains.getInfo(domain);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Renew a domain
|
|
93
|
-
*/
|
|
94
|
-
export async function renewDomain(domain: string, years: number = 1, config?: ConnectorConfig) {
|
|
95
|
-
const connector = createConnector(config);
|
|
96
|
-
return connector.domains.renew(domain, years);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Get DNS host records for a domain
|
|
101
|
-
*/
|
|
102
|
-
export async function getDnsRecords(domain: string, sld: string, tld: string, config?: ConnectorConfig): Promise<NamecheapDnsRecord[]> {
|
|
103
|
-
const connector = createConnector(config);
|
|
104
|
-
return connector.dns.getHosts(sld, tld);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Set DNS host records for a domain
|
|
109
|
-
*/
|
|
110
|
-
export async function setDnsRecords(
|
|
111
|
-
domain: string,
|
|
112
|
-
sld: string,
|
|
113
|
-
tld: string,
|
|
114
|
-
records: NamecheapDnsRecord[],
|
|
115
|
-
config?: ConnectorConfig
|
|
116
|
-
): Promise<boolean> {
|
|
117
|
-
const connector = createConnector(config);
|
|
118
|
-
return connector.dns.setHosts(sld, tld, records);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Check domain availability
|
|
123
|
-
*/
|
|
124
|
-
export async function checkAvailability(domain: string, config?: ConnectorConfig) {
|
|
125
|
-
const connector = createConnector(config);
|
|
126
|
-
return connector.domains.check(domain);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
// ============================================================
|
|
130
|
-
// Domain Helpers (microservice-specific)
|
|
131
|
-
// ============================================================
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Split a domain name into SLD (second-level domain) and TLD (top-level domain)
|
|
135
|
-
*/
|
|
136
|
-
export function splitDomain(domain: string): { sld: string; tld: string } {
|
|
137
|
-
const parts = domain.split(".");
|
|
138
|
-
if (parts.length < 2) {
|
|
139
|
-
throw new Error(`Invalid domain: ${domain}`);
|
|
140
|
-
}
|
|
141
|
-
// Handle multi-part TLDs like .co.uk
|
|
142
|
-
if (parts.length >= 3 && ["co", "com", "org", "net", "ac", "gov"].includes(parts[parts.length - 2])) {
|
|
143
|
-
return {
|
|
144
|
-
sld: parts.slice(0, -2).join("."),
|
|
145
|
-
tld: parts.slice(-2).join("."),
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
return {
|
|
149
|
-
sld: parts.slice(0, -1).join("."),
|
|
150
|
-
tld: parts[parts.length - 1],
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// ============================================================
|
|
155
|
-
// Sync to Local DB (microservice business logic)
|
|
156
|
-
// ============================================================
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* Sync domains from Namecheap to local database
|
|
160
|
-
* Calls listDomains + getDomainInfo for each, upserts into local domains table
|
|
161
|
-
*/
|
|
162
|
-
export async function syncToLocalDb(dbFunctions: {
|
|
163
|
-
getDomainByName: (name: string) => { id: string } | null;
|
|
164
|
-
createDomain: (input: {
|
|
165
|
-
name: string;
|
|
166
|
-
registrar?: string;
|
|
167
|
-
status?: string;
|
|
168
|
-
registered_at?: string;
|
|
169
|
-
expires_at?: string;
|
|
170
|
-
auto_renew?: boolean;
|
|
171
|
-
nameservers?: string[];
|
|
172
|
-
}) => { id: string; name: string };
|
|
173
|
-
updateDomain: (
|
|
174
|
-
id: string,
|
|
175
|
-
input: {
|
|
176
|
-
registrar?: string;
|
|
177
|
-
status?: string;
|
|
178
|
-
registered_at?: string;
|
|
179
|
-
expires_at?: string;
|
|
180
|
-
auto_renew?: boolean;
|
|
181
|
-
nameservers?: string[];
|
|
182
|
-
}
|
|
183
|
-
) => unknown;
|
|
184
|
-
}, config?: ConnectorConfig): Promise<NamecheapSyncResult> {
|
|
185
|
-
const connector = createConnector(config);
|
|
186
|
-
const result: NamecheapSyncResult = { synced: 0, errors: [], domains: [] };
|
|
187
|
-
|
|
188
|
-
let ncDomains: NamecheapDomain[];
|
|
189
|
-
try {
|
|
190
|
-
ncDomains = await connector.domains.list();
|
|
191
|
-
} catch (error) {
|
|
192
|
-
throw new Error(`Failed to list Namecheap domains: ${error instanceof Error ? error.message : String(error)}`);
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
for (const ncDomain of ncDomains) {
|
|
196
|
-
try {
|
|
197
|
-
// Get detailed info via connector
|
|
198
|
-
let info: NamecheapDomainInfo;
|
|
199
|
-
try {
|
|
200
|
-
info = await connector.domains.getInfo(ncDomain.domain);
|
|
201
|
-
} catch {
|
|
202
|
-
// Fall back to basic info if getInfo fails
|
|
203
|
-
info = {
|
|
204
|
-
domain: ncDomain.domain,
|
|
205
|
-
registrar: "Namecheap",
|
|
206
|
-
created: "",
|
|
207
|
-
expires: ncDomain.expiry,
|
|
208
|
-
nameservers: [],
|
|
209
|
-
};
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
// Normalize dates to ISO format
|
|
213
|
-
const expiresAt = normalizeDate(info.expires || ncDomain.expiry);
|
|
214
|
-
const createdAt = normalizeDate(info.created);
|
|
215
|
-
|
|
216
|
-
// Upsert into local DB
|
|
217
|
-
const existing = dbFunctions.getDomainByName(ncDomain.domain);
|
|
218
|
-
if (existing) {
|
|
219
|
-
dbFunctions.updateDomain(existing.id, {
|
|
220
|
-
registrar: "Namecheap",
|
|
221
|
-
status: "active",
|
|
222
|
-
registered_at: createdAt || undefined,
|
|
223
|
-
expires_at: expiresAt || undefined,
|
|
224
|
-
auto_renew: ncDomain.autoRenew,
|
|
225
|
-
nameservers: info.nameservers.length > 0 ? info.nameservers : undefined,
|
|
226
|
-
});
|
|
227
|
-
} else {
|
|
228
|
-
dbFunctions.createDomain({
|
|
229
|
-
name: ncDomain.domain,
|
|
230
|
-
registrar: "Namecheap",
|
|
231
|
-
status: "active",
|
|
232
|
-
registered_at: createdAt || undefined,
|
|
233
|
-
expires_at: expiresAt || undefined,
|
|
234
|
-
auto_renew: ncDomain.autoRenew,
|
|
235
|
-
nameservers: info.nameservers,
|
|
236
|
-
});
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
result.synced++;
|
|
240
|
-
result.domains.push(ncDomain.domain);
|
|
241
|
-
} catch (error) {
|
|
242
|
-
result.errors.push(`${ncDomain.domain}: ${error instanceof Error ? error.message : String(error)}`);
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
return result;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
// ============================================================
|
|
250
|
-
// Helpers
|
|
251
|
-
// ============================================================
|
|
252
|
-
|
|
253
|
-
function normalizeDate(dateStr: string): string | null {
|
|
254
|
-
if (!dateStr) return null;
|
|
255
|
-
try {
|
|
256
|
-
const d = new Date(dateStr);
|
|
257
|
-
if (isNaN(d.getTime())) return null;
|
|
258
|
-
return d.toISOString();
|
|
259
|
-
} catch {
|
|
260
|
-
return null;
|
|
261
|
-
}
|
|
262
|
-
}
|