@theholocron/holocron-plugin-vercel 5.0.0-alpha.27 → 5.0.0-alpha.28

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 CHANGED
@@ -67,10 +67,19 @@ Capability covers:
67
67
  - `ensureCustomDomain()` — idempotent add (list → check → add). Adding
68
68
  a domain new to the Vercel account returns `verified: false` with a
69
69
  DNS verification challenge (usually a CNAME to a per-project target
70
- Vercel generates — never a fixed well-known host); this method only
71
- adds the domain, reading the challenge to finish DNS setup is the
72
- caller's own job today (no `Wiki.dnsRecord()`-style shared surface
73
- for it yet)
70
+ Vercel generates — never a fixed well-known host). The returned DNS
71
+ record is handed to the configured `dns` provider by `holocron setup`.
72
+
73
+ Declare the production domain in the Vercel provider options. On `holocron setup`,
74
+ the domain is attached to the project and any Vercel verification CNAME is
75
+ upserted through the configured DNS provider:
76
+
77
+ ```ts
78
+ providers: {
79
+ deployment: ["vercel", { teamId: "team_…", domain: "sentinel.example.com" }],
80
+ dns: "cloudflare",
81
+ }
82
+ ```
74
83
 
75
84
  Out of scope for alpha.0 (file a follow-up if needed):
76
85
 
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { AuthError, DeployFunctionConfig, DeployFunctionResult, Deployment, DeploymentProject, DeploymentProjectSettings, DeploymentRecord, DeploymentTarget, DeploymentTrigger, ResolveTokenInput } from "@theholocron/cli";
1
+ import { AuthError, DeployFunctionConfig, DeployFunctionResult, Deployment, DeploymentProject, DeploymentProjectSettings, DeploymentRecord, DeploymentTarget, DeploymentTrigger, DnsRecordRequest, ResolveTokenInput } from "@theholocron/cli";
2
2
  import { VercelClient, VercelClient as VercelClient$1, VercelClientOptions, createVercelClient } from "@theholocron/vercel-client";
3
3
  //#region src/auth.d.ts
4
4
  declare const resolveToken: (input?: ResolveTokenInput) => string;
@@ -7,11 +7,14 @@ declare const resolveToken: (input?: ResolveTokenInput) => string;
7
7
  interface DeploymentOptions {
8
8
  /** Optional framework hint passed to project creates. Defaults to "nextjs". */
9
9
  defaultFramework?: string;
10
+ /** Custom domain that `holocron setup` should attach to this project. */
11
+ domain?: string;
10
12
  }
11
13
  declare class VercelDeployment implements Deployment {
12
14
  private readonly client;
13
15
  readonly key: "deployment";
14
16
  readonly providerName = "vercel";
17
+ readonly domain?: string;
15
18
  private readonly defaultFramework;
16
19
  constructor(client: () => VercelClient$1, opts?: DeploymentOptions);
17
20
  listProjects(): Promise<DeploymentProject[]>;
@@ -36,16 +39,14 @@ declare class VercelDeployment implements Deployment {
36
39
  * matching `Deployment.ensureCustomDomain`'s contract (never break
37
40
  * on re-runs, per CLAUDE.md's probe-then-act standard). Adding it
38
41
  * the first time returns `verified: false` for a domain new to this
39
- * Vercel account — Vercel needs a DNS record (usually CNAME, a
40
- * unique per-project target) created before it routes traffic. This
41
- * method only adds the domain; reading the verification challenge
42
- * needed to finish is the caller's job (`client().domains.add()`'s
43
- * own return value carries it) — Sentinel has no `holocron setup`
44
- * orchestration to hand it to, so there's no shared "here's the DNS
45
- * record" surface to route it through the way `Wiki.dnsRecord()`
46
- * does today.
42
+ * Vercel account, plus a `verification` challenge — usually CNAME, a
43
+ * unique per-project target Vercel generates (never a fixed
44
+ * well-known host, confirmed via Vercel's own docs). Returned as a
45
+ * `DnsRecordRequest` — the caller (e.g. `holocron setup`'s
46
+ * custom-domain step) hands it straight to `dns.upsertRecord()`,
47
+ * same as `Wiki.dnsRecord()` already does for the wiki's own domain.
47
48
  */
48
- ensureCustomDomain(projectId: string, hostname: string): Promise<void>;
49
+ ensureCustomDomain(projectId: string, hostname: string): Promise<DnsRecordRequest | null>;
49
50
  private getProjectByName;
50
51
  }
51
52
  //#endregion
@@ -76,6 +77,8 @@ interface VercelPluginOptions extends ResolveTokenInput {
76
77
  teamId?: string;
77
78
  /** Default framework slug for new project creates. Defaults to "nextjs". */
78
79
  defaultFramework?: string;
80
+ /** Custom domain that `holocron setup` should attach to the Vercel project. */
81
+ domain?: string;
79
82
  /** Override base URL for tests. */
80
83
  baseUrl?: string;
81
84
  /** Override `fetch` for tests. */
package/dist/index.mjs CHANGED
@@ -13,10 +13,12 @@ var VercelDeployment = class {
13
13
  client;
14
14
  key = "deployment";
15
15
  providerName = "vercel";
16
+ domain;
16
17
  defaultFramework;
17
18
  constructor(client, opts = {}) {
18
19
  this.client = client;
19
20
  this.defaultFramework = opts.defaultFramework ?? "nextjs";
21
+ this.domain = opts.domain;
20
22
  }
21
23
  async listProjects() {
22
24
  const { projects } = await this.client().projects.list();
@@ -80,19 +82,28 @@ var VercelDeployment = class {
80
82
  * matching `Deployment.ensureCustomDomain`'s contract (never break
81
83
  * on re-runs, per CLAUDE.md's probe-then-act standard). Adding it
82
84
  * the first time returns `verified: false` for a domain new to this
83
- * Vercel account — Vercel needs a DNS record (usually CNAME, a
84
- * unique per-project target) created before it routes traffic. This
85
- * method only adds the domain; reading the verification challenge
86
- * needed to finish is the caller's job (`client().domains.add()`'s
87
- * own return value carries it) — Sentinel has no `holocron setup`
88
- * orchestration to hand it to, so there's no shared "here's the DNS
89
- * record" surface to route it through the way `Wiki.dnsRecord()`
90
- * does today.
85
+ * Vercel account, plus a `verification` challenge — usually CNAME, a
86
+ * unique per-project target Vercel generates (never a fixed
87
+ * well-known host, confirmed via Vercel's own docs). Returned as a
88
+ * `DnsRecordRequest` — the caller (e.g. `holocron setup`'s
89
+ * custom-domain step) hands it straight to `dns.upsertRecord()`,
90
+ * same as `Wiki.dnsRecord()` already does for the wiki's own domain.
91
91
  */
92
92
  async ensureCustomDomain(projectId, hostname) {
93
93
  const { domains: existing } = await this.client().domains.list(projectId);
94
- if (existing.some((d) => d.name === hostname)) return;
95
- await this.client().domains.add(projectId, hostname);
94
+ if (existing.some((d) => d.name === hostname)) return null;
95
+ const result = await this.client().domains.add(projectId, hostname);
96
+ if (result.verified) return null;
97
+ const challenge = result.verification?.find((v) => v.type === "CNAME");
98
+ if (!challenge) return null;
99
+ return {
100
+ zone: result.apexName,
101
+ record: {
102
+ type: "CNAME",
103
+ name: hostname,
104
+ content: challenge.value
105
+ }
106
+ };
96
107
  }
97
108
  async getProjectByName(name) {
98
109
  try {
@@ -176,6 +187,7 @@ function createContext(options = {}) {
176
187
  function deployment(ctx) {
177
188
  const opts = {};
178
189
  if (ctx.options.defaultFramework !== void 0) opts.defaultFramework = ctx.options.defaultFramework;
190
+ if (ctx.options.domain !== void 0) opts.domain = ctx.options.domain;
179
191
  return new VercelDeployment(ctx.client, opts);
180
192
  }
181
193
  function createPlugin(options = {}) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@theholocron/holocron-plugin-vercel",
3
- "version": "5.0.0-alpha.27",
3
+ "version": "5.0.0-alpha.28",
4
4
  "description": "Holocron plugin for Vercel. Implements the deployment capability against the Vercel REST API.",
5
5
  "keywords": [
6
6
  "deployment",
@@ -46,11 +46,11 @@
46
46
  "tsx": "4.23.12",
47
47
  "typescript": "^5.9.3",
48
48
  "vitest": "^4.1.11",
49
- "@theholocron/cli": "5.0.0-alpha.27"
49
+ "@theholocron/cli": "5.0.0-alpha.28"
50
50
  },
51
51
  "peerDependencies": {
52
52
  "@theholocron/vercel-client": "^1.23.0",
53
- "@theholocron/cli": "5.0.0-alpha.27"
53
+ "@theholocron/cli": "5.0.0-alpha.28"
54
54
  },
55
55
  "peerDependenciesMeta": {
56
56
  "@theholocron/vercel-client": {}