diff --git a/packages/remark-lint/src/api.mjs b/packages/remark-lint/src/api.mjs index be572e689a57c..c4274717aa2bf 100644 --- a/packages/remark-lint/src/api.mjs +++ b/packages/remark-lint/src/api.mjs @@ -15,6 +15,7 @@ import yamlComments from './rules/yaml/index.mjs'; /** * @typedef {Object} Options * @property {Array} releasedVersions The released versions, for validating the YAML + * @property {Record} typeMap The type map */ /** diff --git a/packages/remark-lint/src/rules/__tests__/invalid-type-reference.test.mjs b/packages/remark-lint/src/rules/__tests__/invalid-type-reference.test.mjs index e0900a220097c..714c31f14222b 100644 --- a/packages/remark-lint/src/rules/__tests__/invalid-type-reference.test.mjs +++ b/packages/remark-lint/src/rules/__tests__/invalid-type-reference.test.mjs @@ -31,10 +31,22 @@ const testCases = [ input: 'This is {invalid}.', expected: ['Invalid type reference: {invalid}'], }, + { + name: 'custom references', + input: 'This is a {custom} type.', + expected: [], + options: { + typeMap: { + custom: '...', + }, + }, + }, ]; describe('invalid-type-reference', () => { - for (const { name, input, expected } of testCases) { - it(name, () => testRule(invalidTypeReference, input, expected)); + for (const { name, input, expected, options } of testCases) { + it(name, () => + testRule(invalidTypeReference, input, expected, {}, options) + ); } }); diff --git a/packages/remark-lint/src/rules/__tests__/utils.mjs b/packages/remark-lint/src/rules/__tests__/utils.mjs index ab0e373bac801..e3245368b5173 100644 --- a/packages/remark-lint/src/rules/__tests__/utils.mjs +++ b/packages/remark-lint/src/rules/__tests__/utils.mjs @@ -7,7 +7,13 @@ import { unified } from 'unified'; /** * Tests a markdown rule against a markdown string */ -export const testRule = (rule, markdown, expected, vfileOptions = {}) => { +export const testRule = ( + rule, + markdown, + expected, + vfileOptions = {}, + ruleOptions = {} +) => { // Parse the markdown once const tree = unified().use(remarkParse).parse(markdown); @@ -19,7 +25,7 @@ export const testRule = (rule, markdown, expected, vfileOptions = {}) => { }; // Execute the rule - rule()(tree, vfile, () => {}); + rule(ruleOptions)(tree, vfile, () => {}); // Assert that the expected messages were reported assert.deepEqual( diff --git a/packages/remark-lint/src/rules/invalid-type-reference.mjs b/packages/remark-lint/src/rules/invalid-type-reference.mjs index 097b4a7b4e66a..a4dc36666f75a 100644 --- a/packages/remark-lint/src/rules/invalid-type-reference.mjs +++ b/packages/remark-lint/src/rules/invalid-type-reference.mjs @@ -8,9 +8,9 @@ const REPLACE_RE = /\s*\|\s*/g; /** * Ensures that all type references are valid - * @type {import('unified-lint-rule').Rule} + * @type {import('unified-lint-rule').Rule<, import('../api.mjs').Options>} */ -const invalidTypeReference = (tree, vfile) => { +const invalidTypeReference = (tree, vfile, { typeMap = {} }) => { visit(tree, createQueries.UNIST.isTextWithType, node => { const types = node.value.match(createQueries.QUERIES.normalizeTypes); @@ -36,7 +36,7 @@ const invalidTypeReference = (tree, vfile) => { node.value = node.value.replace(type, normalized); } - if (transformTypeToReferenceLink(type) === type) { + if (transformTypeToReferenceLink(type, typeMap) === type) { vfile.message(`Invalid type reference: ${type}`, node); } }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 030cc9f90325c..a63808bd069f6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -173,7 +173,7 @@ importers: version: 0.4.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) postcss-calc: specifier: ~10.1.1 - version: 10.1.1(postcss@8.5.3) + version: 10.1.1(postcss@8.5.6) react: specifier: 'catalog:' version: 19.2.0 @@ -261,13 +261,13 @@ importers: version: 5.2.0(eslint@9.36.0(jiti@2.6.1)) global-jsdom: specifier: ^27.0.0 - version: 27.0.0(jsdom@27.0.0(postcss@8.5.3)) + version: 27.0.0(jsdom@27.0.0(postcss@8.5.6)) handlebars: specifier: 4.7.8 version: 4.7.8 jsdom: specifier: ^27.0.0 - version: 27.0.0(postcss@8.5.3) + version: 27.0.0(postcss@8.5.6) mdast-util-from-markdown: specifier: ^2.0.2 version: 2.0.2 @@ -346,7 +346,7 @@ importers: dependencies: '@nodejs/doc-kit': specifier: github:nodejs/doc-kit - version: https://codeload.github.com/nodejs/doc-kit/tar.gz/f132fcb2f50adc32ce24e8517dcf616b757153df(@types/react@19.2.0)(eslint@9.36.0(jiti@2.6.1))(postcss@8.5.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) + version: https://codeload.github.com/nodejs/doc-kit/tar.gz/8375d8c700711dc567e7ef9303221fc3aed2fb66(@types/react@19.2.0)(eslint@9.36.0(jiti@2.6.1))(postcss@8.5.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) remark-gfm: specifier: ^4.0.1 version: 4.0.1 @@ -2012,8 +2012,8 @@ packages: resolution: {integrity: sha512-csY4qcR7jUwiZmkreNTJhcypQfts2aY2CK+a+rXgXUImZiZiySh0FvwHjRnlqWKvg+y6ae9lHFzDRjBTmqlTIQ==} engines: {node: '>=16.0.0'} - '@nodejs/doc-kit@https://codeload.github.com/nodejs/doc-kit/tar.gz/f132fcb2f50adc32ce24e8517dcf616b757153df': - resolution: {tarball: https://codeload.github.com/nodejs/doc-kit/tar.gz/f132fcb2f50adc32ce24e8517dcf616b757153df} + '@nodejs/doc-kit@https://codeload.github.com/nodejs/doc-kit/tar.gz/8375d8c700711dc567e7ef9303221fc3aed2fb66': + resolution: {tarball: https://codeload.github.com/nodejs/doc-kit/tar.gz/8375d8c700711dc567e7ef9303221fc3aed2fb66} version: 0.0.0 hasBin: true @@ -9813,6 +9813,10 @@ snapshots: dependencies: postcss: 8.5.3 + '@csstools/css-syntax-patches-for-csstree@1.0.14(postcss@8.5.6)': + dependencies: + postcss: 8.5.6 + '@csstools/css-tokenizer@3.0.4': {} '@csstools/media-query-list-parser@4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': @@ -10584,7 +10588,7 @@ snapshots: dependencies: gzip-size: 6.0.0 - '@nodejs/doc-kit@https://codeload.github.com/nodejs/doc-kit/tar.gz/f132fcb2f50adc32ce24e8517dcf616b757153df(@types/react@19.2.0)(eslint@9.36.0(jiti@2.6.1))(postcss@8.5.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)': + '@nodejs/doc-kit@https://codeload.github.com/nodejs/doc-kit/tar.gz/8375d8c700711dc567e7ef9303221fc3aed2fb66(@types/react@19.2.0)(eslint@9.36.0(jiti@2.6.1))(postcss@8.5.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)': dependencies: '@actions/core': 1.11.1 '@clack/prompts': 0.11.0 @@ -13450,6 +13454,14 @@ snapshots: transitivePeerDependencies: - postcss + cssstyle@5.3.1(postcss@8.5.6): + dependencies: + '@asamuzakjp/css-color': 4.0.5 + '@csstools/css-syntax-patches-for-csstree': 1.0.14(postcss@8.5.6) + css-tree: 3.1.0 + transitivePeerDependencies: + - postcss + csstype@3.1.3: {} damerau-levenshtein@1.0.8: {} @@ -14628,6 +14640,10 @@ snapshots: dependencies: jsdom: 27.0.0(postcss@8.5.3) + global-jsdom@27.0.0(jsdom@27.0.0(postcss@8.5.6)): + dependencies: + jsdom: 27.0.0(postcss@8.5.6) + global-modules@2.0.0: dependencies: global-prefix: 3.0.0 @@ -15233,6 +15249,34 @@ snapshots: - supports-color - utf-8-validate + jsdom@27.0.0(postcss@8.5.6): + dependencies: + '@asamuzakjp/dom-selector': 6.6.1 + cssstyle: 5.3.1(postcss@8.5.6) + data-urls: 6.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + parse5: 7.3.0 + rrweb-cssom: 0.8.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 6.0.0 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 8.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 15.1.0 + ws: 8.18.3 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - postcss + - supports-color + - utf-8-validate + jsesc@3.1.0: {} json-buffer@3.0.1: {}