From 8bf4624a346bd8123722fa2fab71ee7a636d0e3f Mon Sep 17 00:00:00 2001 From: Mega Yu Date: Tue, 28 Apr 2026 14:14:41 +0800 Subject: [PATCH] feat(build): replace gulp static pipeline with vite --- .github/workflows/build-desktop-release.yml | 2 +- .github/workflows/clj-e2e.yml | 2 +- .github/workflows/clj-rtc-e2e.yml | 2 +- .github/workflows/deploy-and-branch.yml | 2 +- .github/workflows/deploy-db-test-pages.yml | 2 +- .github/workflows/deploy-sync-test.yml | 2 +- gulpfile.js | 317 ------- package.json | 61 +- pnpm-lock.yaml | 879 +------------------- postcss.config.js | 10 - scripts/static-pipeline.mjs | 158 ++++ vite.config.assets.ts | 164 ++++ vite.config.css.ts | 137 +++ 13 files changed, 520 insertions(+), 1218 deletions(-) delete mode 100644 gulpfile.js delete mode 100644 postcss.config.js create mode 100644 scripts/static-pipeline.mjs create mode 100644 vite.config.assets.ts create mode 100644 vite.config.css.ts diff --git a/.github/workflows/build-desktop-release.yml b/.github/workflows/build-desktop-release.yml index 8bbf05163e..180d3ba910 100644 --- a/.github/workflows/build-desktop-release.yml +++ b/.github/workflows/build-desktop-release.yml @@ -135,7 +135,7 @@ jobs: echo "ENABLE_FILE_SYNC_PRODUCTION=${{ github.event_name == 'schedule' || github.event.inputs.enable-file-sync-production == 'true' }}" >> $GITHUB_ENV - name: Compile CLJS - run: pnpm install --frozen-lockfile && gulp build && pnpm cljs:release-electron && pnpm vite:workers-build + run: pnpm install --frozen-lockfile && pnpm static:build && pnpm cljs:release-electron && pnpm vite:workers-build env: LOGSEQ_SENTRY_DSN: ${{ secrets.LOGSEQ_SENTRY_DSN }} LOGSEQ_POSTHOG_TOKEN: ${{ secrets.LOGSEQ_POSTHOG_TOKEN }} diff --git a/.github/workflows/clj-e2e.yml b/.github/workflows/clj-e2e.yml index 244ee73e8c..91cfcf2f62 100644 --- a/.github/workflows/clj-e2e.yml +++ b/.github/workflows/clj-e2e.yml @@ -90,7 +90,7 @@ jobs: # NOTE: require the app to be build with DEV-RELEASE flag - name: Prepare E2E test build run: | - pnpm gulp:build && clojure -M:cljs release app db-worker --config-merge "{:closure-defines {frontend.config/DEV-RELEASE true}}" --debug && pnpm vite:app-build && pnpm vite:workers-build + pnpm static:build && clojure -M:cljs release app db-worker --config-merge "{:closure-defines {frontend.config/DEV-RELEASE true}}" --debug && pnpm vite:app-build && pnpm vite:workers-build - name: Run e2e tests run: cd clj-e2e && timeout 30m bb dev diff --git a/.github/workflows/clj-rtc-e2e.yml b/.github/workflows/clj-rtc-e2e.yml index a351783990..4078f7cceb 100644 --- a/.github/workflows/clj-rtc-e2e.yml +++ b/.github/workflows/clj-rtc-e2e.yml @@ -91,7 +91,7 @@ jobs: # NOTE: require the app to be build with DEV-RELEASE flag - name: Prepare E2E test build run: | - pnpm gulp:build && clojure -M:cljs release app db-worker --config-merge "{:closure-defines {frontend.config/DEV-RELEASE true}}" --debug && pnpm vite:app-build && pnpm vite:workers-build + pnpm static:build && clojure -M:cljs release app db-worker --config-merge "{:closure-defines {frontend.config/DEV-RELEASE true}}" --debug && pnpm vite:app-build && pnpm vite:workers-build - name: Upload build artifact uses: actions/upload-artifact@v4 diff --git a/.github/workflows/deploy-and-branch.yml b/.github/workflows/deploy-and-branch.yml index 9d9da8a464..cd08d6f9ac 100644 --- a/.github/workflows/deploy-and-branch.yml +++ b/.github/workflows/deploy-and-branch.yml @@ -55,7 +55,7 @@ jobs: - name: Build web + workers run: | - pnpm gulp:build + pnpm static:build clojure -M:cljs release app db-worker \ --config-merge '{:compiler-options {:source-map true :source-map-include-sources-content true :source-map-detail-level :symbols}}' pnpm vite:app-build diff --git a/.github/workflows/deploy-db-test-pages.yml b/.github/workflows/deploy-db-test-pages.yml index 14e36a0616..48285a75dc 100644 --- a/.github/workflows/deploy-db-test-pages.yml +++ b/.github/workflows/deploy-db-test-pages.yml @@ -61,7 +61,7 @@ jobs: - name: Build Released-Web run: | - pnpm gulp:build && clojure -M:cljs release app db-worker --config-merge '{:compiler-options {:source-map true :source-map-include-sources-content true :source-map-detail-level :symbols}}' && pnpm vite:app-build && pnpm vite:workers-build + pnpm static:build && clojure -M:cljs release app db-worker --config-merge '{:compiler-options {:source-map true :source-map-include-sources-content true :source-map-detail-level :symbols}}' && pnpm vite:app-build && pnpm vite:workers-build rsync -avz --exclude node_modules --exclude android --exclude ios --exclude mobile ./static/ ./public/ ls -lR ./public && mkdir r2 && mv ./public/js/main.js.map ./r2/db-test.main.js.map sed -i 's/=main.js.map/=https:\/\/assets.logseq.io\/db-test.main.js.map/g' ./public/js/main.js diff --git a/.github/workflows/deploy-sync-test.yml b/.github/workflows/deploy-sync-test.yml index f56cb18248..2855379b19 100644 --- a/.github/workflows/deploy-sync-test.yml +++ b/.github/workflows/deploy-sync-test.yml @@ -55,7 +55,7 @@ jobs: - name: Build web + workers run: | - pnpm gulp:build + pnpm static:build clojure -M:cljs release app db-worker \ --config-merge '{:compiler-options {:source-map true :source-map-include-sources-content true :source-map-detail-level :symbols}}' pnpm vite:app-build diff --git a/gulpfile.js b/gulpfile.js deleted file mode 100644 index ed524f0938..0000000000 --- a/gulpfile.js +++ /dev/null @@ -1,317 +0,0 @@ -const fs = require('fs') -const utils = require('util') -const cp = require('child_process') -const exec = utils.promisify(cp.exec) -const path = require('path') -const gulp = require('gulp') -const replace = require('gulp-replace') - -const outputPath = path.join(__dirname, 'static') -const outputJsPath = path.join(outputPath, 'js') -const resourcesPath = path.join(__dirname, 'resources') -const publicRootPath = path.join(__dirname, 'public') -const mobilePath = path.join(outputPath, 'mobile') -const mobileJsPath = path.join(mobilePath, 'js') -const sourcePath = path.join(__dirname, 'src/main/frontend') -const resourceFilePath = path.join(resourcesPath, '**') -const outputFilePath = path.join(outputPath, '**') -const rawCopySrc = (globs, options = {}) => - gulp.src(globs, { encoding: false, ...options }) -const staticCleanKeep = new Set([ - 'entitlements.plist', - 'node_modules', - 'package.json', - 'pnpm-lock.yaml', -]) - -const css = { - watchCSS () { - return cp.spawn(`pnpm css:watch`, { - shell: true, - stdio: 'inherit', - }) - }, - - watchMobileCSS () { - return cp.spawn(`pnpm css:mobile-watch`, { - shell: true, - stdio: 'inherit', - }) - }, - - buildCSS (...params) { - return gulp.series( - () => exec(`pnpm css:build`, {}), - css._optimizeCSSForRelease, - )(...params) - }, - - buildMobileCSS (...params) { - return gulp.series( - () => exec(`pnpm css:mobile-build`, {}), - )(...params) - }, - - _optimizeCSSForRelease () { - return gulp.src(path.join(outputPath, 'css', 'style.css')). - pipe(gulp.dest(path.join(outputPath, 'css'))) - }, -} - -const common = { - clean () { - if (!fs.existsSync(outputPath)) { - fs.mkdirSync(outputPath, { recursive: true }) - } - - for (const entry of fs.readdirSync(outputPath)) { - if (staticCleanKeep.has(entry)) continue - fs.rmSync(path.join(outputPath, entry), { - recursive: true, - force: true, - maxRetries: 10, - retryDelay: 100, - }) - } - return Promise.resolve() - }, - - syncResourceFile () { - return rawCopySrc(resourceFilePath).pipe(gulp.dest(outputPath)) - }, - - // NOTE: All assets from node_modules are copied to the output directory - syncAssetFiles (...params) { - return gulp.series( - () => rawCopySrc([ - 'node_modules/katex/dist/katex.min.js', - 'node_modules/katex/dist/contrib/mhchem.min.js', - 'node_modules/html2canvas/dist/html2canvas.min.js', - 'node_modules/interactjs/dist/interact.min.js', - 'node_modules/photoswipe/dist/umd/*.js', - 'node_modules/marked/lib/marked.umd.js', - 'node_modules/@highlightjs/cdn-assets/highlight.min.js', - 'node_modules/@isomorphic-git/lightning-fs/dist/lightning-fs.min.js', - 'packages/ui/dist/ui.js', - 'node_modules/@sqlite.org/sqlite-wasm/dist/sqlite3.wasm', - 'node_modules/react/umd/react.production.min.js', - 'node_modules/react/umd/react.development.js', - 'node_modules/react-dom/umd/react-dom.production.min.js', - 'node_modules/react-dom/umd/react-dom.development.js', - 'node_modules/prop-types/prop-types.min.js', - 'node_modules/dompurify/dist/purify.js', - ]).pipe(gulp.dest(path.join(outputPath, 'js'))), - () => gulp.src([ - 'node_modules/@tabler/icons-react/dist/umd/tabler-icons-react.min.js', - ]). - pipe(replace('"@tabler/icons-react"]={},a.react,', - '"tablerIcons"]={},a.React,')). - pipe(gulp.dest(path.join(outputPath, 'js'))), - () => rawCopySrc([ - 'node_modules/@glidejs/glide/dist/glide.min.js', - 'node_modules/@glidejs/glide/dist/css/glide.core.min.css', - 'node_modules/@glidejs/glide/dist/css/glide.theme.min.css', - ]).pipe(gulp.dest(path.join(outputPath, 'js', 'glide'))), - () => rawCopySrc([ - 'node_modules/pdfjs-dist/legacy/build/pdf.mjs', - 'node_modules/pdfjs-dist/legacy/build/pdf.worker.mjs', - 'node_modules/pdfjs-dist/legacy/web/pdf_viewer.mjs', - ]).pipe(gulp.dest(path.join(outputPath, 'js', 'pdfjs'))), - () => rawCopySrc([ - 'node_modules/pdfjs-dist/cmaps/*.*', - ]).pipe(gulp.dest(path.join(outputPath, 'js', 'pdfjs', 'cmaps'))), - () => rawCopySrc([ - 'node_modules/inter-ui/inter.css', - ]).pipe(gulp.dest(path.join(outputPath, 'css'))), - () => rawCopySrc('node_modules/inter-ui/web/*.*'). - pipe(gulp.dest(path.join(outputPath, 'css', 'web'))), - () => rawCopySrc([ - 'node_modules/katex/dist/fonts/*.woff2', - ]).pipe(gulp.dest(path.join(outputPath, 'css', 'fonts'))), - () => rawCopySrc([ - 'node_modules/katex/dist/katex.min.js', - 'node_modules/katex/dist/contrib/mhchem.min.js', - 'node_modules/marked/lib/marked.umd.js', - 'node_modules/@highlightjs/cdn-assets/highlight.min.js', - 'node_modules/@isomorphic-git/lightning-fs/dist/lightning-fs.min.js', - 'node_modules/react/umd/react.production.min.js', - 'node_modules/react/umd/react.development.js', - 'node_modules/react-dom/umd/react-dom.production.min.js', - 'node_modules/react-dom/umd/react-dom.development.js', - 'node_modules/prop-types/prop-types.min.js', - 'node_modules/interactjs/dist/interact.min.js', - 'node_modules/photoswipe/dist/umd/*.js', - 'packages/ui/dist/ui.js', - 'node_modules/@sqlite.org/sqlite-wasm/dist/sqlite3.wasm', - ]).pipe(gulp.dest(path.join(outputPath, 'mobile', 'js'))), - () => rawCopySrc([ - 'node_modules/inter-ui/inter.css', - ]).pipe(gulp.dest(path.join(outputPath, 'mobile', 'css'))), - () => rawCopySrc('node_modules/inter-ui/web/*.*'). - pipe(gulp.dest(path.join(outputPath, 'mobile', 'css', 'web'))), - () => rawCopySrc([ - 'node_modules/katex/dist/fonts/*.woff2', - ]).pipe(gulp.dest(path.join(outputPath, 'mobile', 'css', 'fonts'))), - )(...params) - }, - - keepSyncResourceFile () { - return gulp.watch(resourceFilePath, { ignoreInitial: true }, - common.syncResourceFile) - }, - - syncAllStatic () { - return rawCopySrc([ - outputFilePath, - '!' + path.join(outputPath, 'node_modules/**'), - '!' + path.join(outputPath, 'mobile/**'), - '!' + path.join(outputPath, 'android/**'), - '!' + path.join(outputPath, 'ios/**'), - ]).pipe(gulp.dest(publicRootPath)) - }, - - syncJS_CSSinRt () { - return gulp.src([ - path.join(outputPath, 'js/**'), - path.join(outputPath, 'css/**'), - ], { base: outputPath }).pipe(gulp.dest(publicRootPath)) - }, - - keepSyncStaticInRt () { - return gulp.watch([ - path.join(outputPath, 'js/**'), - path.join(outputPath, 'css/**'), - ], { ignoreInitial: true }, common.syncJS_CSSinRt) - }, - - syncWorkersToMobile () { - return gulp.src([ - path.join(outputPath, 'js/db-worker.js'), - ], { base: outputJsPath }).pipe(gulp.dest(mobileJsPath)) - }, - - keepSyncWorkersToMobile () { - return gulp.watch([ - path.join(outputPath, 'js/db-worker.js'), - ], { ignoreInitial: false }, common.syncWorkersToMobile) - }, - - async runCapWithLocalDevServerEntry (cb) { - const mode = process.env.PLATFORM || 'ios' - - const LOGSEQ_APP_SERVER_URL = `http://localhost:3002` - - if (typeof global.fetch === 'function') { - try { - await fetch(LOGSEQ_APP_SERVER_URL) - } catch (e) { - return cb(new Error( - `/* ❌ Please check if the service is ON. (${LOGSEQ_APP_SERVER_URL}) ❌ */`)) - } - } - - console.log(`------ Cap ${mode.toUpperCase()} -----`) - console.log(`Dev serve at: ${LOGSEQ_APP_SERVER_URL}`) - console.log(`--------------------------------------`) - - cp.execSync(`pnpm exec cap sync ${mode}`, { - stdio: 'inherit', - env: Object.assign(process.env, { - LOGSEQ_APP_SERVER_URL, - }), - }) - - cp.execSync(`rm -rf ios/App/App/public/out`, { - stdio: 'inherit', - }) - - cp.execSync(`pnpm exec cap run ${mode}`, { - stdio: 'inherit', - env: Object.assign(process.env, { - LOGSEQ_APP_SERVER_URL, - }), - }) - - cb() - }, - - switchReactDevelopmentMode (cb) { - try { - const reactFrom = path.join(outputPath, 'js', 'react.development.js') - const reactTo = path.join(outputPath, 'js', 'react.production.min.js') - fs.renameSync(reactFrom, reactTo) - - const reactDomFrom = path.join(outputPath, 'js', - 'react-dom.development.js') - const reactDomTo = path.join(outputPath, 'js', - 'react-dom.production.min.js') - fs.renameSync(reactDomFrom, reactDomTo) - - cb() - } catch (err) { - console.error('Error during switchReactDevelopmentMode:', err) - cb(err) - } - }, -} - -exports.electron = () => { - if (!fs.existsSync(path.join(outputPath, 'node_modules'))) { - cp.execSync('pnpm install --frozen-lockfile', { - cwd: outputPath, - stdio: 'inherit', - }) - } - - cp.execSync('pnpm electron:dev', { - cwd: outputPath, - stdio: 'inherit', - }) -} - -exports.electronMaker = async () => { - cp.execSync('pnpm cljs:release-electron', { - stdio: 'inherit', - }) - - const pkgPath = path.join(outputPath, 'package.json') - const pkg = require(pkgPath) - const version = fs.readFileSync( - path.join(__dirname, 'src/main/frontend/version.cljs')). - toString(). - match(/[0-9.]{3,}/)[0] - - if (!version) { - throw new Error('release version error in src/**/*/version.cljs') - } - - pkg.version = version - fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2)) - - if (!fs.existsSync(path.join(outputPath, 'node_modules'))) { - cp.execSync('pnpm install --frozen-lockfile', { - cwd: outputPath, - stdio: 'inherit', - }) - } - - cp.execSync('pnpm electron:make', { - cwd: outputPath, - stdio: 'inherit', - }) -} - -exports.cap = common.runCapWithLocalDevServerEntry -exports.clean = common.clean -exports.watch = gulp.series( - common.syncResourceFile, - common.syncAssetFiles, common.switchReactDevelopmentMode, - gulp.parallel(common.keepSyncResourceFile, css.watchCSS)) -exports.watchMobile = gulp.series( - common.syncResourceFile, common.syncAssetFiles, - gulp.parallel(common.keepSyncResourceFile, common.keepSyncWorkersToMobile, css.watchMobileCSS)) -exports.build = gulp.series(common.clean, common.syncResourceFile, - common.syncAssetFiles, css.buildCSS) -exports.buildMobile = gulp.series(common.clean, common.syncResourceFile, - common.syncAssetFiles, css.buildMobileCSS) -exports.syncWorkersToMobile = common.syncWorkersToMobile diff --git a/package.json b/package.json index 0bd8abde91..395bf23206 100644 --- a/package.json +++ b/package.json @@ -19,13 +19,9 @@ "better-sqlite3": "^12.8.0", "cross-env": "^10.1.0", "cssnano": "^7.1.3", - "gulp": "^5.0.1", - "gulp-postcss": "^10.0.0", - "gulp-replace": "^1.1.4", "npm-run-all2": "^8.0.4", "playwright": "=1.58.2", "postcss": "^8.5.8", - "postcss-cli": "11.0.1", "postcss-import": "16.1.1", "postcss-import-ext-glob": "2.1.1", "postcss-nested": "7.0.2", @@ -38,22 +34,30 @@ "tailwindcss-animate": "^1.0.7", "typescript": "^5.9.3", "vite": "^8.0.9", + "vite-plugin-static-copy": "4.1.0", "ws": "^8.19.0" }, "scripts": { - "watch": "run-p gulp:watch cljs:watch vite:app-watch vite:workers-watch", - "electron-watch": "run-p gulp:watch cljs:electron-watch vite:app-watch vite:workers-watch", - "app-watch": "run-p gulp:watch cljs:app-watch vite:app-watch vite:workers-watch", - "mobile-watch": "run-p gulp:mobile-watch cljs:mobile-watch vite:mobile-watch vite:workers-mobile-watch", + "watch": "run-p static:watch cljs:watch vite:app-watch vite:workers-watch", + "electron-watch": "run-p static:watch cljs:electron-watch vite:app-watch vite:workers-watch", + "app-watch": "run-p static:watch cljs:app-watch vite:app-watch vite:workers-watch", + "mobile-watch": "run-p static:mobile-watch cljs:mobile-watch vite:mobile-watch vite:workers-mobile-watch", "publishing-watch": "run-p cljs:publishing-watch vite:publishing-watch", - "dev": "run-p gulp:watch gulp:mobile-watch cljs:dev-watch vite:app-watch vite:mobile-watch vite:workers-watch vite:workers-mobile-watch", - "release": "run-s gulp:build cljs:release vite:workers-build", - "release-app": "run-s gulp:build cljs:release-app vite:workers-build", - "release-mobile": "run-s gulp:buildMobile cljs:release-mobile gulp:syncWorkersToMobile vite:workers-mobile-build", - "dev-release-app": "run-s gulp:build cljs:dev-release-app vite:workers-build", - "dev-electron-app": "gulp electron", - "release-electron": "run-s gulp:build && pnpm vite:workers-build && gulp electronMaker", + "dev": "run-p vite:assets-watch:dev vite:css-watch vite:css-mobile-watch cljs:dev-watch vite:app-watch vite:mobile-watch vite:workers-watch vite:workers-mobile-watch", + "release": "run-s static:build cljs:release vite:workers-build", + "release-app": "run-s static:build cljs:release-app vite:workers-build", + "release-mobile": "run-s static:mobile-build cljs:release-mobile static:sync-workers-to-mobile vite:workers-mobile-build", + "dev-release-app": "run-s static:build cljs:dev-release-app vite:workers-build", + "dev-electron-app": "node scripts/static-pipeline.mjs electron", + "release-electron": "run-s static:build electron:make", "debug-electron": "cd static/ && pnpm electron:debug", + "vite:assets-watch": "pnpm exec vite build --watch --config vite.config.assets.ts", + "vite:assets-watch:dev": "cross-env LOGSEQ_REACT_DEV_ASSETS=true pnpm exec vite build --watch --config vite.config.assets.ts", + "vite:assets-build": "cross-env NODE_ENV=production pnpm exec vite build --config vite.config.assets.ts", + "vite:css-watch": "cross-env TAILWIND_MODE=watch LOGSEQ_CSS_TARGET=desktop pnpm exec vite build --watch --config vite.config.css.ts", + "vite:css-build": "cross-env NODE_ENV=production LOGSEQ_CSS_TARGET=desktop pnpm exec vite build --config vite.config.css.ts", + "vite:css-mobile-watch": "cross-env TAILWIND_MODE=watch LOGSEQ_CSS_TARGET=mobile pnpm exec vite build --watch --config vite.config.css.ts", + "vite:css-mobile-build": "cross-env NODE_ENV=production LOGSEQ_CSS_TARGET=mobile pnpm exec vite build --config vite.config.css.ts", "vite:workers-watch": "run-s vite:prepare vite:workers-watch:bridge", "vite:workers-watch:bridge": "pnpm exec vite build --watch --config vite.config.workers.ts", "vite:workers-build": "run-s vite:prepare vite:workers-build:bridge", @@ -77,21 +81,22 @@ "vite:publishing-build:bridge": "cross-env NODE_ENV=production pnpm exec vite build --config vite.config.publishing.ts", "sync-android-release": "pnpm clean && pnpm release-mobile && rm -rf ./static/mobile/**/*.map && pnpm exec cap sync android", "sync-ios-release": "pnpm clean && pnpm release-mobile && rm -rf ./static/mobile/**/*.map && pnpm exec cap sync ios", - "clean": "gulp clean", + "clean": "node scripts/static-pipeline.mjs clean", "test": "run-s cljs:test cljs:run-test", "test:node-adapter": "pnpm --dir deps/db-sync run test:node-adapter", "report": "run-s cljs:report", "style:lint": "stylelint \"src/**/*.css\"", - "gulp:watch": "gulp watch", - "gulp:build": "cross-env NODE_ENV=production gulp build", - "gulp:buildMobile": "cross-env NODE_ENV=production gulp buildMobile", - "gulp:syncWorkersToMobile": "gulp syncWorkersToMobile", - "css:build": "postcss tailwind.all.css -o static/css/style.css --verbose --env production", - "css:watch": "cross-env TAILWIND_MODE=watch postcss tailwind.all.css -o static/css/style.css --verbose --watch", + "static:watch": "run-p vite:assets-watch:dev vite:css-watch", + "static:mobile-watch": "run-p vite:assets-watch vite:css-mobile-watch", + "static:build": "run-s clean vite:assets-build vite:css-build", + "static:mobile-build": "run-s clean vite:assets-build vite:css-mobile-build", + "static:sync-workers-to-mobile": "node scripts/static-pipeline.mjs sync-workers-to-mobile", + "electron:make": "node scripts/static-pipeline.mjs electron-maker", + "css:build": "pnpm vite:css-build", + "css:watch": "pnpm vite:css-watch", "cljs:watch": "clojure -M:cljs watch app db-worker electron", - "gulp:mobile-watch": "gulp watchMobile", - "css:mobile-build": "postcss tailwind.mobile.css -o static/mobile/css/style.css --verbose --env production", - "css:mobile-watch": "cross-env TAILWIND_MODE=watch postcss tailwind.mobile.css -o static/mobile/css/style.css --verbose --watch", + "css:mobile-build": "pnpm vite:css-mobile-build", + "css:mobile-watch": "pnpm vite:css-mobile-watch", "cljs:mobile-watch": "clojure -M:cljs watch mobile db-worker --config-merge \"{:asset-path \\\"/static/mobile/js\\\" :release {:asset-path \\\"http://localhost\\\"}}\"", "cljs:release-mobile": "run-s cljs:release-mobile:shadow vite:mobile-build", "cljs:release-mobile:shadow": "clojure -M:cljs release mobile db-worker --config-merge \"{:asset-path \\\"/static/mobile/js\\\" :release {:asset-path \\\"http://localhost\\\"}}\"", @@ -120,8 +125,8 @@ "cljs:report": "clojure -M:cljs run shadow.cljs.build-report app db-worker report.html", "cljs:build-electron": "clojure -A:cljs compile app db-worker electron", "cljs:lint": "clojure -M:clj-kondo --parallel --lint src --cache false", - "ios:dev": "cross-env PLATFORM=ios gulp cap", - "android:dev": "cross-env PLATFORM=android gulp cap", + "ios:dev": "cross-env PLATFORM=ios node scripts/static-pipeline.mjs cap", + "android:dev": "cross-env PLATFORM=android node scripts/static-pipeline.mjs cap", "ui:build": "pnpm --dir packages/ui install", "postinstall": "pnpm ui:build" }, @@ -194,9 +199,9 @@ "react-transition-group": "4.4.5", "react-virtuoso": "4.18.3", "remove-accents": "0.5.0", - "tiny-pinyin": "1.3.2", "sanitize-filename": "1.6.4", "send-intent": "^7.0.0", + "tiny-pinyin": "1.3.2", "url": "^0.11.4", "util": "^0.12.5" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 39668f76b3..a3da6a4dda 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -280,15 +280,6 @@ importers: cssnano: specifier: ^7.1.3 version: 7.1.3(postcss@8.5.8) - gulp: - specifier: ^5.0.1 - version: 5.0.1 - gulp-postcss: - specifier: ^10.0.0 - version: 10.0.0(jiti@1.21.7)(postcss@8.5.8) - gulp-replace: - specifier: ^1.1.4 - version: 1.1.4 npm-run-all2: specifier: ^8.0.4 version: 8.0.4 @@ -298,9 +289,6 @@ importers: postcss: specifier: ^8.5.8 version: 8.5.8 - postcss-cli: - specifier: 11.0.1 - version: 11.0.1(jiti@1.21.7)(postcss@8.5.8) postcss-import: specifier: 16.1.1 version: 16.1.1(postcss@8.5.8) @@ -337,6 +325,9 @@ importers: vite: specifier: ^8.0.9 version: 8.0.9(@types/node@24.2.0)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.0) + vite-plugin-static-copy: + specifier: 4.1.0 + version: 4.1.0(vite@8.0.9(@types/node@24.2.0)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.0)) ws: specifier: ^8.19.0 version: 8.19.0 @@ -587,14 +578,6 @@ packages: '@glidejs/glide@3.7.1': resolution: {integrity: sha512-8he0pZpLSqTesSFYiuWdhBmtdlYSPWxfPUCKtkkiX6ZmT8UdMdmoFPtJaOwLBXv4p2JiGxqbuPdiRGGo2e/htQ==} - '@gulpjs/messages@1.1.0': - resolution: {integrity: sha512-Ys9sazDatyTgZVb4xPlDufLweJ/Os2uHWOv+Caxvy2O85JcnT4M3vc73bi8pdLWlv3fdWQz3pdI9tVwo8rQQSg==} - engines: {node: '>=10.13.0'} - - '@gulpjs/to-absolute-glob@4.0.0': - resolution: {integrity: sha512-kjotm7XJrJ6v+7knhPaRgaT6q8F8K2jiafwYdNHLzmV0uGLuZY43FK6smNSHUPrhq5kX2slCUy+RGG/xGqmIKA==} - engines: {node: '>=10.13.0'} - '@highlightjs/cdn-assets@11.11.1': resolution: {integrity: sha512-VEPdHzwelZ12hEX18BHduqxMZGolcUsrbeokHYxOUIm8X2+M7nx5QPtPeQgRxR9XjhdLv4/7DD5BWOlSrJ3k7Q==} engines: {node: '>=12.0.0'} @@ -1222,9 +1205,6 @@ packages: '@types/earcut@2.1.4': resolution: {integrity: sha512-qp3m9PPz4gULB9MhjGID7wpo3gJ4bTGXm7ltNDsmOvsPduTeHp8wSW9YckBj3mljeOh4F0m2z/0JKAALRKbmLQ==} - '@types/expect@1.20.4': - resolution: {integrity: sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==} - '@types/fs-extra@8.1.5': resolution: {integrity: sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==} @@ -1252,9 +1232,6 @@ packages: '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} - '@types/vinyl@2.0.12': - resolution: {integrity: sha512-Sr2fYMBUVGYq8kj3UthXFAu5UN6ZW+rYr4NACjZQJvHvj+c8lYv0CahmZ2P/r7iUkN44gGUBwqxZkrKXYPb7cw==} - '@xml-tools/parser@1.0.11': resolution: {integrity: sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==} @@ -1297,10 +1274,6 @@ packages: ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - ansi-colors@1.1.0: - resolution: {integrity: sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==} - engines: {node: '>=0.10.0'} - ansi-regex@2.1.1: resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} engines: {node: '>=0.10.0'} @@ -1329,10 +1302,6 @@ packages: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} - ansi-wrap@0.1.0: - resolution: {integrity: sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==} - engines: {node: '>=0.10.0'} - any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -1354,17 +1323,9 @@ packages: arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - array-each@1.0.1: - resolution: {integrity: sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==} - engines: {node: '>=0.10.0'} - array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - array-slice@1.1.0: - resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==} - engines: {node: '>=0.10.0'} - array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -1380,14 +1341,6 @@ packages: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} - async-done@2.0.0: - resolution: {integrity: sha512-j0s3bzYq9yKIVLKGE/tWlCpa3PfFLcrDZLTSVdnnCTGagXuXBJO4SsY9Xdk/fQBirCkH4evW5xOeJXqlAQFdsw==} - engines: {node: '>= 10.13.0'} - - async-settle@2.0.0: - resolution: {integrity: sha512-Obu/KE8FurfQRN6ODdHN9LuXqwC+JFIM9NRyZqJJ4ZfLJmIYN9Rg0/kb+wF70VV5+fJusTMQlJ1t5rF7J/ETdg==} - engines: {node: '>= 10.13.0'} - at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} @@ -1410,10 +1363,6 @@ packages: b4a@1.6.7: resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} - bach@2.0.1: - resolution: {integrity: sha512-A7bvGMGiTOxGMpNupYl9HQTf0FFDNF4VCmks4PJpFyN1AX2pdKuxuwdvUz2Hu388wcgp+OvGFNsumBfFNkR7eg==} - engines: {node: '>=10.13.0'} - bail@1.0.5: resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} @@ -1485,19 +1434,12 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - binaryextensions@2.3.0: - resolution: {integrity: sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==} - engines: {node: '>=0.8'} - bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - bl@5.1.0: - resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} - boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -1637,10 +1579,6 @@ packages: resolution: {integrity: sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==} engines: {node: '>=6'} - clone@2.1.2: - resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} - engines: {node: '>=0.8'} - code-point-at@1.1.0: resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} engines: {node: '>=0.10.0'} @@ -1784,10 +1722,6 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - copy-props@4.0.0: - resolution: {integrity: sha512-bVWtw1wQLzzKiYROtvNlbJgxgBYt2bMJpkCbKmXM3xyijvcjjWXEk5nyrrT3bgJ7ODb19ZohE2T0Y3FgNPyoTw==} - engines: {node: '>= 10.13.0'} - core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -1952,14 +1886,6 @@ packages: delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - dependency-graph@1.0.0: - resolution: {integrity: sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==} - engines: {node: '>=4'} - - detect-file@1.0.0: - resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} - engines: {node: '>=0.10.0'} - detect-libc@2.0.4: resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} @@ -2034,10 +1960,6 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - each-props@3.0.0: - resolution: {integrity: sha512-IYf1hpuWrdzse/s/YJOrFmU15lyhSzxelNVAHTEG3DtP4QsLTWZUzcUL3HMXmKQxXpa4EIrBPpwRgj0aehdvAw==} - engines: {node: '>= 10.13.0'} - earcut@2.2.4: resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==} @@ -2126,17 +2048,9 @@ packages: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} - expand-tilde@2.0.2: - resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} - engines: {node: '>=0.10.0'} - extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - fancy-log@2.0.0: - resolution: {integrity: sha512-9CzxZbACXMUXW13tS0tI8XsGGmxWzO2DmYrGuBJOJ8k8q2K7hwfJA5qHjuPPe8wtsco33YR9wc+Rlr5wYFvhSA==} - engines: {node: '>=10.13.0'} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2147,9 +2061,6 @@ packages: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} - fast-levenshtein@3.0.0: - resolution: {integrity: sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==} - fast-sort@3.4.1: resolution: {integrity: sha512-76uvGPsF6So53sZAqenP9UVT3p5l7cyTHkLWVCMinh41Y8NDrK1IYXJgaBMfc1gk7nJiSRZp676kddFG2Aa5+A==} @@ -2204,18 +2115,6 @@ packages: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} - findup-sync@5.0.0: - resolution: {integrity: sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==} - engines: {node: '>= 10.13.0'} - - fined@2.0.0: - resolution: {integrity: sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==} - engines: {node: '>= 10.13.0'} - - flagged-respawn@2.0.0: - resolution: {integrity: sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==} - engines: {node: '>= 10.13.0'} - flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -2227,14 +2126,6 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} - for-in@1.0.2: - resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} - engines: {node: '>=0.10.0'} - - for-own@1.0.0: - resolution: {integrity: sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==} - engines: {node: '>=0.10.0'} - foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} @@ -2265,10 +2156,6 @@ packages: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} - fs-mkdirp-stream@2.0.1: - resolution: {integrity: sha512-UTOY+59K6IA94tec8Wjqm0FSh5OVudGNB0NL/P6fB3HiE3bYOY3VYBGijsnOHNkQSwC1FKkU77pmq7xp9CskLw==} - engines: {node: '>=10.13.0'} - fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -2359,14 +2246,6 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob-stream@8.0.3: - resolution: {integrity: sha512-fqZVj22LtFJkHODT+M4N1RJQ3TjnnQhfE9GwZI8qXscYarnhpip70poMldRnP8ipQ/w0B621kOhfc53/J9bd/A==} - engines: {node: '>=10.13.0'} - - glob-watcher@6.0.0: - resolution: {integrity: sha512-wGM28Ehmcnk2NqRORXFOTOR064L4imSw3EeOqU5bIwUf62eXGwg89WivH6VMahL8zlQHeodzvHpXplrqzrz3Nw==} - engines: {node: '>= 10.13.0'} - glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me @@ -2387,18 +2266,10 @@ packages: engines: {node: '>=16 || 14 >=14.17'} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - global-modules@1.0.0: - resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} - engines: {node: '>=0.10.0'} - global-modules@2.0.0: resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} engines: {node: '>=6'} - global-prefix@1.0.2: - resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} - engines: {node: '>=0.10.0'} - global-prefix@3.0.0: resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} engines: {node: '>=6'} @@ -2410,10 +2281,6 @@ packages: globjoin@0.1.4: resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} - glogg@2.2.0: - resolution: {integrity: sha512-eWv1ds/zAlz+M1ioHsyKJomfY7jbDDPpwSkv14KQj89bycx1nvK5/2Cj/T9g7kzJcX5Bc7Yv22FjfBZS/jl94A==} - engines: {node: '>= 10.13.0'} - gonzales-pe@4.3.0: resolution: {integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==} engines: {node: '>=0.6.0'} @@ -2438,30 +2305,6 @@ packages: peerDependencies: graphology-types: '>=0.19.0' - gulp-cli@3.1.0: - resolution: {integrity: sha512-zZzwlmEsTfXcxRKiCHsdyjZZnFvXWM4v1NqBJSYbuApkvVKivjcmOS2qruAJ+PkEHLFavcDKH40DPc1+t12a9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - - gulp-postcss@10.0.0: - resolution: {integrity: sha512-z1RF2RJEX/BvFsKN11PXai8lRmihZTiHnlJf7Zu8uHaA/Q7Om4IeN8z1NtMAW5OiLwUY02H0DIFl9tHl0CNSgA==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.0.0 - - gulp-replace@1.1.4: - resolution: {integrity: sha512-SVSF7ikuWKhpAW4l4wapAqPPSToJoiNKsbDoUnRrSgwZHH7lH8pbPeQj1aOVYQrbZKhfSVBxVW+Py7vtulRktw==} - engines: {node: '>=10'} - - gulp@5.0.1: - resolution: {integrity: sha512-PErok3DZSA5WGMd6XXV3IRNO0mlB+wW3OzhFJLEec1jSERg2j1bxJ6e5Fh6N6fn3FH2T9AP4UYNb/pYlADB9sA==} - engines: {node: '>=10.13.0'} - hasBin: true - - gulplog@2.2.0: - resolution: {integrity: sha512-V2FaKiOhpR3DRXZuYdRLn/qiY0yI5XmqbTKrYbdemJ+xOh2d2MOweI/XFgMzd/9+1twdvMwllnZbWZNJ+BOm4A==} - engines: {node: '>= 10.13.0'} - handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} engines: {node: '>=0.4.7'} @@ -2501,10 +2344,6 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - homedir-polyfill@1.0.3: - resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} - engines: {node: '>=0.10.0'} - hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -2527,10 +2366,6 @@ packages: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -2585,18 +2420,10 @@ packages: interactjs@1.10.27: resolution: {integrity: sha512-y/8RcCftGAF24gSp76X2JS3XpHiUvDQyhF8i7ujemBz77hwiHDuJzftHx7thY8cxGogwGiPJ+o97kWB6eAXnsA==} - interpret@3.1.1: - resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} - engines: {node: '>=10.13.0'} - invert-kv@2.0.0: resolution: {integrity: sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==} engines: {node: '>=4'} - is-absolute@1.0.0: - resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} - engines: {node: '>=0.10.0'} - is-alphabetical@1.0.4: resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} @@ -2664,10 +2491,6 @@ packages: is-hexadecimal@1.0.4: resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} - is-negated-glob@1.0.0: - resolution: {integrity: sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==} - engines: {node: '>=0.10.0'} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -2692,10 +2515,6 @@ packages: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} engines: {node: '>=8'} - is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -2704,10 +2523,6 @@ packages: resolution: {integrity: sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==} engines: {node: '>=6'} - is-relative@1.0.0: - resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} - engines: {node: '>=0.10.0'} - is-stream@1.1.0: resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} engines: {node: '>=0.10.0'} @@ -2727,22 +2542,10 @@ packages: is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - is-unc-path@1.0.0: - resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} - engines: {node: '>=0.10.0'} - is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - is-valid-glob@1.0.0: - resolution: {integrity: sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==} - engines: {node: '>=0.10.0'} - - is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -2760,17 +2563,9 @@ packages: ismobilejs@1.1.1: resolution: {integrity: sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==} - isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - isomorphic-textencoder@1.0.1: resolution: {integrity: sha512-676hESgHullDdHDsj469hr+7t3i/neBKU9J7q1T4RHaWwLAsaQnywC0D1dIUId0YZ+JtVrShzuBk1soo0+GVcQ==} - istextorbinary@3.3.0: - resolution: {integrity: sha512-Tvq1W6NAcZeJ8op+Hq7tdZ434rqnMx4CCZ7H0ff83uEloDvVbqAwaMTZcafKGJT0VHkYzuXUiCY4hlXQg6WfoQ==} - engines: {node: '>=8'} - jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -2852,25 +2647,13 @@ packages: known-css-properties@0.21.0: resolution: {integrity: sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==} - last-run@2.0.0: - resolution: {integrity: sha512-j+y6WhTLN4Itnf9j5ZQos1BGPCS8DAwmgMroR3OzfxAsBxam0hMw7J8M3KqZl0pLQJ1jNnwIexg5DYpC/ctwEQ==} - engines: {node: '>= 10.13.0'} - lcid@2.0.0: resolution: {integrity: sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==} engines: {node: '>=6'} - lead@4.0.0: - resolution: {integrity: sha512-DpMa59o5uGUWWjruMp71e6knmwKU3jRBBn1kjuLWN9EeIOxNeSAwvHf03WIl8g/ZMR2oSQC9ej3yeLBwdDc/pg==} - engines: {node: '>=10.13.0'} - lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - liftoff@5.0.1: - resolution: {integrity: sha512-wwLXMbuxSF8gMvubFcFRp56lkFV69twvbU5vDPbaw+Q+/rF8j0HKjGbIdlSi+LuJm9jf7k9PB+nTxnsLMPcv2Q==} - engines: {node: '>=10.13.0'} - lightningcss-android-arm64@1.32.0: resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} @@ -3026,10 +2809,6 @@ packages: resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} engines: {node: '>=6'} - map-cache@0.2.2: - resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} - engines: {node: '>=0.10.0'} - map-obj@1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} engines: {node: '>=0.10.0'} @@ -3186,10 +2965,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - mute-stdout@2.0.0: - resolution: {integrity: sha512-32GSKM3Wyc8dg/p39lWPKYu8zci9mJFzV1Np9Of0ZEpe6Fhssn/FbI7ywAMd40uX+p3ZKh3T5EeCFv81qS3HmQ==} - engines: {node: '>= 10.13.0'} - mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -3260,10 +3035,6 @@ packages: normalize-selector@0.2.0: resolution: {integrity: sha512-dxvWdI8gw6eAvk9BlPffgEoGfM7AdijoCwOEJge3e3ulT2XLgmU7KvvxprOaCu05Q1uGRHmOhHe1r6emZoKyFw==} - now-and-later@3.0.0: - resolution: {integrity: sha512-pGO4pzSdaxhWTGkfSfHx3hVzJVslFPwBp2Myq9MYN/ChfJZF87ochMAXnvz6/58RJSf5ik2q9tXprBBrk2cpcg==} - engines: {node: '>= 10.13.0'} - npm-normalize-package-bin@4.0.0: resolution: {integrity: sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==} engines: {node: ^18.17.0 || >=20.5.0} @@ -3303,14 +3074,6 @@ packages: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} - object.defaults@1.1.0: - resolution: {integrity: sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==} - engines: {node: '>=0.10.0'} - - object.pick@1.3.0: - resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} - engines: {node: '>=0.10.0'} - obliterator@1.6.1: resolution: {integrity: sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==} @@ -3361,6 +3124,10 @@ packages: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} + p-map@7.0.4: + resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} + engines: {node: '>=18'} + p-try@1.0.0: resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} engines: {node: '>=4'} @@ -3382,10 +3149,6 @@ packages: parse-entities@2.0.0: resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} - parse-filepath@1.0.2: - resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} - engines: {node: '>=0.8'} - parse-json@4.0.0: resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} engines: {node: '>=4'} @@ -3394,10 +3157,6 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} - parse-passwd@1.0.0: - resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} - engines: {node: '>=0.10.0'} - path-complete-extname@1.0.0: resolution: {integrity: sha512-CVjiWcMRdGU8ubs08YQVzhutOR5DEfO97ipRIlOGMK5Bek5nQySknBpuxVAVJ36hseTNs+vdIcv57ZrWxH7zvg==} @@ -3424,14 +3183,6 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-root-regex@0.1.2: - resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==} - engines: {node: '>=0.10.0'} - - path-root@0.1.1: - resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==} - engines: {node: '>=0.10.0'} - path-scurry@1.11.1: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} @@ -3531,10 +3282,6 @@ packages: resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} engines: {node: '>=10.4.0'} - plugin-error@2.0.1: - resolution: {integrity: sha512-zMakqvIDyY40xHOvzXka0kUvf40nYIuwRE8dWhti2WtjQZ31xAgBZBhxsK7vK3QbRXS1Xms/LO7B5cuAsfB2Gg==} - engines: {node: '>=10.13.0'} - possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -3545,13 +3292,6 @@ packages: peerDependencies: postcss: ^8.4.38 - postcss-cli@11.0.1: - resolution: {integrity: sha512-0UnkNPSayHKRe/tc2YGW6XnSqqOA9eqpiRMgRlV1S6HdGi16vwJBx7lviARzbV1HpQHqLLRH3o8vTcB0cLc+5g==} - engines: {node: '>=18'} - hasBin: true - peerDependencies: - postcss: ^8.0.0 - postcss-colormin@7.0.6: resolution: {integrity: sha512-oXM2mdx6IBTRm39797QguYzVEWzbdlFiMNfq88fCCN1Wepw3CYmJ/1/Ifa/KjWo+j5ZURDl2NTldLJIw51IeNQ==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} @@ -3633,21 +3373,6 @@ packages: ts-node: optional: true - postcss-load-config@5.1.0: - resolution: {integrity: sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==} - engines: {node: '>= 18'} - peerDependencies: - jiti: '>=1.21.0' - postcss: '>=8.0.9' - tsx: ^4.8.1 - peerDependenciesMeta: - jiti: - optional: true - postcss: - optional: true - tsx: - optional: true - postcss-media-query-parser@0.2.3: resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} @@ -3771,12 +3496,6 @@ packages: peerDependencies: postcss: ^8.4.32 - postcss-reporter@7.1.0: - resolution: {integrity: sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==} - engines: {node: '>=10'} - peerDependencies: - postcss: ^8.1.0 - postcss-resolve-nested-selector@0.1.6: resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==} @@ -3873,10 +3592,6 @@ packages: engines: {node: '>=14'} hasBin: true - pretty-hrtime@1.0.3: - resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} - engines: {node: '>= 0.8'} - process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -4000,10 +3715,6 @@ packages: resolution: {integrity: sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==} engines: {node: '>= 0.8.0'} - rechoir@0.8.0: - resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} - engines: {node: '>= 10.13.0'} - redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -4023,29 +3734,15 @@ packages: remove-accents@0.5.0: resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} - remove-trailing-separator@1.1.0: - resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} - repeat-string@1.6.1: resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} engines: {node: '>=0.10'} - replace-ext@2.0.0: - resolution: {integrity: sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==} - engines: {node: '>= 10'} - - replace-homedir@2.0.0: - resolution: {integrity: sha512-bgEuQQ/BHW0XkkJtawzrfzHFSN70f/3cNOiHa2QsYxqrjaC30X1k74FJ6xswVBP0sr0SpGIdVFuPwfrYziVeyw==} - engines: {node: '>= 10.13.0'} - replace@1.2.2: resolution: {integrity: sha512-C4EDifm22XZM2b2JOYe6Mhn+lBsLBAvLbK8drfUQLTfD1KYl/n3VaW/CDju0Ny4w3xTtegBpg8YNSpFJPUDSjA==} engines: {node: '>= 6'} hasBin: true - replacestream@4.0.3: - resolution: {integrity: sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==} - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -4060,10 +3757,6 @@ packages: require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - resolve-dir@1.0.1: - resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} - engines: {node: '>=0.10.0'} - resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -4072,10 +3765,6 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - resolve-options@2.0.0: - resolution: {integrity: sha512-/FopbmmFOQCfsCx77BRFdKOniglTiHumLgwvd6IDPihy1GKkadZbgQJBcTb2lMzSR1pndzd96b1nZrreZ7+9/A==} - engines: {node: '>= 10.13.0'} - resolve@1.22.10: resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} engines: {node: '>= 0.4'} @@ -4118,9 +3807,6 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sanitize-filename@1.6.4: resolution: {integrity: sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==} @@ -4134,10 +3820,6 @@ packages: scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - semver-greatest-satisfied-range@2.0.0: - resolution: {integrity: sha512-lH3f6kMbwyANB7HuOWRMlLCa2itaCrZJ+SAqqkSZrZKO/cAsk2EOyaKHUtNkVLFyFW9pct22SFesFp3Z7zpA0g==} - engines: {node: '>= 10.13.0'} - semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -4243,10 +3925,6 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - slash@5.1.0: - resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} - engines: {node: '>=14.16'} - slice-ansi@4.0.0: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} @@ -4258,18 +3936,10 @@ packages: source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - sparkles@2.1.0: - resolution: {integrity: sha512-r7iW1bDw8R/cFifrD3JnQJX0K1jqT0kprL48BiBpLZLJPmAm34zsVBsK5lc7HirZYZqMW65dOXZgbAGt/I6frg==} - engines: {node: '>= 10.13.0'} - spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -4300,12 +3970,6 @@ packages: resolution: {integrity: sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==} engines: {node: '>= 0.10.0'} - stream-composer@1.0.2: - resolution: {integrity: sha512-bnBselmwfX5K10AH6L4c8+S5lgZMWI7ZYrz2rvYjCPB2DIMC4Ig8OpxGpNJSxRZ58oti7y1IcNvjBAz9vW5m4w==} - - stream-exhaust@1.0.2: - resolution: {integrity: sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==} - streamx@2.23.0: resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} @@ -4407,9 +4071,6 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - sver@1.8.4: - resolution: {integrity: sha512-71o1zfzyawLfIWBOmw8brleKyvnbn73oVHNCsu51uPMz/HWiKkkXsI31JjHW5zqXEqnPYkIiHd8ZmL7FCimLEA==} - svg-tags@1.0.0: resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} @@ -4454,9 +4115,6 @@ packages: resolution: {integrity: sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==} engines: {node: '>=18'} - teex@1.0.1: - resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} - temp-dir@2.0.0: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} @@ -4480,13 +4138,6 @@ packages: text-segmentation@1.0.3: resolution: {integrity: sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==} - textextensions@3.3.0: - resolution: {integrity: sha512-mk82dS8eRABNbeVJrEiN5/UMSCliINAuz8mkUwH4SwslkNP//gbEzlWNS5au0z5Dpx40SQxzqZevZkn+WYJ9Dw==} - engines: {node: '>=8'} - - thenby@1.3.4: - resolution: {integrity: sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==} - thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -4509,10 +4160,6 @@ packages: tiny-typed-emitter@2.1.0: resolution: {integrity: sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==} - tinyglobby@0.2.15: - resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} - engines: {node: '>=12.0.0'} - tinyglobby@0.2.16: resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} @@ -4525,10 +4172,6 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - to-through@3.0.0: - resolution: {integrity: sha512-y8MN937s/HVhEoBU1SxfHC+wxCHkV1a9gW8eAdTadYh/bGyesZIVcbjI+mSpFbSVwQici/XjBjuUyri1dnXwBw==} - engines: {node: '>=10.13.0'} - tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -4601,18 +4244,6 @@ packages: engines: {node: '>=0.8.0'} hasBin: true - unc-path-regex@0.1.2: - resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} - engines: {node: '>=0.10.0'} - - undertaker-registry@2.0.0: - resolution: {integrity: sha512-+hhVICbnp+rlzZMgxXenpvTxpuvA67Bfgtt+O9WOE5jo7w/dyiF1VmoZVIHvP2EkUjsyKyTwYKlLhA+j47m1Ew==} - engines: {node: '>= 10.13.0'} - - undertaker@2.0.0: - resolution: {integrity: sha512-tO/bf30wBbTsJ7go80j0RzA2rcwX6o7XPBpeFcb+jzoeb4pfMM2zUeSDIkY1AWqeZabWxaQZ/h8N9t35QKDLPQ==} - engines: {node: '>=10.13.0'} - undici-types@7.10.0: resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} @@ -4702,41 +4333,20 @@ packages: v8-compile-cache@2.4.0: resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==} - v8flags@4.0.1: - resolution: {integrity: sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==} - engines: {node: '>= 10.13.0'} - validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - value-or-function@4.0.0: - resolution: {integrity: sha512-aeVK81SIuT6aMJfNo9Vte8Dw0/FZINGBV8BfCraGtqVxIeLAEhJyoWs8SmvRVmXfGss2PmmOwZCuBPbZR+IYWg==} - engines: {node: '>= 10.13.0'} - vfile-message@2.0.4: resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} vfile@4.2.1: resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} - vinyl-contents@2.0.0: - resolution: {integrity: sha512-cHq6NnGyi2pZ7xwdHSW1v4Jfnho4TEGtxZHw01cmnc8+i7jgR6bRnED/LbrKan/Q7CvVLbnvA5OepnhbpjBZ5Q==} - engines: {node: '>=10.13.0'} - - vinyl-fs@4.0.2: - resolution: {integrity: sha512-XRFwBLLTl8lRAOYiBqxY279wY46tVxLaRhSwo3GzKEuLz1giffsOquWWboD/haGf5lx+JyTigCFfe7DWHoARIA==} - engines: {node: '>=10.13.0'} - - vinyl-sourcemap@2.0.0: - resolution: {integrity: sha512-BAEvWxbBUXvlNoFQVFVHpybBbjW1r03WhohJzJDSfgrrK5xVYIDTan6xN14DlyImShgDRv2gl9qhM6irVMsV0Q==} - engines: {node: '>=10.13.0'} - - vinyl-sourcemaps-apply@0.2.1: - resolution: {integrity: sha512-+oDh3KYZBoZC8hfocrbrxbLUeaYtQK7J5WU5Br9VqWqmCll3tFJqKp97GC9GmMsVIL0qnx2DgEDVxdo5EZ5sSw==} - - vinyl@3.0.1: - resolution: {integrity: sha512-0QwqXteBNXgnLCdWdvPQBX6FXRHtIH3VhJPTd5Lwn28tJXc34YqSCWUmkOvtJHBmB3gGoPtrOKk3Ts8/kEZ9aA==} - engines: {node: '>=10.13.0'} + vite-plugin-static-copy@4.1.0: + resolution: {integrity: sha512-9XOarNV7LgP0KBB7AApxdgFikLXx3daZdqjC3AevYsL6MrUH62zphonLUs2a6LZc1HN1GY+vQdheZ8VVJb6dQQ==} + engines: {node: ^22.0.0 || >=24.0.0} + peerDependencies: + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 vite@8.0.9: resolution: {integrity: sha512-t7g7GVRpMXjNpa67HaVWI/8BWtdVIQPCL2WoozXXA7LBGEFK4AkkKkHx2hAQf5x1GZSlcmEDPkVLSGahxnEEZw==} @@ -4925,10 +4535,6 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - yargs-parser@22.0.0: - resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} - engines: {node: ^20.19.0 || ^22.12.0 || >=23} - yargs@12.0.5: resolution: {integrity: sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==} @@ -5294,12 +4900,6 @@ snapshots: '@glidejs/glide@3.7.1': {} - '@gulpjs/messages@1.1.0': {} - - '@gulpjs/to-absolute-glob@4.0.0': - dependencies: - is-negated-glob: 1.0.0 - '@highlightjs/cdn-assets@11.11.1': {} '@hutson/parse-repository-url@3.0.2': {} @@ -5966,8 +5566,6 @@ snapshots: '@types/earcut@2.1.4': {} - '@types/expect@1.20.4': {} - '@types/fs-extra@8.1.5': dependencies: '@types/node': 24.2.0 @@ -5993,11 +5591,6 @@ snapshots: '@types/unist@2.0.11': {} - '@types/vinyl@2.0.12': - dependencies: - '@types/expect': 1.20.4 - '@types/node': 24.2.0 - '@xml-tools/parser@1.0.11': dependencies: chevrotain: 7.1.1 @@ -6041,10 +5634,6 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - ansi-colors@1.1.0: - dependencies: - ansi-wrap: 0.1.0 - ansi-regex@2.1.1: {} ansi-regex@3.0.1: {} @@ -6063,8 +5652,6 @@ snapshots: ansi-styles@6.2.3: {} - ansi-wrap@0.1.0: {} - any-promise@1.3.0: {} anymatch@3.1.3: @@ -6085,12 +5672,8 @@ snapshots: arg@5.0.2: {} - array-each@1.0.1: {} - array-ify@1.0.0: {} - array-slice@1.1.0: {} - array-union@2.1.0: {} arrify@1.0.1: {} @@ -6099,16 +5682,6 @@ snapshots: astral-regex@2.0.0: {} - async-done@2.0.0: - dependencies: - end-of-stream: 1.4.5 - once: 1.4.0 - stream-exhaust: 1.0.2 - - async-settle@2.0.0: - dependencies: - async-done: 2.0.0 - at-least-node@1.0.0: {} autoprefixer@10.4.27(postcss@8.5.8): @@ -6136,12 +5709,6 @@ snapshots: b4a@1.6.7: {} - bach@2.0.1: - dependencies: - async-done: 2.0.0 - async-settle: 2.0.0 - now-and-later: 3.0.0 - bail@1.0.5: {} balanced-match@1.0.2: {} @@ -6193,8 +5760,6 @@ snapshots: binary-extensions@2.3.0: {} - binaryextensions@2.3.0: {} - bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 @@ -6205,12 +5770,6 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - bl@5.1.0: - dependencies: - buffer: 6.0.3 - inherits: 2.0.4 - readable-stream: 3.6.2 - boolbase@1.0.0: {} bplist-creator@0.1.0: @@ -6379,8 +5938,6 @@ snapshots: dependencies: is-regexp: 2.1.0 - clone@2.1.2: {} - code-point-at@1.1.0: {} codemirror@5.65.18: {} @@ -6413,7 +5970,8 @@ snapshots: color-name: 1.1.4 simple-swizzle: 0.2.2 - color-support@1.1.3: {} + color-support@1.1.3: + optional: true color@4.2.3: dependencies: @@ -6548,11 +6106,6 @@ snapshots: convert-source-map@2.0.0: {} - copy-props@4.0.0: - dependencies: - each-props: 3.0.0 - is-plain-object: 5.0.0 - core-util-is@1.0.3: {} cosmiconfig@7.1.0: @@ -6740,10 +6293,6 @@ snapshots: delegates@1.0.0: optional: true - dependency-graph@1.0.0: {} - - detect-file@1.0.0: {} - detect-libc@2.0.4: {} dezalgo@1.0.4: @@ -6832,11 +6381,6 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - each-props@3.0.0: - dependencies: - is-plain-object: 5.0.0 - object.defaults: 1.1.0 - earcut@2.2.4: {} eastasianwidth@0.2.0: {} @@ -6909,16 +6453,8 @@ snapshots: expand-template@2.0.3: {} - expand-tilde@2.0.2: - dependencies: - homedir-polyfill: 1.0.3 - extend@3.0.2: {} - fancy-log@2.0.0: - dependencies: - color-support: 1.1.3 - fast-deep-equal@3.1.3: {} fast-fifo@1.3.2: {} @@ -6931,10 +6467,6 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fast-levenshtein@3.0.0: - dependencies: - fastest-levenshtein: 1.0.16 - fast-sort@3.4.1: {} fast-text-encoding@1.0.6: {} @@ -6951,10 +6483,6 @@ snapshots: dependencies: pend: 1.2.0 - fdir@6.5.0(picomatch@4.0.3): - optionalDependencies: - picomatch: 4.0.3 - fdir@6.5.0(picomatch@4.0.4): optionalDependencies: picomatch: 4.0.4 @@ -6984,23 +6512,6 @@ snapshots: locate-path: 5.0.0 path-exists: 4.0.0 - findup-sync@5.0.0: - dependencies: - detect-file: 1.0.0 - is-glob: 4.0.3 - micromatch: 4.0.8 - resolve-dir: 1.0.1 - - fined@2.0.0: - dependencies: - expand-tilde: 2.0.2 - is-plain-object: 5.0.0 - object.defaults: 1.1.0 - object.pick: 1.3.0 - parse-filepath: 1.0.2 - - flagged-respawn@2.0.0: {} - flat-cache@3.2.0: dependencies: flatted: 3.3.3 @@ -7013,12 +6524,6 @@ snapshots: dependencies: is-callable: 1.2.7 - for-in@1.0.2: {} - - for-own@1.0.0: - dependencies: - for-in: 1.0.2 - foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 @@ -7057,13 +6562,6 @@ snapshots: dependencies: minipass: 3.3.6 - fs-mkdirp-stream@2.0.1: - dependencies: - graceful-fs: 4.2.11 - streamx: 2.23.0 - transitivePeerDependencies: - - bare-abort-controller - fs.realpath@1.0.0: {} fs@0.0.1-security: {} @@ -7160,24 +6658,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob-stream@8.0.3: - dependencies: - '@gulpjs/to-absolute-glob': 4.0.0 - anymatch: 3.1.3 - fastq: 1.20.1 - glob-parent: 6.0.2 - is-glob: 4.0.3 - is-negated-glob: 1.0.0 - normalize-path: 3.0.0 - streamx: 2.23.0 - transitivePeerDependencies: - - bare-abort-controller - - glob-watcher@6.0.0: - dependencies: - async-done: 2.0.0 - chokidar: 3.6.0 - glob@10.4.5: dependencies: foreground-child: 3.3.1 @@ -7212,24 +6692,10 @@ snapshots: minipass: 4.2.8 path-scurry: 1.11.1 - global-modules@1.0.0: - dependencies: - global-prefix: 1.0.2 - is-windows: 1.0.2 - resolve-dir: 1.0.1 - global-modules@2.0.0: dependencies: global-prefix: 3.0.0 - global-prefix@1.0.2: - dependencies: - expand-tilde: 2.0.2 - homedir-polyfill: 1.0.3 - ini: 1.3.8 - is-windows: 1.0.2 - which: 1.3.1 - global-prefix@3.0.0: dependencies: ini: 1.3.8 @@ -7247,10 +6713,6 @@ snapshots: globjoin@0.1.4: {} - glogg@2.2.0: - dependencies: - sparkles: 2.1.0 - gonzales-pe@4.3.0: dependencies: minimist: 1.2.8 @@ -7271,53 +6733,6 @@ snapshots: graphology-types: 0.19.5 obliterator: 1.6.1 - gulp-cli@3.1.0: - dependencies: - '@gulpjs/messages': 1.1.0 - chalk: 4.1.2 - copy-props: 4.0.0 - gulplog: 2.2.0 - interpret: 3.1.1 - liftoff: 5.0.1 - mute-stdout: 2.0.0 - replace-homedir: 2.0.0 - semver-greatest-satisfied-range: 2.0.0 - string-width: 4.2.3 - v8flags: 4.0.1 - yargs: 16.2.0 - - gulp-postcss@10.0.0(jiti@1.21.7)(postcss@8.5.8): - dependencies: - fancy-log: 2.0.0 - plugin-error: 2.0.1 - postcss: 8.5.8 - postcss-load-config: 5.1.0(jiti@1.21.7)(postcss@8.5.8) - vinyl-sourcemaps-apply: 0.2.1 - transitivePeerDependencies: - - jiti - - tsx - - gulp-replace@1.1.4: - dependencies: - '@types/node': 24.2.0 - '@types/vinyl': 2.0.12 - istextorbinary: 3.3.0 - replacestream: 4.0.3 - yargs-parser: 22.0.0 - - gulp@5.0.1: - dependencies: - glob-watcher: 6.0.0 - gulp-cli: 3.1.0 - undertaker: 2.0.0 - vinyl-fs: 4.0.2 - transitivePeerDependencies: - - bare-abort-controller - - gulplog@2.2.0: - dependencies: - glogg: 2.2.0 - handlebars@4.7.8: dependencies: minimist: 1.2.8 @@ -7352,10 +6767,6 @@ snapshots: he@1.2.0: {} - homedir-polyfill@1.0.3: - dependencies: - parse-passwd: 1.0.0 - hosted-git-info@2.8.9: {} hosted-git-info@4.1.0: @@ -7386,10 +6797,6 @@ snapshots: - supports-color optional: true - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - ieee754@1.2.1: {} ignore@5.3.2: {} @@ -7428,15 +6835,8 @@ snapshots: dependencies: '@interactjs/types': 1.10.27 - interpret@3.1.1: {} - invert-kv@2.0.0: {} - is-absolute@1.0.0: - dependencies: - is-relative: 1.0.0 - is-windows: 1.0.2 - is-alphabetical@1.0.4: {} is-alphanumerical@1.0.4: @@ -7492,8 +6892,6 @@ snapshots: is-hexadecimal@1.0.4: {} - is-negated-glob@1.0.0: {} - is-number@7.0.0: {} is-obj@2.0.0: {} @@ -7506,8 +6904,6 @@ snapshots: is-plain-obj@2.1.0: {} - is-plain-object@5.0.0: {} - is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -7517,10 +6913,6 @@ snapshots: is-regexp@2.1.0: {} - is-relative@1.0.0: - dependencies: - is-unc-path: 1.0.0 - is-stream@1.1.0: {} is-stream@2.0.1: {} @@ -7535,16 +6927,8 @@ snapshots: is-typedarray@1.0.0: {} - is-unc-path@1.0.0: - dependencies: - unc-path-regex: 0.1.2 - is-unicode-supported@0.1.0: {} - is-valid-glob@1.0.0: {} - - is-windows@1.0.2: {} - is-wsl@2.2.0: dependencies: is-docker: 2.2.1 @@ -7557,17 +6941,10 @@ snapshots: ismobilejs@1.1.1: {} - isobject@3.0.1: {} - isomorphic-textencoder@1.0.1: dependencies: fast-text-encoding: 1.0.6 - istextorbinary@3.3.0: - dependencies: - binaryextensions: 2.3.0 - textextensions: 3.3.0 - jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -7633,28 +7010,14 @@ snapshots: known-css-properties@0.21.0: {} - last-run@2.0.0: {} - lcid@2.0.0: dependencies: invert-kv: 2.0.0 - lead@4.0.0: {} - lie@3.3.0: dependencies: immediate: 3.0.6 - liftoff@5.0.1: - dependencies: - extend: 3.0.2 - findup-sync: 5.0.0 - fined: 2.0.0 - flagged-respawn: 2.0.0 - is-plain-object: 5.0.0 - rechoir: 0.8.0 - resolve: 1.22.10 - lightningcss-android-arm64@1.32.0: optional: true @@ -7777,8 +7140,6 @@ snapshots: dependencies: p-defer: 1.0.0 - map-cache@0.2.2: {} - map-obj@1.0.1: {} map-obj@4.3.0: {} @@ -7943,8 +7304,6 @@ snapshots: ms@2.1.3: {} - mute-stdout@2.0.0: {} - mz@2.7.0: dependencies: any-promise: 1.3.0 @@ -8020,10 +7379,6 @@ snapshots: normalize-selector@0.2.0: {} - now-and-later@3.0.0: - dependencies: - once: 1.4.0 - npm-normalize-package-bin@4.0.0: {} npm-run-all2@8.0.4: @@ -8063,17 +7418,6 @@ snapshots: object-inspect@1.13.4: {} - object.defaults@1.1.0: - dependencies: - array-each: 1.0.1 - array-slice: 1.1.0 - for-own: 1.0.0 - isobject: 3.0.1 - - object.pick@1.3.0: - dependencies: - isobject: 3.0.1 - obliterator@1.6.1: {} once@1.4.0: @@ -8122,6 +7466,8 @@ snapshots: dependencies: aggregate-error: 3.1.0 + p-map@7.0.4: {} + p-try@1.0.0: {} p-try@2.2.0: {} @@ -8143,12 +7489,6 @@ snapshots: is-decimal: 1.0.4 is-hexadecimal: 1.0.4 - parse-filepath@1.0.2: - dependencies: - is-absolute: 1.0.0 - map-cache: 0.2.2 - path-root: 0.1.1 - parse-json@4.0.0: dependencies: error-ex: 1.3.2 @@ -8161,8 +7501,6 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - parse-passwd@1.0.0: {} - path-complete-extname@1.0.0: {} path-exists@3.0.0: {} @@ -8177,12 +7515,6 @@ snapshots: path-parse@1.0.7: {} - path-root-regex@0.1.2: {} - - path-root@0.1.1: - dependencies: - path-root-regex: 0.1.2 - path-scurry@1.11.1: dependencies: lru-cache: 10.4.3 @@ -8325,10 +7657,6 @@ snapshots: base64-js: 1.5.1 xmlbuilder: 15.1.1 - plugin-error@2.0.1: - dependencies: - ansi-colors: 1.1.0 - possible-typed-array-names@1.1.0: {} postcss-calc@10.1.1(postcss@8.5.8): @@ -8337,24 +7665,6 @@ snapshots: postcss-selector-parser: 7.1.1 postcss-value-parser: 4.2.0 - postcss-cli@11.0.1(jiti@1.21.7)(postcss@8.5.8): - dependencies: - chokidar: 3.6.0 - dependency-graph: 1.0.0 - fs-extra: 11.3.4 - picocolors: 1.1.1 - postcss: 8.5.8 - postcss-load-config: 5.1.0(jiti@1.21.7)(postcss@8.5.8) - postcss-reporter: 7.1.0(postcss@8.5.8) - pretty-hrtime: 1.0.3 - read-cache: 1.0.0 - slash: 5.1.0 - tinyglobby: 0.2.15 - yargs: 17.7.2 - transitivePeerDependencies: - - jiti - - tsx - postcss-colormin@7.0.6(postcss@8.5.8): dependencies: browserslist: 4.28.1 @@ -8430,14 +7740,6 @@ snapshots: postcss: 8.5.8 ts-node: 10.9.2(@types/node@24.2.0)(typescript@5.9.3) - postcss-load-config@5.1.0(jiti@1.21.7)(postcss@8.5.8): - dependencies: - lilconfig: 3.1.3 - yaml: 2.8.0 - optionalDependencies: - jiti: 1.21.7 - postcss: 8.5.8 - postcss-media-query-parser@0.2.3: {} postcss-merge-longhand@7.0.5(postcss@8.5.8): @@ -8551,12 +7853,6 @@ snapshots: postcss: 8.5.8 postcss-value-parser: 4.2.0 - postcss-reporter@7.1.0(postcss@8.5.8): - dependencies: - picocolors: 1.1.1 - postcss: 8.5.8 - thenby: 1.3.4 - postcss-resolve-nested-selector@0.1.6: {} postcss-safe-parser@4.0.2: @@ -8647,8 +7943,6 @@ snapshots: prettier@3.6.2: {} - pretty-hrtime@1.0.3: {} - process-nextick-args@2.0.1: {} process@0.11.10: {} @@ -8786,10 +8080,6 @@ snapshots: readline-sync@1.4.10: {} - rechoir@0.8.0: - dependencies: - resolve: 1.22.10 - redent@3.0.0: dependencies: indent-string: 4.0.0 @@ -8817,26 +8107,14 @@ snapshots: remove-accents@0.5.0: {} - remove-trailing-separator@1.1.0: {} - repeat-string@1.6.1: {} - replace-ext@2.0.0: {} - - replace-homedir@2.0.0: {} - replace@1.2.2: dependencies: chalk: 2.4.2 minimatch: 3.0.5 yargs: 15.4.1 - replacestream@4.0.3: - dependencies: - escape-string-regexp: 1.0.5 - object-assign: 4.1.1 - readable-stream: 2.3.8 - require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -8845,19 +8123,10 @@ snapshots: require-main-filename@2.0.0: {} - resolve-dir@1.0.1: - dependencies: - expand-tilde: 2.0.2 - global-modules: 1.0.0 - resolve-from@4.0.0: {} resolve-from@5.0.0: {} - resolve-options@2.0.0: - dependencies: - value-or-function: 4.0.0 - resolve@1.22.10: dependencies: is-core-module: 2.16.1 @@ -8914,8 +8183,6 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 - safer-buffer@2.1.2: {} - sanitize-filename@1.6.4: dependencies: truncate-utf8-bytes: 1.0.2 @@ -8928,10 +8195,6 @@ snapshots: dependencies: loose-envify: 1.4.0 - semver-greatest-satisfied-range@2.0.0: - dependencies: - sver: 1.8.4 - semver@5.7.2: {} semver@6.3.1: {} @@ -9062,8 +8325,6 @@ snapshots: slash@3.0.0: {} - slash@5.1.0: {} - slice-ansi@4.0.0: dependencies: ansi-styles: 4.3.0 @@ -9077,12 +8338,8 @@ snapshots: buffer-from: 1.1.2 source-map: 0.6.1 - source-map@0.5.7: {} - source-map@0.6.1: {} - sparkles@2.1.0: {} - spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 @@ -9111,14 +8368,6 @@ snapshots: stream-buffers@2.2.0: {} - stream-composer@1.0.2: - dependencies: - streamx: 2.23.0 - transitivePeerDependencies: - - bare-abort-controller - - stream-exhaust@1.0.2: {} - streamx@2.23.0: dependencies: events-universal: 1.0.1 @@ -9280,10 +8529,6 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - sver@1.8.4: - optionalDependencies: - semver: 6.3.1 - svg-tags@1.0.0: {} svgo@4.0.1: @@ -9386,12 +8631,6 @@ snapshots: minizlib: 3.1.0 yallist: 5.0.0 - teex@1.0.1: - dependencies: - streamx: 2.23.0 - transitivePeerDependencies: - - bare-abort-controller - temp-dir@2.0.0: {} tempy@1.0.1: @@ -9420,10 +8659,6 @@ snapshots: dependencies: utrie: 1.0.2 - textextensions@3.3.0: {} - - thenby@1.3.4: {} - thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -9447,11 +8682,6 @@ snapshots: tiny-typed-emitter@2.1.0: {} - tinyglobby@0.2.15: - dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - tinyglobby@0.2.16: dependencies: fdir: 6.5.0(picomatch@4.0.4) @@ -9463,12 +8693,6 @@ snapshots: dependencies: is-number: 7.0.0 - to-through@3.0.0: - dependencies: - streamx: 2.23.0 - transitivePeerDependencies: - - bare-abort-controller - tr46@0.0.3: {} tree-kill@1.2.2: {} @@ -9526,17 +8750,6 @@ snapshots: uglify-js@3.19.3: optional: true - unc-path-regex@0.1.2: {} - - undertaker-registry@2.0.0: {} - - undertaker@2.0.0: - dependencies: - bach: 2.0.1 - fast-levenshtein: 3.0.0 - last-run: 2.0.0 - undertaker-registry: 2.0.0 - undici-types@7.10.0: {} unified@9.2.2: @@ -9617,15 +8830,11 @@ snapshots: v8-compile-cache@2.4.0: {} - v8flags@4.0.1: {} - validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - value-or-function@4.0.0: {} - vfile-message@2.0.4: dependencies: '@types/unist': 2.0.11 @@ -9638,55 +8847,13 @@ snapshots: unist-util-stringify-position: 2.0.3 vfile-message: 2.0.4 - vinyl-contents@2.0.0: + vite-plugin-static-copy@4.1.0(vite@8.0.9(@types/node@24.2.0)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.0)): dependencies: - bl: 5.1.0 - vinyl: 3.0.1 - transitivePeerDependencies: - - bare-abort-controller - - vinyl-fs@4.0.2: - dependencies: - fs-mkdirp-stream: 2.0.1 - glob-stream: 8.0.3 - graceful-fs: 4.2.11 - iconv-lite: 0.6.3 - is-valid-glob: 1.0.0 - lead: 4.0.0 - normalize-path: 3.0.0 - resolve-options: 2.0.0 - stream-composer: 1.0.2 - streamx: 2.23.0 - to-through: 3.0.0 - value-or-function: 4.0.0 - vinyl: 3.0.1 - vinyl-sourcemap: 2.0.0 - transitivePeerDependencies: - - bare-abort-controller - - vinyl-sourcemap@2.0.0: - dependencies: - convert-source-map: 2.0.0 - graceful-fs: 4.2.11 - now-and-later: 3.0.0 - streamx: 2.23.0 - vinyl: 3.0.1 - vinyl-contents: 2.0.0 - transitivePeerDependencies: - - bare-abort-controller - - vinyl-sourcemaps-apply@0.2.1: - dependencies: - source-map: 0.5.7 - - vinyl@3.0.1: - dependencies: - clone: 2.1.2 - remove-trailing-separator: 1.1.0 - replace-ext: 2.0.0 - teex: 1.0.1 - transitivePeerDependencies: - - bare-abort-controller + chokidar: 3.6.0 + p-map: 7.0.4 + picocolors: 1.1.1 + tinyglobby: 0.2.16 + vite: 8.0.9(@types/node@24.2.0)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.0) vite@8.0.9(@types/node@24.2.0)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.0): dependencies: @@ -9831,8 +8998,6 @@ snapshots: yargs-parser@21.1.1: {} - yargs-parser@22.0.0: {} - yargs@12.0.5: dependencies: cliui: 4.1.0 diff --git a/postcss.config.js b/postcss.config.js deleted file mode 100644 index a400348bc2..0000000000 --- a/postcss.config.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - plugins: { - 'autoprefixer': {}, - 'postcss-import-ext-glob': {}, - 'postcss-import': {}, - 'tailwindcss/nesting': 'postcss-nested', - tailwindcss: {}, - ...(process.env.NODE_ENV === 'production' ? { cssnano: {} } : {}) - } -} diff --git a/scripts/static-pipeline.mjs b/scripts/static-pipeline.mjs new file mode 100644 index 0000000000..29fe20c8da --- /dev/null +++ b/scripts/static-pipeline.mjs @@ -0,0 +1,158 @@ +import { execFileSync } from 'node:child_process' +import { + copyFileSync, + existsSync, + mkdirSync, + readFileSync, + readdirSync, + renameSync, + rmSync, + writeFileSync, +} from 'node:fs' +import path from 'node:path' +import { fileURLToPath } from 'node:url' + +const rootDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..') +const staticDir = path.join(rootDir, 'static') + +const staticCleanKeep = new Set([ + 'entitlements.plist', + 'node_modules', + 'package.json', + 'pnpm-lock.yaml', +]) + +function run(command, args, options = {}) { + execFileSync(command, args, { + cwd: options.cwd ?? rootDir, + env: { ...process.env, ...(options.env ?? {}) }, + shell: process.platform === 'win32', + stdio: 'inherit', + }) +} + +function clean() { + mkdirSync(staticDir, { recursive: true }) + + for (const entry of readdirSync(staticDir)) { + if (staticCleanKeep.has(entry)) { + continue + } + + rmSync(path.join(staticDir, entry), { + recursive: true, + force: true, + maxRetries: 10, + retryDelay: 100, + }) + } +} + +function ensureStaticNodeModules() { + if (!existsSync(path.join(staticDir, 'node_modules'))) { + run('pnpm', ['install', '--frozen-lockfile'], { cwd: staticDir }) + } +} + +function electron() { + ensureStaticNodeModules() + run('pnpm', ['electron:dev'], { cwd: staticDir }) +} + +function versionFromSource() { + const versionSource = readFileSync(path.join(rootDir, 'src/main/frontend/version.cljs'), 'utf8') + const match = versionSource.match(/[0-9.]{3,}/) + + if (!match) { + throw new Error('release version error in src/**/*/version.cljs') + } + + return match[0] +} + +function electronMaker() { + run('pnpm', ['cljs:release-electron']) + run('pnpm', ['vite:workers-build']) + + const packagePath = path.join(staticDir, 'package.json') + const packageJson = JSON.parse(readFileSync(packagePath, 'utf8')) + packageJson.version = versionFromSource() + writeFileSync(packagePath, `${JSON.stringify(packageJson, null, 2)}\n`) + + ensureStaticNodeModules() + run('pnpm', ['electron:make'], { cwd: staticDir }) +} + +function syncWorkersToMobile() { + const source = path.join(staticDir, 'js', 'db-worker.js') + const dest = path.join(staticDir, 'mobile', 'js', 'db-worker.js') + + if (!existsSync(source)) { + throw new Error(`Missing worker output: ${source}`) + } + + mkdirSync(path.dirname(dest), { recursive: true }) + copyFileSync(source, dest) +} + +function switchReactDevelopmentMode() { + const pairs = [ + ['react.development.js', 'react.production.min.js'], + ['react-dom.development.js', 'react-dom.production.min.js'], + ] + + for (const [fromName, toName] of pairs) { + const from = path.join(staticDir, 'js', fromName) + const to = path.join(staticDir, 'js', toName) + + if (!existsSync(from)) { + continue + } + + rmSync(to, { force: true }) + renameSync(from, to) + } +} + +async function cap() { + const mode = process.env.PLATFORM || 'ios' + const logseqAppServerUrl = 'http://localhost:3002' + + if (typeof global.fetch === 'function') { + try { + await fetch(logseqAppServerUrl) + } catch { + throw new Error(`Please check if the service is ON. (${logseqAppServerUrl})`) + } + } + + process.stdout.write(`------ Cap ${mode.toUpperCase()} -----\n`) + process.stdout.write(`Dev serve at: ${logseqAppServerUrl}\n`) + process.stdout.write('--------------------------------------\n') + + run('pnpm', ['exec', 'cap', 'sync', mode], { + env: { LOGSEQ_APP_SERVER_URL: logseqAppServerUrl }, + }) + rmSync(path.join(rootDir, 'ios/App/App/public/out'), { recursive: true, force: true }) + run('pnpm', ['exec', 'cap', 'run', mode], { + env: { LOGSEQ_APP_SERVER_URL: logseqAppServerUrl }, + }) +} + +const tasks = { + cap, + clean, + electron, + 'electron-maker': electronMaker, + 'switch-react-development-mode': switchReactDevelopmentMode, + 'sync-workers-to-mobile': syncWorkersToMobile, +} + +const taskName = process.argv[2] +const task = tasks[taskName] + +if (!task) { + throw new Error(`Unknown static pipeline task: ${taskName}`) +} + +await task() diff --git a/vite.config.assets.ts b/vite.config.assets.ts new file mode 100644 index 0000000000..b76d7ae22c --- /dev/null +++ b/vite.config.assets.ts @@ -0,0 +1,164 @@ +import { normalizePath, type Plugin, defineConfig } from 'vite' +import { viteStaticCopy, type Target } from 'vite-plugin-static-copy' + +const useReactDevelopmentAssets = process.env.LOGSEQ_REACT_DEV_ASSETS === 'true' + +const virtualEntryId = 'virtual:logseq-assets-entry' +const resolvedVirtualEntryId = `\0${virtualEntryId}` + +function virtualAssetsEntryPlugin(): Plugin { + return { + name: 'logseq-assets-entry', + resolveId(id) { + if (id === virtualEntryId) { + return resolvedVirtualEntryId + } + + return null + }, + load(id) { + if (id === resolvedVirtualEntryId) { + return 'export {}\n' + } + + return null + }, + generateBundle(_, bundle) { + for (const fileName of Object.keys(bundle)) { + delete bundle[fileName] + } + }, + } +} + +function flatCopy(src: string | string[], dest: string): Target { + return { + src, + dest, + rename: { stripBase: true }, + } +} + +function reactRuntimeTargets(dest: string): Target[] { + if (useReactDevelopmentAssets && dest === 'js') { + return [ + { + src: 'node_modules/react/umd/react.development.js', + dest, + rename: { stripBase: true, name: 'react.production.min.js' }, + }, + { + src: 'node_modules/react-dom/umd/react-dom.development.js', + dest, + rename: { stripBase: true, name: 'react-dom.production.min.js' }, + }, + ] + } + + return [ + flatCopy([ + 'node_modules/react/umd/react.production.min.js', + 'node_modules/react/umd/react.development.js', + 'node_modules/react-dom/umd/react-dom.production.min.js', + 'node_modules/react-dom/umd/react-dom.development.js', + ], dest), + ] +} + +const desktopJsTargets: Target[] = [ + flatCopy([ + 'node_modules/katex/dist/katex.min.js', + 'node_modules/katex/dist/contrib/mhchem.min.js', + 'node_modules/html2canvas/dist/html2canvas.min.js', + 'node_modules/interactjs/dist/interact.min.js', + 'node_modules/photoswipe/dist/umd/*.js', + 'node_modules/marked/lib/marked.umd.js', + 'node_modules/@highlightjs/cdn-assets/highlight.min.js', + 'node_modules/@isomorphic-git/lightning-fs/dist/lightning-fs.min.js', + 'packages/ui/dist/ui.js', + 'node_modules/@sqlite.org/sqlite-wasm/dist/sqlite3.wasm', + 'node_modules/prop-types/prop-types.min.js', + 'node_modules/dompurify/dist/purify.js', + ], 'js'), + ...reactRuntimeTargets('js'), + { + src: 'node_modules/@tabler/icons-react/dist/umd/tabler-icons-react.min.js', + dest: 'js', + rename: { stripBase: true }, + transform: { + encoding: 'utf8', + handler(content) { + return content.replace( + '"@tabler/icons-react"]={},a.react,', + '"tablerIcons"]={},a.React,', + ) + }, + }, + }, + flatCopy([ + 'node_modules/@glidejs/glide/dist/glide.min.js', + 'node_modules/@glidejs/glide/dist/css/glide.core.min.css', + 'node_modules/@glidejs/glide/dist/css/glide.theme.min.css', + ], 'js/glide'), + flatCopy([ + 'node_modules/pdfjs-dist/legacy/build/pdf.mjs', + 'node_modules/pdfjs-dist/legacy/build/pdf.worker.mjs', + 'node_modules/pdfjs-dist/legacy/web/pdf_viewer.mjs', + ], 'js/pdfjs'), + flatCopy('node_modules/pdfjs-dist/cmaps/*.*', 'js/pdfjs/cmaps'), +] + +const mobileJsTargets: Target[] = [ + flatCopy([ + 'node_modules/katex/dist/katex.min.js', + 'node_modules/katex/dist/contrib/mhchem.min.js', + 'node_modules/marked/lib/marked.umd.js', + 'node_modules/@highlightjs/cdn-assets/highlight.min.js', + 'node_modules/@isomorphic-git/lightning-fs/dist/lightning-fs.min.js', + 'node_modules/interactjs/dist/interact.min.js', + 'node_modules/photoswipe/dist/umd/*.js', + 'packages/ui/dist/ui.js', + 'node_modules/@sqlite.org/sqlite-wasm/dist/sqlite3.wasm', + 'node_modules/prop-types/prop-types.min.js', + ], 'mobile/js'), + ...reactRuntimeTargets('mobile/js'), +] + +const cssAssetTargets: Target[] = [ + flatCopy('node_modules/inter-ui/inter.css', 'css'), + flatCopy('node_modules/inter-ui/web/*.*', 'css/web'), + flatCopy('node_modules/katex/dist/fonts/*.woff2', 'css/fonts'), + flatCopy('node_modules/inter-ui/inter.css', 'mobile/css'), + flatCopy('node_modules/inter-ui/web/*.*', 'mobile/css/web'), + flatCopy('node_modules/katex/dist/fonts/*.woff2', 'mobile/css/fonts'), +] + +export default defineConfig({ + publicDir: false, + build: { + emptyOutDir: false, + outDir: 'static', + rollupOptions: { + input: virtualEntryId, + }, + }, + plugins: [ + virtualAssetsEntryPlugin(), + viteStaticCopy({ + targets: [ + { + src: normalizePath('resources/**/*'), + dest: '.', + // Drop only the resources/ prefix while preserving its nested paths. + rename: { stripBase: 1 }, + }, + ...desktopJsTargets, + ...mobileJsTargets, + ...cssAssetTargets, + ], + watch: { + reloadPageOnChange: false, + }, + }), + ], +}) diff --git a/vite.config.css.ts b/vite.config.css.ts new file mode 100644 index 0000000000..7e9832c9c5 --- /dev/null +++ b/vite.config.css.ts @@ -0,0 +1,137 @@ +import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs' +import path from 'node:path' +import autoprefixer from 'autoprefixer' +import cssnano from 'cssnano' +import postcss, { type AcceptedPlugin } from 'postcss' +import postcssImport from 'postcss-import' +import postcssImportExtGlob from 'postcss-import-ext-glob' +import tailwindcss from 'tailwindcss' +import tailwindNesting from 'tailwindcss/nesting' +import { defineConfig, type Plugin } from 'vite' + +type CssTarget = { + name: string + input: string + output: string +} + +const virtualEntryId = 'virtual:logseq-css-entry' +const resolvedVirtualEntryId = `\0${virtualEntryId}` + +const allCssTargets: CssTarget[] = [ + { + name: 'desktop', + input: 'tailwind.all.css', + output: 'static/css/style.css', + }, + { + name: 'mobile', + input: 'tailwind.mobile.css', + output: 'static/mobile/css/style.css', + }, +] + +function requestedCssTargets(): CssTarget[] { + const targetName = process.env.LOGSEQ_CSS_TARGET + if (!targetName) { + return allCssTargets + } + + const target = allCssTargets.find(({ name }) => name === targetName) + if (!target) { + throw new Error(`Unknown LOGSEQ_CSS_TARGET: ${targetName}`) + } + + return [target] +} + +function filesToWatch(): string[] { + return [ + 'tailwind.config.js', + ...allCssTargets.map(({ input }) => input), + 'src', + 'resources', + path.join('deps', 'shui', 'src'), + path.join('packages', 'ui', 'src'), + path.join('packages', 'ui', '@'), + ].filter(existsSync) +} + +async function buildCss(targets: CssTarget[]) { + const postcssPlugin = (plugin: unknown): AcceptedPlugin => plugin as AcceptedPlugin + const postcssPlugins: AcceptedPlugin[] = [ + postcssPlugin(postcssImportExtGlob()), + postcssPlugin(postcssImport()), + postcssPlugin(tailwindNesting()), + postcssPlugin(tailwindcss()), + postcssPlugin(autoprefixer()), + ] + + if (process.env.NODE_ENV === 'production') { + postcssPlugins.push(postcssPlugin(cssnano({ preset: 'default' }))) + } + + const processor = postcss(postcssPlugins) + + for (const target of targets) { + const input = path.resolve(target.input) + const output = path.resolve(target.output) + const result = await processor.process(readFileSync(input, 'utf8'), { + from: input, + to: output, + map: false, + }) + + mkdirSync(path.dirname(output), { recursive: true }) + writeFileSync(output, result.css) + } +} + +function cssPipelinePlugin(targets: CssTarget[]): Plugin { + return { + name: 'logseq-css-pipeline', + resolveId(id) { + if (id === virtualEntryId) { + return resolvedVirtualEntryId + } + + return null + }, + load(id) { + if (id === resolvedVirtualEntryId) { + return 'export {}\n' + } + + return null + }, + buildStart() { + for (const file of filesToWatch()) { + this.addWatchFile(path.resolve(file)) + } + }, + async closeBundle() { + await buildCss(targets) + }, + generateBundle(_, bundle) { + for (const fileName of Object.keys(bundle)) { + delete bundle[fileName] + } + }, + } +} + +const cssTargets = requestedCssTargets() + +export default defineConfig({ + publicDir: false, + build: { + emptyOutDir: false, + outDir: 'static', + rollupOptions: { + input: virtualEntryId, + }, + }, + plugins: [ + cssPipelinePlugin(cssTargets), + ], +})