@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,542 @@
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+ const { runNtnMock, runOrThrowNtnMock } = vi.hoisted(() => ({
3
+ runNtnMock: vi.fn(),
4
+ runOrThrowNtnMock: vi.fn(),
5
+ }));
6
+ vi.mock("./shell.js", () => ({
7
+ runNtn: runNtnMock,
8
+ runOrThrowNtn: runOrThrowNtnMock,
9
+ }));
10
+ import { _internal, ensureNotionDatabase, ensureSiteSettingsDatabase } from "./notion.js";
11
+ describe("stable scaffold markers", () => {
12
+ it("builds the expected scaffold marker for a stable key", () => {
13
+ expect(_internal.buildScaffoldMarker("content:blog")).toBe("[notionx-scaffold] key=content:blog");
14
+ });
15
+ it("extracts a stable key from description text", () => {
16
+ expect(_internal.extractScaffoldKey("Editorial notes\n[notionx-scaffold] key=pages:default")).toBe("pages:default");
17
+ });
18
+ it("appends a scaffold marker without removing user-authored description text", () => {
19
+ expect(_internal.mergeDescriptionWithScaffoldMarker("Editorial notes", "content:blog")).toBe("Editorial notes\n[notionx-scaffold] key=content:blog");
20
+ });
21
+ });
22
+ describe("default blog schema helpers", () => {
23
+ it("maps minimal blog fields to the correct Notion property types", () => {
24
+ const properties = _internal.buildProperties([
25
+ { key: "title", notionName: "Name" },
26
+ { key: "slug", notionName: "Slug" },
27
+ { key: "description", notionName: "Description" },
28
+ { key: "published", notionName: "Published" },
29
+ { key: "date", notionName: "Date" },
30
+ { key: "tags", notionName: "Tags" },
31
+ { key: "cover", notionName: "Cover" },
32
+ ]);
33
+ expect(properties.Name).toEqual({ title: {} });
34
+ expect(properties.Slug).toEqual({ rich_text: {} });
35
+ expect(properties.Description).toEqual({ rich_text: {} });
36
+ expect(properties.Published).toEqual({ checkbox: {} });
37
+ expect(properties.Date).toEqual({ date: {} });
38
+ expect(properties.Tags).toEqual({ multi_select: {} });
39
+ expect(properties.Cover).toEqual({ files: {} });
40
+ });
41
+ it("resolves the actual title property name from returned schema", () => {
42
+ const name = _internal.resolveTitlePropertyName({
43
+ Description: { rich_text: {} },
44
+ Name: { title: {} },
45
+ Slug: { rich_text: {} },
46
+ });
47
+ expect(name).toBe("Name");
48
+ });
49
+ });
50
+ describe("sample page builders", () => {
51
+ it("builds a published sample post plus page body blocks", () => {
52
+ const page = _internal.buildSamplePage({
53
+ index: 1,
54
+ titlePropertyName: "Name",
55
+ databaseId: "db-id",
56
+ title: "my-app Blog",
57
+ fieldNames: {
58
+ title: "Name",
59
+ slug: "Slug",
60
+ description: "Description",
61
+ published: "Published",
62
+ date: "Date",
63
+ tags: "Tags",
64
+ cover: "Cover",
65
+ },
66
+ });
67
+ const properties = page.properties;
68
+ expect(properties.Name.title[0].text.content).toBe("Building a Calm Publishing Workflow");
69
+ expect(properties.Slug.rich_text[0].text.content).toBe("building-a-calm-publishing-workflow");
70
+ expect(properties.Published.checkbox).toBe(true);
71
+ expect(properties.Cover.files[0].type).toBe("external");
72
+ expect(page.children.some((block) => block.type === "heading_1")).toBe(true);
73
+ expect(page.children.some((block) => block.type === "bulleted_list_item")).toBe(true);
74
+ });
75
+ it("uses localized sample copy for zh-CN projects", () => {
76
+ const page = _internal.buildSamplePage({
77
+ index: 1,
78
+ titlePropertyName: "Name",
79
+ databaseId: "db-id",
80
+ title: "my-app Blog",
81
+ locale: "zh-CN",
82
+ fieldNames: {
83
+ title: "Name",
84
+ slug: "Slug",
85
+ description: "Description",
86
+ published: "Published",
87
+ date: "Date",
88
+ tags: "Tags",
89
+ cover: "Cover",
90
+ },
91
+ });
92
+ const properties = page.properties;
93
+ expect(properties.Name.title[0].text.content).toBe("建立一个不打扰创作的发布流程");
94
+ expect(properties.Tags.multi_select[0].name).toBe("工作流");
95
+ });
96
+ it("builds Pages database properties and a navigation-aware home page", () => {
97
+ const properties = _internal.buildPageProperties();
98
+ expect(properties.Name).toEqual({ title: {} });
99
+ expect(properties.Key).toEqual({ rich_text: {} });
100
+ expect(properties.Blocks).toEqual({ rich_text: {} });
101
+ expect(properties["Show in Nav"]).toEqual({ checkbox: {} });
102
+ expect(properties["Nav Order"]).toEqual({ number: {} });
103
+ const [home] = _internal.sampleSitePages({
104
+ apiToken: "token",
105
+ parentPageId: "page",
106
+ projectName: "Demo",
107
+ contentSourceId: "blog",
108
+ contentSourceTitle: "Blog",
109
+ contentSourceListPath: "/blog",
110
+ locale: "en",
111
+ });
112
+ const payload = _internal.buildSitePagePayload({
113
+ databaseId: "db-id",
114
+ projectName: "Demo",
115
+ page: home,
116
+ });
117
+ const pageProperties = payload.properties;
118
+ expect(pageProperties.Key.rich_text[0].text.content).toBe("home");
119
+ expect(pageProperties.Layout.select.name).toBe("home");
120
+ const blocks = pageProperties.Blocks;
121
+ expect(blocks.rich_text[0].text.content).toContain('"slug":"home-hero"');
122
+ expect(pageProperties["Show Header"].checkbox).toBe(true);
123
+ });
124
+ it("seeds a semantic homepage with three homepage blocks", () => {
125
+ const pages = _internal.sampleSitePages({
126
+ apiToken: "token",
127
+ parentPageId: "page",
128
+ projectName: "newpj",
129
+ contentSourceId: "blog",
130
+ contentSourceTitle: "Blog",
131
+ contentSourceListPath: "/blog",
132
+ locale: "en",
133
+ });
134
+ const home = pages.find((page) => page.key === "home");
135
+ expect(home?.title).toBe("Home");
136
+ expect(home?.blocks).toEqual([
137
+ { slug: "home-hero", variant: "hero", order: 10 },
138
+ { slug: "home-feature-grid", variant: "feature-grid", order: 20 },
139
+ { slug: "home-latest-posts", order: 30 },
140
+ ]);
141
+ });
142
+ });
143
+ describe("blocks data source builders", () => {
144
+ it("exposes a dedicated schema and starter rows for reusable page blocks", () => {
145
+ const helpers = _internal;
146
+ expect(typeof helpers.buildBlocksProperties).toBe("function");
147
+ expect(typeof helpers.sampleBlocks).toBe("function");
148
+ const properties = helpers.buildBlocksProperties?.() ?? {};
149
+ expect(properties.Name).toEqual({ title: {} });
150
+ expect(properties.Slug).toEqual({ rich_text: {} });
151
+ expect(properties.Type).toEqual({ select: {} });
152
+ expect(properties["Page Keys"]).toEqual({ rich_text: {} });
153
+ expect(properties.Order).toEqual({ number: {} });
154
+ const blocks = helpers.sampleBlocks?.({
155
+ projectName: "Demo",
156
+ contentSourceTitle: "Blog",
157
+ locale: "en",
158
+ }) ?? [];
159
+ expect(blocks.map((block) => block.slug)).toEqual(expect.arrayContaining(["home-hero", "home-feature-grid", "home-latest-posts"]));
160
+ expect(blocks.find((block) => block.slug === "home-hero")?.type).toBe("hero");
161
+ expect(blocks.find((block) => block.slug === "home-hero")?.pageKeys).toContain("home");
162
+ });
163
+ it("builds typed block properties for hero, feature-grid, and story", () => {
164
+ const properties = _internal.buildBlocksProperties();
165
+ expect(properties.Type).toEqual({ select: {} });
166
+ expect(properties.Eyebrow).toEqual({ rich_text: {} });
167
+ expect(properties.Headline).toEqual({ rich_text: {} });
168
+ expect(properties.Subheadline).toEqual({ rich_text: {} });
169
+ expect(properties["Primary CTA Label"]).toEqual({ rich_text: {} });
170
+ expect(properties["Primary CTA Href"]).toEqual({ url: {} });
171
+ expect(properties["Secondary CTA Label"]).toEqual({ rich_text: {} });
172
+ expect(properties["Secondary CTA Href"]).toEqual({ url: {} });
173
+ expect(properties.Alignment).toEqual({ select: {} });
174
+ expect(properties.Theme).toEqual({ select: {} });
175
+ expect(properties.Columns).toEqual({ number: {} });
176
+ expect(properties.Items).toEqual({ rich_text: {} });
177
+ expect(properties.Body).toEqual({ rich_text: {} });
178
+ expect(properties.Quote).toEqual({ rich_text: {} });
179
+ expect(properties["Quote Attribution"]).toEqual({ rich_text: {} });
180
+ expect(properties["Media Url"]).toEqual({ url: {} });
181
+ expect(properties.Layout).toEqual({ select: {} });
182
+ });
183
+ it("seeds semantic homepage blocks and excludes about-story", () => {
184
+ const blocks = _internal.sampleBlocks({
185
+ projectName: "newpj",
186
+ contentSourceTitle: "Blog",
187
+ locale: "en",
188
+ });
189
+ expect(blocks.map((block) => block.title)).toEqual([
190
+ "Homepage Hero",
191
+ "Homepage Feature Grid",
192
+ "Homepage Latest Posts",
193
+ ]);
194
+ expect(blocks.map((block) => block.slug)).not.toContain("about-story");
195
+ });
196
+ it("seeds hero blocks from structured fields instead of page body content", () => {
197
+ const [hero] = _internal.sampleBlocks({
198
+ projectName: "Demo",
199
+ contentSourceTitle: "Blog",
200
+ locale: "en",
201
+ });
202
+ const payload = _internal.buildSiteBlockPayload({
203
+ databaseId: "db-id",
204
+ projectName: "Demo",
205
+ block: hero,
206
+ });
207
+ const properties = payload.properties;
208
+ expect(properties.Type.select.name).toBe("hero");
209
+ expect(properties.Headline.rich_text[0]?.text.content).toBeTruthy();
210
+ expect(properties["Primary CTA Label"].rich_text[0]?.text.content).toBeTruthy();
211
+ expect(properties["Primary CTA Href"].url).toMatch(/^\//);
212
+ expect(properties.Alignment.select.name).toBe("center");
213
+ });
214
+ });
215
+ describe("default content and site settings seeds", () => {
216
+ it("seeds six published blog posts by default", () => {
217
+ const helpers = _internal;
218
+ expect(typeof helpers.samplePosts).toBe("function");
219
+ const posts = helpers.samplePosts?.("en") ?? [];
220
+ expect(posts).toHaveLength(6);
221
+ expect(posts.every((post) => Boolean(post.slug))).toBe(true);
222
+ });
223
+ it("seeds site settings with nav, footer, and icon defaults", () => {
224
+ const payload = _internal.buildSiteSettingsSeedPage({
225
+ projectName: "newpj",
226
+ description: "An editable site",
227
+ defaultLocale: "en",
228
+ dataSourceId: "site-settings-ds",
229
+ });
230
+ const properties = payload.properties;
231
+ expect(properties.Nav.rich_text[0]?.text.content).toContain('"label":"Home"');
232
+ expect(properties.Nav.rich_text[0]?.text.content).toContain('"label":"About"');
233
+ expect(properties.Nav.rich_text[0]?.text.content).toContain('"label":"Blog"');
234
+ expect(properties["Footer Columns"].rich_text[0]?.text.content).toContain('"label":"Company"');
235
+ expect(properties["Social Image"].url).toContain("picsum.photos");
236
+ expect(properties["OG Image"].url).toContain("picsum.photos");
237
+ });
238
+ });
239
+ describe("stable database reuse", () => {
240
+ beforeEach(() => {
241
+ runNtnMock.mockReset();
242
+ runOrThrowNtnMock.mockReset();
243
+ });
244
+ it("reuses a database whose description already contains the stable key", async () => {
245
+ runOrThrowNtnMock.mockResolvedValueOnce(JSON.stringify({
246
+ results: [
247
+ {
248
+ object: "database",
249
+ id: "db-stable",
250
+ title: [{ plain_text: "Renamed Blog" }],
251
+ description: [{ plain_text: "[notionx-scaffold] key=content:blog" }],
252
+ parent: { page_id: "page-1234-page-1234-page-1234page1234" },
253
+ data_sources: [{ id: "ds-stable" }],
254
+ url: "https://www.notion.so/db-stable",
255
+ last_edited_time: "2026-06-12T00:00:00.000Z",
256
+ },
257
+ ],
258
+ }));
259
+ runOrThrowNtnMock.mockResolvedValueOnce(JSON.stringify({ properties: { Name: { title: {} } } }));
260
+ const result = await ensureNotionDatabase({
261
+ apiToken: "token",
262
+ parentPageId: "page-1234-page-1234-page-1234page1234",
263
+ title: "Demo Blog",
264
+ stableKey: "content:blog",
265
+ locale: "en",
266
+ fields: [{ key: "title", notionName: "Name" }],
267
+ seedCount: 3,
268
+ });
269
+ expect(result.created).toBe(false);
270
+ expect(result.databaseId).toBe("db-stable");
271
+ expect(runOrThrowNtnMock).not.toHaveBeenCalledWith(expect.arrayContaining(["v1/databases", "-d", expect.any(String)]), expect.anything());
272
+ });
273
+ it("upgrades a legacy title match by patching the scaffold marker", async () => {
274
+ runOrThrowNtnMock
275
+ .mockResolvedValueOnce(JSON.stringify({ results: [] }))
276
+ .mockResolvedValueOnce(JSON.stringify({
277
+ results: [
278
+ {
279
+ object: "database",
280
+ id: "db-legacy",
281
+ title: [{ plain_text: "Demo Blog" }],
282
+ description: [],
283
+ parent: { page_id: "page-1234-page-1234-page-1234page1234" },
284
+ data_sources: [{ id: "ds-legacy" }],
285
+ url: "https://www.notion.so/db-legacy",
286
+ },
287
+ ],
288
+ }))
289
+ .mockResolvedValueOnce(JSON.stringify({ properties: { Name: { title: {} } } }))
290
+ .mockResolvedValueOnce(JSON.stringify({ id: "db-legacy" }));
291
+ const result = await ensureNotionDatabase({
292
+ apiToken: "token",
293
+ parentPageId: "page-1234-page-1234-page-1234page1234",
294
+ title: "Demo Blog",
295
+ stableKey: "content:blog",
296
+ locale: "en",
297
+ fields: [{ key: "title", notionName: "Name" }],
298
+ seedCount: 0,
299
+ });
300
+ expect(result.created).toBe(false);
301
+ expect(runOrThrowNtnMock).toHaveBeenCalledWith(expect.arrayContaining(["api", "v1/databases/db-legacy", "-X", "PATCH"]), expect.objectContaining({ env: { NOTION_API_TOKEN: "token" } }));
302
+ });
303
+ it("selects the most recently edited database when duplicate stable markers exist", async () => {
304
+ runOrThrowNtnMock.mockResolvedValueOnce(JSON.stringify({
305
+ results: [
306
+ {
307
+ object: "database",
308
+ id: "db-older",
309
+ title: [{ plain_text: "Older" }],
310
+ description: [{ plain_text: "[notionx-scaffold] key=content:blog" }],
311
+ parent: { page_id: "page-1234-page-1234-page-1234page1234" },
312
+ data_sources: [{ id: "ds-older" }],
313
+ last_edited_time: "2026-06-01T00:00:00.000Z",
314
+ },
315
+ {
316
+ object: "database",
317
+ id: "db-newer",
318
+ title: [{ plain_text: "Newer" }],
319
+ description: [{ plain_text: "[notionx-scaffold] key=content:blog" }],
320
+ parent: { page_id: "page-1234-page-1234-page-1234page1234" },
321
+ data_sources: [{ id: "ds-newer" }],
322
+ last_edited_time: "2026-06-12T00:00:00.000Z",
323
+ },
324
+ ],
325
+ }));
326
+ runOrThrowNtnMock.mockResolvedValueOnce(JSON.stringify({ properties: { Name: { title: {} } } }));
327
+ const result = await ensureNotionDatabase({
328
+ apiToken: "token",
329
+ parentPageId: "page-1234-page-1234-page-1234page1234",
330
+ title: "Demo Blog",
331
+ stableKey: "content:blog",
332
+ fields: [{ key: "title", notionName: "Name" }],
333
+ seedCount: 0,
334
+ });
335
+ expect(result.databaseId).toBe("db-newer");
336
+ });
337
+ });
338
+ describe("schema patch guardrails", () => {
339
+ it("does not patch property types when the existing schema type differs", () => {
340
+ const diff = _internal.missingPropertiesForPatch({ Published: { rich_text: {} } }, { Published: { checkbox: {} }, Date: { date: {} } });
341
+ expect(diff.properties).toEqual({ Date: { date: {} } });
342
+ expect(diff.warnings[0]).toContain('property "Published" is rich_text');
343
+ });
344
+ });
345
+ describe("site-settings reuse", () => {
346
+ beforeEach(() => {
347
+ runNtnMock.mockReset();
348
+ runOrThrowNtnMock.mockReset();
349
+ });
350
+ it("reuses a data source whose description carries the site-settings stable key", async () => {
351
+ runOrThrowNtnMock.mockResolvedValueOnce(JSON.stringify({
352
+ results: [
353
+ {
354
+ object: "data_source",
355
+ id: "ds-stable",
356
+ title: [{ plain_text: "digwis Site Settings" }],
357
+ description: [{ plain_text: "[notionx-scaffold] key=site-settings" }],
358
+ parent: { database_id: "db-stable" },
359
+ data_sources: [{ id: "ds-stable" }],
360
+ url: "https://www.notion.so/db-stable",
361
+ last_edited_time: "2026-06-12T00:00:00.000Z",
362
+ },
363
+ ],
364
+ }));
365
+ runOrThrowNtnMock.mockResolvedValueOnce(JSON.stringify({
366
+ properties: {
367
+ "Site Name": { title: {} },
368
+ Tagline: { rich_text: {} },
369
+ Description: { rich_text: {} },
370
+ "Default Locale": { select: {} },
371
+ "Social Image": { url: {} },
372
+ "Meta Title": { rich_text: {} },
373
+ "Meta Description": { rich_text: {} },
374
+ "OG Image": { url: {} },
375
+ Nav: { rich_text: {} },
376
+ "Nav CTA": { rich_text: {} },
377
+ "Primary Color": { select: {} },
378
+ "Accent Color": { select: {} },
379
+ "Font Family": { select: {} },
380
+ "Footer Columns": { rich_text: {} },
381
+ "Footer Copyright": { rich_text: {} },
382
+ "Footer Social Links": { rich_text: {} },
383
+ "Footer Tagline": { rich_text: {} },
384
+ },
385
+ }));
386
+ const result = await ensureSiteSettingsDatabase({
387
+ apiToken: "token",
388
+ parentPageId: "page-1234-page-1234-page-1234page1234",
389
+ projectName: "digwis",
390
+ description: "desc",
391
+ defaultLocale: "en",
392
+ });
393
+ expect(result.reused).toBe(true);
394
+ expect(result.dataSourceId).toBe("ds-stable");
395
+ expect(runOrThrowNtnMock).not.toHaveBeenCalledWith(expect.arrayContaining(["v1/databases", "-d", expect.any(String)]), expect.anything());
396
+ });
397
+ it("falls back to a title match when no stable-key marker is present", async () => {
398
+ // First call: stable-key search returns nothing.
399
+ runOrThrowNtnMock.mockResolvedValueOnce(JSON.stringify({ results: [] }));
400
+ // Second call: title search returns a same-named data source.
401
+ runOrThrowNtnMock.mockResolvedValueOnce(JSON.stringify({
402
+ results: [
403
+ {
404
+ object: "data_source",
405
+ id: "ds-legacy",
406
+ title: [{ plain_text: "digwis Site Settings" }],
407
+ description: [],
408
+ parent: { database_id: "db-legacy" },
409
+ data_sources: [{ id: "ds-legacy" }],
410
+ url: "https://www.notion.so/db-legacy",
411
+ last_edited_time: "2026-06-12T00:00:00.000Z",
412
+ },
413
+ ],
414
+ }));
415
+ // Third call: ensureDataSourceProperties → getDataSourceSchema
416
+ // (all 17 properties present → no PATCH needed).
417
+ runOrThrowNtnMock.mockResolvedValueOnce(JSON.stringify({
418
+ properties: {
419
+ "Site Name": { title: {} },
420
+ Tagline: { rich_text: {} },
421
+ Description: { rich_text: {} },
422
+ "Default Locale": { select: {} },
423
+ "Social Image": { url: {} },
424
+ "Meta Title": { rich_text: {} },
425
+ "Meta Description": { rich_text: {} },
426
+ "OG Image": { url: {} },
427
+ Nav: { rich_text: {} },
428
+ "Nav CTA": { rich_text: {} },
429
+ "Primary Color": { select: {} },
430
+ "Accent Color": { select: {} },
431
+ "Font Family": { select: {} },
432
+ "Footer Columns": { rich_text: {} },
433
+ "Footer Copyright": { rich_text: {} },
434
+ "Footer Social Links": { rich_text: {} },
435
+ "Footer Tagline": { rich_text: {} },
436
+ },
437
+ }));
438
+ // Fourth call: patchDatabaseDescription (marker missing on legacy row).
439
+ runOrThrowNtnMock.mockResolvedValueOnce(JSON.stringify({ id: "db-legacy" }));
440
+ const result = await ensureSiteSettingsDatabase({
441
+ apiToken: "token",
442
+ parentPageId: "page-1234-page-1234-page-1234page1234",
443
+ projectName: "digwis",
444
+ description: "desc",
445
+ defaultLocale: "en",
446
+ });
447
+ expect(result.reused).toBe(true);
448
+ expect(result.dataSourceId).toBe("ds-legacy");
449
+ expect(runOrThrowNtnMock).toHaveBeenCalledWith(expect.arrayContaining(["api", "v1/databases/db-legacy", "-X", "PATCH"]), expect.objectContaining({ env: { NOTION_API_TOKEN: "token" } }));
450
+ });
451
+ it("creates a fresh data source and writes the stable-key marker when nothing matches", async () => {
452
+ // No stable-key match.
453
+ runOrThrowNtnMock.mockResolvedValueOnce(JSON.stringify({ results: [] }));
454
+ // No title match.
455
+ runOrThrowNtnMock.mockResolvedValueOnce(JSON.stringify({ results: [] }));
456
+ // createDatabaseWithProperties (databases endpoint).
457
+ runOrThrowNtnMock.mockResolvedValueOnce(JSON.stringify({
458
+ id: "db-new",
459
+ data_sources: [{ id: "ds-new" }],
460
+ url: "https://www.notion.so/db-new",
461
+ }));
462
+ // createDatabaseWithProperties PATCH (adds the 4 non-title
463
+ // properties to the new data source).
464
+ runOrThrowNtnMock.mockResolvedValueOnce(JSON.stringify({ properties: {} }));
465
+ // patchDatabaseDescription (description contains the stable key marker).
466
+ runOrThrowNtnMock.mockResolvedValueOnce(JSON.stringify({ id: "db-new" }));
467
+ // seed page insert (uses runNtn, not runOrThrowNtn).
468
+ runNtnMock.mockResolvedValueOnce({ code: 0, stdout: JSON.stringify({ id: "page-new", object: "page" }), stderr: "" });
469
+ const result = await ensureSiteSettingsDatabase({
470
+ apiToken: "token",
471
+ parentPageId: "page-1234-page-1234-page-1234page1234",
472
+ projectName: "digwis",
473
+ description: "desc",
474
+ defaultLocale: "en",
475
+ });
476
+ expect(result.reused).toBe(false);
477
+ expect(result.seeded).toBe(1);
478
+ expect(result.dataSourceId).toBe("ds-new");
479
+ // The description PATCH payload must include the scaffold marker.
480
+ const patchCall = runOrThrowNtnMock.mock.calls.find((call) => Array.isArray(call[0]) &&
481
+ call[0].includes("v1/databases/db-new") &&
482
+ call[0].includes("PATCH"));
483
+ expect(patchCall).toBeDefined();
484
+ const bodyArg = patchCall[0][5];
485
+ const description = JSON.parse(bodyArg).description;
486
+ expect(description[0].text.content).toContain("[notionx-scaffold] key=site-settings");
487
+ });
488
+ });
489
+ describe("site-settings builders", () => {
490
+ it("emits a 17-property schema covering the full editor surface", () => {
491
+ const properties = _internal.buildSiteSettingsProperties();
492
+ const keys = Object.keys(properties);
493
+ expect(keys).toHaveLength(17);
494
+ // Existing 5
495
+ expect(properties["Site Name"]).toEqual({ title: {} });
496
+ expect(properties.Tagline).toEqual({ rich_text: {} });
497
+ expect(properties.Description).toEqual({ rich_text: {} });
498
+ expect(properties["Default Locale"]).toEqual({ select: {} });
499
+ expect(properties["Social Image"]).toEqual({ url: {} });
500
+ // 12 new (SEO / Nav / Theme / Footer)
501
+ expect(properties["Meta Title"]).toEqual({ rich_text: {} });
502
+ expect(properties["Meta Description"]).toEqual({ rich_text: {} });
503
+ expect(properties["OG Image"]).toEqual({ url: {} });
504
+ expect(properties.Nav).toEqual({ rich_text: {} });
505
+ expect(properties["Nav CTA"]).toEqual({ rich_text: {} });
506
+ expect(properties["Primary Color"]).toEqual({ select: {} });
507
+ expect(properties["Accent Color"]).toEqual({ select: {} });
508
+ expect(properties["Font Family"]).toEqual({ select: {} });
509
+ expect(properties["Footer Columns"]).toEqual({ rich_text: {} });
510
+ expect(properties["Footer Copyright"]).toEqual({ rich_text: {} });
511
+ expect(properties["Footer Social Links"]).toEqual({ rich_text: {} });
512
+ expect(properties["Footer Tagline"]).toEqual({ rich_text: {} });
513
+ });
514
+ it("seeds the singleton row with all 17 properties", () => {
515
+ const seed = _internal.buildSiteSettingsSeedPage({
516
+ projectName: "digwis",
517
+ description: "A demo description.",
518
+ defaultLocale: "en",
519
+ dataSourceId: "ds-id",
520
+ });
521
+ const properties = seed.properties;
522
+ const titleProps = properties["Site Name"];
523
+ expect(titleProps.title[0].text.content).toBe("digwis");
524
+ const metaTitle = properties["Meta Title"];
525
+ expect(metaTitle.rich_text[0].text.content).toBe("digwis");
526
+ const nav = properties.Nav;
527
+ const parsed = JSON.parse(nav.rich_text[0].text.content);
528
+ expect(parsed[0]).toEqual({ label: "Home", href: "/" });
529
+ const theme = properties["Primary Color"];
530
+ expect(theme.select.name).toBe("slate");
531
+ const accent = properties["Accent Color"];
532
+ expect(accent.select.name).toBe("blue");
533
+ const font = properties["Font Family"];
534
+ expect(font.select.name).toBe("inter");
535
+ // Notion's 2025-09-03 schema requires `data_source_id` here.
536
+ expect(seed.parent).toEqual({
537
+ type: "data_source_id",
538
+ data_source_id: "ds-id",
539
+ });
540
+ });
541
+ });
542
+ //# sourceMappingURL=notion.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notion.test.js","sourceRoot":"","sources":["../../src/provision/notion.test.ts"],"names":[],"mappings":"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"}