From 4431b427a9a6a06923716c015c90080ff6b084b9 Mon Sep 17 00:00:00 2001 From: Marcos Iglesias Date: Tue, 5 Sep 2023 22:56:12 -0300 Subject: [PATCH] Initial commit --- .commitlintrc | 5 + .eslintignore | 12 + .eslintrc | 9 + .github/actions/setup/action.yml | 34 + .github/renovate.json | 23 + .github/workflows/build.yml | 71 + .github/workflows/release.yml | 19 + .../run-lighthouse-on-vercel-preview.yml | 71 + .gitignore | 25 + .husky/.gitignore | 1 + .husky/commit-msg | 4 + .husky/pre-commit | 4 + .nvmrc | 1 + .prettierignore | 16 + .prettierrc | 4 + .vscode/extensions.json | 7 + .vscode/settings.json | 30 + LICENSE | 21 + README.md | 118 + apps/website-ssr/.storybook/main.js | 1 + apps/website-ssr/.storybook/manager.js | 1 + apps/website-ssr/.storybook/preview.js | 3 + apps/website-ssr/e2e/index.e2e.ts | 29 + apps/website-ssr/jest.config.js | 1 + apps/website-ssr/lighthouse.config.js | 3 + apps/website-ssr/next-env.d.ts | 5 + apps/website-ssr/next.config.js | 3 + apps/website-ssr/package.json | 36 + apps/website-ssr/playwright.config.js | 4 + apps/website-ssr/postcss.config.js | 1 + .../public/android-chrome-192x192.png | Bin 0 -> 6621 bytes .../public/android-chrome-512x512.png | Bin 0 -> 29218 bytes apps/website-ssr/public/apple-touch-icon.png | Bin 0 -> 5985 bytes apps/website-ssr/public/favicon-16x16.png | Bin 0 -> 413 bytes apps/website-ssr/public/favicon-32x32.png | Bin 0 -> 791 bytes apps/website-ssr/public/favicon.ico | Bin 0 -> 15406 bytes apps/website-ssr/public/icon-192x192.png | Bin 0 -> 5949 bytes apps/website-ssr/public/icon-256x256.png | Bin 0 -> 9439 bytes apps/website-ssr/public/icon-384x384.png | Bin 0 -> 17053 bytes apps/website-ssr/public/icon-512x512.png | Bin 0 -> 21476 bytes apps/website-ssr/public/manifest.json | 38 + apps/website-ssr/public/maskable_icon.png | Bin 0 -> 10219 bytes apps/website-ssr/public/maskable_icon_x48.png | Bin 0 -> 858 bytes apps/website-ssr/public/site.webmanifest | 11 + apps/website-ssr/public/sw.js | 1 + apps/website-ssr/public/workbox-8c8aeaed.js | 1 + apps/website-ssr/src/components/Footer.tsx | 14 + apps/website-ssr/src/components/Header.tsx | 35 + apps/website-ssr/src/components/Layout.tsx | 14 + apps/website-ssr/src/pages/404.page.tsx | 24 + apps/website-ssr/src/pages/DemoSSR.page.tsx | 41 + apps/website-ssr/src/pages/Home.stories.tsx | 24 + apps/website-ssr/src/pages/Home.test.tsx | 38 + apps/website-ssr/src/pages/_app.page.tsx | 16 + apps/website-ssr/src/pages/_document.page.tsx | 54 + apps/website-ssr/src/pages/index.page.tsx | 39 + apps/website-ssr/src/styles.css | 3 + apps/website-ssr/tailwind.config.js | 1 + apps/website-ssr/tsconfig.json | 11 + apps/website/.storybook/main.js | 1 + apps/website/.storybook/manager.js | 1 + apps/website/.storybook/preview.js | 3 + apps/website/e2e/index.e2e.ts | 29 + apps/website/jest.config.js | 1 + apps/website/lighthouse.config.js | 3 + apps/website/next-env.d.ts | 5 + apps/website/next.config.js | 3 + apps/website/package.json | 36 + apps/website/playwright.config.js | 4 + apps/website/postcss.config.js | 1 + apps/website/src/components/Footer.tsx | 14 + apps/website/src/components/Header.tsx | 35 + apps/website/src/components/Layout.tsx | 14 + apps/website/src/pages/404.page.tsx | 24 + apps/website/src/pages/Home.stories.tsx | 24 + apps/website/src/pages/Home.test.tsx | 38 + apps/website/src/pages/_app.page.tsx | 16 + apps/website/src/pages/_document.page.tsx | 35 + apps/website/src/pages/index.page.tsx | 30 + apps/website/src/styles.css | 3 + apps/website/tailwind.config.js | 1 + apps/website/tsconfig.json | 11 + package.json | 60 + .../eslint-config-custom/eslint.config.js | 75 + packages/eslint-config-custom/package.json | 18 + packages/jest-config/jest.config.js | 11 + packages/jest-config/jest.setup.js | 1 + packages/jest-config/package.json | 10 + .../lighthouse-config/lighthouse.config.js | 18 + packages/lighthouse-config/package.json | 5 + packages/next-config/next.config.js | 17 + packages/next-config/nextpwa.config.js | 33 + packages/next-config/package.json | 10 + packages/playwright-config/package.json | 5 + .../playwright-config/playwright.config.js | 38 + packages/storybook-config/main.config.js | 27 + packages/storybook-config/manager.config.js | 7 + packages/storybook-config/package.json | 16 + packages/storybook-config/preview.config.js | 55 + packages/storybook-config/preview.css | 12 + .../storybook-config/static/logo-dark.svg | 1 + .../storybook-config/static/logo-light.svg | 1 + packages/storybook-config/themes.js | 19 + packages/tailwindcss-config/hocus.plugin.js | 17 + packages/tailwindcss-config/package.json | 10 + packages/tailwindcss-config/postcss.config.js | 6 + .../tailwindcss-config/tailwind.config.js | 15 + packages/typescript-config/base.json | 16 + packages/typescript-config/next.json | 11 + packages/typescript-config/package.json | 8 + packages/typescript-config/react.json | 8 + packages/ui/.storybook/main.js | 1 + packages/ui/.storybook/manager.js | 1 + packages/ui/.storybook/preview.js | 3 + packages/ui/jest.config.js | 1 + packages/ui/package.json | 46 + packages/ui/postcss.config.js | 1 + .../src/components/Button/Button.stories.tsx | 40 + .../ui/src/components/Button/Button.test.tsx | 29 + packages/ui/src/components/Button/Button.tsx | 17 + .../components/Button/ButtonLink.stories.tsx | 37 + .../src/components/Button/ButtonLink.test.tsx | 16 + .../ui/src/components/Button/ButtonLink.tsx | 21 + packages/ui/src/components/Button/index.ts | 2 + packages/ui/src/components/Button/styles.ts | 11 + packages/ui/src/components/Button/types.ts | 1 + .../ui/src/components/Container/Container.tsx | 9 + packages/ui/src/components/Container/index.ts | 1 + .../src/components/Footer/Footer.stories.tsx | 21 + .../ui/src/components/Footer/Footer.test.tsx | 66 + packages/ui/src/components/Footer/Footer.tsx | 78 + packages/ui/src/components/Footer/index.ts | 1 + .../src/components/Header/Header.stories.tsx | 40 + .../ui/src/components/Header/Header.test.tsx | 47 + packages/ui/src/components/Header/Header.tsx | 16 + packages/ui/src/components/Header/index.ts | 1 + .../ui/src/components/Logo/Logo.stories.tsx | 16 + packages/ui/src/components/Logo/Logo.tsx | 21 + packages/ui/src/components/Logo/index.ts | 1 + .../Navigation/MobileNavigation.tsx | 69 + .../Navigation/MobileNavigationButton.tsx | 28 + .../Navigation/MobileNavigationIcon.tsx | 29 + .../Navigation/Navigation.stories.tsx | 67 + .../components/Navigation/Navigation.test.tsx | 44 + .../src/components/Navigation/Navigation.tsx | 39 + .../ui/src/components/Navigation/index.ts | 1 + .../ui/src/components/Navigation/types.ts | 5 + packages/ui/src/components/index.ts | 5 + packages/ui/src/index.ts | 2 + packages/ui/src/pages/index.ts | 1 + packages/ui/src/styles.css | 3 + packages/ui/tailwind.config.js | 1 + packages/ui/tsconfig.json | 7 + packages/utils/jest.config.js | 1 + packages/utils/package.json | 33 + packages/utils/src/csp/index.test.ts | 45 + packages/utils/src/csp/index.ts | 96 + packages/utils/src/index.ts | 1 + packages/utils/src/pages/index.ts | 1 + packages/utils/tsconfig.json | 7 + pnpm-lock.yaml | 13549 ++++++++++++++++ pnpm-workspace.yaml | 3 + turbo.code-workspace | 204 + turbo.json | 41 + 164 files changed, 16616 insertions(+) create mode 100644 .commitlintrc create mode 100644 .eslintignore create mode 100644 .eslintrc create mode 100644 .github/actions/setup/action.yml create mode 100644 .github/renovate.json create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/run-lighthouse-on-vercel-preview.yml create mode 100644 .gitignore create mode 100644 .husky/.gitignore create mode 100755 .husky/commit-msg create mode 100755 .husky/pre-commit create mode 100644 .nvmrc create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 LICENSE create mode 100644 README.md create mode 100644 apps/website-ssr/.storybook/main.js create mode 100644 apps/website-ssr/.storybook/manager.js create mode 100644 apps/website-ssr/.storybook/preview.js create mode 100644 apps/website-ssr/e2e/index.e2e.ts create mode 100644 apps/website-ssr/jest.config.js create mode 100644 apps/website-ssr/lighthouse.config.js create mode 100644 apps/website-ssr/next-env.d.ts create mode 100644 apps/website-ssr/next.config.js create mode 100644 apps/website-ssr/package.json create mode 100644 apps/website-ssr/playwright.config.js create mode 100644 apps/website-ssr/postcss.config.js create mode 100644 apps/website-ssr/public/android-chrome-192x192.png create mode 100644 apps/website-ssr/public/android-chrome-512x512.png create mode 100644 apps/website-ssr/public/apple-touch-icon.png create mode 100644 apps/website-ssr/public/favicon-16x16.png create mode 100644 apps/website-ssr/public/favicon-32x32.png create mode 100644 apps/website-ssr/public/favicon.ico create mode 100644 apps/website-ssr/public/icon-192x192.png create mode 100644 apps/website-ssr/public/icon-256x256.png create mode 100644 apps/website-ssr/public/icon-384x384.png create mode 100644 apps/website-ssr/public/icon-512x512.png create mode 100644 apps/website-ssr/public/manifest.json create mode 100644 apps/website-ssr/public/maskable_icon.png create mode 100644 apps/website-ssr/public/maskable_icon_x48.png create mode 100644 apps/website-ssr/public/site.webmanifest create mode 100644 apps/website-ssr/public/sw.js create mode 100644 apps/website-ssr/public/workbox-8c8aeaed.js create mode 100644 apps/website-ssr/src/components/Footer.tsx create mode 100644 apps/website-ssr/src/components/Header.tsx create mode 100644 apps/website-ssr/src/components/Layout.tsx create mode 100644 apps/website-ssr/src/pages/404.page.tsx create mode 100644 apps/website-ssr/src/pages/DemoSSR.page.tsx create mode 100644 apps/website-ssr/src/pages/Home.stories.tsx create mode 100644 apps/website-ssr/src/pages/Home.test.tsx create mode 100644 apps/website-ssr/src/pages/_app.page.tsx create mode 100644 apps/website-ssr/src/pages/_document.page.tsx create mode 100644 apps/website-ssr/src/pages/index.page.tsx create mode 100644 apps/website-ssr/src/styles.css create mode 100644 apps/website-ssr/tailwind.config.js create mode 100644 apps/website-ssr/tsconfig.json create mode 100644 apps/website/.storybook/main.js create mode 100644 apps/website/.storybook/manager.js create mode 100644 apps/website/.storybook/preview.js create mode 100644 apps/website/e2e/index.e2e.ts create mode 100644 apps/website/jest.config.js create mode 100644 apps/website/lighthouse.config.js create mode 100644 apps/website/next-env.d.ts create mode 100644 apps/website/next.config.js create mode 100644 apps/website/package.json create mode 100644 apps/website/playwright.config.js create mode 100644 apps/website/postcss.config.js create mode 100644 apps/website/src/components/Footer.tsx create mode 100644 apps/website/src/components/Header.tsx create mode 100644 apps/website/src/components/Layout.tsx create mode 100644 apps/website/src/pages/404.page.tsx create mode 100644 apps/website/src/pages/Home.stories.tsx create mode 100644 apps/website/src/pages/Home.test.tsx create mode 100644 apps/website/src/pages/_app.page.tsx create mode 100644 apps/website/src/pages/_document.page.tsx create mode 100644 apps/website/src/pages/index.page.tsx create mode 100644 apps/website/src/styles.css create mode 100644 apps/website/tailwind.config.js create mode 100644 apps/website/tsconfig.json create mode 100644 package.json create mode 100644 packages/eslint-config-custom/eslint.config.js create mode 100644 packages/eslint-config-custom/package.json create mode 100644 packages/jest-config/jest.config.js create mode 100644 packages/jest-config/jest.setup.js create mode 100644 packages/jest-config/package.json create mode 100644 packages/lighthouse-config/lighthouse.config.js create mode 100644 packages/lighthouse-config/package.json create mode 100644 packages/next-config/next.config.js create mode 100644 packages/next-config/nextpwa.config.js create mode 100644 packages/next-config/package.json create mode 100644 packages/playwright-config/package.json create mode 100644 packages/playwright-config/playwright.config.js create mode 100644 packages/storybook-config/main.config.js create mode 100644 packages/storybook-config/manager.config.js create mode 100644 packages/storybook-config/package.json create mode 100644 packages/storybook-config/preview.config.js create mode 100644 packages/storybook-config/preview.css create mode 100644 packages/storybook-config/static/logo-dark.svg create mode 100644 packages/storybook-config/static/logo-light.svg create mode 100644 packages/storybook-config/themes.js create mode 100644 packages/tailwindcss-config/hocus.plugin.js create mode 100644 packages/tailwindcss-config/package.json create mode 100644 packages/tailwindcss-config/postcss.config.js create mode 100644 packages/tailwindcss-config/tailwind.config.js create mode 100644 packages/typescript-config/base.json create mode 100644 packages/typescript-config/next.json create mode 100644 packages/typescript-config/package.json create mode 100644 packages/typescript-config/react.json create mode 100644 packages/ui/.storybook/main.js create mode 100644 packages/ui/.storybook/manager.js create mode 100644 packages/ui/.storybook/preview.js create mode 100644 packages/ui/jest.config.js create mode 100644 packages/ui/package.json create mode 100644 packages/ui/postcss.config.js create mode 100644 packages/ui/src/components/Button/Button.stories.tsx create mode 100644 packages/ui/src/components/Button/Button.test.tsx create mode 100644 packages/ui/src/components/Button/Button.tsx create mode 100644 packages/ui/src/components/Button/ButtonLink.stories.tsx create mode 100644 packages/ui/src/components/Button/ButtonLink.test.tsx create mode 100644 packages/ui/src/components/Button/ButtonLink.tsx create mode 100644 packages/ui/src/components/Button/index.ts create mode 100644 packages/ui/src/components/Button/styles.ts create mode 100644 packages/ui/src/components/Button/types.ts create mode 100644 packages/ui/src/components/Container/Container.tsx create mode 100644 packages/ui/src/components/Container/index.ts create mode 100644 packages/ui/src/components/Footer/Footer.stories.tsx create mode 100644 packages/ui/src/components/Footer/Footer.test.tsx create mode 100644 packages/ui/src/components/Footer/Footer.tsx create mode 100644 packages/ui/src/components/Footer/index.ts create mode 100644 packages/ui/src/components/Header/Header.stories.tsx create mode 100644 packages/ui/src/components/Header/Header.test.tsx create mode 100644 packages/ui/src/components/Header/Header.tsx create mode 100644 packages/ui/src/components/Header/index.ts create mode 100644 packages/ui/src/components/Logo/Logo.stories.tsx create mode 100644 packages/ui/src/components/Logo/Logo.tsx create mode 100644 packages/ui/src/components/Logo/index.ts create mode 100644 packages/ui/src/components/Navigation/MobileNavigation.tsx create mode 100644 packages/ui/src/components/Navigation/MobileNavigationButton.tsx create mode 100644 packages/ui/src/components/Navigation/MobileNavigationIcon.tsx create mode 100644 packages/ui/src/components/Navigation/Navigation.stories.tsx create mode 100644 packages/ui/src/components/Navigation/Navigation.test.tsx create mode 100644 packages/ui/src/components/Navigation/Navigation.tsx create mode 100644 packages/ui/src/components/Navigation/index.ts create mode 100644 packages/ui/src/components/Navigation/types.ts create mode 100644 packages/ui/src/components/index.ts create mode 100644 packages/ui/src/index.ts create mode 100644 packages/ui/src/pages/index.ts create mode 100644 packages/ui/src/styles.css create mode 100644 packages/ui/tailwind.config.js create mode 100644 packages/ui/tsconfig.json create mode 100644 packages/utils/jest.config.js create mode 100644 packages/utils/package.json create mode 100644 packages/utils/src/csp/index.test.ts create mode 100644 packages/utils/src/csp/index.ts create mode 100644 packages/utils/src/index.ts create mode 100644 packages/utils/src/pages/index.ts create mode 100644 packages/utils/tsconfig.json create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml create mode 100644 turbo.code-workspace create mode 100644 turbo.json diff --git a/.commitlintrc b/.commitlintrc new file mode 100644 index 00000000..0df1d253 --- /dev/null +++ b/.commitlintrc @@ -0,0 +1,5 @@ +{ + "extends": [ + "@commitlint/config-conventional" + ] +} diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 00000000..4c0576e8 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,12 @@ +.cache/ +.lighthouseci/ +.next/ +.swc/ +.turbo/ +coverage/ +dist/ +e2e-report/ +e2e-results/ +out/ +storybook-static/ +*.js diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 00000000..0c77b631 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,9 @@ +{ + "root": true, + "extends": ["custom"], + "settings": { + "next": { + "rootDir": ["apps/*/"] + } + } +} diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml new file mode 100644 index 00000000..3437b5d8 --- /dev/null +++ b/.github/actions/setup/action.yml @@ -0,0 +1,34 @@ +name: Setup +description: "Install required dependencies and build site" + +inputs: + node-version: + description: "Node version" + required: true + default: "18" + pnpm-version: + description: "pnpm version" + required: true + default: "8" + +runs: + using: "composite" + steps: + - name: Set up pnpm + uses: pnpm/action-setup@v2 + with: + version: ${{ inputs.pnpm-version }} + - name: Set up Node ${{ inputs.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ inputs.node-version }} + cache: "pnpm" + - name: Install dependencies + run: pnpm install + shell: bash + - name: Install Playwright browsers + run: pnpm playwright install --with-deps + shell: bash + - name: Install Lighthouse globally + run: npm install -g @lhci/cli + shell: bash diff --git a/.github/renovate.json b/.github/renovate.json new file mode 100644 index 00000000..db9bf27f --- /dev/null +++ b/.github/renovate.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "config:best-practices", + "config:js-app", + "config:semverAllMonthly", + ":disableRateLimiting", + ":noUnscheduledUpdates", + ":automergeLinters", + ":automergeTesters", + ":automergeTypes", + ":automergeMinor" + ], + "timezone": "America/Los_Angeles", + "schedule": ["after 8pm every weekday", "every weekend"], + "automergeType": "pr", + "platformAutomerge": true, + "rebaseWhen": "conflicted", + "semanticCommits": "enabled", + "constraints": { + "pnpm": "8" + } +} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..1ed71e25 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,71 @@ +name: Build + +on: + pull_request: + workflow_call: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + # - name: Configure Pages + # id: pages + # uses: actions/configure-pages@v3 + - name: Setup + uses: ./.github/actions/setup + - name: Build + run: pnpm build + - name: Run linters + run: pnpm lint + + # - name: Run unit tests + # run: pnpm test:unit + # - name: Run e2e tests + # run: pnpm test:e2e + + # - name: Move output of Website SSR + # run: | + # mkdir -p out + # mv apps/website-ssr/out out/website-ssr + # mv out apps/website-ssr/ + + # - name: Run Lighthouse tests on Website SSR + # run: | + # cd apps/website-ssr + # lhci autorun --config=lighthouse.config.js + # env: + # LHCI_GITHUB_APP_TOKEN: ${{ secrets.LHCI_GITHUB_APP_TOKEN }} + + # - name: Move output of website + # run: | + # mkdir -p out + # mv apps/website/out out${{ steps.pages.outputs.base_path }} + # mv out apps/website/ + + # - name: Run Lighthouse tests on website + # run: | + # cd apps/website + # lhci autorun --config=lighthouse.config.js + # env: + # LHCI_GITHUB_APP_TOKEN: ${{ secrets.LHCI_GITHUB_APP_TOKEN }} + + # - name: Upload website + # uses: actions/upload-artifact@v3 + # with: + # name: website + # path: apps/website/out${{ steps.pages.outputs.base_path }} + # retention-days: 1 + + # - name: Upload e2e test reports + # uses: actions/upload-artifact@v3 + # if: ${{ always() }} + # with: + # name: e2e-reports + # path: | + # apps/website-ssr/e2e-report/ + # apps/website-ssr/e2e-results/ + # apps/website/e2e-report/ + # apps/website/e2e-results/ + # retention-days: 7 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..a725dc5e --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,19 @@ +name: Release + +on: + push: + branches: main + +permissions: + contents: write + pull-requests: write + +jobs: + release: + runs-on: ubuntu-latest + steps: + - name: Release + uses: google-github-actions/release-please-action@v3 + with: + release-type: node + package-name: turbo-monorepo-template diff --git a/.github/workflows/run-lighthouse-on-vercel-preview.yml b/.github/workflows/run-lighthouse-on-vercel-preview.yml new file mode 100644 index 00000000..3fbc071c --- /dev/null +++ b/.github/workflows/run-lighthouse-on-vercel-preview.yml @@ -0,0 +1,71 @@ +name: Vercel Preview URL Lighthouse Audit + +on: + issue_comment: + types: [edited] + +jobs: + generate_lighthouse_audit: + timeout-minutes: 30 + runs-on: ubuntu-latest + steps: + - name: Add comment to PR + id: loading_comment_to_pr + uses: marocchino/sticky-pull-request-comment@v2 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + number: ${{ github.event.issue.number }} + header: lighthouse + message: | + Running Lighthouse audit... + - name: Capture Vercel preview URL + id: vercel_preview_url + uses: aaimio/vercel-preview-url-action@v2.2.0 # aaron-binary/vercel-preview-url-action@v0.0.3 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - uses: actions/checkout@v2 + - name: Audit preview URL with Lighthouse + id: lighthouse_audit + uses: treosh/lighthouse-ci-action@v10 + with: + urls: | + ${{ steps.vercel_preview_url.outputs.vercel_preview_url }} + uploadArtifacts: true + temporaryPublicStorage: true + - name: Format lighthouse score + id: format_lighthouse_score + uses: actions/github-script@v6 + with: + github-token: ${{secrets.GITHUB_TOKEN}} + script: | + const result = ${{ steps.lighthouse_audit.outputs.manifest }}[0].summary + const links = ${{ steps.lighthouse_audit.outputs.links }} + + const formatResult = (res) => Math.round((res * 100)) + Object.keys(result).forEach(key => result[key] = formatResult(result[key])) + + const score = res => res >= 90 ? '๐ŸŸข' : res >= 50 ? '๐ŸŸ ' : '๐Ÿ”ด' + + const comment = [ + `โšก๏ธ [Lighthouse report](${Object.values(links)[0]}) for the changes in this PR:`, + '| Category | Score |', + '| --- | --- |', + `| ${score(result.performance)} Performance | ${result.performance} |`, + `| ${score(result.accessibility)} Accessibility | ${result.accessibility} |`, + `| ${score(result['best-practices'])} Best practices | ${result['best-practices']} |`, + `| ${score(result.seo)} SEO | ${result.seo} |`, + `| ${score(result.pwa)} PWA | ${result.pwa} |`, + ' ', + `*Lighthouse ran on [${Object.keys(links)[0]}](${Object.keys(links)[0]})*` + ].join('\n') + + core.setOutput("comment", comment); + - name: Add comment to PR + id: comment_to_pr + uses: marocchino/sticky-pull-request-comment@v2 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + number: ${{ github.event.issue.number }} + header: lighthouse + message: | + ${{ steps.format_lighthouse_score.outputs.comment }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..4a0dcc8a --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +.cache/ +.lighthouseci/ +.next/ +.swc/ +.turbo/ +coverage/ +dist/ +e2e-report/ +e2e-results/ +node_modules/ +out/ +storybook-static/ +.env +.env.* +!.env.example +.eslintcache +**/graph.svg + +# PWA files +**/public/sw.js +**/public/workbox-*.js +**/public/worker-*.js +**/public/sw.js.map +**/public/workbox-*.js.map +**/public/worker-*.js.map \ No newline at end of file diff --git a/.husky/.gitignore b/.husky/.gitignore new file mode 100644 index 00000000..31354ec1 --- /dev/null +++ b/.husky/.gitignore @@ -0,0 +1 @@ +_ diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100755 index 00000000..a483680b --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +pnpm commitlint --edit ${1} diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 00000000..fab6428a --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +pnpm lint-staged diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..25bf17fc --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +18 \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..84d14583 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,16 @@ +.cache/ +.lighthouseci/ +.next/ +.swc/ +.turbo/ +coverage/ +dist/ +e2e-report/ +e2e-results/ +out/ +storybook-static/ +.eslintcache +CHANGELOG.md +package-lock.json +pnpm-lock.yaml +yarn.lock diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..a43a07b5 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,4 @@ +{ + "printWidth": 100, + "plugins": ["prettier-plugin-tailwindcss"] +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..7befee48 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "bradlc.vscode-tailwindcss", + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..dad68f6b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,30 @@ +{ + "editor.codeActionsOnSave": { + "source.fixAll": true + }, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + "editor.rulers": [{ "column": 100 }], + "editor.tabSize": 2, + "files.associations": { + "*.css": "tailwindcss" + }, + "files.readonlyInclude": { + ".cache/**": true, + ".next/**": true, + ".swc/**": true, + ".turbo/**": true, + "coverage/**": true, + "dist/**": true, + "e2e-report/**": true, + "e2e-results/**": true, + "node_modules/**": true, + "out/**": true, + "storybook-static/**": true, + ".eslintcache": true + }, + "javascript.preferences.importModuleSpecifier": "non-relative", + "typescript.preferences.importModuleSpecifier": "non-relative", + "typescript.tsdk": "root/node_modules/typescript/lib", + "workbench.editor.labelFormat": "medium" +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..2d631618 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Markkos98 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 00000000..f43081ca --- /dev/null +++ b/README.md @@ -0,0 +1,118 @@ +# Next.js & Tailwind CSS Monorepo Template + +This is a monorepo template using: + +- ๐Ÿ“ [TypeScript 5.0](https://www.typescriptlang.org/) +- โšก๏ธ [Next.js 13.2](https://nextjs.org/) +- โš›๏ธ [React 18.2](https://reactjs.org/) +- ๐ŸŒฌ๏ธ [Tailwind CSS 3.3](https://tailwindcss.com/) +- ๐Ÿ“• [Storybook 7.0](https://storybook.js.org/) +- ๐Ÿงช [Testing Library](https://testing-library.com/) +- ๐Ÿƒ [Jest](https://jestjs.io/) +- ๐ŸŽญ [Playwright](https://playwright.dev/) +- ๐Ÿ’ก [Lighthouse](https://developer.chrome.com/docs/lighthouse/) +- ๐Ÿงน [ESLint](https://eslint.org/) +- ๐Ÿค– [CommitLint](https://commitlint.js.org/) +- ๐Ÿ’– [Prettier](https://prettier.io/) +- ๐Ÿ“ฆ [pnpm](https://pnpm.io/) +- ๐ŸŽ๏ธ [Turborepo](https://turbo.build/repo) +- ๐Ÿ‘ท [Github Actions](https://github.com/features/actions) + +## What's inside? + +This monorepo includes a few apps and packages. + +### Apps and Packages + +- `apps/website-ssr`: a Next.js app with Tailwind CSS +- `apps/website`: another Next.js app with Tailwind CSS +- `packages/ui`: a stub React component library with Tailwind CSS, shared by both `website-ssr` and `website` apps +- `packages/utils`: utilities shared by both `website-ssr` and `website` apps +- `packages/eslint-config-custom`: shared ESLint configuration +- `packages/jest-config`: shared Jest configuration +- `packages/lighthouse-config`: shared Lighthouse configuration +- `packages/next-config`: shared Next.js configuration +- `packages/playwright-config`: shared Playwright configuration +- `packages/storybook-config`: shared Storybook configuration +- `packages/tailwindcss-config`: shared Tailwind CSS configuration +- `packages/typescript-config`: shared `tsconfig.json` files + +## Using this template + +Run the following command: + +``` +npx degit markkos89/turbo-monorepo-template my-monorepo +cd my-monorepo +pnpm install +``` + +### Develop Next.js + +If you want to start `apps/website-ssr` and `apps/website` in development mode, and watch for changes in `packages/ui`, run at the root: + +``` +pnpm dev +``` + +### Build Next.js + +If you want to build `apps/website-ssr` and `apps/website` for production, run at the root: + +``` +pnpm build +``` + +If you want to see an analysis of the generated bundles, specify the `ANALYZE` environment variable: + +``` +ANALYZE=true pnpm build +``` + +### Preview Next.js + +If you want to preview production builds of `apps/website-ssr` and `apps/website`, run at the root: + +``` +pnpm start +``` + +### Develop Storybook + +If you want to start all Storybook projects in development mode, run at the root: + +``` +pnpm storybook:dev +``` + +### Develop Storybook + +If you want to build all Storybook projects, run at the root: + +``` +pnpm storybook:build +``` + +### Unit tests + +If you want to run unit tests for all projects, run at the root: + +``` +pnpm test:unit +``` + +### End-to-end tests + +If you want to run e2e tests for all projects, run at the root: + +``` +pnpm test:e2e +``` + +### Lint + +If you want to run linting for all projects, run at the root: + +``` +pnpm lint +``` diff --git a/apps/website-ssr/.storybook/main.js b/apps/website-ssr/.storybook/main.js new file mode 100644 index 00000000..f8541a68 --- /dev/null +++ b/apps/website-ssr/.storybook/main.js @@ -0,0 +1 @@ +export { default } from "storybook-config/main.config"; diff --git a/apps/website-ssr/.storybook/manager.js b/apps/website-ssr/.storybook/manager.js new file mode 100644 index 00000000..2785f7cb --- /dev/null +++ b/apps/website-ssr/.storybook/manager.js @@ -0,0 +1 @@ +import "storybook-config/manager.config"; diff --git a/apps/website-ssr/.storybook/preview.js b/apps/website-ssr/.storybook/preview.js new file mode 100644 index 00000000..cbe39e58 --- /dev/null +++ b/apps/website-ssr/.storybook/preview.js @@ -0,0 +1,3 @@ +import "../src/styles.css"; + +export { default } from "storybook-config/preview.config"; diff --git a/apps/website-ssr/e2e/index.e2e.ts b/apps/website-ssr/e2e/index.e2e.ts new file mode 100644 index 00000000..097f7101 --- /dev/null +++ b/apps/website-ssr/e2e/index.e2e.ts @@ -0,0 +1,29 @@ +import { expect, test } from "@playwright/test"; + +const basePath = "/website-ssr"; + +test("has title", async ({ page }) => { + await page.goto(basePath); + + await expect(page).toHaveTitle("Turbo Monorepo โ€” Website SSR"); +}); + +test("has heading", async ({ page }) => { + await page.goto(basePath); + + const heading = page.getByRole("heading", { level: 1 }); + await expect(heading).toContainText("Website SSR"); +}); + +test("has navigations", async ({ page }) => { + await page.goto(basePath); + + const navMain = page.getByRole("navigation", { name: "main" }); + await expect(navMain).toBeVisible(); + + const navQuickLinks = page.getByRole("navigation", { name: "quick links" }); + await expect(navQuickLinks).toBeVisible(); + + const navSocial = page.getByRole("navigation", { name: "social" }); + await expect(navSocial).toBeVisible(); +}); diff --git a/apps/website-ssr/jest.config.js b/apps/website-ssr/jest.config.js new file mode 100644 index 00000000..a453a37a --- /dev/null +++ b/apps/website-ssr/jest.config.js @@ -0,0 +1 @@ +module.exports = require("jest-config/jest.config"); diff --git a/apps/website-ssr/lighthouse.config.js b/apps/website-ssr/lighthouse.config.js new file mode 100644 index 00000000..e0d0c981 --- /dev/null +++ b/apps/website-ssr/lighthouse.config.js @@ -0,0 +1,3 @@ +module.exports = require("lighthouse-config/lighthouse.config")({ + staticDistDir: "out/", +}); diff --git a/apps/website-ssr/next-env.d.ts b/apps/website-ssr/next-env.d.ts new file mode 100644 index 00000000..4f11a03d --- /dev/null +++ b/apps/website-ssr/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/apps/website-ssr/next.config.js b/apps/website-ssr/next.config.js new file mode 100644 index 00000000..cedf516f --- /dev/null +++ b/apps/website-ssr/next.config.js @@ -0,0 +1,3 @@ +module.exports = require("next-config/nextpwa.config")({ + // basePath: "/monorepo-nextjs-tailwindcss-template", +}); diff --git a/apps/website-ssr/package.json b/apps/website-ssr/package.json new file mode 100644 index 00000000..87b3db1a --- /dev/null +++ b/apps/website-ssr/package.json @@ -0,0 +1,36 @@ +{ + "private": true, + "name": "website-ssr", + "version": "0.0.0", + "scripts": { + "clean": "rm -rf .lighthouseci .next .swc .turbo coverage dist e2e-report e2e-results out storybook-static", + "dev": "next dev --port 3001", + "build": "next build", + "lint": "next lint", + "test:e2e": "playwright test", + "test:unit": "jest --ci --coverage", + "test:watch": "jest --watch", + "storybook:dev": "storybook dev --quiet --port 6001", + "storybook:build": "storybook build", + "coupling-graph": "npx madge --extensions js,jsx,ts,tsx,css,md,mdx ./ --exclude '.next|tailwind.config.js|reset.d.ts|prettier.config.js|postcss.config.js|playwright.config.ts|next.config.js|next-env.d.ts|instrumentation.ts|e2e/|README.md|.storybook/|.eslintrc.js' --image graph.svg" + }, + "dependencies": { + "@headlessui/react": "1.7.15", + "clsx": "2.0.0", + "next": "13.4.12", + "next-themes": "0.2.1", + "react": "18.2.0", + "react-dom": "18.2.0", + "ui": "workspace:*", + "utils": "workspace:*" + }, + "devDependencies": { + "jest-config": "workspace:*", + "lighthouse-config": "workspace:*", + "next-config": "workspace:*", + "playwright-config": "workspace:*", + "storybook-config": "workspace:*", + "tailwindcss-config": "workspace:*", + "typescript-config": "workspace:*" + } +} diff --git a/apps/website-ssr/playwright.config.js b/apps/website-ssr/playwright.config.js new file mode 100644 index 00000000..e689a91d --- /dev/null +++ b/apps/website-ssr/playwright.config.js @@ -0,0 +1,4 @@ +module.exports = require("playwright-config/playwright.config")({ + basePath: "/website-ssrr", + port: 3001, +}); diff --git a/apps/website-ssr/postcss.config.js b/apps/website-ssr/postcss.config.js new file mode 100644 index 00000000..faf8b594 --- /dev/null +++ b/apps/website-ssr/postcss.config.js @@ -0,0 +1 @@ +module.exports = require("tailwindcss-config/postcss.config"); diff --git a/apps/website-ssr/public/android-chrome-192x192.png b/apps/website-ssr/public/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..1af771791be829fb738cc17213c290ec76244116 GIT binary patch literal 6621 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 literal 0 HcmV?d00001 diff --git a/apps/website-ssr/public/android-chrome-512x512.png b/apps/website-ssr/public/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..0db2bc0553e4ebb4016f375a084e4088a2aee8f5 GIT binary patch literal 29218 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 literal 0 HcmV?d00001 diff --git a/apps/website-ssr/public/apple-touch-icon.png b/apps/website-ssr/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..67612c0f3222d3a4a1b0dac3f890b7d24e84c848 GIT binary patch literal 5985 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 V?@KvsA>A_vm>8JrSLwRM{SW-LK4|~| literal 0 HcmV?d00001 diff --git a/apps/website-ssr/public/favicon-16x16.png b/apps/website-ssr/public/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..731f179679d43f3acb5b082c81c39852b31d8fb4 GIT binary patch literal 413 zcmV;O0b>4%P)Px$S4l)cR5(w~lRt{WP!NZIu?b0MKoGT4k~4%{K~YkA3bnBcs8xy}hynjJsU#;z zB|>@&5nCGz1IYz~V2r#eT*Jm@x7eNTJ%;bieDj7&(=^2|g8ScqAP67`0*b}r$0k3v zFr7|enkIOj$6~QSv)RmrXy7(mlB-0yePYBiKfC7eztxUTyVLV)ddi*C0|!Zw=? zR8^%4%H=YS$0NP?4q;9@oetfWD2nn0U|F_p zV>}*{`P=OVS(ef7_u+XS$z-wL?-4~2R;v|sUC#no0xNGc8d0)kS-4y-n9XJxam>$d zwPx%(Md!>R9Hvtmc2`QQ5eU+5{i?iLIvXBTSPBZ8YZE*2+ghqH8}}21S-`K1koSh zBw7iTm?lJJ2!ctw;OcCHV>qal`r|oprCZm2_Xg480|)e+bI69TrOjDbQH_W%TOp3KPqO)W!UX@addQqNF;(zrvqvuMxzmDXJ?q1 znUM@386c5JU}t9sGMS9$OsCT!lgVIqc2*LEBmlat%jH6~S`~Dn)oK~U+}xaK2uT2M zZ*MT0&1g28%z;X!0?l#%X^tSSuC6dYKQ9VG62R;0D@-O6+U+(we0q8s2L}h(+}z|r zXfzt6(`iuNr@=0c&se*YAL2M`X25s$~&fm2gcxW2x|*w|Q~q19?J0E#=A&1OSBpYN{=L8#Sg zro`gnqM#By0I%1JN~O}@I5|0qY&MJW@o_fy8DME?2@eksyn_cpP+}7BXX61RlSyoE zZ?opYnbm4#5EBy<41k)>`};dvb~qfkzrX)-=;PxfHa0eRiAhSNQYqN&cHaIkNf?br zvA@61gRodE41yAiLcjqyole}|-U>=91VK4P3hDLw{xgDA5R1jIySvMSpzOc6xL}Ql z16WyE!OhLhz$_OEM<5VjrOVmCG8BR^7!0V@YJD)b+s$OXySrm^9|z~4R4TDOoOwJR z)-C@FKpRd@PC%70=(}}oZ4HNqhoBIN{kHY_e4sFk0-#OwmJ0@hUmT2#j3AfGfs&NM zBNpKN{2Z&RtKtD@=jG)kLZJ|=0y3piiR0sAtgo-5(P)SQpttAN))w~m_IPhn(XF^% zujA?Ii9JlQ=Nc4sMYhp#p!dz(1X2 V%&^n6puPYA002ovPDHLkV1gJTWo!Td literal 0 HcmV?d00001 diff --git a/apps/website-ssr/public/favicon.ico b/apps/website-ssr/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..869ecff00003eafca43f4548a1c41df96911708a GIT binary patch literal 15406 zcmeI2*NYTO6vq2obwx2Ns83?p#kd#|6&2Hi52E0M3SwLXDyB7} zh=>b@`(h3cia7^V%vsOvUwLcjp01whaaP^Ec0o<|R9Btz)z_yhoKu$dhxMmbqJ(8% zBUbKTmX&E)RwVN6f9=05E6*;=$oTJhx@G;7W?8lEI(8Gg#kX?%VodTsOn2|zm3#N@ zsh)8?efqSVIdewkbLY;TNKd%bk&QYl@!w94z(ua~)V=SrzkrCd29BSW4(ed>|1 zWXTd$uR?_i>e{+>YuUDKo8;u=NOpF%%6043RnPMC^Ih#1FJ7$5D^;o_hYlT5`qAS| zn>KAys3l}nc{MIRkJcre=b$dM!R>C-1wuVKT6(K^nyJ9qAkmUDCE$`$F?ub&({ zc1)GizD$`iQonwE_21cc*REZvEZ)!O&!1KMI(6zuvTc$3<;xd|L?TKC?}GmB*|R5} zO3$-}3l~aSTAEa>SW))w-RpTCqyXD__Uu`Zs>QaBaZpI2kZ~qr=PWxjKKZ3$OHc?r zWZ*Yq;NioEYR=leeY-q*^eEc%4eZ`d)v8tMnwOU+Yu2ohwQJW#^Tv%E?-Tqx37Hs_)&K3*deT2 zunpEVTeohF<}qW&xVY=zzkfpgCfzMsw2-S;uc|p;_oYvtK5=CoK73eMH|hFZ=ggTC zx6Sh9%Uyk>P0N-o<^KKq^7idpm;PS8dilyKC@Apgu359Dum<%@tchaZcdJ&d!=|?_BzO^ypy}Wzt=}dUZK@@}#l8F6`8)lZz|XseJc3p}$f!qE{2= z=;m8Vl%`Id8kOC)ZClqkL)%#WUAlB}iS*OWIzLEaEL*m0narO*-?+Ye|Ngy{FJC^2 z5x#UX>8??uhT2=`I;mdKulEqxWmZ;}68ST9qX>SS`rEf}FDBjC`Ps8)Q|+#&J!6gY zd#+Zkn(IHDq^GC<5Z!=b?%L_KR5tOvu4fY;>C-``ai0Wag@Cu`&#TWOd$gy1I3R4Kfl25QjVX*cF|fnb`Jd{ z#m|02#32JA10e$;10e&cGQj>a*_^7*Anl(#c_R3A$BrE<dM2150?oOCdig8Ta+I&2$p2(urJ)VZ=ckwSI@O)X3yH7 zK?4>4(|bo^o3m!k^6aZk`+QSb*REX)b?=X_2j4Tk6q7#6c!sYP?!iBM_H5s}elncp zZQ8U^KGtM7Hr2(3H*el7_`jU;P4}HUcUJyQd^@S|uVs%OJzB+yO}K)T!8`E=?cdOH z{jS8J@#z;9{w7VD$elZPfLlol`DJRFR}d-Cr)^bj{`|S( z4*tluZ{POKyLazazCx!g?!N~=yo24(X247wIF&I3}YmI zV3Ry-25zwnk{|ww6DI~yr+5c@Y>YOKGt7IedBFZX3HxWvWFA2l`mI(FeX_CKRWjZ$aqiz;?!KiJdY*P1b7hAddHK&>H} h)58=p5Hb)l5Hb)l5Hb)lP!t%jj|YV*WZ=6Q_!rlzMPL8` literal 0 HcmV?d00001 diff --git a/apps/website-ssr/public/icon-192x192.png b/apps/website-ssr/public/icon-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..b41abe290567fb572ccea49a6eebff3fb55cc5a9 GIT binary patch literal 5949 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 literal 0 HcmV?d00001 diff --git a/apps/website-ssr/public/icon-256x256.png b/apps/website-ssr/public/icon-256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..727d36b91654447ecffede6e8ccf5e0d2ce41e75 GIT binary patch literal 9439 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 literal 0 HcmV?d00001 diff --git a/apps/website-ssr/public/manifest.json b/apps/website-ssr/public/manifest.json new file mode 100644 index 00000000..2f4e2c56 --- /dev/null +++ b/apps/website-ssr/public/manifest.json @@ -0,0 +1,38 @@ +{ + "theme_color": "#f69435", + "background_color": "#f69435", + "display": "standalone", + "scope": "/", + "start_url": "/", + "name": "Turbo Monorepo", + "short_name": "Turbo Monorepo", + "description": "Turbo Monorepo Template", + "icons": [ + { + "src": "/icon-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/icon-256x256.png", + "sizes": "256x256", + "type": "image/png" + }, + { + "src": "/icon-384x384.png", + "sizes": "384x384", + "type": "image/png" + }, + { + "src": "/icon-512x512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "maskable_icon_x48.png", + "sizes": "48x48", + "type": "image/x-icon", + "purpose": "maskable" + } + ] +} diff --git a/apps/website-ssr/public/maskable_icon.png b/apps/website-ssr/public/maskable_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..39a1e5e233e7036806a91edab4fbd0c59c09b15f GIT binary patch literal 10219 zcmeHtX*|^J+xIBZLbTdKqv)dKvP2Qel4MIFnoyQh%&4)9%NV+>m7R<|ZHPjMF~*Wh z_C3oOGlMdA#+Dh3;XbEa|NFk5=jHR}dC?0WpU-c8=kGkvRO1wv@WfgD_6Al^cmE-a9+?vjDYBdI zE*5=QS3HN^Zlf;yHd)cZQBX>6J{^T2`{D=D+UNpwpO)(^D=k@Ly~e-8X4=M8dtB4C zK$0zUtHd#EWCz#I3y^J*Qk?>LwOq{{KJKFsE;9(edms3}QzZt1bie)Pnl$H~#&j+4 z=)%jtxnt1V#S-K$LbeHBp#S(ep8xn`idg@<>$|oIK87H(1;Fcq_l|PW20vfQyaFC^ z$7o={qsJGv?>frlQI)d{gm52yOqtxy`AzgP1h4kdJZC>=ZknkicyzS$!nVfBzay_C zaF%ftwFVwR{^r?#fzI!CJ(rs^C%&8a_Y!|w@&6Hvk1yFOo;dnM5a8OGTgHxBgnKX} z24z0Z(x-EE?)>}0o?S;#{0H!^mkJ2m@Vpm}ac`3cP(Nc#%NKz%A(w(L9F^gsJw#qtmt_biw<86($-TL&DeMo`ZdONut z0HRY)BZ(0)Xvi_0qk{1eB+)aLa5tE;U3lNNzmvFQ2wCBjGskEWpTQcxaHh8XJ@s#c z|NjCr^D9so4&enWb$i5^ixStkwYkBjiVdw?!jTaKysbA$I`j24Y#e|wPslGAzq5r- z6AMrQ>}h-IoIg_owaI1@EZWE=`hL<_n|MRL$SY0@ zOra4`p=7bAsyXR!~jt{cGi07`2i)IBk`GYqD-*E?|=^bSGMq@zC9;R?M$- zu)x0hM)>m3<_3{8lx32-Ud>Sd(Wy%s;H5oXPVnm&a{}Ms11Ppbr#9vx(IkqZ>;Zn`Mqs z=jz+iHHZS_ewXh*uo%f9F`g~{*FrD?5U2lpz)c$F|+I(ZZ_UqraBv4`a8}q z8M|y|m8SG?y9?Y9lD|pQT8xd3slmOjIa$GrBz}zfMVZU0U&hih9@UG`U!ds=dtzo3 zN^Zo~*!!=J`ga{T37d9>((-MN{o?8=lP4w@E53z_Q4Za>^-a~SKjueJi&W4i9aTMD zA1xU@jP9O4pXFv!!GoW++DZop zMHc}ODCr*U=jf~B86BoEGCpL#nWC1{OXR~bHDQcx;$a*_{K`B~XsJOfe*DEWy^4jX zrfDaBsC2Y7nLlwEB-Q0Nbte%1Yj5ZOc5iW+g)V+tzmrs z!&7gSp9s_PUu|Wu-Mf;t1FB#}PEUt?)tHLY4o~V!<%Bi7Pl@IOj^^ z+VV8jKzq#`_n}CIJPw>Nr9oZ)xIBIYNu1v@m*uX)16Wgy zSrukt^?K$bU8VGM2U#`t$R=sK`Lvdsnb{TI@<<}(KX1!2;_eUB_RxhtlB^R3yOzOv zmG%Bz@9}YY-rSzzCBev9UiYQpXbt*VrIlw#!4gCNUE<|*B<=$#ROeb!Y^~J}OW&q; zBJj!HEz2bclDWPzp4;FMw$~>IqT)}ad&aRw6#^#h{1)ntOAH>iS0&m9RHmwX$%*(i zMFssgi&^Tpz4^G*p*>VN|IZ%tQG^t`M!t!gXsl9D0Tlk3wleU0;)U9#G`txw_v^RAK6`lq2Z0gE!01p=qU#Pv>JgKwEVe0w}Qt~ zXDSA5mW(#<>rwI{Lp|myncg>Sy%L7dVSF1Ub|I8y@&EXxF&#BHdAe+Pn>O=&-*>45 ze0Ew5S+MP&kUeZf+>vtjru_eUo#V!i6eZ^?(Hcrw*c!6%I!KF@NVUNU({rN-m3(M+ zQw$w?=AW~E`<5u%UoH#ArBL$T$+o{1QFI6%>4YmWi%^nC1*6m6Ef`XSxB^0Tsv6dJTGMH87pZgs&emY@&gsRD6rbW|5&Y@R)t}Cqo(t4Yx3SL z&6>SXQ8IVi*i44sViQIw$bi1KcZ=t*OTRshC&z>~VHRmk2{eS4;VksMN&FFzw>epc zt2kpTeQsmkQ#fu>WcD z%cqfMia|r4?#Fiwz+ZJYXfX=4;{UG?!ntDF4&j1w-bdh3`9{w~{OmP~Kr+(c`_GQl zM-jD34H9U#f*b#2sqz5IJ6TZi9edh#%2ac?r`~10(RS$0zjPK%@mp%6!-m$d=*i4P zUwJBB3q>x4BR)Uo@^7s?1iWepe-*#WzyISM|5x#Cqwb4#DqG{Pn9@76H!HL+-UB)S z!CqT#|KcprxA*+~g=)*0Di&SLB#x`h>9Q?S^1RPS!emw|Wo2OmR)3=8uX)w*yDeCG z1gXfGejsB-&v8dIWfVRN!smG~1wQh=K{9|s^&;9LMw=7pg$)uO*c>lE(%GVPnq%=r zw;dymvB!%0@5#B~#Ws7m?VaXLUdTM9l$3$-J>GaSbiWby)FT`P8Lq82kX1pdy_h;c zTyVCBl>`igeq}>tR5>o zIY^`BvxM&iRN+Sv?EApgNVcA&hW7{ifq))!1L@Q{A`}Jdx*ulW&($+hA9=E^@Cx%X zz(f-@bb72Ub$o}mQ)7%=ui+XePI-ZU;PGf^c!?{~J2@v&wj3_xdaYRYajB$_dlm${ zS`p)#B87U7e$ahX_S~FPFKXLz)n1^5OvxU>I2L5Z&hqKo=~G^LYKWe&xr9V zsAN27jm0$DhVKE(Dru(H8!A-H>u5`oC1SARjtUn12Pz_K>^$1eAf|e9n%4CSjOePo zl+Y7VT5A(nodeVckkH;);kDQ2Yw4}Z9iG@q+_f2f zY2*1)$(6tzd)6IZ9Bik3!jC83LOv}ns(V-5OO<%nCy!!LdJd}}60iZNH$0L4eD(_1 zavcyLZ*Goiq3E}&A(_24=!PpvdT{kj{x0KG)x22|KU*Y@eWPkAeXdLZGojm6rB^;> zn&;=gzth%U$RQBNH+XmNXt^a9lBmhW*<%wsC;J6b*`?hxT5IiHMj}TaKmMAqM;5Tk z-TPrTK6xD0?;b_S$Gsl*;J|4a69pD9K(mYJ(qd9PN}RCzAe7P~YjCdG^W`)|INq%l z)0(81AF#Q>B|k)nIT&^i*)|+YpofFl$~B>T%|!L%m1KOx@;^or2E1NJWAObdmHc9= zdaP^3uXd8r4OVNVM)Z2Ey08!1dH4R9bw_v6iaK}UT^|7gd8djeLh<>zu7S8aN5!Ub zA*a1u=Dm6}4skGlSe>L|=o*l!?-sSoJMbIqS3u$6~9g_Ti~G0zCJw!1d^} z-=CE7wRp~42A(ff=mG>zbb%M3gC#8}qz4 z0N_jMyGa%$;h9s6nBu6A(-<3i-(EoahM1J&NaA;(Ys}$DoIp_?@5~Wnn7N2+$=zf* zAs6I;u-8oHlvfj5bMCKbNec;0Ur%xaMFV&7+0w8@JFsz8I0(?|?OBn085?R0~E5Pwo9%8{Y+nrL6> zV0!sFUYPL8*b}QLBv96@Uysj?%A9Ismy{YkdLmO7VhWgU4&;3Eykr6mn4K>zv*)+(i36}s^Se0b$i9iuvD=b+MARw@v#to3p2p(4J$codc2qIGx{ z-%r4@t4`JnM--3Slmo0}RWWgd28~ zxIG9Whu(iW8=gSG_{7$b&-;kIE=+x&uFx_lA5`3yRW%=?PzLHw!i~BdBf8}JFfUut zBTU@eda+h1C%Oj4Qn>l)k2Mt%UHveUhy&6xV&F9Dq#xosRl)9Ah7X(Tk+d}NM za+YfNSd<2Rp0|pVWVlck);oU*(&rJByrba9nc@y_v-1nVWH^o*C;YllY<=2(vz$d4 z*Ai0Evq+>gM2d|wBLjc}PVEIEYj0A@FuWMQFw#IcnP2wWDt~MLhE0`%6?qOOa6T=S zpaNZbNU)prSf{Q4oR#Qs0f#ZO^DK`iyi{|jf+Ps>Mdm| zV4B#g9Ra2?K|_U(VXOgS)!5y(l+nROEbh5XIK}9V@A5y-vkV9B(EnA5+7GD`YYqNT zl!-8)EW_qXLy_}Hfr;R!=@U*Q)~*w2!{eVNk&V!<01+sP>cYvFA1HaZ-`^-;z_#@Z z`|a*N9)7C5et0%fKbcPg&+GZmX2{#;HL1h!9S>)0_41}bX)XeCgtR z;l|%ngdsM4BH8%@Zuee8=T{aBw`#LWZ!#p700VQ{Zqf?OD3SG%Xl=Sc8G?D&(Nbvz zNQ`3j!R36^nJe_Z4Oypo{nR0#BQ}z%l6dpB5|J~MDHWtWp5{Tx*!Xcm+x~n=!iUn7 z<=5e-7f%>_;o=T))^{2Re|<+1!KAl@ce*xAz}=*-+((F(-vx?*Kg96aNj2`E(08}& z>=v%zPv|#WO=1yKJ>9Ica+1+qhGb2Fs(fAZ7{Xy8VD_Ro!l6FK>vMpu*)|_!XL#KM zIVv($1C_5a{h`>78S`^W37rAimGUfosVxhpQ})!5-4ZyO+5fOfvm>xeWqXb<7d1B% zI(y`Gp}nE^MJw=o=&vTA@>lFOEG(nrj|CNPYV1_1|Vd_}asQK~$cISPf zu2nosHaqP*il0LkM$bR3Ndr&=8EIaMR8aEKu!bh&?S7Uq>pg)iwEdIgVQJj~MU$_z zjlTu_KHCPcm;K*|2`d1m;F!S`5Bmnxs3B_Le)g)3imbe+oYKl@OCoXcLT{+^OgL>g zNC3eq4B?`lKKqsq^4{fHAb{Jm^r}Fy5v}C92R}^*?T0rrqc41UHou1}tic@}JFtZq zGq-oc>2rQA8F3&4V{58GrPNhwc^Yvrp4ItE7c+*?cvRnC4+@N*327f^>EzsDjvm|2 z!*}^E-=M!qzumB+02l66pb`>y=NK81=K~+AvSq})$S>TSUh!XSOY?v#QY#Cd_Pr>v zMw3saobwnf^P29{--j^gNfkfiGk<&2)eY!rbJhL2^zsuNW>f?dt$@Jb85YR(Z&Jsj-%- zqqAP~ke|LajfKn?FvfHUl8x<~-tLMH1-wk`(|6;@)O(vH|;(8N+xzL_mR{0my zxUdPR^}6ovf()skXie8=t(BH}WCCc+aIIUl?%H|f)E91dqb~t0^3Ynw1e?V)`w*Nb zZ%T4rDD9l;gSmTQE!ENuU3XP85Oqnc?{(p9Srf&mAxG;=I0=9p(L}t^A*C8v)>`AS z=;MWPXI{!)2}`1kcVui%{b-?Yi$&jmOSQ9Z#o~clUVq*wj6MS59AqKo2O!QJR81CJ z>^F*7%LM_{e!i+CShZ8re$-S>_S(X2nndS4jw=e|-O*79%M>iri&@4Aq< z<}(<+!TQJWv{lf9TeMj6Z9d*a*^YQ(3a!gA=2U?h-l8KQ;w?G$vZGsFgw^=gi@2=h z?Y`C@F7wi+oL`Z2#H+`=T?wV}?oGB3a!&KF5qO8kjL|MD1DqyofaHnH<|f=CDlKi^J&oVW&2Yrfg-%ek@w>? z#34lUDbaXNQA?f7&Y*|#iAcf3@J4!?c2^Tn6WM@=IgJR+HG0S}{CyycPUvtc#5)(M zO1pz{h~BO-_k(Z%`xmEuP+nEA>K@jGz)??6Sn%#9tF=*H-Auab?vY$zbbO;o(*9(!9Cl5wuETcWfVa<;{b+3 znVb83#*$qq90lj@zm)nm+mLa0Ut|+z@@uAlsqxyoanvmeu$^rg6O9OzJ&9sj-MJaw* zJef0aV%F~rlK2C7FqopT?<3!!Rnb6`mTY8=5U()|L(hBbbF3E{2*eH8ITXQmE1 z4zh}ZQ2*=qpcxNba*Q^}f2?J=Lu2kdszZ~x@-5jr(mb_aKzse6w(=MV%bDJ9fMi0Z%A-t1g!vq7T^kvonG?7gyz4;PLSfz!hqUmU zrIEr|S%cm9#F0t3wq?lCm;~sWX@fH=sXyX z;k&K{fx&bm@R8XtDzAXVOw`%$JF77TkA_e~m^X?7IVwnE&rif`7d`}4Ro(c}ZHBJd zoN>`!%GM+qhbt)@So`wyKsrBff8g;0rl)d*Mhh#QvGTC74Iss^vJNAF-5xwoRdQ~A z-wKb=WGuxCK54YI__vjB`vks+fS{`5?zV|4bb?~-tQexO?y73AqYGl7w2(3Pm}~n3 z$!%qT3)1tdN=}u|2t75~K1(MBRvPqBMTrBv$n{zpbwC@6)bVg)HD7X>w5?n!OdvcOPx&6iGxuRA@u(n9ECQQ542Mvsnf~L>bMBAZi>A8uZXcNmQ1ThT*`Vq_P6>AMipA zn>9*X{MIAkQJlxCPAiCE+`>gd_>sx258l&gq z1OM>Q2mqCmNYTre!M98XM4AP@*}e{@Lg@9#5+NF)N2$@C)t zEo^OVG3iJ_C;~tMJU>6fYPBL54Dvu58yj(OaDZeoiQ(blUjb;*>-B zneSB$fIOtrX-rN|;^gFnJ8WoZfXCy3&1U1a+uK{z)zz{2$CrOG^K!}`dcD29ED8Cc zC_o;FELWSk(Z?5jh_l z8^hVz*|#QaZEZz397cC{Hw#p1P%<_)HmVCi-m=*&Mn^{x3Wd0Hk_|O9$*QZXOA?@^ zr3J^w$L!3gY6bGnNE&qF(zBidrblH>O$}R~nVCU69%plsSN@&W=rd{GZnvYhw)Rtz z6z>5kNtC-T017iGeiO^klaSDVB_SCKsLGb2{~N7JG%}nB02xWE=oV3dil$S>%|r!c kB(0)bL(n=new URL(n+".js",a).href,s[n]||new Promise((s=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=s,document.head.appendChild(e)}else e=n,importScripts(n),s()})).then((()=>{let e=s[n];if(!e)throw new Error(`Module ${n} didnโ€™t register its module`);return e})));self.define=(a,i)=>{const c=e||("document"in self?document.currentScript.src:"")||location.href;if(s[c])return;let t={};const o=e=>n(e,c),r={module:{uri:c},exports:t,require:o};s[c]=Promise.all(a.map((e=>r[e]||o(e)))).then((e=>(i(...e),t)))}}define(["./workbox-8c8aeaed"],(function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_next/static/XqduK89_4lNZQJJmt-UHy/_buildManifest.js",revision:"6ec61996a6fc5f3c66d326b9680adfb5"},{url:"/_next/static/XqduK89_4lNZQJJmt-UHy/_ssgManifest.js",revision:"b6652df95db52feb4daf4eca35380933"},{url:"/_next/static/chunks/framework-0f8888d1cd333966.js",revision:"0f8888d1cd333966"},{url:"/_next/static/chunks/main-bc98a3f10804c490.js",revision:"bc98a3f10804c490"},{url:"/_next/static/chunks/pages/404-9bf31a9d7d6ffe09.js",revision:"9bf31a9d7d6ffe09"},{url:"/_next/static/chunks/pages/DemoSSR-72a70aa4e999d9d5.js",revision:"72a70aa4e999d9d5"},{url:"/_next/static/chunks/pages/_app-f0a0b370653d1ea1.js",revision:"f0a0b370653d1ea1"},{url:"/_next/static/chunks/pages/_error-924c3a8f78a5d1e8.js",revision:"924c3a8f78a5d1e8"},{url:"/_next/static/chunks/pages/index-8b9d0f75cf1f1949.js",revision:"8b9d0f75cf1f1949"},{url:"/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js",revision:"79330112775102f91e1010318bae2bd3"},{url:"/_next/static/chunks/webpack-8fa1640cc84ba8fe.js",revision:"8fa1640cc84ba8fe"},{url:"/_next/static/css/a064722aa83e9cc8.css",revision:"a064722aa83e9cc8"},{url:"/android-chrome-192x192.png",revision:"b40b9799619c0fa0808d8270084741f9"},{url:"/android-chrome-512x512.png",revision:"5d231b9497d8e006095e889564624771"},{url:"/apple-touch-icon.png",revision:"5a43bee0c7f9fe0fbb441f4030c29004"},{url:"/favicon-16x16.png",revision:"ef99ba6888b371af7c57cd6a9e076a87"},{url:"/favicon-32x32.png",revision:"6f3b2403df7f7fb3acb6682fb9cdf84a"},{url:"/favicon.ico",revision:"88e2cc4585963c8eef22072457bc6589"},{url:"/icon-192x192.png",revision:"662bcbc3774cb22d27d1ea432f5dd82c"},{url:"/icon-256x256.png",revision:"5e57e07bfa3065b27494ccf1f59bf8c4"},{url:"/icon-384x384.png",revision:"9f5820b98c540d9368dbad764c5ac966"},{url:"/icon-512x512.png",revision:"8ed4a712e852a438cb951b28dc70008e"},{url:"/manifest.json",revision:"6fc62454361d79958dbf5c51a907e94d"},{url:"/maskable_icon.png",revision:"9554c211141fc92229b83790fda2be4d"},{url:"/maskable_icon_x48.png",revision:"8ebe5c753ae8d2069b2a082ebeacff8e"},{url:"/site.webmanifest",revision:"8fffcdf720e62d5b464f43d965beff3d"}],{ignoreURLParametersMatching:[]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({request:e,response:s,event:n,state:a})=>s&&"opaqueredirect"===s.type?new Response(s.body,{status:200,statusText:"OK",headers:s.headers}):s}]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,new e.CacheFirst({cacheName:"google-fonts-webfonts",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:31536e3})]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,new e.StaleWhileRevalidate({cacheName:"google-fonts-stylesheets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,new e.StaleWhileRevalidate({cacheName:"static-font-assets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,new e.StaleWhileRevalidate({cacheName:"static-image-assets",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/image\?url=.+$/i,new e.StaleWhileRevalidate({cacheName:"next-image",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp3|wav|ogg)$/i,new e.CacheFirst({cacheName:"static-audio-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp4)$/i,new e.CacheFirst({cacheName:"static-video-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:js)$/i,new e.StaleWhileRevalidate({cacheName:"static-js-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:css|less)$/i,new e.StaleWhileRevalidate({cacheName:"static-style-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/data\/.+\/.+\.json$/i,new e.StaleWhileRevalidate({cacheName:"next-data",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:json|xml|csv)$/i,new e.NetworkFirst({cacheName:"static-data-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>{if(!(self.origin===e.origin))return!1;const s=e.pathname;return!s.startsWith("/api/auth/")&&!!s.startsWith("/api/")}),new e.NetworkFirst({cacheName:"apis",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:16,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>{if(!(self.origin===e.origin))return!1;return!e.pathname.startsWith("/api/")}),new e.NetworkFirst({cacheName:"others",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>!(self.origin===e.origin)),new e.NetworkFirst({cacheName:"cross-origin",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:3600})]}),"GET")})); diff --git a/apps/website-ssr/public/workbox-8c8aeaed.js b/apps/website-ssr/public/workbox-8c8aeaed.js new file mode 100644 index 00000000..1864fcd2 --- /dev/null +++ b/apps/website-ssr/public/workbox-8c8aeaed.js @@ -0,0 +1 @@ +define(["exports"],(function(t){"use strict";try{self["workbox:core:6.5.4"]&&_()}catch(t){}const e=(t,...e)=>{let s=t;return e.length>0&&(s+=` :: ${JSON.stringify(e)}`),s};class s extends Error{constructor(t,s){super(e(t,s)),this.name=t,this.details=s}}try{self["workbox:routing:6.5.4"]&&_()}catch(t){}const n=t=>t&&"object"==typeof t?t:{handle:t};class r{constructor(t,e,s="GET"){this.handler=n(e),this.match=t,this.method=s}setCatchHandler(t){this.catchHandler=n(t)}}class i extends r{constructor(t,e,s){super((({url:e})=>{const s=t.exec(e.href);if(s&&(e.origin===location.origin||0===s.index))return s.slice(1)}),e,s)}}class a{constructor(){this.t=new Map,this.i=new Map}get routes(){return this.t}addFetchListener(){self.addEventListener("fetch",(t=>{const{request:e}=t,s=this.handleRequest({request:e,event:t});s&&t.respondWith(s)}))}addCacheListener(){self.addEventListener("message",(t=>{if(t.data&&"CACHE_URLS"===t.data.type){const{payload:e}=t.data,s=Promise.all(e.urlsToCache.map((e=>{"string"==typeof e&&(e=[e]);const s=new Request(...e);return this.handleRequest({request:s,event:t})})));t.waitUntil(s),t.ports&&t.ports[0]&&s.then((()=>t.ports[0].postMessage(!0)))}}))}handleRequest({request:t,event:e}){const s=new URL(t.url,location.href);if(!s.protocol.startsWith("http"))return;const n=s.origin===location.origin,{params:r,route:i}=this.findMatchingRoute({event:e,request:t,sameOrigin:n,url:s});let a=i&&i.handler;const o=t.method;if(!a&&this.i.has(o)&&(a=this.i.get(o)),!a)return;let c;try{c=a.handle({url:s,request:t,event:e,params:r})}catch(t){c=Promise.reject(t)}const h=i&&i.catchHandler;return c instanceof Promise&&(this.o||h)&&(c=c.catch((async n=>{if(h)try{return await h.handle({url:s,request:t,event:e,params:r})}catch(t){t instanceof Error&&(n=t)}if(this.o)return this.o.handle({url:s,request:t,event:e});throw n}))),c}findMatchingRoute({url:t,sameOrigin:e,request:s,event:n}){const r=this.t.get(s.method)||[];for(const i of r){let r;const a=i.match({url:t,sameOrigin:e,request:s,event:n});if(a)return r=a,(Array.isArray(r)&&0===r.length||a.constructor===Object&&0===Object.keys(a).length||"boolean"==typeof a)&&(r=void 0),{route:i,params:r}}return{}}setDefaultHandler(t,e="GET"){this.i.set(e,n(t))}setCatchHandler(t){this.o=n(t)}registerRoute(t){this.t.has(t.method)||this.t.set(t.method,[]),this.t.get(t.method).push(t)}unregisterRoute(t){if(!this.t.has(t.method))throw new s("unregister-route-but-not-found-with-method",{method:t.method});const e=this.t.get(t.method).indexOf(t);if(!(e>-1))throw new s("unregister-route-route-not-registered");this.t.get(t.method).splice(e,1)}}let o;const c=()=>(o||(o=new a,o.addFetchListener(),o.addCacheListener()),o);function h(t,e,n){let a;if("string"==typeof t){const s=new URL(t,location.href);a=new r((({url:t})=>t.href===s.href),e,n)}else if(t instanceof RegExp)a=new i(t,e,n);else if("function"==typeof t)a=new r(t,e,n);else{if(!(t instanceof r))throw new s("unsupported-route-type",{moduleName:"workbox-routing",funcName:"registerRoute",paramName:"capture"});a=t}return c().registerRoute(a),a}try{self["workbox:strategies:6.5.4"]&&_()}catch(t){}const u={cacheWillUpdate:async({response:t})=>200===t.status||0===t.status?t:null},l={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"workbox",runtime:"runtime",suffix:"undefined"!=typeof registration?registration.scope:""},f=t=>[l.prefix,t,l.suffix].filter((t=>t&&t.length>0)).join("-"),w=t=>t||f(l.precache),d=t=>t||f(l.runtime);function p(t,e){const s=new URL(t);for(const t of e)s.searchParams.delete(t);return s.href}class y{constructor(){this.promise=new Promise(((t,e)=>{this.resolve=t,this.reject=e}))}}const g=new Set;function m(t){return"string"==typeof t?new Request(t):t}class R{constructor(t,e){this.h={},Object.assign(this,e),this.event=e.event,this.u=t,this.l=new y,this.p=[],this.g=[...t.plugins],this.m=new Map;for(const t of this.g)this.m.set(t,{});this.event.waitUntil(this.l.promise)}async fetch(t){const{event:e}=this;let n=m(t);if("navigate"===n.mode&&e instanceof FetchEvent&&e.preloadResponse){const t=await e.preloadResponse;if(t)return t}const r=this.hasCallback("fetchDidFail")?n.clone():null;try{for(const t of this.iterateCallbacks("requestWillFetch"))n=await t({request:n.clone(),event:e})}catch(t){if(t instanceof Error)throw new s("plugin-error-request-will-fetch",{thrownErrorMessage:t.message})}const i=n.clone();try{let t;t=await fetch(n,"navigate"===n.mode?void 0:this.u.fetchOptions);for(const s of this.iterateCallbacks("fetchDidSucceed"))t=await s({event:e,request:i,response:t});return t}catch(t){throw r&&await this.runCallbacks("fetchDidFail",{error:t,event:e,originalRequest:r.clone(),request:i.clone()}),t}}async fetchAndCachePut(t){const e=await this.fetch(t),s=e.clone();return this.waitUntil(this.cachePut(t,s)),e}async cacheMatch(t){const e=m(t);let s;const{cacheName:n,matchOptions:r}=this.u,i=await this.getCacheKey(e,"read"),a=Object.assign(Object.assign({},r),{cacheName:n});s=await caches.match(i,a);for(const t of this.iterateCallbacks("cachedResponseWillBeUsed"))s=await t({cacheName:n,matchOptions:r,cachedResponse:s,request:i,event:this.event})||void 0;return s}async cachePut(t,e){const n=m(t);var r;await(r=0,new Promise((t=>setTimeout(t,r))));const i=await this.getCacheKey(n,"write");if(!e)throw new s("cache-put-with-no-response",{url:(a=i.url,new URL(String(a),location.href).href.replace(new RegExp(`^${location.origin}`),""))});var a;const o=await this.R(e);if(!o)return!1;const{cacheName:c,matchOptions:h}=this.u,u=await self.caches.open(c),l=this.hasCallback("cacheDidUpdate"),f=l?await async function(t,e,s,n){const r=p(e.url,s);if(e.url===r)return t.match(e,n);const i=Object.assign(Object.assign({},n),{ignoreSearch:!0}),a=await t.keys(e,i);for(const e of a)if(r===p(e.url,s))return t.match(e,n)}(u,i.clone(),["__WB_REVISION__"],h):null;try{await u.put(i,l?o.clone():o)}catch(t){if(t instanceof Error)throw"QuotaExceededError"===t.name&&await async function(){for(const t of g)await t()}(),t}for(const t of this.iterateCallbacks("cacheDidUpdate"))await t({cacheName:c,oldResponse:f,newResponse:o.clone(),request:i,event:this.event});return!0}async getCacheKey(t,e){const s=`${t.url} | ${e}`;if(!this.h[s]){let n=t;for(const t of this.iterateCallbacks("cacheKeyWillBeUsed"))n=m(await t({mode:e,request:n,event:this.event,params:this.params}));this.h[s]=n}return this.h[s]}hasCallback(t){for(const e of this.u.plugins)if(t in e)return!0;return!1}async runCallbacks(t,e){for(const s of this.iterateCallbacks(t))await s(e)}*iterateCallbacks(t){for(const e of this.u.plugins)if("function"==typeof e[t]){const s=this.m.get(e),n=n=>{const r=Object.assign(Object.assign({},n),{state:s});return e[t](r)};yield n}}waitUntil(t){return this.p.push(t),t}async doneWaiting(){let t;for(;t=this.p.shift();)await t}destroy(){this.l.resolve(null)}async R(t){let e=t,s=!1;for(const t of this.iterateCallbacks("cacheWillUpdate"))if(e=await t({request:this.request,response:e,event:this.event})||void 0,s=!0,!e)break;return s||e&&200!==e.status&&(e=void 0),e}}class v{constructor(t={}){this.cacheName=d(t.cacheName),this.plugins=t.plugins||[],this.fetchOptions=t.fetchOptions,this.matchOptions=t.matchOptions}handle(t){const[e]=this.handleAll(t);return e}handleAll(t){t instanceof FetchEvent&&(t={event:t,request:t.request});const e=t.event,s="string"==typeof t.request?new Request(t.request):t.request,n="params"in t?t.params:void 0,r=new R(this,{event:e,request:s,params:n}),i=this.v(r,s,e);return[i,this.q(i,r,s,e)]}async v(t,e,n){let r;await t.runCallbacks("handlerWillStart",{event:n,request:e});try{if(r=await this.D(e,t),!r||"error"===r.type)throw new s("no-response",{url:e.url})}catch(s){if(s instanceof Error)for(const i of t.iterateCallbacks("handlerDidError"))if(r=await i({error:s,event:n,request:e}),r)break;if(!r)throw s}for(const s of t.iterateCallbacks("handlerWillRespond"))r=await s({event:n,request:e,response:r});return r}async q(t,e,s,n){let r,i;try{r=await t}catch(i){}try{await e.runCallbacks("handlerDidRespond",{event:n,request:s,response:r}),await e.doneWaiting()}catch(t){t instanceof Error&&(i=t)}if(await e.runCallbacks("handlerDidComplete",{event:n,request:s,response:r,error:i}),e.destroy(),i)throw i}}function b(t){t.then((()=>{}))}function q(){return q=Object.assign?Object.assign.bind():function(t){for(var e=1;ee.some((e=>t instanceof e));let U,x;const L=new WeakMap,I=new WeakMap,C=new WeakMap,E=new WeakMap,N=new WeakMap;let O={get(t,e,s){if(t instanceof IDBTransaction){if("done"===e)return I.get(t);if("objectStoreNames"===e)return t.objectStoreNames||C.get(t);if("store"===e)return s.objectStoreNames[1]?void 0:s.objectStore(s.objectStoreNames[0])}return B(t[e])},set:(t,e,s)=>(t[e]=s,!0),has:(t,e)=>t instanceof IDBTransaction&&("done"===e||"store"===e)||e in t};function T(t){return t!==IDBDatabase.prototype.transaction||"objectStoreNames"in IDBTransaction.prototype?(x||(x=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])).includes(t)?function(...e){return t.apply(P(this),e),B(L.get(this))}:function(...e){return B(t.apply(P(this),e))}:function(e,...s){const n=t.call(P(this),e,...s);return C.set(n,e.sort?e.sort():[e]),B(n)}}function k(t){return"function"==typeof t?T(t):(t instanceof IDBTransaction&&function(t){if(I.has(t))return;const e=new Promise(((e,s)=>{const n=()=>{t.removeEventListener("complete",r),t.removeEventListener("error",i),t.removeEventListener("abort",i)},r=()=>{e(),n()},i=()=>{s(t.error||new DOMException("AbortError","AbortError")),n()};t.addEventListener("complete",r),t.addEventListener("error",i),t.addEventListener("abort",i)}));I.set(t,e)}(t),D(t,U||(U=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction]))?new Proxy(t,O):t)}function B(t){if(t instanceof IDBRequest)return function(t){const e=new Promise(((e,s)=>{const n=()=>{t.removeEventListener("success",r),t.removeEventListener("error",i)},r=()=>{e(B(t.result)),n()},i=()=>{s(t.error),n()};t.addEventListener("success",r),t.addEventListener("error",i)}));return e.then((e=>{e instanceof IDBCursor&&L.set(e,t)})).catch((()=>{})),N.set(e,t),e}(t);if(E.has(t))return E.get(t);const e=k(t);return e!==t&&(E.set(t,e),N.set(e,t)),e}const P=t=>N.get(t);const M=["get","getKey","getAll","getAllKeys","count"],W=["put","add","delete","clear"],j=new Map;function S(t,e){if(!(t instanceof IDBDatabase)||e in t||"string"!=typeof e)return;if(j.get(e))return j.get(e);const s=e.replace(/FromIndex$/,""),n=e!==s,r=W.includes(s);if(!(s in(n?IDBIndex:IDBObjectStore).prototype)||!r&&!M.includes(s))return;const i=async function(t,...e){const i=this.transaction(t,r?"readwrite":"readonly");let a=i.store;return n&&(a=a.index(e.shift())),(await Promise.all([a[s](...e),r&&i.done]))[0]};return j.set(e,i),i}O=(t=>q({},t,{get:(e,s,n)=>S(e,s)||t.get(e,s,n),has:(e,s)=>!!S(e,s)||t.has(e,s)}))(O);try{self["workbox:expiration:6.5.4"]&&_()}catch(t){}const K="cache-entries",A=t=>{const e=new URL(t,location.href);return e.hash="",e.href};class F{constructor(t){this.U=null,this._=t}L(t){const e=t.createObjectStore(K,{keyPath:"id"});e.createIndex("cacheName","cacheName",{unique:!1}),e.createIndex("timestamp","timestamp",{unique:!1})}I(t){this.L(t),this._&&function(t,{blocked:e}={}){const s=indexedDB.deleteDatabase(t);e&&s.addEventListener("blocked",(t=>e(t.oldVersion,t))),B(s).then((()=>{}))}(this._)}async setTimestamp(t,e){const s={url:t=A(t),timestamp:e,cacheName:this._,id:this.C(t)},n=(await this.getDb()).transaction(K,"readwrite",{durability:"relaxed"});await n.store.put(s),await n.done}async getTimestamp(t){const e=await this.getDb(),s=await e.get(K,this.C(t));return null==s?void 0:s.timestamp}async expireEntries(t,e){const s=await this.getDb();let n=await s.transaction(K).store.index("timestamp").openCursor(null,"prev");const r=[];let i=0;for(;n;){const s=n.value;s.cacheName===this._&&(t&&s.timestamp=e?r.push(n.value):i++),n=await n.continue()}const a=[];for(const t of r)await s.delete(K,t.id),a.push(t.url);return a}C(t){return this._+"|"+A(t)}async getDb(){return this.U||(this.U=await function(t,e,{blocked:s,upgrade:n,blocking:r,terminated:i}={}){const a=indexedDB.open(t,e),o=B(a);return n&&a.addEventListener("upgradeneeded",(t=>{n(B(a.result),t.oldVersion,t.newVersion,B(a.transaction),t)})),s&&a.addEventListener("blocked",(t=>s(t.oldVersion,t.newVersion,t))),o.then((t=>{i&&t.addEventListener("close",(()=>i())),r&&t.addEventListener("versionchange",(t=>r(t.oldVersion,t.newVersion,t)))})).catch((()=>{})),o}("workbox-expiration",1,{upgrade:this.I.bind(this)})),this.U}}class H{constructor(t,e={}){this.N=!1,this.O=!1,this.T=e.maxEntries,this.k=e.maxAgeSeconds,this.B=e.matchOptions,this._=t,this.P=new F(t)}async expireEntries(){if(this.N)return void(this.O=!0);this.N=!0;const t=this.k?Date.now()-1e3*this.k:0,e=await this.P.expireEntries(t,this.T),s=await self.caches.open(this._);for(const t of e)await s.delete(t,this.B);this.N=!1,this.O&&(this.O=!1,b(this.expireEntries()))}async updateTimestamp(t){await this.P.setTimestamp(t,Date.now())}async isURLExpired(t){if(this.k){const e=await this.P.getTimestamp(t),s=Date.now()-1e3*this.k;return void 0===e||er||e&&e<0)throw new s("range-not-satisfiable",{size:r,end:n,start:e});let i,a;return void 0!==e&&void 0!==n?(i=e,a=n+1):void 0!==e&&void 0===n?(i=e,a=r):void 0!==n&&void 0===e&&(i=r-n,a=r),{start:i,end:a}}(i,r.start,r.end),o=i.slice(a.start,a.end),c=o.size,h=new Response(o,{status:206,statusText:"Partial Content",headers:e.headers});return h.headers.set("Content-Length",String(c)),h.headers.set("Content-Range",`bytes ${a.start}-${a.end-1}/${i.size}`),h}catch(t){return new Response("",{status:416,statusText:"Range Not Satisfiable"})}}function z(t,e){const s=e();return t.waitUntil(s),s}try{self["workbox:precaching:6.5.4"]&&_()}catch(t){}function G(t){if(!t)throw new s("add-to-cache-list-unexpected-type",{entry:t});if("string"==typeof t){const e=new URL(t,location.href);return{cacheKey:e.href,url:e.href}}const{revision:e,url:n}=t;if(!n)throw new s("add-to-cache-list-unexpected-type",{entry:t});if(!e){const t=new URL(n,location.href);return{cacheKey:t.href,url:t.href}}const r=new URL(n,location.href),i=new URL(n,location.href);return r.searchParams.set("__WB_REVISION__",e),{cacheKey:r.href,url:i.href}}class V{constructor(){this.updatedURLs=[],this.notUpdatedURLs=[],this.handlerWillStart=async({request:t,state:e})=>{e&&(e.originalRequest=t)},this.cachedResponseWillBeUsed=async({event:t,state:e,cachedResponse:s})=>{if("install"===t.type&&e&&e.originalRequest&&e.originalRequest instanceof Request){const t=e.originalRequest.url;s?this.notUpdatedURLs.push(t):this.updatedURLs.push(t)}return s}}}class J{constructor({precacheController:t}){this.cacheKeyWillBeUsed=async({request:t,params:e})=>{const s=(null==e?void 0:e.cacheKey)||this.M.getCacheKeyForURL(t.url);return s?new Request(s,{headers:t.headers}):t},this.M=t}}let Q,X;async function Y(t,e){let n=null;if(t.url){n=new URL(t.url).origin}if(n!==self.location.origin)throw new s("cross-origin-copy-response",{origin:n});const r=t.clone(),i={headers:new Headers(r.headers),status:r.status,statusText:r.statusText},a=e?e(i):i,o=function(){if(void 0===Q){const t=new Response("");if("body"in t)try{new Response(t.body),Q=!0}catch(t){Q=!1}Q=!1}return Q}()?r.body:await r.blob();return new Response(o,a)}class Z extends v{constructor(t={}){t.cacheName=w(t.cacheName),super(t),this.W=!1!==t.fallbackToNetwork,this.plugins.push(Z.copyRedirectedCacheableResponsesPlugin)}async D(t,e){const s=await e.cacheMatch(t);return s||(e.event&&"install"===e.event.type?await this.j(t,e):await this.S(t,e))}async S(t,e){let n;const r=e.params||{};if(!this.W)throw new s("missing-precache-entry",{cacheName:this.cacheName,url:t.url});{const s=r.integrity,i=t.integrity,a=!i||i===s;n=await e.fetch(new Request(t,{integrity:"no-cors"!==t.mode?i||s:void 0})),s&&a&&"no-cors"!==t.mode&&(this.K(),await e.cachePut(t,n.clone()))}return n}async j(t,e){this.K();const n=await e.fetch(t);if(!await e.cachePut(t,n.clone()))throw new s("bad-precaching-response",{url:t.url,status:n.status});return n}K(){let t=null,e=0;for(const[s,n]of this.plugins.entries())n!==Z.copyRedirectedCacheableResponsesPlugin&&(n===Z.defaultPrecacheCacheabilityPlugin&&(t=s),n.cacheWillUpdate&&e++);0===e?this.plugins.push(Z.defaultPrecacheCacheabilityPlugin):e>1&&null!==t&&this.plugins.splice(t,1)}}Z.defaultPrecacheCacheabilityPlugin={cacheWillUpdate:async({response:t})=>!t||t.status>=400?null:t},Z.copyRedirectedCacheableResponsesPlugin={cacheWillUpdate:async({response:t})=>t.redirected?await Y(t):t};class tt{constructor({cacheName:t,plugins:e=[],fallbackToNetwork:s=!0}={}){this.A=new Map,this.F=new Map,this.H=new Map,this.u=new Z({cacheName:w(t),plugins:[...e,new J({precacheController:this})],fallbackToNetwork:s}),this.install=this.install.bind(this),this.activate=this.activate.bind(this)}get strategy(){return this.u}precache(t){this.addToCacheList(t),this.$||(self.addEventListener("install",this.install),self.addEventListener("activate",this.activate),this.$=!0)}addToCacheList(t){const e=[];for(const n of t){"string"==typeof n?e.push(n):n&&void 0===n.revision&&e.push(n.url);const{cacheKey:t,url:r}=G(n),i="string"!=typeof n&&n.revision?"reload":"default";if(this.A.has(r)&&this.A.get(r)!==t)throw new s("add-to-cache-list-conflicting-entries",{firstEntry:this.A.get(r),secondEntry:t});if("string"!=typeof n&&n.integrity){if(this.H.has(t)&&this.H.get(t)!==n.integrity)throw new s("add-to-cache-list-conflicting-integrities",{url:r});this.H.set(t,n.integrity)}if(this.A.set(r,t),this.F.set(r,i),e.length>0){const t=`Workbox is precaching URLs without revision info: ${e.join(", ")}\nThis is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(t)}}}install(t){return z(t,(async()=>{const e=new V;this.strategy.plugins.push(e);for(const[e,s]of this.A){const n=this.H.get(s),r=this.F.get(e),i=new Request(e,{integrity:n,cache:r,credentials:"same-origin"});await Promise.all(this.strategy.handleAll({params:{cacheKey:s},request:i,event:t}))}const{updatedURLs:s,notUpdatedURLs:n}=e;return{updatedURLs:s,notUpdatedURLs:n}}))}activate(t){return z(t,(async()=>{const t=await self.caches.open(this.strategy.cacheName),e=await t.keys(),s=new Set(this.A.values()),n=[];for(const r of e)s.has(r.url)||(await t.delete(r),n.push(r.url));return{deletedURLs:n}}))}getURLsToCacheKeys(){return this.A}getCachedURLs(){return[...this.A.keys()]}getCacheKeyForURL(t){const e=new URL(t,location.href);return this.A.get(e.href)}getIntegrityForCacheKey(t){return this.H.get(t)}async matchPrecache(t){const e=t instanceof Request?t.url:t,s=this.getCacheKeyForURL(e);if(s){return(await self.caches.open(this.strategy.cacheName)).match(s)}}createHandlerBoundToURL(t){const e=this.getCacheKeyForURL(t);if(!e)throw new s("non-precached-url",{url:t});return s=>(s.request=new Request(t),s.params=Object.assign({cacheKey:e},s.params),this.strategy.handle(s))}}const et=()=>(X||(X=new tt),X);class st extends r{constructor(t,e){super((({request:s})=>{const n=t.getURLsToCacheKeys();for(const r of function*(t,{ignoreURLParametersMatching:e=[/^utm_/,/^fbclid$/],directoryIndex:s="index.html",cleanURLs:n=!0,urlManipulation:r}={}){const i=new URL(t,location.href);i.hash="",yield i.href;const a=function(t,e=[]){for(const s of[...t.searchParams.keys()])e.some((t=>t.test(s)))&&t.searchParams.delete(s);return t}(i,e);if(yield a.href,s&&a.pathname.endsWith("/")){const t=new URL(a.href);t.pathname+=s,yield t.href}if(n){const t=new URL(a.href);t.pathname+=".html",yield t.href}if(r){const t=r({url:i});for(const e of t)yield e.href}}(s.url,e)){const e=n.get(r);if(e){return{cacheKey:e,integrity:t.getIntegrityForCacheKey(e)}}}}),t.strategy)}}t.CacheFirst=class extends v{async D(t,e){let n,r=await e.cacheMatch(t);if(!r)try{r=await e.fetchAndCachePut(t)}catch(t){t instanceof Error&&(n=t)}if(!r)throw new s("no-response",{url:t.url,error:n});return r}},t.ExpirationPlugin=class{constructor(t={}){this.cachedResponseWillBeUsed=async({event:t,request:e,cacheName:s,cachedResponse:n})=>{if(!n)return null;const r=this.G(n),i=this.V(s);b(i.expireEntries());const a=i.updateTimestamp(e.url);if(t)try{t.waitUntil(a)}catch(t){}return r?n:null},this.cacheDidUpdate=async({cacheName:t,request:e})=>{const s=this.V(t);await s.updateTimestamp(e.url),await s.expireEntries()},this.J=t,this.k=t.maxAgeSeconds,this.X=new Map,t.purgeOnQuotaError&&function(t){g.add(t)}((()=>this.deleteCacheAndMetadata()))}V(t){if(t===d())throw new s("expire-custom-caches-only");let e=this.X.get(t);return e||(e=new H(t,this.J),this.X.set(t,e)),e}G(t){if(!this.k)return!0;const e=this.Y(t);if(null===e)return!0;return e>=Date.now()-1e3*this.k}Y(t){if(!t.headers.has("date"))return null;const e=t.headers.get("date"),s=new Date(e).getTime();return isNaN(s)?null:s}async deleteCacheAndMetadata(){for(const[t,e]of this.X)await self.caches.delete(t),await e.delete();this.X=new Map}},t.NetworkFirst=class extends v{constructor(t={}){super(t),this.plugins.some((t=>"cacheWillUpdate"in t))||this.plugins.unshift(u),this.Z=t.networkTimeoutSeconds||0}async D(t,e){const n=[],r=[];let i;if(this.Z){const{id:s,promise:a}=this.tt({request:t,logs:n,handler:e});i=s,r.push(a)}const a=this.et({timeoutId:i,request:t,logs:n,handler:e});r.push(a);const o=await e.waitUntil((async()=>await e.waitUntil(Promise.race(r))||await a)());if(!o)throw new s("no-response",{url:t.url});return o}tt({request:t,logs:e,handler:s}){let n;return{promise:new Promise((e=>{n=setTimeout((async()=>{e(await s.cacheMatch(t))}),1e3*this.Z)})),id:n}}async et({timeoutId:t,request:e,logs:s,handler:n}){let r,i;try{i=await n.fetchAndCachePut(e)}catch(t){t instanceof Error&&(r=t)}return t&&clearTimeout(t),!r&&i||(i=await n.cacheMatch(e)),i}},t.RangeRequestsPlugin=class{constructor(){this.cachedResponseWillBeUsed=async({request:t,cachedResponse:e})=>e&&t.headers.has("range")?await $(t,e):e}},t.StaleWhileRevalidate=class extends v{constructor(t={}){super(t),this.plugins.some((t=>"cacheWillUpdate"in t))||this.plugins.unshift(u)}async D(t,e){const n=e.fetchAndCachePut(t).catch((()=>{}));e.waitUntil(n);let r,i=await e.cacheMatch(t);if(i);else try{i=await n}catch(t){t instanceof Error&&(r=t)}if(!i)throw new s("no-response",{url:t.url,error:r});return i}},t.cleanupOutdatedCaches=function(){self.addEventListener("activate",(t=>{const e=w();t.waitUntil((async(t,e="-precache-")=>{const s=(await self.caches.keys()).filter((s=>s.includes(e)&&s.includes(self.registration.scope)&&s!==t));return await Promise.all(s.map((t=>self.caches.delete(t)))),s})(e).then((t=>{})))}))},t.clientsClaim=function(){self.addEventListener("activate",(()=>self.clients.claim()))},t.precacheAndRoute=function(t,e){!function(t){et().precache(t)}(t),function(t){const e=et();h(new st(e,t))}(e)},t.registerRoute=h})); diff --git a/apps/website-ssr/src/components/Footer.tsx b/apps/website-ssr/src/components/Footer.tsx new file mode 100644 index 00000000..b7446840 --- /dev/null +++ b/apps/website-ssr/src/components/Footer.tsx @@ -0,0 +1,14 @@ +import type { FunctionComponent } from "react"; +import { Footer } from "ui"; + +const links = [ + { children: "Features", href: "#features", variant: "text" }, + { children: "Testimonials", href: "#testimonials", variant: "text" }, + { children: "Pricing", href: "#pricing", variant: "text" }, +] as const; + +const PageFooter: FunctionComponent = () => { + return