@docusaurus/utils-validation 0.0.0-5961 → 0.0.0-5963

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.
package/lib/index.d.ts CHANGED
@@ -8,4 +8,5 @@ export { default as Joi } from './Joi';
8
8
  export { JoiFrontMatter } from './JoiFrontMatter';
9
9
  export { printWarning, normalizePluginOptions, normalizeThemeConfig, validateFrontMatter, } from './validationUtils';
10
10
  export { PluginIdSchema, RemarkPluginsSchema, RehypePluginsSchema, AdmonitionsSchema, RouteBasePathSchema, URISchema, PathnameSchema, FrontMatterTagsSchema, FrontMatterTOCHeadingLevels, ContentVisibilitySchema, FrontMatterLastUpdateErrorMessage, FrontMatterLastUpdateSchema, } from './validationSchemas';
11
+ export { getTagsFilePathsToWatch, getTagsFile } from './tagsFile';
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAC,OAAO,IAAI,GAAG,EAAC,MAAM,OAAO,CAAC;AACrC,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,SAAS,EACT,cAAc,EACd,qBAAqB,EACrB,2BAA2B,EAC3B,uBAAuB,EACvB,iCAAiC,EACjC,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAC,OAAO,IAAI,GAAG,EAAC,MAAM,OAAO,CAAC;AACrC,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,SAAS,EACT,cAAc,EACd,qBAAqB,EACrB,2BAA2B,EAC3B,uBAAuB,EACvB,iCAAiC,EACjC,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAC,uBAAuB,EAAE,WAAW,EAAC,MAAM,YAAY,CAAC"}
package/lib/index.js CHANGED
@@ -6,7 +6,7 @@
6
6
  * LICENSE file in the root directory of this source tree.
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.FrontMatterLastUpdateSchema = exports.FrontMatterLastUpdateErrorMessage = exports.ContentVisibilitySchema = exports.FrontMatterTOCHeadingLevels = exports.FrontMatterTagsSchema = exports.PathnameSchema = exports.URISchema = exports.RouteBasePathSchema = exports.AdmonitionsSchema = exports.RehypePluginsSchema = exports.RemarkPluginsSchema = exports.PluginIdSchema = exports.validateFrontMatter = exports.normalizeThemeConfig = exports.normalizePluginOptions = exports.printWarning = exports.JoiFrontMatter = exports.Joi = void 0;
9
+ exports.getTagsFile = exports.getTagsFilePathsToWatch = exports.FrontMatterLastUpdateSchema = exports.FrontMatterLastUpdateErrorMessage = exports.ContentVisibilitySchema = exports.FrontMatterTOCHeadingLevels = exports.FrontMatterTagsSchema = exports.PathnameSchema = exports.URISchema = exports.RouteBasePathSchema = exports.AdmonitionsSchema = exports.RehypePluginsSchema = exports.RemarkPluginsSchema = exports.PluginIdSchema = exports.validateFrontMatter = exports.normalizeThemeConfig = exports.normalizePluginOptions = exports.printWarning = exports.JoiFrontMatter = exports.Joi = void 0;
10
10
  // /!\ don't remove this export, as we recommend plugin authors to use it
11
11
  var Joi_1 = require("./Joi");
12
12
  Object.defineProperty(exports, "Joi", { enumerable: true, get: function () { return __importDefault(Joi_1).default; } });
@@ -30,4 +30,7 @@ Object.defineProperty(exports, "FrontMatterTOCHeadingLevels", { enumerable: true
30
30
  Object.defineProperty(exports, "ContentVisibilitySchema", { enumerable: true, get: function () { return validationSchemas_1.ContentVisibilitySchema; } });
31
31
  Object.defineProperty(exports, "FrontMatterLastUpdateErrorMessage", { enumerable: true, get: function () { return validationSchemas_1.FrontMatterLastUpdateErrorMessage; } });
32
32
  Object.defineProperty(exports, "FrontMatterLastUpdateSchema", { enumerable: true, get: function () { return validationSchemas_1.FrontMatterLastUpdateSchema; } });
33
+ var tagsFile_1 = require("./tagsFile");
34
+ Object.defineProperty(exports, "getTagsFilePathsToWatch", { enumerable: true, get: function () { return tagsFile_1.getTagsFilePathsToWatch; } });
35
+ Object.defineProperty(exports, "getTagsFile", { enumerable: true, get: function () { return tagsFile_1.getTagsFile; } });
33
36
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,yEAAyE;AACzE,6BAAqC;AAA7B,2GAAA,OAAO,OAAO;AACtB,mDAAgD;AAAxC,gHAAA,cAAc,OAAA;AAEtB,qDAK2B;AAJzB,+GAAA,YAAY,OAAA;AACZ,yHAAA,sBAAsB,OAAA;AACtB,uHAAA,oBAAoB,OAAA;AACpB,sHAAA,mBAAmB,OAAA;AAErB,yDAa6B;AAZ3B,mHAAA,cAAc,OAAA;AACd,wHAAA,mBAAmB,OAAA;AACnB,wHAAA,mBAAmB,OAAA;AACnB,sHAAA,iBAAiB,OAAA;AACjB,wHAAA,mBAAmB,OAAA;AACnB,8GAAA,SAAS,OAAA;AACT,mHAAA,cAAc,OAAA;AACd,0HAAA,qBAAqB,OAAA;AACrB,gIAAA,2BAA2B,OAAA;AAC3B,4HAAA,uBAAuB,OAAA;AACvB,sIAAA,iCAAiC,OAAA;AACjC,gIAAA,2BAA2B,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,yEAAyE;AACzE,6BAAqC;AAA7B,2GAAA,OAAO,OAAO;AACtB,mDAAgD;AAAxC,gHAAA,cAAc,OAAA;AAEtB,qDAK2B;AAJzB,+GAAA,YAAY,OAAA;AACZ,yHAAA,sBAAsB,OAAA;AACtB,uHAAA,oBAAoB,OAAA;AACpB,sHAAA,mBAAmB,OAAA;AAErB,yDAa6B;AAZ3B,mHAAA,cAAc,OAAA;AACd,wHAAA,mBAAmB,OAAA;AACnB,wHAAA,mBAAmB,OAAA;AACnB,sHAAA,iBAAiB,OAAA;AACjB,wHAAA,mBAAmB,OAAA;AACnB,8GAAA,SAAS,OAAA;AACT,mHAAA,cAAc,OAAA;AACd,0HAAA,qBAAqB,OAAA;AACrB,gIAAA,2BAA2B,OAAA;AAC3B,4HAAA,uBAAuB,OAAA;AACvB,sIAAA,iCAAiC,OAAA;AACjC,gIAAA,2BAA2B,OAAA;AAE7B,uCAAgE;AAAxD,mHAAA,uBAAuB,OAAA;AAAE,uGAAA,WAAW,OAAA"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+ import type { ContentPaths, TagsFile, TagsFileInput, TagsPluginOptions } from '@docusaurus/utils';
8
+ export declare function ensureUniquePermalinks(tags: TagsFile): void;
9
+ export declare function normalizeTagsFile(data: TagsFileInput): TagsFile;
10
+ type GetTagsFileParams = {
11
+ tags: TagsPluginOptions['tags'];
12
+ contentPaths: ContentPaths;
13
+ };
14
+ export declare function getTagsFilePathsToWatch({ tags, contentPaths, }: GetTagsFileParams): string[];
15
+ export declare function getTagsFile({ tags, contentPaths, }: GetTagsFileParams): Promise<TagsFile | null>;
16
+ export {};
17
+ //# sourceMappingURL=tagsFile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tagsFile.d.ts","sourceRoot":"","sources":["../src/tagsFile.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,KAAK,EACV,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,iBAAiB,EAClB,MAAM,mBAAmB,CAAC;AAW3B,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAqB3D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,QAAQ,CAQ/D;AAED,KAAK,iBAAiB,GAAG;IACvB,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAChC,YAAY,EAAE,YAAY,CAAC;CAC5B,CAAC;AAIF,wBAAgB,uBAAuB,CAAC,EACtC,IAAI,EACJ,YAAY,GACb,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAS9B;AAED,wBAAsB,WAAW,CAAC,EAChC,IAAI,EACJ,YAAY,GACb,EAAE,iBAAiB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CA4C9C"}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) Facebook, Inc. and its affiliates.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.getTagsFile = exports.getTagsFilePathsToWatch = exports.normalizeTagsFile = exports.ensureUniquePermalinks = void 0;
10
+ const tslib_1 = require("tslib");
11
+ const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
12
+ const node_path_1 = tslib_1.__importDefault(require("node:path"));
13
+ const lodash_1 = tslib_1.__importDefault(require("lodash"));
14
+ const joi_1 = tslib_1.__importDefault(require("joi"));
15
+ const js_yaml_1 = tslib_1.__importDefault(require("js-yaml"));
16
+ const utils_1 = require("@docusaurus/utils");
17
+ const TagsFileInputSchema = joi_1.default.object().pattern(joi_1.default.string(), joi_1.default.object({
18
+ label: joi_1.default.string(),
19
+ description: joi_1.default.string(),
20
+ permalink: joi_1.default.string(),
21
+ }).allow(null));
22
+ function ensureUniquePermalinks(tags) {
23
+ const permalinks = new Set();
24
+ const duplicates = new Set();
25
+ for (const [, tag] of Object.entries(tags)) {
26
+ const { permalink } = tag;
27
+ if (permalinks.has(permalink)) {
28
+ duplicates.add(permalink);
29
+ }
30
+ else {
31
+ permalinks.add(permalink);
32
+ }
33
+ }
34
+ if (duplicates.size > 0) {
35
+ const duplicateList = Array.from(duplicates)
36
+ .map((permalink) => ` - ${permalink}`)
37
+ .join('\n');
38
+ throw new Error(`Duplicate permalinks found in tags file:\n${duplicateList}`);
39
+ }
40
+ }
41
+ exports.ensureUniquePermalinks = ensureUniquePermalinks;
42
+ function normalizeTagsFile(data) {
43
+ return lodash_1.default.mapValues(data, (tag, key) => {
44
+ return {
45
+ label: tag?.label || lodash_1.default.capitalize(key),
46
+ description: tag?.description,
47
+ permalink: tag?.permalink || `/${lodash_1.default.kebabCase(key)}`,
48
+ };
49
+ });
50
+ }
51
+ exports.normalizeTagsFile = normalizeTagsFile;
52
+ const DefaultTagsFileName = 'tags.yml';
53
+ function getTagsFilePathsToWatch({ tags, contentPaths, }) {
54
+ if (tags === false || tags === null) {
55
+ return [];
56
+ }
57
+ const relativeFilePath = tags ?? DefaultTagsFileName;
58
+ return (0, utils_1.getContentPathList)(contentPaths).map((contentPath) => node_path_1.default.posix.join(contentPath, relativeFilePath));
59
+ }
60
+ exports.getTagsFilePathsToWatch = getTagsFilePathsToWatch;
61
+ async function getTagsFile({ tags, contentPaths, }) {
62
+ if (tags === false || tags === null) {
63
+ return null;
64
+ }
65
+ const relativeFilePath = tags ?? DefaultTagsFileName;
66
+ // if returned path is defined, the file exists (localized or not)
67
+ const yamlFilePath = await (0, utils_1.getDataFilePath)({
68
+ contentPaths,
69
+ filePath: relativeFilePath,
70
+ });
71
+ // If the tags option is undefined, don't throw when the file does not exist
72
+ // Retro-compatible behavior: existing sites do not yet have tags.yml
73
+ if (tags === undefined && !yamlFilePath) {
74
+ return null;
75
+ }
76
+ if (!yamlFilePath) {
77
+ throw new Error(`No tags file '${relativeFilePath}' could be found in any of those directories:\n- ${(0, utils_1.getContentPathList)(contentPaths).join('\n- ')}`);
78
+ }
79
+ const tagDefinitionContent = await fs_extra_1.default.readFile(yamlFilePath, 'utf-8');
80
+ if (!tagDefinitionContent.trim()) {
81
+ return {};
82
+ }
83
+ const yamlContent = js_yaml_1.default.load(tagDefinitionContent);
84
+ const tagsFileInputResult = TagsFileInputSchema.validate(yamlContent);
85
+ if (tagsFileInputResult.error) {
86
+ throw new Error(`There was an error extracting tags from file: ${tagsFileInputResult.error.message}`, { cause: tagsFileInputResult });
87
+ }
88
+ const tagsFile = normalizeTagsFile(tagsFileInputResult.value);
89
+ ensureUniquePermalinks(tagsFile);
90
+ return tagsFile;
91
+ }
92
+ exports.getTagsFile = getTagsFile;
93
+ //# sourceMappingURL=tagsFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tagsFile.js","sourceRoot":"","sources":["../src/tagsFile.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;AAEH,gEAA0B;AAC1B,kEAA6B;AAC7B,4DAAuB;AACvB,sDAAsB;AACtB,8DAA2B;AAC3B,6CAAsE;AAQtE,MAAM,mBAAmB,GAAG,aAAG,CAAC,MAAM,EAAiB,CAAC,OAAO,CAC7D,aAAG,CAAC,MAAM,EAAE,EACZ,aAAG,CAAC,MAAM,CAAC;IACT,KAAK,EAAE,aAAG,CAAC,MAAM,EAAE;IACnB,WAAW,EAAE,aAAG,CAAC,MAAM,EAAE;IACzB,SAAS,EAAE,aAAG,CAAC,MAAM,EAAE;CACxB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CACf,CAAC;AAEF,SAAgB,sBAAsB,CAAC,IAAc;IACnD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IAErC,KAAK,MAAM,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,EAAC,SAAS,EAAC,GAAG,GAAG,CAAC;QACxB,IAAI,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;aACzC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,OAAO,SAAS,EAAE,CAAC;aACtC,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,IAAI,KAAK,CACb,6CAA6C,aAAa,EAAE,CAC7D,CAAC;IACJ,CAAC;AACH,CAAC;AArBD,wDAqBC;AAED,SAAgB,iBAAiB,CAAC,IAAmB;IACnD,OAAO,gBAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACpC,OAAO;YACL,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,gBAAC,CAAC,UAAU,CAAC,GAAG,CAAC;YACtC,WAAW,EAAE,GAAG,EAAE,WAAW;YAC7B,SAAS,EAAE,GAAG,EAAE,SAAS,IAAI,IAAI,gBAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;SACpD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AARD,8CAQC;AAOD,MAAM,mBAAmB,GAAG,UAAU,CAAC;AAEvC,SAAgB,uBAAuB,CAAC,EACtC,IAAI,EACJ,YAAY,GACM;IAClB,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QACpC,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,gBAAgB,GAAG,IAAI,IAAI,mBAAmB,CAAC;IAErD,OAAO,IAAA,0BAAkB,EAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAC1D,mBAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAC/C,CAAC;AACJ,CAAC;AAZD,0DAYC;AAEM,KAAK,UAAU,WAAW,CAAC,EAChC,IAAI,EACJ,YAAY,GACM;IAClB,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,gBAAgB,GAAG,IAAI,IAAI,mBAAmB,CAAC;IAErD,kEAAkE;IAClE,MAAM,YAAY,GAAG,MAAM,IAAA,uBAAe,EAAC;QACzC,YAAY;QACZ,QAAQ,EAAE,gBAAgB;KAC3B,CAAC,CAAC;IAEH,4EAA4E;IAC5E,qEAAqE;IACrE,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,YAAY,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,iBAAiB,gBAAgB,oDAAoD,IAAA,0BAAkB,EACrG,YAAY,CACb,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CACjB,CAAC;IACJ,CAAC;IAED,MAAM,oBAAoB,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACtE,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,EAAE,CAAC;QACjC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,WAAW,GAAG,iBAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACpD,MAAM,mBAAmB,GAAG,mBAAmB,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACtE,IAAI,mBAAmB,CAAC,KAAK,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACb,iDAAiD,mBAAmB,CAAC,KAAK,CAAC,OAAO,EAAE,EACpF,EAAC,KAAK,EAAE,mBAAmB,EAAC,CAC7B,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC9D,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAEjC,OAAO,QAAQ,CAAC;AAClB,CAAC;AA/CD,kCA+CC"}
@@ -1 +1 @@
1
- {"version":3,"file":"validationSchemas.d.ts","sourceRoot":"","sources":["../src/validationSchemas.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,GAAG,MAAM,OAAO,CAAC;AAGxB,eAAO,MAAM,cAAc,0BAKE,CAAC;AAe9B,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AACzD,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AAEzD,eAAO,MAAM,iBAAiB,6BAqB1B,CAAC;AAIL,eAAO,MAAM,SAAS,6BAmBpB,CAAC;AAEH,eAAO,MAAM,cAAc,0BASxB,CAAC;AAaJ,eAAO,MAAM,mBAAmB,6BAO7B,CAAC;AAeJ,eAAO,MAAM,qBAAqB,wBAK9B,CAAC;AAEL,eAAO,MAAM,2BAA2B;;;CASvC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,uBAAuB,qCAgBxB,CAAC;AAEb,eAAO,MAAM,iCAAiC,sIACuF,CAAC;AAEtI,eAAO,MAAM,2BAA2B,uBAQpC,CAAC"}
1
+ {"version":3,"file":"validationSchemas.d.ts","sourceRoot":"","sources":["../src/validationSchemas.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,GAAG,MAAM,OAAO,CAAC;AAGxB,eAAO,MAAM,cAAc,0BAKE,CAAC;AAe9B,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AACzD,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AAEzD,eAAO,MAAM,iBAAiB,6BAqB1B,CAAC;AAIL,eAAO,MAAM,SAAS,6BAmBpB,CAAC;AAEH,eAAO,MAAM,cAAc,0BASxB,CAAC;AAaJ,eAAO,MAAM,mBAAmB,6BAO7B,CAAC;AAiBJ,eAAO,MAAM,qBAAqB,wBAK9B,CAAC;AAEL,eAAO,MAAM,2BAA2B;;;CASvC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,uBAAuB,qCAgBxB,CAAC;AAEb,eAAO,MAAM,iCAAiC,sIACuF,CAAC;AAEtI,eAAO,MAAM,2BAA2B,uBAQpC,CAAC"}
@@ -86,7 +86,10 @@ exports.RouteBasePathSchema = Joi_1.default
86
86
  // /!\ do not add trailing slash here
87
87
  (0, utils_common_1.addLeadingSlash)(value));
88
88
  const FrontMatterTagSchema = JoiFrontMatter_1.JoiFrontMatter.alternatives()
89
- .try(JoiFrontMatter_1.JoiFrontMatter.string().required(), JoiFrontMatter_1.JoiFrontMatter.object({
89
+ .try(JoiFrontMatter_1.JoiFrontMatter.string().required(),
90
+ // TODO Docusaurus v4 remove this legacy front matter tag object form
91
+ // users should use tags.yml instead
92
+ JoiFrontMatter_1.JoiFrontMatter.object({
90
93
  label: JoiFrontMatter_1.JoiFrontMatter.string().required(),
91
94
  permalink: JoiFrontMatter_1.JoiFrontMatter.string().required(),
92
95
  }).required())
@@ -1 +1 @@
1
- {"version":3,"file":"validationSchemas.js","sourceRoot":"","sources":["../src/validationSchemas.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validationSchemas.js","sourceRoot":"","sources":["../src/validationSchemas.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@docusaurus/utils-validation",
3
- "version": "0.0.0-5961",
3
+ "version": "0.0.0-5963",
4
4
  "description": "Node validation utility functions for Docusaurus packages.",
5
5
  "main": "./lib/index.js",
6
6
  "types": "./lib/index.d.ts",
@@ -18,15 +18,20 @@
18
18
  },
19
19
  "license": "MIT",
20
20
  "dependencies": {
21
- "@docusaurus/logger": "0.0.0-5961",
22
- "@docusaurus/utils": "0.0.0-5961",
23
- "@docusaurus/utils-common": "0.0.0-5961",
21
+ "@docusaurus/logger": "0.0.0-5963",
22
+ "@docusaurus/utils": "0.0.0-5963",
23
+ "@docusaurus/utils-common": "0.0.0-5963",
24
+ "fs-extra": "^11.2.0",
24
25
  "joi": "^17.9.2",
25
26
  "js-yaml": "^4.1.0",
27
+ "lodash": "^4.17.21",
26
28
  "tslib": "^2.6.0"
27
29
  },
30
+ "devDependencies": {
31
+ "tmp-promise": "^3.0.3"
32
+ },
28
33
  "engines": {
29
34
  "node": ">=18.0"
30
35
  },
31
- "gitHead": "ae17c4245467ae9c0c218dc375d4d059410f8622"
36
+ "gitHead": "e9090dc8a38a21043b0849887aa7d54d04c4af9f"
32
37
  }
package/src/index.ts CHANGED
@@ -29,3 +29,4 @@ export {
29
29
  FrontMatterLastUpdateErrorMessage,
30
30
  FrontMatterLastUpdateSchema,
31
31
  } from './validationSchemas';
32
+ export {getTagsFilePathsToWatch, getTagsFile} from './tagsFile';
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ import fs from 'fs-extra';
9
+ import path from 'node:path';
10
+ import _ from 'lodash';
11
+ import Joi from 'joi';
12
+ import YAML from 'js-yaml';
13
+ import {getContentPathList, getDataFilePath} from '@docusaurus/utils';
14
+ import type {
15
+ ContentPaths,
16
+ TagsFile,
17
+ TagsFileInput,
18
+ TagsPluginOptions,
19
+ } from '@docusaurus/utils';
20
+
21
+ const TagsFileInputSchema = Joi.object<TagsFileInput>().pattern(
22
+ Joi.string(),
23
+ Joi.object({
24
+ label: Joi.string(),
25
+ description: Joi.string(),
26
+ permalink: Joi.string(),
27
+ }).allow(null),
28
+ );
29
+
30
+ export function ensureUniquePermalinks(tags: TagsFile): void {
31
+ const permalinks = new Set<string>();
32
+ const duplicates = new Set<string>();
33
+
34
+ for (const [, tag] of Object.entries(tags)) {
35
+ const {permalink} = tag;
36
+ if (permalinks.has(permalink)) {
37
+ duplicates.add(permalink);
38
+ } else {
39
+ permalinks.add(permalink);
40
+ }
41
+ }
42
+
43
+ if (duplicates.size > 0) {
44
+ const duplicateList = Array.from(duplicates)
45
+ .map((permalink) => ` - ${permalink}`)
46
+ .join('\n');
47
+ throw new Error(
48
+ `Duplicate permalinks found in tags file:\n${duplicateList}`,
49
+ );
50
+ }
51
+ }
52
+
53
+ export function normalizeTagsFile(data: TagsFileInput): TagsFile {
54
+ return _.mapValues(data, (tag, key) => {
55
+ return {
56
+ label: tag?.label || _.capitalize(key),
57
+ description: tag?.description,
58
+ permalink: tag?.permalink || `/${_.kebabCase(key)}`,
59
+ };
60
+ });
61
+ }
62
+
63
+ type GetTagsFileParams = {
64
+ tags: TagsPluginOptions['tags'];
65
+ contentPaths: ContentPaths;
66
+ };
67
+
68
+ const DefaultTagsFileName = 'tags.yml';
69
+
70
+ export function getTagsFilePathsToWatch({
71
+ tags,
72
+ contentPaths,
73
+ }: GetTagsFileParams): string[] {
74
+ if (tags === false || tags === null) {
75
+ return [];
76
+ }
77
+ const relativeFilePath = tags ?? DefaultTagsFileName;
78
+
79
+ return getContentPathList(contentPaths).map((contentPath) =>
80
+ path.posix.join(contentPath, relativeFilePath),
81
+ );
82
+ }
83
+
84
+ export async function getTagsFile({
85
+ tags,
86
+ contentPaths,
87
+ }: GetTagsFileParams): Promise<TagsFile | null> {
88
+ if (tags === false || tags === null) {
89
+ return null;
90
+ }
91
+
92
+ const relativeFilePath = tags ?? DefaultTagsFileName;
93
+
94
+ // if returned path is defined, the file exists (localized or not)
95
+ const yamlFilePath = await getDataFilePath({
96
+ contentPaths,
97
+ filePath: relativeFilePath,
98
+ });
99
+
100
+ // If the tags option is undefined, don't throw when the file does not exist
101
+ // Retro-compatible behavior: existing sites do not yet have tags.yml
102
+ if (tags === undefined && !yamlFilePath) {
103
+ return null;
104
+ }
105
+ if (!yamlFilePath) {
106
+ throw new Error(
107
+ `No tags file '${relativeFilePath}' could be found in any of those directories:\n- ${getContentPathList(
108
+ contentPaths,
109
+ ).join('\n- ')}`,
110
+ );
111
+ }
112
+
113
+ const tagDefinitionContent = await fs.readFile(yamlFilePath, 'utf-8');
114
+ if (!tagDefinitionContent.trim()) {
115
+ return {};
116
+ }
117
+
118
+ const yamlContent = YAML.load(tagDefinitionContent);
119
+ const tagsFileInputResult = TagsFileInputSchema.validate(yamlContent);
120
+ if (tagsFileInputResult.error) {
121
+ throw new Error(
122
+ `There was an error extracting tags from file: ${tagsFileInputResult.error.message}`,
123
+ {cause: tagsFileInputResult},
124
+ );
125
+ }
126
+
127
+ const tagsFile = normalizeTagsFile(tagsFileInputResult.value);
128
+ ensureUniquePermalinks(tagsFile);
129
+
130
+ return tagsFile;
131
+ }
@@ -5,7 +5,11 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- import {isValidPathname, DEFAULT_PLUGIN_ID, type Tag} from '@docusaurus/utils';
8
+ import {
9
+ isValidPathname,
10
+ DEFAULT_PLUGIN_ID,
11
+ type FrontMatterTag,
12
+ } from '@docusaurus/utils';
9
13
  import {addLeadingSlash} from '@docusaurus/utils-common';
10
14
  import Joi from './Joi';
11
15
  import {JoiFrontMatter} from './JoiFrontMatter';
@@ -113,7 +117,9 @@ export const RouteBasePathSchema = Joi
113
117
  const FrontMatterTagSchema = JoiFrontMatter.alternatives()
114
118
  .try(
115
119
  JoiFrontMatter.string().required(),
116
- JoiFrontMatter.object<Tag>({
120
+ // TODO Docusaurus v4 remove this legacy front matter tag object form
121
+ // users should use tags.yml instead
122
+ JoiFrontMatter.object<FrontMatterTag>({
117
123
  label: JoiFrontMatter.string().required(),
118
124
  permalink: JoiFrontMatter.string().required(),
119
125
  }).required(),