@forumulate/cli 0.3.6 → 0.4.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 (68) hide show
  1. package/README.md +4 -3
  2. package/dist/cli.js +25 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/publish/api.d.ts +95 -0
  5. package/dist/publish/api.d.ts.map +1 -0
  6. package/dist/publish/api.js +265 -0
  7. package/dist/publish/api.js.map +1 -0
  8. package/dist/publish/command.d.ts +44 -0
  9. package/dist/publish/command.d.ts.map +1 -0
  10. package/dist/publish/command.js +246 -0
  11. package/dist/publish/command.js.map +1 -0
  12. package/dist/publish/compare.d.ts +45 -0
  13. package/dist/publish/compare.d.ts.map +1 -0
  14. package/dist/publish/compare.js +124 -0
  15. package/dist/publish/compare.js.map +1 -0
  16. package/dist/publish/context.d.ts +46 -0
  17. package/dist/publish/context.d.ts.map +1 -0
  18. package/dist/publish/context.js +54 -0
  19. package/dist/publish/context.js.map +1 -0
  20. package/dist/publish/docs-apply.d.ts +39 -0
  21. package/dist/publish/docs-apply.d.ts.map +1 -0
  22. package/dist/publish/docs-apply.js +178 -0
  23. package/dist/publish/docs-apply.js.map +1 -0
  24. package/dist/publish/docs-plan.d.ts +40 -0
  25. package/dist/publish/docs-plan.d.ts.map +1 -0
  26. package/dist/publish/docs-plan.js +211 -0
  27. package/dist/publish/docs-plan.js.map +1 -0
  28. package/dist/publish/docs-reconcile.d.ts +26 -0
  29. package/dist/publish/docs-reconcile.d.ts.map +1 -0
  30. package/dist/publish/docs-reconcile.js +162 -0
  31. package/dist/publish/docs-reconcile.js.map +1 -0
  32. package/dist/publish/extras.d.ts +25 -0
  33. package/dist/publish/extras.d.ts.map +1 -0
  34. package/dist/publish/extras.js +218 -0
  35. package/dist/publish/extras.js.map +1 -0
  36. package/dist/publish/frontmatter.d.ts +45 -0
  37. package/dist/publish/frontmatter.d.ts.map +1 -0
  38. package/dist/publish/frontmatter.js +265 -0
  39. package/dist/publish/frontmatter.js.map +1 -0
  40. package/dist/publish/manifest.d.ts +5 -0
  41. package/dist/publish/manifest.d.ts.map +1 -0
  42. package/dist/publish/manifest.js +144 -0
  43. package/dist/publish/manifest.js.map +1 -0
  44. package/dist/publish/posts.d.ts +39 -0
  45. package/dist/publish/posts.d.ts.map +1 -0
  46. package/dist/publish/posts.js +350 -0
  47. package/dist/publish/posts.js.map +1 -0
  48. package/dist/publish/rewrite.d.ts +20 -0
  49. package/dist/publish/rewrite.d.ts.map +1 -0
  50. package/dist/publish/rewrite.js +82 -0
  51. package/dist/publish/rewrite.js.map +1 -0
  52. package/dist/publish/scan.d.ts +25 -0
  53. package/dist/publish/scan.d.ts.map +1 -0
  54. package/dist/publish/scan.js +351 -0
  55. package/dist/publish/scan.js.map +1 -0
  56. package/dist/publish/types.d.ts +155 -0
  57. package/dist/publish/types.d.ts.map +1 -0
  58. package/dist/publish/types.js +13 -0
  59. package/dist/publish/types.js.map +1 -0
  60. package/dist/run.d.ts +10 -1
  61. package/dist/run.d.ts.map +1 -1
  62. package/dist/run.js +58 -45
  63. package/dist/run.js.map +1 -1
  64. package/package.json +3 -2
  65. package/dist/publish-dir.d.ts +0 -54
  66. package/dist/publish-dir.d.ts.map +0 -1
  67. package/dist/publish-dir.js +0 -119
  68. package/dist/publish-dir.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-reconcile.js","sourceRoot":"","sources":["../../src/publish/docs-reconcile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { type SpaceCtx } from './context';
2
+ import type { PublishApi } from './api';
3
+ import type { LiveCollection, PlanLine, SiteSpec } from './types';
4
+ /**
5
+ * The manifest's other half: everything about a space that is not a page.
6
+ *
7
+ * Each of these is compared before it is written, the way pages are: a PATCH
8
+ * of a theme that already holds every key is a write with nothing in it, and a
9
+ * publisher that writes on every run cannot tell anybody what changed.
10
+ */
11
+ /** `settings`, `name`, `visibility`: `PATCH /orgs/{o}/spaces/{s}` merges settings at the top level. */
12
+ export declare function syncSpace(ctx: SpaceCtx, apply: boolean): Promise<void>;
13
+ /** `theme`: `PATCH …/theme` deep-merges, so only the differing top-level keys are sent. */
14
+ export declare function syncTheme(ctx: SpaceCtx, apply: boolean): Promise<void>;
15
+ /**
16
+ * `openapi`: an API reference from a spec file or URL, through the importer
17
+ * that builds it atomically and converges when re-run against a changed spec.
18
+ * The collection it lands in is found by name, or created.
19
+ */
20
+ export declare function syncOpenApi(ctx: SpaceCtx, apply: boolean, manifestFile: string | null, collections: LiveCollection[]): Promise<void>;
21
+ /** `monitors`: matched by name; created, patched where they differ, pruned with `--prune`. */
22
+ export declare function syncMonitors(ctx: SpaceCtx, apply: boolean): Promise<void>;
23
+ /** `site`: `PATCH /orgs/{o}/sites/{id}` deep-merges `config`, so only differing keys are sent. */
24
+ export declare function syncSite(api: PublishApi, org: string, site: SiteSpec, apply: boolean, line: (l: PlanLine) => void): Promise<void>;
25
+ //# sourceMappingURL=extras.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extras.d.ts","sourceRoot":"","sources":["../../src/publish/extras.ts"],"names":[],"mappings":"AAIA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAElE;;;;;;GAMG;AAEH,uGAAuG;AACvG,wBAAsB,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA0B5E;AAED,2FAA2F;AAC3F,wBAAsB,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB5E;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,OAAO,EACd,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,WAAW,EAAE,cAAc,EAAE,GAC5B,OAAO,CAAC,IAAI,CAAC,CA6Df;AAED,8FAA8F;AAC9F,wBAAsB,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAyD/E;AAED,kGAAkG;AAClG,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,UAAU,EACf,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,IAAI,GAC1B,OAAO,CAAC,IAAI,CAAC,CA+Bf"}
@@ -0,0 +1,218 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.syncSpace = syncSpace;
4
+ exports.syncTheme = syncTheme;
5
+ exports.syncOpenApi = syncOpenApi;
6
+ exports.syncMonitors = syncMonitors;
7
+ exports.syncSite = syncSite;
8
+ const node_fs_1 = require("node:fs");
9
+ const node_path_1 = require("node:path");
10
+ const yaml_1 = require("yaml");
11
+ const compare_1 = require("./compare");
12
+ const context_1 = require("./context");
13
+ /**
14
+ * The manifest's other half: everything about a space that is not a page.
15
+ *
16
+ * Each of these is compared before it is written, the way pages are: a PATCH
17
+ * of a theme that already holds every key is a write with nothing in it, and a
18
+ * publisher that writes on every run cannot tell anybody what changed.
19
+ */
20
+ /** `settings`, `name`, `visibility`: `PATCH /orgs/{o}/spaces/{s}` merges settings at the top level. */
21
+ async function syncSpace(ctx, apply) {
22
+ const { spec } = ctx;
23
+ if (!ctx.only.part('settings', spec) || (!spec.settings && !spec.name && !spec.visibility))
24
+ return;
25
+ if (!ctx.api.opts.authed) {
26
+ ctx.line({ verb: 'patch', what: 'space settings', detail: 'cannot compare without a token' });
27
+ return;
28
+ }
29
+ const { space } = await ctx.api.get((0, context_1.spacePath)(ctx, ''));
30
+ const body = {};
31
+ if (spec.name && spec.name !== space.name)
32
+ body.name = spec.name;
33
+ if (spec.visibility && spec.visibility !== space.visibility)
34
+ body.visibility = spec.visibility;
35
+ const keys = spec.settings ? (0, compare_1.differingKeys)(space.settings, spec.settings) : [];
36
+ if (keys.length)
37
+ body.settings = Object.fromEntries(keys.map((k) => [k, spec.settings[k]]));
38
+ if (!Object.keys(body).length)
39
+ return;
40
+ ctx.line({
41
+ verb: 'patch',
42
+ what: 'space',
43
+ detail: [
44
+ ...Object.keys(body).filter((k) => k !== 'settings'),
45
+ ...keys.map((k) => `settings.${k}`),
46
+ ].join(', '),
47
+ });
48
+ if (apply)
49
+ await ctx.api.patch((0, context_1.spacePath)(ctx, ''), body);
50
+ }
51
+ /** `theme`: `PATCH …/theme` deep-merges, so only the differing top-level keys are sent. */
52
+ async function syncTheme(ctx, apply) {
53
+ const want = ctx.spec.theme;
54
+ if (!want || !ctx.only.part('theme', ctx.spec))
55
+ return;
56
+ let current;
57
+ if (ctx.api.opts.authed)
58
+ current = (await ctx.api.get((0, context_1.spacePath)(ctx, '/theme')))
59
+ .theme;
60
+ else {
61
+ const r = await ctx.api
62
+ .get(`/public/orgs/${ctx.org}/spaces/${ctx.spaceId}`)
63
+ .catch(() => ({ theme: undefined }));
64
+ current = r.theme;
65
+ }
66
+ const keys = (0, compare_1.differingKeys)(current, want);
67
+ if (!keys.length)
68
+ return;
69
+ ctx.line({ verb: 'patch', what: 'theme', detail: keys.join(', ') });
70
+ if (apply)
71
+ await ctx.api.patch((0, context_1.spacePath)(ctx, '/theme'), Object.fromEntries(keys.map((k) => [k, want[k]])));
72
+ }
73
+ /**
74
+ * `openapi`: an API reference from a spec file or URL, through the importer
75
+ * that builds it atomically and converges when re-run against a changed spec.
76
+ * The collection it lands in is found by name, or created.
77
+ */
78
+ async function syncOpenApi(ctx, apply, manifestFile, collections) {
79
+ if (!ctx.only.part('openapi', ctx.spec))
80
+ return;
81
+ for (const entry of ctx.spec.openapi ?? []) {
82
+ const { spec: file, url, collection, ...rest } = entry;
83
+ let spec;
84
+ if (file) {
85
+ const abs = (0, node_path_1.resolve)(manifestFile ? (0, node_path_1.dirname)(manifestFile) : ctx.root, file);
86
+ const text = (0, node_fs_1.readFileSync)(abs, 'utf8');
87
+ spec = /\.json$/i.test(abs) ? JSON.parse(text) : (0, yaml_1.parse)(text);
88
+ }
89
+ const target = collections.find((c) => c.name.toLowerCase() === collection.toLowerCase() || c.slug === collection);
90
+ const what = `openapi ${file ?? url} → "${collection}"`;
91
+ if (!ctx.api.opts.authed) {
92
+ ctx.line({
93
+ verb: 'import',
94
+ what,
95
+ detail: target ? 'replace (not compared without a token)' : 'into a new collection',
96
+ });
97
+ continue;
98
+ }
99
+ const body = {
100
+ ...rest,
101
+ ...(spec ? { spec } : { url }),
102
+ onExisting: rest.onExisting ?? 'replace',
103
+ };
104
+ if (!apply) {
105
+ if (!target) {
106
+ ctx.line({ verb: 'import', what, detail: 'into a new collection' });
107
+ continue;
108
+ }
109
+ // The importer's own dry run: writes nothing, reports collisions first.
110
+ const r = await ctx.api.opts.client.request('POST', (0, context_1.spacePath)(ctx, '/docs/openapi/import'), {
111
+ body: { ...body, collectionId: target.id, dryRun: true },
112
+ });
113
+ ctx.line({
114
+ verb: 'import',
115
+ what,
116
+ detail: `${r.created} new, ${r.replaced} replaced${r.collisions?.length ? `, collisions: ${r.collisions.join(', ')}` : ''}`,
117
+ });
118
+ continue;
119
+ }
120
+ const id = target?.id ??
121
+ (await ctx.api.post((0, context_1.spacePath)(ctx, '/collections'), {
122
+ name: collection,
123
+ })).collection.id;
124
+ const r = await ctx.api.post((0, context_1.spacePath)(ctx, '/docs/openapi/import'), { ...body, collectionId: id });
125
+ ctx.line({ verb: 'import', what, detail: `${r.created} new, ${r.replaced} replaced` });
126
+ for (const w of r.warnings ?? [])
127
+ ctx.line({ verb: 'warn', what, detail: w });
128
+ }
129
+ }
130
+ /** `monitors`: matched by name; created, patched where they differ, pruned with `--prune`. */
131
+ async function syncMonitors(ctx, apply) {
132
+ const want = ctx.spec.monitors;
133
+ if (!want || !ctx.only.part('monitors', ctx.spec))
134
+ return;
135
+ if (ctx.type !== 'STATUS') {
136
+ ctx.errors.push(`monitors belong on a STATUS space; ${ctx.spec.space} is ${ctx.type}`);
137
+ return;
138
+ }
139
+ if (!ctx.api.opts.authed) {
140
+ ctx.line({
141
+ verb: 'patch',
142
+ what: 'monitors',
143
+ detail: `${want.length} declared — cannot compare without a token`,
144
+ });
145
+ return;
146
+ }
147
+ const live = await ctx.api.all((0, context_1.spacePath)(ctx, '/status/monitors'), 'monitors', { limit: 500 });
148
+ const byName = new Map(live.map((m) => [m.name, m]));
149
+ for (const m of want) {
150
+ const name = String(m.name);
151
+ const current = byName.get(name);
152
+ if (!current) {
153
+ ctx.line({ verb: 'create', what: `monitor ${name}`, detail: String(m.url ?? m.kind ?? '') });
154
+ if (apply)
155
+ await ctx.api.post((0, context_1.spacePath)(ctx, '/status/monitors'), m);
156
+ continue;
157
+ }
158
+ // Header VALUES are write-only (the API answers with their names), so a
159
+ // monitor is compared on the names and re-sent only when those differ.
160
+ const comparable = { ...m };
161
+ const headers = comparable.requestHeaders;
162
+ delete comparable.requestHeaders;
163
+ const keys = (0, compare_1.differingKeys)(current, comparable);
164
+ if (headers &&
165
+ !(0, compare_1.holds)([...(current.requestHeaderNames ?? [])].sort(), Object.keys(headers).sort()))
166
+ keys.push('requestHeaders');
167
+ if (!keys.length)
168
+ continue;
169
+ ctx.line({ verb: 'patch', what: `monitor ${name}`, detail: keys.join(', ') });
170
+ if (apply)
171
+ await ctx.api.patch((0, context_1.spacePath)(ctx, `/status/monitors/${current.id}`), Object.fromEntries(keys.map((k) => [k, m[k]])));
172
+ }
173
+ if (!ctx.prune || !ctx.only.all)
174
+ return;
175
+ const declared = new Set(want.map((m) => String(m.name)));
176
+ for (const m of live) {
177
+ if (declared.has(m.name))
178
+ continue;
179
+ ctx.line({
180
+ verb: 'prune',
181
+ what: `monitor ${m.name}`,
182
+ detail: 'not in the manifest — its history goes with it',
183
+ });
184
+ if (apply)
185
+ await ctx.api.del((0, context_1.spacePath)(ctx, `/status/monitors/${m.id}`));
186
+ }
187
+ }
188
+ /** `site`: `PATCH /orgs/{o}/sites/{id}` deep-merges `config`, so only differing keys are sent. */
189
+ async function syncSite(api, org, site, apply, line) {
190
+ if (!api.opts.authed) {
191
+ line({
192
+ verb: 'patch',
193
+ what: `site ${site.slug ?? site.id}`,
194
+ detail: 'cannot compare without a token',
195
+ });
196
+ return;
197
+ }
198
+ const sites = await api.all(`/orgs/${org}/sites`, 'sites', { limit: 500 });
199
+ const live = sites.find((s) => s.id === site.id || s.slug === site.slug);
200
+ if (!live)
201
+ throw new Error(`No site "${site.slug ?? site.id}" in this organization (it has: ${sites.map((s) => s.slug).join(', ') || 'none'})`);
202
+ const body = {};
203
+ if (site.name && site.name !== live.name)
204
+ body.name = site.name;
205
+ const keys = site.config ? (0, compare_1.differingKeys)(live.config, site.config) : [];
206
+ if (keys.length)
207
+ body.config = Object.fromEntries(keys.map((k) => [k, site.config[k]]));
208
+ if (!Object.keys(body).length)
209
+ return;
210
+ line({
211
+ verb: 'patch',
212
+ what: `site ${live.slug}`,
213
+ detail: [...(body.name ? ['name'] : []), ...keys.map((k) => `config.${k}`)].join(', '),
214
+ });
215
+ if (apply)
216
+ await api.patch(`/orgs/${org}/sites/${live.id}`, body);
217
+ }
218
+ //# sourceMappingURL=extras.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extras.js","sourceRoot":"","sources":["../../src/publish/extras.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { MetaPatch } from './types';
2
+ export declare function splitFront(text: string): {
3
+ data: Record<string, unknown>;
4
+ body: string;
5
+ raw: string | null;
6
+ };
7
+ /**
8
+ * Put `slug: <slug>` in a file's front matter, replacing one already there.
9
+ *
10
+ * The CLI decides every address before anything is sent and DECLARES it, so
11
+ * the importer cannot disagree with the plan: its own filename rule keeps a
12
+ * `01-` prefix the CLI strips, and a plan that names one address while the
13
+ * write lands at another is the failure a dry run exists to prevent. Only the
14
+ * slug is injected. A title is not — the importer treats a declared title as
15
+ * "the body's heading is not a duplicate" and the page would show it twice.
16
+ */
17
+ export declare function declareSlug(text: string, slug: string): string;
18
+ /** `seo_title`, `seo-title`, `SeoTitle` → `seoTitle`. */
19
+ export declare function camel(key: string): string;
20
+ /**
21
+ * Every field `PATCH …/pages/{id}/metadata` takes. A front matter key that is
22
+ * one of these (in any casing) is sent as written; the API validates it.
23
+ */
24
+ export declare const PAGE_META_KEYS: readonly ["tags", "audience", "fields", "icon", "hideFromNav", "externalUrl", "navTitle", "badge", "navKind", "navFont", "searchExclude", "coverUrl", "layout", "hideTitle", "subtitle", "hideUpdated", "hideCover", "template", "hero", "tocLevels", "pageChrome", "titleAlign", "themePatch", "onThisPage", "apiMethod", "apiPage", "seoTitle", "seoDescription", "noindex", "contentLanguage", "canonicalUrl", "hideFeedback", "editUrl", "sourcePath", "pager", "hidePager", "keywords", "commentsEnabled", "customCss", "theme", "shareImageUrl", "ogTitle", "ogDescription", "twitterCard", "jsonLd"];
25
+ /** Keys that position a page among its siblings. Read here, never sent. */
26
+ export declare const ORDER_KEYS: string[];
27
+ /** A front matter `order`, wherever the tool put it. */
28
+ export declare function declaredOrder(data: Record<string, unknown>): number | undefined;
29
+ /** A front matter `draft: true` — the page is left out, and the plan says so. */
30
+ export declare function isDraft(data: Record<string, unknown>): boolean;
31
+ /**
32
+ * Front matter → the metadata patch for a docs page.
33
+ *
34
+ * `fieldKeys` are the parameters the space's type declares (`audience`,
35
+ * `appliesTo`, `deprecated` for docs); those go under `fields`, everything the
36
+ * page model takes goes at the top, `metadata:` is an escape hatch merged as
37
+ * written, and the rest is returned as `unknown` for the plan to name. A key
38
+ * nobody reads, published silently, is how a page ships without the thing its
39
+ * author thought they set.
40
+ */
41
+ export declare function pageMeta(data: Record<string, unknown>, fieldKeys: string[]): {
42
+ meta: MetaPatch;
43
+ unknown: string[];
44
+ };
45
+ //# sourceMappingURL=frontmatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../src/publish/frontmatter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAczC,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG;IACxC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB,CAeA;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAK9D;AAED,yDAAyD;AACzD,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAUzC;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,6kBA8CjB,CAAC;AA4BX,2EAA2E;AAC3E,eAAO,MAAM,UAAU,UAAiE,CAAC;AAsDzF,wDAAwD;AACxD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAO/E;AAED,iFAAiF;AACjF,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAE9D;AAED;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,SAAS,EAAE,MAAM,EAAE,GAClB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CA+CxC"}
@@ -0,0 +1,265 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ORDER_KEYS = exports.PAGE_META_KEYS = void 0;
4
+ exports.splitFront = splitFront;
5
+ exports.declareSlug = declareSlug;
6
+ exports.camel = camel;
7
+ exports.declaredOrder = declaredOrder;
8
+ exports.isDraft = isDraft;
9
+ exports.pageMeta = pageMeta;
10
+ const yaml_1 = require("yaml");
11
+ /**
12
+ * Front matter, read as the YAML it is.
13
+ *
14
+ * The directory publisher this replaces read `key: value` lines and nothing
15
+ * else, so `tags:` written as a list (which is how every static-site generator
16
+ * writes it) arrived as an empty string and a `hero:` block vanished. Four
17
+ * customers wrote their own publishers rather than live with that. A file that
18
+ * is not valid YAML is an error naming the file, not a silently empty map: a
19
+ * page published without the icon its author gave it is a bug nobody reports.
20
+ */
21
+ const FRONT = /^\ufeff?---\r?\n([\s\S]*?)\r?\n---[ \t]*(?:\r?\n|$)/;
22
+ function splitFront(text) {
23
+ const m = FRONT.exec(text);
24
+ if (!m)
25
+ return { data: {}, body: text, raw: null };
26
+ const parsed = (0, yaml_1.parse)(m[1] ?? '');
27
+ if (parsed !== null &&
28
+ parsed !== undefined &&
29
+ (typeof parsed !== 'object' || Array.isArray(parsed)))
30
+ throw new Error('front matter is not a map of keys');
31
+ return {
32
+ data: (parsed ?? {}),
33
+ body: text.slice(m[0].length),
34
+ raw: m[1] ?? '',
35
+ };
36
+ }
37
+ /**
38
+ * Put `slug: <slug>` in a file's front matter, replacing one already there.
39
+ *
40
+ * The CLI decides every address before anything is sent and DECLARES it, so
41
+ * the importer cannot disagree with the plan: its own filename rule keeps a
42
+ * `01-` prefix the CLI strips, and a plan that names one address while the
43
+ * write lands at another is the failure a dry run exists to prevent. Only the
44
+ * slug is injected. A title is not — the importer treats a declared title as
45
+ * "the body's heading is not a duplicate" and the page would show it twice.
46
+ */
47
+ function declareSlug(text, slug) {
48
+ const m = FRONT.exec(text);
49
+ if (!m)
50
+ return `---\nslug: ${slug}\n---\n${text}`;
51
+ const lines = (m[1] ?? '').split(/\r?\n/).filter((l) => !/^slug\s*:/i.test(l));
52
+ return `---\n${[...lines, `slug: ${slug}`].join('\n')}\n---\n${text.slice(m[0].length)}`;
53
+ }
54
+ /** `seo_title`, `seo-title`, `SeoTitle` → `seoTitle`. */
55
+ function camel(key) {
56
+ const parts = key
57
+ .trim()
58
+ .split(/[-_\s]+/)
59
+ .filter(Boolean);
60
+ return parts
61
+ .map((p, i) => i === 0 ? p.charAt(0).toLowerCase() + p.slice(1) : p.charAt(0).toUpperCase() + p.slice(1))
62
+ .join('');
63
+ }
64
+ /**
65
+ * Every field `PATCH …/pages/{id}/metadata` takes. A front matter key that is
66
+ * one of these (in any casing) is sent as written; the API validates it.
67
+ */
68
+ exports.PAGE_META_KEYS = [
69
+ 'tags',
70
+ 'audience',
71
+ 'fields',
72
+ 'icon',
73
+ 'hideFromNav',
74
+ 'externalUrl',
75
+ 'navTitle',
76
+ 'badge',
77
+ 'navKind',
78
+ 'navFont',
79
+ 'searchExclude',
80
+ 'coverUrl',
81
+ 'layout',
82
+ 'hideTitle',
83
+ 'subtitle',
84
+ 'hideUpdated',
85
+ 'hideCover',
86
+ 'template',
87
+ 'hero',
88
+ 'tocLevels',
89
+ 'pageChrome',
90
+ 'titleAlign',
91
+ 'themePatch',
92
+ 'onThisPage',
93
+ 'apiMethod',
94
+ 'apiPage',
95
+ 'seoTitle',
96
+ 'seoDescription',
97
+ 'noindex',
98
+ 'contentLanguage',
99
+ 'canonicalUrl',
100
+ 'hideFeedback',
101
+ 'editUrl',
102
+ 'sourcePath',
103
+ 'pager',
104
+ 'hidePager',
105
+ 'keywords',
106
+ 'commentsEnabled',
107
+ 'customCss',
108
+ 'theme',
109
+ 'shareImageUrl',
110
+ 'ogTitle',
111
+ 'ogDescription',
112
+ 'twitterCard',
113
+ 'jsonLd',
114
+ ];
115
+ const META_BY_LOWER = new Map(exports.PAGE_META_KEYS.map((k) => [k.toLowerCase(), k]));
116
+ /**
117
+ * The names other tools use for the same idea, so a Docusaurus, Jekyll, Hugo
118
+ * or MkDocs tree publishes without being rewritten first.
119
+ */
120
+ const ALIASES = {
121
+ description: 'seoDescription',
122
+ summary: 'seoDescription',
123
+ sidebarlabel: 'navTitle',
124
+ navlabel: 'navTitle',
125
+ shorttitle: 'navTitle',
126
+ linktitle: 'navTitle',
127
+ hidden: 'hideFromNav',
128
+ navexclude: 'hideFromNav',
129
+ sidebarhidden: 'hideFromNav',
130
+ image: 'coverUrl',
131
+ cover: 'coverUrl',
132
+ coverimage: 'coverUrl',
133
+ ogimage: 'shareImageUrl',
134
+ socialimage: 'shareImageUrl',
135
+ canonical: 'canonicalUrl',
136
+ lang: 'contentLanguage',
137
+ language: 'contentLanguage',
138
+ toc: 'onThisPage',
139
+ };
140
+ /** Keys that position a page among its siblings. Read here, never sent. */
141
+ exports.ORDER_KEYS = ['order', 'sidebarposition', 'navorder', 'weight', 'position'];
142
+ /**
143
+ * Keys the importer itself reads (`title`, `slug`, `redirect_from`, `author`,
144
+ * `api`) or that only mean something to the tool a tree came from. Neither is
145
+ * an "unknown key" worth a warning.
146
+ */
147
+ const HANDLED = new Set([
148
+ 'title',
149
+ 'slug',
150
+ 'redirectfrom',
151
+ 'author',
152
+ 'api',
153
+ 'openapi',
154
+ 'draft',
155
+ 'metadata',
156
+ 'id',
157
+ 'permalink',
158
+ 'parent',
159
+ 'haschildren',
160
+ 'grandparent',
161
+ 'sidebarclassname',
162
+ 'paginationnext',
163
+ 'paginationprev',
164
+ 'date',
165
+ 'lastmod',
166
+ 'authors',
167
+ 'type',
168
+ 'kind',
169
+ 'menu',
170
+ 'url',
171
+ 'aliases',
172
+ ...exports.ORDER_KEYS,
173
+ ]);
174
+ /** Enumerated fields whose other-tool spellings must not reach the API as a 422. */
175
+ const ENUMS = {
176
+ layout: ['narrow', 'default', 'wide', 'full', 'center', 'custom'],
177
+ template: ['doc', 'splash'],
178
+ titleAlign: ['start', 'center'],
179
+ };
180
+ /** `a, b` and `[a, b]` and a YAML list all mean the same list. */
181
+ function list(v) {
182
+ if (Array.isArray(v))
183
+ return v.map((x) => String(x).trim()).filter(Boolean);
184
+ if (typeof v === 'string')
185
+ return v
186
+ .replace(/^\[|\]$/g, '')
187
+ .split(',')
188
+ .map((s) => s.trim())
189
+ .filter(Boolean);
190
+ return undefined;
191
+ }
192
+ /** A front matter `order`, wherever the tool put it. */
193
+ function declaredOrder(data) {
194
+ for (const [k, v] of Object.entries(data)) {
195
+ if (!exports.ORDER_KEYS.includes(k.toLowerCase().replace(/[-_]/g, '')))
196
+ continue;
197
+ const n = typeof v === 'number' ? v : Number(v);
198
+ if (Number.isFinite(n))
199
+ return n;
200
+ }
201
+ return undefined;
202
+ }
203
+ /** A front matter `draft: true` — the page is left out, and the plan says so. */
204
+ function isDraft(data) {
205
+ return data.draft === true || data.draft === 'true';
206
+ }
207
+ /**
208
+ * Front matter → the metadata patch for a docs page.
209
+ *
210
+ * `fieldKeys` are the parameters the space's type declares (`audience`,
211
+ * `appliesTo`, `deprecated` for docs); those go under `fields`, everything the
212
+ * page model takes goes at the top, `metadata:` is an escape hatch merged as
213
+ * written, and the rest is returned as `unknown` for the plan to name. A key
214
+ * nobody reads, published silently, is how a page ships without the thing its
215
+ * author thought they set.
216
+ */
217
+ function pageMeta(data, fieldKeys) {
218
+ const meta = {};
219
+ const fields = {};
220
+ const unknown = [];
221
+ const declared = new Map(fieldKeys.map((k) => [k.toLowerCase(), k]));
222
+ for (const [rawKey, value] of Object.entries(data)) {
223
+ const lower = rawKey.toLowerCase().replace(/[-_\s]/g, '');
224
+ if (lower === 'metadata' && value && typeof value === 'object') {
225
+ Object.assign(meta, value);
226
+ continue;
227
+ }
228
+ // A declared parameter wins over a same-named page field: `audience:
229
+ // Administrators` is "written for", not the audience gate (an object).
230
+ const field = declared.get(lower);
231
+ if (field &&
232
+ field !== 'author' &&
233
+ !(lower === 'audience' && value && typeof value === 'object')) {
234
+ fields[field] = value;
235
+ continue;
236
+ }
237
+ if (HANDLED.has(lower))
238
+ continue;
239
+ const key = META_BY_LOWER.get(lower) ?? ALIASES[lower] ?? META_BY_LOWER.get(camel(rawKey).toLowerCase());
240
+ if (!key) {
241
+ unknown.push(rawKey);
242
+ continue;
243
+ }
244
+ if (key === 'tags' || key === 'keywords') {
245
+ const l = list(value);
246
+ if (l)
247
+ meta[key] = l;
248
+ continue;
249
+ }
250
+ const allowed = ENUMS[key];
251
+ if (allowed && !allowed.includes(String(value))) {
252
+ unknown.push(`${rawKey} (${String(value)} is not one of ${allowed.join('/')})`);
253
+ continue;
254
+ }
255
+ if (key === 'onThisPage' && typeof value === 'boolean') {
256
+ meta[key] = value ? 'always' : 'never';
257
+ continue;
258
+ }
259
+ meta[key] = value instanceof Date ? value.toISOString() : value;
260
+ }
261
+ if (Object.keys(fields).length)
262
+ meta.fields = { ...(meta.fields ?? {}), ...fields };
263
+ return { meta, unknown };
264
+ }
265
+ //# sourceMappingURL=frontmatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/publish/frontmatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Manifest } from './types';
2
+ export declare function findManifest(root: string, explicit?: string): string | null;
3
+ /** Read and check the manifest; `null` file → the one-space default. */
4
+ export declare function loadManifest(file: string | null): Manifest;
5
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/publish/manifest.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAuB,MAAM,SAAS,CAAC;AAwC7D,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAW3E;AAmDD,wEAAwE;AACxE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,QAAQ,CA2B1D"}