wrolpi/app/package.json
lrnselfreliance 04779b8557
Preview markdown files formatted, with a raw toggle (#780)
* Preview markdown files formatted, with a raw toggle

Markdown files are typed text/markdown (libmagic reports them as text/plain, or
as a programming language when they hold code) and keep the text indexer, so
they stay deep-searchable.  Existing files switch type on their next refresh.

The file preview renders markdown with markdown-it into the page, so it follows
the theme tokens and the night media filter.  A Formatted/Raw toggle shows the
source instead, and the choice is remembered.  Relative links and images
resolve against the file's directory; URLs that climb out of /media/ are
dropped.  Raw HTML in a file is escaped rather than parsed, and the output is
also sanitized with DOMPurify.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Do not load images from other sites in the markdown preview

An image from another site (http:, https:, or protocol-relative //) loaded as
soon as the preview opened, telling that site who was reading the file and
when.  Such an image now becomes a link labeled with its alt text, so the
reader chooses whether to follow it.  Inside a link (a README badge) it becomes
the outer link's text, since links cannot nest.  Media and embedded data:
images still load.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 13:26:42 -06:00

99 lines
2.7 KiB
JSON

{
"name": "wrolpi-app",
"version": "0.1.0",
"private": true,
"dependencies": {
"@acalcutt/maplibre-contour-pmtiles": "^0.1.2",
"@artsy/fresnel": "^8.5.0",
"@cypress/react18": "^2.0.1",
"@mantine/core": "^8.3.18",
"@mantine/hooks": "^8.3.18",
"@mantine/notifications": "^8.3.18",
"@tabler/icons-react": "^3.48.0",
"@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^14.6.7",
"cypress": "^15.21.1",
"dompurify": "^3.4.16",
"esptool-js": "^0.7.0",
"lodash": "^4.18.1",
"maplibre-gl": "^5.24.0",
"markdown-it": "^15.0.2",
"mathjs": "^15.2.0",
"pmtiles": "^4.5.0",
"protomaps-themes-base": "^4.5.0",
"query-string": "^9.5.1",
"react": "^18.3.1",
"react-colorful": "^5.8.1",
"react-dom": "^18.3.1",
"react-dropzone": "^14.4.1",
"react-hotkeys-hook": "^5.3.3",
"react-qr-code": "^2.2.0",
"react-router": "^7.18.4",
"react-scripts": "5.0.1",
"react-stl-viewer": "^2.5.0",
"three": "^0.186",
"web-vitals": "^6.2.2"
},
"scripts": {
"start": "react-scripts start",
"build": "BROWSERSLIST_IGNORE_OLD_DATA=true react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",
"cy:run": "cypress run",
"cy:open": "cypress open"
},
"eslintConfig": {
"extends": [
"react-app"
]
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
},
"devDependencies": {
"@testing-library/dom": "^10.4.2",
"@testing-library/jest-dom": "^7.0.1",
"@types/lodash": "^4.17.25",
"@types/node": "^26.6.3",
"@types/react": "^18.3.17",
"@types/react-dom": "^18.3.5",
"typescript": "^5.9.3",
"webpack-dev-server": "^5.2.6"
},
"jest": {
"transformIgnorePatterns": [
"node_modules/(?!(react-hotkeys-hook)/)"
]
},
"overrides": {
"@babel/code-frame": "7.29.0",
"@babel/compat-data": "7.20.14",
"@babel/core": "7.20.12",
"@babel/generator": "7.29.1",
"@babel/helper-compilation-targets": "7.20.7",
"@babel/helper-globals": "7.28.0",
"@babel/helper-module-imports": "7.28.6",
"@babel/helper-module-transforms": "7.28.6",
"@babel/helper-string-parser": "7.27.1",
"@babel/helper-validator-identifier": "7.28.5",
"@babel/helper-validator-option": "7.18.6",
"@babel/helpers": "7.27.0",
"@babel/parser": "7.29.3",
"@babel/template": "7.28.6",
"@babel/traverse": "7.29.0",
"@babel/types": "7.29.0",
"react-scripts": {
"typescript": "$typescript"
},
"fork-ts-checker-webpack-plugin": "^6.5.3"
}
}