@forumulate/cli 0.8.0 → 0.10.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 (286) hide show
  1. package/README.md +11 -3
  2. package/dist/api/args.d.ts.map +1 -1
  3. package/dist/api/args.js +1 -0
  4. package/dist/api/args.js.map +1 -1
  5. package/dist/api/command.d.ts +1 -1
  6. package/dist/api/command.d.ts.map +1 -1
  7. package/dist/api/command.js +86 -11
  8. package/dist/api/command.js.map +1 -1
  9. package/dist/api/http.d.ts +8 -0
  10. package/dist/api/http.d.ts.map +1 -1
  11. package/dist/api/http.js +3 -2
  12. package/dist/api/http.js.map +1 -1
  13. package/dist/api/live-spec.d.ts +48 -0
  14. package/dist/api/live-spec.d.ts.map +1 -0
  15. package/dist/api/live-spec.js +72 -0
  16. package/dist/api/live-spec.js.map +1 -0
  17. package/dist/api/operations.json +1 -1
  18. package/dist/api/request.d.ts.map +1 -1
  19. package/dist/api/request.js +25 -1
  20. package/dist/api/request.js.map +1 -1
  21. package/dist/api/send.d.ts +10 -1
  22. package/dist/api/send.d.ts.map +1 -1
  23. package/dist/api/send.js +14 -3
  24. package/dist/api/send.js.map +1 -1
  25. package/dist/api/slim.d.ts +14 -0
  26. package/dist/api/slim.d.ts.map +1 -0
  27. package/dist/api/slim.js +174 -0
  28. package/dist/api/slim.js.map +1 -0
  29. package/dist/cache-command.d.ts +12 -0
  30. package/dist/cache-command.d.ts.map +1 -0
  31. package/dist/cache-command.js +93 -0
  32. package/dist/cache-command.js.map +1 -0
  33. package/dist/check/command.d.ts +48 -0
  34. package/dist/check/command.d.ts.map +1 -0
  35. package/dist/check/command.js +256 -0
  36. package/dist/check/command.js.map +1 -0
  37. package/dist/check/external.d.ts +66 -0
  38. package/dist/check/external.d.ts.map +1 -0
  39. package/dist/check/external.js +177 -0
  40. package/dist/check/external.js.map +1 -0
  41. package/dist/check/markdown-links.d.ts +38 -0
  42. package/dist/check/markdown-links.d.ts.map +1 -0
  43. package/dist/check/markdown-links.js +166 -0
  44. package/dist/check/markdown-links.js.map +1 -0
  45. package/dist/cli.js +42 -7
  46. package/dist/cli.js.map +1 -1
  47. package/dist/commands/completion.d.ts.map +1 -1
  48. package/dist/commands/completion.js +17 -0
  49. package/dist/commands/completion.js.map +1 -1
  50. package/dist/commands/context.d.ts.map +1 -1
  51. package/dist/commands/context.js +6 -2
  52. package/dist/commands/context.js.map +1 -1
  53. package/dist/commands/groups-api.d.ts.map +1 -1
  54. package/dist/commands/groups-api.js +20 -2
  55. package/dist/commands/groups-api.js.map +1 -1
  56. package/dist/commands/groups-docs.d.ts.map +1 -1
  57. package/dist/commands/groups-docs.js +8 -2
  58. package/dist/commands/groups-docs.js.map +1 -1
  59. package/dist/commands/groups-jobs.d.ts +10 -0
  60. package/dist/commands/groups-jobs.d.ts.map +1 -0
  61. package/dist/commands/groups-jobs.js +89 -0
  62. package/dist/commands/groups-jobs.js.map +1 -0
  63. package/dist/commands/groups-org.d.ts.map +1 -1
  64. package/dist/commands/groups-org.js +59 -2
  65. package/dist/commands/groups-org.js.map +1 -1
  66. package/dist/commands/groups-site.d.ts.map +1 -1
  67. package/dist/commands/groups-site.js +47 -10
  68. package/dist/commands/groups-site.js.map +1 -1
  69. package/dist/commands/groups-spaces.d.ts.map +1 -1
  70. package/dist/commands/groups-spaces.js +11 -5
  71. package/dist/commands/groups-spaces.js.map +1 -1
  72. package/dist/commands/groups-types.d.ts.map +1 -1
  73. package/dist/commands/groups-types.js +74 -0
  74. package/dist/commands/groups-types.js.map +1 -1
  75. package/dist/commands/groups.d.ts.map +1 -1
  76. package/dist/commands/groups.js +2 -0
  77. package/dist/commands/groups.js.map +1 -1
  78. package/dist/commands/index.d.ts +9 -0
  79. package/dist/commands/index.d.ts.map +1 -1
  80. package/dist/commands/index.js +18 -3
  81. package/dist/commands/index.js.map +1 -1
  82. package/dist/commands/job-wait.d.ts +64 -0
  83. package/dist/commands/job-wait.d.ts.map +1 -0
  84. package/dist/commands/job-wait.js +91 -0
  85. package/dist/commands/job-wait.js.map +1 -0
  86. package/dist/commands/resource.d.ts +19 -0
  87. package/dist/commands/resource.d.ts.map +1 -1
  88. package/dist/commands/resource.js +65 -3
  89. package/dist/commands/resource.js.map +1 -1
  90. package/dist/content/library.d.ts +8 -0
  91. package/dist/content/library.d.ts.map +1 -1
  92. package/dist/content/library.js +10 -2
  93. package/dist/content/library.js.map +1 -1
  94. package/dist/credentials.d.ts +43 -4
  95. package/dist/credentials.d.ts.map +1 -1
  96. package/dist/credentials.js +67 -4
  97. package/dist/credentials.js.map +1 -1
  98. package/dist/dev/command.d.ts +41 -0
  99. package/dist/dev/command.d.ts.map +1 -0
  100. package/dist/dev/command.js +158 -0
  101. package/dist/dev/command.js.map +1 -0
  102. package/dist/doctor/address-checks.d.ts +56 -0
  103. package/dist/doctor/address-checks.d.ts.map +1 -0
  104. package/dist/doctor/address-checks.js +183 -0
  105. package/dist/doctor/address-checks.js.map +1 -0
  106. package/dist/doctor/boilerplate.d.ts +33 -0
  107. package/dist/doctor/boilerplate.d.ts.map +1 -0
  108. package/dist/doctor/boilerplate.js +78 -0
  109. package/dist/doctor/boilerplate.js.map +1 -0
  110. package/dist/doctor/command.d.ts +18 -0
  111. package/dist/doctor/command.d.ts.map +1 -0
  112. package/dist/doctor/command.js +234 -0
  113. package/dist/doctor/command.js.map +1 -0
  114. package/dist/doctor/crawl.d.ts +49 -0
  115. package/dist/doctor/crawl.d.ts.map +1 -0
  116. package/dist/doctor/crawl.js +210 -0
  117. package/dist/doctor/crawl.js.map +1 -0
  118. package/dist/doctor/extended.d.ts +52 -0
  119. package/dist/doctor/extended.d.ts.map +1 -0
  120. package/dist/doctor/extended.js +150 -0
  121. package/dist/doctor/extended.js.map +1 -0
  122. package/dist/doctor/page-checks.d.ts +42 -0
  123. package/dist/doctor/page-checks.d.ts.map +1 -0
  124. package/dist/doctor/page-checks.js +200 -0
  125. package/dist/doctor/page-checks.js.map +1 -0
  126. package/dist/doctor/probe.d.ts +63 -0
  127. package/dist/doctor/probe.d.ts.map +1 -0
  128. package/dist/doctor/probe.js +170 -0
  129. package/dist/doctor/probe.js.map +1 -0
  130. package/dist/doctor/reader-auth-atlas.d.ts +18 -0
  131. package/dist/doctor/reader-auth-atlas.d.ts.map +1 -0
  132. package/dist/doctor/reader-auth-atlas.js +50 -0
  133. package/dist/doctor/reader-auth-atlas.js.map +1 -0
  134. package/dist/doctor/robots-params.d.ts +36 -0
  135. package/dist/doctor/robots-params.d.ts.map +1 -0
  136. package/dist/doctor/robots-params.js +97 -0
  137. package/dist/doctor/robots-params.js.map +1 -0
  138. package/dist/doctor/site.d.ts +42 -0
  139. package/dist/doctor/site.d.ts.map +1 -0
  140. package/dist/doctor/site.js +82 -0
  141. package/dist/doctor/site.js.map +1 -0
  142. package/dist/doctor.d.ts +21 -0
  143. package/dist/doctor.d.ts.map +1 -1
  144. package/dist/doctor.js +94 -3
  145. package/dist/doctor.js.map +1 -1
  146. package/dist/exit-codes.d.ts +40 -0
  147. package/dist/exit-codes.d.ts.map +1 -0
  148. package/dist/exit-codes.js +66 -0
  149. package/dist/exit-codes.js.map +1 -0
  150. package/dist/help-commands.d.ts +13 -0
  151. package/dist/help-commands.d.ts.map +1 -0
  152. package/dist/help-commands.js +215 -0
  153. package/dist/help-commands.js.map +1 -0
  154. package/dist/help.d.ts +1 -1
  155. package/dist/help.d.ts.map +1 -1
  156. package/dist/help.js +74 -11
  157. package/dist/help.js.map +1 -1
  158. package/dist/io.d.ts +33 -0
  159. package/dist/io.d.ts.map +1 -0
  160. package/dist/io.js +81 -0
  161. package/dist/io.js.map +1 -0
  162. package/dist/preview-comment.d.ts +20 -0
  163. package/dist/preview-comment.d.ts.map +1 -0
  164. package/dist/preview-comment.js +88 -0
  165. package/dist/preview-comment.js.map +1 -0
  166. package/dist/publish/about.d.ts +23 -0
  167. package/dist/publish/about.d.ts.map +1 -0
  168. package/dist/publish/about.js +66 -0
  169. package/dist/publish/about.js.map +1 -0
  170. package/dist/publish/api.d.ts +30 -12
  171. package/dist/publish/api.d.ts.map +1 -1
  172. package/dist/publish/api.js +62 -10
  173. package/dist/publish/api.js.map +1 -1
  174. package/dist/publish/client.d.ts +19 -0
  175. package/dist/publish/client.d.ts.map +1 -0
  176. package/dist/publish/client.js +3 -0
  177. package/dist/publish/client.js.map +1 -0
  178. package/dist/publish/command.d.ts +51 -2
  179. package/dist/publish/command.d.ts.map +1 -1
  180. package/dist/publish/command.js +157 -17
  181. package/dist/publish/command.js.map +1 -1
  182. package/dist/publish/context.d.ts +12 -1
  183. package/dist/publish/context.d.ts.map +1 -1
  184. package/dist/publish/context.js.map +1 -1
  185. package/dist/publish/diff.d.ts +21 -0
  186. package/dist/publish/diff.d.ts.map +1 -0
  187. package/dist/publish/diff.js +96 -0
  188. package/dist/publish/diff.js.map +1 -0
  189. package/dist/publish/docs-apply.d.ts +8 -1
  190. package/dist/publish/docs-apply.d.ts.map +1 -1
  191. package/dist/publish/docs-apply.js +49 -10
  192. package/dist/publish/docs-apply.js.map +1 -1
  193. package/dist/publish/docs-plan.d.ts +16 -3
  194. package/dist/publish/docs-plan.d.ts.map +1 -1
  195. package/dist/publish/docs-plan.js +57 -6
  196. package/dist/publish/docs-plan.js.map +1 -1
  197. package/dist/publish/extras.d.ts +10 -0
  198. package/dist/publish/extras.d.ts.map +1 -1
  199. package/dist/publish/extras.js +54 -2
  200. package/dist/publish/extras.js.map +1 -1
  201. package/dist/publish/frontmatter.d.ts +1 -1
  202. package/dist/publish/frontmatter.d.ts.map +1 -1
  203. package/dist/publish/frontmatter.js +1 -0
  204. package/dist/publish/frontmatter.js.map +1 -1
  205. package/dist/publish/index.d.ts +12 -0
  206. package/dist/publish/index.d.ts.map +1 -0
  207. package/dist/publish/index.js +17 -0
  208. package/dist/publish/index.js.map +1 -0
  209. package/dist/publish/manifest.d.ts.map +1 -1
  210. package/dist/publish/manifest.js +48 -3
  211. package/dist/publish/manifest.js.map +1 -1
  212. package/dist/publish/names.d.ts +28 -0
  213. package/dist/publish/names.d.ts.map +1 -0
  214. package/dist/publish/names.js +80 -0
  215. package/dist/publish/names.js.map +1 -0
  216. package/dist/publish/posts.d.ts.map +1 -1
  217. package/dist/publish/posts.js +46 -13
  218. package/dist/publish/posts.js.map +1 -1
  219. package/dist/publish/preview.d.ts +56 -0
  220. package/dist/publish/preview.d.ts.map +1 -0
  221. package/dist/publish/preview.js +133 -0
  222. package/dist/publish/preview.js.map +1 -0
  223. package/dist/publish/redirects.d.ts +13 -0
  224. package/dist/publish/redirects.d.ts.map +1 -0
  225. package/dist/publish/redirects.js +154 -0
  226. package/dist/publish/redirects.js.map +1 -0
  227. package/dist/publish/reserved.d.ts +49 -0
  228. package/dist/publish/reserved.d.ts.map +1 -0
  229. package/dist/publish/reserved.js +118 -0
  230. package/dist/publish/reserved.js.map +1 -0
  231. package/dist/publish/rewrite.d.ts +12 -0
  232. package/dist/publish/rewrite.d.ts.map +1 -1
  233. package/dist/publish/rewrite.js +22 -0
  234. package/dist/publish/rewrite.js.map +1 -1
  235. package/dist/publish/scan-docs.d.ts +10 -0
  236. package/dist/publish/scan-docs.d.ts.map +1 -0
  237. package/dist/publish/scan-docs.js +160 -0
  238. package/dist/publish/scan-docs.js.map +1 -0
  239. package/dist/publish/scan.d.ts +21 -17
  240. package/dist/publish/scan.d.ts.map +1 -1
  241. package/dist/publish/scan.js +99 -232
  242. package/dist/publish/scan.js.map +1 -1
  243. package/dist/publish/slots.d.ts +39 -0
  244. package/dist/publish/slots.d.ts.map +1 -0
  245. package/dist/publish/slots.js +64 -0
  246. package/dist/publish/slots.js.map +1 -0
  247. package/dist/publish/studio-edits.d.ts +25 -0
  248. package/dist/publish/studio-edits.d.ts.map +1 -0
  249. package/dist/publish/studio-edits.js +53 -0
  250. package/dist/publish/studio-edits.js.map +1 -0
  251. package/dist/publish/tags.d.ts +9 -0
  252. package/dist/publish/tags.d.ts.map +1 -0
  253. package/dist/publish/tags.js +194 -0
  254. package/dist/publish/tags.js.map +1 -0
  255. package/dist/publish/types.d.ts +84 -1
  256. package/dist/publish/types.d.ts.map +1 -1
  257. package/dist/publish/types.js +0 -10
  258. package/dist/publish/types.js.map +1 -1
  259. package/dist/publish-command.d.ts +55 -0
  260. package/dist/publish-command.d.ts.map +1 -0
  261. package/dist/publish-command.js +197 -0
  262. package/dist/publish-command.js.map +1 -0
  263. package/dist/run.d.ts +3 -10
  264. package/dist/run.d.ts.map +1 -1
  265. package/dist/run.js +171 -112
  266. package/dist/run.js.map +1 -1
  267. package/dist/translations/target.d.ts.map +1 -1
  268. package/dist/translations/target.js +2 -2
  269. package/dist/translations/target.js.map +1 -1
  270. package/dist/validate.d.ts +39 -0
  271. package/dist/validate.d.ts.map +1 -0
  272. package/dist/validate.js +166 -0
  273. package/dist/validate.js.map +1 -0
  274. package/dist/version.d.ts +8 -0
  275. package/dist/version.d.ts.map +1 -0
  276. package/dist/version.js +11 -0
  277. package/dist/version.js.map +1 -0
  278. package/dist/whoami.d.ts +41 -0
  279. package/dist/whoami.d.ts.map +1 -0
  280. package/dist/whoami.js +161 -0
  281. package/dist/whoami.js.map +1 -0
  282. package/package.json +2 -2
  283. package/dist/publish-dir.d.ts +0 -54
  284. package/dist/publish-dir.d.ts.map +0 -1
  285. package/dist/publish-dir.js +0 -119
  286. package/dist/publish-dir.js.map +0 -1
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VALIDATE_HELP = exports.SCHEMA_VERSION = void 0;
4
+ exports.collectDocuments = collectDocuments;
5
+ exports.runValidateCommand = runValidateCommand;
6
+ const node_fs_1 = require("node:fs");
7
+ const node_path_1 = require("node:path");
8
+ const yaml_1 = require("yaml");
9
+ const http_1 = require("./api/http");
10
+ const api_base_1 = require("./api-base");
11
+ const credentials_1 = require("./credentials");
12
+ const exit_codes_1 = require("./exit-codes");
13
+ const reserved_1 = require("./publish/reserved");
14
+ const frontmatter_1 = require("./publish/frontmatter");
15
+ /**
16
+ * `forumulate validate <dir>` (FMU-D11): check a folder's configuration
17
+ * against the published schemas before publishing it.
18
+ *
19
+ * Reads the manifest (`forumulate.yaml`), the front matter of every Markdown
20
+ * file, and any JSON/YAML file whose `$schema` names one of our schemas
21
+ * (`https://forumulate.com/schemas/<date>/<name>.json`) — a theme kept in
22
+ * git, a site config — and sends them to `POST /schemas/<date>/validate`.
23
+ * The server holds the zod schemas the API validates writes with, so this
24
+ * answers exactly what the publish would, did-you-mean included, without the
25
+ * CLI carrying a second copy of every schema. No token needed.
26
+ */
27
+ exports.SCHEMA_VERSION = '2026-12-01';
28
+ const SCHEMA_NAMES = ['site-config', 'space-theme', 'forumulate-yaml', 'front-matter', 'forum-category'];
29
+ const SCHEMA_URL = /\/schemas\/(\d{4}-\d{2}-\d{2})\/([a-z-]+)\.json$/;
30
+ const SKIP_DIRS = new Set(['node_modules', '.git', 'dist', 'build', '.next', '.cache']);
31
+ const MAX_FILES = 5000;
32
+ const BATCH = 400;
33
+ exports.VALIDATE_HELP = `forumulate validate — check a folder's configuration against the published schemas
34
+
35
+ Usage:
36
+ forumulate validate [dir] [--json]
37
+
38
+ Checks forumulate.yaml, every Markdown file's front matter, and any JSON or YAML
39
+ file whose "$schema" names https://forumulate.com/schemas/${exports.SCHEMA_VERSION}/<name>.json
40
+ (site-config, space-theme, forumulate-yaml, front-matter, forum-category).
41
+ Each problem is printed with its file, key path and did-you-mean. Unknown
42
+ front matter keys are warnings (they are ignored on publish); everything else
43
+ is an error.
44
+
45
+ ${exit_codes_1.EXIT_CODES_HELP}
46
+ (validate: 0 when every document is valid, 2 when one is not)`;
47
+ function walk(dir, out = []) {
48
+ for (const name of (0, node_fs_1.readdirSync)(dir).sort()) {
49
+ if (out.length >= MAX_FILES)
50
+ break;
51
+ if (SKIP_DIRS.has(name) || name.startsWith('.'))
52
+ continue;
53
+ const p = (0, node_path_1.join)(dir, name);
54
+ if ((0, node_fs_1.statSync)(p).isDirectory())
55
+ walk(p, out);
56
+ else
57
+ out.push(p);
58
+ }
59
+ return out;
60
+ }
61
+ /** The documents a folder holds, each with the schema it is checked against. */
62
+ function collectDocuments(root, files, problems) {
63
+ const docs = [];
64
+ for (const path of files.list(root)) {
65
+ const rel = (0, node_path_1.relative)(root, path) || path;
66
+ const base = rel.split(/[\\/]/).pop() ?? rel;
67
+ const ext = (0, node_path_1.extname)(base).toLowerCase();
68
+ try {
69
+ if (reserved_1.MANIFEST_NAMES.includes(base) && !rel.includes('/') && !rel.includes('\\')) {
70
+ const text = files.read(path);
71
+ docs.push({ schema: 'forumulate-yaml', document: ext === '.json' ? JSON.parse(text) : (0, yaml_1.parse)(text), source: rel });
72
+ }
73
+ else if (ext === '.md' || ext === '.mdx') {
74
+ const { data, raw } = (0, frontmatter_1.splitFront)(files.read(path));
75
+ if (raw !== null)
76
+ docs.push({ schema: 'front-matter', document: data, source: rel });
77
+ }
78
+ else if (ext === '.json' || ext === '.yaml' || ext === '.yml') {
79
+ const text = files.read(path);
80
+ if (!text.includes('/schemas/'))
81
+ continue;
82
+ const doc = (ext === '.json' ? JSON.parse(text) : (0, yaml_1.parse)(text));
83
+ const m = typeof doc?.$schema === 'string' ? SCHEMA_URL.exec(doc.$schema) : null;
84
+ if (!m || !SCHEMA_NAMES.includes(m[2]))
85
+ continue;
86
+ if (m[1] !== exports.SCHEMA_VERSION)
87
+ problems.push(`${rel}: names schemas of ${m[1]}; this CLI checks ${exports.SCHEMA_VERSION}.`);
88
+ const { $schema: _s, ...rest } = doc;
89
+ docs.push({ schema: m[2], document: rest, source: rel });
90
+ }
91
+ }
92
+ catch (e) {
93
+ problems.push(`${rel}: ${e.message}`);
94
+ }
95
+ }
96
+ return docs;
97
+ }
98
+ async function runValidateCommand(argv, deps) {
99
+ if (argv.includes('--help') || argv.includes('-h')) {
100
+ deps.out(exports.VALIDATE_HELP);
101
+ return exit_codes_1.EXIT.OK;
102
+ }
103
+ const json = argv.includes('--json');
104
+ const positionals = argv.filter((a) => !a.startsWith('--'));
105
+ if (positionals.length > 1) {
106
+ deps.err('Usage: forumulate validate [dir] [--json]');
107
+ return exit_codes_1.EXIT.USAGE;
108
+ }
109
+ const root = (0, node_path_1.resolve)(positionals[0] ?? '.');
110
+ const files = deps.files ?? {
111
+ list: (d) => walk(d),
112
+ read: (p) => (0, node_fs_1.readFileSync)(p, 'utf8'),
113
+ };
114
+ const problems = [];
115
+ let docs;
116
+ try {
117
+ docs = collectDocuments(root, files, problems);
118
+ }
119
+ catch (e) {
120
+ deps.err(`Cannot read ${root}: ${e.message}`);
121
+ return exit_codes_1.EXIT.USAGE;
122
+ }
123
+ const env = deps.env ?? process.env;
124
+ const baseUrl = (0, api_base_1.apiBaseFromEnv)(env);
125
+ const http = deps.http ??
126
+ new http_1.Http({
127
+ baseUrl,
128
+ token: (0, credentials_1.resolveToken)(baseUrl, env, deps.flagToken),
129
+ userAgent: deps.userAgent ?? '@forumulate/cli',
130
+ });
131
+ const results = [];
132
+ try {
133
+ for (let i = 0; i < docs.length; i += BATCH) {
134
+ const res = await http.send({
135
+ method: 'POST',
136
+ path: `/schemas/${exports.SCHEMA_VERSION}/validate`,
137
+ body: { documents: docs.slice(i, i + BATCH) },
138
+ });
139
+ results.push(...(res.data.results ?? []));
140
+ }
141
+ }
142
+ catch (e) {
143
+ deps.err(`Validation failed: ${e.message}`);
144
+ return (0, exit_codes_1.exitCodeForError)(e);
145
+ }
146
+ const invalid = results.filter((r) => !r.valid).length + problems.length;
147
+ if (json) {
148
+ deps.out(JSON.stringify({ root, checked: results.length, invalid, problems, results }, null, 2));
149
+ }
150
+ else {
151
+ for (const p of problems)
152
+ deps.out(`ERROR ${p}`);
153
+ for (const r of results)
154
+ for (const i of r.issues) {
155
+ const where = `${r.source ?? r.schema}${i.path ? ` ${i.path}` : ''}`;
156
+ deps.out(`${i.severity === 'error' ? 'ERROR ' : 'WARNING'} ${where}: ${i.message}`);
157
+ if (i.hint)
158
+ deps.out(` ${i.hint}`);
159
+ }
160
+ deps.out(`${results.length} document(s) checked, ${invalid} invalid` +
161
+ (docs.length === 0 ? ' (no forumulate.yaml, front matter or $schema file found)' : '') +
162
+ '.');
163
+ }
164
+ return invalid > 0 ? exit_codes_1.EXIT.USAGE : exit_codes_1.EXIT.OK;
165
+ }
166
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Kept in step with package.json by `cli-version.test.ts` — they had drifted to
3
+ * 0.1.0 and 0.2.1, so `--version` reported a release that was never published.
4
+ * Its own module so `api list` can name the CLI that bundled its operation
5
+ * list without importing `run.ts` (which imports it).
6
+ */
7
+ export declare const VERSION = "0.10.0";
8
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,OAAO,WAAW,CAAC"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VERSION = void 0;
4
+ /**
5
+ * Kept in step with package.json by `cli-version.test.ts` — they had drifted to
6
+ * 0.1.0 and 0.2.1, so `--version` reported a release that was never published.
7
+ * Its own module so `api list` can name the CLI that bundled its operation
8
+ * list without importing `run.ts` (which imports it).
9
+ */
10
+ exports.VERSION = '0.10.0';
11
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACU,QAAA,OAAO,GAAG,QAAQ,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * `forumulate whoami` and `forumulate auth status` (FMU-D06).
3
+ *
4
+ * `whoami` printed a name and an email. The Referalli integrator had a PAT in
5
+ * `FORUMULATE_TOKEN`, an older one in `credentials.json` and a third in CI,
6
+ * plus `FORUMULATE_BASE` exported from a tutorial — a variable nothing reads —
7
+ * and spent an afternoon on a 401 that any of the four could have caused. This
8
+ * prints the token's source, which PAT it is (id, name, last four characters),
9
+ * when it expires, everything it is narrowed to, and the API it was sent to;
10
+ * and it names every `FORUMULATE_*` variable in the environment that nothing
11
+ * reads, with the one it was probably meant to be.
12
+ */
13
+ /** Every variable the CLI, the SDK and the MCP server read. */
14
+ export declare const KNOWN_ENV: readonly ["FORUMULATE_TOKEN", "FORUMULATE_URL", "FORUMULATE_API_URL", "FORUMULATE_ORG", "FORUMULATE_SPACE", "FORUMULATE_LIBRARY", "FORUMULATE_API_VERSION", "FORUMULATE_CONFIG_DIR", "FORUMULATE_MCP", "FORUMULATE_MCP_URL"];
15
+ /** `FORUMULATE_*` names nothing reads, each with its likely meaning (or none). */
16
+ export declare function unknownEnv(env: NodeJS.ProcessEnv): {
17
+ name: string;
18
+ didYouMean?: string;
19
+ }[];
20
+ /** The warning lines for unknown variables — printed by every command, on stderr. */
21
+ export declare function envWarnings(env: NodeJS.ProcessEnv): string[];
22
+ export interface WhoamiDeps {
23
+ out: (l: string) => void;
24
+ err: (l: string) => void;
25
+ env: NodeJS.ProcessEnv;
26
+ baseUrl?: string;
27
+ /** `--token`, when given. */
28
+ flagToken?: string;
29
+ /** GET /auth/me with the resolved token (injected for tests). */
30
+ me: () => Promise<{
31
+ user: {
32
+ id: string;
33
+ name: string;
34
+ email: string;
35
+ };
36
+ token?: Record<string, unknown>;
37
+ }>;
38
+ }
39
+ export declare const WHOAMI_HELP = "forumulate whoami \u2014 who the CLI is acting as, and with which token\n\nUsage:\n forumulate whoami [--json] [--token <pat>]\n forumulate auth status [--json] the same report, for scripts\n\nPrints:\n user name, email and id\n token source --token flag | FORUMULATE_TOKEN | credentials.json (with its path)\n token the PAT's id, name, last four characters, created, expires\n narrowed to scopes, spaces, capabilities, constraints\n api the API base the token was sent to (FORUMULATE_API_URL, FORUMULATE_URL\n or the default)\n warnings every FORUMULATE_* variable nothing reads, with the one it was\n probably meant to be (FORUMULATE_BASE \u2192 FORUMULATE_URL)\n\nPrecedence: --token beats FORUMULATE_TOKEN beats the token `forumulate login` stored\nfor this API. Guide: https://forumulate.com/guides/api-tokens-and-scopes\n\nExit status:\n 0 ok 1 failed (verification mismatch, doctor FAIL)\n 2 usage 3 auth (no token, 401, token not allowed)\n 4 not found 5 conflict (409/412, edited in the studio since your last publish)\n 124 --wait timed out (the job keeps running; with --wait, a failed job is 1)";
40
+ export declare function runWhoami(json: boolean, deps: WhoamiDeps): Promise<number>;
41
+ //# sourceMappingURL=whoami.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../src/whoami.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AAEH,+DAA+D;AAC/D,eAAO,MAAM,SAAS,8NAWZ,CAAC;AAkCX,kFAAkF;AAClF,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,CAY1F;AAED,qFAAqF;AACrF,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,EAAE,CAK5D;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACzB,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,EAAE,EAAE,MAAM,OAAO,CAAC;QAChB,IAAI,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;QAClD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACjC,CAAC,CAAC;CACJ;AAED,eAAO,MAAM,WAAW,osCAmBL,CAAC;AAEpB,wBAAsB,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAqEhF"}
package/dist/whoami.js ADDED
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WHOAMI_HELP = exports.KNOWN_ENV = void 0;
4
+ exports.unknownEnv = unknownEnv;
5
+ exports.envWarnings = envWarnings;
6
+ exports.runWhoami = runWhoami;
7
+ const api_base_1 = require("./api-base");
8
+ const credentials_1 = require("./credentials");
9
+ const exit_codes_1 = require("./exit-codes");
10
+ /**
11
+ * `forumulate whoami` and `forumulate auth status` (FMU-D06).
12
+ *
13
+ * `whoami` printed a name and an email. The Referalli integrator had a PAT in
14
+ * `FORUMULATE_TOKEN`, an older one in `credentials.json` and a third in CI,
15
+ * plus `FORUMULATE_BASE` exported from a tutorial — a variable nothing reads —
16
+ * and spent an afternoon on a 401 that any of the four could have caused. This
17
+ * prints the token's source, which PAT it is (id, name, last four characters),
18
+ * when it expires, everything it is narrowed to, and the API it was sent to;
19
+ * and it names every `FORUMULATE_*` variable in the environment that nothing
20
+ * reads, with the one it was probably meant to be.
21
+ */
22
+ /** Every variable the CLI, the SDK and the MCP server read. */
23
+ exports.KNOWN_ENV = [
24
+ 'FORUMULATE_TOKEN',
25
+ 'FORUMULATE_URL',
26
+ 'FORUMULATE_API_URL',
27
+ 'FORUMULATE_ORG',
28
+ 'FORUMULATE_SPACE',
29
+ 'FORUMULATE_LIBRARY',
30
+ 'FORUMULATE_API_VERSION',
31
+ 'FORUMULATE_CONFIG_DIR',
32
+ 'FORUMULATE_MCP',
33
+ 'FORUMULATE_MCP_URL',
34
+ ];
35
+ /** Spellings people reach for, mapped to the variable they meant. */
36
+ const ALIASES = {
37
+ FORUMULATE_BASE: 'FORUMULATE_URL',
38
+ FORUMULATE_BASE_URL: 'FORUMULATE_URL',
39
+ FORUMULATE_HOST: 'FORUMULATE_URL',
40
+ FORUMULATE_SITE: 'FORUMULATE_URL',
41
+ FORUMULATE_ENDPOINT: 'FORUMULATE_API_URL',
42
+ FORUMULATE_API: 'FORUMULATE_API_URL',
43
+ FORUMULATE_API_BASE: 'FORUMULATE_API_URL',
44
+ FORUMULATE_PAT: 'FORUMULATE_TOKEN',
45
+ FORUMULATE_API_KEY: 'FORUMULATE_TOKEN',
46
+ FORUMULATE_KEY: 'FORUMULATE_TOKEN',
47
+ FORUMULATE_ACCESS_TOKEN: 'FORUMULATE_TOKEN',
48
+ FORUMULATE_ORGANIZATION: 'FORUMULATE_ORG',
49
+ FORUMULATE_ORG_ID: 'FORUMULATE_ORG',
50
+ FORUMULATE_SPACE_ID: 'FORUMULATE_SPACE',
51
+ FORUMULATE_VERSION: 'FORUMULATE_API_VERSION',
52
+ };
53
+ function distance(a, b) {
54
+ const d = Array.from({ length: a.length + 1 }, (_, i) => [i, ...Array(b.length).fill(0)]);
55
+ for (let j = 1; j <= b.length; j++)
56
+ d[0][j] = j;
57
+ for (let i = 1; i <= a.length; i++)
58
+ for (let j = 1; j <= b.length; j++)
59
+ d[i][j] = Math.min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + (a[i - 1] === b[j - 1] ? 0 : 1));
60
+ return d[a.length][b.length];
61
+ }
62
+ /** `FORUMULATE_*` names nothing reads, each with its likely meaning (or none). */
63
+ function unknownEnv(env) {
64
+ const known = new Set(exports.KNOWN_ENV);
65
+ return Object.keys(env)
66
+ .filter((k) => k.startsWith('FORUMULATE_') && !known.has(k))
67
+ .sort()
68
+ .map((name) => {
69
+ if (ALIASES[name])
70
+ return { name, didYouMean: ALIASES[name] };
71
+ const best = [...known]
72
+ .map((k) => ({ k, d: distance(name, k) }))
73
+ .sort((x, y) => x.d - y.d)[0];
74
+ return best && best.d <= 4 ? { name, didYouMean: best.k } : { name };
75
+ });
76
+ }
77
+ /** The warning lines for unknown variables — printed by every command, on stderr. */
78
+ function envWarnings(env) {
79
+ return unknownEnv(env).map((u) => `warning: ${u.name} is not read by forumulate${u.didYouMean ? `; did you mean ${u.didYouMean}?` : '.'}`);
80
+ }
81
+ exports.WHOAMI_HELP = `forumulate whoami — who the CLI is acting as, and with which token
82
+
83
+ Usage:
84
+ forumulate whoami [--json] [--token <pat>]
85
+ forumulate auth status [--json] the same report, for scripts
86
+
87
+ Prints:
88
+ user name, email and id
89
+ token source --token flag | FORUMULATE_TOKEN | credentials.json (with its path)
90
+ token the PAT's id, name, last four characters, created, expires
91
+ narrowed to scopes, spaces, capabilities, constraints
92
+ api the API base the token was sent to (FORUMULATE_API_URL, FORUMULATE_URL
93
+ or the default)
94
+ warnings every FORUMULATE_* variable nothing reads, with the one it was
95
+ probably meant to be (FORUMULATE_BASE → FORUMULATE_URL)
96
+
97
+ Precedence: --token beats FORUMULATE_TOKEN beats the token \`forumulate login\` stored
98
+ for this API. Guide: https://forumulate.com/guides/api-tokens-and-scopes
99
+
100
+ ${exit_codes_1.EXIT_CODES_HELP}`;
101
+ async function runWhoami(json, deps) {
102
+ const apiBase = deps.baseUrl ?? (0, api_base_1.apiBaseFromEnv)(deps.env);
103
+ const where = (0, credentials_1.resolveTokenSource)(apiBase, deps.env, deps.flagToken);
104
+ const warnings = unknownEnv(deps.env);
105
+ const report = {
106
+ apiBase,
107
+ tokenSource: where.source,
108
+ ...(where.path ? { credentialsPath: where.path } : {}),
109
+ warnings,
110
+ };
111
+ let code = exit_codes_1.EXIT.OK;
112
+ if (where.source === 'none') {
113
+ report.error = { message: 'No token: run `forumulate login`, set FORUMULATE_TOKEN, or pass --token.' };
114
+ code = exit_codes_1.EXIT.AUTH;
115
+ }
116
+ else {
117
+ try {
118
+ const me = await deps.me();
119
+ report.user = me.user;
120
+ if (me.token)
121
+ report.token = me.token;
122
+ }
123
+ catch (e) {
124
+ const err = e;
125
+ report.error = { status: err.status, code: err.code, message: err.message ?? String(e) };
126
+ code = (0, exit_codes_1.exitCodeForError)(e);
127
+ }
128
+ }
129
+ if (json) {
130
+ deps.out(JSON.stringify(report, null, 2));
131
+ return code;
132
+ }
133
+ const t = report.token ?? {};
134
+ const label = {
135
+ flag: '--token flag',
136
+ env: 'FORUMULATE_TOKEN (environment)',
137
+ credentials: `credentials.json (${where.path ?? ''})`,
138
+ none: 'none',
139
+ };
140
+ if (report.user)
141
+ deps.out(`${report.user.name} <${report.user.email}> (${report.user.id})`);
142
+ deps.out(`token source ${label[where.source]}`);
143
+ if (report.token) {
144
+ deps.out(`token ${t.name ?? '(unnamed)'} id ${t.id ?? '—'} …${t.last4 ?? '????'}`);
145
+ deps.out(`created ${t.createdAt ?? '—'}`);
146
+ deps.out(`expires ${t.expiresAt ?? 'never'}`);
147
+ deps.out(`scopes ${t.scopes?.join(', ') || '—'}`);
148
+ deps.out(`spaces ${t.spaceIds?.join(', ') ?? 'all'}`);
149
+ deps.out(`capabilities ${t.capabilities?.join(', ') ?? 'not narrowed'}`);
150
+ deps.out(`constraints ${t.constraints ? JSON.stringify(t.constraints) : 'none'}`);
151
+ }
152
+ else if (report.user)
153
+ deps.out('token a session, not a personal access token');
154
+ deps.out(`api ${apiBase}`);
155
+ for (const w of warnings)
156
+ deps.err(`warning: ${w.name} is not read by forumulate${w.didYouMean ? `; did you mean ${w.didYouMean}?` : '.'}`);
157
+ if (report.error)
158
+ deps.err(`Error${report.error.status ? ` ${report.error.status}` : ''}${report.error.code ? ` (${report.error.code})` : ''}: ${report.error.message}`);
159
+ return code;
160
+ }
161
+ //# sourceMappingURL=whoami.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../src/whoami.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forumulate/cli",
3
- "version": "0.8.0",
3
+ "version": "0.10.0",
4
4
  "description": "Command-line interface for Forumulate — manage orgs, spaces, docs, and search from your terminal.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://forumulate.com/guides",
@@ -30,7 +30,7 @@
30
30
  },
31
31
  "dependencies": {
32
32
  "yaml": "^2.6.1",
33
- "@forumulate/sdk": "0.7.0"
33
+ "@forumulate/sdk": "0.10.0"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@types/node": "^22.9.0",
@@ -1,54 +0,0 @@
1
- /** One markdown file, as the publisher sees it. */
2
- export interface LocalDoc {
3
- /** Path as given on the command line, for the plan a person reads. */
4
- path: string;
5
- /** The slug this file publishes at. */
6
- slug: string;
7
- title: string;
8
- markdown: string;
9
- }
10
- /** What a directory publish would do, before it does any of it. */
11
- export interface PublishPlan {
12
- create: LocalDoc[];
13
- update: (LocalDoc & {
14
- itemId: string;
15
- })[];
16
- /** Published pieces with no file — never touched, only reported. */
17
- orphans: {
18
- slug: string;
19
- title: string;
20
- }[];
21
- }
22
- /**
23
- * A file's own front matter, in the small form every static-site generator
24
- * writes: `key: value` lines, no nesting, no arrays. Anything richer belongs in
25
- * the page itself, and guessing at YAML we do not support would publish a
26
- * document whose first paragraph is a parse error.
27
- */
28
- export declare function parseFrontMatter(text: string): {
29
- data: Record<string, string>;
30
- body: string;
31
- };
32
- /** `01-getting-started.md` → `getting-started`; `a/b/c.md` → `a-b-c`. */
33
- export declare function slugFor(file: string, root: string, front: Record<string, string>): string;
34
- /** The first `# heading`, else the front matter's title, else the slug. */
35
- export declare function titleFor(body: string, front: Record<string, string>, slug: string): string;
36
- /** Every `.md`/`.mdx` under a directory, depth-first, in a stable order. */
37
- export declare function readDocs(root: string): LocalDoc[];
38
- /**
39
- * What publishing this directory would change, decided against what the space
40
- * already holds.
41
- *
42
- * A file whose slug the space already has is an UPDATE; one it does not is a
43
- * CREATE; a published piece with no file is an orphan — reported and left
44
- * alone, because a directory is a source of truth for what it contains and not
45
- * a statement about what should be deleted.
46
- */
47
- export declare function planPublish(docs: LocalDoc[], existing: {
48
- id: string;
49
- slug?: string;
50
- title: string;
51
- }[]): PublishPlan;
52
- /** The plan as a person reads it — the whole point of `--dry-run`. */
53
- export declare function describePlan(plan: PublishPlan, root: string): string[];
54
- //# sourceMappingURL=publish-dir.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"publish-dir.d.ts","sourceRoot":"","sources":["../src/publish-dir.ts"],"names":[],"mappings":"AAGA,mDAAmD;AACnD,MAAM,WAAW,QAAQ;IACvB,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,mEAAmE;AACnE,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,MAAM,EAAE,CAAC,QAAQ,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;IAC1C,oEAAoE;IACpE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC5C;AAID;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAe7F;AAED,yEAAyE;AACzE,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAUzF;AAED,2EAA2E;AAC3E,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAI1F;AAED,4EAA4E;AAC5E,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,CAmBjD;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,QAAQ,EAAE,EAChB,QAAQ,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,GACvD,WAAW,CAcb;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAUtE"}
@@ -1,119 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseFrontMatter = parseFrontMatter;
4
- exports.slugFor = slugFor;
5
- exports.titleFor = titleFor;
6
- exports.readDocs = readDocs;
7
- exports.planPublish = planPublish;
8
- exports.describePlan = describePlan;
9
- const node_fs_1 = require("node:fs");
10
- const node_path_1 = require("node:path");
11
- const FRONT_MATTER = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?/;
12
- /**
13
- * A file's own front matter, in the small form every static-site generator
14
- * writes: `key: value` lines, no nesting, no arrays. Anything richer belongs in
15
- * the page itself, and guessing at YAML we do not support would publish a
16
- * document whose first paragraph is a parse error.
17
- */
18
- function parseFrontMatter(text) {
19
- const m = FRONT_MATTER.exec(text);
20
- if (!m)
21
- return { data: {}, body: text };
22
- const data = {};
23
- for (const line of (m[1] ?? '').split(/\r?\n/)) {
24
- const at = line.indexOf(':');
25
- if (at <= 0)
26
- continue;
27
- const key = line.slice(0, at).trim();
28
- const value = line
29
- .slice(at + 1)
30
- .trim()
31
- .replace(/^["']|["']$/g, '');
32
- if (key)
33
- data[key] = value;
34
- }
35
- return { data, body: text.slice(m[0].length) };
36
- }
37
- /** `01-getting-started.md` → `getting-started`; `a/b/c.md` → `a-b-c`. */
38
- function slugFor(file, root, front) {
39
- if (front.slug)
40
- return front.slug.trim();
41
- const rel = (0, node_path_1.relative)(root, file).replace(/\.mdx?$/i, '');
42
- return rel
43
- .split(node_path_1.sep)
44
- .map((part) => part.replace(/^\d+[-_]/, ''))
45
- .join('-')
46
- .toLowerCase()
47
- .replace(/[^a-z0-9]+/g, '-')
48
- .replace(/^-+|-+$/g, '');
49
- }
50
- /** The first `# heading`, else the front matter's title, else the slug. */
51
- function titleFor(body, front, slug) {
52
- if (front.title)
53
- return front.title.trim();
54
- const heading = /^#\s+(.+)$/m.exec(body);
55
- return heading?.[1]?.trim() || slug;
56
- }
57
- /** Every `.md`/`.mdx` under a directory, depth-first, in a stable order. */
58
- function readDocs(root) {
59
- const out = [];
60
- const walk = (dir) => {
61
- for (const entry of (0, node_fs_1.readdirSync)(dir).sort()) {
62
- if (entry.startsWith('.'))
63
- continue;
64
- const path = (0, node_path_1.join)(dir, entry);
65
- if ((0, node_fs_1.statSync)(path).isDirectory()) {
66
- walk(path);
67
- continue;
68
- }
69
- if (!/\.mdx?$/i.test(entry))
70
- continue;
71
- const raw = (0, node_fs_1.readFileSync)(path, 'utf8');
72
- const { data, body } = parseFrontMatter(raw);
73
- const slug = slugFor(path, root, data);
74
- out.push({ path, slug, title: titleFor(body, data, slug), markdown: body.trim() });
75
- }
76
- };
77
- walk(root);
78
- return out;
79
- }
80
- /**
81
- * What publishing this directory would change, decided against what the space
82
- * already holds.
83
- *
84
- * A file whose slug the space already has is an UPDATE; one it does not is a
85
- * CREATE; a published piece with no file is an orphan — reported and left
86
- * alone, because a directory is a source of truth for what it contains and not
87
- * a statement about what should be deleted.
88
- */
89
- function planPublish(docs, existing) {
90
- const bySlug = new Map(existing.filter((e) => e.slug).map((e) => [e.slug, e]));
91
- const create = [];
92
- const update = [];
93
- for (const doc of docs) {
94
- const match = bySlug.get(doc.slug);
95
- if (match)
96
- update.push({ ...doc, itemId: match.id });
97
- else
98
- create.push(doc);
99
- }
100
- const named = new Set(docs.map((d) => d.slug));
101
- const orphans = existing
102
- .filter((e) => e.slug && !named.has(e.slug))
103
- .map((e) => ({ slug: e.slug, title: e.title }));
104
- return { create, update, orphans };
105
- }
106
- /** The plan as a person reads it — the whole point of `--dry-run`. */
107
- function describePlan(plan, root) {
108
- const lines = [];
109
- for (const d of plan.create)
110
- lines.push(` create ${d.slug} ← ${(0, node_path_1.relative)(root, d.path) || d.path}`);
111
- for (const d of plan.update)
112
- lines.push(` update ${d.slug} ← ${(0, node_path_1.relative)(root, d.path) || d.path}`);
113
- for (const o of plan.orphans)
114
- lines.push(` (left) ${o.slug} — published here, no file in this directory`);
115
- if (lines.length === 0)
116
- lines.push(' nothing to do — no .md files found');
117
- return lines;
118
- }
119
- //# sourceMappingURL=publish-dir.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"publish-dir.js","sourceRoot":"","sources":["../src/publish-dir.ts"],"names":[],"mappings":"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"}