From ca2e669635c630e4921ee7609211cd632214c64f Mon Sep 17 00:00:00 2001 From: Hsu Zhong Jun <27919917+dcshzj@users.noreply.github.com> Date: Fri, 26 Jan 2024 11:52:08 +0800 Subject: [PATCH 1/2] fix(tiptap): remove indentation from pretty printed HTML (#1791) --- package-lock.json | 269 +++--------------------- package.json | 4 +- src/layouts/EditPage/TiptapEditPage.tsx | 6 +- 3 files changed, 32 insertions(+), 247 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5e0ad132a..204d16c44 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,7 +52,6 @@ "@tiptap/react": "^2.1.12", "@tiptap/starter-kit": "^2.1.12", "axios": "^1.6.5", - "beautify": "^0.0.8", "bluebird": "^3.7.1", "bootstrap": "^4.6.0", "cheerio": "^1.0.0-rc.10", @@ -66,6 +65,7 @@ "easymde": "^2.16.1", "escape-string-regexp": "^4.0.0", "framer-motion": "^6.5.1", + "html": "^1.0.0", "html-react-parser": "^1.2.7", "immutability-helper": "^3.1.1", "inter-ui": "^3.19.3", @@ -131,8 +131,8 @@ "@testing-library/jest-dom": "^5.16.4", "@testing-library/react": "^14.0.0", "@tsconfig/recommended": "^1.0.1", - "@types/beautify": "^0.0.3", "@types/dompurify": "^3.0.4", + "@types/html": "^1.0.4", "@types/invariant": "^2.2.35", "@types/jest": "^29.4.4", "@types/qrcode": "^1.5.4", @@ -6105,6 +6105,7 @@ }, "node_modules/@isaacs/cliui": { "version": "8.0.2", + "dev": true, "license": "ISC", "dependencies": { "string-width": "^5.1.2", @@ -6120,6 +6121,7 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { "version": "6.0.1", + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -6130,6 +6132,7 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.1", + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -6140,6 +6143,7 @@ }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", + "dev": true, "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", @@ -6155,6 +6159,7 @@ }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" @@ -6168,6 +6173,7 @@ }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", @@ -7567,11 +7573,6 @@ "node": ">= 8" } }, - "node_modules/@one-ini/wasm": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", - "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==" - }, "node_modules/@open-draft/until": { "version": "1.0.3", "dev": true, @@ -7699,6 +7700,7 @@ }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", + "dev": true, "license": "MIT", "optional": true, "engines": { @@ -11936,12 +11938,6 @@ "@babel/types": "^7.20.7" } }, - "node_modules/@types/beautify": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@types/beautify/-/beautify-0.0.3.tgz", - "integrity": "sha512-x4igynPrE/x0ITiQXn4IHU5b0FSIKfHG0VPeju+aPvvclxSKSdO8As10ea0qgpP3yBRV8e32jr3wJr94wlcr9Q==", - "dev": true - }, "node_modules/@types/body-parser": { "version": "1.19.2", "dev": true, @@ -12130,6 +12126,12 @@ "hoist-non-react-statics": "^3.3.0" } }, + "node_modules/@types/html": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/html/-/html-1.0.4.tgz", + "integrity": "sha512-Wb1ymSAftCLxhc3D6vS0Ike/0xg7W6c+DQxAkerU6pD7C8CMzTYwvrwnlcrTfsVO/nMelB9KOKIT7+N5lOeQUg==", + "dev": true + }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", "dev": true, @@ -13304,14 +13306,6 @@ "dev": true, "license": "BSD-3-Clause" }, - "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -14651,19 +14645,6 @@ "tweetnacl": "^0.14.3" } }, - "node_modules/beautify": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/beautify/-/beautify-0.0.8.tgz", - "integrity": "sha512-1iF6Ey2qxDkm6bPgKcoXUmwFDpoRi5IgwefQDDQBRLxlZAAYwcULoQ2IdBArXZuSsuL7AT+KvZI9xZVLeUZPRg==", - "dependencies": { - "cssbeautify": "^0.3.1", - "html": "^1.0.0", - "js-beautify": "^1.6.4" - }, - "bin": { - "beautify": "bin/beautify.js" - } - }, "node_modules/better-opn": { "version": "3.0.2", "dev": true, @@ -16240,20 +16221,6 @@ "typedarray": "^0.0.6" } }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/config-chain/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, "node_modules/confusing-browser-globals": { "version": "1.0.11", "dev": true, @@ -16855,17 +16822,6 @@ "dev": true, "license": "MIT" }, - "node_modules/cssbeautify": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz", - "integrity": "sha512-ljnSOCOiMbklF+dwPbpooyB78foId02vUrTDogWzu6ca2DCNB7Kc/BHEGBnYOlUYtwXvSW0mWTwaiO2pwFIoRg==", - "bin": { - "cssbeautify": "bin/cssbeautify" - }, - "engines": { - "node": "*" - } - }, "node_modules/cssdb": { "version": "7.7.0", "dev": true, @@ -18171,6 +18127,7 @@ }, "node_modules/eastasianwidth": { "version": "0.2.0", + "dev": true, "license": "MIT" }, "node_modules/easymde": { @@ -18200,83 +18157,6 @@ "safe-buffer": "^5.0.1" } }, - "node_modules/editorconfig": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", - "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==", - "dependencies": { - "@one-ini/wasm": "0.1.1", - "commander": "^10.0.0", - "minimatch": "9.0.1", - "semver": "^7.5.3" - }, - "bin": { - "editorconfig": "bin/editorconfig" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/editorconfig/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/editorconfig/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "engines": { - "node": ">=14" - } - }, - "node_modules/editorconfig/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/editorconfig/node_modules/minimatch": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", - "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/editorconfig/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/editorconfig/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/ee-first": { "version": "1.1.1", "license": "MIT" @@ -18331,6 +18211,7 @@ }, "node_modules/emoji-regex": { "version": "9.2.2", + "dev": true, "license": "MIT" }, "node_modules/emojis-list": { @@ -23398,6 +23279,7 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -27025,94 +26907,6 @@ "version": "3.7.5", "license": "BSD-3-Clause" }, - "node_modules/js-beautify": { - "version": "1.14.11", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.11.tgz", - "integrity": "sha512-rPogWqAfoYh1Ryqqh2agUpVfbxAhbjuN1SmU86dskQUKouRiggUTCO4+2ym9UPXllc2WAp0J+T5qxn7Um3lCdw==", - "dependencies": { - "config-chain": "^1.1.13", - "editorconfig": "^1.0.3", - "glob": "^10.3.3", - "nopt": "^7.2.0" - }, - "bin": { - "css-beautify": "js/bin/css-beautify.js", - "html-beautify": "js/bin/html-beautify.js", - "js-beautify": "js/bin/js-beautify.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/js-beautify/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/js-beautify/node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/js-beautify/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/js-beautify/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/js-beautify/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/js-levenshtein": { "version": "1.1.6", "dev": true, @@ -29329,6 +29123,7 @@ }, "node_modules/minipass": { "version": "5.0.0", + "dev": true, "license": "ISC", "engines": { "node": ">=8" @@ -29775,20 +29570,6 @@ "version": "2.0.13", "license": "MIT" }, - "node_modules/nopt": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", - "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/normalize-package-data": { "version": "2.5.0", "dev": true, @@ -30577,6 +30358,7 @@ }, "node_modules/path-scurry": { "version": "1.10.1", + "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^9.1.1 || ^10.0.0", @@ -30591,6 +30373,7 @@ }, "node_modules/path-scurry/node_modules/lru-cache": { "version": "10.0.0", + "dev": true, "license": "ISC", "engines": { "node": "14 || >=16.14" @@ -32477,11 +32260,6 @@ "prosemirror-transform": "^1.1.0" } }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" - }, "node_modules/proto3-json-serializer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.1.tgz", @@ -37803,6 +37581,7 @@ "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", + "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -37815,6 +37594,7 @@ }, "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", + "dev": true, "license": "MIT" }, "node_modules/string-width/node_modules/emoji-regex": { @@ -37907,6 +37687,7 @@ "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -41152,6 +40933,7 @@ "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -41167,6 +40949,7 @@ }, "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { "version": "4.3.0", + "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" diff --git a/package.json b/package.json index 6cfdd2734..e84140ce9 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,6 @@ "@tiptap/react": "^2.1.12", "@tiptap/starter-kit": "^2.1.12", "axios": "^1.6.5", - "beautify": "^0.0.8", "bluebird": "^3.7.1", "bootstrap": "^4.6.0", "cheerio": "^1.0.0-rc.10", @@ -63,6 +62,7 @@ "easymde": "^2.16.1", "escape-string-regexp": "^4.0.0", "framer-motion": "^6.5.1", + "html": "^1.0.0", "html-react-parser": "^1.2.7", "immutability-helper": "^3.1.1", "inter-ui": "^3.19.3", @@ -178,8 +178,8 @@ "@testing-library/jest-dom": "^5.16.4", "@testing-library/react": "^14.0.0", "@tsconfig/recommended": "^1.0.1", - "@types/beautify": "^0.0.3", "@types/dompurify": "^3.0.4", + "@types/html": "^1.0.4", "@types/invariant": "^2.2.35", "@types/jest": "^29.4.4", "@types/qrcode": "^1.5.4", diff --git a/src/layouts/EditPage/TiptapEditPage.tsx b/src/layouts/EditPage/TiptapEditPage.tsx index 2471b7d75..8602e37b3 100644 --- a/src/layouts/EditPage/TiptapEditPage.tsx +++ b/src/layouts/EditPage/TiptapEditPage.tsx @@ -1,6 +1,6 @@ import axios from "axios" -import beautifyHtml from "beautify" import DOMPurify from "dompurify" +import { prettyPrint as beautifyHtml } from "html" import _ from "lodash" import { marked } from "marked" import { useCallback, useEffect, useState } from "react" @@ -107,7 +107,9 @@ export const TiptapEditPage = ({ editor.commands.setContent(content) }} getEditorContent={() => - beautifyHtml(editor.getHTML(), { format: "html" }) + // Note: The indent_size is set to -1 instead of 0 to remove all + // indentation, due to a bug in the upstream library + beautifyHtml(editor.getHTML(), { indent_size: -1 }) } shouldDisableSave={isAnyDrawerOpen} variant="tiptap" From c28ab2b03b0630677369154bdd31a643c9636ac0 Mon Sep 17 00:00:00 2001 From: Kishore <42832651+kishore03109@users.noreply.github.com> Date: Fri, 26 Jan 2024 12:04:28 +0800 Subject: [PATCH 2/2] 0.74.0 --- CHANGELOG.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 09aef70b8..9a4715abf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,15 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +#### [v0.74.0](https://github.com/isomerpages/isomercms-frontend/compare/v0.73.0...v0.74.0) + +- fix(tiptap): remove indentation from pretty printed HTML [`#1791`](https://github.com/isomerpages/isomercms-frontend/pull/1791) +- 0.73.0 [`#1787`](https://github.com/isomerpages/isomercms-frontend/pull/1787) + #### [v0.73.0](https://github.com/isomerpages/isomercms-frontend/compare/v0.72.0...v0.73.0) +> 25 January 2024 + - chore: update datadog [`#1785`](https://github.com/isomerpages/isomercms-frontend/pull/1785) - fix(infocols): should not be allowed to rm last [`#1786`](https://github.com/isomerpages/isomercms-frontend/pull/1786) - fix(tiptap): block usage of base64 images [`#1784`](https://github.com/isomerpages/isomercms-frontend/pull/1784) diff --git a/package-lock.json b/package-lock.json index 204d16c44..560a2e68a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "isomercms-frontend", - "version": "0.73.0", + "version": "0.74.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "isomercms-frontend", - "version": "0.73.0", + "version": "0.74.0", "hasInstallScript": true, "dependencies": { "@braintree/sanitize-url": "^6.0.1", diff --git a/package.json b/package.json index e84140ce9..e770af4d9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "isomercms-frontend", - "version": "0.73.0", + "version": "0.74.0", "private": true, "engines": { "node": ">=16.0.0"