@notionx/create-notionx-app 1.0.0

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 (239) hide show
  1. package/README.md +139 -0
  2. package/dist/answers.js +332 -0
  3. package/dist/answers.js.map +1 -0
  4. package/dist/cli-notionx.js +388 -0
  5. package/dist/cli-notionx.js.map +1 -0
  6. package/dist/cli-notionx.test.js +277 -0
  7. package/dist/cli-notionx.test.js.map +1 -0
  8. package/dist/diff.js +40 -0
  9. package/dist/diff.js.map +1 -0
  10. package/dist/diff.test.js +90 -0
  11. package/dist/diff.test.js.map +1 -0
  12. package/dist/index.js +99 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/locale-add/apply.js +39 -0
  15. package/dist/locale-add/apply.js.map +1 -0
  16. package/dist/locale-add/format.js +38 -0
  17. package/dist/locale-add/format.js.map +1 -0
  18. package/dist/locale-add/list.js +44 -0
  19. package/dist/locale-add/list.js.map +1 -0
  20. package/dist/locale-add/list.test.js +45 -0
  21. package/dist/locale-add/list.test.js.map +1 -0
  22. package/dist/locale-add/plan.js +128 -0
  23. package/dist/locale-add/plan.js.map +1 -0
  24. package/dist/locale-add/validate.js +46 -0
  25. package/dist/locale-add/validate.js.map +1 -0
  26. package/dist/metadata.js +41 -0
  27. package/dist/metadata.js.map +1 -0
  28. package/dist/notion-translation-sources/apply.js +61 -0
  29. package/dist/notion-translation-sources/apply.js.map +1 -0
  30. package/dist/notion-translation-sources/index.js +3 -0
  31. package/dist/notion-translation-sources/index.js.map +1 -0
  32. package/dist/notion-translation-sources/plan.js +33 -0
  33. package/dist/notion-translation-sources/plan.js.map +1 -0
  34. package/dist/notionx-source.js +142 -0
  35. package/dist/notionx-source.js.map +1 -0
  36. package/dist/notionx-source.test.js +144 -0
  37. package/dist/notionx-source.test.js.map +1 -0
  38. package/dist/password.js +18 -0
  39. package/dist/password.js.map +1 -0
  40. package/dist/presets.js +83 -0
  41. package/dist/presets.js.map +1 -0
  42. package/dist/presets.test.js +50 -0
  43. package/dist/presets.test.js.map +1 -0
  44. package/dist/prompt.js +218 -0
  45. package/dist/prompt.js.map +1 -0
  46. package/dist/provision/cloudflare.js +236 -0
  47. package/dist/provision/cloudflare.js.map +1 -0
  48. package/dist/provision/dependencies.js +219 -0
  49. package/dist/provision/dependencies.js.map +1 -0
  50. package/dist/provision/index.js +681 -0
  51. package/dist/provision/index.js.map +1 -0
  52. package/dist/provision/index.test.js +54 -0
  53. package/dist/provision/index.test.js.map +1 -0
  54. package/dist/provision/inspect.js +109 -0
  55. package/dist/provision/inspect.js.map +1 -0
  56. package/dist/provision/inspect.test.js +75 -0
  57. package/dist/provision/inspect.test.js.map +1 -0
  58. package/dist/provision/notion.js +1981 -0
  59. package/dist/provision/notion.js.map +1 -0
  60. package/dist/provision/notion.test.js +542 -0
  61. package/dist/provision/notion.test.js.map +1 -0
  62. package/dist/provision/ntn-credentials.js +198 -0
  63. package/dist/provision/ntn-credentials.js.map +1 -0
  64. package/dist/provision/options.js +15 -0
  65. package/dist/provision/options.js.map +1 -0
  66. package/dist/provision/password-hash.js +78 -0
  67. package/dist/provision/password-hash.js.map +1 -0
  68. package/dist/provision/prompts.js +115 -0
  69. package/dist/provision/prompts.js.map +1 -0
  70. package/dist/provision/repair.js +48 -0
  71. package/dist/provision/repair.js.map +1 -0
  72. package/dist/provision/repair.test.js +141 -0
  73. package/dist/provision/repair.test.js.map +1 -0
  74. package/dist/provision/shell.js +84 -0
  75. package/dist/provision/shell.js.map +1 -0
  76. package/dist/provision/wire.js +78 -0
  77. package/dist/provision/wire.js.map +1 -0
  78. package/dist/registry/doctor.js +181 -0
  79. package/dist/registry/doctor.js.map +1 -0
  80. package/dist/registry/doctor.test.js +180 -0
  81. package/dist/registry/doctor.test.js.map +1 -0
  82. package/dist/registry/install.js +217 -0
  83. package/dist/registry/install.js.map +1 -0
  84. package/dist/registry/install.test.js +168 -0
  85. package/dist/registry/install.test.js.map +1 -0
  86. package/dist/registry/load-registry.js +24 -0
  87. package/dist/registry/load-registry.js.map +1 -0
  88. package/dist/registry/load-registry.test.js +59 -0
  89. package/dist/registry/load-registry.test.js.map +1 -0
  90. package/dist/registry/migration-planner.js +204 -0
  91. package/dist/registry/migration-planner.js.map +1 -0
  92. package/dist/registry/migration-planner.test.js +340 -0
  93. package/dist/registry/migration-planner.test.js.map +1 -0
  94. package/dist/registry/migrations-store.js +125 -0
  95. package/dist/registry/migrations-store.js.map +1 -0
  96. package/dist/registry/migrations-store.test.js +163 -0
  97. package/dist/registry/migrations-store.test.js.map +1 -0
  98. package/dist/registry/migrations-types.js +25 -0
  99. package/dist/registry/migrations-types.js.map +1 -0
  100. package/dist/registry/project-meta.js +84 -0
  101. package/dist/registry/project-meta.js.map +1 -0
  102. package/dist/registry/registry-items.js +354 -0
  103. package/dist/registry/registry-items.js.map +1 -0
  104. package/dist/registry/registry-items.test.js +99 -0
  105. package/dist/registry/registry-items.test.js.map +1 -0
  106. package/dist/registry/registry-store.js +232 -0
  107. package/dist/registry/registry-store.js.map +1 -0
  108. package/dist/registry/registry-store.test.js +136 -0
  109. package/dist/registry/registry-store.test.js.map +1 -0
  110. package/dist/registry/registry-types.js +18 -0
  111. package/dist/registry/registry-types.js.map +1 -0
  112. package/dist/registry/registry-types.test.js +146 -0
  113. package/dist/registry/registry-types.test.js.map +1 -0
  114. package/dist/registry/render-content-source-files.js +158 -0
  115. package/dist/registry/render-content-source-files.js.map +1 -0
  116. package/dist/registry/render-multi-source.js +296 -0
  117. package/dist/registry/render-multi-source.js.map +1 -0
  118. package/dist/registry/render-multi-source.test.js +110 -0
  119. package/dist/registry/render-multi-source.test.js.map +1 -0
  120. package/dist/registry/text-utils.js +42 -0
  121. package/dist/registry/text-utils.js.map +1 -0
  122. package/dist/registry/uninstall.js +250 -0
  123. package/dist/registry/uninstall.js.map +1 -0
  124. package/dist/registry/uninstall.test.js +264 -0
  125. package/dist/registry/uninstall.test.js.map +1 -0
  126. package/dist/registry/update.js +280 -0
  127. package/dist/registry/update.js.map +1 -0
  128. package/dist/registry/update.test.js +229 -0
  129. package/dist/registry/update.test.js.map +1 -0
  130. package/dist/render.js +549 -0
  131. package/dist/render.js.map +1 -0
  132. package/dist/render.test.js +414 -0
  133. package/dist/render.test.js.map +1 -0
  134. package/dist/templates/.dev.vars.example.tmpl +32 -0
  135. package/dist/templates/.gitignore.tmpl +58 -0
  136. package/dist/templates/README.md.tmpl +417 -0
  137. package/dist/templates/app/[slug]/page.tsx.tmpl +55 -0
  138. package/dist/templates/app/admin/account/page.tsx.tmpl +18 -0
  139. package/dist/templates/app/admin/content-models/page.tsx.tmpl +6 -0
  140. package/dist/templates/app/admin/layout.tsx.tmpl +90 -0
  141. package/dist/templates/app/admin/loading.tsx.tmpl +6 -0
  142. package/dist/templates/app/admin/page.tsx.tmpl +17 -0
  143. package/dist/templates/app/api/auth/google/callback/route.ts.tmpl +3 -0
  144. package/dist/templates/app/api/auth/google/route.ts.tmpl +3 -0
  145. package/dist/templates/app/api/auth/verify-email/route.ts.tmpl +3 -0
  146. package/dist/templates/app/api/auth/viewer/route.ts.tmpl +3 -0
  147. package/dist/templates/app/api/health/route.ts.tmpl +3 -0
  148. package/dist/templates/app/api/{{contentSourceId}}/[slug]/route.ts.tmpl +27 -0
  149. package/dist/templates/app/api/{{contentSourceId}}/route.ts.tmpl +18 -0
  150. package/dist/templates/app/globals.css.tmpl +109 -0
  151. package/dist/templates/app/layout.tsx.tmpl +56 -0
  152. package/dist/templates/app/login/page.tsx.tmpl +154 -0
  153. package/dist/templates/app/page.fallback.tsx.tmpl +31 -0
  154. package/dist/templates/app/page.tsx.tmpl +42 -0
  155. package/dist/templates/app/register/page.tsx.tmpl +138 -0
  156. package/dist/templates/app/{{contentSourceListPath}}/[slug]/page.tsx.tmpl +113 -0
  157. package/dist/templates/app/{{contentSourceListPath}}/page.tsx.tmpl +74 -0
  158. package/dist/templates/components/content/post-card.tsx.tmpl +80 -0
  159. package/dist/templates/components/notion-blocks.tsx.tmpl +668 -0
  160. package/dist/templates/components/page-blocks/feature-grid-block.tsx.tmpl +68 -0
  161. package/dist/templates/components/page-blocks/hero-block.tsx.tmpl +73 -0
  162. package/dist/templates/components/page-blocks/latest-posts-block.tsx.tmpl +59 -0
  163. package/dist/templates/components/page-blocks/story-block.tsx.tmpl +70 -0
  164. package/dist/templates/components/page-blocks.fallback.tsx.tmpl +17 -0
  165. package/dist/templates/components/page-blocks.tsx.tmpl +32 -0
  166. package/dist/templates/components/search/search-dialog.tsx.tmpl +171 -0
  167. package/dist/templates/components/site/locale-switcher.tsx.tmpl +65 -0
  168. package/dist/templates/components/site/site-footer.tsx.tmpl +106 -0
  169. package/dist/templates/components/site/site-header.tsx.tmpl +80 -0
  170. package/dist/templates/components/site/site-shell.tsx.tmpl +20 -0
  171. package/dist/templates/components/site/theme-bootstrap.tsx.tmpl +51 -0
  172. package/dist/templates/components/theme-provider.tsx.tmpl +14 -0
  173. package/dist/templates/components/theme-toggle.tsx.tmpl +38 -0
  174. package/dist/templates/components/ui/accordion.tsx.tmpl +56 -0
  175. package/dist/templates/components/ui/alert.tsx.tmpl +59 -0
  176. package/dist/templates/components/ui/aspect-ratio.tsx.tmpl +8 -0
  177. package/dist/templates/components/ui/avatar.tsx.tmpl +44 -0
  178. package/dist/templates/components/ui/badge.tsx.tmpl +33 -0
  179. package/dist/templates/components/ui/button.tsx.tmpl +56 -0
  180. package/dist/templates/components/ui/card.tsx.tmpl +61 -0
  181. package/dist/templates/components/ui/checkbox.tsx.tmpl +28 -0
  182. package/dist/templates/components/ui/dialog.tsx.tmpl +104 -0
  183. package/dist/templates/components/ui/dropdown-menu.tsx.tmpl +183 -0
  184. package/dist/templates/components/ui/input.tsx.tmpl +21 -0
  185. package/dist/templates/components/ui/label.tsx.tmpl +25 -0
  186. package/dist/templates/components/ui/popover.tsx.tmpl +30 -0
  187. package/dist/templates/components/ui/radio-group.tsx.tmpl +44 -0
  188. package/dist/templates/components/ui/select.tsx.tmpl +150 -0
  189. package/dist/templates/components/ui/separator.tsx.tmpl +30 -0
  190. package/dist/templates/components/ui/sheet.tsx.tmpl +125 -0
  191. package/dist/templates/components/ui/skeleton.tsx.tmpl +15 -0
  192. package/dist/templates/components/ui/sonner.tsx.tmpl +30 -0
  193. package/dist/templates/components/ui/switch.tsx.tmpl +29 -0
  194. package/dist/templates/components/ui/table.tsx.tmpl +107 -0
  195. package/dist/templates/components/ui/tabs.tsx.tmpl +55 -0
  196. package/dist/templates/components/ui/textarea.tsx.tmpl +24 -0
  197. package/dist/templates/components/ui/tooltip.tsx.tmpl +30 -0
  198. package/dist/templates/components.json.tmpl +21 -0
  199. package/dist/templates/env.d.ts.tmpl +32 -0
  200. package/dist/templates/lib/admin/actions.ts.tmpl +43 -0
  201. package/dist/templates/lib/admin/context.tsx.tmpl +209 -0
  202. package/dist/templates/lib/admin/nav.ts.tmpl +23 -0
  203. package/dist/templates/lib/auth.config.fallback.ts.tmpl +10 -0
  204. package/dist/templates/lib/auth.config.ts.tmpl +45 -0
  205. package/dist/templates/lib/blocks/translations.ts.tmpl +44 -0
  206. package/dist/templates/lib/blog/translations.ts.tmpl +52 -0
  207. package/dist/templates/lib/content/models.ts.tmpl +53 -0
  208. package/dist/templates/lib/i18n/config.ts.tmpl +18 -0
  209. package/dist/templates/lib/i18n/index.ts.tmpl +1 -0
  210. package/dist/templates/lib/locale-contract/built-in.ts.tmpl +19 -0
  211. package/dist/templates/lib/locale-contract/index.ts.tmpl +3 -0
  212. package/dist/templates/lib/locale-contract/paths.ts.tmpl +29 -0
  213. package/dist/templates/lib/pages/model.ts.tmpl +16 -0
  214. package/dist/templates/lib/pages/source.ts.tmpl +566 -0
  215. package/dist/templates/lib/pages/translations.ts.tmpl +34 -0
  216. package/dist/templates/lib/search/config.fallback.ts.tmpl +11 -0
  217. package/dist/templates/lib/search/config.ts.tmpl +25 -0
  218. package/dist/templates/lib/site/config.ts.tmpl +120 -0
  219. package/dist/templates/lib/site/request-env.ts.tmpl +71 -0
  220. package/dist/templates/lib/site/settings.fallback.ts.tmpl +21 -0
  221. package/dist/templates/lib/site/settings.ts.tmpl +320 -0
  222. package/dist/templates/lib/site/translations.ts.tmpl +30 -0
  223. package/dist/templates/lib/utils.ts.tmpl +9 -0
  224. package/dist/templates/migrations/0001_init.sql.tmpl +57 -0
  225. package/dist/templates/migrations/0002_admin_seed.sql.tmpl +30 -0
  226. package/dist/templates/migrations/0003_search_index.sql.tmpl +29 -0
  227. package/dist/templates/next.config.ts.tmpl +18 -0
  228. package/dist/templates/package.json.tmpl +40 -0
  229. package/dist/templates/shims/cloudflare-workers-empty.mjs +4 -0
  230. package/dist/templates/shims/next-headers-empty.mjs +4 -0
  231. package/dist/templates/tests/smoke.test.ts.tmpl +83 -0
  232. package/dist/templates/tsconfig.json.tmpl +31 -0
  233. package/dist/templates/vite.config.ts.tmpl +53 -0
  234. package/dist/templates/vitest.config.ts.tmpl +13 -0
  235. package/dist/templates/worker/index.ts.tmpl +52 -0
  236. package/dist/templates/wrangler.jsonc.tmpl +44 -0
  237. package/dist/ui-presets.js +60 -0
  238. package/dist/ui-presets.js.map +1 -0
  239. package/package.json +60 -0
@@ -0,0 +1,236 @@
1
+ // packages/create-notionx-app/src/provision/cloudflare.ts
2
+ //
3
+ // Provisions Cloudflare resources for a freshly-scaffolded project:
4
+ // - D1 database (create or reuse)
5
+ // - KV namespace (create or reuse)
6
+ // - R2 bucket (create or reuse)
7
+ // - Turnstile widget (create, requires CLOUDFLARE_API_TOKEN)
8
+ //
9
+ // All Cloudflare resources other than Turnstile use the `wrangler` CLI
10
+ // in the user's PATH (assumed globally installed — `wrangler login`
11
+ // must have been run). Turnstile has no wrangler subcommand and
12
+ // `wrangler login`'s OAuth scope does not include
13
+ // `Account.Turnstile:Edit`, so we hit the REST API directly with
14
+ // `CLOUDFLARE_API_TOKEN`.
15
+ //
16
+ // Wrangler 4.x removed `--json` from most write-side and several
17
+ // read-side subcommands. We only use `--json` where it's still
18
+ // supported (currently only `d1 list`); everything else is parsed
19
+ // from wrangler's human-readable text output.
20
+ import { runOrThrow } from "./shell.js";
21
+ /**
22
+ * Verify `wrangler` is installed and the user is logged in.
23
+ * Returns the account id, or throws with a friendly hint.
24
+ */
25
+ export async function requireWranglerAuth() {
26
+ try {
27
+ const out = await runOrThrow("wrangler", ["whoami"], {});
28
+ // wrangler 4.x prints JSON for `whoami` (e.g.
29
+ // `{"account": {"id": "0ba96e28..."}}`). Be tolerant: fall back
30
+ // to the first 32-char hex string if JSON parsing fails.
31
+ try {
32
+ const parsed = JSON.parse(out);
33
+ if (parsed.account?.id)
34
+ return { id: parsed.account.id };
35
+ }
36
+ catch {
37
+ /* not JSON */
38
+ }
39
+ const m = out.match(/\b([0-9a-f]{32})\b/);
40
+ if (m)
41
+ return { id: m[1] };
42
+ if (/not authenticated|wrangler login/i.test(out)) {
43
+ throw new Error("`wrangler` is not logged in. Run `wrangler login` first.");
44
+ }
45
+ throw new Error("Could not parse account id from `wrangler whoami`. Run `wrangler login` first.");
46
+ }
47
+ catch (err) {
48
+ if (err instanceof Error && /ENOENT/.test(err.message)) {
49
+ throw new Error("`wrangler` is not on PATH. Install with: npm i -g wrangler@latest");
50
+ }
51
+ if (err instanceof Error && /not authenticated/i.test(err.message)) {
52
+ throw new Error("`wrangler` is not logged in. Run `wrangler login` first.");
53
+ }
54
+ throw err;
55
+ }
56
+ }
57
+ /** Create a D1 database, or reuse an existing one with the same name. */
58
+ export async function ensureD1(name) {
59
+ // `wrangler d1 list --json` is still supported in 4.x
60
+ const list = await runOrThrow("wrangler", ["d1", "list", "--json"], {});
61
+ const items = parseJsonArray(list);
62
+ const existing = items.find((d) => d.name === name);
63
+ if (existing && existing.uuid) {
64
+ return {
65
+ databaseId: existing.uuid,
66
+ databaseName: name,
67
+ created: false,
68
+ };
69
+ }
70
+ // `wrangler d1 create` does NOT support --json in 4.x. The output
71
+ // looks like:
72
+ // ✅ Successfully created DB '<name>' in region WNAM
73
+ // ...
74
+ // database_id = "7d796b58-16ee-49e8-8bb8-737ea1413bb2"
75
+ const out = await runOrThrow("wrangler", ["d1", "create", name], {});
76
+ const databaseId = parseAssignment(out, "database_id");
77
+ if (!databaseId) {
78
+ throw new Error(`Could not parse D1 database_id from wrangler output:\n${out}`);
79
+ }
80
+ return { databaseId, databaseName: name, created: true };
81
+ }
82
+ /** Create a KV namespace, or reuse an existing one with the same title. */
83
+ export async function ensureKV(title) {
84
+ // `wrangler kv namespace list` in 4.x outputs a JSON array by
85
+ // default (no --json flag needed, but it would be ignored).
86
+ // Example: [{ "id": "...", "title": "CONTENT_CACHE", ... }, ...]
87
+ const list = await runOrThrow("wrangler", ["kv", "namespace", "list"], {});
88
+ const items = parseJsonArray(list);
89
+ const existing = items.find((n) => n.title === title);
90
+ if (existing && existing.id) {
91
+ return {
92
+ namespaceId: existing.id,
93
+ title,
94
+ created: false,
95
+ };
96
+ }
97
+ // `wrangler kv namespace create` does NOT support --json. Output:
98
+ // ...
99
+ // ✨ Success!
100
+ // ...
101
+ // id = "bd8afe71e62f4b04b5695f76cd4d3afd"
102
+ const out = await runOrThrow("wrangler", ["kv", "namespace", "create", title], {});
103
+ const namespaceId = parseAssignment(out, "id");
104
+ if (!namespaceId) {
105
+ throw new Error(`Could not parse KV id from wrangler output:\n${out}`);
106
+ }
107
+ return { namespaceId, title, created: true };
108
+ }
109
+ /** Create an R2 bucket, or reuse an existing one with the same name. */
110
+ export async function ensureR2(bucketName) {
111
+ // `wrangler r2 bucket list` does NOT support --json. Output:
112
+ // name: digwis-assets
113
+ // creation_date: 2026-06-11T08:03:22.074Z
114
+ const list = await runOrThrow("wrangler", ["r2", "bucket", "list"], {});
115
+ const existing = parseR2ListOutput(list);
116
+ if (existing.includes(bucketName)) {
117
+ return { bucketName, created: false };
118
+ }
119
+ // `wrangler r2 bucket create <name>` — no --json, but it is
120
+ // idempotent: a fresh bucket prints "✅ Created bucket '...'";
121
+ // an existing one errors out, which is what we expect to skip
122
+ // because we already checked `list` above.
123
+ await runOrThrow("wrangler", ["r2", "bucket", "create", bucketName], {});
124
+ return { bucketName, created: true };
125
+ }
126
+ /**
127
+ * Create a Turnstile widget. Requires `CLOUDFLARE_API_TOKEN` in env
128
+ * with `Account.Turnstile:Edit` scope. If the token is missing,
129
+ * returns `null` — the caller will fall back to a manual prompt.
130
+ */
131
+ export async function ensureTurnstile(accountId, name, domains) {
132
+ const token = process.env.CLOUDFLARE_API_TOKEN;
133
+ if (!token)
134
+ return null;
135
+ const res = await fetch(`https://api.cloudflare.com/client/v4/accounts/${accountId}/turnstile/widgets`, {
136
+ method: "POST",
137
+ headers: {
138
+ Authorization: `Bearer ${token}`,
139
+ "Content-Type": "application/json",
140
+ },
141
+ body: JSON.stringify({
142
+ name,
143
+ mode: "managed",
144
+ domains,
145
+ }),
146
+ });
147
+ if (!res.ok) {
148
+ const body = await res.text();
149
+ throw new Error(`Cloudflare Turnstile API error (${res.status}): ${body}`);
150
+ }
151
+ const json = (await res.json());
152
+ if (!json.success || !json.result?.sitekey || !json.result?.secret) {
153
+ throw new Error(`Cloudflare Turnstile API did not return a widget: ${JSON.stringify(json.errors ?? json)}`);
154
+ }
155
+ return {
156
+ sitekey: json.result.sitekey,
157
+ secret: json.result.secret,
158
+ domains: json.result.domains ?? domains,
159
+ created: true,
160
+ };
161
+ }
162
+ /**
163
+ * Set a Cloudflare Worker secret via `wrangler secret put` (pipes via
164
+ * stdin so the value never appears on the command line or in shell
165
+ * history).
166
+ */
167
+ export async function setWorkerSecret(name, value, cwd, redact = []) {
168
+ await runOrThrow("wrangler", ["secret", "put", name], { cwd, stdin: value, redact: [value, ...redact] });
169
+ }
170
+ // ---------- helpers ----------
171
+ /** Strip ANSI color codes (and OSC escape sequences) from a string. */
172
+ function stripAnsi(text) {
173
+ // eslint-disable-next-line no-control-regex
174
+ return text.replace(/\x1B\[[0-9;?]*[A-Za-z]/g, "").replace(/\x1B\][^\x07]*\x07/g, "");
175
+ }
176
+ /**
177
+ * Parse `key = "value"` (Toml) or `"key": "value"` (JSON) assignments
178
+ * out of wrangler output. Used by `d1 create` and `kv namespace
179
+ * create` to extract `database_id` / `id` from the printed config
180
+ * snippet.
181
+ */
182
+ function parseAssignment(text, key) {
183
+ const clean = stripAnsi(text);
184
+ // Escape any regex metachars in the key (e.g. underscores).
185
+ const esc = key.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
186
+ // 1) TOML: key = "value" or key = 'value' or key = bare
187
+ // 2) JSON: "key": "value" or "key": 'value' or "key": bare
188
+ const patterns = [
189
+ new RegExp(`${esc}\\s*=\\s*"([^"]+)"`, "i"),
190
+ new RegExp(`${esc}\\s*=\\s*'([^']+)'`, "i"),
191
+ new RegExp(`${esc}\\s*=\\s*([A-Za-z0-9-]+)`, "i"),
192
+ new RegExp(`"${esc}"\\s*:\\s*"([^"]+)"`, "i"),
193
+ new RegExp(`"${esc}"\\s*:\\s*'([^']+)'`, "i"),
194
+ new RegExp(`"${esc}"\\s*:\\s*([A-Za-z0-9-]+)`, "i"),
195
+ ];
196
+ for (const re of patterns) {
197
+ const m = clean.match(re);
198
+ if (m)
199
+ return m[1];
200
+ }
201
+ return null;
202
+ }
203
+ /** Parse `wrangler r2 bucket list` text output → list of bucket names. */
204
+ function parseR2ListOutput(text) {
205
+ const clean = stripAnsi(text);
206
+ const names = [];
207
+ for (const line of clean.split(/\r?\n/)) {
208
+ const m = line.match(/^name:\s+(.+)$/);
209
+ if (m)
210
+ names.push(m[1].trim());
211
+ }
212
+ return names;
213
+ }
214
+ function parseJsonArray(text) {
215
+ const clean = stripAnsi(text);
216
+ // wrangler prints either a bare JSON array or a JSON line inside a table.
217
+ // Try strict parse first, then scan for the first `[...]` block.
218
+ try {
219
+ const v = JSON.parse(clean);
220
+ return Array.isArray(v) ? v : [];
221
+ }
222
+ catch {
223
+ /* fall through */
224
+ }
225
+ const m = clean.match(/\[[\s\S]*?\]/);
226
+ if (!m)
227
+ return [];
228
+ try {
229
+ const v = JSON.parse(m[0]);
230
+ return Array.isArray(v) ? v : [];
231
+ }
232
+ catch {
233
+ return [];
234
+ }
235
+ }
236
+ //# sourceMappingURL=cloudflare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare.js","sourceRoot":"","sources":["../../src/provision/cloudflare.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,219 @@
1
+ // packages/create-notionx-app/src/provision/dependencies.ts
2
+ //
3
+ // Detect and (if missing) install the external CLI tools the rest of
4
+ // the provisioning flow depends on. The most common offender is
5
+ // `wrangler`, which newer @notionx/core releases assume is on PATH
6
+ // at >=4.x for the JSON output flags we rely on. `ntn` is Notion's
7
+ // own CLI used for data-source creation.
8
+ //
9
+ // We prefer global installs because the provisioning step runs
10
+ // against the user's Cloudflare / Notion account, not against the
11
+ // freshly-scaffolded project (which has not had `pnpm install`
12
+ // executed yet).
13
+ import { spawn } from "node:child_process";
14
+ import * as p from "@clack/prompts";
15
+ import { run } from "./shell.js";
16
+ export const REQUIRED_DEPENDENCIES = [
17
+ {
18
+ name: "wrangler",
19
+ packageSpec: "wrangler@latest",
20
+ minVersion: "4.0.0",
21
+ reason: "Used to create D1 / KV / R2 and to deploy the worker.",
22
+ },
23
+ {
24
+ name: "ntn",
25
+ packageSpec: "ntn@latest",
26
+ reason: "Notion CLI used to create the content data source.",
27
+ },
28
+ ];
29
+ function parseWranglerVersion(stdout) {
30
+ // wrangler prints `wrangler 4.13.0` (or `3.114.0` for older builds)
31
+ const m = stdout.match(/(\d+)\.(\d+)\.(\d+)/);
32
+ if (!m)
33
+ return null;
34
+ return {
35
+ raw: `${m[1]}.${m[2]}.${m[3]}`,
36
+ major: Number(m[1]),
37
+ };
38
+ }
39
+ function parseNtnVersion(stdout) {
40
+ // ntn prints `ntn 0.16.0` — major is always 0
41
+ const m = stdout.match(/(\d+)\.(\d+)\.(\d+)/);
42
+ if (!m)
43
+ return null;
44
+ return {
45
+ raw: `${m[1]}.${m[2]}.${m[3]}`,
46
+ major: Number(m[1]),
47
+ };
48
+ }
49
+ function parseVersion(name, stdout) {
50
+ if (name === "wrangler")
51
+ return parseWranglerVersion(stdout);
52
+ if (name === "ntn")
53
+ return parseNtnVersion(stdout);
54
+ // Generic fallback
55
+ const m = stdout.match(/(\d+)\.(\d+)\.(\d+)/);
56
+ return m ? { raw: `${m[1]}.${m[2]}.${m[3]}`, major: Number(m[1]) } : null;
57
+ }
58
+ async function probeCli(name) {
59
+ try {
60
+ const r = await run(name, ["--version"], {});
61
+ return { ok: r.code === 0, stdout: r.stdout };
62
+ }
63
+ catch {
64
+ return { ok: false, stdout: "" };
65
+ }
66
+ }
67
+ function isVersionAtLeast(actual, min) {
68
+ const a = actual.split(".").map((s) => Number(s) || 0);
69
+ const m = min.split(".").map((s) => Number(s) || 0);
70
+ for (let i = 0; i < Math.max(a.length, m.length); i++) {
71
+ const av = a[i] ?? 0;
72
+ const mv = m[i] ?? 0;
73
+ if (av > mv)
74
+ return true;
75
+ if (av < mv)
76
+ return false;
77
+ }
78
+ return true;
79
+ }
80
+ /**
81
+ * Install an npm package globally. Streams progress; doesn't throw on
82
+ * non-zero exit so the caller can decide how to react.
83
+ */
84
+ function npmInstallGlobal(packageSpec) {
85
+ return new Promise((resolve) => {
86
+ const child = spawn("npm", ["install", "-g", packageSpec], {
87
+ stdio: "inherit",
88
+ });
89
+ let stderr = "";
90
+ if (child.stderr) {
91
+ child.stderr.on("data", (d) => {
92
+ stderr += d.toString();
93
+ });
94
+ }
95
+ child.on("error", () => resolve({ code: -1, stderr }));
96
+ child.on("close", (code) => resolve({ code: code ?? -1, stderr }));
97
+ });
98
+ }
99
+ /**
100
+ * Ensure every required CLI tool is available at a usable version.
101
+ * Prompts the user (in interactive mode) to install/upgrade missing
102
+ * or outdated tools. Returns the final status for each. In
103
+ * non-interactive mode, missing tools simply report `available: false`
104
+ * — the caller is expected to surface this as a soft warning rather
105
+ * than aborting.
106
+ */
107
+ export async function ensureDependencies(deps = REQUIRED_DEPENDENCIES, options) {
108
+ const results = [];
109
+ for (const dep of deps) {
110
+ const probe = await probeCli(dep.name);
111
+ if (!probe.ok) {
112
+ p.log.warn(`${dep.name}: not found on PATH.`);
113
+ if (options.interactive) {
114
+ const install = await p.confirm({
115
+ message: `Install ${dep.packageSpec} globally now? (${dep.reason})`,
116
+ initialValue: true,
117
+ });
118
+ if (p.isCancel(install) || !install) {
119
+ results.push({ name: dep.name, available: false, minVersion: dep.minVersion });
120
+ continue;
121
+ }
122
+ const spinner = p.spinner();
123
+ spinner.start(`Installing ${dep.packageSpec}…`);
124
+ const r = await npmInstallGlobal(dep.packageSpec);
125
+ if (r.code !== 0) {
126
+ spinner.stop(`Failed to install ${dep.packageSpec}.`, 1);
127
+ p.log.error(`Install failed. Run manually: npm install -g ${dep.packageSpec}`);
128
+ results.push({ name: dep.name, available: false, minVersion: dep.minVersion });
129
+ continue;
130
+ }
131
+ spinner.stop(`${dep.name} installed.`);
132
+ // Re-probe
133
+ const after = await probeCli(dep.name);
134
+ if (!after.ok) {
135
+ results.push({ name: dep.name, available: false, minVersion: dep.minVersion });
136
+ continue;
137
+ }
138
+ const v = parseVersion(dep.name, after.stdout);
139
+ results.push({
140
+ name: dep.name,
141
+ available: true,
142
+ version: v?.raw,
143
+ minVersion: dep.minVersion,
144
+ installedNow: true,
145
+ });
146
+ continue;
147
+ }
148
+ // Non-interactive: just report missing
149
+ results.push({ name: dep.name, available: false, minVersion: dep.minVersion });
150
+ continue;
151
+ }
152
+ const v = parseVersion(dep.name, probe.stdout);
153
+ if (!v) {
154
+ // Couldn't parse version, assume it's fine
155
+ results.push({ name: dep.name, available: true });
156
+ continue;
157
+ }
158
+ if (dep.minVersion && !isVersionAtLeast(v.raw, dep.minVersion)) {
159
+ p.log.warn(`${dep.name} ${v.raw} is older than required ${dep.minVersion}.`);
160
+ if (options.interactive) {
161
+ const upgrade = await p.confirm({
162
+ message: `Upgrade to ${dep.packageSpec}?`,
163
+ initialValue: true,
164
+ });
165
+ if (p.isCancel(upgrade) || !upgrade) {
166
+ results.push({
167
+ name: dep.name,
168
+ available: true,
169
+ version: v.raw,
170
+ minVersion: dep.minVersion,
171
+ needsUpgrade: true,
172
+ });
173
+ continue;
174
+ }
175
+ const spinner = p.spinner();
176
+ spinner.start(`Upgrading ${dep.name}…`);
177
+ const r = await npmInstallGlobal(dep.packageSpec);
178
+ if (r.code !== 0) {
179
+ spinner.stop(`Failed to upgrade ${dep.name}.`, 1);
180
+ results.push({
181
+ name: dep.name,
182
+ available: true,
183
+ version: v.raw,
184
+ minVersion: dep.minVersion,
185
+ needsUpgrade: true,
186
+ });
187
+ continue;
188
+ }
189
+ spinner.stop(`${dep.name} upgraded.`);
190
+ const after = await probeCli(dep.name);
191
+ const v2 = parseVersion(dep.name, after.stdout);
192
+ results.push({
193
+ name: dep.name,
194
+ available: true,
195
+ version: v2?.raw,
196
+ minVersion: dep.minVersion,
197
+ installedNow: true,
198
+ });
199
+ continue;
200
+ }
201
+ results.push({
202
+ name: dep.name,
203
+ available: true,
204
+ version: v.raw,
205
+ minVersion: dep.minVersion,
206
+ needsUpgrade: true,
207
+ });
208
+ continue;
209
+ }
210
+ results.push({
211
+ name: dep.name,
212
+ available: true,
213
+ version: v.raw,
214
+ minVersion: dep.minVersion,
215
+ });
216
+ }
217
+ return results;
218
+ }
219
+ //# sourceMappingURL=dependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../src/provision/dependencies.ts"],"names":[],"mappings":"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"}