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

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 (35) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/dist/$AliasPlugin.js +229 -64
  3. package/dist/$AliasPlugin.js.map +1 -1
  4. package/dist/$CodeModPlugin.js +118 -36
  5. package/dist/$CodeModPlugin.js.map +1 -1
  6. package/dist/$RefPlugin.js +449 -122
  7. package/dist/$RefPlugin.js.map +1 -1
  8. package/dist/$TagPlugin.js +236 -77
  9. package/dist/$TagPlugin.js.map +1 -1
  10. package/dist/BreadcrumbsPlugin.js +114 -42
  11. package/dist/BreadcrumbsPlugin.js.map +1 -1
  12. package/dist/LazyPagePlugin.js +255 -86
  13. package/dist/LazyPagePlugin.js.map +1 -1
  14. package/dist/LocalFolderSavePlugin.js +165 -0
  15. package/dist/LocalFolderSavePlugin.js.map +1 -0
  16. package/dist/NextPrevPagePlugin.js +157 -47
  17. package/dist/NextPrevPagePlugin.js.map +1 -1
  18. package/dist/PagesWithoutFileExtPlugin.js +119 -38
  19. package/dist/PagesWithoutFileExtPlugin.js.map +1 -1
  20. package/dist/ReadingTimePlugin.mjs.map +1 -1
  21. package/dist/SearchIndexPlugin.mjs +268 -0
  22. package/dist/SearchIndexPlugin.mjs.map +1 -0
  23. package/dist/SharedConfigPlugin.js +174 -43
  24. package/dist/SharedConfigPlugin.js.map +1 -1
  25. package/dist/SidebarPlugin.js +319 -87
  26. package/dist/SidebarPlugin.js.map +1 -1
  27. package/dist/SiteMapPlugin.js +90 -38
  28. package/dist/SiteMapPlugin.js.map +1 -1
  29. package/dist/TableOfContentsPlugin.mjs +49 -58
  30. package/dist/TableOfContentsPlugin.mjs.map +1 -1
  31. package/dist/__tests__/BreadcrumbsPlugin.test.js +160 -0
  32. package/dist/__tests__/BreadcrumbsPlugin.test.js.map +1 -0
  33. package/dist/utils/normaliseRefs.js +276 -74
  34. package/dist/utils/normaliseRefs.js.map +1 -1
  35. package/package.json +16 -5
@@ -1,90 +1,249 @@
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 };
1
+ function _arrayLikeToArray(arr, len) {
2
+ if (len == null || len > arr.length) len = arr.length;
3
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
4
+ return arr2;
5
+ }
6
+ function _arrayWithHoles(arr) {
7
+ if (Array.isArray(arr)) return arr;
8
+ }
9
+ function _arrayWithoutHoles(arr) {
10
+ if (Array.isArray(arr)) return _arrayLikeToArray(arr);
11
+ }
12
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
13
+ try {
14
+ var info = gen[key](arg);
15
+ var value = info.value;
16
+ } catch (error) {
17
+ reject(error);
18
+ return;
19
+ }
20
+ if (info.done) {
21
+ resolve(value);
22
+ } else {
23
+ Promise.resolve(value).then(_next, _throw);
24
+ }
25
+ }
26
+ function _asyncToGenerator(fn) {
27
+ return function() {
28
+ var self = this, args = arguments;
29
+ return new Promise(function(resolve, reject) {
30
+ var gen = fn.apply(self, args);
31
+ function _next(value) {
32
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
33
+ }
34
+ function _throw(err) {
35
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
36
+ }
37
+ _next(undefined);
38
+ });
39
+ };
40
+ }
41
+ function _iterableToArray(iter) {
42
+ if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
43
+ }
44
+ function _iterableToArrayLimit(arr, i) {
45
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
46
+ if (_i == null) return;
47
+ var _arr = [];
48
+ var _n = true;
49
+ var _d = false;
50
+ var _s, _e;
51
+ try {
52
+ for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
53
+ _arr.push(_s.value);
54
+ if (i && _arr.length === i) break;
55
+ }
56
+ } catch (err) {
57
+ _d = true;
58
+ _e = err;
59
+ } finally{
60
+ try {
61
+ if (!_n && _i["return"] != null) _i["return"]();
62
+ } finally{
63
+ if (_d) throw _e;
64
+ }
65
+ }
66
+ return _arr;
67
+ }
68
+ function _nonIterableRest() {
69
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
70
+ }
71
+ function _nonIterableSpread() {
72
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
73
+ }
74
+ function _slicedToArray(arr, i) {
75
+ return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
76
+ }
77
+ function _toConsumableArray(arr) {
78
+ return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
79
+ }
80
+ function _unsupportedIterableToArray(o, minLen) {
81
+ if (!o) return;
82
+ if (typeof o === "string") return _arrayLikeToArray(o, minLen);
83
+ var n = Object.prototype.toString.call(o).slice(8, -1);
84
+ if (n === "Object" && o.constructor) n = o.constructor.name;
85
+ if (n === "Map" || n === "Set") return Array.from(n);
86
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
87
+ }
88
+ import regeneratorRuntime from "regenerator-runtime";
89
+ import path from "path";
90
+ import escapeRegExp from "lodash/escapeRegExp";
91
+ import reduce from "lodash/reduce";
92
+ function createPageTest(ignorePages, pageExtensions) {
93
+ var extTest = new RegExp("".concat(pageExtensions.map(escapeRegExp).join("|"), "$"));
94
+ var ignoreTest = new RegExp("".concat(ignorePages.map(escapeRegExp).join("|"), "$"));
95
+ return function(file) {
96
+ return !ignoreTest.test(file) && extTest.test(file) && !path.basename(file).startsWith(".");
97
+ };
98
+ }
99
+ var findKeys = function(obj, targetProp) {
100
+ var pathParts = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : [];
101
+ return reduce(obj, function(found, value, key) {
102
+ if (key === targetProp) {
103
+ return found.concat({
104
+ $$path: pathParts.concat(String(key)),
105
+ $$value: value
106
+ });
107
+ }
108
+ if (typeof value === "object") {
109
+ var _found;
110
+ var foundParents = findKeys(value, targetProp, pathParts.concat(String(key)));
111
+ return (_found = found).concat.apply(_found, _toConsumableArray(foundParents));
112
+ }
113
+ return found;
114
+ }, []);
13
115
  };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- const path_1 = __importDefault(require("path"));
16
- const escapeRegExp_1 = __importDefault(require("lodash/escapeRegExp"));
17
- const reduce_1 = __importDefault(require("lodash/reduce"));
18
116
  /**
19
117
  * Plugin that scrapes `$tag` from page metadata and also applies all aliases stored in `config.data.tags`.
20
118
  * Tags ultimately resolve down into refs, but are different from normal refs, in that they are applied to the
21
119
  * union filesystem (all merged filesystems), not to the individual source filesystem that they were defined on.
22
120
  * Other plugins can use `setData()` and modify the `tags` property, to apply new global refs, as long as
23
121
  * they do so before this plugin has reaches `$beforeSend`
24
- */
25
- const $TagPlugin = {
26
- // Check if the updated source has any /.tag aliases that we care about - if it does, we should re-run `afterUpdate` to
122
+ */ var $TagPlugin = {
123
+ shouldClearCache: // Check if the updated source has any /.tag aliases that we care about - if it does, we should re-run `afterUpdate` to
27
124
  // make sure we pull in the latest pages
28
- shouldClearCache(updatedSourceFilesystem, { config }) {
29
- var _a;
30
- return __awaiter(this, void 0, void 0, function* () {
31
- if (!((_a = config.data) === null || _a === void 0 ? void 0 : _a.subscribedTags) ||
32
- !(yield updatedSourceFilesystem.promises.exists('/.tags'))) {
33
- return false;
34
- }
35
- // Does the updated source have tags we are interested in?
36
- return (yield updatedSourceFilesystem.promises.readdir('/.tags')).some(tag => config.data.subscribedTags.includes(tag));
37
- });
38
- },
39
- // Every source with tags will create symlinks with the tagged pages, inside /.tags
40
- $afterSource(pages, { config, ignorePages, pageExtensions }) {
41
- var _a;
42
- return __awaiter(this, void 0, void 0, function* () {
43
- const isNonHiddenPage = createPageTest(ignorePages, pageExtensions);
44
- for (const page of pages) {
45
- if (!isNonHiddenPage(page.fullPath)) {
46
- continue;
47
- }
48
- const meta = page;
49
- // Symlink every `tag` item to '/.tags' folder
50
- if ((_a = meta.tags) === null || _a === void 0 ? void 0 : _a.length) {
51
- config.setTags(page.fullPath, meta.tags);
52
- delete meta.tags;
125
+ function shouldClearCache(updatedSourceFilesystem, param) {
126
+ var config = param.config;
127
+ return _asyncToGenerator(/*#__PURE__*/ regeneratorRuntime.mark(function _callee() {
128
+ var ref;
129
+ return regeneratorRuntime.wrap(function _callee$(_ctx) {
130
+ while(1)switch(_ctx.prev = _ctx.next){
131
+ case 0:
132
+ ;
133
+ _ctx.t0 = !((ref = config.data) === null || ref === void 0 ? void 0 : ref.subscribedTags);
134
+ if (_ctx.t0) {
135
+ _ctx.next = 6;
136
+ break;
137
+ }
138
+ _ctx.next = 5;
139
+ return updatedSourceFilesystem.promises.exists("/.tags");
140
+ case 5:
141
+ _ctx.t0 = !_ctx.sent;
142
+ case 6:
143
+ if (!_ctx.t0) {
144
+ _ctx.next = 8;
145
+ break;
146
+ }
147
+ return _ctx.abrupt("return", false);
148
+ case 8:
149
+ _ctx.next = 10;
150
+ return updatedSourceFilesystem.promises.readdir("/.tags");
151
+ case 10:
152
+ return _ctx.abrupt("return", _ctx.sent.some(function(tag) {
153
+ return config.data.subscribedTags.includes(tag);
154
+ }));
155
+ case 11:
156
+ case "end":
157
+ return _ctx.stop();
53
158
  }
54
- // Find any references to $tag
55
- const foundTags = findKeys(page, '$tag');
56
- if (foundTags.length) {
57
- const tags = new Set();
58
- foundTags.forEach(ref => {
59
- const [tag, fragment = ''] = ref.$$value.split('#');
60
- tags.add(tag);
61
- config.setGlobalRef(page.fullPath, ref.$$path, `${path_1.default.join('/.tags', tag, '**')}#${fragment}`);
62
- });
63
- config.setData({ subscribedTags: Array.from(tags) });
159
+ }, _callee);
160
+ }))();
161
+ },
162
+ $afterSource: // Every source with tags will create symlinks with the tagged pages, inside /.tags
163
+ function $afterSource(pages, param) {
164
+ var config = param.config, ignorePages = param.ignorePages, pageExtensions = param.pageExtensions;
165
+ return _asyncToGenerator(/*#__PURE__*/ regeneratorRuntime.mark(function _callee() {
166
+ var isNonHiddenPage, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _loop, _iterator, _step;
167
+ return regeneratorRuntime.wrap(function _callee$(_ctx) {
168
+ while(1)switch(_ctx.prev = _ctx.next){
169
+ case 0:
170
+ isNonHiddenPage = createPageTest(ignorePages, pageExtensions);
171
+ _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
172
+ _ctx.prev = 2;
173
+ _loop = function() {
174
+ var page = _step.value;
175
+ var ref;
176
+ if (!isNonHiddenPage(page.fullPath)) {
177
+ return "continue";
178
+ }
179
+ var meta = page;
180
+ // Symlink every `tag` item to '/.tags' folder
181
+ if ((ref = meta.tags) === null || ref === void 0 ? void 0 : ref.length) {
182
+ config.setTags(page.fullPath, meta.tags);
183
+ delete meta.tags;
184
+ }
185
+ // Find any references to $tag
186
+ var foundTags = findKeys(page, "$tag");
187
+ if (foundTags.length) {
188
+ var tags = new Set();
189
+ foundTags.forEach(function(ref) {
190
+ var _$ref = _slicedToArray(ref.$$value.split("#"), 2), tag = _$ref[0], tmp = _$ref[1], fragment = tmp === void 0 ? "" : tmp;
191
+ tags.add(tag);
192
+ config.setGlobalRef(page.fullPath, ref.$$path, "".concat(path.join("/.tags", tag, "**"), "#").concat(fragment));
193
+ });
194
+ config.setData({
195
+ subscribedTags: Array.from(tags)
196
+ });
197
+ }
198
+ };
199
+ for(_iterator = pages[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true)_loop();
200
+ _ctx.next = 11;
201
+ break;
202
+ case 7:
203
+ _ctx.prev = 7;
204
+ _ctx.t0 = _ctx["catch"](2);
205
+ _didIteratorError = true;
206
+ _iteratorError = _ctx.t0;
207
+ case 11:
208
+ _ctx.prev = 11;
209
+ _ctx.prev = 12;
210
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
211
+ _iterator.return();
212
+ }
213
+ case 14:
214
+ _ctx.prev = 14;
215
+ if (!_didIteratorError) {
216
+ _ctx.next = 17;
217
+ break;
218
+ }
219
+ throw _iteratorError;
220
+ case 17:
221
+ return _ctx.finish(14);
222
+ case 18:
223
+ return _ctx.finish(11);
224
+ case 19:
225
+ return _ctx.abrupt("return", pages);
226
+ case 20:
227
+ case "end":
228
+ return _ctx.stop();
64
229
  }
65
- }
66
- return pages;
67
- });
230
+ }, _callee, null, [
231
+ [
232
+ 2,
233
+ 7,
234
+ 11,
235
+ 19
236
+ ],
237
+ [
238
+ 12,
239
+ ,
240
+ 14,
241
+ 18
242
+ ]
243
+ ]);
244
+ }))();
68
245
  }
69
246
  };
70
- exports.default = $TagPlugin;
71
- const findKeys = (obj, targetProp, pathParts = []) => {
72
- return (0, reduce_1.default)(obj, (found, value, key) => {
73
- if (key === targetProp) {
74
- return found.concat({ $$path: pathParts.concat(String(key)), $$value: value });
75
- }
76
- if (typeof value === 'object') {
77
- const foundParents = findKeys(value, targetProp, pathParts.concat(String(key)));
78
- return found.concat(...foundParents);
79
- }
80
- return found;
81
- }, []);
82
- };
83
- function createPageTest(ignorePages, pageExtensions) {
84
- const extTest = new RegExp(`${pageExtensions.map(escapeRegExp_1.default).join('|')}$`);
85
- const ignoreTest = new RegExp(`${ignorePages.map(escapeRegExp_1.default).join('|')}$`);
86
- return file => {
87
- return !ignoreTest.test(file) && extTest.test(file) && !path_1.default.basename(file).startsWith('.');
88
- };
89
- }
247
+ export default $TagPlugin;
248
+
90
249
  //# sourceMappingURL=$TagPlugin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"$TagPlugin.js","sourceRoot":"","sources":["../src/$TagPlugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../src/$TagPlugin.ts"],"sourcesContent":["import path from 'path';\nimport escapeRegExp from 'lodash/escapeRegExp';\nimport reduce from 'lodash/reduce';\nimport type { Page, Plugin as PluginType } from '@jpmorganchase/mosaic-types';\n\nfunction createPageTest(ignorePages, pageExtensions) {\n const extTest = new RegExp(`${pageExtensions.map(escapeRegExp).join('|')}$`);\n const ignoreTest = new RegExp(`${ignorePages.map(escapeRegExp).join('|')}$`);\n return file =>\n !ignoreTest.test(file) && extTest.test(file) && !path.basename(file).startsWith('.');\n}\n\nconst findKeys = (obj, targetProp, pathParts: string[] = []) =>\n reduce<string, { $$path: string[]; $$value: string }[]>(\n obj,\n (found, value, key) => {\n if (key === targetProp) {\n return found.concat({ $$path: pathParts.concat(String(key)), $$value: value });\n }\n if (typeof value === 'object') {\n const foundParents = findKeys(value, targetProp, pathParts.concat(String(key)));\n return found.concat(...foundParents);\n }\n return found;\n },\n []\n );\n\ninterface TagPluginPage extends Page {\n tags?: string[];\n}\ninterface TagPluginConfigData {\n tagRefs: { [key: string]: { $$path: string[]; $$value: string[] }[] };\n globalRefs: { [key: string]: { $$path: string[]; $$value: string[] }[] };\n subscribedTags: string[];\n}\n\n/**\n * Plugin that scrapes `$tag` from page metadata and also applies all aliases stored in `config.data.tags`.\n * Tags ultimately resolve down into refs, but are different from normal refs, in that they are applied to the\n * union filesystem (all merged filesystems), not to the individual source filesystem that they were defined on.\n * Other plugins can use `setData()` and modify the `tags` property, to apply new global refs, as long as\n * they do so before this plugin has reaches `$beforeSend`\n */\nconst $TagPlugin: PluginType<TagPluginPage, unknown, TagPluginConfigData> = {\n // Check if the updated source has any /.tag aliases that we care about - if it does, we should re-run `afterUpdate` to\n // make sure we pull in the latest pages\n async shouldClearCache(updatedSourceFilesystem, { config }) {\n if (\n !config.data?.subscribedTags ||\n !(await updatedSourceFilesystem.promises.exists('/.tags'))\n ) {\n return false;\n }\n // Does the updated source have tags we are interested in?\n return ((await updatedSourceFilesystem.promises.readdir('/.tags')) as string[]).some(tag =>\n config.data.subscribedTags.includes(tag)\n );\n },\n // Every source with tags will create symlinks with the tagged pages, inside /.tags\n async $afterSource(pages, { config, ignorePages, pageExtensions }) {\n const isNonHiddenPage = createPageTest(ignorePages, pageExtensions);\n\n for (const page of pages) {\n if (!isNonHiddenPage(page.fullPath)) {\n continue;\n }\n const meta = page;\n // Symlink every `tag` item to '/.tags' folder\n if (meta.tags?.length) {\n config.setTags(page.fullPath, meta.tags);\n delete meta.tags;\n }\n\n // Find any references to $tag\n const foundTags = findKeys(page, '$tag');\n if (foundTags.length) {\n const tags = new Set<string>();\n\n foundTags.forEach(ref => {\n const [tag, fragment = ''] = ref.$$value.split('#');\n\n tags.add(tag);\n\n config.setGlobalRef(\n page.fullPath,\n ref.$$path,\n `${path.join('/.tags', tag, '**')}#${fragment}`\n );\n });\n config.setData({ subscribedTags: Array.from(tags) });\n }\n }\n return pages;\n }\n};\n\nexport default $TagPlugin;\n"],"names":["path","escapeRegExp","reduce","createPageTest","ignorePages","pageExtensions","extTest","RegExp","map","join","ignoreTest","file","test","basename","startsWith","findKeys","obj","targetProp","pathParts","found","value","key","concat","$$path","String","$$value","foundParents","$TagPlugin","shouldClearCache","updatedSourceFilesystem","config","data","subscribedTags","promises","exists","readdir","some","tag","includes","$afterSource","pages","isNonHiddenPage","page","meta","fullPath","tags","length","setTags","foundTags","Set","forEach","ref","split","fragment","add","setGlobalRef","setData","Array","from"],"mappings":"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"}
@@ -1,48 +1,120 @@
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 path_1 = __importDefault(require("path"));
1
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
2
+ try {
3
+ var info = gen[key](arg);
4
+ var value = info.value;
5
+ } catch (error) {
6
+ reject(error);
7
+ return;
8
+ }
9
+ if (info.done) {
10
+ resolve(value);
11
+ } else {
12
+ Promise.resolve(value).then(_next, _throw);
13
+ }
14
+ }
15
+ function _asyncToGenerator(fn) {
16
+ return function() {
17
+ var self = this, args = arguments;
18
+ return new Promise(function(resolve, reject) {
19
+ var gen = fn.apply(self, args);
20
+ function _next(value) {
21
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
22
+ }
23
+ function _throw(err) {
24
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
25
+ }
26
+ _next(undefined);
27
+ });
28
+ };
29
+ }
30
+ import regeneratorRuntime from "regenerator-runtime";
31
+ import path from "path";
16
32
  /**
17
33
  * Calculates breadcrumbs for pages then embeds a `breadcrumbs` property to the metadata
18
- */
19
- const BreadcrumbsPlugin = {
20
- $afterSource(pages, {}, options) {
21
- return __awaiter(this, void 0, void 0, function* () {
22
- for (const page of pages) {
23
- const breadcrumbs = [];
24
- let currentPage = page;
25
- let parentDir = path_1.default.posix.dirname(currentPage.fullPath);
26
- while (currentPage !== undefined) {
27
- if (breadcrumbs.findIndex(breadcrumb => breadcrumb.id === currentPage.fullPath) === -1) {
28
- breadcrumbs.unshift({
29
- label: currentPage.title,
30
- path: currentPage.route,
31
- id: currentPage.fullPath
32
- });
33
- }
34
- currentPage = pages.find(page => page.fullPath === path_1.default.posix.join(parentDir, options.indexPageName));
35
- if (currentPage) {
36
- parentDir = path_1.default.posix.dirname(path_1.default.posix.join(String(currentPage.fullPath), '..'));
37
- }
38
- }
39
- if (!page.breadcrumbs) {
40
- page.breadcrumbs = breadcrumbs;
34
+ */ var BreadcrumbsPlugin = {
35
+ $afterSource: function $afterSource(pages, _, options) {
36
+ return _asyncToGenerator(/*#__PURE__*/ regeneratorRuntime.mark(function _callee() {
37
+ var _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, page, breadcrumbs, currentPage, parentDir;
38
+ return regeneratorRuntime.wrap(function _callee$(_ctx) {
39
+ while(1)switch(_ctx.prev = _ctx.next){
40
+ case 0:
41
+ _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
42
+ _ctx.prev = 1;
43
+ for(_iterator = pages[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
44
+ page = _step.value;
45
+ breadcrumbs = [];
46
+ currentPage = page;
47
+ parentDir = path.posix.normalize(path.posix.dirname(currentPage.fullPath));
48
+ while(currentPage !== undefined){
49
+ // eslint-disable-next-line @typescript-eslint/no-loop-func
50
+ if (breadcrumbs.findIndex(function(breadcrumb) {
51
+ return breadcrumb.id === currentPage.fullPath;
52
+ }) === -1) {
53
+ breadcrumbs.unshift({
54
+ label: currentPage.title,
55
+ path: currentPage.route,
56
+ id: currentPage.fullPath
57
+ });
58
+ }
59
+ currentPage = pages.find(// eslint-disable-next-line @typescript-eslint/no-loop-func
60
+ function(item) {
61
+ return item.fullPath === path.posix.join(parentDir, options.indexPageName);
62
+ });
63
+ if (currentPage) {
64
+ parentDir = path.posix.dirname(path.posix.join(String(currentPage.fullPath), ".."));
65
+ }
66
+ }
67
+ if (!page.breadcrumbs) {
68
+ page.breadcrumbs = breadcrumbs;
69
+ }
70
+ }
71
+ _ctx.next = 9;
72
+ break;
73
+ case 5:
74
+ _ctx.prev = 5;
75
+ _ctx.t0 = _ctx["catch"](1);
76
+ _didIteratorError = true;
77
+ _iteratorError = _ctx.t0;
78
+ case 9:
79
+ _ctx.prev = 9;
80
+ _ctx.prev = 10;
81
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
82
+ _iterator.return();
83
+ }
84
+ case 12:
85
+ _ctx.prev = 12;
86
+ if (!_didIteratorError) {
87
+ _ctx.next = 15;
88
+ break;
89
+ }
90
+ throw _iteratorError;
91
+ case 15:
92
+ return _ctx.finish(12);
93
+ case 16:
94
+ return _ctx.finish(9);
95
+ case 17:
96
+ return _ctx.abrupt("return", pages);
97
+ case 18:
98
+ case "end":
99
+ return _ctx.stop();
41
100
  }
42
- }
43
- return pages;
44
- });
101
+ }, _callee, null, [
102
+ [
103
+ 1,
104
+ 5,
105
+ 9,
106
+ 17
107
+ ],
108
+ [
109
+ 10,
110
+ ,
111
+ 12,
112
+ 16
113
+ ]
114
+ ]);
115
+ }))();
45
116
  }
46
117
  };
47
- exports.default = BreadcrumbsPlugin;
118
+ export default BreadcrumbsPlugin;
119
+
48
120
  //# sourceMappingURL=BreadcrumbsPlugin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BreadcrumbsPlugin.js","sourceRoot":"","sources":["../src/BreadcrumbsPlugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,gDAAwB;AAKxB;;GAEG;AACH,MAAM,iBAAiB,GAA8C;IAC7D,YAAY,CAAC,KAAa,EAAE,EAAE,EAAE,OAAO;;YAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;gBACxB,MAAM,WAAW,GAAsB,EAAE,CAAC;gBAC1C,IAAI,WAAW,GAAG,IAAI,CAAC;gBACvB,IAAI,SAAS,GAAG,cAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;gBAEzD,OAAO,WAAW,KAAK,SAAS,EAAE;oBAChC,IAAI,WAAW,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE;wBACtF,WAAW,CAAC,OAAO,CAAC;4BAClB,KAAK,EAAE,WAAW,CAAC,KAAK;4BACxB,IAAI,EAAE,WAAW,CAAC,KAAK;4BACvB,EAAE,EAAE,WAAW,CAAC,QAAQ;yBACzB,CAAC,CAAC;qBACJ;oBAED,WAAW,GAAG,KAAK,CAAC,IAAI,CACtB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,cAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,aAAa,CAAC,CAC5E,CAAC;oBACF,IAAI,WAAW,EAAE;wBACf,SAAS,GAAG,cAAI,CAAC,KAAK,CAAC,OAAO,CAAC,cAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;qBACrF;iBACF;gBAED,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;oBACrB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;iBAChC;aACF;YAED,OAAO,KAAK,CAAC;QACf,CAAC;KAAA;CACF,CAAC;AAEF,kBAAe,iBAAiB,CAAC"}
1
+ {"version":3,"sources":["../src/BreadcrumbsPlugin.ts"],"sourcesContent":["import path from 'path';\nimport type { Page, Plugin as PluginType } from '@jpmorganchase/mosaic-types';\n\nexport type Breadcrumb = { label: string; path: string; id: string };\n\nexport interface BreadcrumbsPluginPage extends Page {\n breadcrumbs?: Array<Breadcrumb>;\n}\n\ninterface BreadcrumbsPluginOptions {\n indexPageName: string;\n}\n\n/**\n * Calculates breadcrumbs for pages then embeds a `breadcrumbs` property to the metadata\n */\nconst BreadcrumbsPlugin: PluginType<BreadcrumbsPluginPage, BreadcrumbsPluginOptions> = {\n async $afterSource(pages, _, options) {\n for (const page of pages) {\n const breadcrumbs: Array<Breadcrumb> = [];\n let currentPage = page;\n let parentDir = path.posix.normalize(path.posix.dirname(currentPage.fullPath));\n\n while (currentPage !== undefined) {\n // eslint-disable-next-line @typescript-eslint/no-loop-func\n if (breadcrumbs.findIndex(breadcrumb => breadcrumb.id === currentPage.fullPath) === -1) {\n breadcrumbs.unshift({\n label: currentPage.title,\n path: currentPage.route,\n id: currentPage.fullPath\n });\n }\n\n currentPage = pages.find(\n // eslint-disable-next-line @typescript-eslint/no-loop-func\n item => item.fullPath === path.posix.join(parentDir, options.indexPageName)\n );\n if (currentPage) {\n parentDir = path.posix.dirname(path.posix.join(String(currentPage.fullPath), '..'));\n }\n }\n\n if (!page.breadcrumbs) {\n page.breadcrumbs = breadcrumbs;\n }\n }\n\n return pages;\n }\n};\n\nexport default BreadcrumbsPlugin;\n"],"names":["path","BreadcrumbsPlugin","$afterSource","pages","_","options","page","breadcrumbs","currentPage","parentDir","posix","normalize","dirname","fullPath","undefined","findIndex","breadcrumb","id","unshift","label","title","route","find","item","join","indexPageName","String"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAOA,IAAI,MAAM,MAAM,CAAC;AAaxB;;CAEC,GACD,IAAMC,iBAAiB,GAAgE;IAC/EC,YAAY,EAAlB,SAAMA,YAAY,CAACC,KAAK,EAAEC,CAAC,EAAEC,OAAO;eAAE,wDAAA,mBAAA;gBAC/B,yBAAU,EAAV,iBAAU,EAAV,cAAU,EAAV,SAAU,EAAV,KAAU,EAAJC,IAAI,EACPC,WAAW,EACbC,WAAW,EACXC,SAAS;;;;wBAHV,yBAAU,SAAV,iBAAU,UAAV,cAAU;;wBAAf,IAAK,SAAU,GAAIN,KAAK,uBAAnB,yBAAU,IAAV,KAAU,GAAV,SAAU,gBAAV,yBAAU,QAAW;4BAAfG,IAAI,GAAV,KAAU,MAAA;4BACPC,WAAW,GAAsB,EAAE,CAAC;4BACtCC,WAAW,GAAGF,IAAI,CAAC;4BACnBG,SAAS,GAAGT,IAAI,CAACU,KAAK,CAACC,SAAS,CAACX,IAAI,CAACU,KAAK,CAACE,OAAO,CAACJ,WAAW,CAACK,QAAQ,CAAC,CAAC,CAAC;4BAE/E,MAAOL,WAAW,KAAKM,SAAS,CAAE;gCAChC,2DAA2D;gCAC3D,IAAIP,WAAW,CAACQ,SAAS,CAACC,SAAAA,UAAU;2CAAIA,UAAU,CAACC,EAAE,KAAKT,WAAW,CAACK,QAAQ;iCAAA,CAAC,KAAK,CAAC,CAAC,EAAE;oCACtFN,WAAW,CAACW,OAAO,CAAC;wCAClBC,KAAK,EAAEX,WAAW,CAACY,KAAK;wCACxBpB,IAAI,EAAEQ,WAAW,CAACa,KAAK;wCACvBJ,EAAE,EAAET,WAAW,CAACK,QAAQ;qCACzB,CAAC,CAAC;iCACJ;gCAEDL,WAAW,GAAGL,KAAK,CAACmB,IAAI,CACtB,2DAA2D;gCAC3DC,SAAAA,IAAI;2CAAIA,IAAI,CAACV,QAAQ,KAAKb,IAAI,CAACU,KAAK,CAACc,IAAI,CAACf,SAAS,EAAEJ,OAAO,CAACoB,aAAa,CAAC;iCAAA,CAC5E,CAAC;gCACF,IAAIjB,WAAW,EAAE;oCACfC,SAAS,GAAGT,IAAI,CAACU,KAAK,CAACE,OAAO,CAACZ,IAAI,CAACU,KAAK,CAACc,IAAI,CAACE,MAAM,CAAClB,WAAW,CAACK,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;iCACrF;6BACF;4BAED,IAAI,CAACP,IAAI,CAACC,WAAW,EAAE;gCACrBD,IAAI,CAACC,WAAW,GAAGA,WAAW,CAAC;6BAChC;yBACF;;;;;;wBA3BI,iBAAU;wBAAV,cAAU;;;;6BAAV,yBAAU,IAAV,SAAU;4BAAV,SAAU;;;;4BAAV,CAAA,iBAAU;;;;8BAAV,cAAU;;;;;;qDA6BRJ,KAAK;;;;;;;;;;;;;;;;;;;SACb,EAAA;KAAA;CACF,AAAC;AAEF,eAAeF,iBAAiB,CAAC"}