@apimatic/cli 2.0.0-beta.1 → 2.0.0-beta.3

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 (89) hide show
  1. package/README.md +19 -6
  2. package/apimatic.schema.json +1 -1
  3. package/lib/actions/plugin/generate.d.ts +0 -2
  4. package/lib/actions/plugin/generate.js +5 -8
  5. package/lib/actions/plugin/generate.js.map +1 -1
  6. package/lib/actions/portal/serve.js +4 -3
  7. package/lib/actions/portal/serve.js.map +1 -1
  8. package/lib/actions/quickstart.js +3 -4
  9. package/lib/actions/quickstart.js.map +1 -1
  10. package/lib/actions/sdk/generate.js +16 -3
  11. package/lib/actions/sdk/generate.js.map +1 -1
  12. package/lib/actions/sdk/publish.js +6 -2
  13. package/lib/actions/sdk/publish.js.map +1 -1
  14. package/lib/infrastructure/services/portal-artifacts-service.js +6 -5
  15. package/lib/infrastructure/services/portal-artifacts-service.js.map +1 -1
  16. package/lib/infrastructure/zip-service.d.ts +6 -2
  17. package/lib/infrastructure/zip-service.js +42 -24
  18. package/lib/infrastructure/zip-service.js.map +1 -1
  19. package/lib/prompts/plugin/generate.d.ts +3 -3
  20. package/lib/prompts/plugin/generate.js +19 -11
  21. package/lib/prompts/plugin/generate.js.map +1 -1
  22. package/lib/prompts/portal/serve.js +9 -11
  23. package/lib/prompts/portal/serve.js.map +1 -1
  24. package/lib/prompts/portal/source.d.ts +4 -2
  25. package/lib/prompts/portal/source.js +42 -8
  26. package/lib/prompts/portal/source.js.map +1 -1
  27. package/lib/prompts/quickstart.js +4 -10
  28. package/lib/prompts/quickstart.js.map +1 -1
  29. package/lib/prompts/sdk/generate.d.ts +5 -0
  30. package/lib/prompts/sdk/generate.js +10 -0
  31. package/lib/prompts/sdk/generate.js.map +1 -1
  32. package/lib/prompts/sdk/publish.d.ts +3 -0
  33. package/lib/prompts/sdk/publish.js +3 -0
  34. package/lib/prompts/sdk/publish.js.map +1 -1
  35. package/lib/types/apimatic-config/document.d.ts +4 -6
  36. package/lib/types/apimatic-config/document.js +4 -10
  37. package/lib/types/apimatic-config/document.js.map +1 -1
  38. package/lib/types/file/file-problem.d.ts +4 -0
  39. package/lib/types/file/file-problem.js +2 -0
  40. package/lib/types/file/file-problem.js.map +1 -0
  41. package/lib/types/plugin/generation-problem.d.ts +10 -0
  42. package/lib/types/plugin/generation-problem.js +2 -0
  43. package/lib/types/plugin/generation-problem.js.map +1 -0
  44. package/lib/types/plugin-config-context.js +2 -1
  45. package/lib/types/plugin-config-context.js.map +1 -1
  46. package/lib/types/plugin-context.d.ts +3 -1
  47. package/lib/types/plugin-context.js +2 -1
  48. package/lib/types/plugin-context.js.map +1 -1
  49. package/lib/types/portal/content-notices.d.ts +11 -3
  50. package/lib/types/portal/content-tree.d.ts +4 -2
  51. package/lib/types/portal/content-tree.js +42 -12
  52. package/lib/types/portal/content-tree.js.map +1 -1
  53. package/lib/types/portal/generated-pages.d.ts +6 -6
  54. package/lib/types/portal/generated-pages.js +3 -3
  55. package/lib/types/portal/generated-pages.js.map +1 -1
  56. package/lib/types/portal/portal-navigation.d.ts +83 -12
  57. package/lib/types/portal/portal-navigation.js +276 -100
  58. package/lib/types/portal/portal-navigation.js.map +1 -1
  59. package/lib/types/portal/preview-content.js +15 -2
  60. package/lib/types/portal/preview-content.js.map +1 -1
  61. package/lib/types/portal-context.d.ts +1 -0
  62. package/lib/types/portal-context.js +17 -12
  63. package/lib/types/portal-context.js.map +1 -1
  64. package/lib/types/portal-source-context.js +7 -4
  65. package/lib/types/portal-source-context.js.map +1 -1
  66. package/lib/types/project-context.d.ts +2 -1
  67. package/lib/types/project-context.js +2 -2
  68. package/lib/types/project-context.js.map +1 -1
  69. package/lib/types/sdk-context.d.ts +7 -2
  70. package/lib/types/sdk-context.js +8 -6
  71. package/lib/types/sdk-context.js.map +1 -1
  72. package/lib/types/spec-context.d.ts +3 -1
  73. package/lib/types/spec-context.js +5 -4
  74. package/lib/types/spec-context.js.map +1 -1
  75. package/lib/types/temp-context.d.ts +5 -3
  76. package/lib/types/temp-context.js +7 -7
  77. package/lib/types/temp-context.js.map +1 -1
  78. package/oclif.manifest.json +1 -1
  79. package/package.json +7 -6
  80. package/portal-template/src/components/api-page.tsx +2 -6
  81. package/portal-template/src/components/example-layout.tsx +7 -7
  82. package/portal-template/src/components/usage-tabs.tsx +16 -36
  83. package/portal-template/src/lib/media-adapters.ts +3 -3
  84. package/portal-template/src/lib/navigation-schema.ts +13 -0
  85. package/portal-template/src/lib/navigation.ts +60 -117
  86. package/portal-template/src/lib/request-examples.ts +12 -28
  87. package/portal-template/src/lib/source.ts +3 -2
  88. package/portal-template/src/lib/tabs.ts +3 -2
  89. package/portal-template/src/components/code-block.tsx +0 -9
@@ -7,10 +7,10 @@ const BYTE_ORDER_MARK = 0xfeff;
7
7
  /** Everything in this directory that no other entry names. */
8
8
  const REST_TOKEN = '...';
9
9
  /** The API reference, positioned as one node. */
10
- const API_REFERENCE_TOKEN = 'apimatic:api';
10
+ export const API_REFERENCE_TOKEN = 'apimatic:api';
11
11
  const APIMATIC_PREFIX = 'apimatic:';
12
- /** Each generated section's tab, and the API reference. */
13
- const TOKENS = [...GENERATED_SECTIONS.map((section) => section.token), API_REFERENCE_TOKEN];
12
+ /** Each generated section's token and the API reference's, in the order the scaffold lists them as tabs. */
13
+ export const TOKENS = [...GENERATED_SECTIONS.map((section) => section.token), API_REFERENCE_TOKEN];
14
14
  /** The directory the reference is mounted at, which `content/api/` shares, and so the name someone guesses for it. */
15
15
  export const API_REFERENCE_NAME = 'api';
16
16
  /** The page a folder below the content root links to, which is never one of its children. */
@@ -18,11 +18,26 @@ export const INDEX_NAME = 'index';
18
18
  /** A `(group)` folder, which a page's address leaves out and a folder's name leaves unbracketed. */
19
19
  export const GROUP_FOLDER = /^\((.+)\)$/;
20
20
  export const NAVIGATION_FILE_NAME = 'nav.json';
21
+ /** Orders the folder's nodes; at the content root, Home's sidebar. */
22
+ const PAGES_FIELD = 'pages';
23
+ /** The root file's list of the tabs after Home, which are the only tabs. */
24
+ const TABS_FIELD = 'tabs';
21
25
  // A misspelled field would otherwise be stripped by Fumadocs' own schema and leave the
22
- // sidebar in its default order with nothing said, so every unknown field is reported. The
23
- // file has so few settings that a misspelling is answered by listing them all rather than
24
- // guessing at the one it meant.
25
- const KNOWN_FIELDS = new Set(['pages', 'title']);
26
+ // sidebar in its default order with nothing said, so every unknown field is reported.
27
+ const KNOWN_FIELDS = new Set([PAGES_FIELD, 'title']);
28
+ /** The root file's settings; the template's schema keeps each of them, and a test holds the two together. */
29
+ export const ROOT_FIELDS = new Set([...KNOWN_FIELDS, TABS_FIELD]);
30
+ /** Whether two entries name the same tab. */
31
+ export function isSameTabEntry(left, right) {
32
+ switch (left.kind) {
33
+ case 'apiReference':
34
+ return right.kind === 'apiReference';
35
+ case 'generated':
36
+ return right.kind === 'generated' && left.section === right.section;
37
+ case 'folder':
38
+ return right.kind === 'folder' && left.name === right.name;
39
+ }
40
+ }
26
41
  /**
27
42
  * The rules of a `nav.json`, applied to one file. The template re-reads the file itself and
28
43
  * orders the page tree from it, so nothing here travels into the build: this exists to
@@ -35,108 +50,222 @@ export class PortalNavigation {
35
50
  if (document.isErr()) {
36
51
  return err(document.error);
37
52
  }
38
- const unknownFields = unknownFieldErrors(document.value, KNOWN_FIELDS, (field) => PortalNavigation.describeUnknownField(field, context));
39
- const settingErrors = [...unknownFields, ...PortalNavigation.titleErrors(document.value.title, context)];
53
+ const unknownFields = unknownFieldErrors(document.value, ROOT_FIELDS, (field) => PortalNavigation.describeUnknownField(field, context));
54
+ // A file with no `pages` orders nothing, which is odd but not wrong. It may still name
55
+ // the folder, which is why the title is checked here rather than alongside the entries.
56
+ const settingErrors = [
57
+ ...unknownFields,
58
+ ...PortalNavigation.tabsPlacementErrors(document.value, context),
59
+ ...PortalNavigation.titleErrors(document.value.title, context)
60
+ ];
40
61
  const title = typeof document.value.title === 'string' ? document.value.title.trim() : undefined;
41
- const pages = document.value.pages;
42
- if (pages === undefined) {
43
- // A file with no `pages` orders nothing, which is odd but not wrong. It may still name
44
- // the folder, which is why the title is checked above rather than alongside the entries.
45
- return settingErrors.length > 0 ? err(settingErrors) : ok({ title, pages: [] });
62
+ const pages = PortalNavigation.entries(document.value.pages, PAGES_FIELD, context);
63
+ // Below the root the setting is refused above, and its entries are nobody's to check.
64
+ const tabs = context.isContentRoot
65
+ ? PortalNavigation.entries(document.value.tabs, TABS_FIELD, context)
66
+ : ok(undefined);
67
+ // Every bad entry is reported at once rather than stopping at the first, so one edit
68
+ // fixes the file: a list of the wrong type leaves the other list's entries to check.
69
+ const listed = (list, entries) => entries.isOk() ? (entries.value ?? []).map((entry) => ({ list, entry })) : [];
70
+ const errors = [
71
+ ...settingErrors,
72
+ ...(pages.isErr() ? [pages.error] : []),
73
+ ...(tabs.isErr() ? [tabs.error] : []),
74
+ ...PortalNavigation.entryErrors([...listed(PAGES_FIELD, pages), ...listed(TABS_FIELD, tabs)], context)
75
+ ];
76
+ if (errors.length > 0) {
77
+ return err(errors);
78
+ }
79
+ const pageEntries = pages.unwrapOr(undefined) ?? [];
80
+ const tabEntries = tabs.unwrapOr(undefined);
81
+ return ok({
82
+ title,
83
+ pages: pageEntries,
84
+ placedInHome: PortalNavigation.tabEntries(pageEntries, context).filter((entry) => entry.kind !== 'folder'),
85
+ tabs: tabEntries === undefined ? undefined : PortalNavigation.tabEntries(tabEntries, context)
86
+ });
87
+ }
88
+ /** A list setting's entries, trimmed, or undefined when the file has no such setting. */
89
+ static entries(value, field, context) {
90
+ if (value === undefined) {
91
+ return ok(undefined);
46
92
  }
47
- if (!Array.isArray(pages) || pages.some((entry) => typeof entry !== 'string')) {
48
- return err([...settingErrors, `${context.label}: 'pages' must be an array of strings.`]);
93
+ if (!Array.isArray(value) || value.some((entry) => typeof entry !== 'string')) {
94
+ return err(`${context.label}: '${field}' must be an array of strings.`);
49
95
  }
50
- const entries = pages.map((entry) => entry.trim());
51
- // Every bad entry is reported at once rather than stopping at the first, so one edit
52
- // fixes the file.
53
- const errors = [...settingErrors, ...PortalNavigation.entryErrors(entries, context)];
54
- return errors.length > 0 ? err(errors) : ok({ title, pages: entries });
96
+ return ok(value.map((entry) => entry.trim()));
97
+ }
98
+ /** The tabs a valid file's list names, in its order. */
99
+ static tabEntries(entries, context) {
100
+ return entries.flatMap((entry) => {
101
+ const target = PortalNavigation.target(entry, context);
102
+ return target.kind === 'apiReference' || target.kind === 'generated' || target.kind === 'folder' ? [target] : [];
103
+ });
55
104
  }
56
105
  static entryErrors(entries, context) {
57
106
  const errors = [];
58
- // Keyed by the node an entry positions rather than its text: `content/api` is where the
59
- // reference is mounted, so at the content root the name and the token reach one node --
60
- // a directory the user keeps there merges into it rather than making a second. Naming it
61
- // twice would have the template honour whichever came first without a word.
107
+ // Keyed by the node an entry positions rather than its text, and one map for both lists:
108
+ // a node is either a tab or in Home's sidebar, so `api` in one and `apimatic:api` in the
109
+ // other is the same node named twice. Naming it twice would have the template honour
110
+ // whichever came first without a word.
62
111
  const seen = new Map();
63
- for (const entry of entries) {
64
- const node = context.isContentRoot && entry === API_REFERENCE_NAME ? API_REFERENCE_TOKEN : entry;
112
+ for (const listed of entries) {
113
+ const target = PortalNavigation.target(listed.entry, context);
114
+ const node = target.kind === 'apiReference' ? API_REFERENCE_TOKEN : listed.entry;
65
115
  const earlier = seen.get(node);
66
- if (earlier !== undefined) {
67
- errors.push(earlier === entry
68
- ? `${context.label}: '${entry}' is listed more than once.`
69
- : `${context.label}: '${earlier}' and '${entry}' both position the API reference; keep one of them.`);
116
+ // The rest entry stands for whatever neither list names, so it is no node named twice
117
+ // across them; `tabs` refuses it on its own account.
118
+ if (earlier !== undefined && (earlier.list === listed.list || target.kind !== 'rest')) {
119
+ errors.push(PortalNavigation.namedTwice(earlier, listed, context));
70
120
  continue;
71
121
  }
72
- seen.set(node, entry);
73
- const checked = PortalNavigation.checkEntry(entry, context);
74
- if (checked.isErr()) {
75
- errors.push(checked.error);
122
+ seen.set(node, listed);
123
+ const error = PortalNavigation.syntaxError(listed, context) ??
124
+ (listed.list === TABS_FIELD
125
+ ? PortalNavigation.tabEntryError(listed.entry, target, context)
126
+ : PortalNavigation.pageEntryError(listed.entry, target, context));
127
+ if (error !== undefined) {
128
+ errors.push(error);
76
129
  }
77
130
  }
78
131
  return errors;
79
132
  }
80
- static checkEntry(entry, context) {
133
+ /** What an entry names in this directory, or as a token at the content root. */
134
+ static target(entry, context) {
81
135
  if (entry === REST_TOKEN) {
82
- return ok(undefined);
136
+ return { kind: 'rest' };
137
+ }
138
+ if (context.isContentRoot) {
139
+ if (entry === API_REFERENCE_NAME || entry === API_REFERENCE_TOKEN) {
140
+ return { kind: 'apiReference' };
141
+ }
142
+ const section = GENERATED_SECTIONS.find((candidate) => candidate.token === entry);
143
+ if (section !== undefined) {
144
+ return { kind: 'generated', section };
145
+ }
83
146
  }
84
147
  if (entry.startsWith(APIMATIC_PREFIX)) {
85
- return PortalNavigation.checkToken(entry, context);
148
+ return { kind: 'token', token: entry };
149
+ }
150
+ // A mounted folder, such as a specification's section under `content/api/`, is no subfolder
151
+ // but is listed twice beside a page of its name, and the folder is what the name positions.
152
+ if (context.folderNames.includes(entry) || PortalNavigation.isSharedName(entry, context)) {
153
+ return { kind: 'folder', name: entry };
154
+ }
155
+ if (context.childNames.includes(entry)) {
156
+ return { kind: 'page', name: entry };
157
+ }
158
+ if (context.emptyFolders.includes(entry)) {
159
+ return { kind: 'emptyFolder', name: entry };
86
160
  }
161
+ return { kind: 'nothing' };
162
+ }
163
+ static namedTwice(earlier, later, context) {
164
+ if (earlier.list === later.list) {
165
+ return earlier.entry === later.entry
166
+ ? `${context.label}: '${later.entry}' is listed more than once.`
167
+ : `${context.label}: '${earlier.entry}' and '${later.entry}' both position the API reference; keep one of them.`;
168
+ }
169
+ const named = earlier.entry === later.entry
170
+ ? `'${later.entry}' is in both '${earlier.list}' and '${later.list}'`
171
+ : `'${earlier.entry}' in '${earlier.list}' and '${later.entry}' in '${later.list}' both position the API reference`;
172
+ return `${context.label}: ${named}, and a node is either a tab or in Home's sidebar. Keep one of them.`;
173
+ }
174
+ /** What is wrong with an entry before it names anything: empty, or a path into another directory. */
175
+ static syntaxError({ list, entry }, context) {
87
176
  if (entry.length === 0) {
88
- return err(`${context.label}: 'pages' must not contain an empty entry.`);
177
+ return `${context.label}: '${list}' must not contain an empty entry.`;
89
178
  }
90
179
  // Naming a nested path would claim the node out of its folder and leave the folder
91
180
  // behind as an empty one, so only direct children are addressable.
92
181
  if (entry.includes('/') || entry.includes('\\')) {
93
- return err(`${context.label}: '${entry}' addresses another directory. An entry names a page or ` +
94
- `folder in this directory; order a subfolder's pages with its own ${NAVIGATION_FILE_NAME}.`);
95
- }
96
- // A page of the same name is what the entry names, since the template drops the empty folder.
97
- if (!context.childNames.includes(entry) && context.emptyFolders.includes(entry)) {
98
- return err(`${context.label}: '${entry}' is a folder with no page in it or below it, so it is not in the ` +
99
- `sidebar. Add a page to it, or remove the entry.`);
100
- }
101
- if (!context.childNames.includes(entry)) {
102
- return err(`${context.label}: '${entry}' is not a page or folder in this directory.${PortalNavigation.suggestion(entry, context)}`);
103
- }
104
- // A page and a folder of one name are both children, and an entry positions the folder,
105
- // as it does in Fumadocs' own metadata. The page could then never be positioned, which
106
- // is the quietly wrong sidebar this file exists to refuse.
107
- if (PortalNavigation.isSharedName(entry, context)) {
108
- // At the content root the folder of that name is the API reference, mounted there
109
- // whether or not a directory exists to see. "Both a page and a folder" would send the
110
- // user looking for one.
111
- return err(context.isContentRoot && entry === API_REFERENCE_NAME
112
- ? `${context.label}: '${entry}' is where the API reference is mounted, so the entry positions ` +
113
- `the reference rather than the page of that name. Rename the page to position it.`
114
- : `${context.label}: '${entry}' is both a page and a folder in this directory, and the entry ` +
115
- `positions the folder. Rename the page to position it.`);
116
- }
117
- // Below the content root the index page is the folder's own, not one of the pages it orders.
118
- if (entry === INDEX_NAME && !context.isContentRoot) {
119
- return err(`${context.label}: '${INDEX_NAME}' is the page this folder opens on, so it cannot be positioned ` +
120
- `among its pages. Remove the entry; the folder itself is positioned by the ${NAVIGATION_FILE_NAME} ` +
121
- `one level up.`);
122
- }
123
- // Each folder the content root lists is a tab, and the home page is the Home tab's.
124
- if (context.homePageFolders.includes(entry)) {
125
- return err(`${context.label}: '${entry}' serves the home page, which belongs to the Home tab, so it cannot ` +
126
- `be a tab of its own. Remove the entry, or move the page out of the folder.`);
127
- }
128
- return ok(undefined);
129
- }
130
- static checkToken(entry, context) {
131
- if (!TOKENS.includes(entry)) {
132
- return err(`${context.label}: '${entry}' is not a ${NAVIGATION_FILE_NAME} token. ` +
133
- `The tokens are ${quotedList(TOKENS)}.`);
134
- }
135
- if (!context.isContentRoot) {
136
- return err(`${context.label}: '${entry}' can only be used in the ${NAVIGATION_FILE_NAME} at the top ` +
137
- `of the content directory, because that is where the node it positions lives.`);
138
- }
139
- return ok(undefined);
182
+ return list === TABS_FIELD
183
+ ? `${context.label}: '${entry}' addresses another directory. A tab is a folder directly under the ` +
184
+ `content directory.`
185
+ : `${context.label}: '${entry}' addresses another directory. An entry names a page or ` +
186
+ `folder in this directory; order a subfolder's pages with its own ${NAVIGATION_FILE_NAME}.`;
187
+ }
188
+ return undefined;
189
+ }
190
+ /** The rules of a `tabs` entry: a folder directly under the content directory, the API reference or a section. */
191
+ static tabEntryError(entry, target, context) {
192
+ switch (target.kind) {
193
+ case 'rest':
194
+ // A tab for every unlisted folder is the "every top-level folder a tab" design this
195
+ // file exists to avoid: a project that groups its guides into folders would grow a row of tabs.
196
+ return (`${context.label}: '${REST_TOKEN}' cannot be a tab, since it would make a tab of every folder ` +
197
+ `'${TABS_FIELD}' does not name. Name the folders meant as tabs; the rest stay in Home.`);
198
+ case 'token':
199
+ return PortalNavigation.tokenError(target.token, context);
200
+ case 'apiReference':
201
+ return PortalNavigation.apiSharedNameError(entry, context);
202
+ case 'generated':
203
+ return undefined;
204
+ case 'folder':
205
+ // The home page belongs to the Home tab, which opens on it.
206
+ return context.homePageFolders.includes(target.name)
207
+ ? `${context.label}: '${entry}' serves the home page, which belongs to the Home tab, so it cannot ` +
208
+ `be a tab of its own. Remove the entry, or move the page out of the folder.`
209
+ : undefined;
210
+ case 'page':
211
+ return `${context.label}: ${PortalNavigation.pageIsNoTab(target.name)}`;
212
+ case 'emptyFolder':
213
+ return PortalNavigation.emptyFolderError(entry, context);
214
+ case 'nothing':
215
+ return `${context.label}: '${entry}' is not a folder in this directory.${PortalNavigation.tabSuggestion(entry, context)}`;
216
+ }
217
+ }
218
+ /** The rules of a `pages` entry: a page or folder in this directory, or at the content root a token. */
219
+ static pageEntryError(entry, target, context) {
220
+ switch (target.kind) {
221
+ case 'rest':
222
+ case 'generated':
223
+ return undefined;
224
+ case 'token':
225
+ return PortalNavigation.tokenError(target.token, context);
226
+ case 'apiReference':
227
+ return PortalNavigation.apiSharedNameError(entry, context);
228
+ case 'folder':
229
+ // A page and a folder of one name are both children, and an entry positions the folder.
230
+ // The page could then never be positioned, which is the quietly wrong sidebar this file
231
+ // exists to refuse.
232
+ return PortalNavigation.isSharedName(target.name, context)
233
+ ? `${context.label}: '${entry}' is both a page and a folder in this directory, and the entry ` +
234
+ `positions the folder. Rename the page to position it.`
235
+ : undefined;
236
+ case 'page':
237
+ // Below the content root the index page is the folder's own, not one of the pages it orders.
238
+ return target.name === INDEX_NAME && !context.isContentRoot
239
+ ? `${context.label}: '${INDEX_NAME}' is the page this folder opens on, so it cannot be positioned ` +
240
+ `among its pages. Remove the entry; the folder itself is positioned by the ${NAVIGATION_FILE_NAME} ` +
241
+ `one level up.`
242
+ : undefined;
243
+ case 'emptyFolder':
244
+ return PortalNavigation.emptyFolderError(entry, context);
245
+ case 'nothing':
246
+ return `${context.label}: '${entry}' is not a page or folder in this directory.${PortalNavigation.suggestion(entry, context)}`;
247
+ }
248
+ }
249
+ /** An `apimatic:` entry that positions nothing here: no token at all, or one below the root. */
250
+ static tokenError(token, context) {
251
+ if (!TOKENS.includes(token)) {
252
+ return `${context.label}: '${token}' is not a ${NAVIGATION_FILE_NAME} token. The tokens are ${quotedList(TOKENS)}.`;
253
+ }
254
+ // A nested file could not claim a node that lives at the root without the template moving
255
+ // nodes between folders, which is what makes losing a page impossible today.
256
+ return (`${context.label}: '${token}' can only be used in the ${NAVIGATION_FILE_NAME} at the top ` +
257
+ `of the content directory, because that is where the node it positions lives. List it in that ` +
258
+ `file's '${TABS_FIELD}' to make it a tab, or in its '${PAGES_FIELD}' to place it in Home.`);
259
+ }
260
+ /** The tabs are decided at the top of the content directory, and nothing reads the setting anywhere else. */
261
+ static tabsPlacementErrors(document, context) {
262
+ if (context.isContentRoot || !Object.hasOwn(document, TABS_FIELD)) {
263
+ return [];
264
+ }
265
+ return [
266
+ `${context.label}: '${TABS_FIELD}' is only read in the ${NAVIGATION_FILE_NAME} at the top of the content ` +
267
+ `directory, where the tabs are decided. Remove it here; this file orders its own folder with '${PAGES_FIELD}'.`
268
+ ];
140
269
  }
141
270
  static parseObject(json, context) {
142
271
  // Unlike `apimatic.json`, this file is not read by the CLI alone: the build reads it again
@@ -164,10 +293,23 @@ export class PortalNavigation {
164
293
  static isSharedName(entry, context) {
165
294
  return context.childNames.filter((name) => name === entry).length > 1;
166
295
  }
296
+ /** Only `api` spelled out might have meant a page of that name beside the mount point; the token never does. */
297
+ static apiSharedNameError(entry, context) {
298
+ return entry === API_REFERENCE_NAME && PortalNavigation.isSharedName(API_REFERENCE_NAME, context)
299
+ ? `${context.label}: '${API_REFERENCE_NAME}' is where the API reference is mounted, so the entry positions ` +
300
+ `the reference rather than the page of that name. Rename the page to position it.`
301
+ : undefined;
302
+ }
303
+ static emptyFolderError(entry, context) {
304
+ return (`${context.label}: '${entry}' is a folder with no page in it or below it, so it is not in the ` +
305
+ `sidebar. Add a page to it, or remove the entry.`);
306
+ }
307
+ static pageIsNoTab(name) {
308
+ return `'${name}' is a page, and a tab is a folder. Order it in Home's sidebar with '${PAGES_FIELD}' instead.`;
309
+ }
167
310
  /**
168
311
  * A folder is named after its directory, or after the title of its index page; `title`
169
- * outranks both. At the content root it names the Home tab, which holds the pages there and
170
- * the folders the file does not list.
312
+ * outranks both. At the content root it names the Home tab.
171
313
  */
172
314
  static titleErrors(title, context) {
173
315
  if (title === undefined) {
@@ -186,25 +328,59 @@ export class PortalNavigation {
186
328
  return [];
187
329
  }
188
330
  static describeUnknownField(field, context) {
189
- // Listed from the same set the check uses, so a setting added later is named here too.
190
- const settings = quotedList([...KNOWN_FIELDS]);
331
+ const settings = quotedList([...(context.isContentRoot ? ROOT_FIELDS : KNOWN_FIELDS)]);
191
332
  return `${context.label}: '${field}' is not a ${NAVIGATION_FILE_NAME} setting. The settings are ${settings}.`;
192
333
  }
193
- /** A near miss is nearly always a typo or a forgotten extension, so name the candidate. */
334
+ /** A tab entry's near miss, in the words of what `tabs` accepts. */
335
+ static tabSuggestion(entry, context) {
336
+ const miss = PortalNavigation.nearMiss(entry, context);
337
+ switch (miss?.kind) {
338
+ case 'apiReference':
339
+ return ` The API reference is a tab as '${API_REFERENCE_NAME}' or '${API_REFERENCE_TOKEN}'.`;
340
+ case 'generated':
341
+ return ` '${miss.section.token}' makes ${miss.section.description} a tab.`;
342
+ case 'folder':
343
+ return ` Did you mean '${miss.name}'?`;
344
+ case 'page':
345
+ return ` ${PortalNavigation.pageIsNoTab(miss.name)}`;
346
+ default:
347
+ return '';
348
+ }
349
+ }
350
+ /** A `pages` entry's near miss; a folder and a page are both children here, so one sentence names either. */
194
351
  static suggestion(entry, context) {
352
+ const miss = PortalNavigation.nearMiss(entry, context);
353
+ switch (miss?.kind) {
354
+ case 'apiReference':
355
+ return ` The API reference is positioned with '${API_REFERENCE_TOKEN}'.`;
356
+ case 'generated':
357
+ return ` '${miss.section.token}' positions ${miss.section.description}.`;
358
+ case 'folder':
359
+ case 'page':
360
+ return ` Did you mean '${miss.name}'?`;
361
+ default:
362
+ return '';
363
+ }
364
+ }
365
+ /** A near miss is nearly always a typo or a forgotten extension, so find what it names. */
366
+ static nearMiss(entry, context) {
195
367
  const lowered = entry.toLowerCase();
196
- const withoutExtension = lowered.replace(/\.mdx?$/i, '');
197
368
  // Matched without the extension too, so `api.md` is answered like `api` rather than
198
369
  // pointed at a name that is refused the moment they write it.
199
- if (withoutExtension === API_REFERENCE_NAME && context.isContentRoot) {
200
- return ` The API reference is positioned with '${API_REFERENCE_TOKEN}'.`;
201
- }
202
- const section = context.isContentRoot ? PortalNavigation.sectionGuessed(withoutExtension) : undefined;
203
- if (section !== undefined) {
204
- return ` '${section.token}' positions ${section.description}.`;
370
+ const stripped = lowered.replace(/\.mdx?$/i, '');
371
+ if (context.isContentRoot) {
372
+ if (stripped === API_REFERENCE_NAME) {
373
+ return { kind: 'apiReference' };
374
+ }
375
+ const section = PortalNavigation.sectionGuessed(stripped);
376
+ if (section !== undefined) {
377
+ return { kind: 'generated', section };
378
+ }
205
379
  }
206
- const candidate = context.childNames.find((name) => name.toLowerCase() === lowered || name.toLowerCase() === withoutExtension);
207
- return candidate === undefined ? '' : ` Did you mean '${candidate}'?`;
380
+ const matches = (name) => name.toLowerCase() === lowered || name.toLowerCase() === stripped;
381
+ const candidate = context.folderNames.find(matches) ?? context.childNames.find(matches);
382
+ const target = candidate === undefined ? undefined : PortalNavigation.target(candidate, context);
383
+ return target?.kind === 'folder' || target?.kind === 'page' ? target : undefined;
208
384
  }
209
385
  /**
210
386
  * The section an entry was most likely meant to position: one named after its address, or
@@ -1 +1 @@
1
- {"version":3,"file":"portal-navigation.js","sourceRoot":"","sources":["../../../src/types/portal/portal-navigation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"portal-navigation.js","sourceRoot":"","sources":["../../../src/types/portal/portal-navigation.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { isSameTabEntry } from './portal-navigation.js';
1
2
  /** A notice is given once, on the save that brings it about, rather than on every save after it. */
2
3
  export class PreviewContent {
3
4
  shown;
@@ -23,14 +24,26 @@ export class PreviewContent {
23
24
  return {
24
25
  hiddenPages: whenAnyNew(current.hiddenPages, previous.hiddenPages, (left, right) => left.isEqual(right)),
25
26
  ignoredNavigationFiles: whenAnyNew(current.ignoredNavigationFiles, previous.ignoredNavigationFiles, (left, right) => left.isEqual(right)),
26
- folderTabs: whenAnyNew(current.folderTabs, previous.folderTabs, (left, right) => left.isEqual(right)),
27
- sharedTabNames: whenAnyNew(current.sharedTabNames, previous.sharedTabNames, isSameSharedName)
27
+ sharedTabNames: whenAnyNew(current.sharedTabNames, previous.sharedTabNames, isSameSharedName),
28
+ noTabsListed: whenNew(current.noTabsListed, previous.noTabsListed, isSameNoTabs),
29
+ unseenHomeTitle: whenNew(current.unseenHomeTitle, previous.unseenHomeTitle, isSameFile)
28
30
  };
29
31
  }
30
32
  }
31
33
  function whenAnyNew(current, previous, isSame) {
32
34
  return current.some((item) => !previous.some((earlier) => isSame(item, earlier))) ? current : [];
33
35
  }
36
+ function whenNew(current, previous, isSame) {
37
+ return current !== undefined && (previous === undefined || !isSame(current, previous)) ? current : undefined;
38
+ }
39
+ function isSameFile(left, right) {
40
+ return left === undefined || right === undefined ? left === right : left.isEqual(right);
41
+ }
42
+ function isSameNoTabs(left, right) {
43
+ return (isSameFile(left.file, right.file) &&
44
+ left.unplaced.length === right.unplaced.length &&
45
+ left.unplaced.every((entry, index) => isSameTabEntry(entry, right.unplaced[index])));
46
+ }
34
47
  /** The same name on the same tabs, whichever file gives it to each. */
35
48
  function isSameSharedName(left, right) {
36
49
  return (left.name === right.name &&
@@ -1 +1 @@
1
- {"version":3,"file":"preview-content.js","sourceRoot":"","sources":["../../../src/types/portal/preview-content.ts"],"names":[],"mappings":"AAGA,oGAAoG;AACpG,MAAM,OAAO,cAAc;IACjB,KAAK,CAAiB;IACtB,OAAO,GAAG,KAAK,CAAC;IAExB,sEAAsE;IACtE,YAAY,OAAuB;QACjC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;IACvB,CAAC;IAEM,MAAM;QACX,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IAED;;;OAGG;IACI,IAAI,CAAC,OAAuB;QACjC,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1F,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,OAAuB,EAAE,QAAwB;QACpE,OAAO;YACL,WAAW,EAAE,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACxG,sBAAsB,EAAE,UAAU,CAChC,OAAO,CAAC,sBAAsB,EAC9B,QAAQ,CAAC,sBAAsB,EAC/B,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CACrC;YACD,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACrG,cAAc,EAAE,UAAU,CAAC,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC,cAAc,EAAE,gBAAgB,CAAC;SAC9F,CAAC;IACJ,CAAC;CACF;AAED,SAAS,UAAU,CAAI,OAAY,EAAE,QAAa,EAAE,MAAsC;IACxF,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AACnG,CAAC;AAED,uEAAuE;AACvE,SAAS,gBAAgB,CAAC,IAAmB,EAAE,KAAoB;IACjE,OAAO,CACL,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;QACxB,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM;QACtC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAC1F,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,IAAc,EAAE,KAAe;IAClD,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC5E,KAAK,WAAW;YACd,OAAO,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC;QACtE;YACE,OAAO,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC;IACpC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"preview-content.js","sourceRoot":"","sources":["../../../src/types/portal/preview-content.ts"],"names":[],"mappings":"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"}
@@ -41,5 +41,6 @@ export declare class PortalContext {
41
41
  * Null when the log itself could not be written.
42
42
  */
43
43
  saveBuildLog(log: string): Promise<FilePath | null>;
44
+ private stage;
44
45
  private addNotFoundPage;
45
46
  }
@@ -36,19 +36,10 @@ export class PortalContext {
36
36
  * touched once the whole new one is on the same volume and what remains is a rename.
37
37
  */
38
38
  async save(builtDirectory, asZip) {
39
- try {
40
- await this.addNotFoundPage(builtDirectory);
41
- await this.fileService.cleanDirectory(this.stagingDirectory);
42
- if (asZip) {
43
- await this.zipService.archive(builtDirectory, new FilePath(this.stagingDirectory, new FileName(ZIP_FILE_NAME)));
44
- }
45
- else {
46
- await this.fileService.copyDirectoryContents(builtDirectory, this.stagingDirectory);
47
- }
48
- }
49
- catch (error) {
39
+ const staged = await this.stage(builtDirectory, asZip);
40
+ if (staged.isErr()) {
50
41
  await this.fileService.deleteDirectory(this.stagingDirectory).catch(() => undefined);
51
- return err({ kind: 'stagingFailed', reason: errorMessage(error) });
42
+ return err({ kind: 'stagingFailed', reason: staged.error });
52
43
  }
53
44
  try {
54
45
  await this.fileService.cleanDirectoryExcluding(this.portalDirectory, [new FileName(STAGING_DIRECTORY)]);
@@ -75,6 +66,20 @@ export class PortalContext {
75
66
  return null;
76
67
  }
77
68
  }
69
+ async stage(builtDirectory, asZip) {
70
+ try {
71
+ await this.addNotFoundPage(builtDirectory);
72
+ await this.fileService.cleanDirectory(this.stagingDirectory);
73
+ if (asZip) {
74
+ return await this.zipService.archive(builtDirectory, new FilePath(this.stagingDirectory, new FileName(ZIP_FILE_NAME)));
75
+ }
76
+ await this.fileService.copyDirectoryContents(builtDirectory, this.stagingDirectory);
77
+ return ok(undefined);
78
+ }
79
+ catch (error) {
80
+ return err(errorMessage(error));
81
+ }
82
+ }
78
83
  async addNotFoundPage(builtDirectory) {
79
84
  const shell = new FilePath(builtDirectory, new FileName(SHELL_FILE_NAME));
80
85
  if (await this.fileService.fileExists(shell)) {