From 528be01ca6aad96daa59ae6beaa23f1b306d284f Mon Sep 17 00:00:00 2001 From: Radu-Cristian Popa Date: Wed, 3 Apr 2024 06:19:37 +0300 Subject: [PATCH] chore: update scripts (#184) * Initial `dev` script and webpack config update * Update build and profiler scripts * Revert tsconfig paths * Update ZIP path * Use ROOT_DIR * Do not mangle and disable debug logging in production build --- .github/actions/constants.cjs | 2 +- .github/actions/get-workflow-artifacts.cjs | 10 - .github/workflows/pr-checks.yml | 4 +- .github/workflows/release.yml | 6 +- .github/workflows/sanity.yml | 2 +- package.json | 7 +- pnpm-lock.yaml | 535 ++++++++++++++++-- scripts/analyze.sh | 9 - scripts/build.sh | 23 - scripts/build.ts | 36 ++ scripts/dev.sh | 9 - scripts/dev.ts | 19 + scripts/profiler.ts | 20 + src/background/config.ts | 2 +- src/background/container.ts | 3 +- src/background/services/background.ts | 1 - src/background/services/storage.ts | 10 +- src/content/container.ts | 4 +- src/{manifest/chrome.json => manifest.json} | 7 +- src/manifest/edge.json | 33 -- src/manifest/firefox-v3.json | 53 -- src/manifest/firefox.json | 40 -- src/manifest/opera.json | 33 -- .../chrome-v3.json => manifestv3.json} | 0 src/shared/defines.ts | 5 + tsconfig.json | 1 + webpack.config.ts | 149 ----- webpack.config.utils.ts | 318 ----------- webpack/config.ts | 95 ++++ webpack/dev.ts | 47 ++ webpack/plugins.ts | 67 +++ webpack/prod.ts | 53 ++ webpack/profile.ts | 32 ++ 33 files changed, 882 insertions(+), 753 deletions(-) delete mode 100644 scripts/analyze.sh delete mode 100644 scripts/build.sh create mode 100644 scripts/build.ts delete mode 100755 scripts/dev.sh create mode 100644 scripts/dev.ts create mode 100644 scripts/profiler.ts rename src/{manifest/chrome.json => manifest.json} (89%) delete mode 100644 src/manifest/edge.json delete mode 100644 src/manifest/firefox-v3.json delete mode 100644 src/manifest/firefox.json delete mode 100644 src/manifest/opera.json rename src/{manifest/chrome-v3.json => manifestv3.json} (100%) create mode 100644 src/shared/defines.ts delete mode 100644 webpack.config.ts delete mode 100644 webpack.config.utils.ts create mode 100644 webpack/config.ts create mode 100644 webpack/dev.ts create mode 100644 webpack/plugins.ts create mode 100644 webpack/prod.ts create mode 100644 webpack/profile.ts diff --git a/.github/actions/constants.cjs b/.github/actions/constants.cjs index 054e47be..d8ba8208 100644 --- a/.github/actions/constants.cjs +++ b/.github/actions/constants.cjs @@ -1,6 +1,6 @@ const BADGE = 'Badge' -const BROWSERS = ['chrome', 'firefox', 'opera', 'edge'] +const BROWSERS = ['chrome', 'firefox'] const COLORS = { green: '3fb950', red: 'd73a49' diff --git a/.github/actions/get-workflow-artifacts.cjs b/.github/actions/get-workflow-artifacts.cjs index 9f8914bd..15501d67 100644 --- a/.github/actions/get-workflow-artifacts.cjs +++ b/.github/actions/get-workflow-artifacts.cjs @@ -13,16 +13,6 @@ const ARTIFACTS_DATA = { name: 'Firefox', url: null, size: null - }, - opera: { - name: 'Opera', - url: null, - size: null - }, - edge: { - name: 'Edge', - url: null, - size: null } } diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml index a175c18b..b93c5f04 100644 --- a/.github/workflows/pr-checks.yml +++ b/.github/workflows/pr-checks.yml @@ -19,7 +19,7 @@ jobs: strategy: fail-fast: false matrix: - browser: [chrome, firefox, opera, edge] + browser: [chrome, firefox] runs-on: ubuntu-22.04 steps: - name: Checkout repository @@ -36,7 +36,7 @@ jobs: uses: actions/upload-artifact@v3.1.3 with: name: ${{ github.event.pull_request.number }}-${{ matrix.browser }} - path: dist/${{ matrix.browser }}/${{ matrix.browser }}.zip + path: dist/${{ matrix.browser }}.zip if-no-files-found: error test: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 85e9b915..36c99705 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -49,7 +49,5 @@ jobs: prerelease: false generate_release_notes: true files: | - ./dist/chrome/chrome.zip - ./dist/firefox/firefox.zip - ./dist/opera/opera.zip - ./dist/edge/edge.zip + ./dist/chrome.zip + ./dist/firefox.zip diff --git a/.github/workflows/sanity.yml b/.github/workflows/sanity.yml index 47de1569..c4c55e29 100644 --- a/.github/workflows/sanity.yml +++ b/.github/workflows/sanity.yml @@ -13,7 +13,7 @@ jobs: strategy: fail-fast: false matrix: - browser: [chrome, firefox, opera, edge] + browser: [chrome, firefox] runs-on: ubuntu-22.04 steps: - name: Checkout repository diff --git a/package.json b/package.json index 958c2fae..17f52db1 100644 --- a/package.json +++ b/package.json @@ -9,14 +9,14 @@ "url": "https://github.com/interledger/web-monetization-extension" }, "scripts": { - "analyze": "bash ./scripts/analyze.sh", - "build": "bash ./scripts/build.sh", - "dev": "bash ./scripts/dev.sh", + "build": "tsx ./scripts/build.ts", + "dev": "tsx ./scripts/dev.ts", "lint": "concurrently \"pnpm:lint:*\"", "lint:fix": "eslint --ext js,jsx,ts,tsx, src --fix", "lint:eslint": "eslint . --ext .js,.ts,.tsx --max-warnings 0 --ignore-path .gitignore", "lint:prettier": "prettier \"**/*.(md|json|yml)\" --ignore-path .gitignore --check", "lint:type": "tsc --noEmit", + "profiler": "tsx ./scripts/profiler.ts", "test": "jest --maxWorkers=2 --passWithNoTests", "test:ci": "pnpm test -- --reporters=default --reporters=github-actions" }, @@ -100,6 +100,7 @@ "ts-jest": "^29.1.2", "ts-loader": "^9.5.1", "ts-node": "^10.9.2", + "tsx": "^4.7.1", "typescript": "^5.4.3", "webpack": "^5.90.3", "webpack-bundle-analyzer": "^4.10.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f5127bfe..d69c6175 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -64,7 +64,7 @@ dependencies: version: 18.2.0(react@18.2.0) react-hook-form: specifier: ^7.51.1 - version: 7.51.1(react@18.2.0) + version: 7.51.2(react@18.2.0) react-number-format: specifier: ^5.3.4 version: 5.3.4(react-dom@18.2.0)(react@18.2.0) @@ -132,7 +132,7 @@ devDependencies: version: 7.5.0(eslint@8.57.0)(typescript@5.4.3) autoprefixer: specifier: ^10.4.18 - version: 10.4.18(postcss@8.4.36) + version: 10.4.18(postcss@8.4.38) clean-webpack-plugin: specifier: ^4.0.0 version: 4.0.0(webpack@5.90.3) @@ -207,10 +207,10 @@ devDependencies: version: 2.0.0 postcss: specifier: ^8.4.36 - version: 8.4.36 + version: 8.4.38 postcss-loader: specifier: ^8.1.1 - version: 8.1.1(postcss@8.4.36)(typescript@5.4.3)(webpack@5.90.3) + version: 8.1.1(postcss@8.4.38)(typescript@5.4.3)(webpack@5.90.3) prettier: specifier: ^3.2.5 version: 3.2.5 @@ -238,6 +238,9 @@ devDependencies: ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@20.11.27)(typescript@5.4.3) + tsx: + specifier: ^4.7.1 + version: 4.7.1 typescript: specifier: ^5.4.3 version: 5.4.3 @@ -642,6 +645,213 @@ packages: engines: {node: '>=10.0.0'} dev: true + /@esbuild/aix-ppc64@0.19.12: + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.19.12: + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.19.12: + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.19.12: + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.19.12: + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.19.12: + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.19.12: + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.19.12: + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.19.12: + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.19.12: + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.19.12: + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.19.12: + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.19.12: + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.19.12: + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.19.12: + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.19.12: + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.19.12: + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.19.12: + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.19.12: + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.19.12: + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.19.12: + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.19.12: + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.19.12: + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -713,7 +923,7 @@ packages: dependencies: '@interledger/http-signature-utils': 2.0.2 '@interledger/openapi': 1.2.1 - axios: 1.6.7 + axios: 1.6.8 base64url: 3.0.1 http-message-signatures: 0.1.2 pino: 8.19.0 @@ -2059,14 +2269,15 @@ packages: is-string: 1.0.7 dev: true - /array.prototype.findlast@1.2.4: - resolution: {integrity: sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==} + /array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 es-errors: 1.3.0 + es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 dev: true @@ -2182,7 +2393,7 @@ packages: engines: {node: '>=8.0.0'} dev: false - /autoprefixer@10.4.18(postcss@8.4.36): + /autoprefixer@10.4.18(postcss@8.4.38): resolution: {integrity: sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==} engines: {node: ^10 || ^12 || >=14} hasBin: true @@ -2194,7 +2405,7 @@ packages: fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.36 + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true @@ -2225,10 +2436,10 @@ packages: engines: {node: '>=4'} dev: true - /axios@1.6.7: - resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} + /axios@1.6.8: + resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} dependencies: - follow-redirects: 1.15.5 + follow-redirects: 1.15.6 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -2895,12 +3106,12 @@ packages: webpack: optional: true dependencies: - icss-utils: 5.1.0(postcss@8.4.36) - postcss: 8.4.36 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.36) - postcss-modules-local-by-default: 4.0.4(postcss@8.4.36) - postcss-modules-scope: 3.1.1(postcss@8.4.36) - postcss-modules-values: 4.0.0(postcss@8.4.36) + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.38) + postcss-modules-local-by-default: 4.0.4(postcss@8.4.38) + postcss-modules-scope: 3.1.1(postcss@8.4.38) + postcss-modules-values: 4.0.0(postcss@8.4.38) postcss-value-parser: 4.2.0 semver: 7.6.0 webpack: 5.90.3(webpack-cli@5.1.4) @@ -2970,6 +3181,33 @@ packages: whatwg-url: 11.0.0 dev: true + /data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + /date-fns@2.30.0: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} @@ -3382,6 +3620,58 @@ packages: which-typed-array: 1.1.14 dev: true + /es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + dev: true + /es-array-method-boxes-properly@1.0.0: resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} dev: true @@ -3435,6 +3725,13 @@ packages: resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} dev: true + /es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + dev: true + /es-set-tostringtag@2.0.3: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} @@ -3459,6 +3756,37 @@ packages: is-symbol: 1.0.4 dev: true + /esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + dev: true + /escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} @@ -3749,7 +4077,7 @@ packages: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: array-includes: 3.1.7 - array.prototype.findlast: 1.2.4 + array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.2 array.prototype.toreversed: 1.1.2 array.prototype.tosorted: 1.1.3 @@ -4071,8 +4399,8 @@ packages: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} dev: true - /follow-redirects@1.15.5: - resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + /follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -4192,6 +4520,12 @@ packages: get-intrinsic: 1.2.4 dev: true + /get-tsconfig@4.7.3: + resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true + /getpass@0.1.7: resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} dependencies: @@ -4381,6 +4715,13 @@ packages: dependencies: function-bind: 1.1.2 + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: true + /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true @@ -4534,13 +4875,13 @@ packages: safer-buffer: 2.1.2 dev: true - /icss-utils@5.1.0(postcss@8.4.36): + /icss-utils@5.1.0(postcss@8.4.38): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.36 + postcss: 8.4.38 dev: true /ieee754@1.2.1: @@ -4660,6 +5001,13 @@ packages: hasown: 2.0.1 dev: true + /is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + dependencies: + is-typed-array: 1.1.13 + dev: true + /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} @@ -6292,29 +6640,29 @@ packages: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} - /postcss-import@15.1.0(postcss@8.4.36): + /postcss-import@15.1.0(postcss@8.4.38): resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.36 + postcss: 8.4.38 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 dev: true - /postcss-js@4.0.1(postcss@8.4.36): + /postcss-js@4.0.1(postcss@8.4.38): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: postcss: ^8.4.21 dependencies: camelcase-css: 2.0.1 - postcss: 8.4.36 + postcss: 8.4.38 dev: true - /postcss-load-config@4.0.2(postcss@8.4.36)(ts-node@10.9.2): + /postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2): resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} engines: {node: '>= 14'} peerDependencies: @@ -6327,12 +6675,12 @@ packages: optional: true dependencies: lilconfig: 3.1.1 - postcss: 8.4.36 + postcss: 8.4.38 ts-node: 10.9.2(@types/node@20.11.27)(typescript@5.4.3) yaml: 2.4.0 dev: true - /postcss-loader@8.1.1(postcss@8.4.36)(typescript@5.4.3)(webpack@5.90.3): + /postcss-loader@8.1.1(postcss@8.4.38)(typescript@5.4.3)(webpack@5.90.3): resolution: {integrity: sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==} engines: {node: '>= 18.12.0'} peerDependencies: @@ -6347,61 +6695,61 @@ packages: dependencies: cosmiconfig: 9.0.0(typescript@5.4.3) jiti: 1.21.0 - postcss: 8.4.36 + postcss: 8.4.38 semver: 7.6.0 webpack: 5.90.3(webpack-cli@5.1.4) transitivePeerDependencies: - typescript dev: true - /postcss-modules-extract-imports@3.0.0(postcss@8.4.36): + /postcss-modules-extract-imports@3.0.0(postcss@8.4.38): resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.36 + postcss: 8.4.38 dev: true - /postcss-modules-local-by-default@4.0.4(postcss@8.4.36): + /postcss-modules-local-by-default@4.0.4(postcss@8.4.38): resolution: {integrity: sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.36) - postcss: 8.4.36 + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 postcss-selector-parser: 6.0.15 postcss-value-parser: 4.2.0 dev: true - /postcss-modules-scope@3.1.1(postcss@8.4.36): + /postcss-modules-scope@3.1.1(postcss@8.4.38): resolution: {integrity: sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.36 + postcss: 8.4.38 postcss-selector-parser: 6.0.15 dev: true - /postcss-modules-values@4.0.0(postcss@8.4.36): + /postcss-modules-values@4.0.0(postcss@8.4.38): resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.36) - postcss: 8.4.36 + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 dev: true - /postcss-nested@6.0.1(postcss@8.4.36): + /postcss-nested@6.0.1(postcss@8.4.38): resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.36 + postcss: 8.4.38 postcss-selector-parser: 6.0.15 dev: true @@ -6417,13 +6765,13 @@ packages: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} dev: true - /postcss@8.4.36: - resolution: {integrity: sha512-/n7eumA6ZjFHAsbX30yhHup/IMkOmlmvtEi7P+6RMYf+bGJSUHc3geH4a0NSZxAz/RJfiS9tooCTs9LAVYUZKw==} + /postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 picocolors: 1.0.0 - source-map-js: 1.1.0 + source-map-js: 1.2.0 dev: true /prelude-ls@1.2.1: @@ -6632,8 +6980,8 @@ packages: react: 18.2.0 scheduler: 0.23.0 - /react-hook-form@7.51.1(react@18.2.0): - resolution: {integrity: sha512-ifnBjl+kW0ksINHd+8C/Gp6a4eZOdWyvRv0UBaByShwU8JbVx5hTcTWEcd5VdybvmPTATkVVXk9npXArHmo56w==} + /react-hook-form@7.51.2(react@18.2.0): + resolution: {integrity: sha512-y++lwaWjtzDt/XNnyGDQy6goHskFualmDlf+jzEZvjvz6KWDf7EboL7pUvRCzPTJd0EOPpdekYaQLEvvG6m6HA==} engines: {node: '>=12.22.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 @@ -6848,6 +7196,10 @@ packages: engines: {node: '>=8'} dev: true + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true + /resolve.exports@2.0.2: resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} engines: {node: '>=10'} @@ -6917,6 +7269,16 @@ packages: isarray: 2.0.5 dev: true + /safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -7095,8 +7457,8 @@ packages: atomic-sleep: 1.0.0 dev: false - /source-map-js@1.1.0: - resolution: {integrity: sha512-9vC2SfsJzlej6MAaMPLu8HiBSHGdRAJ9hVFYN1ibZoNkeanmDmLUcIrj6G9DGL7XMJ54AKg/G75akXl1/izTOw==} + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} dev: true @@ -7237,6 +7599,16 @@ packages: es-abstract: 1.22.5 dev: true + /string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + dev: true + /string.prototype.trimend@1.0.7: resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} dependencies: @@ -7245,6 +7617,14 @@ packages: es-abstract: 1.22.5 dev: true + /string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + /string.prototype.trimstart@1.0.7: resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} dependencies: @@ -7253,6 +7633,15 @@ packages: es-abstract: 1.22.5 dev: true + /string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: @@ -7395,11 +7784,11 @@ packages: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.0.0 - postcss: 8.4.36 - postcss-import: 15.1.0(postcss@8.4.36) - postcss-js: 4.0.1(postcss@8.4.36) - postcss-load-config: 4.0.2(postcss@8.4.36)(ts-node@10.9.2) - postcss-nested: 6.0.1(postcss@8.4.36) + postcss: 8.4.38 + postcss-import: 15.1.0(postcss@8.4.38) + postcss-js: 4.0.1(postcss@8.4.38) + postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2) + postcss-nested: 6.0.1(postcss@8.4.38) postcss-selector-parser: 6.0.15 resolve: 1.22.8 sucrase: 3.35.0 @@ -7670,6 +8059,17 @@ packages: typescript: 5.4.3 dev: true + /tsx@4.7.1: + resolution: {integrity: sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g==} + engines: {node: '>=18.0.0'} + hasBin: true + dependencies: + esbuild: 0.19.12 + get-tsconfig: 4.7.3 + optionalDependencies: + fsevents: 2.3.3 + dev: true + /tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} dependencies: @@ -7754,6 +8154,18 @@ packages: possible-typed-array-names: 1.0.0 dev: true + /typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + dev: true + /typescript@5.4.3: resolution: {integrity: sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==} engines: {node: '>=14.17'} @@ -8128,6 +8540,17 @@ packages: gopd: 1.0.1 has-tostringtag: 1.0.2 + /which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + dev: true + /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} diff --git a/scripts/analyze.sh b/scripts/analyze.sh deleted file mode 100644 index e424d7cf..00000000 --- a/scripts/analyze.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -u - -set -e - -TARGET=${1:-chrome} -NODE_ENV=profile - -echo Running ${NODE_ENV} build for ${TARGET}... -NODE_ENV=${NODE_ENV} TARGET=${TARGET} pnpm webpack diff --git a/scripts/build.sh b/scripts/build.sh deleted file mode 100644 index ceec3897..00000000 --- a/scripts/build.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -u - -set -e - -TARGET=${1} - -ENV=production -BROWSERS=("chrome" "firefox" "edge" "opera") -COMMAND="NODE_ENV=${ENV}" - -if echo "${BROWSERS[@]}" | grep -qw "${TARGET}" ; then - COMMAND="${COMMAND} TARGET=${TARGET} pnpm webpack" -elif [[ ${TARGET} == '' ]] ; then - COMMAND="${COMMAND} pnpm concurrently" - for BROWSER in "${BROWSERS[@]}" ; do - COMMAND="${COMMAND} \"TARGET=${BROWSER} pnpm webpack\"" - done -else - echo "${TARGET} was not found" - exit 1 -fi - -eval "${COMMAND}" diff --git a/scripts/build.ts b/scripts/build.ts new file mode 100644 index 00000000..8d0381a7 --- /dev/null +++ b/scripts/build.ts @@ -0,0 +1,36 @@ +/* eslint-disable no-console */ +import { webpack } from 'webpack' +import { TARGETS, Target } from '../webpack/config' +import { getProdConfig } from '../webpack/prod' + +const TARGET: Target | null = process.argv[2] + ? (process.argv[2] as Target) + : null + +if (TARGET !== null && !TARGETS.includes(TARGET)) { + console.log('Invalid target. Please use "chrome" or "firefox" as target.') + console.log( + 'Usage: pnpm prod , where is either "firefox" or "chrome".' + ) + console.log( + 'Omitting the target the extension will be built for all available targets.' + ) + process.exit(1) +} + +// If no target is specified, build for all available targets +if (TARGET === null) { + console.log(`Building extension for all available targets...`) + TARGETS.forEach((target) => { + const config = getProdConfig(target) + webpack(config).run((_, s) => { + console.log('Compilation complete', `${s?.endTime - s?.startTime}ms`) + }) + }) +} else { + const config = getProdConfig(TARGET) + console.log(`Building extension for ${TARGET.toUpperCase()}...`) + webpack(config).run((_, s) => { + console.log('Compilation complete', `${s?.endTime - s?.startTime}ms`) + }) +} diff --git a/scripts/dev.sh b/scripts/dev.sh deleted file mode 100755 index e6a8de36..00000000 --- a/scripts/dev.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -u - -set -ex - -TARGET=${1:-chrome} -NODE_ENV=development - -echo Running ${NODE_ENV} build for ${TARGET}... -NODE_ENV=${NODE_ENV} TARGET=${TARGET} pnpm webpack diff --git a/scripts/dev.ts b/scripts/dev.ts new file mode 100644 index 00000000..82a1de39 --- /dev/null +++ b/scripts/dev.ts @@ -0,0 +1,19 @@ +/* eslint-disable no-console */ +import { webpack } from 'webpack' +import { getDevConfig } from '../webpack/dev' + +const TARGET = process.argv[2] || 'chrome' + +if (TARGET !== 'firefox' && TARGET !== 'chrome') { + console.log('Invalid target. Please use "chrome" or "firefox" as target.') + console.log( + 'Usage: pnpm dev , where is either "firefox" or "chrome".' + ) + process.exit(1) +} + +const config = getDevConfig(TARGET) + +webpack(config, (_, s) => { + console.log('Compilation complete', `${s?.endTime - s?.startTime}ms`) +}) diff --git a/scripts/profiler.ts b/scripts/profiler.ts new file mode 100644 index 00000000..e84b6906 --- /dev/null +++ b/scripts/profiler.ts @@ -0,0 +1,20 @@ +/* eslint-disable no-console */ +import { webpack } from 'webpack' +import { Target } from '../webpack/config' +import { getProfileConfig } from '../webpack/profile' + +const TARGET = (process.argv[2] as Target) || 'chrome' + +if (TARGET !== 'firefox' && TARGET !== 'chrome') { + console.log('Invalid target. Please use "chrome" or "firefox" as target.') + console.log( + 'Usage: pnpm dev , where is either "firefox" or "chrome".' + ) + process.exit(1) +} + +const config = getProfileConfig(TARGET) + +webpack(config, (_, s) => { + console.log('Compilation complete', `${s?.endTime - s?.startTime}ms`) +}) diff --git a/src/background/config.ts b/src/background/config.ts index 735cafa9..a9445776 100644 --- a/src/background/config.ts +++ b/src/background/config.ts @@ -1,3 +1,3 @@ -export const DEFAULT_AMOUNT = 0.6 +export const DEFAULT_AMOUNT = '0.6' export const DEFAULT_SCALE = 2 export const DEFAULT_INTERVAL_MS = 3_600_000 diff --git a/src/background/container.ts b/src/background/container.ts index 66be3238..3a13e52f 100644 --- a/src/background/container.ts +++ b/src/background/container.ts @@ -7,6 +7,7 @@ import { MonetizationService } from './services' import { createLogger, Logger } from '@/shared/logger' +import { LOG_LEVEL } from '@/shared/defines' interface Cradle { logger: Logger @@ -23,7 +24,7 @@ export const configureContainer = () => { injectionMode: InjectionMode.CLASSIC }) - const logger = createLogger() + const logger = createLogger(LOG_LEVEL) container.register({ logger: asValue(logger), diff --git a/src/background/services/background.ts b/src/background/services/background.ts index f3c1ade8..6a36099e 100644 --- a/src/background/services/background.ts +++ b/src/background/services/background.ts @@ -63,7 +63,6 @@ export class Background { this.logger.error(message.action, e.message, e.description) return failure(OPEN_PAYMENTS_ERRORS[e.description] ?? e.description) } - this.logger.error(message.action, e.message) return failure(e.message) } diff --git a/src/background/services/storage.ts b/src/background/services/storage.ts index 9537d30c..46a9302c 100644 --- a/src/background/services/storage.ts +++ b/src/background/services/storage.ts @@ -83,9 +83,13 @@ export class StorageService { } website.url = url - website.amount = data.exceptionList[url] ?? { - value: DEFAULT_AMOUNT, - interval: DEFAULT_INTERVAL_MS + if (data.exceptionList && data.exceptionList[url]) { + website.amount = data.exceptionList[url] + } else { + website.amount = { + value: DEFAULT_AMOUNT, + interval: DEFAULT_INTERVAL_MS + } } } diff --git a/src/content/container.ts b/src/content/container.ts index 53f68cbe..129a6b6a 100644 --- a/src/content/container.ts +++ b/src/content/container.ts @@ -1,8 +1,8 @@ import { asClass, asValue, createContainer, InjectionMode } from 'awilix' import browser, { type Browser } from 'webextension-polyfill' - import { createLogger, Logger } from '@/shared/logger' import { ContentScript } from './services/contentScript' +import { LOG_LEVEL } from '@/shared/defines' interface Cradle { logger: Logger @@ -15,7 +15,7 @@ export const configureContainer = () => { injectionMode: InjectionMode.CLASSIC }) - const logger = createLogger() + const logger = createLogger(LOG_LEVEL) container.register({ logger: asValue(logger), diff --git a/src/manifest/chrome.json b/src/manifest.json similarity index 89% rename from src/manifest/chrome.json rename to src/manifest.json index 319e5d3f..824d87a5 100644 --- a/src/manifest/chrome.json +++ b/src/manifest.json @@ -36,5 +36,10 @@ "background/*", "openapi/*" ], - "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'" + "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'", + "browser_specific_settings": { + "gecko": { + "id": "tech@interledger.com" + } + } } diff --git a/src/manifest/edge.json b/src/manifest/edge.json deleted file mode 100644 index 9d490773..00000000 --- a/src/manifest/edge.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "__MSG_appName__", - "version": "1.0.1", - "manifest_version": 3, - "description": "__MSG_appDescription__", - "icons": { - "34": "assets/icons/icon-34.png", - "128": "assets/icons/icon-128.png" - }, - "default_locale": "en", - "content_scripts": [ - { - "matches": ["http://*/*", "https://*/*"], - "js": ["content/content.js"] - } - ], - "background": { - "service_worker": "background/background.js" - }, - "host_permissions": ["http://*/*", "https://*/*"], - "web_accessible_resources": [ - { - "resources": [ - "assets/*", - "content/*", - "options/*", - "popup/*", - "background/*" - ], - "matches": [""] - } - ] -} diff --git a/src/manifest/firefox-v3.json b/src/manifest/firefox-v3.json deleted file mode 100644 index 0a7029d9..00000000 --- a/src/manifest/firefox-v3.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "__MSG_appName__", - "version": "1.0.1", - "manifest_version": 3, - "description": "__MSG_appDescription__", - "icons": { - "34": "assets/icons/icon-34.png", - "128": "assets/icons/icon-128.png" - }, - "default_locale": "en", - "content_scripts": [ - { - "matches": ["http://*/*", "https://*/*"], - "js": ["content/content.js"] - } - ], - "background": { - "scripts": ["background/background.js"], - "type": "module" - }, - "permissions": ["tabs", "storage"], - "host_permissions": ["http://*/*", "https://*/*"], - "options_ui": { - "page": "options/index.html", - "browser_style": false - }, - "action": { - "default_icon": { - "16": "assets/icons/icon-16.png", - "48": "assets/icons/icon-48.png" - }, - "default_title": "Web Monetization", - "default_popup": "popup/index.html", - "browser_style": false - }, - "web_accessible_resources": [ - { - "resources": [ - "assets/*", - "content/*", - "options/*", - "popup/*", - "background/*" - ], - "matches": [""] - } - ], - "browser_specific_settings": { - "gecko": { - "id": "web-extension@interledger.com" - } - } -} diff --git a/src/manifest/firefox.json b/src/manifest/firefox.json deleted file mode 100644 index 382221c6..00000000 --- a/src/manifest/firefox.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "__MSG_appName__", - "version": "1.0.1", - "manifest_version": 2, - "description": "__MSG_appDescription__", - "icons": { - "34": "assets/icons/icon-34.png", - "128": "assets/icons/icon-128.png" - }, - "default_locale": "en", - "content_scripts": [ - { - "matches": ["http://*/*", "https://*/*", ""], - "js": ["content/content.js"] - } - ], - "background": { - "scripts": ["background/background.js"], - "type": "module" - }, - "permissions": ["tabs", "storage"], - "browser_action": { - "default_icon": "assets/icons/icon-34.png", - "default_title": "Web Monetization", - "default_popup": "popup/index.html", - "browser_style": false - }, - "web_accessible_resources": [ - "assets/*", - "content/*", - "options/*", - "popup/*", - "background/*" - ], - "browser_specific_settings": { - "gecko": { - "id": "web-extension@interledger.com" - } - } -} diff --git a/src/manifest/opera.json b/src/manifest/opera.json deleted file mode 100644 index 9d490773..00000000 --- a/src/manifest/opera.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "__MSG_appName__", - "version": "1.0.1", - "manifest_version": 3, - "description": "__MSG_appDescription__", - "icons": { - "34": "assets/icons/icon-34.png", - "128": "assets/icons/icon-128.png" - }, - "default_locale": "en", - "content_scripts": [ - { - "matches": ["http://*/*", "https://*/*"], - "js": ["content/content.js"] - } - ], - "background": { - "service_worker": "background/background.js" - }, - "host_permissions": ["http://*/*", "https://*/*"], - "web_accessible_resources": [ - { - "resources": [ - "assets/*", - "content/*", - "options/*", - "popup/*", - "background/*" - ], - "matches": [""] - } - ] -} diff --git a/src/manifest/chrome-v3.json b/src/manifestv3.json similarity index 100% rename from src/manifest/chrome-v3.json rename to src/manifestv3.json diff --git a/src/shared/defines.ts b/src/shared/defines.ts new file mode 100644 index 00000000..1f158c31 --- /dev/null +++ b/src/shared/defines.ts @@ -0,0 +1,5 @@ +import type { LogLevelDesc } from 'loglevel' + +declare const CONFIG_LOG_LEVEL: LogLevelDesc + +export const LOG_LEVEL = CONFIG_LOG_LEVEL diff --git a/tsconfig.json b/tsconfig.json index f39e802f..74aded0c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,6 +10,7 @@ "allowJs": true, "jsx": "react", "sourceMap": true, + "skipLibCheck": true, "moduleResolution": "node", "allowSyntheticDefaultImports": true, "allowUmdGlobalAccess": true, diff --git a/webpack.config.ts b/webpack.config.ts deleted file mode 100644 index 81a9d8f8..00000000 --- a/webpack.config.ts +++ /dev/null @@ -1,149 +0,0 @@ -import path from 'path' -import TerserPlugin from 'terser-webpack-plugin' - -import { IgnorePlugin, ProvidePlugin } from 'webpack' - -import { - config, - Directories, - getAnalyzerPlugins, - getCleanWebpackPlugins, - getCopyPlugins, - getEntry, - getEslintPlugins, - getExtensionManifestPlugins, - getExtensionReloaderPlugins, - getHTMLPlugins, - getOutput, - getProgressPlugins, - getResolves, - getZipPlugins -} from './webpack.config.utils' - -let generalConfig: any = { - mode: - config.NODE_ENV === 'production' || config.NODE_ENV === 'upload' - ? 'production' - : 'development', - module: { - rules: [ - { - test: /\.css$/i, - include: path.resolve(__dirname, 'src'), - use: [ - 'style-loader', - 'css-loader', - { - loader: 'postcss-loader', - options: { - postcssOptions: { - plugins: { - tailwindcss: {}, - autoprefixer: {} - } - } - } - } - ] - }, - { - test: /\.(js|jsx|ts|tsx)$/, - use: [ - { - loader: 'ts-loader' - } - ], - exclude: /node_modules/ - } - ] - }, - resolve: getResolves(), - entry: getEntry(Directories.SRC_DIR), - output: getOutput(config.TARGET, config.OUTPUT_DIR) -} - -let plugins: any[] = [ - ...getCleanWebpackPlugins( - `${config.OUTPUT_DIR}/${config.TARGET}`, - `${Directories.DIST_DIR}/${config.TARGET}` - ), - ...getProgressPlugins(), - ...getEslintPlugins(), - ...getExtensionManifestPlugins(), - ...getHTMLPlugins(config.TARGET, config.OUTPUT_DIR, Directories.SRC_DIR), - ...getCopyPlugins(config.TARGET, config.OUTPUT_DIR, Directories.SRC_DIR), - new ProvidePlugin({ - Buffer: ['buffer', 'Buffer'] - }), - new ProvidePlugin({ - process: 'process/browser' - }), - new IgnorePlugin({ - resourceRegExp: /node-fetch/, - contextRegExp: /@apidevtools\/json-schema-ref-parser/ - }) -] - -if (config.NODE_ENV === 'development') { - generalConfig = { - ...generalConfig, - devtool: 'cheap-module-source-map', - stats: { - all: false, - builtAt: true, - errors: true, - hash: true - }, - watch: true, - watchOptions: { - aggregateTimeout: 200, - poll: 1000 - } - } - - plugins = [...plugins, ...getExtensionReloaderPlugins()] -} - -if (config.NODE_ENV === 'profile') { - generalConfig = { - ...generalConfig, - devtool: 'source-map', - stats: { - all: false, - builtAt: true, - errors: true, - hash: true - } - } - - plugins = [...plugins, ...getAnalyzerPlugins()] -} - -if (config.NODE_ENV === 'production') { - generalConfig = { - ...generalConfig, - optimization: { - minimize: true, - minimizer: [ - new TerserPlugin({ - parallel: true, - terserOptions: { - format: { - comments: false - } - }, - extractComments: false - }) - ] - } - } - - plugins = [...plugins, ...getZipPlugins(config.TARGET, Directories.DIST_DIR)] -} - -export default [ - { - ...generalConfig, - plugins - } -] diff --git a/webpack.config.utils.ts b/webpack.config.utils.ts deleted file mode 100644 index 5eca0723..00000000 --- a/webpack.config.utils.ts +++ /dev/null @@ -1,318 +0,0 @@ -import { CleanWebpackPlugin } from 'clean-webpack-plugin' -import CopyWebpackPlugin from 'copy-webpack-plugin' -import ESLintPlugin from 'eslint-webpack-plugin' -import HtmlWebpackPlugin from 'html-webpack-plugin' -import path from 'path' -import { ProgressPlugin } from 'webpack' -import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer' -import WebpackExtensionManifestPlugin from 'webpack-extension-manifest-plugin' -import ZipPlugin from 'zip-webpack-plugin' - -const ExtReloader = require('webpack-ext-reloader-mv3') - -const manifestChrome = require('./src/manifest/chrome.json') -const manifestFirefox = require('./src/manifest/firefox.json') -const manifestOpera = require('./src/manifest/opera.json') -const manifestEdge = require('./src/manifest/edge.json') - -const manifest = { - chrome: manifestChrome, - firefox: manifestFirefox, - opera: manifestOpera, - edge: manifestEdge -} - -interface EnvironmentConfig { - NODE_ENV: string - OUTPUT_DIR: string - TARGET: string -} - -export const Directories = { - DEV_DIR: 'dev', - DIST_DIR: 'dist', - TEMP_DIR: 'temp', - SRC_DIR: 'src' -} - -/** - * Environment Config - * - */ -const EnvConfig: EnvironmentConfig = { - OUTPUT_DIR: - process.env.NODE_ENV === 'production' - ? Directories.TEMP_DIR - : process.env.NODE_ENV === 'upload' - ? Directories.DIST_DIR - : Directories.DEV_DIR, - ...(process.env.NODE_ENV - ? { NODE_ENV: process.env.NODE_ENV } - : { NODE_ENV: 'development' }), - ...(process.env.TARGET - ? { TARGET: process.env.TARGET } - : { TARGET: 'chrome-v3' }) -} - -/** - * Get HTML Plugins - * - * @param browserDir - * @param outputDir - * @param sourceDir - * @returns - */ -export const getHTMLPlugins = ( - browserDir: string, - outputDir = Directories.DEV_DIR, - sourceDir = Directories.SRC_DIR -) => [ - new HtmlWebpackPlugin({ - title: 'Popup', - filename: path.resolve( - __dirname, - `${outputDir}/${browserDir}/popup/index.html` - ), - template: path.resolve(__dirname, `${sourceDir}/popup/index.html`), - chunks: ['popup'] - }) -] - -/** - * Get DefinePlugins - * - * @param config - * @returns - */ -export const getDefinePlugins = () => [] - -/** - * Get Output Configurations - * - * @param browserDir - * @param outputDir - * @returns - */ -export const getOutput = ( - browserDir: string, - outputDir = Directories.DEV_DIR -) => { - return { - path: path.resolve(process.cwd(), `${outputDir}/${browserDir}`), - filename: '[name]/[name].js' - } -} - -/** - * Get Entry Points - * - * @param sourceDir - * @returns - */ -export const getEntry = (sourceDir = Directories.SRC_DIR) => { - return { - popup: [path.resolve(__dirname, `${sourceDir}/popup/index.tsx`)], - content: [path.resolve(__dirname, `${sourceDir}/content/index.ts`)], - contentStatic: [ - path.resolve(__dirname, `${sourceDir}/content/static/index.ts`) - ], - background: [path.resolve(__dirname, `${sourceDir}/background/index.ts`)] - } -} - -/** - * Get CopyPlugins - * - * @param browserDir - * @param outputDir - * @param sourceDir - * @returns - */ -export const getCopyPlugins = ( - browserDir: string, - outputDir = Directories.DEV_DIR, - sourceDir = Directories.SRC_DIR -) => { - return [ - new CopyWebpackPlugin({ - patterns: [ - { - from: path.resolve(__dirname, `${sourceDir}/assets`), - to: path.resolve(__dirname, `${outputDir}/${browserDir}/assets`) - }, - { - from: path.resolve(__dirname, `${sourceDir}/_locales`), - to: path.resolve(__dirname, `${outputDir}/${browserDir}/_locales`) - }, - // Bundle OpenAPI schemas - the Open Payments client is using them to - // validate responses. - { - from: path.resolve( - __dirname, - 'node_modules/@interledger/open-payments/dist/openapi' - ), - to: path.resolve(__dirname, `${outputDir}/${browserDir}/openapi`), - globOptions: { - ignore: ['**/generated/**'] - } - } - ] - }) - ] -} - -/** - * Get ZipPlugins - * - * @param browserDir - * @param outputDir - * @returns - */ -export const getZipPlugins = ( - browserDir: string, - outputDir = Directories.DIST_DIR -) => { - return [ - new ZipPlugin({ - path: path.resolve(process.cwd(), `${outputDir}/${browserDir}`), - filename: browserDir, - extension: 'zip', - fileOptions: { - mtime: new Date(), - mode: 0o100664, - compress: true, - forceZip64Format: false - }, - zipOptions: { - forceZip64Format: false - } - }) - ] -} - -/** - * Get Analyzer Plugins - * - * @returns - */ -export const getAnalyzerPlugins = () => { - return [ - new BundleAnalyzerPlugin({ - analyzerMode: 'server' - }) - ] -} - -/** - * Get CleanWebpackPlugins - * - * @param dirs - * @returns - */ -export const getCleanWebpackPlugins = (...dirs: string[]) => { - return [ - new CleanWebpackPlugin({ - cleanOnceBeforeBuildPatterns: [ - ...(dirs ? dirs.map((dir) => path.join(process.cwd(), `${dir}`)) : []) - ], - cleanStaleWebpackAssets: false, - verbose: true - }) - ] -} - -/** - * Get Resolves - * - * @returns - */ -export const getResolves = () => { - return { - fallback: { - events: require.resolve('events/'), - crypto: require.resolve('crypto-browserify'), - path: require.resolve('path-browserify'), - url: require.resolve('url/'), - util: require.resolve('util/'), - assert: require.resolve('assert/'), - querystring: require.resolve('querystring-es3'), - constants: require.resolve('constants-browserify'), - buffer: require.resolve('buffer/'), - zlib: require.resolve('browserify-zlib'), - stream: require.resolve('stream-browserify'), - http: require.resolve('stream-http'), - process: false, - fs: false, - net: false, - async_hooks: false - }, - alias: { - '@/shared': path.resolve(__dirname, './src/shared/'), - '@/popup': path.resolve(__dirname, './src/popup/'), - '@/background': path.resolve(__dirname, './src/background/'), - '@/content': path.resolve(__dirname, './src/content/'), - '@/assets': path.resolve(__dirname, './src/assets/') - }, - extensions: ['.js', '.jsx', '.ts', '.tsx'] - } -} - -/** - * Get Extension Manifest Plugins - * - * @returns - */ -export const getExtensionManifestPlugins = () => { - return [ - new WebpackExtensionManifestPlugin({ - config: { base: (manifest as any)[EnvConfig.TARGET] } - }) - ] -} - -export const eslintOptions = { - fix: true -} - -/** - * Get Eslint Plugins - * - * @returns - */ -export const getEslintPlugins = (options = eslintOptions) => { - return [new ESLintPlugin(options)] -} - -/** - * Get Progress Plugins - * - * @returns - */ -export const getProgressPlugins = () => { - return [new ProgressPlugin()] -} - -/** - * Environment Configuration Variables - * - */ -export const config = EnvConfig - -/** - * Get Extension Reloader Plugin - * - * @returns - */ -export const getExtensionReloaderPlugins = () => { - return [ - new ExtReloader({ - port: 9090, - reloadPage: true, - entries: { - contentScript: ['content'], - background: 'background', - extensionPage: ['popup', 'options'] - } - }) - ] -} diff --git a/webpack/config.ts b/webpack/config.ts new file mode 100644 index 00000000..1b8925c1 --- /dev/null +++ b/webpack/config.ts @@ -0,0 +1,95 @@ +/* eslint-disable no-console */ +import path from 'node:path' +import { Configuration } from 'webpack' + +export const TARGETS = ['chrome', 'firefox'] as const +export const ROOT_DIR = path.resolve(__dirname, '..') +export const DIRECTORIES = { + DEV: './dev', + DIST: './dist', + TEMP: './temp', + SRC: './src' +} +export const MANIFEST_PATH = path.resolve( + ROOT_DIR, + `${DIRECTORIES.SRC}/manifest.json` +) +export const OUTPUT_DIR = + process.env.NODE_ENV === 'production' + ? path.resolve(ROOT_DIR, DIRECTORIES.DIST) + : path.resolve(ROOT_DIR, DIRECTORIES.DEV) + +export const mainConfig: Configuration = { + module: { + rules: [ + { + test: /\.css$/i, + include: path.resolve(ROOT_DIR, DIRECTORIES.SRC), + use: [ + 'style-loader', + 'css-loader', + { + loader: 'postcss-loader', + options: { + postcssOptions: { + plugins: { + tailwindcss: {}, + autoprefixer: {} + } + } + } + } + ] + }, + { + test: /\.(js|jsx|ts|tsx)$/, + use: [ + { + loader: 'ts-loader' + } + ], + exclude: /node_modules/ + } + ] + }, + resolve: { + fallback: { + events: require.resolve('events/'), + crypto: require.resolve('crypto-browserify'), + path: require.resolve('path-browserify'), + url: require.resolve('url/'), + util: require.resolve('util/'), + assert: require.resolve('assert/'), + querystring: require.resolve('querystring-es3'), + constants: require.resolve('constants-browserify'), + buffer: require.resolve('buffer/'), + zlib: require.resolve('browserify-zlib'), + stream: require.resolve('stream-browserify'), + http: require.resolve('stream-http'), + process: false, + fs: false, + net: false, + async_hooks: false + }, + alias: { + '@/shared': path.resolve(ROOT_DIR, `${DIRECTORIES.SRC}/shared/`), + '@/popup': path.resolve(ROOT_DIR, `${DIRECTORIES.SRC}/popup/`), + '@/background': path.resolve(ROOT_DIR, `${DIRECTORIES.SRC}/background/`), + '@/content': path.resolve(ROOT_DIR, `${DIRECTORIES.SRC}/content/`), + '@/assets': path.resolve(ROOT_DIR, `${DIRECTORIES.SRC}/assets/`) + }, + extensions: ['.js', '.jsx', '.ts', '.tsx'] + }, + entry: { + popup: [path.resolve(ROOT_DIR, `${DIRECTORIES.SRC}/popup/index.tsx`)], + content: [path.resolve(ROOT_DIR, `${DIRECTORIES.SRC}/content/index.ts`)], + contentStatic: [ + path.resolve(ROOT_DIR, `${DIRECTORIES.SRC}/content/static/index.ts`) + ], + background: [ + path.resolve(ROOT_DIR, `${DIRECTORIES.SRC}/background/index.ts`) + ] + } +} + +export type Target = (typeof TARGETS)[number] diff --git a/webpack/dev.ts b/webpack/dev.ts new file mode 100644 index 00000000..16d394da --- /dev/null +++ b/webpack/dev.ts @@ -0,0 +1,47 @@ +import { Configuration, DefinePlugin } from 'webpack' +import { DIRECTORIES, ROOT_DIR, Target, mainConfig } from './config' +import path from 'node:path' +import { getMainPlugins } from './plugins' + +// eslint-disable-next-line @typescript-eslint/no-var-requires +const ExtentionReloader = require('webpack-ext-reloader-mv3') + +export const getDevConfig = (target: Target): Configuration => { + return { + ...mainConfig, + output: { + path: path.resolve(ROOT_DIR, `${DIRECTORIES.DEV}/${target}`), + filename: '[name]/[name].js', + clean: true + }, + mode: 'development', + devtool: 'inline-source-map', + stats: { + all: false, + builtAt: true, + errors: true, + hash: true + }, + watch: true, + watchOptions: { + aggregateTimeout: 200, + poll: 1000 + }, + plugins: getMainPlugins(DIRECTORIES.DEV, target).concat( + [ + new ExtentionReloader({ + port: 9090, + reloadPage: true, + entries: { + contentScript: ['content'], + background: 'background', + extensionPage: ['popup', 'options'] + } + }) + ], + new DefinePlugin({ + CONFIG_LOG_LEVEL: JSON.stringify('DEBUG') + }) + ) + } +} diff --git a/webpack/plugins.ts b/webpack/plugins.ts new file mode 100644 index 00000000..f5e0b563 --- /dev/null +++ b/webpack/plugins.ts @@ -0,0 +1,67 @@ +import path from 'node:path' +import HtmlWebpackPlugin from 'html-webpack-plugin' +import { MANIFEST_PATH, DIRECTORIES, ROOT_DIR, Target } from './config' +import { ProgressPlugin, ProvidePlugin, IgnorePlugin } from 'webpack' +import CopyWebpackPlugin from 'copy-webpack-plugin' +import { CleanWebpackPlugin } from 'clean-webpack-plugin' + +export const getMainPlugins = (outputDir: string, target: Target): any[] => [ + new CleanWebpackPlugin({ + cleanOnceBeforeBuildPatterns: [ + path.resolve(ROOT_DIR, `${outputDir}/${target}`) + ], + cleanStaleWebpackAssets: false, + verbose: true + }), + new ProgressPlugin(), + new HtmlWebpackPlugin({ + title: 'Popup', + filename: path.resolve(ROOT_DIR, `${outputDir}/${target}/popup/index.html`), + template: path.resolve(ROOT_DIR, `${DIRECTORIES.SRC}/popup/index.html`), + chunks: ['popup'] + }), + new CopyWebpackPlugin({ + patterns: [ + { + from: path.resolve(ROOT_DIR, `${DIRECTORIES.SRC}/assets`), + to: path.resolve(ROOT_DIR, `${outputDir}/${target}/assets`) + }, + { + from: path.resolve(ROOT_DIR, `${DIRECTORIES.SRC}/_locales`), + to: path.resolve(ROOT_DIR, `${outputDir}/${target}/_locales`) + }, + { + from: MANIFEST_PATH, + to: path.resolve(ROOT_DIR, `${outputDir}/${target}`), + transform: (content: Buffer) => { + if (target === 'firefox') { + // TODO: Update manifest for Firefox (V3) + } + return content + } + }, + // Bundle OpenAPI schemas - the Open Payments client is using them to + // validate responses. + { + from: path.resolve( + ROOT_DIR, + 'node_modules/@interledger/open-payments/dist/openapi' + ), + to: path.resolve(ROOT_DIR, `${outputDir}/${target}/openapi`), + globOptions: { + ignore: ['**/generated/**'] + } + } + ] + }), + new ProvidePlugin({ + Buffer: ['buffer', 'Buffer'] + }), + new ProvidePlugin({ + process: 'process/browser' + }), + new IgnorePlugin({ + resourceRegExp: /node-fetch/, + contextRegExp: /@apidevtools\/json-schema-ref-parser/ + }) +] diff --git a/webpack/prod.ts b/webpack/prod.ts new file mode 100644 index 00000000..c1f96c0c --- /dev/null +++ b/webpack/prod.ts @@ -0,0 +1,53 @@ +import { Configuration, DefinePlugin } from 'webpack' +import { DIRECTORIES, ROOT_DIR, Target, mainConfig } from './config' +import path from 'node:path' +import { getMainPlugins } from './plugins' +import TerserPlugin from 'terser-webpack-plugin' +import ZipPlugin from 'zip-webpack-plugin' + +export const getProdConfig = (target: Target): Configuration => { + return { + ...mainConfig, + output: { + path: path.resolve(ROOT_DIR, `${DIRECTORIES.DIST}/${target}`), + filename: '[name]/[name].js', + clean: true + }, + mode: 'production', + devtool: undefined, + optimization: { + minimize: true, + minimizer: [ + new TerserPlugin({ + parallel: true, + terserOptions: { + mangle: false, + format: { + comments: false + } + }, + extractComments: false + }) + ] + }, + plugins: getMainPlugins(DIRECTORIES.DIST, target).concat([ + new ZipPlugin({ + path: path.resolve(ROOT_DIR, `${DIRECTORIES.DIST}`), + filename: target, + extension: 'zip', + fileOptions: { + mtime: new Date(), + mode: 0o100664, + compress: true, + forceZip64Format: false + }, + zipOptions: { + forceZip64Format: false + } + }), + new DefinePlugin({ + CONFIG_LOG_LEVEL: JSON.stringify('WARN') + }) + ]) + } +} diff --git a/webpack/profile.ts b/webpack/profile.ts new file mode 100644 index 00000000..9a7508ef --- /dev/null +++ b/webpack/profile.ts @@ -0,0 +1,32 @@ +import { Configuration, DefinePlugin } from 'webpack' +import { DIRECTORIES, ROOT_DIR, Target, mainConfig } from './config' +import path from 'node:path' +import { getMainPlugins } from './plugins' +import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer' + +export const getProfileConfig = (target: Target): Configuration => { + return { + ...mainConfig, + output: { + path: path.resolve(ROOT_DIR, `${DIRECTORIES.TEMP}/${target}`), + filename: '[name]/[name].js', + clean: true + }, + mode: 'production', + devtool: 'source-map', + stats: { + all: false, + builtAt: true, + errors: true, + hash: true + }, + plugins: getMainPlugins(DIRECTORIES.DEV, target).concat([ + new BundleAnalyzerPlugin({ + analyzerMode: 'server' + }), + new DefinePlugin({ + CONFIG_LOG_LEVEL: JSON.stringify('DEBUG') + }) + ]) + } +}