[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-93261":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":16,"stars30d":16,"stars90d":15,"forks30d":15,"starsTrendScore":15,"compositeScore":17,"rankGlobal":10,"rankLanguage":10,"license":18,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":21,"hasPages":19,"topics":22,"createdAt":10,"pushedAt":10,"updatedAt":23,"readmeContent":24,"aiSummary":25,"trendingCount":15,"starSnapshotCount":15,"syncStatus":26,"lastSyncTime":27,"discoverSource":28},93261,"domain-sdk","opencoredev\u002Fdomain-sdk","opencoredev","Add, verify, monitor, and remove customer domains with one TypeScript API.","https:\u002F\u002Fdomain-sdk.dev",null,"TypeScript",318,13,1,0,72,70.64,"MIT License",false,"main",true,[],"2026-07-22 04:02:08","\u003Cp align=\"center\">\n  \u003Cimg alt=\"Domain SDK — Custom domains, handled\" src=\".\u002FBackground-with-text.png\" width=\"820\" \u002F>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@opencoredev\u002Fdomain-sdk\">\u003Cimg alt=\"npm version\" src=\"https:\u002F\u002Fshieldcn.dev\u002Fnpm\u002F@opencoredev\u002Fdomain-sdk.svg?variant=secondary&mode=dark\" \u002F>\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fopencoredev\u002Fdomain-sdk\u002Fstargazers\">\u003Cimg alt=\"GitHub stars\" src=\"https:\u002F\u002Fshieldcn.dev\u002Fgithub\u002Fopencoredev\u002Fdomain-sdk\u002Fstars.svg?variant=branded&mode=dark\" \u002F>\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fx.com\u002Fleodev\">\u003Cimg alt=\"Follow @leodev on X\" src=\"https:\u002F\u002Fshieldcn.dev\u002Fx\u002Ffollow\u002Fleodev.svg?variant=branded&mode=dark\" \u002F>\u003C\u002Fa>\n\u003C\u002Fp>\n\nOne TypeScript client for customer domains. Add a hostname to the platform you already run, return the exact DNS records your customer needs, track it until it is ready, and remove it safely.\n\n- Adapters for Vercel, Cloudflare for SaaS, Railway, Render, and Netlify\n- One normalized lifecycle for adding, reading, listing, verifying, and removing domains\n- Exact routing, ownership, and certificate records for customer-facing DNS instructions\n- Provider-authoritative verification and certificate status without false readiness\n- Idempotent add and remove operations with normalized, retry-aware errors\n- Sequential polling with timeouts, cancellation, callbacks, and provider backoff\n- An isolated testing adapter that never calls a real provider\n\n## Install\n\n```bash\nnpm install @opencoredev\u002Fdomain-sdk\n```\n\nDomain SDK is server-side only and requires Node 20+ or Bun. Keep provider credentials out of browser code.\n\n## Usage\n\n```ts\nimport { createDomainClient } from \"@opencoredev\u002Fdomain-sdk\";\nimport { vercel } from \"@opencoredev\u002Fdomain-sdk\u002Fvercel\";\n\nconst domains = createDomainClient({\n  provider: vercel({\n    token: process.env.VERCEL_TOKEN!,\n    projectId: process.env.VERCEL_PROJECT_ID!,\n  }),\n});\n\nconst domain = await domains.add(\"app.customer.com\");\n\nfor (const record of domain.records.filter((record) => record.required)) {\n  console.log(record.type, record.name, record.value);\n}\n\nconst active = await domains.waitUntilActive(domain.hostname);\n```\n\nFor tenant-chosen subdomains under a parent domain you own, scope the client to that namespace:\n\n```ts\nimport { createSubdomainClient } from \"@opencoredev\u002Fdomain-sdk\";\n\nconst subdomains = createSubdomainClient({\n  domainClient: domains,\n  baseDomain: \"mydomain.com\",\n  reservedLabels: [\"www\", \"api\", \"admin\"],\n});\n\nsubdomains.toHostname(\"customer\"); \u002F\u002F customer.mydomain.com\n```\n\nUse `provisionWildcard()` once when the provider supports wildcards, or `add(\"customer\")` for per-hostname provisioning. Your application remains responsible for tenant ownership and unique label storage.\n\n## Providers\n\nVercel, Cloudflare for SaaS, Railway, Render, Netlify, and an in-memory testing adapter. Each provider lives behind its own entry point and preserves the platform-specific DNS and verification details your UI needs.\n\n## Documentation\n\nFull docs live at **[domain-sdk.dev\u002Fdocs](https:\u002F\u002Fdomain-sdk.dev\u002Fdocs)**. Good places to start:\n\n- [Installation](https:\u002F\u002Fdomain-sdk.dev\u002Fdocs\u002Finstallation)\n- [Provider comparison](https:\u002F\u002Fdomain-sdk.dev\u002Fdocs\u002Fproviders)\n- [Contributing](https:\u002F\u002Fdomain-sdk.dev\u002Fdocs\u002Fproject\u002Fcontributing)\n\n## Development\n\n```bash\nbun install\nbun run dev\nbun run test\nbun run check-types\nbun run lint\nbun run build\n```\n\nThe docs run at `http:\u002F\u002Fdomain-sdk.localhost:1355` through the sudo-free Portless proxy. Use `PORTLESS=0 bun run dev` to bypass the proxy.\n\n## Releasing\n\nAdd a Tegami changelog under `.tegami\u002F`, then run the complete local release:\n\n```bash\nbun run release\n```\n\nThe release tooling requires Node.js 24 or newer.\n\nThe command lints, type-checks, and tests the SDK; versions it with Tegami; builds the package; publishes it to npm; and removes the completed publish lock. If publishing fails, Tegami keeps the lock so `bun run tegami publish` can retry safely.\n\n## License\n\n[MIT](.\u002FLICENSE)\n\n\u003Cp align=\"center\">\u003Csub>Built by \u003Ca href=\"https:\u002F\u002Fx.com\u002Fleodev\">@leodev\u003C\u002Fa>\u003C\u002Fsub>\u003C\u002Fp>\n","Domain SDK 是一个面向 SaaS 平台的 TypeScript 客户域名管理 SDK，统一抽象多云服务商（如 Vercel、Cloudflare、Netlify 等）的域名生命周期操作。它提供标准化的 API 实现客户自定义域名的添加、DNS 记录生成、就绪状态轮询验证、安全移除及子域名托管，并支持 provider-specific 准确记录输出与权威性证书状态检查。适用于多租户 SaaS 应用中需集成第三方 DNS 服务商、保障客户域名配置可靠性的后端场景，要求 Node.js 20+ 或 Bun 运行环境。",2,"2026-07-15 02:30:03","CREATED_QUERY"]