From 34be1c7f3776cfb3e42662955bb3936208c24863 Mon Sep 17 00:00:00 2001 From: krutoo Date: Tue, 30 Sep 2025 00:49:53 +0500 Subject: [PATCH] docs now uses pathname routing with ssg --- .github/workflows/deploy-docs.yml | 2 + docs/.env.development | 5 + docs/.gitignore | 3 +- docs/docs/build/vite.story.mdx | 2 + docs/docs/showcase/customization.story.mdx | 58 ++- docs/package-lock.json | 547 ++++++++++++++------- docs/package.json | 7 +- docs/rspack.config.ts | 176 +++++-- docs/src/components/app/app.tsx | 46 ++ docs/src/components/helmet/helmet.tsx | 19 + docs/src/components/hero/hero.m.css | 6 +- docs/src/components/hero/hero.tsx | 18 +- docs/src/index.html | 12 - docs/src/server.tsx | 48 ++ docs/src/showcase.css | 7 - docs/src/showcase.tsx | 42 +- docs/src/typings/global.d.ts | 9 + docs/src/utils.ts | 6 + docs/tsconfig.json | 1 + package-lock.json | 8 +- package.json | 2 +- rspack.config.ts | 62 +-- src/typings/css-modules.d.ts | 4 +- 23 files changed, 726 insertions(+), 364 deletions(-) create mode 100644 docs/.env.development create mode 100644 docs/src/components/app/app.tsx create mode 100644 docs/src/components/helmet/helmet.tsx delete mode 100644 docs/src/index.html create mode 100644 docs/src/server.tsx create mode 100644 docs/src/utils.ts diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 40fe610..33dd1ca 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -39,7 +39,9 @@ jobs: - name: Build docs working-directory: ./docs env: + NODE_ENV: production PUBLIC_PATH: /showcase/ + TEMPLATES_DIR: temp/templates run: | npm run check npm run build diff --git a/docs/.env.development b/docs/.env.development new file mode 100644 index 0000000..79134f3 --- /dev/null +++ b/docs/.env.development @@ -0,0 +1,5 @@ +# should be value public path +PUBLIC_PATH=/showcase/ + +# directory for SSG page templates +TEMPLATES_DIR=temp/templates \ No newline at end of file diff --git a/docs/.gitignore b/docs/.gitignore index c54c70b..c729a0a 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -1,3 +1,4 @@ node_modules/ .generated/ -dist/ \ No newline at end of file +dist/ +temp/ \ No newline at end of file diff --git a/docs/docs/build/vite.story.mdx b/docs/docs/build/vite.story.mdx index 25a8a16..7589dfc 100644 --- a/docs/docs/build/vite.story.mdx +++ b/docs/docs/build/vite.story.mdx @@ -6,6 +6,8 @@ export const meta = { # Build with Vite +For Rspack you can see working example: [Vite example on GitHub](https://github.com/krutoo/showcase/tree/main/examples/vite) + With Vite you need to configure it for example like this: ```js diff --git a/docs/docs/showcase/customization.story.mdx b/docs/docs/showcase/customization.story.mdx index 7b58fb3..24eb031 100644 --- a/docs/docs/showcase/customization.story.mdx +++ b/docs/docs/showcase/customization.story.mdx @@ -88,4 +88,60 @@ Coming soon... ## Routing -Coming soon... +By default, showcase uses next routing rules: + +- showcase page of story `/hello/world` looks for `?path=/hello/world` +- sandbox page of story `/hello/world` looks for `sandbox.html?path=/hello/world` + +You can configure routing of your stories by **router** and **routing** options. + +#### Option `router` + +By this option you can configure how to deal with `window.location` if you want. +Default router is `BrowserRouter` that connects to `window.location`. + +`BrowserRouter` can be exported and configured: + +```jsx +import { ShowcaseApp, BrowserRouter } from '@krutoo/showcase/showcase-runtime'; + + +``` + +#### Option `routing` + +This option controls how to: + +- define story by location +- define location by story +- define story sandbox URL + +By default `ShowcaseApp` uses `QueryRouting` that looks for `?path` parameter in location. + +If you want to make pathname-based routing you can use `PathnameRouting`: + +```jsx +import { ShowcaseApp, PathnameRouting } from '@krutoo/showcase/showcase-runtime'; + + +``` + +It also of course possible to provide your own implementation. + +Notice that for pathname-based routing you also need to either: + +- make HTML files for each story during compile time +- configure your server to redirect all missed pathnames to your SPA + +#### Tip: public path + +If you want to publish your showcase to non root path you can provide `publicPath` option to `PathnameRouting`: + +```jsx +import { ShowcaseApp, PathnameRouting } from '@krutoo/showcase/showcase-runtime'; + + +``` + +For example, `docs` repo published to GitHub Pages will have url `github.com//docs` +where `username` is _base path_. diff --git a/docs/package-lock.json b/docs/package-lock.json index 165de16..56173bd 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -8,10 +8,12 @@ "name": "@krutoo/showcase-docs", "version": "0.0.0", "dependencies": { - "@krutoo/utils": "^0.0.27", + "@krutoo/utils": "^0.0.29", "@mdx-js/react": "^3.1.1", + "classnames": "^2.5.1", "react": "^19.1.1", - "react-dom": "^19.1.1" + "react-dom": "^19.1.1", + "shiki": "^3.13.0" }, "devDependencies": { "@mdx-js/loader": "^3.1.1", @@ -19,6 +21,7 @@ "@rspack/core": "^1.5.5", "@types/react": "^19.1.13", "@types/react-dom": "^19.1.9", + "dotenv": "^17.2.2", "typescript": "^5.9.2" } }, @@ -186,9 +189,9 @@ } }, "node_modules/@krutoo/utils": { - "version": "0.0.27", - "resolved": "https://registry.npmjs.org/@krutoo/utils/-/utils-0.0.27.tgz", - "integrity": "sha512-AqD0XZZdofe7A56EA6CslVwpbHp/buuVuuPS6DQtklvGHOFJ0BHVGJVeHJj3HKyi55NtYc2YFVDfvYtnnoVw4w==", + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@krutoo/utils/-/utils-0.0.29.tgz", + "integrity": "sha512-ckG9LlTUfuMaPq3/vEiuqlFyUWDgcNExhxIrgEjTzq+Bu4Tlb+oUZrSCRSnKFpNxx8fDkPoCroan0e6IKiWyzA==", "license": "Apache-2.0", "engines": { "node": ">=16" @@ -383,28 +386,28 @@ "license": "MIT" }, "node_modules/@rspack/binding": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.5.5.tgz", - "integrity": "sha512-JkB943uBU0lABnKG/jdO+gg3/eeO9CEQMR/1dL6jSU9GTxaNf3XIVc05RhRC7qoVsiXuhSMMFxWyV0hyHxp2bA==", + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.5.8.tgz", + "integrity": "sha512-/91CzhRl9r5BIQCgGsS7jA6MDbw1I2BQpbfcUUdkdKl2P79K3Zo/Mw/TvKzS86catwLaUQEgkGRmYawOfPg7ow==", "devOptional": true, "license": "MIT", "optionalDependencies": { - "@rspack/binding-darwin-arm64": "1.5.5", - "@rspack/binding-darwin-x64": "1.5.5", - "@rspack/binding-linux-arm64-gnu": "1.5.5", - "@rspack/binding-linux-arm64-musl": "1.5.5", - "@rspack/binding-linux-x64-gnu": "1.5.5", - "@rspack/binding-linux-x64-musl": "1.5.5", - "@rspack/binding-wasm32-wasi": "1.5.5", - "@rspack/binding-win32-arm64-msvc": "1.5.5", - "@rspack/binding-win32-ia32-msvc": "1.5.5", - "@rspack/binding-win32-x64-msvc": "1.5.5" + "@rspack/binding-darwin-arm64": "1.5.8", + "@rspack/binding-darwin-x64": "1.5.8", + "@rspack/binding-linux-arm64-gnu": "1.5.8", + "@rspack/binding-linux-arm64-musl": "1.5.8", + "@rspack/binding-linux-x64-gnu": "1.5.8", + "@rspack/binding-linux-x64-musl": "1.5.8", + "@rspack/binding-wasm32-wasi": "1.5.8", + "@rspack/binding-win32-arm64-msvc": "1.5.8", + "@rspack/binding-win32-ia32-msvc": "1.5.8", + "@rspack/binding-win32-x64-msvc": "1.5.8" } }, "node_modules/@rspack/binding-darwin-arm64": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.5.5.tgz", - "integrity": "sha512-Kg3ywEZHLX+aROfTQ5tMOv+Ud+8b4jk8ruUgsi0W8oBkEkR5xBdhFa9vcf6pzy+gfoLCnEI68U9i8ttm+G0csA==", + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.5.8.tgz", + "integrity": "sha512-spJfpOSN3f7V90ic45/ET2NKB2ujAViCNmqb0iGurMNQtFRq+7Kd+jvVKKGXKBHBbsQrFhidSWbbqy2PBPGK8g==", "cpu": [ "arm64" ], @@ -416,9 +419,9 @@ ] }, "node_modules/@rspack/binding-darwin-x64": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.5.5.tgz", - "integrity": "sha512-uoGTYnlYW8m47yiDCKvXOehhAOH12wlePJq4sbUbBoHmG07vbDw7fUqnvy2k8319NTVEpMJWGoKyisgI09/uMQ==", + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.5.8.tgz", + "integrity": "sha512-YFOzeL1IBknBcri8vjUp43dfUBylCeQnD+9O9p0wZmLAw7DtpN5JEOe2AkGo8kdTqJjYKI+cczJPKIw6lu1LWw==", "cpu": [ "x64" ], @@ -430,9 +433,9 @@ ] }, "node_modules/@rspack/binding-linux-arm64-gnu": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.5.5.tgz", - "integrity": "sha512-KgVN3TeUJ3iNwwOX3JGY4arvoLHX94eItJ4TeOSyetRiSJUrQI0evP16i5kIh+n+p7mVnXmfUS944Gl+uNsJmg==", + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.5.8.tgz", + "integrity": "sha512-UAWCsOnpkvy8eAVRo0uipbHXDhnoDq5zmqWTMhpga0/a3yzCp2e+fnjZb/qnFNYb5MeL0O1mwMOYgn1M3oHILQ==", "cpu": [ "arm64" ], @@ -444,9 +447,9 @@ ] }, "node_modules/@rspack/binding-linux-arm64-musl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.5.5.tgz", - "integrity": "sha512-1gKthlCQinXtWar6Hl9Il6BQ/NgYBH0NVuUsjjf85ejD/cTPQENKyIpGvVa1rSIHSfnG/XujUbruHAeY9mEHCA==", + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.5.8.tgz", + "integrity": "sha512-GnSvGT4GjokPSD45cTtE+g7LgghuxSP1MRmvd+Vp/I8pnxTVSTsebRod4TAqyiv+l11nuS8yqNveK9qiOkBLWw==", "cpu": [ "arm64" ], @@ -458,9 +461,9 @@ ] }, "node_modules/@rspack/binding-linux-x64-gnu": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.5.5.tgz", - "integrity": "sha512-haPFg4M9GwpSI5g9BQhKUNdzCKDvFexIUkLiAHBjFU9iWQTEcI9VfYPixestOIwzUv7E34rHM+jAsmRGWdgmXw==", + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.5.8.tgz", + "integrity": "sha512-XLxh5n/pzUfxsugz/8rVBv+Tx2nqEM+9rharK69kfooDsQNKyz7PANllBQ/v4svJ+W0BRHnDL4qXSGdteZeEjA==", "cpu": [ "x64" ], @@ -472,9 +475,9 @@ ] }, "node_modules/@rspack/binding-linux-x64-musl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.5.5.tgz", - "integrity": "sha512-oUny56JEkCZvIu4n8/P7IPLPNtJnL89EDhxHINH87XLBY3OOgo8JHELR11Zj9SFWiGNsRcLqi+Q78tWa0ligBQ==", + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.5.8.tgz", + "integrity": "sha512-gE0+MZmwF+01p9/svpEESkzkLpBkVUG2o03YMpwXYC/maeRRhWvF8BJ7R3i/Ls/jFGSE87dKX5NbRLVzqksq/w==", "cpu": [ "x64" ], @@ -486,9 +489,9 @@ ] }, "node_modules/@rspack/binding-wasm32-wasi": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.5.5.tgz", - "integrity": "sha512-tRgxBgIXaBKBH/0KlwvyqbIMqQrg8jKOyFOEQseEE7Oqs2M9KkJ7Vp5QN11u3NvZ9nz5GbZxmVGBMkdj9Gth1w==", + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.5.8.tgz", + "integrity": "sha512-cfg3niNHeJuxuml1Vy9VvaJrI/5TakzoaZvKX2g5S24wfzR50Eyy4JAsZ+L2voWQQp1yMJbmPYPmnTCTxdJQBQ==", "cpu": [ "wasm32" ], @@ -500,9 +503,9 @@ } }, "node_modules/@rspack/binding-win32-arm64-msvc": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.5.5.tgz", - "integrity": "sha512-wGWd2yluoFdQgtkIbny6FoHnzahTk+o9RzrptjeS1u/NV1lKrWzmWhwZojMGOUqPiaukZKaziOEo7gpRn2XbEQ==", + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.5.8.tgz", + "integrity": "sha512-7i3ZTHFXKfU/9Jm9XhpMkrdkxO7lfeYMNVEGkuU5dyBfRMQj69dRgPL7zJwc2plXiqu9LUOl+TwDNTjap7Q36g==", "cpu": [ "arm64" ], @@ -514,9 +517,9 @@ ] }, "node_modules/@rspack/binding-win32-ia32-msvc": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.5.5.tgz", - "integrity": "sha512-Ikml8AQkzjPCG24vTO4pG2bpJ8vp93jVEgo9X9uYjO2vQbIp5QSOmeZOTM7tXCf8AfTfHEF/yAdE/pR/+tXXGQ==", + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.5.8.tgz", + "integrity": "sha512-7ZPPWO11J+soea1+mnfaPpQt7GIodBM7A86dx6PbXgVEoZmetcWPrCF2NBfXxQWOKJ9L3RYltC4z+ZyXRgMOrw==", "cpu": [ "ia32" ], @@ -528,9 +531,9 @@ ] }, "node_modules/@rspack/binding-win32-x64-msvc": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.5.5.tgz", - "integrity": "sha512-m2059ms0i/GIQGWTlZ5GI6SWpuMFAPMsWlhXLk2LZRIydhi+N/YPkmc33lFRTlDA3QpKDCvowvCvIIA7g6WSlg==", + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.5.8.tgz", + "integrity": "sha512-N/zXQgzIxME3YUzXT8qnyzxjqcnXudWOeDh8CAG9zqTCnCiy16SFfQ/cQgEoLlD9geQntV6jx2GbDDI5kpDGMQ==", "cpu": [ "x64" ], @@ -542,9 +545,9 @@ ] }, "node_modules/@rspack/cli": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@rspack/cli/-/cli-1.5.5.tgz", - "integrity": "sha512-b300fh1HhusbcgVbWfh3fj+vwsrkUAXufn136DdVOXZSScHy+8mtvLthrJ8w6PtTUwR3GtunmZ6hOf3e5dlfyw==", + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@rspack/cli/-/cli-1.5.8.tgz", + "integrity": "sha512-CVqxLGTHBLGDJxYRlVNCtbWix+bXLIHxT11225wAXSyn/5/kJYWxJNNy42vjUNNGSP1Va/aI5lse/pCZjn3xNA==", "dev": true, "license": "MIT", "dependencies": { @@ -564,14 +567,14 @@ } }, "node_modules/@rspack/core": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.5.5.tgz", - "integrity": "sha512-AOIuMktK6X/xHAjJ/0QJ2kbSkILXj641GCPE+EOfWO27ODA8fHPArKbyz5AVGVePV3aUfEo2VFcsNzP67VBEPA==", + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.5.8.tgz", + "integrity": "sha512-sUd2LfiDhqYVfvknuoz0+/c+wSpn693xotnG5g1CSWKZArbtwiYzBIVnNlcHGmuoBRsnj/TkSq8dTQ7gwfBroQ==", "devOptional": true, "license": "MIT", "dependencies": { "@module-federation/runtime-tools": "0.18.0", - "@rspack/binding": "1.5.5", + "@rspack/binding": "1.5.8", "@rspack/lite-tapable": "1.0.1" }, "engines": { @@ -616,6 +619,73 @@ "node": ">=16.0.0" } }, + "node_modules/@shikijs/core": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.13.0.tgz", + "integrity": "sha512-3P8rGsg2Eh2qIHekwuQjzWhKI4jV97PhvYjYUzGqjvJfqdQPz+nMlfWahU24GZAyW1FxFI1sYjyhfh5CoLmIUA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.13.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.13.0.tgz", + "integrity": "sha512-Ty7xv32XCp8u0eQt8rItpMs6rU9Ki6LJ1dQOW3V/56PKDcpvfHPnYFbsx5FFUP2Yim34m/UkazidamMNVR4vKg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.13.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.3" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.13.0.tgz", + "integrity": "sha512-O42rBGr4UDSlhT2ZFMxqM7QzIU+IcpoTMzb3W7AlziI1ZF7R8eS2M0yt5Ry35nnnTX/LTLXFPUjRFCIW+Operg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.13.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.13.0.tgz", + "integrity": "sha512-672c3WAETDYHwrRP0yLy3W1QYB89Hbpj+pO4KhxK6FzIrDI2FoEXNiNCut6BQmEApYLfuYfpgOZaqbY+E9b8wQ==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.13.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.13.0.tgz", + "integrity": "sha512-Vxw1Nm1/Od8jyA7QuAenaV78BG2nSr3/gCGdBkLpfLscddCkzkL36Q5b67SrLLfvAJTOUzW39x4FHVCFriPVgg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.13.0" + } + }, + "node_modules/@shikijs/types": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.13.0.tgz", + "integrity": "sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, "node_modules/@tybys/wasm-util": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", @@ -726,7 +796,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "dev": true, "license": "MIT", "dependencies": { "@types/unist": "*" @@ -760,7 +829,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "dev": true, "license": "MIT", "dependencies": { "@types/unist": "*" @@ -821,9 +889,9 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "19.1.13", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.13.tgz", - "integrity": "sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ==", + "version": "19.1.15", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.15.tgz", + "integrity": "sha512-+kLxJpaJzXybyDyFXYADyP1cznTO8HSuBpenGlnKOAkH4hyNINiywvXS/tGJhsrGGP/gM185RA3xpjY0Yg4erA==", "license": "MIT", "dependencies": { "csstype": "^3.0.2" @@ -893,7 +961,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "dev": true, "license": "MIT" }, "node_modules/@types/ws": { @@ -910,7 +977,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "dev": true, "license": "ISC" }, "node_modules/accepts": { @@ -1147,6 +1213,23 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, "node_modules/bonjour-service": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", @@ -1232,7 +1315,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "dev": true, "license": "MIT", "funding": { "type": "github", @@ -1254,7 +1336,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "dev": true, "license": "MIT", "funding": { "type": "github", @@ -1265,7 +1346,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "dev": true, "license": "MIT", "funding": { "type": "github", @@ -1308,6 +1388,12 @@ "fsevents": "~2.3.2" } }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -1365,7 +1451,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "dev": true, "license": "MIT", "funding": { "type": "github", @@ -1414,6 +1499,23 @@ "node": ">= 0.8.0" } }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", @@ -1485,13 +1587,21 @@ "license": "MIT" }, "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/decode-named-character-reference": { @@ -1565,7 +1675,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -1593,7 +1702,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "dev": true, "license": "MIT", "dependencies": { "dequal": "^2.0.0" @@ -1616,6 +1724,19 @@ "node": ">=6" } }, + "node_modules/dotenv": { + "version": "17.2.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.2.tgz", + "integrity": "sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -1934,6 +2055,23 @@ "url": "https://opencollective.com/express" } }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -2010,6 +2148,23 @@ "node": ">= 0.8" } }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, "node_modules/follow-redirects": { "version": "1.15.11", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", @@ -2253,6 +2408,29 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-to-jsx-runtime": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", @@ -2285,7 +2463,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "dev": true, "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" @@ -2348,6 +2525,16 @@ "dev": true, "license": "MIT" }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", @@ -2831,7 +3018,6 @@ "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==", - "dev": true, "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -2896,9 +3082,9 @@ } }, "node_modules/memfs": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.42.0.tgz", - "integrity": "sha512-RG+4HMGyIVp6UWDWbFmZ38yKrSzblPnfJu0PyPt0hw52KW4PPlPp+HdV4qZBG0hLDuYVnf8wfQT4NymKXnlQjA==", + "version": "4.47.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.47.0.tgz", + "integrity": "sha512-Xey8IZA57tfotV/TN4d6BmccQuhFP+CqRiI7TTNdipZdZBzF2WnzUcH//Cudw6X4zJiUbo/LTuU/HPA/iC/pNg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2909,9 +3095,6 @@ "tree-dump": "^1.0.3", "tslib": "^2.0.0" }, - "engines": { - "node": ">= 4.0.0" - }, "funding": { "type": "github", "url": "https://github.com/sponsors/streamich" @@ -3259,7 +3442,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -3386,7 +3568,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -3486,7 +3667,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -3531,7 +3711,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -3548,7 +3727,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -3561,31 +3739,6 @@ ], "license": "MIT" }, - "node_modules/micromark/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/micromark/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -3664,9 +3817,9 @@ } }, "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, @@ -3757,6 +3910,23 @@ "node": ">= 0.8" } }, + "node_modules/oniguruma-parser": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", + "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.3.tgz", + "integrity": "sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==", + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.1", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, "node_modules/open": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", @@ -3889,7 +4059,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", - "dev": true, "license": "MIT", "funding": { "type": "github", @@ -4082,6 +4251,30 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz", + "integrity": "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" + }, "node_modules/rehype-recma": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", @@ -4298,6 +4491,23 @@ "node": ">= 0.8.0" } }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, "node_modules/send/node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -4308,13 +4518,6 @@ "node": ">= 0.8" } }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, "node_modules/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", @@ -4334,6 +4537,16 @@ "node": ">= 0.8.0" } }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, "node_modules/serve-index/node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -4367,6 +4580,13 @@ "dev": true, "license": "ISC" }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", @@ -4420,6 +4640,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/shiki": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.13.0.tgz", + "integrity": "sha512-aZW4l8Og16CokuCLf8CF8kq+KK2yOygapU5m3+hoGw0Mdosc6fPitjM+ujYarppj5ZIKGyPDPP1vqmQhr+5/0g==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "3.13.0", + "@shikijs/engine-javascript": "3.13.0", + "@shikijs/engine-oniguruma": "3.13.0", + "@shikijs/langs": "3.13.0", + "@shikijs/themes": "3.13.0", + "@shikijs/types": "3.13.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -4537,7 +4773,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "dev": true, "license": "MIT", "funding": { "type": "github", @@ -4576,56 +4811,6 @@ "wbuf": "^1.7.3" } }, - "node_modules/spdy-transport/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/spdy-transport/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/spdy/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/spdy/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -4665,7 +4850,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "dev": true, "license": "MIT", "dependencies": { "character-entities-html4": "^2.0.0", @@ -4787,7 +4971,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "dev": true, "license": "MIT", "funding": { "type": "github", @@ -4884,7 +5067,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -4898,7 +5080,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -4926,7 +5107,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -4940,7 +5120,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -4956,7 +5135,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", - "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -5018,7 +5196,6 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -5033,7 +5210,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", - "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -5104,14 +5280,14 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.3.tgz", - "integrity": "sha512-5kA/PzpZzDz5mNOkcNLmU1UdjGeSSxd7rt1akWpI70jMNHLASiBPRaQZn0hgyhvhawfIwSnnLfDABIxL3ueyFg==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", + "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", "dev": true, "license": "MIT", "dependencies": { "colorette": "^2.0.10", - "memfs": "^4.6.0", + "memfs": "^4.43.1", "mime-types": "^3.0.1", "on-finished": "^2.4.1", "range-parser": "^1.2.1", @@ -5328,7 +5504,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "dev": true, "license": "MIT", "funding": { "type": "github", diff --git a/docs/package.json b/docs/package.json index 637f9fc..f3931f3 100644 --- a/docs/package.json +++ b/docs/package.json @@ -15,12 +15,15 @@ "@rspack/core": "^1.5.5", "@types/react": "^19.1.13", "@types/react-dom": "^19.1.9", + "dotenv": "^17.2.2", "typescript": "^5.9.2" }, "dependencies": { - "@krutoo/utils": "^0.0.27", + "@krutoo/utils": "^0.0.29", "@mdx-js/react": "^3.1.1", + "classnames": "^2.5.1", "react": "^19.1.1", - "react-dom": "^19.1.1" + "react-dom": "^19.1.1", + "shiki": "^3.13.0" } } diff --git a/docs/rspack.config.ts b/docs/rspack.config.ts index 7d2bcc5..312ba7f 100644 --- a/docs/rspack.config.ts +++ b/docs/rspack.config.ts @@ -2,70 +2,144 @@ import fs from 'node:fs/promises'; import path from 'node:path'; import type { Configuration } from '@rspack/core'; import * as utils from '@krutoo/utils/rspack'; -import { emitStoriesEntrypoint } from '@krutoo/showcase/build'; +import { + defineStories, + emitStoriesEntrypoint, + type EmitStoriesEntrypointConfig, +} from '@krutoo/showcase/build'; +import packageJson from './package.json' with { type: 'json' }; +import dotenv from 'dotenv'; -const prod = process.env.NODE_ENV === 'production'; +if (process.env.NODE_ENV) { + dotenv.config({ path: `./.env.${process.env.NODE_ENV}` }); +} await fs.rm('./dist', { recursive: true, force: true }); +await fs.rm('./temp', { recursive: true, force: true }); -await emitStoriesEntrypoint({ +const isProd = process.env.NODE_ENV === 'production'; + +const storiesConfig: EmitStoriesEntrypointConfig = { filename: './.generated/found-stories.js', storiesGlob: './docs/**/*.story.{tsx,mdx}', storiesRootDir: './docs', rawImport: mod => ({ importPath: `!${mod.importPath}?raw` }), -}); +}; -const config: Configuration = { - entry: { - showcase: './src/showcase.tsx', - sandbox: './src/sandbox.tsx', - }, - output: { - filename: prod ? '[name].[contenthash].js' : '[name].js', - publicPath: process.env.PUBLIC_PATH, - }, - devtool: prod ? false : undefined, - resolve: { - alias: { - '#found-stories$': path.resolve(import.meta.dirname, './.generated/found-stories.js'), +await emitStoriesEntrypoint(storiesConfig); + +const config: Configuration[] = [ + { + name: 'server', + target: 'node', + entry: { + index: './src/server.tsx', }, - }, - module: { - rules: [ - { - test: /\.mdx?$/, - loader: '@mdx-js/loader', - options: { - providerImportSource: '@mdx-js/react', - }, + output: { + path: path.resolve(import.meta.dirname, 'temp/server'), + filename: '[name].js', + publicPath: process.env.PUBLIC_PATH ?? '/', + }, + devtool: isProd ? false : undefined, + externals: Object.fromEntries( + Object.entries(packageJson.dependencies).map(([key]) => [key, key]), + ), + externalsPresets: { + node: true, + }, + resolve: { + alias: { + '#found-stories$': path.resolve(import.meta.dirname, storiesConfig.filename), }, + }, + module: { + rules: [ + { + test: /\.mdx?$/, + loader: '@mdx-js/loader', + options: { + providerImportSource: '@mdx-js/react', + }, + }, + ], + }, + plugins: [ + utils.pluginTypeScript(), + utils.pluginCSS({ extract: false }), + utils.pluginPublicFiles(), + utils.pluginRawImport(), + utils.pluginImportMetaEnv(['PUBLIC_PATH', 'TEMPLATES_DIR']), + utils.pluginExec({ script: 'node temp/server/index.js' }), ], + experiments: { + outputModule: true, + }, + devServer: { + static: false, + hot: false, + liveReload: true, + historyApiFallback: true, + devMiddleware: { + writeToDisk: true, + }, + }, }, - plugins: [ - utils.pluginTypeScript(), - utils.pluginCSS(), - utils.pluginPublicFiles(), - utils.pluginRawImport(), - utils.pluginHTML({ - template: './src/index.html', - filename: 'index.html', - chunks: ['showcase'], - }), - utils.pluginHTML({ - template: './src/index.html', - filename: 'sandbox.html', - chunks: ['sandbox'], - }), - ], - experiments: { - css: false, - outputModule: true, - }, - devServer: { - static: false, - hot: false, - liveReload: true, + { + name: 'client', + dependencies: ['server'], + entry: { + showcase: './src/showcase.tsx', + sandbox: './src/sandbox.tsx', + }, + output: { + filename: isProd ? '[name].[contenthash].js' : '[name].js', + publicPath: process.env.PUBLIC_PATH ?? '/', + }, + devtool: isProd ? false : undefined, + resolve: { + alias: { + '#found-stories$': path.resolve(import.meta.dirname, storiesConfig.filename), + }, + }, + module: { + rules: [ + { + test: /\.mdx?$/, + loader: '@mdx-js/loader', + options: { + providerImportSource: '@mdx-js/react', + }, + }, + ], + }, + plugins: [ + utils.pluginTypeScript(), + utils.pluginCSS(), + utils.pluginPublicFiles(), + utils.pluginRawImport(), + utils.pluginImportMetaEnv(['PUBLIC_PATH', 'TEMPLATES_DIR']), + utils.pluginHTML({ + template: path.join(process.env.TEMPLATES_DIR!, '_default.html'), + filename: 'sandbox.html', + chunks: ['sandbox'], + }), + utils.pluginHTML({ + template: path.join(process.env.TEMPLATES_DIR!, '_default.html'), + filename: 'index.html', + chunks: ['showcase'], + }), + ...(await defineStories(storiesConfig)).map(story => + utils.pluginHTML({ + template: path.join(process.env.TEMPLATES_DIR!, `.${story.storyPathname}.html`), + filename: `.${story.storyPathname}/index.html`, + chunks: ['showcase'], + }), + ), + ], + experiments: { + outputModule: true, + }, }, -}; +]; export default config; diff --git a/docs/src/components/app/app.tsx b/docs/src/components/app/app.tsx new file mode 100644 index 0000000..206e208 --- /dev/null +++ b/docs/src/components/app/app.tsx @@ -0,0 +1,46 @@ +import { CodeBlock } from '#components/code-block/code-block'; +import { filterValidStories } from '@krutoo/showcase/runtime'; +import { PathnameRouting, type Router, ShowcaseApp } from '@krutoo/showcase/runtime-showcase'; +import { MDXProvider } from '@mdx-js/react'; +import { withPublicPath } from '../../utils'; +import foundStories from '#found-stories'; +import '@krutoo/showcase/showcase.css'; + +const components = { + pre: CodeBlock, +}; + +export function App({ router }: { router?: Router }) { + return ( + + + + ); +} diff --git a/docs/src/components/helmet/helmet.tsx b/docs/src/components/helmet/helmet.tsx new file mode 100644 index 0000000..684eb9b --- /dev/null +++ b/docs/src/components/helmet/helmet.tsx @@ -0,0 +1,19 @@ +import type { ReactNode } from 'react'; + +export interface HelmetProps { + children?: ReactNode; +} + +export function Helmet({ children }: HelmetProps) { + return ( + + + + + Documentation | @krutoo/showcase + + + {children} + + ); +} diff --git a/docs/src/components/hero/hero.m.css b/docs/src/components/hero/hero.m.css index 61702cc..c6eed6d 100644 --- a/docs/src/components/hero/hero.m.css +++ b/docs/src/components/hero/hero.m.css @@ -53,12 +53,14 @@ transition: transform 200ms ease-out; } -.button.filled { +.button.filled, +.button.filled:hover { background: #343a4a; color: #fff; } -.button.outlined { +.button.outlined, +.button.outlined:hover { background: transparent; color: #343a4a; box-shadow: inset 0 0 0 2px #343a4a; diff --git a/docs/src/components/hero/hero.tsx b/docs/src/components/hero/hero.tsx index 19ecd12..e81183f 100644 --- a/docs/src/components/hero/hero.tsx +++ b/docs/src/components/hero/hero.tsx @@ -1,9 +1,11 @@ import { useContext } from 'react'; -import { ColorSchemesContext } from '@krutoo/showcase/runtime-showcase'; +import { RoutingContext, ColorSchemesContext, Link } from '@krutoo/showcase/runtime-showcase'; +import { withPublicPath } from '../../utils'; import classNames from 'classnames'; import styles from './hero.m.css'; export function Hero() { + const { pathnameToUrl } = useContext(RoutingContext); const { colorScheme } = useContext(ColorSchemesContext); return ( @@ -11,7 +13,11 @@ export function Hero() { Logo

@krutoo/showcase

@@ -21,16 +27,16 @@ export function Hero() {
diff --git a/docs/src/index.html b/docs/src/index.html deleted file mode 100644 index 29e4fcd..0000000 --- a/docs/src/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - Documentation | @krutoo/showcase - - - -
- - diff --git a/docs/src/server.tsx b/docs/src/server.tsx new file mode 100644 index 0000000..652dacb --- /dev/null +++ b/docs/src/server.tsx @@ -0,0 +1,48 @@ +import fs from 'node:fs/promises'; +import path from 'node:path'; +import { renderToString, renderToStaticMarkup } from 'react-dom/server'; +import { filterValidStories } from '@krutoo/showcase/runtime'; +import { BrowserRouter } from '@krutoo/showcase/runtime-showcase'; +import { App } from '#components/app/app'; +import { Helmet } from '#components/helmet/helmet'; +import foundStories from '#found-stories'; +import { withPublicPath } from './utils'; +import './reset.css'; +import './showcase.css'; + +const { validStories } = filterValidStories(foundStories); + +for (const item of validStories) { + const outputPath = path.join(import.meta.env.TEMPLATES_DIR, `.${item.pathname}.html`); + + const router = new BrowserRouter({ + defaultLocation: { + pathname: withPublicPath(`.${item.pathname}`), + search: '', + hash: '', + }, + }); + + const markup = `${renderToString( + +
+ +
+
, + )}`; + + await fs.mkdir(path.dirname(outputPath), { recursive: true }); + await fs.writeFile(outputPath, markup); +} + +// also emit default template with empty root +const outputPath = path.join(import.meta.env.TEMPLATES_DIR, `./_default.html`); + +const markup = `${renderToStaticMarkup( + +
+
, +)}`; + +await fs.mkdir(path.dirname(outputPath), { recursive: true }); +await fs.writeFile(outputPath, markup); diff --git a/docs/src/showcase.css b/docs/src/showcase.css index c908c47..22f6ec8 100644 --- a/docs/src/showcase.css +++ b/docs/src/showcase.css @@ -1,10 +1,3 @@ body { background: var(--showcase-ui-background); } - -@media (prefers-color-scheme: dark) { - body { - background: var(--showcase-ui-background, #1e2227); - color: #fff; - } -} diff --git a/docs/src/showcase.tsx b/docs/src/showcase.tsx index 98aa4bd..6a64907 100644 --- a/docs/src/showcase.tsx +++ b/docs/src/showcase.tsx @@ -1,44 +1,6 @@ import { createRoot } from 'react-dom/client'; -import foundStories from '#found-stories'; -import { filterValidStories } from '@krutoo/showcase/runtime'; -import { ShowcaseApp } from '@krutoo/showcase/runtime-showcase'; -import { MDXProvider } from '@mdx-js/react'; -import { CodeBlock } from '#components/code-block/code-block'; -import '@krutoo/showcase/showcase.css'; +import { App } from '#components/app/app'; import './reset.css'; import './showcase.css'; -const components = { - pre: CodeBlock, -}; - -createRoot(document.getElementById('root')!).render( - - - , -); +createRoot(document.getElementById('root')!).render(); diff --git a/docs/src/typings/global.d.ts b/docs/src/typings/global.d.ts index c2c6355..bbffc6c 100644 --- a/docs/src/typings/global.d.ts +++ b/docs/src/typings/global.d.ts @@ -4,3 +4,12 @@ declare module '#found-stories' { const stories: unknown[]; export default stories; } + +interface ImportMetaEnv { + [key: string]: any; + NODE_ENV?: string; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} diff --git a/docs/src/utils.ts b/docs/src/utils.ts new file mode 100644 index 0000000..9cae26e --- /dev/null +++ b/docs/src/utils.ts @@ -0,0 +1,6 @@ +export function withPublicPath(path: string): string { + const base = import.meta.env.PUBLIC_PATH ?? ''; + const url = new URL(path, new URL(base, 'https://foobar.baz')); + + return `${url.pathname}${url.hash}${url.search}`; +} diff --git a/docs/tsconfig.json b/docs/tsconfig.json index 644939a..9472450 100644 --- a/docs/tsconfig.json +++ b/docs/tsconfig.json @@ -5,6 +5,7 @@ "target": "esnext", "module": "esnext", "moduleResolution": "bundler", + "allowImportingTsExtensions": true, "lib": ["esnext", "DOM", "DOM.Iterable"], "types": ["node"], "noUncheckedIndexedAccess": true, diff --git a/package-lock.json b/package-lock.json index 55f5c07..0862c04 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.0.0", "license": "Apache-2.0", "dependencies": { - "@krutoo/utils": "^0.0.27", + "@krutoo/utils": "^0.0.29", "chokidar": "^4.0.3", "classnames": "^2.5.1", "fast-glob": "^3.3.3", @@ -706,9 +706,9 @@ } }, "node_modules/@krutoo/utils": { - "version": "0.0.27", - "resolved": "https://registry.npmjs.org/@krutoo/utils/-/utils-0.0.27.tgz", - "integrity": "sha512-AqD0XZZdofe7A56EA6CslVwpbHp/buuVuuPS6DQtklvGHOFJ0BHVGJVeHJj3HKyi55NtYc2YFVDfvYtnnoVw4w==", + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@krutoo/utils/-/utils-0.0.29.tgz", + "integrity": "sha512-ckG9LlTUfuMaPq3/vEiuqlFyUWDgcNExhxIrgEjTzq+Bu4Tlb+oUZrSCRSnKFpNxx8fDkPoCroan0e6IKiWyzA==", "license": "Apache-2.0", "engines": { "node": ">=16" diff --git a/package.json b/package.json index 9e4be78..7b34d34 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "typescript": "^5.9.2" }, "dependencies": { - "@krutoo/utils": "^0.0.27", + "@krutoo/utils": "^0.0.29", "chokidar": "^4.0.3", "classnames": "^2.5.1", "fast-glob": "^3.3.3", diff --git a/rspack.config.ts b/rspack.config.ts index a7e86a1..6ff4a76 100644 --- a/rspack.config.ts +++ b/rspack.config.ts @@ -1,6 +1,7 @@ import fs from 'node:fs/promises'; import path from 'node:path'; -import rspack, { type SwcLoaderOptions, type Configuration } from '@rspack/core'; +import { type Configuration } from '@rspack/core'; +import * as utils from '@krutoo/utils/rspack'; import packageJson from './package.json' with { type: 'json' }; async function emitCssModuleExports(data: { @@ -34,56 +35,19 @@ const config: Configuration = { externals: Object.fromEntries( Object.entries(packageJson.dependencies).map(([key]) => [key, key]), ), - resolve: { - extensions: ['.js', '.jsx', '.ts', '.tsx'], - tsConfig: { - configFile: path.resolve(import.meta.dirname, './tsconfig.json'), - }, - }, - module: { - rules: [ - { - test: /\.(js|jsx|ts|tsx)$/, - exclude: /node_modules/, - loader: 'builtin:swc-loader', - options: { - sourceMaps: true, - jsc: { - parser: { - syntax: 'typescript', - tsx: true, - }, - transform: { - react: { - runtime: 'automatic', - }, - }, - }, - } satisfies SwcLoaderOptions, + plugins: [ + utils.pluginTypeScript(), + utils.pluginCSS({ + extract: { + filename: '../css/showcase.css', }, - { - test: /\.css$/i, - use: [ - rspack.CssExtractRspackPlugin.loader, - { - loader: 'css-loader', - options: { - modules: { - auto: /\.(module|m)\.css$/i, - localIdentName: 'showcase__[local]--[hash:4]', - exportLocalsConvention: 'as-is', - namedExport: false, - getJSON: emitCssModuleExports, - }, - }, - }, - ], + cssModules: { + auto: /\.(module|m)\.css$/i, + localIdentName: 'showcase__[local]--[hash:4]', + exportLocalsConvention: 'as-is', + namedExport: false, + getJSON: emitCssModuleExports, }, - ], - }, - plugins: [ - new rspack.CssExtractRspackPlugin({ - filename: '../css/showcase.css', }), ], experiments: { diff --git a/src/typings/css-modules.d.ts b/src/typings/css-modules.d.ts index bf4fbcf..d5ede2a 100644 --- a/src/typings/css-modules.d.ts +++ b/src/typings/css-modules.d.ts @@ -1,4 +1,4 @@ declare module '*.m.css' { - const classes: { [key: string]: string }; - export default classes; + const styles: { [key: string]: string }; + export default styles; }