@forumulate/cli 0.4.0 → 0.5.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 (111) hide show
  1. package/dist/cli.js +12 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/content/command.d.ts +34 -0
  4. package/dist/content/command.d.ts.map +1 -0
  5. package/dist/content/command.js +225 -0
  6. package/dist/content/command.js.map +1 -0
  7. package/dist/content/library.d.ts +22 -0
  8. package/dist/content/library.d.ts.map +1 -0
  9. package/dist/content/library.js +40 -0
  10. package/dist/content/library.js.map +1 -0
  11. package/dist/content/render.d.ts +15 -0
  12. package/dist/content/render.d.ts.map +1 -0
  13. package/dist/content/render.js +85 -0
  14. package/dist/content/render.js.map +1 -0
  15. package/dist/content/types-gen.d.ts +40 -0
  16. package/dist/content/types-gen.d.ts.map +1 -0
  17. package/dist/content/types-gen.js +200 -0
  18. package/dist/content/types-gen.js.map +1 -0
  19. package/dist/import/coerce.d.ts +34 -0
  20. package/dist/import/coerce.d.ts.map +1 -0
  21. package/dist/import/coerce.js +134 -0
  22. package/dist/import/coerce.js.map +1 -0
  23. package/dist/import/command.d.ts +25 -0
  24. package/dist/import/command.d.ts.map +1 -0
  25. package/dist/import/command.js +127 -0
  26. package/dist/import/command.js.map +1 -0
  27. package/dist/import/config.d.ts +39 -0
  28. package/dist/import/config.d.ts.map +1 -0
  29. package/dist/import/config.js +48 -0
  30. package/dist/import/config.js.map +1 -0
  31. package/dist/import/contentful.d.ts +3 -0
  32. package/dist/import/contentful.d.ts.map +1 -0
  33. package/dist/import/contentful.js +179 -0
  34. package/dist/import/contentful.js.map +1 -0
  35. package/dist/import/disk.d.ts +4 -0
  36. package/dist/import/disk.d.ts.map +1 -0
  37. package/dist/import/disk.js +19 -0
  38. package/dist/import/disk.js.map +1 -0
  39. package/dist/import/engine-locales.d.ts +35 -0
  40. package/dist/import/engine-locales.d.ts.map +1 -0
  41. package/dist/import/engine-locales.js +61 -0
  42. package/dist/import/engine-locales.js.map +1 -0
  43. package/dist/import/engine.d.ts +29 -0
  44. package/dist/import/engine.d.ts.map +1 -0
  45. package/dist/import/engine.js +248 -0
  46. package/dist/import/engine.js.map +1 -0
  47. package/dist/import/media.d.ts +24 -0
  48. package/dist/import/media.d.ts.map +1 -0
  49. package/dist/import/media.js +39 -0
  50. package/dist/import/media.js.map +1 -0
  51. package/dist/import/model-fields.d.ts +22 -0
  52. package/dist/import/model-fields.d.ts.map +1 -0
  53. package/dist/import/model-fields.js +60 -0
  54. package/dist/import/model-fields.js.map +1 -0
  55. package/dist/import/payload/index.d.ts +9 -0
  56. package/dist/import/payload/index.d.ts.map +1 -0
  57. package/dist/import/payload/index.js +129 -0
  58. package/dist/import/payload/index.js.map +1 -0
  59. package/dist/import/report.d.ts +5 -0
  60. package/dist/import/report.d.ts.map +1 -0
  61. package/dist/import/report.js +52 -0
  62. package/dist/import/report.js.map +1 -0
  63. package/dist/import/richtext-core.d.ts +26 -0
  64. package/dist/import/richtext-core.d.ts.map +1 -0
  65. package/dist/import/richtext-core.js +65 -0
  66. package/dist/import/richtext-core.js.map +1 -0
  67. package/dist/import/richtext-html.d.ts +5 -0
  68. package/dist/import/richtext-html.d.ts.map +1 -0
  69. package/dist/import/richtext-html.js +311 -0
  70. package/dist/import/richtext-html.js.map +1 -0
  71. package/dist/import/richtext-json.d.ts +10 -0
  72. package/dist/import/richtext-json.d.ts.map +1 -0
  73. package/dist/import/richtext-json.js +250 -0
  74. package/dist/import/richtext-json.js.map +1 -0
  75. package/dist/import/sanity.d.ts +8 -0
  76. package/dist/import/sanity.d.ts.map +1 -0
  77. package/dist/import/sanity.js +158 -0
  78. package/dist/import/sanity.js.map +1 -0
  79. package/dist/import/strapi-archive.d.ts +6 -0
  80. package/dist/import/strapi-archive.d.ts.map +1 -0
  81. package/dist/import/strapi-archive.js +127 -0
  82. package/dist/import/strapi-archive.js.map +1 -0
  83. package/dist/import/strapi.d.ts +7 -0
  84. package/dist/import/strapi.d.ts.map +1 -0
  85. package/dist/import/strapi.js +185 -0
  86. package/dist/import/strapi.js.map +1 -0
  87. package/dist/import/tar.d.ts +3 -0
  88. package/dist/import/tar.d.ts.map +1 -0
  89. package/dist/import/tar.js +48 -0
  90. package/dist/import/tar.js.map +1 -0
  91. package/dist/import/types.d.ts +157 -0
  92. package/dist/import/types.d.ts.map +1 -0
  93. package/dist/import/types.js +12 -0
  94. package/dist/import/types.js.map +1 -0
  95. package/dist/import/wordpress.d.ts +15 -0
  96. package/dist/import/wordpress.d.ts.map +1 -0
  97. package/dist/import/wordpress.js +147 -0
  98. package/dist/import/wordpress.js.map +1 -0
  99. package/dist/publish/scan.d.ts +1 -1
  100. package/dist/publish/scan.d.ts.map +1 -1
  101. package/dist/publish/scan.js +2 -2
  102. package/dist/publish/scan.js.map +1 -1
  103. package/dist/publish-dir.d.ts +54 -0
  104. package/dist/publish-dir.d.ts.map +1 -0
  105. package/dist/publish-dir.js +119 -0
  106. package/dist/publish-dir.js.map +1 -0
  107. package/dist/run.d.ts +6 -1
  108. package/dist/run.d.ts.map +1 -1
  109. package/dist/run.js +47 -2
  110. package/dist/run.js.map +1 -1
  111. package/package.json +2 -2
package/dist/cli.js CHANGED
@@ -32,6 +32,16 @@ function askSecret(question) {
32
32
  });
33
33
  });
34
34
  }
35
+ /** A visible question, for a y/N; no answer where nobody can type one. */
36
+ function ask(question) {
37
+ const rl = (0, node_readline_1.createInterface)({ input: process.stdin, output: process.stdout });
38
+ return new Promise((resolve) => {
39
+ rl.question(question, (answer) => {
40
+ rl.close();
41
+ resolve(answer);
42
+ });
43
+ });
44
+ }
35
45
  async function main() {
36
46
  const baseUrl = (0, api_base_1.apiBaseFromEnv)();
37
47
  // The environment first, then what `login` stored for THIS API — see
@@ -66,6 +76,8 @@ async function main() {
66
76
  authed: Boolean(token),
67
77
  upload,
68
78
  prompt: askSecret,
79
+ // A push in CI has no one to ask: it needs --yes, rather than hanging on stdin.
80
+ ask: process.stdin.isTTY ? ask : undefined,
69
81
  out: (l) => process.stdout.write(l + '\n'),
70
82
  err: (l) => process.stderr.write(l + '\n'),
71
83
  });
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { ForumulateClient, ModelOp } from '@forumulate/sdk';
2
+ /**
3
+ * `forumulate content types | pull | push` (plan P4-T1, P4-T2).
4
+ *
5
+ * The CLI is thin on purpose: the model file is converted and diffed by the
6
+ * API (`…/model/export`, `…/model/import`), so the CLI, the studio and any
7
+ * other client agree on what a push means. What lives here is the terminal
8
+ * side: files, the library a slug means, the diff a person reads, and the
9
+ * confirmation before anything is written.
10
+ */
11
+ export interface ContentDeps {
12
+ client: ForumulateClient;
13
+ out: (line: string) => void;
14
+ err: (line: string) => void;
15
+ env?: NodeJS.ProcessEnv;
16
+ /** A visible question (y/N). Absent where nobody can answer: `--yes` is then required to apply. */
17
+ ask?: (question: string) => Promise<string>;
18
+ files?: {
19
+ read(path: string): string;
20
+ write(path: string, text: string): void;
21
+ exists(path: string): boolean;
22
+ };
23
+ }
24
+ /** Flags of `content` that carry a value (`--out file`), so the value is not read as an argument. */
25
+ export declare const CONTENT_VALUE_FLAGS: string[];
26
+ /**
27
+ * `--rename post.headline=title`, `--rename block:hero.heading=title`,
28
+ * `--rename library:subtitle=tagline`; the new name may be a key (the field
29
+ * stays where it is) or the full path. A diff cannot tell a rename from a
30
+ * removal plus an addition, so this is how a push keeps the values.
31
+ */
32
+ export declare function renameOps(argv: readonly string[]): ModelOp[];
33
+ export declare function runContent(argv: readonly string[], positional: readonly string[], deps: ContentDeps): Promise<number>;
34
+ //# sourceMappingURL=command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/content/command.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAmB,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAKlF;;;;;;;;GAQG;AAEH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,gBAAgB,CAAC;IACzB,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,mGAAmG;IACnG,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;CAChH;AAED,qGAAqG;AACrG,eAAO,MAAM,mBAAmB,UAAgG,CAAC;AAsBjI;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,EAAE,CAiC5D;AA4BD,wBAAsB,UAAU,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAgH3H"}
@@ -0,0 +1,225 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CONTENT_VALUE_FLAGS = void 0;
4
+ exports.renameOps = renameOps;
5
+ exports.runContent = runContent;
6
+ const node_fs_1 = require("node:fs");
7
+ const library_1 = require("./library");
8
+ const render_1 = require("./render");
9
+ const types_gen_1 = require("./types-gen");
10
+ /** Flags of `content` that carry a value (`--out file`), so the value is not read as an argument. */
11
+ exports.CONTENT_VALUE_FLAGS = ['--library', '--out', '--format', '--schema', '--rename', '--rename-type', '--rename-block'];
12
+ const disk = {
13
+ read: (p) => (0, node_fs_1.readFileSync)(p, 'utf8'),
14
+ write: (p, t) => (0, node_fs_1.writeFileSync)(p, t),
15
+ exists: (p) => (0, node_fs_1.existsSync)(p),
16
+ };
17
+ class UsageError extends Error {
18
+ }
19
+ /** `--x v` and `--x=v`, every occurrence. */
20
+ function valuesOf(argv, name) {
21
+ const out = [];
22
+ argv.forEach((a, i) => {
23
+ if (a === name && argv[i + 1] !== undefined)
24
+ out.push(argv[i + 1]);
25
+ else if (a.startsWith(`${name}=`))
26
+ out.push(a.slice(name.length + 1));
27
+ });
28
+ return out;
29
+ }
30
+ const PAIR = /^([^=]+)=([^=]+)$/;
31
+ /**
32
+ * `--rename post.headline=title`, `--rename block:hero.heading=title`,
33
+ * `--rename library:subtitle=tagline`; the new name may be a key (the field
34
+ * stays where it is) or the full path. A diff cannot tell a rename from a
35
+ * removal plus an addition, so this is how a push keeps the values.
36
+ */
37
+ function renameOps(argv) {
38
+ const ops = [];
39
+ for (const spec of valuesOf(argv, '--rename')) {
40
+ const m = PAIR.exec(spec);
41
+ if (!m)
42
+ throw new UsageError(`--rename takes type.field=newName, not "${spec}".`);
43
+ const [, left, right] = m;
44
+ let scope = {};
45
+ let path;
46
+ if (left.startsWith('block:') || left.startsWith('library:')) {
47
+ const rest = left.slice(left.indexOf(':') + 1);
48
+ if (left.startsWith('block:')) {
49
+ const dot = rest.indexOf('.');
50
+ if (dot < 0)
51
+ throw new UsageError(`--rename block:<blockType>.<field>=newName, not "${spec}".`);
52
+ scope = { blockType: rest.slice(0, dot) };
53
+ path = rest.slice(dot + 1);
54
+ }
55
+ else
56
+ path = rest;
57
+ }
58
+ else {
59
+ const dot = left.indexOf('.');
60
+ if (dot < 0)
61
+ throw new UsageError(`--rename <type>.<field>=newName, not "${spec}".`);
62
+ scope = { type: left.slice(0, dot) };
63
+ path = left.slice(dot + 1);
64
+ }
65
+ const to = right.includes('.') ? right : [...path.split('.').slice(0, -1), right].join('.');
66
+ ops.push({ op: 'renameField', ...scope, from: path, to });
67
+ }
68
+ for (const [flag, op] of [['--rename-type', 'renameType'], ['--rename-block', 'renameBlockType']]) {
69
+ for (const spec of valuesOf(argv, flag)) {
70
+ const m = PAIR.exec(spec);
71
+ if (!m)
72
+ throw new UsageError(`${flag} takes old=new, not "${spec}".`);
73
+ ops.push({ op, from: m[1], to: m[2] });
74
+ }
75
+ }
76
+ return ops;
77
+ }
78
+ function formatOf(value, file) {
79
+ if (value === 'json' || value === 'payload')
80
+ return value;
81
+ if (value !== undefined)
82
+ throw new UsageError(`--format is json or payload, not "${value}".`);
83
+ if (!file || /\.json$/i.test(file))
84
+ return 'json';
85
+ if (/\.(c|m)?(t|j)s$/i.test(file))
86
+ return 'payload';
87
+ throw new UsageError(`Cannot tell the format of ${file}; pass --format json|payload.`);
88
+ }
89
+ /** The library and model version a pulled file names, when it does. */
90
+ function fileHeader(format, content) {
91
+ if (format === 'payload') {
92
+ const library = /^\s*\/\/\s*forumulate:library\s+(\S+)/m.exec(content)?.[1];
93
+ const version = /^\s*\/\/\s*forumulate:model-version\s+(\d+)/m.exec(content)?.[1];
94
+ return { library, version: version ? Number(version) : undefined };
95
+ }
96
+ try {
97
+ const parsed = JSON.parse(content);
98
+ return {
99
+ library: typeof parsed.library?.id === 'string' ? parsed.library.id : undefined,
100
+ version: typeof parsed.version === 'number' ? parsed.version : undefined,
101
+ };
102
+ }
103
+ catch {
104
+ return {}; // The API names what is wrong with it.
105
+ }
106
+ }
107
+ async function runContent(argv, positional, deps) {
108
+ const files = deps.files ?? disk;
109
+ const env = deps.env ?? process.env;
110
+ const flag = (name) => argv.includes(name);
111
+ const value = (name) => valuesOf(argv, name)[0];
112
+ const json = flag('--json');
113
+ const [sub, ...rest] = positional;
114
+ const want = (fromFile) => ({
115
+ org: value('--org') ?? env.FORUMULATE_ORG,
116
+ library: value('--library') ?? env.FORUMULATE_LIBRARY ?? fromFile,
117
+ });
118
+ try {
119
+ switch (sub) {
120
+ case 'types': {
121
+ const out = value('--out') ?? 'forumulate.d.ts';
122
+ let schema;
123
+ let libraryId;
124
+ const schemaFile = value('--schema');
125
+ if (schemaFile) {
126
+ schema = JSON.parse(files.read(schemaFile));
127
+ }
128
+ else {
129
+ const target = await (0, library_1.resolveLibrary)(deps.client, want());
130
+ libraryId = target.libraryId;
131
+ schema = await deps.client.content.model.schema(target.orgId, target.libraryId, flag('--preview') ? { audience: 'preview' } : {});
132
+ }
133
+ const command = schemaFile
134
+ ? `forumulate content types --schema ${schemaFile} --out ${out}`
135
+ : `forumulate content types --library ${want().library} --out ${out}${flag('--preview') ? ' --preview' : ''}`;
136
+ const generated = (0, types_gen_1.generateTypes)(schema, { libraryId, command });
137
+ if (flag('--check')) {
138
+ // For CI after a `content.model.changed` webhook: fail when the committed types are stale.
139
+ const current = files.exists(out) ? files.read(out).replace(/\r\n/g, '\n') : null;
140
+ if (current === generated.source) {
141
+ deps.out(`${out} is up to date.`);
142
+ return 0;
143
+ }
144
+ deps.err(`${out} is ${current === null ? 'missing' : 'out of date with the model'}; run without --check to regenerate it.`);
145
+ return 1;
146
+ }
147
+ files.write(out, generated.source);
148
+ deps.out(`Wrote ${out}: ${generated.types.length} collection${generated.types.length === 1 ? '' : 's'}, ` +
149
+ `${generated.globals.length} global${generated.globals.length === 1 ? '' : 's'}, ` +
150
+ `${generated.blocks.length} block type${generated.blocks.length === 1 ? '' : 's'}.`);
151
+ return 0;
152
+ }
153
+ case 'pull': {
154
+ const format = formatOf(value('--format'));
155
+ const target = await (0, library_1.resolveLibrary)(deps.client, want());
156
+ const res = await deps.client.content.model.export(target.orgId, target.libraryId, format);
157
+ const out = value('--out') ?? res.filename;
158
+ files.write(out, res.content);
159
+ if (json)
160
+ deps.out(JSON.stringify({ file: out, version: res.version, issues: res.issues }, null, 2));
161
+ else {
162
+ deps.out(`Wrote ${out} from "${target.name}" (model version ${res.version}).`);
163
+ for (const line of (0, render_1.issueLines)(res.issues))
164
+ deps.out(line);
165
+ }
166
+ return 0;
167
+ }
168
+ case 'push': {
169
+ const file = rest[0] ?? ['forumulate.content.json', 'forumulate.payload.ts'].find((f) => files.exists(f));
170
+ if (!file)
171
+ throw new UsageError('No model file: name one, or run in a folder with forumulate.content.json or forumulate.payload.ts.');
172
+ const content = files.read(file);
173
+ const format = formatOf(value('--format'), file);
174
+ const header = fileHeader(format, content);
175
+ const target = await (0, library_1.resolveLibrary)(deps.client, want(header.library));
176
+ const ops = renameOps(argv);
177
+ const force = flag('--force');
178
+ const body = { format, content, ...(ops.length ? { ops } : {}), ...(force ? { force } : {}) };
179
+ const dry = await deps.client.content.model.import(target.orgId, target.libraryId, { ...body, dryRun: true });
180
+ if (json && (flag('--dry-run') || !dry.changed)) {
181
+ deps.out(JSON.stringify(dry, null, 2));
182
+ return 0;
183
+ }
184
+ if (!json) {
185
+ deps.out(`${file} → "${target.name}" (model version ${dry.version}):`);
186
+ for (const line of (0, render_1.pushReport)(dry))
187
+ deps.out(line);
188
+ if (dry.changed && header.version !== undefined && header.version !== dry.version && !force) {
189
+ deps.err(`This file was pulled at version ${header.version}; the library is at ${dry.version}. Pull again, or apply with --force.`);
190
+ }
191
+ }
192
+ if (flag('--dry-run') || !dry.changed)
193
+ return 0;
194
+ if (!flag('--yes')) {
195
+ if (!deps.ask) {
196
+ deps.err('Nothing applied: pass --yes to apply without a prompt (or --dry-run to only look).');
197
+ return 1;
198
+ }
199
+ const answer = (await deps.ask(`Apply ${dry.diff.length || 'these'} change(s) to "${target.name}"? [y/N] `)).trim().toLowerCase();
200
+ if (answer !== 'y' && answer !== 'yes') {
201
+ deps.out('Nothing applied.');
202
+ return 0;
203
+ }
204
+ }
205
+ const applied = await deps.client.content.model.import(target.orgId, target.libraryId, body);
206
+ if (json)
207
+ deps.out(JSON.stringify(applied, null, 2));
208
+ else
209
+ deps.out(applied.applied ? `Applied: "${target.name}" is at model version ${applied.version}.` : 'Nothing to apply.');
210
+ return 0;
211
+ }
212
+ default:
213
+ deps.err(`Usage: forumulate content types|pull|push … (forumulate help)`);
214
+ return 1;
215
+ }
216
+ }
217
+ catch (e) {
218
+ if (e instanceof UsageError || e instanceof library_1.TargetError) {
219
+ deps.err(e.message);
220
+ return 1;
221
+ }
222
+ throw e;
223
+ }
224
+ }
225
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/content/command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Which content library a `forumulate content` command means.
3
+ *
4
+ * A person types a slug (`--library acme-site`); the API wants ids. The org is
5
+ * optional because a pulled file already names its library by id, and asking
6
+ * for the org as well would be asking for something the CLI can look up. An
7
+ * ambiguous slug (two orgs with an `acme-site`) is refused with the orgs
8
+ * named, never guessed.
9
+ */
10
+ import type { ForumulateClient } from '@forumulate/sdk';
11
+ export interface LibraryTarget {
12
+ orgId: string;
13
+ libraryId: string;
14
+ name: string;
15
+ }
16
+ export declare class TargetError extends Error {
17
+ }
18
+ export declare function resolveLibrary(client: ForumulateClient, want: {
19
+ org?: string;
20
+ library?: string;
21
+ }): Promise<LibraryTarget>;
22
+ //# sourceMappingURL=library.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"library.d.ts","sourceRoot":"","sources":["../../src/content/library.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAIxD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,WAAY,SAAQ,KAAK;CAAG;AAUzC,wBAAsB,cAAc,CAClC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACvC,OAAO,CAAC,aAAa,CAAC,CAqBxB"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TargetError = void 0;
4
+ exports.resolveLibrary = resolveLibrary;
5
+ const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
6
+ class TargetError extends Error {
7
+ }
8
+ exports.TargetError = TargetError;
9
+ async function orgIdOf(client, org) {
10
+ if (UUID.test(org))
11
+ return org;
12
+ const { orgs } = await client.orgs.list();
13
+ const hit = orgs.find((o) => o.slug === org || o.id === org);
14
+ if (!hit)
15
+ throw new TargetError(`No organization "${org}" among yours (forumulate orgs lists them).`);
16
+ return hit.id;
17
+ }
18
+ async function resolveLibrary(client, want) {
19
+ if (!want.library) {
20
+ throw new TargetError('Say which content library: --library <id|slug> (or FORUMULATE_LIBRARY).');
21
+ }
22
+ const library = want.library;
23
+ const orgIds = want.org ? [await orgIdOf(client, want.org)] : (await client.orgs.list()).orgs.map((o) => o.id);
24
+ const hits = [];
25
+ for (const orgId of orgIds) {
26
+ // An org the caller cannot list libraries in simply has none for them.
27
+ const listed = await client.content.libraries.list(orgId).catch(() => ({ libraries: [] }));
28
+ for (const l of listed.libraries) {
29
+ if (l.id === library || l.slug === library)
30
+ hits.push({ orgId, libraryId: l.id, name: l.name });
31
+ }
32
+ }
33
+ if (hits.length === 1)
34
+ return hits[0];
35
+ if (!hits.length) {
36
+ throw new TargetError(`No content library "${library}"${want.org ? ` in ${want.org}` : ' in any of your organizations'}.`);
37
+ }
38
+ throw new TargetError(`"${library}" names a library in ${hits.length} organizations (${hits.map((h) => h.orgId).join(', ')}); add --org.`);
39
+ }
40
+ //# sourceMappingURL=library.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"library.js","sourceRoot":"","sources":["../../src/content/library.ts"],"names":[],"mappings":";;;AA6BA,wCAwBC;AA1CD,MAAM,IAAI,GAAG,iEAAiE,CAAC;AAQ/E,MAAa,WAAY,SAAQ,KAAK;CAAG;AAAzC,kCAAyC;AAEzC,KAAK,UAAU,OAAO,CAAC,MAAwB,EAAE,GAAW;IAC1D,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IAC/B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;IAC7D,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,WAAW,CAAC,oBAAoB,GAAG,6CAA6C,CAAC,CAAC;IACtG,OAAO,GAAG,CAAC,EAAE,CAAC;AAChB,CAAC;AAEM,KAAK,UAAU,cAAc,CAClC,MAAwB,EACxB,IAAwC;IAExC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,IAAI,WAAW,CAAC,yEAAyE,CAAC,CAAC;IACnG,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/G,MAAM,IAAI,GAAoB,EAAE,CAAC;IACjC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,uEAAuE;QACvE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3F,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,CAAC,EAAE,KAAK,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;gBAAE,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAClG,CAAC;IACH,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,CAAE,CAAC;IACvC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,MAAM,IAAI,WAAW,CAAC,uBAAuB,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,+BAA+B,GAAG,CAAC,CAAC;IAC7H,CAAC;IACD,MAAM,IAAI,WAAW,CACnB,IAAI,OAAO,wBAAwB,IAAI,CAAC,MAAM,mBAAmB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CACpH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * A model push's diff and issues, as lines a person reads before saying yes.
3
+ *
4
+ * `+` adds, `-` removes, `~` changes, one line per change, addressed the way
5
+ * the model is (`post.author`, `block hero.heading`, `post setting
6
+ * titleField`), so the line is what the author would search the file for.
7
+ * Pure: the command prints what this returns.
8
+ */
9
+ import type { ContentModelImportResult, ModelChangeLine, ModelFileIssue, ModelOp } from '@forumulate/sdk';
10
+ export declare function diffLines(diff: readonly ModelChangeLine[]): string[];
11
+ export declare function opLine(op: ModelOp): string;
12
+ export declare function issueLines(issues: readonly ModelFileIssue[]): string[];
13
+ /** The whole report of a push (dry or not). */
14
+ export declare function pushReport(r: ContentModelImportResult): string[];
15
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/content/render.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,wBAAwB,EAAE,eAAe,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAgB1G,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,eAAe,EAAE,GAAG,MAAM,EAAE,CAuBpE;AAED,wBAAgB,MAAM,CAAC,EAAE,EAAE,OAAO,GAAG,MAAM,CAc1C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,EAAE,CAOtE;AAED,+CAA+C;AAC/C,wBAAgB,UAAU,CAAC,CAAC,EAAE,wBAAwB,GAAG,MAAM,EAAE,CAQhE"}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.diffLines = diffLines;
4
+ exports.opLine = opLine;
5
+ exports.issueLines = issueLines;
6
+ exports.pushReport = pushReport;
7
+ const show = (v) => {
8
+ if (v === undefined)
9
+ return '(none)';
10
+ const s = JSON.stringify(v);
11
+ return s.length > 80 ? `${s.slice(0, 77)}...` : s;
12
+ };
13
+ const MARK = { add: '+', remove: '-', change: '~' };
14
+ function where(c) {
15
+ const block = c.blockType ? `block ${c.blockType}` : '';
16
+ const scope = [c.type, block].filter(Boolean).join(' ');
17
+ return c.path ? (scope ? `${scope}.${c.path}` : c.path) : scope;
18
+ }
19
+ function diffLines(diff) {
20
+ return diff.map((c) => {
21
+ const mark = MARK[c.op];
22
+ switch (c.target) {
23
+ case 'type':
24
+ if (c.op === 'change')
25
+ return `${mark} type ${c.type} ${c.property}: ${show(c.before)} → ${show(c.after)}`;
26
+ return `${mark} type ${c.type} ${show(c.op === 'add' ? c.after : c.before)}`;
27
+ case 'setting':
28
+ return `${mark} ${c.type} setting ${c.property}: ${show(c.before)} → ${show(c.after)}`;
29
+ case 'blockType':
30
+ if (c.op === 'change')
31
+ return `${mark} ${where(c)} ${c.property}: ${show(c.before)} → ${show(c.after)}`;
32
+ return `${mark} ${where(c)} ${show(c.op === 'add' ? c.after : c.before)}`;
33
+ default: {
34
+ if (c.op === 'add')
35
+ return `${mark} ${where(c)} (${String(c.after)})`;
36
+ if (c.op === 'remove')
37
+ return `${mark} ${where(c)} (${String(c.before)})`;
38
+ if (c.property === 'order') {
39
+ const list = (v) => (Array.isArray(v) ? v.join(', ') : show(v));
40
+ return `${mark} ${where(c) || c.type || ''} order: ${list(c.before)} → ${list(c.after)}`;
41
+ }
42
+ return `${mark} ${where(c)} ${c.property}: ${show(c.before)} → ${show(c.after)}`;
43
+ }
44
+ }
45
+ });
46
+ }
47
+ function opLine(op) {
48
+ const scope = 'blockType' in op && op.blockType ? `block ${op.blockType}.` : 'type' in op && op.type ? `${op.type}.` : '';
49
+ switch (op.op) {
50
+ case 'renameField':
51
+ return `rename ${scope}${op.from} → ${op.to}`;
52
+ case 'removeField':
53
+ return `remove ${scope}${op.path} (values hidden, restorable for 30 days)`;
54
+ case 'restoreField':
55
+ return `restore ${scope}${op.path}`;
56
+ case 'renameType':
57
+ return `rename type ${op.from} → ${op.to}`;
58
+ case 'renameBlockType':
59
+ return `rename block ${op.from} → ${op.to}`;
60
+ }
61
+ }
62
+ function issueLines(issues) {
63
+ if (!issues.length)
64
+ return [];
65
+ const width = Math.max(...issues.map((i) => i.kind.length));
66
+ return [
67
+ `Not carried over as written (${issues.length}):`,
68
+ ...issues.map((i) => ` ${i.kind.padEnd(width)} ${i.path || '(config)'} ${i.message}`),
69
+ ];
70
+ }
71
+ /** The whole report of a push (dry or not). */
72
+ function pushReport(r) {
73
+ const out = [];
74
+ if (!r.changed)
75
+ out.push('No changes: the file matches the library model.');
76
+ else if (r.storageOnly)
77
+ out.push('No content type changes; the stored model is rearranged (a field moved between the library shape and a type).');
78
+ else
79
+ out.push(`${r.diff.length} change${r.diff.length === 1 ? '' : 's'}:`, ...diffLines(r.diff).map((l) => ` ${l}`));
80
+ if (r.changed && r.ops.length)
81
+ out.push('Operations:', ...r.ops.map((o) => ` ${opLine(o)}`));
82
+ out.push(...issueLines(r.issues));
83
+ return out;
84
+ }
85
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/content/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * TypeScript from a content library's `schema.json` (plan P4-T1, spec 7):
3
+ * `forumulate content types --library acme-site --out src/forumulate.d.ts`.
4
+ *
5
+ * The schema names everything already: `type.<key>` is a content type's
6
+ * `fields`, `entry.<key>` the delivery envelope around them (marked
7
+ * `x-forumulate-global` for a global), `block.<key>` a block type, and
8
+ * `json.*` the hoisted definitions of a json field's own schema. Each becomes
9
+ * one named type, so a `json` field is typed from its schema, a blocks
10
+ * field is a union discriminated on `blockType`, and a reference to an
11
+ * author is an `AuthorFields`.
12
+ *
13
+ * One deliberate departure from the schema: objects are CLOSED here. The
14
+ * schema says `additionalProperties: true` so a site keeps working while a
15
+ * field is being renamed; the types say exactly what the model has, so code
16
+ * that still reads the old name fails to compile after the model changes.
17
+ * That compile error is the point of generating types at all.
18
+ *
19
+ * Pure and deterministic: same schema, same bytes.
20
+ */
21
+ export declare function pascal(s: string): string;
22
+ /** The TypeScript name of a `$defs` entry. */
23
+ export declare function defName(def: string): string;
24
+ /** One schema as a TypeScript type expression. */
25
+ export declare function toType(s: unknown, indent?: string): string;
26
+ export interface GenerateOptions {
27
+ /** Named in the header so the file says where it came from. */
28
+ libraryId?: string;
29
+ /** The command that regenerates it, for the header. */
30
+ command?: string;
31
+ }
32
+ export interface Generated {
33
+ source: string;
34
+ types: string[];
35
+ globals: string[];
36
+ blocks: string[];
37
+ }
38
+ /** The whole `forumulate.d.ts` for a library schema. */
39
+ export declare function generateTypes(schema: unknown, opts?: GenerateOptions): Generated;
40
+ //# sourceMappingURL=types-gen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-gen.d.ts","sourceRoot":"","sources":["../../src/content/types-gen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAOH,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAQxC;AAED,8CAA8C;AAC9C,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQ3C;AA0BD,kDAAkD;AAClD,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,SAAK,GAAG,MAAM,CA2CtD;AAuCD,MAAM,WAAW,eAAe;IAC9B,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,wDAAwD;AACxD,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,GAAE,eAAoB,GAAG,SAAS,CA0CpF"}