From 03f4fa16a4c9235e0b6a8744ad94e7305672f659 Mon Sep 17 00:00:00 2001 From: dxnnystyles Date: Mon, 26 Oct 2026 09:24:30 -0700 Subject: [PATCH] fix(core): preserve shared metadata in json-simple Signed-off-by: dxnnystyles --- .changeset/flat-bushes-learn.md | 5 +++ .../json-simple/__tests__/generate.test.mjs | 45 +++++++++++++++++++ .../src/generators/json-simple/generate.mjs | 18 +++++--- 3 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 .changeset/flat-bushes-learn.md create mode 100644 packages/core/src/generators/json-simple/__tests__/generate.test.mjs diff --git a/.changeset/flat-bushes-learn.md b/.changeset/flat-bushes-learn.md new file mode 100644 index 00000000..a43d49ee --- /dev/null +++ b/.changeset/flat-bushes-learn.md @@ -0,0 +1,5 @@ +--- +'@doc-kit/core': patch +--- + +Keep json-simple output generation from mutating shared metadata entries. diff --git a/packages/core/src/generators/json-simple/__tests__/generate.test.mjs b/packages/core/src/generators/json-simple/__tests__/generate.test.mjs new file mode 100644 index 00000000..7009bba6 --- /dev/null +++ b/packages/core/src/generators/json-simple/__tests__/generate.test.mjs @@ -0,0 +1,45 @@ +import assert from 'node:assert/strict'; +import { describe, it } from 'node:test'; + +import { setConfig } from '#utils/configuration/index.mjs'; + +import { generate } from '../generate.mjs'; + +const config = await setConfig({ target: ['json-simple'] }); +config['json-simple'].output = undefined; + +describe('json-simple generate', () => { + it('does not mutate input while removing headings and stability nodes', async () => { + const heading = { + type: 'heading', + depth: 1, + children: [{ type: 'text', value: 'fs' }], + }; + const stability = { + type: 'blockquote', + children: [ + { + type: 'paragraph', + children: [{ type: 'text', value: 'Stability: 2 - Stable' }], + }, + ], + }; + const paragraph = { + type: 'paragraph', + children: [{ type: 'text', value: 'The fs module.' }], + }; + const input = [ + { + heading, + content: { type: 'root', children: [heading, stability, paragraph] }, + }, + ]; + const snapshot = structuredClone(input); + + const output = await generate(input); + + assert.deepEqual(input, snapshot); + assert.deepEqual(output[0].content.children, [paragraph]); + assert.notEqual(output[0].content, input[0].content); + }); +}); diff --git a/packages/core/src/generators/json-simple/generate.mjs b/packages/core/src/generators/json-simple/generate.mjs index dac05ee0..5097b639 100644 --- a/packages/core/src/generators/json-simple/generate.mjs +++ b/packages/core/src/generators/json-simple/generate.mjs @@ -16,13 +16,21 @@ import { UNIST } from '#utils/queries/index.mjs'; export async function generate(input) { const config = getConfig('json-simple'); - input.forEach(node => - remove(node.content, [UNIST.isStabilityNode, UNIST.isHeading]) - ); + const output = input.map(entry => { + const copy = { ...entry, content: structuredClone(entry.content) }; + + remove(copy.content, [UNIST.isStabilityNode, UNIST.isHeading]); + + return copy; + }); if (config.output) { - await writeJSON(join(config.output, 'api-docs.json'), input, config.minify); + await writeJSON( + join(config.output, 'api-docs.json'), + output, + config.minify + ); } - return input; + return output; }