From 63fc86e968dcf0aa3acd5fb88ad13032807ef1a0 Mon Sep 17 00:00:00 2001 From: Claudio Wunder Date: Thu, 4 Dec 2025 03:58:11 +0100 Subject: [PATCH 1/4] chore: streamline with legacy --- src/generators/legacy-json-all/index.mjs | 10 ++- .../legacy-json/utils/buildSection.mjs | 61 ++++++++++++++----- 2 files changed, 53 insertions(+), 18 deletions(-) diff --git a/src/generators/legacy-json-all/index.mjs b/src/generators/legacy-json-all/index.mjs index b2e9cdf8..217e6d36 100644 --- a/src/generators/legacy-json-all/index.mjs +++ b/src/generators/legacy-json-all/index.mjs @@ -53,8 +53,14 @@ export default { input.forEach(section => { // Copy the relevant properties from each section into our output propertiesToCopy.forEach(property => { - if (section[property]) { - generatedValue[property].push(...section[property]); + if (Array.isArray(section[property])) { + let toPush = section[property]; + + if (section.source) { + toPush = toPush.map(item => ({ ...item, source: section.source })); + } + + generatedValue[property].push(...toPush); } }); }); diff --git a/src/generators/legacy-json/utils/buildSection.mjs b/src/generators/legacy-json/utils/buildSection.mjs index 4f647961..061aec49 100644 --- a/src/generators/legacy-json/utils/buildSection.mjs +++ b/src/generators/legacy-json/utils/buildSection.mjs @@ -36,7 +36,7 @@ export const createSectionBuilder = () => { /** * Creates metadata from a hierarchized entry. * @param {import('../types.d.ts').HierarchizedEntry} entry - The entry to create metadata from. - * @returns {import('../types.d.ts').Meta} The created metadata. + * @returns {import('../types.d.ts').Meta | undefined} The created metadata, or undefined if all fields are empty. */ const createMeta = ({ added_in = [], @@ -44,13 +44,33 @@ export const createSectionBuilder = () => { deprecated_in = [], removed_in = [], changes, - }) => ({ - changes, - added: enforceArray(added_in), - napiVersion: enforceArray(n_api_version), - deprecated: enforceArray(deprecated_in), - removed: enforceArray(removed_in), - }); + }) => { + const meta = { changes }; + + if (enforceArray(added_in).length) { + meta.added = enforceArray(added_in); + } + + if (enforceArray(n_api_version).length) { + meta.napiVersion = enforceArray(n_api_version); + } + + if (enforceArray(deprecated_in).length) { + meta.deprecated = enforceArray(deprecated_in); + } + + if (enforceArray(removed_in).length) { + meta.removed = enforceArray(removed_in); + } + + // Check if there are any non-empty fields in the meta object + const atLeastOneNonEmptyField = Object.values(meta).some( + value => value.length > 0 + ); + + // Return undefined if the meta object is completely empty + return atLeastOneNonEmptyField ? meta : undefined; + }; /** * Creates a section from an entry and its heading. @@ -58,13 +78,22 @@ export const createSectionBuilder = () => { * @param {HeadingMetadataParent} head - The head node of the entry. * @returns {import('../types.d.ts').Section} The created section. */ - const createSection = (entry, head) => ({ - textRaw: transformNodesToString(head.children), - name: head.data.name, - type: head.data.type, - meta: createMeta(entry), - introduced_in: entry.introduced_in, - }); + const createSection = (entry, head) => { + const section = { + textRaw: transformNodesToString(head.children), + name: head.data.name, + type: head.data.type, + introduced_in: entry.introduced_in, + }; + + const meta = createMeta(entry); + + if (meta !== undefined) { + section.meta = meta; + } + + return section; + }; /** * Parses stability metadata and adds it to the section. @@ -76,7 +105,7 @@ export const createSectionBuilder = () => { const stabilityInfo = stability.children.map(node => node.data)?.[0]; if (stabilityInfo) { - section.stability = stabilityInfo.index; + section.stability = Number(stabilityInfo.index); section.stabilityText = stabilityInfo.description; nodes.shift(); // Remove stability node from processing } From 768bfdc7cc61faaeaf2edf3f2b3f424314d68653 Mon Sep 17 00:00:00 2001 From: Claudio Wunder Date: Thu, 4 Dec 2025 12:43:34 +0100 Subject: [PATCH 2/4] chore: code review --- npm-shrinkwrap.json | 56 +++++++++---------- src/generators/legacy-json/types.d.ts | 2 +- .../legacy-json/utils/buildSection.mjs | 24 +++++--- 3 files changed, 45 insertions(+), 37 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 9a43fad5..78631fb3 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -559,6 +559,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "license": "MIT", "engines": { "node": "20 || >=22" } @@ -567,6 +568,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "license": "MIT", "dependencies": { "@isaacs/balanced-match": "^4.0.1" }, @@ -918,6 +920,7 @@ "resolved": "https://registry.npmjs.org/@orama/core/-/core-0.0.10.tgz", "integrity": "sha512-rZ4AHeHoFTxOXMhM0An2coO3OfR+FpL0ejXc1PPrNsGB4p6VNlky7FAGeuqOvS5gUYB5ywJsmDzCxeflPtgk4w==", "license": "AGPL-3.0", + "peer": true, "dependencies": { "@orama/cuid2": "2.2.3", "dedent": "1.5.3" @@ -928,6 +931,7 @@ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", "license": "MIT", + "peer": true, "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, @@ -957,7 +961,6 @@ "resolved": "https://registry.npmjs.org/@orama/orama/-/orama-3.1.16.tgz", "integrity": "sha512-scSmQBD8eANlMUOglxHrN1JdSW8tDghsPuS83otqealBiIeMukCQMOf/wc0JJjDXomqwNdEQFLXLGHrU6PGxuA==", "license": "Apache-2.0", - "peer": true, "engines": { "node": ">= 20.0.0" } @@ -966,7 +969,8 @@ "version": "0.0.5", "resolved": "https://registry.npmjs.org/@orama/oramacore-events-parser/-/oramacore-events-parser-0.0.5.tgz", "integrity": "sha512-yAuSwog+HQBAXgZ60TNKEwu04y81/09mpbYBCmz1RCxnr4ObNY2JnPZI7HmALbjAhLJ8t5p+wc2JHRK93ubO4w==", - "license": "AGPL-3.0" + "license": "AGPL-3.0", + "peer": true }, "node_modules/@orama/react-components": { "version": "0.8.1", @@ -1188,7 +1192,6 @@ "resolved": "https://registry.npmjs.org/@oramacloud/client/-/client-2.1.4.tgz", "integrity": "sha512-uNPFs4wq/iOPbggCwTkVNbIr64Vfd7ZS/h+cricXVnzXWocjDTfJ3wLL4lr0qiSu41g8z+eCAGBqJ30RO2O4AA==", "license": "ISC", - "peer": true, "dependencies": { "@orama/cuid2": "^2.2.3", "@orama/orama": "^3.0.0", @@ -3639,7 +3642,6 @@ "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -4179,7 +4181,8 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/debug": { "version": "4.4.3", @@ -4459,7 +4462,6 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -5028,13 +5030,14 @@ "license": "ISC" }, "node_modules/glob": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", - "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", + "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", + "license": "BlueOak-1.0.0", "dependencies": { "foreground-child": "^3.3.1", "jackspeak": "^4.1.1", - "minimatch": "^10.0.3", + "minimatch": "^10.1.1", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" @@ -5062,9 +5065,10 @@ } }, "node_modules/glob/node_modules/minimatch": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", - "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -5682,9 +5686,9 @@ } }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -6322,7 +6326,6 @@ "resolved": "https://registry.npmjs.org/marked/-/marked-13.0.3.tgz", "integrity": "sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA==", "license": "MIT", - "peer": true, "bin": { "marked": "bin/marked.js" }, @@ -6573,9 +6576,9 @@ "license": "MIT" }, "node_modules/mdast-util-to-hast": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", - "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -7591,7 +7594,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -7641,7 +7643,6 @@ "resolved": "https://registry.npmjs.org/preact/-/preact-10.27.2.tgz", "integrity": "sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==", "license": "MIT", - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -8209,7 +8210,8 @@ "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/semver": { "version": "7.7.3", @@ -8674,9 +8676,9 @@ } }, "node_modules/test-exclude/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "dev": true, "license": "ISC", "dependencies": { @@ -9122,7 +9124,6 @@ "integrity": "sha512-VUyWiTNQD7itdiMuJy+EuLEErLj3uwX/EpHQF8EOf33Dq3Ju6VW1GXm+swk6+1h7a49uv9fKZ+dft9jU7esdLA==", "dev": true, "hasInstallScript": true, - "peer": true, "dependencies": { "napi-postinstall": "^0.2.4" }, @@ -9528,7 +9529,6 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.3.tgz", "integrity": "sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/src/generators/legacy-json/types.d.ts b/src/generators/legacy-json/types.d.ts index 78f657b1..3174fc7a 100644 --- a/src/generators/legacy-json/types.d.ts +++ b/src/generators/legacy-json/types.d.ts @@ -78,7 +78,7 @@ export interface SectionBase { /** * Stability index of the section. */ - stability?: string; + stability?: number; /** * Descriptive text related to the stability of the section (E.G. "Experimental"). diff --git a/src/generators/legacy-json/utils/buildSection.mjs b/src/generators/legacy-json/utils/buildSection.mjs index 061aec49..d06c8521 100644 --- a/src/generators/legacy-json/utils/buildSection.mjs +++ b/src/generators/legacy-json/utils/buildSection.mjs @@ -47,20 +47,28 @@ export const createSectionBuilder = () => { }) => { const meta = { changes }; - if (enforceArray(added_in).length) { - meta.added = enforceArray(added_in); + const aded_in_array = enforceArray(added_in); + + if (aded_in_array.length) { + meta.added = aded_in_array; } - if (enforceArray(n_api_version).length) { - meta.napiVersion = enforceArray(n_api_version); + const n_api_version_array = enforceArray(n_api_version); + + if (n_api_version_array.length) { + meta.napiVersion = n_api_version_array; } - if (enforceArray(deprecated_in).length) { - meta.deprecated = enforceArray(deprecated_in); + const deprecated_in_array = enforceArray(deprecated_in); + + if (deprecated_in_array.length) { + meta.deprecated = deprecated_in_array; } - if (enforceArray(removed_in).length) { - meta.removed = enforceArray(removed_in); + const removed_in_array = enforceArray(removed_in); + + if (removed_in_array.length) { + meta.removed = removed_in_array; } // Check if there are any non-empty fields in the meta object From f909af7b6aafb13c2c2790025a37b821dc19be3d Mon Sep 17 00:00:00 2001 From: Claudio Wunder Date: Thu, 4 Dec 2025 14:49:16 +0100 Subject: [PATCH 3/4] chore: code review --- .../legacy-json/utils/buildSection.mjs | 24 +++++++------------ 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/src/generators/legacy-json/utils/buildSection.mjs b/src/generators/legacy-json/utils/buildSection.mjs index d06c8521..6c7df0d6 100644 --- a/src/generators/legacy-json/utils/buildSection.mjs +++ b/src/generators/legacy-json/utils/buildSection.mjs @@ -47,28 +47,20 @@ export const createSectionBuilder = () => { }) => { const meta = { changes }; - const aded_in_array = enforceArray(added_in); - - if (aded_in_array.length) { - meta.added = aded_in_array; + if (added_in?.length) { + meta.added = enforceArray(added_in); } - const n_api_version_array = enforceArray(n_api_version); - - if (n_api_version_array.length) { - meta.napiVersion = n_api_version_array; + if (n_api_version?.length) { + meta.napiVersion = enforceArray(n_api_version); } - const deprecated_in_array = enforceArray(deprecated_in); - - if (deprecated_in_array.length) { - meta.deprecated = deprecated_in_array; + if (deprecated_in?.length) { + meta.deprecated = enforceArray(deprecated_in); } - const removed_in_array = enforceArray(removed_in); - - if (removed_in_array.length) { - meta.removed = removed_in_array; + if (removed_in?.length) { + meta.removed = enforceArray(removed_in); } // Check if there are any non-empty fields in the meta object From e0edcc0af81e207a73a66cddab0a951976a9e492 Mon Sep 17 00:00:00 2001 From: Claudio Wunder Date: Thu, 4 Dec 2025 15:08:24 +0100 Subject: [PATCH 4/4] chore: code review --- src/generators/legacy-json-all/index.mjs | 12 ++++++------ src/generators/legacy-json/utils/buildSection.mjs | 5 ++--- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/generators/legacy-json-all/index.mjs b/src/generators/legacy-json-all/index.mjs index 217e6d36..5fb8c061 100644 --- a/src/generators/legacy-json-all/index.mjs +++ b/src/generators/legacy-json-all/index.mjs @@ -53,14 +53,14 @@ export default { input.forEach(section => { // Copy the relevant properties from each section into our output propertiesToCopy.forEach(property => { - if (Array.isArray(section[property])) { - let toPush = section[property]; + const items = section[property]; - if (section.source) { - toPush = toPush.map(item => ({ ...item, source: section.source })); - } + if (Array.isArray(items)) { + const enrichedItems = section.source + ? items.map(item => ({ ...item, source: section.source })) + : items; - generatedValue[property].push(...toPush); + generatedValue[property].push(...enrichedItems); } }); }); diff --git a/src/generators/legacy-json/utils/buildSection.mjs b/src/generators/legacy-json/utils/buildSection.mjs index 6c7df0d6..247a7a5f 100644 --- a/src/generators/legacy-json/utils/buildSection.mjs +++ b/src/generators/legacy-json/utils/buildSection.mjs @@ -64,9 +64,8 @@ export const createSectionBuilder = () => { } // Check if there are any non-empty fields in the meta object - const atLeastOneNonEmptyField = Object.values(meta).some( - value => value.length > 0 - ); + const atLeastOneNonEmptyField = + changes?.length || Object.keys(meta).length > 1; // Return undefined if the meta object is completely empty return atLeastOneNonEmptyField ? meta : undefined;