@jpmorganchase/mosaic-plugins 0.1.0-beta.6 → 0.1.0-beta.61

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 (71) hide show
  1. package/dist/$AliasPlugin.d.ts +10 -0
  2. package/dist/$AliasPlugin.js +39 -48
  3. package/dist/$AliasPlugin.js.map +1 -1
  4. package/dist/$CodeModPlugin.d.ts +7 -0
  5. package/dist/$CodeModPlugin.js +18 -30
  6. package/dist/$CodeModPlugin.js.map +1 -1
  7. package/dist/$RefPlugin.d.ts +31 -0
  8. package/dist/$RefPlugin.js +131 -127
  9. package/dist/$RefPlugin.js.map +1 -1
  10. package/dist/$TagPlugin.d.ts +28 -0
  11. package/dist/$TagPlugin.js +37 -56
  12. package/dist/$TagPlugin.js.map +1 -1
  13. package/dist/BreadcrumbsPlugin.d.ts +19 -0
  14. package/dist/BreadcrumbsPlugin.js +84 -32
  15. package/dist/BreadcrumbsPlugin.js.map +1 -1
  16. package/dist/BrokenLinksPlugin.d.ts +10 -0
  17. package/dist/BrokenLinksPlugin.js +80 -0
  18. package/dist/BrokenLinksPlugin.js.map +1 -0
  19. package/dist/FragmentPlugin.d.ts +7 -0
  20. package/dist/FragmentPlugin.js +92 -0
  21. package/dist/FragmentPlugin.js.map +1 -0
  22. package/dist/LazyPagePlugin.d.ts +14 -0
  23. package/dist/LazyPagePlugin.js +57 -87
  24. package/dist/LazyPagePlugin.js.map +1 -1
  25. package/dist/PagesWithoutFileExtPlugin.d.ts +9 -0
  26. package/dist/PagesWithoutFileExtPlugin.js +19 -31
  27. package/dist/PagesWithoutFileExtPlugin.js.map +1 -1
  28. package/dist/PropsTablePlugin.d.ts +6 -0
  29. package/dist/PropsTablePlugin.js +88 -0
  30. package/dist/PropsTablePlugin.js.map +1 -0
  31. package/dist/PublicAssetsPlugin.d.ts +18 -0
  32. package/dist/PublicAssetsPlugin.js +28 -0
  33. package/dist/PublicAssetsPlugin.js.map +1 -0
  34. package/dist/ReadingTimePlugin.d.ts +10 -0
  35. package/dist/ReadingTimePlugin.js +36 -0
  36. package/dist/ReadingTimePlugin.js.map +1 -0
  37. package/dist/SearchIndexPlugin.d.ts +56 -0
  38. package/dist/SearchIndexPlugin.js +154 -0
  39. package/dist/SearchIndexPlugin.js.map +1 -0
  40. package/dist/SharedConfigPlugin.d.ts +14 -0
  41. package/dist/SharedConfigPlugin.js +134 -38
  42. package/dist/SharedConfigPlugin.js.map +1 -1
  43. package/dist/SidebarPlugin.d.ts +44 -0
  44. package/dist/SidebarPlugin.js +246 -95
  45. package/dist/SidebarPlugin.js.map +1 -1
  46. package/dist/SiteMapPlugin.d.ts +9 -0
  47. package/dist/SiteMapPlugin.js +20 -36
  48. package/dist/SiteMapPlugin.js.map +1 -1
  49. package/dist/TableOfContentsPlugin.d.ts +20 -0
  50. package/dist/TableOfContentsPlugin.js +43 -0
  51. package/dist/TableOfContentsPlugin.js.map +1 -0
  52. package/dist/utils/PluginError.d.ts +7 -0
  53. package/dist/utils/PluginError.js +13 -0
  54. package/dist/utils/PluginError.js.map +1 -0
  55. package/dist/utils/mergePageConent.d.ts +16 -0
  56. package/dist/utils/mergePageConent.js +23 -0
  57. package/dist/utils/mergePageConent.js.map +1 -0
  58. package/dist/utils/normaliseRefs.d.ts +1 -0
  59. package/dist/utils/normaliseRefs.js +52 -69
  60. package/dist/utils/normaliseRefs.js.map +1 -1
  61. package/dist/utils/sortSidebarData.d.ts +19 -0
  62. package/dist/utils/sortSidebarData.js +35 -0
  63. package/dist/utils/sortSidebarData.js.map +1 -0
  64. package/package.json +48 -15
  65. package/CHANGELOG.md +0 -58
  66. package/dist/NextPrevPagePlugin.js +0 -63
  67. package/dist/NextPrevPagePlugin.js.map +0 -1
  68. package/dist/ReadingTimePlugin.mjs +0 -119
  69. package/dist/ReadingTimePlugin.mjs.map +0 -1
  70. package/dist/TableOfContentsPlugin.mjs +0 -140
  71. package/dist/TableOfContentsPlugin.mjs.map +0 -1
@@ -0,0 +1,154 @@
1
+ import { unified } from 'unified';
2
+ import markdown from 'remark-parse';
3
+ import remarkMdx from 'remark-mdx';
4
+ import { visit } from 'unist-util-visit';
5
+ const defaultRelevancyOptions = {
6
+ includeScore: true,
7
+ includeMatches: true,
8
+ maxPatternLength: 240,
9
+ ignoreLocation: true,
10
+ threshold: 0.3
11
+ };
12
+ /**
13
+ * We need these keys to *always* be included in the search index.
14
+ * Without the title, there would be no way to display the search results.
15
+ * Without the route, there would be no way to navigate to the page.
16
+ */
17
+ const requiredKeys = ['title', 'route'];
18
+ /**
19
+ * If there are no keys specified in the plugin options, we'll use these
20
+ */
21
+ const fallbackKeys = [...requiredKeys, 'content'];
22
+ /**
23
+ * There are three scenarios for the "keys":
24
+ *
25
+ * 1. No keys are specified in the plugin options. In this case, we'll use the fallback keys.
26
+ * 2. The keys are specified as an array of strings. In this case, we'll add the required keys to the array.
27
+ * 3. The keys are specified as an array of objects. In this case, we can assume "weighting" is being applied
28
+ * so we'll only return the keys that have been specified in the options.
29
+ *
30
+ * @param optionKeys array of keys specified in the plugin options
31
+ * @returns array of keys to be used in the search index
32
+ */
33
+ export function parseKeys(optionKeys = []) {
34
+ if (optionKeys.length < 1)
35
+ return fallbackKeys;
36
+ if (typeof optionKeys[0] === 'string')
37
+ return [...requiredKeys, ...optionKeys];
38
+ return optionKeys;
39
+ }
40
+ /**
41
+ * Converts raw content string into an array of sentences suitable for inclusion
42
+ * in the search index
43
+ *
44
+ * @param options.content the raw content string
45
+ * @param options.title the title of the page (used for adding context to parse errors)
46
+ * @param options.maxLineLength the maximum length of a sentence (set this to match the
47
+ * "location" option in your Fuse.js configuration). Sentences longer than this value will be
48
+ * truncated.
49
+ * @param options.maxLineCount the maximum number of lines to include in the search index for
50
+ * each page. Pages with more lines than this value will be truncated.
51
+ * @returns array of sentence strings
52
+ */
53
+ export const optimizeContentForSearch = async ({ content: rawContent, title, maxLineLength, maxLineCount }) => {
54
+ // Normalize line endings
55
+ const content = rawContent.replaceAll('\r', '');
56
+ if (!content || content.length < 1)
57
+ return [content];
58
+ const processor = unified().use(markdown).use(remarkMdx);
59
+ let tree;
60
+ try {
61
+ tree = await processor.parse(content);
62
+ }
63
+ catch (err) {
64
+ console.error(`Search Index Plugin failed to parse content for ${title}`, err.reason);
65
+ return [];
66
+ }
67
+ const sentences = [];
68
+ const segmenter = new Intl.Segmenter('en', { granularity: 'sentence' });
69
+ visit(tree, (node) => node.type === 'text' || node.type === 'code', (node) => {
70
+ const segments = [...segmenter.segment(node.value)].map(segment => segment.segment);
71
+ segments.forEach(segment => {
72
+ if (maxLineLength) {
73
+ sentences.push(segment.slice(0, maxLineLength));
74
+ }
75
+ else {
76
+ sentences.push(segment);
77
+ }
78
+ });
79
+ });
80
+ if (maxLineCount) {
81
+ return sentences.slice(0, maxLineCount);
82
+ }
83
+ return sentences;
84
+ };
85
+ /**
86
+ * Creates a search-data.json file that contains all the information
87
+ * from each page that is required to generate a search index.
88
+ */
89
+ const SearchIndexPlugin = {
90
+ /**
91
+ * For each source, parse the data we want to add to the search index and
92
+ * save it to the global config (to be saved to the filesystem later when
93
+ * all sources have been loaded).
94
+ */
95
+ async $beforeSend(mutableFilesystem, { config, serialiser, ignorePages }, { maxLineLength, maxLineCount, keys: optionKeys }) {
96
+ const pages = await Promise.all((await mutableFilesystem.promises.glob('**', {
97
+ onlyFiles: true,
98
+ ignore: ignorePages.map(ignore => `**/${ignore}`),
99
+ cwd: '/'
100
+ })).map(async (pagePath) => {
101
+ const deserialisedPage = await serialiser.deserialise(pagePath, await mutableFilesystem.promises.readFile(pagePath));
102
+ return deserialisedPage;
103
+ }));
104
+ const searchData = await Promise.all(pages.map(async (page) => {
105
+ const content = await optimizeContentForSearch({
106
+ content: page.content || '',
107
+ title: page.title || '',
108
+ maxLineLength,
109
+ maxLineCount
110
+ });
111
+ const keys = parseKeys(optionKeys);
112
+ /**
113
+ * If the "content" key is specified, we want to include the result of
114
+ * the optimizeContentForSearch() function. Otherwise, we include the
115
+ * key value directly from the page data.
116
+ */
117
+ return keys.reduce((acc, key) => ({ ...acc, [key]: key === 'content' ? content : page[key] }), {});
118
+ }));
119
+ /**
120
+ * Convert the searchData into an object where each page has a unique key (the
121
+ * route) so that the "merge" in `config.setData()` will correctly combine all
122
+ * the results from multiple sources.
123
+ */
124
+ const searchDataKeyedByRoute = searchData.reduce((acc, curr) => ({
125
+ ...acc,
126
+ [curr.route]: curr
127
+ }), {});
128
+ config.setData({
129
+ searchIndices: searchDataKeyedByRoute
130
+ });
131
+ },
132
+ /**
133
+ * Once we have all the sources' search data added to `globalConfig`, convert it
134
+ * to JSON and save it to the filesystem.
135
+ */
136
+ async afterUpdate(_, { sharedFilesystem, globalConfig }, { keys: optionKeys, relevancy }) {
137
+ if (!globalConfig.data.searchIndices)
138
+ return;
139
+ const globalSearchIndices = globalConfig.data.searchIndices;
140
+ const searchData = Object.values(globalSearchIndices);
141
+ const condensedSearchData = searchData.map(page => ({ title: page.title, route: page.route }));
142
+ const keys = parseKeys(optionKeys);
143
+ const searchConfig = {
144
+ ...defaultRelevancyOptions,
145
+ ...relevancy,
146
+ keys
147
+ };
148
+ await sharedFilesystem.promises.writeFile('/search-config.json', JSON.stringify(searchConfig));
149
+ await sharedFilesystem.promises.writeFile('/search-data.json', JSON.stringify(searchData));
150
+ await sharedFilesystem.promises.writeFile('/search-data-condensed.json', JSON.stringify(condensedSearchData));
151
+ }
152
+ };
153
+ export default SearchIndexPlugin;
154
+ //# sourceMappingURL=SearchIndexPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchIndexPlugin.js","sourceRoot":"","sources":["../src/SearchIndexPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,QAAQ,MAAM,cAAc,CAAC;AACpC,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAqCzC,MAAM,uBAAuB,GAAG;IAC9B,YAAY,EAAE,IAAI;IAClB,cAAc,EAAE,IAAI;IACpB,gBAAgB,EAAE,GAAG;IACrB,cAAc,EAAE,IAAI;IACpB,SAAS,EAAE,GAAG;CACf,CAAC;AAEF;;;;GAIG;AACH,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAExC;;GAEG;AACH,MAAM,YAAY,GAAG,CAAC,GAAG,YAAY,EAAE,SAAS,CAAC,CAAC;AAElD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,SAAS,CAAC,UAAU,GAAG,EAAE;IACvC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,YAAY,CAAC;IAC/C,IAAI,OAAO,UAAU,CAAC,CAAC,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,GAAG,YAAY,EAAE,GAAG,UAAU,CAAC,CAAC;IAC/E,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,EAAE,EAC7C,OAAO,EAAE,UAAU,EACnB,KAAK,EACL,aAAa,EACb,YAAY,EACC,EAAE,EAAE;IACjB,yBAAyB;IACzB,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACzD,IAAI,IAAI,CAAC;IAET,IAAI;QACF,IAAI,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;KACvC;IAAC,OAAO,GAAG,EAAE;QACZ,OAAO,CAAC,KAAK,CAAC,mDAAmD,KAAK,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACtF,OAAO,EAAE,CAAC;KACX;IAED,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC;IAExE,KAAK,CACH,IAAI,EACJ,CAAC,IAAU,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAC5D,CAAC,IAAc,EAAE,EAAE;QACjB,MAAM,QAAQ,GAAG,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpF,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YACzB,IAAI,aAAa,EAAE;gBACjB,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;aACjD;iBAAM;gBACL,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aACzB;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CACF,CAAC;IAEF,IAAI,YAAY,EAAE;QAChB,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;KACzC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,iBAAiB,GAA+C;IACpE;;;;OAIG;IACH,KAAK,CAAC,WAAW,CACf,iBAAiB,EACjB,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,EACnC,EAAE,aAAa,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE;QAEjD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAE3B,CAAC,MAAM,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE;YAC3C,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,MAAM,EAAE,CAAC;YACjD,GAAG,EAAE,GAAG;SACT,CAAC,CACH,CAAC,GAAG,CAAC,KAAK,EAAC,QAAQ,EAAC,EAAE;YACrB,MAAM,gBAAgB,GAAG,MAAM,UAAU,CAAC,WAAW,CACnD,QAAQ,EACR,MAAM,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CACpD,CAAC;YACF,OAAO,gBAAgB,CAAC;QAC1B,CAAC,CAAC,CACH,CAAC;QACF,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,GAAG,CAClC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;YACrB,MAAM,OAAO,GAAG,MAAM,wBAAwB,CAAC;gBAC7C,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;gBAC3B,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;gBACvB,aAAa;gBACb,YAAY;aACb,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;YACnC;;;;eAIG;YACH,OAAO,IAAI,CAAC,MAAM,CAChB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAC1E,EAAE,CACH,CAAC;QACJ,CAAC,CAAC,CACH,CAAC;QACF;;;;WAIG;QACH,MAAM,sBAAsB,GAAG,UAAU,CAAC,MAAM,CAC9C,CAAC,GAAG,EAAE,IAAe,EAAE,EAAE,CAAC,CAAC;YACzB,GAAG,GAAG;YACN,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI;SACnB,CAAC,EACF,EAAE,CACH,CAAC;QACF,MAAM,CAAC,OAAO,CAAC;YACb,aAAa,EAAE,sBAAsB;SACtC,CAAC,CAAC;IACL,CAAC;IACD;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,gBAAgB,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE;QACtF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa;YAAE,OAAO;QAC7C,MAAM,mBAAmB,GAAG,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;QAC5D,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACtD,MAAM,mBAAmB,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC/F,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;QACnC,MAAM,YAAY,GAAG;YACnB,GAAG,uBAAuB;YAC1B,GAAG,SAAS;YACZ,IAAI;SACL,CAAC;QACF,MAAM,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,qBAAqB,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC;QAC/F,MAAM,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;QAC3F,MAAM,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CACvC,6BAA6B,EAC7B,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,CACpC,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { Page, Plugin as PluginType } from '@jpmorganchase/mosaic-types';
2
+ export interface SharedConfigPluginPage extends Page {
3
+ sharedConfig?: string;
4
+ frameOverrides?: any;
5
+ }
6
+ export interface SharedConfigPluginOptions {
7
+ filename: string;
8
+ }
9
+ /**
10
+ * Plugin that crawls the page hierarchy to find the closest `sharedConfig` from any parent index's page metadata.
11
+ * It then exports a JSON file (name: `options.filename`) into each directory with the merged config for that level
12
+ */
13
+ declare const SharedConfigPlugin: PluginType<SharedConfigPluginPage, SharedConfigPluginOptions>;
14
+ export default SharedConfigPlugin;
@@ -1,50 +1,146 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- const flatten_1 = __importDefault(require("lodash/flatten"));
16
- const path_1 = __importDefault(require("path"));
1
+ import crypto from 'node:crypto';
2
+ import path from 'node:path';
3
+ import { flatten, escapeRegExp } from 'lodash-es';
4
+ import deepmerge from 'deepmerge';
5
+ function createPageTest(ignorePages, pageExtensions) {
6
+ const extTest = new RegExp(`${pageExtensions.map(escapeRegExp).join('|')}$`);
7
+ const ignoreTest = new RegExp(`${ignorePages.map(escapeRegExp).join('|')}$`);
8
+ return file => !ignoreTest.test(file) && extTest.test(file) && !path.basename(file).startsWith('.');
9
+ }
10
+ function createFileGlob(url, pageExtensions) {
11
+ if (pageExtensions.length === 1) {
12
+ return `${url}${pageExtensions[0]}`;
13
+ }
14
+ return `${url}{${pageExtensions.join(',')}}`;
15
+ }
16
+ /**
17
+ * https://stackoverflow.com/a/50549047
18
+ * compute inner relative to outer
19
+ * If it's not contained, the first component of the resulting path will be .., so that's what we check for
20
+ */
21
+ function isWithin(outer, inner) {
22
+ const outerParentDir = path.posix.resolve(path.posix.dirname(outer), '../');
23
+ const innerParentDir = path.posix.resolve(path.posix.dirname(inner), '../');
24
+ const rel = path.posix.relative(outerParentDir, innerParentDir);
25
+ return !rel.startsWith('../') && rel !== '..';
26
+ }
17
27
  /**
18
28
  * Plugin that crawls the page hierarchy to find the closest `sharedConfig` from any parent index's page metadata.
19
29
  * It then exports a JSON file (name: `options.filename`) into each directory with the merged config for that level
20
30
  */
21
31
  const SharedConfigPlugin = {
22
- $beforeSend(mutableFilesystem, { config, serialiser, ignorePages, pageExtensions }, options) {
23
- return __awaiter(this, void 0, void 0, function* () {
24
- const pagePaths = yield mutableFilesystem.promises.glob(createFileGlob('**/index', pageExtensions), {
25
- ignore: [options.filename, ...(0, flatten_1.default)(ignorePages.map(ignore => [ignore, `**/${ignore}`]))],
26
- cwd: '/'
27
- });
28
- for (const pagePath of pagePaths) {
29
- const sharedConfigFile = path_1.default.join(path_1.default.dirname(String(pagePath)), options.filename);
30
- const page = yield serialiser.deserialise(String(pagePath), yield mutableFilesystem.promises.readFile(String(pagePath)));
31
- if (page.sharedConfig) {
32
- config.setRef(sharedConfigFile, ['config', '$ref'], `${String(pagePath)}#/sharedConfig`);
33
- yield mutableFilesystem.promises.writeFile(sharedConfigFile, '{}');
32
+ async $afterSource(pages, { ignorePages, pageExtensions, config, namespace }) {
33
+ const isNonHiddenPage = createPageTest(ignorePages, pageExtensions);
34
+ let finalSharedConfig;
35
+ const indexPages = pages.filter(page => path.posix.basename(page.fullPath, path.posix.extname(page.fullPath)) === 'index' &&
36
+ isNonHiddenPage(page.fullPath));
37
+ const indexPagesWithSharedConfig = indexPages.filter(page => page.sharedConfig !== undefined);
38
+ if (indexPagesWithSharedConfig.length === 0 && indexPages.length > 0) {
39
+ const rootPath = indexPages[0].fullPath;
40
+ const applyNamespaceSharedConfig = {
41
+ [`${crypto.randomUUID()}`]: {
42
+ paths: indexPages.map(indexPage => indexPage.fullPath),
43
+ rootPath,
44
+ namespace
34
45
  }
35
- else {
36
- const baseDir = path_1.default.resolve(path_1.default.dirname(String(pagePath)), '../');
37
- config.setAliases(path_1.default.join(baseDir, options.filename), [sharedConfigFile]);
46
+ };
47
+ config.setData({ applyNamespaceSharedConfig });
48
+ return pages;
49
+ }
50
+ for (const page of indexPagesWithSharedConfig) {
51
+ if (finalSharedConfig === undefined) {
52
+ // first shared config we have found so seed the finalSharedConfig
53
+ finalSharedConfig = page.sharedConfig;
54
+ }
55
+ else {
56
+ for (let i = 1; i < indexPagesWithSharedConfig.length; i++) {
57
+ if (isWithin(indexPagesWithSharedConfig[i].fullPath, page.fullPath)) {
58
+ // found another shared config so merge and apply to the page
59
+ finalSharedConfig = deepmerge(finalSharedConfig, page.sharedConfig);
60
+ page.sharedConfig = finalSharedConfig;
61
+ page.frameOverrides = { $ref: '#/sharedConfig' };
62
+ }
38
63
  }
39
64
  }
65
+ }
66
+ return pages;
67
+ },
68
+ async $beforeSend(mutableFilesystem, { config, serialiser, ignorePages, pageExtensions }, options) {
69
+ const indexPagePaths = await mutableFilesystem.promises.glob(createFileGlob('**/index', pageExtensions), {
70
+ ignore: [options.filename, ...flatten(ignorePages.map(ignore => [ignore, `**/${ignore}`]))],
71
+ cwd: '/'
40
72
  });
73
+ const sharedConfigFiles = [];
74
+ const indexPagesWithoutConfig = [];
75
+ for (const indexPagePath of indexPagePaths) {
76
+ const sharedConfigFile = path.posix.join(path.posix.dirname(String(indexPagePath)), options.filename);
77
+ const page = await serialiser.deserialise(String(indexPagePath), await mutableFilesystem.promises.readFile(String(indexPagePath)));
78
+ if (page.sharedConfig) {
79
+ config.setRef(sharedConfigFile, ['config', '$ref'], `${String(indexPagePath)}#/sharedConfig`);
80
+ await mutableFilesystem.promises.writeFile(sharedConfigFile, '{}');
81
+ sharedConfigFiles.push(sharedConfigFile);
82
+ }
83
+ else {
84
+ indexPagesWithoutConfig.push(page.fullPath);
85
+ }
86
+ }
87
+ // apply closest shared config
88
+ if (sharedConfigFiles.length > 0) {
89
+ let closestSharedConfigIndex = 0;
90
+ for (const pagePath of indexPagesWithoutConfig) {
91
+ for (let i = 0; i < sharedConfigFiles.length; i++) {
92
+ if (isWithin(sharedConfigFiles[i], pagePath)) {
93
+ closestSharedConfigIndex = i;
94
+ }
95
+ }
96
+ const sharedConfigFile = path.posix.join(path.posix.dirname(String(pagePath)), options.filename);
97
+ const closestSharedConfig = path.posix.resolve(path.dirname(String(pagePath)), sharedConfigFiles[closestSharedConfigIndex]);
98
+ config.setAliases(closestSharedConfig, [sharedConfigFile]);
99
+ }
100
+ }
101
+ },
102
+ async afterUpdate(mutableFilesystem, { sharedFilesystem, globalConfig, namespace }, options) {
103
+ const { applyNamespaceSharedConfig } = globalConfig.data;
104
+ if (applyNamespaceSharedConfig === undefined) {
105
+ // there is no source that exists that has told us it needs to share a namespace shared-config
106
+ return;
107
+ }
108
+ // find all the entries that match the namespace the plugin is running against
109
+ const namespaceSharedConfigs = Object.keys(applyNamespaceSharedConfig)
110
+ .filter(key => applyNamespaceSharedConfig[key].namespace === namespace)
111
+ .map(key => applyNamespaceSharedConfig?.[key] || []);
112
+ for (const namespaceSharedConfig of namespaceSharedConfigs) {
113
+ if (await mutableFilesystem.promises.exists(namespaceSharedConfig.rootPath)) {
114
+ // a source does need a namespace shared config but the source running this plugin is the source that needs it
115
+ // so we don't need to do anything here
116
+ continue;
117
+ }
118
+ for (const applyPath of namespaceSharedConfig.paths) {
119
+ if (!(await sharedFilesystem.promises.exists(applyPath))) {
120
+ sharedFilesystem.promises.mkdir(path.posix.dirname(String(applyPath)), {
121
+ recursive: true
122
+ });
123
+ }
124
+ let parentDir = path.posix.join(path.posix.dirname(String(applyPath)), '../');
125
+ let closestSharedConfigPath = path.posix.join(parentDir, options.filename);
126
+ while (parentDir !== path.posix.sep) {
127
+ // walk up the directories in the path to find the closest shared config file
128
+ closestSharedConfigPath = path.posix.join(parentDir, options.filename);
129
+ if (await mutableFilesystem.promises.exists(closestSharedConfigPath)) {
130
+ break;
131
+ }
132
+ parentDir = path.posix.join(path.posix.dirname(String(closestSharedConfigPath)), '../');
133
+ }
134
+ const aliasSharedConfigPath = path.posix.join(path.posix.dirname(String(applyPath)), options.filename);
135
+ if ((await mutableFilesystem.promises.exists(closestSharedConfigPath)) &&
136
+ !(await sharedFilesystem.promises.exists(aliasSharedConfigPath))) {
137
+ console.log(`[Mosaic][Plugin] Source has no shared config. Root index page is: ${namespaceSharedConfig.rootPath}`);
138
+ console.log('[Mosaic][Plugin] Copying shared config ', closestSharedConfigPath, '-->', aliasSharedConfigPath);
139
+ await sharedFilesystem.promises.writeFile(aliasSharedConfigPath, await mutableFilesystem.promises.readFile(closestSharedConfigPath));
140
+ }
141
+ }
142
+ }
41
143
  }
42
144
  };
43
- exports.default = SharedConfigPlugin;
44
- function createFileGlob(url, pageExtensions) {
45
- if (pageExtensions.length === 1) {
46
- return `${url}${pageExtensions[0]}`;
47
- }
48
- return `${url}{${pageExtensions.join(',')}}`;
49
- }
145
+ export default SharedConfigPlugin;
50
146
  //# sourceMappingURL=SharedConfigPlugin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SharedConfigPlugin.js","sourceRoot":"","sources":["../src/SharedConfigPlugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AACA,6DAAqC;AACrC,gDAAwB;AAExB;;;GAGG;AACH,MAAM,kBAAkB,GAAyC;IACzD,WAAW,CACf,iBAAiB,EACjB,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,EACnD,OAAO;;YAEP,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CACrD,cAAc,CAAC,UAAU,EAAE,cAAc,CAAC,EAC1C;gBACE,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,IAAA,iBAAO,EAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC3F,GAAG,EAAE,GAAG;aACT,CACF,CAAC;YAEF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;gBAChC,MAAM,gBAAgB,GAAG,cAAI,CAAC,IAAI,CAAC,cAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAErF,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,WAAW,CACvC,MAAM,CAAC,QAAQ,CAAC,EAChB,MAAM,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAC5D,CAAC;gBACF,IAAI,IAAI,CAAC,YAAY,EAAE;oBACrB,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;oBACzF,MAAM,iBAAiB,CAAC,QAAQ,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;iBACpE;qBAAM;oBACL,MAAM,OAAO,GAAG,cAAI,CAAC,OAAO,CAAC,cAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;oBAEpE,MAAM,CAAC,UAAU,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;iBAC7E;aACF;QACH,CAAC;KAAA;CACF,CAAC;AAEF,kBAAe,kBAAkB,CAAC;AAElC,SAAS,cAAc,CAAC,GAAG,EAAE,cAAc;IACzC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE;QAC/B,OAAO,GAAG,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;KACrC;IACD,OAAO,GAAG,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"SharedConfigPlugin.js","sourceRoot":"","sources":["../src/SharedConfigPlugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { Plugin as PluginType, Page } from '@jpmorganchase/mosaic-types';
2
+ import { type SortConfig } from '@jpmorganchase/mosaic-schemas';
3
+ interface SidebarPluginConfigData {
4
+ dirs: string[];
5
+ refs: {
6
+ [key: string]: {
7
+ $$path: (number | string)[];
8
+ $$value: string;
9
+ }[];
10
+ };
11
+ }
12
+ export interface SidebarPluginPage extends Page {
13
+ sidebar?: {
14
+ label?: string;
15
+ };
16
+ sharedConfig: {
17
+ sidebar: {
18
+ sort: SortConfig;
19
+ };
20
+ };
21
+ }
22
+ interface SidebarPluginOptions {
23
+ /**
24
+ * filename of the sidebar json, linked to each related page via ref
25
+ */
26
+ filename: string;
27
+ /**
28
+ * Glob pattern for matching directories which should be the root of the sidebar
29
+ * * creates a root level sidebar containing all pages underneath root
30
+ * *\/* creates a separate sidebar under each of the root directories
31
+ */
32
+ rootDirGlob: string;
33
+ }
34
+ /**
35
+ * Sorts the pages in a folder by priority and then exports a JSON file with the
36
+ * sidebar tree from that directory downwards and adds sidebar data into frontmatter for each page.
37
+ *
38
+ * Additionally, add to frontmatter
39
+ * navigation -> prev -> { title, route }
40
+ * navigation -> next -> { title, route }
41
+ * to define the previous/next page in the page sequence, as defined by sidebar label and priority
42
+ */
43
+ declare const SidebarPlugin: PluginType<SidebarPluginPage, SidebarPluginOptions, SidebarPluginConfigData>;
44
+ export default SidebarPlugin;