@jpmorganchase/mosaic-plugins 0.1.0-beta.3 → 0.1.0-beta.4

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 (46) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/$AliasPlugin.js +75 -0
  3. package/dist/$AliasPlugin.js.map +1 -0
  4. package/dist/$CodeModPlugin.js +42 -0
  5. package/dist/$CodeModPlugin.js.map +1 -0
  6. package/dist/$RefPlugin.js +146 -0
  7. package/dist/$RefPlugin.js.map +1 -0
  8. package/dist/$TagPlugin.js +90 -0
  9. package/dist/$TagPlugin.js.map +1 -0
  10. package/dist/BreadcrumbsPlugin.js +48 -0
  11. package/dist/BreadcrumbsPlugin.js.map +1 -0
  12. package/dist/LazyPagePlugin.js +95 -0
  13. package/dist/LazyPagePlugin.js.map +1 -0
  14. package/dist/NextPrevPagePlugin.js +59 -0
  15. package/dist/NextPrevPagePlugin.js.map +1 -0
  16. package/dist/PagesWithoutFileExtPlugin.js +47 -0
  17. package/dist/PagesWithoutFileExtPlugin.js.map +1 -0
  18. package/dist/ReadingTimePlugin.mjs +119 -0
  19. package/dist/ReadingTimePlugin.mjs.map +1 -0
  20. package/dist/SharedConfigPlugin.js +50 -0
  21. package/dist/SharedConfigPlugin.js.map +1 -0
  22. package/dist/SidebarPlugin.js +109 -0
  23. package/dist/SidebarPlugin.js.map +1 -0
  24. package/dist/SiteMapPlugin.js +44 -0
  25. package/dist/SiteMapPlugin.js.map +1 -0
  26. package/dist/TableOfContentsPlugin.mjs +140 -0
  27. package/dist/TableOfContentsPlugin.mjs.map +1 -0
  28. package/dist/utils/normaliseRefs.js +83 -0
  29. package/dist/utils/normaliseRefs.js.map +1 -0
  30. package/package.json +6 -3
  31. package/.turbo/turbo-build.log +0 -14
  32. package/src/$AliasPlugin.ts +0 -62
  33. package/src/$CodeModPlugin.ts +0 -34
  34. package/src/$RefPlugin.ts +0 -200
  35. package/src/$TagPlugin.ts +0 -99
  36. package/src/BreadcrumbsPlugin.ts +0 -43
  37. package/src/LazyPagePlugin.ts +0 -101
  38. package/src/NextPrevPagePlugin.ts +0 -80
  39. package/src/PagesWithoutFileExtPlugin.ts +0 -38
  40. package/src/ReadingTimePlugin.mjs.ts +0 -32
  41. package/src/SharedConfigPlugin.ts +0 -49
  42. package/src/SidebarPlugin.ts +0 -154
  43. package/src/SiteMapPlugin.ts +0 -44
  44. package/src/TableOfContentsPlugin.mjs.ts +0 -52
  45. package/src/utils/normaliseRefs.ts +0 -85
  46. package/tsconfig.json +0 -21
@@ -0,0 +1,47 @@
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 lodash_1 = require("lodash");
16
+ const path_1 = __importDefault(require("path"));
17
+ /**
18
+ * Plugin that creates aliases without the file extension for every page emitted by the source.
19
+ * This allows pages to be retrieved from the filesystem without specifying `.mdx` (or whatever file extension is specified in `options.stripExt`).
20
+ * The plugin also modifies the `route` to point to the shorter alias. Friendly fullPaths are the shortest possible paths that
21
+ * will point to the page (see `Page` docs)
22
+ */
23
+ const PagesWithoutFileExtPlugin = {
24
+ $afterSource(pages, { config, ignorePages, pageExtensions }) {
25
+ return __awaiter(this, void 0, void 0, function* () {
26
+ const isNonHiddenPage = createPageTest(ignorePages, pageExtensions);
27
+ const pageTest = new RegExp(`${pageExtensions.map(lodash_1.escapeRegExp).join('|')}$`);
28
+ for (const page of pages) {
29
+ if (!isNonHiddenPage(page.fullPath)) {
30
+ continue;
31
+ }
32
+ page.route = page.route.replace(pageTest, '');
33
+ config.setAliases(page.fullPath, [page.route]);
34
+ }
35
+ return pages;
36
+ });
37
+ }
38
+ };
39
+ exports.default = PagesWithoutFileExtPlugin;
40
+ function createPageTest(ignorePages, pageExtensions) {
41
+ const extTest = new RegExp(`${pageExtensions.map(lodash_1.escapeRegExp).join('|')}$`);
42
+ const ignoreTest = new RegExp(`${ignorePages.map(lodash_1.escapeRegExp).join('|')}$`);
43
+ return file => {
44
+ return !ignoreTest.test(file) && extTest.test(file) && !path_1.default.basename(file).startsWith('.');
45
+ };
46
+ }
47
+ //# sourceMappingURL=PagesWithoutFileExtPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PagesWithoutFileExtPlugin.js","sourceRoot":"","sources":["../src/PagesWithoutFileExtPlugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAEA,mCAAsC;AACtC,gDAAwB;AAExB;;;;;GAKG;AACH,MAAM,yBAAyB,GAE3B;IACI,YAAY,CAAC,KAAa,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE;;YACvE,MAAM,eAAe,GAAG,cAAc,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;YACpE,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,qBAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAE9E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;gBACxB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;oBACnC,SAAS;iBACV;gBACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBAC9C,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;aAChD;YACD,OAAO,KAAK,CAAC;QACf,CAAC;KAAA;CACF,CAAC;AAEF,kBAAe,yBAAyB,CAAC;AAEzC,SAAS,cAAc,CAAC,WAAW,EAAE,cAAc;IACjD,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,qBAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7E,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,qBAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7E,OAAO,IAAI,CAAC,EAAE;QACZ,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC9F,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,119 @@
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 getReadingTime from "reading-time";
32
+ import { unified } from "unified";
33
+ import { visit } from "unist-util-visit";
34
+ import markdown from "remark-parse";
35
+ /**
36
+ * Calculates reading time for pages and adds to frontmatter
37
+ */ var ReadingTimePlugin = {
38
+ $afterSource: function $afterSource(pages) {
39
+ return _asyncToGenerator(/*#__PURE__*/ regeneratorRuntime.mark(function _callee() {
40
+ var processor, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, page, tree, textContent;
41
+ return regeneratorRuntime.wrap(function _callee$(_ctx) {
42
+ while(1)switch(_ctx.prev = _ctx.next){
43
+ case 0:
44
+ processor = unified().use(markdown);
45
+ _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
46
+ _ctx.prev = 2;
47
+ _iterator = pages[Symbol.iterator]();
48
+ case 4:
49
+ if (_iteratorNormalCompletion = (_step = _iterator.next()).done) {
50
+ _ctx.next = 15;
51
+ break;
52
+ }
53
+ page = _step.value;
54
+ _ctx.next = 8;
55
+ return processor.parse(page.content);
56
+ case 8:
57
+ tree = _ctx.sent;
58
+ textContent = "";
59
+ visit(tree, function(node) {
60
+ return node.type === "text" || node.type === "code";
61
+ }, function(node) {
62
+ textContent += node.value;
63
+ });
64
+ page.readingTime = getReadingTime(textContent);
65
+ case 12:
66
+ _iteratorNormalCompletion = true;
67
+ _ctx.next = 4;
68
+ break;
69
+ case 15:
70
+ _ctx.next = 21;
71
+ break;
72
+ case 17:
73
+ _ctx.prev = 17;
74
+ _ctx.t0 = _ctx["catch"](2);
75
+ _didIteratorError = true;
76
+ _iteratorError = _ctx.t0;
77
+ case 21:
78
+ _ctx.prev = 21;
79
+ _ctx.prev = 22;
80
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
81
+ _iterator.return();
82
+ }
83
+ case 24:
84
+ _ctx.prev = 24;
85
+ if (!_didIteratorError) {
86
+ _ctx.next = 27;
87
+ break;
88
+ }
89
+ throw _iteratorError;
90
+ case 27:
91
+ return _ctx.finish(24);
92
+ case 28:
93
+ return _ctx.finish(21);
94
+ case 29:
95
+ return _ctx.abrupt("return", pages);
96
+ case 30:
97
+ case "end":
98
+ return _ctx.stop();
99
+ }
100
+ }, _callee, null, [
101
+ [
102
+ 2,
103
+ 17,
104
+ 21,
105
+ 29
106
+ ],
107
+ [
108
+ 22,
109
+ ,
110
+ 24,
111
+ 28
112
+ ]
113
+ ]);
114
+ }))();
115
+ }
116
+ };
117
+ export default ReadingTimePlugin;
118
+
119
+ //# sourceMappingURL=ReadingTimePlugin.mjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ReadingTimePlugin.mjs.ts"],"sourcesContent":["import type PluginType from '@jpmorganchase/mosaic-types/dist/Plugin';\nimport type Page from '@jpmorganchase/mosaic-types/dist/Page';\nimport getReadingTime from 'reading-time';\nimport { unified } from 'unified';\nimport { visit } from 'unist-util-visit';\nimport markdown from 'remark-parse';\n\n/**\n * Calculates reading time for pages and adds to frontmatter\n */\nconst ReadingTimePlugin: PluginType<{}> = {\n async $afterSource(pages: Page[]) {\n const processor = unified().use(markdown);\n for (const page of pages) {\n const tree = await processor.parse(page.content);\n let textContent = '';\n\n visit(\n tree,\n node => node.type === 'text' || node.type === 'code',\n node => {\n textContent += node.value;\n }\n );\n page.readingTime = getReadingTime(textContent);\n }\n\n return pages;\n }\n};\n\nexport default ReadingTimePlugin;\n"],"names":["getReadingTime","unified","visit","markdown","ReadingTimePlugin","$afterSource","pages","processor","page","tree","textContent","use","parse","content","node","type","value","readingTime"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,OAAOA,cAAc,MAAM,cAAc,CAAC;AAC1C,SAASC,OAAO,QAAQ,SAAS,CAAC;AAClC,SAASC,KAAK,QAAQ,kBAAkB,CAAC;AACzC,OAAOC,QAAQ,MAAM,cAAc,CAAC;AAEpC;;CAEC,GACD,IAAMC,iBAAiB,GAAmB;IAClCC,YAAY,EAAlB,SAAMA,YAAY,CAACC,KAAa;eAAE,wDAAA,mBAAA;gBAC1BC,SAAS,EACV,yBAAU,EAAV,iBAAU,EAAV,cAAU,EAAV,SAAU,EAAV,KAAU,EAAJC,IAAI,EACPC,IAAI,EACNC,WAAW;;;;wBAHXH,SAAS,GAAGN,OAAO,EAAE,CAACU,GAAG,CAACR,QAAQ,CAAC,CAAC;wBACrC,yBAAU,SAAV,iBAAU,UAAV,cAAU;;wBAAV,SAAU,GAAIG,KAAK;;4BAAnB,yBAAU,IAAV,KAAU,GAAV,SAAU;;;;wBAAJE,IAAI,GAAV,KAAU,MAAA;;+BACMD,SAAS,CAACK,KAAK,CAACJ,IAAI,CAACK,OAAO,CAAC;;wBAA1CJ,IAAI,YAAsC,CAAA;wBAC5CC,WAAW,GAAG,EAAE,CAAC;wBAErBR,KAAK,CACHO,IAAI,EACJK,SAAAA,IAAI;mCAAIA,IAAI,CAACC,IAAI,KAAK,MAAM,IAAID,IAAI,CAACC,IAAI,KAAK,MAAM;yBAAA,EACpDD,SAAAA,IAAI,EAAI;4BACNJ,WAAW,IAAII,IAAI,CAACE,KAAK,CAAC;yBAC3B,CACF,CAAC;wBACFR,IAAI,CAACS,WAAW,GAAGjB,cAAc,CAACU,WAAW,CAAC,CAAC;;wBAX5C,yBAAU;;;;;;;;;wBAAV,iBAAU;wBAAV,cAAU;;;;6BAAV,yBAAU,IAAV,SAAU;4BAAV,SAAU;;;;4BAAV,CAAA,iBAAU;;;;8BAAV,cAAU;;;;;;qDAcRJ,KAAK;;;;;;;;;;;;;;;;;;;SACb,EAAA;KAAA;CACF,AAAC;AAEF,eAAeF,iBAAiB,CAAC"}
@@ -0,0 +1,50 @@
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"));
17
+ /**
18
+ * Plugin that crawls the page hierarchy to find the closest `sharedConfig` from any parent index's page metadata.
19
+ * It then exports a JSON file (name: `options.filename`) into each directory with the merged config for that level
20
+ */
21
+ 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,/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, '{}');
34
+ }
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]);
38
+ }
39
+ }
40
+ });
41
+ }
42
+ };
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
+ }
50
+ //# sourceMappingURL=SharedConfigPlugin.js.map
@@ -0,0 +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,iBAAiB,EAAE,cAAc,CAAC,EACjD;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"}
@@ -0,0 +1,109 @@
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"));
16
+ /**
17
+ * Sorts the pages in a folder by priority and then exports a JSON file (name: `options.filename`) with the
18
+ * sidebar tree from that directory downwards and adds sidebar data into frontmatter for each page.
19
+ */
20
+ const SidebarPlugin = {
21
+ $beforeSend(mutableFilesystem, { config, serialiser, ignorePages, pageExtensions }, options) {
22
+ return __awaiter(this, void 0, void 0, function* () {
23
+ const dirs = yield mutableFilesystem.promises.glob('**', {
24
+ onlyDirectories: true,
25
+ cwd: '/'
26
+ });
27
+ for (const dirName of dirs) {
28
+ const sidebarFilePath = path_1.default.posix.join(String(dirName), options.filename);
29
+ const pages = (yield Promise.all((yield mutableFilesystem.promises.glob(createFileGlob(['*', '*/index'], pageExtensions), {
30
+ onlyFiles: true,
31
+ cwd: String(dirName),
32
+ ignore: ignorePages.map(ignore => `**/${ignore}`)
33
+ })).map((pagePath) => __awaiter(this, void 0, void 0, function* () {
34
+ return yield serialiser.deserialise(pagePath, yield mutableFilesystem.promises.readFile(pagePath));
35
+ }))))
36
+ .filter(page => filterFn(page))
37
+ .sort((pageA, pageB) => sortFn(pageA, pageB, dirName));
38
+ for (let i = 0; i < pages.length; i++) {
39
+ setPageRefs(sidebarFilePath, pages[i], i);
40
+ setChildPageRefs(pages[i], dirName, i, sidebarFilePath);
41
+ addSidebarDataToFrontmatter(pages[i], dirName);
42
+ }
43
+ yield mutableFilesystem.promises.writeFile(sidebarFilePath, '[]');
44
+ }
45
+ function setPageRefs(sidebarFilePath, page, i) {
46
+ config.setRef(sidebarFilePath, ['pages', `${i}`, 'id', '$ref'], `${page.fullPath}#/route`);
47
+ page.sidebar && page.sidebar.label
48
+ ? config.setRef(sidebarFilePath, ['pages', `${i}`, 'name', '$ref'], `${page.fullPath}#/sidebar/label`)
49
+ : config.setRef(sidebarFilePath, ['pages', `${i}`, 'name', '$ref'], `${page.fullPath}#/title`);
50
+ config.setRef(sidebarFilePath, ['pages', `${i}`, 'data', 'link', '$ref'], `${page.fullPath}#/route`);
51
+ }
52
+ function setChildPageRefs(page, dirName, i, sidebarFilePath) {
53
+ return __awaiter(this, void 0, void 0, function* () {
54
+ if (isSubfolderIndex(page, dirName)) {
55
+ const childDirName = path_1.default.posix.dirname(page.fullPath);
56
+ const childNodeSidebarPath = path_1.default.posix.join(childDirName, options.filename);
57
+ const childPages = (yield Promise.all((yield mutableFilesystem.promises.glob(createFileGlob(['*', '*/index'], pageExtensions), {
58
+ onlyFiles: true,
59
+ cwd: String(childDirName),
60
+ ignore: ignorePages.map(ignore => `**/${ignore}`)
61
+ })).map((pagePath) => __awaiter(this, void 0, void 0, function* () {
62
+ return yield serialiser.deserialise(pagePath, yield mutableFilesystem.promises.readFile(pagePath));
63
+ })))).filter(page => filterFn(page));
64
+ if (childPages.length > 1) {
65
+ for (let j = 1; j < childPages.length; j++) {
66
+ config.setRef(sidebarFilePath, ['pages', `${i}`, 'childNodes', `${j - 1}`, '$ref'], `${childNodeSidebarPath}#/pages/${j}`);
67
+ }
68
+ }
69
+ }
70
+ });
71
+ }
72
+ function addSidebarDataToFrontmatter(page, dirName) {
73
+ const dirNameLevels = String(dirName)
74
+ .split('/')
75
+ .filter(level => level);
76
+ const sidebarRootDir = `/` + dirNameLevels.slice(0, dirNameLevels.length < 3 ? dirNameLevels.length : 3).join(`/`);
77
+ config.setRef(String(page.fullPath), ['sidebarData', '$ref'], path_1.default.posix.join(String(sidebarRootDir), options.filename, '#', 'pages'));
78
+ }
79
+ });
80
+ }
81
+ };
82
+ exports.default = SidebarPlugin;
83
+ function createFileGlob(patterns, pageExtensions) {
84
+ if (Array.isArray(patterns)) {
85
+ return patterns.map(pattern => createFileGlob(pattern, pageExtensions));
86
+ }
87
+ if (pageExtensions.length === 1) {
88
+ return `${patterns}${pageExtensions[0]}`;
89
+ }
90
+ return `${patterns}{${pageExtensions.join(',')}}`;
91
+ }
92
+ function isSubfolderIndex(page, dirName) {
93
+ return page.fullPath.split('/').length == String(dirName).split('/').length + 2;
94
+ }
95
+ function sortFn(pageA, pageB, dirName) {
96
+ // Always pin /index to the front
97
+ if (pageA.route === dirName + '/index') {
98
+ return -1;
99
+ }
100
+ if (pageB.route === dirName + '/index') {
101
+ return 1;
102
+ }
103
+ return ((pageB.sidebar && pageB.sidebar.priority ? pageB.sidebar.priority : -1) -
104
+ (pageA.sidebar && pageA.sidebar.priority ? pageA.sidebar.priority : -1));
105
+ }
106
+ function filterFn(page) {
107
+ return !(page.sidebar && page.sidebar.exclude);
108
+ }
109
+ //# sourceMappingURL=SidebarPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SidebarPlugin.js","sourceRoot":"","sources":["../src/SidebarPlugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const SiteMapPlugin = {
13
+ // Merge together all of the individual sitemaps from each source
14
+ afterUpdate(mutableFilesystem, { sharedFilesystem, globalConfig }) {
15
+ return __awaiter(this, void 0, void 0, function* () {
16
+ if (!Array.isArray(globalConfig.data.sitemaps)) {
17
+ return;
18
+ }
19
+ yield sharedFilesystem.promises.writeFile('/sitemap.xml', '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n' +
20
+ globalConfig.data.sitemaps
21
+ .map(items => items
22
+ .map(item => `\t<url>\n\t\t<loc>${String(item)}</loc>\n\t\t<changefreq>weekly</changefreq>\n\t\t<priority>0.5</priority>\n\t</url>`)
23
+ .join('\n'))
24
+ .join('') +
25
+ '\n</urlset>');
26
+ });
27
+ },
28
+ // Store a sitemap for just this source
29
+ $beforeSend(mutableFilesystem, { config, ignorePages }, options) {
30
+ return __awaiter(this, void 0, void 0, function* () {
31
+ config.setData({
32
+ sitemaps: [
33
+ (yield mutableFilesystem.promises.glob('**', {
34
+ onlyFiles: true,
35
+ ignore: ignorePages.map(ignore => `**/${ignore}`),
36
+ cwd: '/'
37
+ }))
38
+ ]
39
+ });
40
+ });
41
+ }
42
+ };
43
+ exports.default = SiteMapPlugin;
44
+ //# sourceMappingURL=SiteMapPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SiteMapPlugin.js","sourceRoot":"","sources":["../src/SiteMapPlugin.ts"],"names":[],"mappings":";;;;;;;;;;;AAEA,MAAM,aAAa,GAGf;IACF,iEAAiE;IAC3D,WAAW,CAAC,iBAAiB,EAAE,EAAE,gBAAgB,EAAE,YAAY,EAAE;;YACrE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAC9C,OAAO;aACR;YACD,MAAM,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CACvC,cAAc,EACd,gEAAgE;gBAC9D,YAAY,CAAC,IAAI,CAAC,QAAQ;qBACvB,GAAG,CAAC,KAAK,CAAC,EAAE,CACX,KAAK;qBACF,GAAG,CACF,IAAI,CAAC,EAAE,CACL,qBAAqB,MAAM,CACzB,IAAI,CACL,qFAAqF,CACzF;qBACA,IAAI,CAAC,IAAI,CAAC,CACd;qBACA,IAAI,CAAC,EAAE,CAAC;gBACX,aAAa,CAChB,CAAC;QACJ,CAAC;KAAA;IACD,uCAAuC;IACjC,WAAW,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,OAAO;;YACnE,MAAM,CAAC,OAAO,CAAC;gBACb,QAAQ,EAAE;oBACR,CAAC,MAAM,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE;wBAC3C,SAAS,EAAE,IAAI;wBACf,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,MAAM,EAAE,CAAC;wBACjD,GAAG,EAAE,GAAG;qBACT,CAAC,CAAa;iBAChB;aACF,CAAC,CAAC;QACL,CAAC;KAAA;CACF,CAAC;AAEF,kBAAe,aAAa,CAAC"}
@@ -0,0 +1,140 @@
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
+ function _throw(e) {
31
+ throw e;
32
+ }
33
+ import regeneratorRuntime from "regenerator-runtime";
34
+ import { visit } from "unist-util-visit";
35
+ import markdown from "remark-parse";
36
+ import { unified } from "unified";
37
+ import Slugger from "github-slugger";
38
+ import { toString } from "hast-util-to-string";
39
+ /**
40
+ * Calculates table of contents from page headings
41
+ */ var TableOfContentsPlugin = {
42
+ $afterSource: function $afterSource(pages, _$param, param) {
43
+ var _$param = _$param !== null ? _$param : _throw(new TypeError("Cannot destructure undefined")), minRank = param.minRank, maxRank = param.maxRank;
44
+ return _asyncToGenerator(/*#__PURE__*/ regeneratorRuntime.mark(function _callee() {
45
+ var processor, slugger, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, page, tree, items, test, isHeadingInRange;
46
+ return regeneratorRuntime.wrap(function _callee$(_ctx) {
47
+ while(1)switch(_ctx.prev = _ctx.next){
48
+ case 0:
49
+ test = function _test(node) {
50
+ return node.type === "heading" && isHeadingInRange(node);
51
+ };
52
+ isHeadingInRange = function _isHeadingInRange(node) {
53
+ var depth = node.depth;
54
+ if (depth < minRank || depth > maxRank) {
55
+ return false;
56
+ }
57
+ return true;
58
+ };
59
+ processor = unified().use(markdown);
60
+ slugger = new Slugger();
61
+ _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
62
+ _ctx.prev = 5;
63
+ _iterator = pages[Symbol.iterator]();
64
+ case 7:
65
+ if (_iteratorNormalCompletion = (_step = _iterator.next()).done) {
66
+ _ctx.next = 18;
67
+ break;
68
+ }
69
+ page = _step.value;
70
+ _ctx.next = 11;
71
+ return processor.parse(page.content);
72
+ case 11:
73
+ tree = _ctx.sent;
74
+ items = [];
75
+ visit(tree, function(node) {
76
+ return test(node);
77
+ }, function(node) {
78
+ var text = toString(node).trim();
79
+ items.push({
80
+ level: node.depth,
81
+ id: slugger.slug(text),
82
+ text: text
83
+ });
84
+ });
85
+ page.tableOfContents = items;
86
+ case 15:
87
+ _iteratorNormalCompletion = true;
88
+ _ctx.next = 7;
89
+ break;
90
+ case 18:
91
+ _ctx.next = 24;
92
+ break;
93
+ case 20:
94
+ _ctx.prev = 20;
95
+ _ctx.t0 = _ctx["catch"](5);
96
+ _didIteratorError = true;
97
+ _iteratorError = _ctx.t0;
98
+ case 24:
99
+ _ctx.prev = 24;
100
+ _ctx.prev = 25;
101
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
102
+ _iterator.return();
103
+ }
104
+ case 27:
105
+ _ctx.prev = 27;
106
+ if (!_didIteratorError) {
107
+ _ctx.next = 30;
108
+ break;
109
+ }
110
+ throw _iteratorError;
111
+ case 30:
112
+ return _ctx.finish(27);
113
+ case 31:
114
+ return _ctx.finish(24);
115
+ case 32:
116
+ return _ctx.abrupt("return", pages);
117
+ case 35:
118
+ case "end":
119
+ return _ctx.stop();
120
+ }
121
+ }, _callee, null, [
122
+ [
123
+ 5,
124
+ 20,
125
+ 24,
126
+ 32
127
+ ],
128
+ [
129
+ 25,
130
+ ,
131
+ 27,
132
+ 31
133
+ ]
134
+ ]);
135
+ }))();
136
+ }
137
+ };
138
+ export default TableOfContentsPlugin;
139
+
140
+ //# sourceMappingURL=TableOfContentsPlugin.mjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/TableOfContentsPlugin.mjs.ts"],"sourcesContent":["import type PluginType from '@jpmorganchase/mosaic-types/dist/Plugin';\nimport type Page from '@jpmorganchase/mosaic-types/dist/Page';\nimport { visit } from 'unist-util-visit';\nimport markdown from 'remark-parse';\nimport { unified } from 'unified';\nimport Slugger from 'github-slugger';\nimport { toString } from 'hast-util-to-string';\n\ntype TOCItem = { level: number; id: string; text: string };\n\n/**\n * Calculates table of contents from page headings\n */\nconst TableOfContentsPlugin: PluginType<{}, { minRank: 2; maxRank: 4 }> = {\n async $afterSource(pages: Page[], {}, { minRank, maxRank }) {\n const processor = unified().use(markdown);\n const slugger = new Slugger();\n for (const page of pages) {\n const tree = await processor.parse(page.content);\n const items: TOCItem[] = [];\n visit(\n tree,\n node => test(node),\n node => {\n const text = toString(node).trim();\n items.push({\n level: node.depth,\n id: slugger.slug(text),\n text: text\n });\n }\n );\n page.tableOfContents = items;\n }\n\n return pages;\n\n function test(node) {\n return node.type === 'heading' && isHeadingInRange(node);\n }\n\n function isHeadingInRange(node) {\n const depth = node.depth;\n if (depth < minRank || depth > maxRank) {\n return false;\n }\n return true;\n }\n }\n};\n\nexport default TableOfContentsPlugin;\n"],"names":["visit","markdown","unified","Slugger","toString","TableOfContentsPlugin","$afterSource","pages","minRank","maxRank","processor","slugger","page","tree","items","test","isHeadingInRange","node","type","depth","use","parse","content","text","trim","push","level","id","slug","tableOfContents"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,SAASA,KAAK,QAAQ,kBAAkB,CAAC;AACzC,OAAOC,QAAQ,MAAM,cAAc,CAAC;AACpC,SAASC,OAAO,QAAQ,SAAS,CAAC;AAClC,OAAOC,OAAO,MAAM,gBAAgB,CAAC;AACrC,SAASC,QAAQ,QAAQ,qBAAqB,CAAC;AAI/C;;CAEC,GACD,IAAMC,qBAAqB,GAA+C;IAClEC,YAAY,EAAlB,SAAMA,YAAY,CAACC,KAAa,EAAE,OAAE,EAAE,KAAoB;YAAxB,OAAE,GAAF,OAAE,YAAF,OAAE,wDAAA,EAAIC,OAAO,GAAT,KAAoB,CAAlBA,OAAO,EAAEC,OAAO,GAAlB,KAAoB,CAATA,OAAO;eAAI,wDAAA,mBAAA;gBACpDC,SAAS,EACTC,OAAO,EACR,yBAAU,EAAV,iBAAU,EAAV,cAAU,EAAV,SAAU,EAAV,KAAU,EAAJC,IAAI,EACPC,IAAI,EACJC,KAAK,EAkBJC,IAAI,EAIJC,gBAAgB;;;;wBAJzB,AAASD,IAAI,GAAb,SAASA,KAAI,CAACE,IAAI,EAAE;4BAClB,OAAOA,IAAI,CAACC,IAAI,KAAK,SAAS,IAAIF,gBAAgB,CAACC,IAAI,CAAC,CAAC;yBAC1D;wBAED,AAASD,gBAAgB,GAAzB,SAASA,iBAAgB,CAACC,IAAI,EAAE;4BAC9B,IAAME,KAAK,GAAGF,IAAI,CAACE,KAAK,AAAC;4BACzB,IAAIA,KAAK,GAAGX,OAAO,IAAIW,KAAK,GAAGV,OAAO,EAAE;gCACtC,OAAO,KAAK,CAAC;6BACd;4BACD,OAAO,IAAI,CAAC;yBACb;wBAhCKC,SAAS,GAAGR,OAAO,EAAE,CAACkB,GAAG,CAACnB,QAAQ,CAAC,CAAC;wBACpCU,OAAO,GAAG,IAAIR,OAAO,EAAE,CAAC;wBACzB,yBAAU,SAAV,iBAAU,UAAV,cAAU;;wBAAV,SAAU,GAAII,KAAK;;4BAAnB,yBAAU,IAAV,KAAU,GAAV,SAAU;;;;wBAAJK,IAAI,GAAV,KAAU,MAAA;;+BACMF,SAAS,CAACW,KAAK,CAACT,IAAI,CAACU,OAAO,CAAC;;wBAA1CT,IAAI,YAAsC,CAAA;wBAC1CC,KAAK,GAAc,EAAE,CAAC;wBAC5Bd,KAAK,CACHa,IAAI,EACJI,SAAAA,IAAI;mCAAIF,IAAI,CAACE,IAAI,CAAC;yBAAA,EAClBA,SAAAA,IAAI,EAAI;4BACN,IAAMM,IAAI,GAAGnB,QAAQ,CAACa,IAAI,CAAC,CAACO,IAAI,EAAE,AAAC;4BACnCV,KAAK,CAACW,IAAI,CAAC;gCACTC,KAAK,EAAET,IAAI,CAACE,KAAK;gCACjBQ,EAAE,EAAEhB,OAAO,CAACiB,IAAI,CAACL,IAAI,CAAC;gCACtBA,IAAI,EAAEA,IAAI;6BACX,CAAC,CAAC;yBACJ,CACF,CAAC;wBACFX,IAAI,CAACiB,eAAe,GAAGf,KAAK,CAAC;;wBAf1B,yBAAU;;;;;;;;;wBAAV,iBAAU;wBAAV,cAAU;;;;6BAAV,yBAAU,IAAV,SAAU;4BAAV,SAAU;;;;4BAAV,CAAA,iBAAU;;;;8BAAV,cAAU;;;;;;qDAkBRP,KAAK;;;;;;;;;;;;;;;;;;;SAab,EAAA;KAAA;CACF,AAAC;AAEF,eAAeF,qBAAqB,CAAC"}
@@ -0,0 +1,83 @@
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"));
16
+ const fast_glob_1 = __importDefault(require("fast-glob"));
17
+ const set_1 = __importDefault(require("lodash/set"));
18
+ function createFileGlob(url, pageExtensions) {
19
+ if (pageExtensions.length === 1) {
20
+ return `${url}${pageExtensions[0]}`;
21
+ }
22
+ return `${url}{${pageExtensions.join(',')}}`;
23
+ }
24
+ function normaliseRefs(filepath, refs, filesystem, pageExtensions, ignorePages) {
25
+ return __awaiter(this, void 0, void 0, function* () {
26
+ const configWithoutGlobs = {};
27
+ for (let i = 0; i < refs.length; i++) {
28
+ const ref = refs[i];
29
+ const [url, fragment = ''] = ref.$$value.split('#');
30
+ if (!url) {
31
+ continue;
32
+ }
33
+ const fullUrl = path_1.default.resolve(path_1.default.dirname(filepath), url);
34
+ if (!fast_glob_1.default.isDynamicPattern(url)) {
35
+ if (!(yield filesystem.promises.exists(fullUrl))) {
36
+ throw new Error(`A \`$ref\` for '${filepath}' pointed to page '${fullUrl}' - which could not be found.`);
37
+ }
38
+ const refRealPath = yield filesystem.promises.realpath(fullUrl
39
+ //path.resolve(path.dirname(filepath), url)
40
+ );
41
+ const stat = yield filesystem.promises.stat(refRealPath);
42
+ // Turn directory refs into full index paths
43
+ // TODO: But DO we want to do this?
44
+ if (stat.isDirectory()) {
45
+ // && !/\/index(\.\w{1,4})?$/.test(url)) {
46
+ (0, set_1.default)(configWithoutGlobs, ref.$$path.slice(0, -1), {
47
+ $ref: `${yield filesystem.promises.realpath(path_1.default.join(refRealPath, 'index'))}#${fragment}`
48
+ });
49
+ }
50
+ else {
51
+ (0, set_1.default)(configWithoutGlobs, ref.$$path.slice(0, -1), {
52
+ $ref: `${refRealPath}#${fragment}`
53
+ });
54
+ }
55
+ continue;
56
+ }
57
+ try {
58
+ let globResolvedRefs =
59
+ // If the pattern doesn't have an explicit file extension - then we'll make it just return pages
60
+ yield filesystem.promises.glob(!/\/[^/]+\.\w{2,4}$/.test(url) ? createFileGlob(url, pageExtensions) : url, {
61
+ ignore: [filepath, ...ignorePages.map(ignore => `**/${ignore}`)],
62
+ cwd: path_1.default.dirname(filepath),
63
+ absolute: true
64
+ });
65
+ // Use a set so we de-dupe any symlinks that point to the same page
66
+ const resolvedRefs = new Set();
67
+ for (const value of globResolvedRefs) {
68
+ const refRealPath = yield filesystem.promises.realpath(path_1.default.resolve(filepath, value));
69
+ if (refRealPath !== (yield filesystem.promises.realpath(filepath))) {
70
+ resolvedRefs.add(`${refRealPath}#${fragment}`);
71
+ }
72
+ }
73
+ (0, set_1.default)(configWithoutGlobs, ref.$$path.slice(0, -1), Array.from(resolvedRefs).map($ref => ({ $ref })));
74
+ }
75
+ catch (e) {
76
+ throw e;
77
+ }
78
+ }
79
+ return configWithoutGlobs;
80
+ });
81
+ }
82
+ exports.default = normaliseRefs;
83
+ //# sourceMappingURL=normaliseRefs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normaliseRefs.js","sourceRoot":"","sources":["../../src/utils/normaliseRefs.ts"],"names":[],"mappings":"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"}