docgen-tool 6.3.1 → 6.4.0

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.
@@ -13,7 +13,7 @@ declare const __BASE_PATH__: string;
13
13
  (and renderers.tsx for more details)
14
14
  */
15
15
 
16
- export const customRenderers = ({ options }) => ({
16
+ export const customRenderers = () => ({
17
17
  div: (payload) => {
18
18
  const { children, style, element } = payload;
19
19
  const classNames = element.classList.toString();
@@ -27,14 +27,24 @@ export const customRenderers = ({ options }) => ({
27
27
  return <View style={style}>{children}</View>;
28
28
  },
29
29
  pre: (payload) => {
30
- const { children, element, style } = payload;
31
- //strip and handle code blocks
32
- const $ = cheerio.load(element.content.join());
30
+ const { element, style } = payload;
31
+ const html = element.innerHTML ?? '';
32
+ const $ = cheerio.load(html);
33
33
  const code = $('code');
34
- if (code.length) {
35
- return <Text style={style}>{code.text().trim()}</Text>;
36
- }
37
- return <Text style={style}>{children}</Text>;
34
+ const text = code.length ? code.text() : $.text();
35
+
36
+ // Preserve indentation and multiple spaces with Non-Breaking Spaces
37
+ // to ensure react-pdf doesn't collapse them
38
+ const formattedText = text
39
+ // Trim spaces at the start
40
+ .replace(/^ +/gm, (match) => '\u00A0'.repeat(match.length))
41
+ // preserve internal indentation
42
+ .replace(/ {2,}/g, (match) => '\u00A0'.repeat(match.length))
43
+ // consistent tab width
44
+ .replace(/\t/g, '\u00A0\u00A0')
45
+ .trimEnd();
46
+
47
+ return <Text style={style}>{formattedText}</Text>;
38
48
  },
39
49
  img: (payload) => {
40
50
  const { element, style } = payload;
@@ -3,12 +3,12 @@ import Html from 'react-pdf-html-simple';
3
3
  import { fontSize } from '../../pdf-styles/pdf-styles.ts';
4
4
  import { customRenderers } from './custom-renderers/custom-renderers.tsx';
5
5
 
6
- export const PdfHtmlBlock = ({ page, options, stylesheet }) => {
6
+ export const PdfHtmlBlock = ({ page, stylesheet }) => {
7
7
  return (
8
8
  <Html
9
9
  style={{ fontSize }}
10
10
  stylesheet={stylesheet}
11
- renderers={customRenderers({ options })}
11
+ renderers={customRenderers()}
12
12
  >
13
13
  {page}
14
14
  </Html>
@@ -7,18 +7,14 @@ import {
7
7
  getHtmlStyleSheet,
8
8
  } from '../pdf-styles/pdf-styles.ts';
9
9
 
10
- export const PdfPage = ({ page, parameters, options, styleVariables }) => {
11
- const reactPdfStyles = StyleSheet.create(getPdfStyleSheet(styleVariables));
10
+ export const PdfPage = ({ page, parameters, styleVariables }) => {
11
+ const reactPdfStyles = StyleSheet.create(getPdfStyleSheet());
12
12
  const htmlStylesheet = getHtmlStyleSheet(styleVariables);
13
13
 
14
14
  return (
15
15
  <Page size="A4" style={reactPdfStyles.page}>
16
16
  <View>
17
- <PdfHtmlBlock
18
- page={page}
19
- options={options}
20
- stylesheet={htmlStylesheet}
21
- />
17
+ <PdfHtmlBlock page={page} stylesheet={htmlStylesheet} />
22
18
  </View>
23
19
  <PdfFooter parameters={parameters} />
24
20
  </Page>
@@ -4,7 +4,7 @@ import { getPdfTableStyles } from './pdf-table-styles.ts';
4
4
 
5
5
  export const fontSize = 10;
6
6
 
7
- export const getPdfStyleSheet = (styles: any) => ({
7
+ export const getPdfStyleSheet = () => ({
8
8
  page: {
9
9
  paddingTop: 35,
10
10
  paddingBottom: 65,
@@ -25,15 +25,6 @@ export const getHtmlStyleSheet = (styles: any) => {
25
25
  const pdfAdmonitionsStyles = getPdfAdmonitionsStyles(styles);
26
26
  const pdfTableStyles = getPdfTableStyles(styles);
27
27
 
28
- const styleInfo = {
29
- color: styles.ColorTextInfo,
30
- backgroundColor: styles.ColorBackgroundInfo,
31
- borderLeft: `5px solid ${styles.ColorBorderInfo}`,
32
- padding: styles.SizeMessagePadding,
33
- marginLeft: 0,
34
- marginRight: 0,
35
- };
36
-
37
28
  return {
38
29
  'h1, h2, h3, h4, h5, h6': {
39
30
  fontWeight: 'bold',
@@ -53,7 +53,6 @@ Font.register({
53
53
 
54
54
  export const Pdf = ({ loadedPages, styleVariables }) => {
55
55
  const parameters = __DOCGEN_PARAMETERS__;
56
- const options = {};
57
56
  const allSources = Object.values(__DOCGEN_PAGES__).flatMap((columns) =>
58
57
  columns.flatMap((section) => section.pages.map((p: any) => p.source)),
59
58
  );
@@ -67,7 +66,6 @@ export const Pdf = ({ loadedPages, styleVariables }) => {
67
66
  key={i}
68
67
  page={html}
69
68
  parameters={parameters}
70
- options={options}
71
69
  styleVariables={styleVariables}
72
70
  />
73
71
  );
@@ -1,6 +1,6 @@
1
1
  import { useState, useEffect } from 'react';
2
2
  import * as styles from 'virtual:style-variables.js';
3
- import WorkerURL from './generate-pdf.worker.tsx?worker';
3
+ import * as WorkerModule from './generate-pdf.worker.tsx?worker';
4
4
 
5
5
  export type TGeneratedPdf = {
6
6
  pdfBlob: Blob | null;
@@ -21,7 +21,7 @@ export const useGeneratePdf = () => {
21
21
  return;
22
22
  }
23
23
 
24
- const worker = new WorkerURL();
24
+ const worker = new WorkerModule.default();
25
25
 
26
26
  worker.onmessage = (e) => {
27
27
  if (e.data.type === 'complete') {
@@ -90,17 +90,31 @@
90
90
  },
91
91
  "button": {
92
92
  "border": {
93
- "@": { "value": "2px solid {color.primary.@}" },
94
- "inverted": { "value": "2px solid {color.primary.@}" }
93
+ "@": {
94
+ "value": "2px solid {color.primary.@}"
95
+ },
96
+ "inverted": {
97
+ "value": "2px solid {color.primary.@}"
98
+ }
95
99
  },
96
100
  "background": {
97
- "@": { "value": "{color.primary.@}" },
98
- "hover": { "value": "#0042b4" },
99
- "inverted": { "value": "#fff" }
101
+ "@": {
102
+ "value": "{color.primary.@}"
103
+ },
104
+ "hover": {
105
+ "value": "{color.primary.dark}"
106
+ },
107
+ "inverted": {
108
+ "value": "#fff"
109
+ }
100
110
  },
101
111
  "text": {
102
- "@": { "value": "#fff" },
103
- "inverted": { "value": "{color.primary.@}" }
112
+ "@": {
113
+ "value": "#fff"
114
+ },
115
+ "inverted": {
116
+ "value": "{color.primary.@}"
117
+ }
104
118
  },
105
119
  "shadow": {
106
120
  "value": "none"
package/dist/cli/cli.js CHANGED
@@ -26,9 +26,10 @@ const deriveParameters = ({ rawParameters, setVersion, setReleaseDate }) => {
26
26
  }, readFile = async (filePath) => {
27
27
  const normalized = path$1.normalize(filePath);
28
28
  try {
29
- return (await promises.readFile(normalized, { encoding: "utf8" }))?.replace(/^\uFEFF/, "");
29
+ const content = await promises.readFile(normalized, { encoding: "utf8" });
30
+ return content?.replace(/^\uFEFF/, "");
30
31
  } catch (error) {
31
- console.log(pico.red("Error reading file: " + normalized));
32
+ if (console.log(pico.red(`Error reading file: ${normalized}`)), error instanceof Error) console.log(pico.dim(error.message));
32
33
  }
33
34
  }, copyDirectory = async (source, destination, verbose) => {
34
35
  const normalizedSource = path$1.normalize(source), normalizedDestination = path$1.normalize(destination);
@@ -243,7 +244,7 @@ const deriveParameters = ({ rawParameters, setVersion, setReleaseDate }) => {
243
244
  return accessSync(dir, constants.R_OK), dir;
244
245
  } catch {}
245
246
  throw new Error(`template directory not found under ${root}`);
246
- }, styleVariablesPlugin = (appDir) => {
247
+ }, styleVariablesPlugin = (appDir, inputDir) => {
247
248
  const cssVirtualModuleId = "virtual:style-variables.css", jsVirtualModuleId = "virtual:style-variables.js", resolvedCssPath = `\0${path.join(appDir, "virtual-style-variables.css")}`, resolvedJsPath = `\0${path.join(appDir, "virtual-style-variables.js")}`;
248
249
  return {
249
250
  name: "style-variables-plugin",
@@ -256,6 +257,8 @@ const deriveParameters = ({ rawParameters, setVersion, setReleaseDate }) => {
256
257
  if (id === resolvedCssPath || id === resolvedJsPath) {
257
258
  const configPath = path.join(appDir, "styles/config.json"), configContent = fs$1.readFileSync(configPath, "utf-8"), config = JSON.parse(configContent);
258
259
  config.source = [path.join(appDir, "styles/style-tokens/**/*.json")];
260
+ const themePath = path.join(inputDir, "theme.json");
261
+ if (fs$1.existsSync(themePath)) config.source.push(themePath);
259
262
  const sd = new StyleDictionary(config);
260
263
  if (id === resolvedCssPath) {
261
264
  const files = await sd.formatPlatform("css");
@@ -268,7 +271,8 @@ const deriveParameters = ({ rawParameters, setVersion, setReleaseDate }) => {
268
271
  }
269
272
  },
270
273
  handleHotUpdate({ file, server }) {
271
- if (!file.includes("/style-tokens/")) return;
274
+ const isStyleToken = file.includes("/style-tokens/"), isTheme = file === path.join(inputDir, "theme.json");
275
+ if (!isStyleToken && !isTheme) return;
272
276
  const ids = [resolvedCssPath, resolvedJsPath];
273
277
  return ids.forEach((id) => {
274
278
  const mod = server.moduleGraph.getModuleById(id);
@@ -318,7 +322,7 @@ const require = createRequire(import.meta.url), basePath = process.env.BASE_PATH
318
322
  } },
319
323
  plugins: [
320
324
  nodePolyfills({ include: ["buffer"] }),
321
- styleVariablesPlugin(appPath),
325
+ styleVariablesPlugin(appPath, inputDir),
322
326
  react({ exclude: /\/src\/app\/pdf\// }),
323
327
  htmlTransformPlugin(parameters.title ?? "DocGen"),
324
328
  ...mode !== "build" ? [watchInputDirPlugin(inputDir)] : []
@@ -344,7 +348,7 @@ const require = createRequire(import.meta.url), basePath = process.env.BASE_PATH
344
348
  }, scaffold = async (command) => {
345
349
  const inputDir = findTemplateDir(import.meta.dirname), outputDir = path.normalize(command.output + "/"), verbose = command.verbose === true;
346
350
  console.log(pico.green("Creating scaffold template directory")), await copyDirectory(inputDir, outputDir, verbose);
347
- }, version = "6.3.1";
351
+ }, version = "6.4.0";
348
352
  if (program.version(version).usage("[command] [--option]"), program.command("scaffold").usage("[--option]").description("create a template input directory").option("-o, --output [path]", "path to the output directory (default: ./)", "./").option("-v, --verbose", "show verbose output including detailed errors").action((command) => {
349
353
  scaffold(command);
350
354
  }), program.command("dev").usage("[--option]").description("create a static website from an input directory").option("-i, --input [path]", "path to the input directory [default: ./]", "./").option("-o, --output [path]", "path to the output directory [default: ./output]", "./output").option("-p, --pdf", "create a PDF document").option("-s, --set-version [version]", "override parameters.version (useful for build tools) [default: false]", false).option("-R, --set-release-date [date]", "override parameters.date (useful for build tools) [default: false]", false).option("-v, --verbose", "show verbose output including detailed errors").action((command) => {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "docgen-tool",
3
3
  "type": "module",
4
- "version": "6.3.1",
4
+ "version": "6.4.0",
5
5
  "description": "A tool for creating HTML and PDF documentation",
6
6
  "bin": "./dist/cli/cli.js",
7
7
  "files": [
@@ -17,59 +17,62 @@
17
17
  "preview:docs": "npx serve -s ./docs",
18
18
  "build:docs:gh": "tsx src/cli/cli.ts build -i src/docs -o ./docs && yarn copy:gh:files",
19
19
  "copy:gh:files": "node deploy/before-deploy-website.js",
20
- "preview:style:variables": "rimraf src/app/styles/style-variables && npx style-dictionary build --config src/app/styles/config.json && yarn prettier:fix",
21
- "test": "npm run prettier:check",
20
+ "preview:style:variables": "rimraf src/app/styles/style-variables && npx style-dictionary build --config src/app/styles/config.json && yarn formatting:fix",
21
+ "test": "npm run formatting:check",
22
22
  "test:run": "tsx src/cli/cli.ts build -i src/__test__/test-run -o src/__test__/test-run-output",
23
23
  "test:scaffold": "tsx src/cli/cli.ts scaffold -o src/__test__/test-run-output",
24
24
  "test:prod:run": "./dist/cli/cli.js build -i src/__test__/test-run -o ../source/__test__/test-run-output",
25
- "prettier:check": "prettier --check 'src/**/*.{ts,js,tsx,jsx,json,css}'",
26
- "prettier:fix": "prettier --write 'src/**/*.{ts,js,tsx,jsx,json,css}'",
25
+ "formatting:check": "prettier --check 'src/**/*.{ts,js,tsx,jsx,json,css}'",
26
+ "formatting:fix": "prettier --write 'src/**/*.{ts,js,tsx,jsx,json,css}'",
27
+ "lint:check": "oxlint .",
28
+ "lint:fix": "oxlint --fix .",
27
29
  "test:publish": "sh ./src/__test__/test-publish/test-publish.sh",
28
30
  "prepare": "husky"
29
31
  },
30
32
  "lint-staged": {
31
- "src/**/*.{ts,js,tsx,jsx,json,css}": "prettier --write"
33
+ "src/**/*.{ts,js,tsx,jsx,json,css}": [
34
+ "oxlint --fix",
35
+ "prettier --write"
36
+ ]
32
37
  },
33
38
  "dependencies": {
34
- "@react-pdf/renderer": "^4.3.0",
35
- "@tanstack/react-router": "^1.130.12",
36
- "@vitejs/plugin-react": "^5.0.0",
39
+ "@react-pdf/renderer": "^4.3.2",
40
+ "@tanstack/react-router": "^1.147.0",
41
+ "@vitejs/plugin-react": "5.0.2",
37
42
  "cheerio": "^1.1.2",
38
43
  "classnames": "^2.5.1",
39
- "commander": "^14.0.0",
44
+ "commander": "^14.0.2",
40
45
  "dotenv": "^17.2.3",
41
- "fs-extra": "^11.3.0",
46
+ "fs-extra": "^11.3.3",
42
47
  "husky": "^9.1.7",
43
- "lint-staged": "^16.1.2",
44
- "marked": "^16.2.0",
48
+ "lint-staged": "^16.2.7",
49
+ "marked": "^17.0.1",
45
50
  "picocolors": "^1.1.1",
46
- "react": "^19.1.0",
47
- "react-dom": "^19.1.0",
51
+ "react": "^19.2.3",
52
+ "react-dom": "^19.2.3",
48
53
  "react-icons": "^5.5.0",
49
54
  "react-markdown": "^10.1.0",
50
- "react-pdf": "^10.2.0",
55
+ "react-pdf": "^10.3.0",
51
56
  "react-pdf-html-simple": "^2.1.4",
52
57
  "react-resize-detector": "^12.3.0",
53
58
  "rehype-raw": "^7.0.0",
54
59
  "remark-gfm": "^4.0.1",
55
- "rolldown-vite": "^7.3.0",
56
- "style-dictionary": "^5.1.1",
60
+ "rolldown-vite": "^7.3.1",
61
+ "style-dictionary": "^5.1.3",
57
62
  "vite": "npm:rolldown-vite@latest",
58
63
  "vite-plugin-node-polyfills": "0.22.0",
59
64
  "z-schema": "^6.0.2"
60
65
  },
61
66
  "devDependencies": {
62
- "@eslint/js": "^9.31.0",
63
- "@types/node": "^24.1.0",
64
- "@types/react": "^19.1.13",
65
- "eslint": "^9.31.0",
66
- "eslint-config-prettier": "^10.1.8",
67
+ "@prettier/plugin-oxc": "^0.1.3",
68
+ "@types/node": "^25.0.5",
69
+ "@types/react": "^19.2.8",
67
70
  "ncp": "^2.0.0",
68
- "prettier": "^3.6.2",
69
- "rimraf": "^6.0.1",
70
- "tsx": "^4.20.3",
71
- "typescript": "^5.8.3",
72
- "typescript-eslint": "^8.38.0"
71
+ "oxlint": "^1.38.0",
72
+ "prettier": "^3.7.4",
73
+ "rimraf": "^6.1.2",
74
+ "tsx": "^4.21.0",
75
+ "typescript": "^5.9.3"
73
76
  },
74
77
  "repository": {
75
78
  "type": "git",
Binary file