From 5bd6b6ee57fc6b3ec56f5f89e8689b14d9c1c671 Mon Sep 17 00:00:00 2001 From: Marcos Iglesias Date: Mon, 11 Sep 2023 04:51:17 -0300 Subject: [PATCH] Initial commit --- .commitlintrc | 5 + .eslintignore | 12 + .eslintrc | 9 + .github/actions/setup/action.yml | 28 + .github/renovate.json | 23 + .github/workflows/release.yml | 19 + .../run-lighthouse-on-vercel-preview.yml | 71 + .gitignore | 47 + .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/README.md | 53 + apps/website-ssr/src/api/getGithubData.ts | 25 + apps/website-ssr/src/components/Footer.tsx | 14 + apps/website-ssr/src/components/Header.tsx | 35 + apps/website-ssr/src/components/Layout.tsx | 14 + .../componentsNew/common/sections/index.tsx | 7 + .../componentsNew/common/svgs/arrowSvg.tsx | 15 + .../common/svgs/checkMarkSvg.tsx | 12 + .../componentsNew/common/svgs/downloadSvg.tsx | 20 + .../componentsNew/common/svgs/emailSvg.tsx | 25 + .../componentsNew/common/svgs/resetSvg.tsx | 20 + .../src/componentsNew/common/svgs/textSvg.tsx | 20 + .../componentsNew/common/svgs/vCardSvg.tsx | 19 + .../src/componentsNew/common/svgs/wifiSvg.tsx | 13 + .../src/componentsNew/common/tabs/index.tsx | 160 + .../src/componentsNew/common/titles/index.tsx | 9 + .../src/componentsNew/common/utils/seo.tsx | 81 + .../wrappers/qrcodeDisplay/colorSwitcher.tsx | 83 + .../common/wrappers/qrcodeDisplay/details.tsx | 145 + .../wrappers/qrcodeDisplay/downloadButton.tsx | 42 + .../common/wrappers/qrcodeDisplay/index.tsx | 31 + .../wrappers/qrcodeDisplay/inputFile.tsx | 66 + .../common/wrappers/qrcodeDisplay/qrCode.tsx | 161 + .../wrappers/qrcodeDisplay/shapesSwitcher.tsx | 91 + .../qrcodeDisplay/tabs/colorsTabs.tsx | 49 + .../src/componentsNew/titleSection/index.tsx | 22 + .../titleSection/input/emailInput.tsx | 111 + .../titleSection/input/index.tsx | 24 + .../titleSection/input/textInput.tsx | 41 + apps/website-ssr/src/context/colorTypes.ts | 26 + apps/website-ssr/src/context/index.tsx | 110 + apps/website-ssr/src/environement.d.ts | 12 + apps/website-ssr/src/lib/query.tsx | 40 + apps/website-ssr/src/next-env.d.ts | 5 + apps/website-ssr/src/next.config.js | 21 + apps/website-ssr/src/package.json | 71 + 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/pagesNew/_app.tsx | 44 + apps/website-ssr/src/pagesNew/_document.tsx | 26 + apps/website-ssr/src/pagesNew/api/hello.ts | 10 + apps/website-ssr/src/pagesNew/email.tsx | 20 + apps/website-ssr/src/pagesNew/index.tsx | 20 + apps/website-ssr/src/pagesNew/vcard.tsx | 20 + apps/website-ssr/src/pagesNew/wifi.tsx | 20 + apps/website-ssr/src/postcss.config.js | 6 + apps/website-ssr/src/screenshot.png | Bin 0 -> 54436 bytes apps/website-ssr/src/sonar-project.properties | 1 + apps/website-ssr/src/styles.css | 3 + apps/website-ssr/src/styles/globals.css | 67 + apps/website-ssr/src/tailwind.config.js | 29 + apps/website-ssr/src/tsconfig.json | 32 + apps/website-ssr/src/typings/typings.ts | 47 + 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/README.md | 121 + apps/website/e2e/index.e2e.ts | 29 + apps/website/generators/plopfile.cjs | 63 + .../templates/components/index.tsx.hbs | 11 + .../templates/components/stories.tsx.hbs | 10 + .../templates/components/styles.ts.hbs | 7 + .../templates/components/test.tsx.hbs | 13 + .../templates/components/types.d.ts.hbs | 1 + .../generators/templates/pages/index.tsx.hbs | 12 + .../generators/templates/pages/styles.ts.hbs | 7 + apps/website/jest.config.js | 1 + apps/website/lighthouse.config.js | 3 + apps/website/next-env.d.ts | 5 + apps/website/next.config copy.js | 19 + apps/website/next.config.js | 6 + apps/website/package copy.json | 67 + apps/website/package.json | 38 + apps/website/playwright.config.js | 4 + apps/website/postcss.config.js | 1 + apps/website/public/assets/icons/152x152.png | Bin 0 -> 33722 bytes apps/website/public/assets/icons/167x167.png | Bin 0 -> 36444 bytes apps/website/public/assets/icons/180x180.png | Bin 0 -> 31880 bytes apps/website/public/assets/icons/192x192.png | Bin 0 -> 8684 bytes apps/website/public/assets/icons/384x384.png | Bin 0 -> 106880 bytes apps/website/public/assets/icons/512x512.png | Bin 0 -> 35477 bytes .../public/assets/img/hero-illustration.svg | 1 + apps/website/public/manifest.json | 42 + .../components copy/DefaultImage/index.tsx | 19 + .../Main/__snapshots__/test.tsx.snap | 74 + .../src/components copy/Main/index.tsx | 29 + .../src/components copy/Main/stories.tsx | 20 + .../src/components copy/Main/styles.ts | 24 + .../website/src/components copy/Main/test.tsx | 12 + 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 copy/404.tsx | 11 + apps/website/src/pages copy/_app.tsx | 32 + apps/website/src/pages copy/_document.tsx | 86 + apps/website/src/pages copy/api/hello.ts | 5 + apps/website/src/pages copy/index.tsx | 17 + 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/shared/utils/index.ts | 1 + apps/website/src/styles.css | 3 + apps/website/src/styles/global.ts | 59 + apps/website/src/styles/pages/404.ts | 26 + apps/website/src/styles/styled.d.ts | 110 + apps/website/src/styles/themes/dark.ts | 18 + apps/website/src/styles/themes/defaults.ts | 94 + apps/website/src/styles/themes/light.ts | 18 + 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/oracle.json | 14 + 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 | 13559 ++++++++++++++++ pnpm-workspace.yaml | 3 + turbo.code-workspace | 213 + turbo.json | 58 + 248 files changed, 19617 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/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/README.md create mode 100644 apps/website-ssr/src/api/getGithubData.ts 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/componentsNew/common/sections/index.tsx create mode 100644 apps/website-ssr/src/componentsNew/common/svgs/arrowSvg.tsx create mode 100644 apps/website-ssr/src/componentsNew/common/svgs/checkMarkSvg.tsx create mode 100644 apps/website-ssr/src/componentsNew/common/svgs/downloadSvg.tsx create mode 100644 apps/website-ssr/src/componentsNew/common/svgs/emailSvg.tsx create mode 100644 apps/website-ssr/src/componentsNew/common/svgs/resetSvg.tsx create mode 100644 apps/website-ssr/src/componentsNew/common/svgs/textSvg.tsx create mode 100644 apps/website-ssr/src/componentsNew/common/svgs/vCardSvg.tsx create mode 100644 apps/website-ssr/src/componentsNew/common/svgs/wifiSvg.tsx create mode 100644 apps/website-ssr/src/componentsNew/common/tabs/index.tsx create mode 100644 apps/website-ssr/src/componentsNew/common/titles/index.tsx create mode 100644 apps/website-ssr/src/componentsNew/common/utils/seo.tsx create mode 100644 apps/website-ssr/src/componentsNew/common/wrappers/qrcodeDisplay/colorSwitcher.tsx create mode 100644 apps/website-ssr/src/componentsNew/common/wrappers/qrcodeDisplay/details.tsx create mode 100644 apps/website-ssr/src/componentsNew/common/wrappers/qrcodeDisplay/downloadButton.tsx create mode 100644 apps/website-ssr/src/componentsNew/common/wrappers/qrcodeDisplay/index.tsx create mode 100644 apps/website-ssr/src/componentsNew/common/wrappers/qrcodeDisplay/inputFile.tsx create mode 100644 apps/website-ssr/src/componentsNew/common/wrappers/qrcodeDisplay/qrCode.tsx create mode 100644 apps/website-ssr/src/componentsNew/common/wrappers/qrcodeDisplay/shapesSwitcher.tsx create mode 100644 apps/website-ssr/src/componentsNew/common/wrappers/qrcodeDisplay/tabs/colorsTabs.tsx create mode 100644 apps/website-ssr/src/componentsNew/titleSection/index.tsx create mode 100644 apps/website-ssr/src/componentsNew/titleSection/input/emailInput.tsx create mode 100644 apps/website-ssr/src/componentsNew/titleSection/input/index.tsx create mode 100644 apps/website-ssr/src/componentsNew/titleSection/input/textInput.tsx create mode 100644 apps/website-ssr/src/context/colorTypes.ts create mode 100644 apps/website-ssr/src/context/index.tsx create mode 100644 apps/website-ssr/src/environement.d.ts create mode 100644 apps/website-ssr/src/lib/query.tsx create mode 100644 apps/website-ssr/src/next-env.d.ts create mode 100644 apps/website-ssr/src/next.config.js create mode 100644 apps/website-ssr/src/package.json 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/pagesNew/_app.tsx create mode 100644 apps/website-ssr/src/pagesNew/_document.tsx create mode 100644 apps/website-ssr/src/pagesNew/api/hello.ts create mode 100644 apps/website-ssr/src/pagesNew/email.tsx create mode 100644 apps/website-ssr/src/pagesNew/index.tsx create mode 100644 apps/website-ssr/src/pagesNew/vcard.tsx create mode 100644 apps/website-ssr/src/pagesNew/wifi.tsx create mode 100644 apps/website-ssr/src/postcss.config.js create mode 100644 apps/website-ssr/src/screenshot.png create mode 100644 apps/website-ssr/src/sonar-project.properties create mode 100644 apps/website-ssr/src/styles.css create mode 100644 apps/website-ssr/src/styles/globals.css create mode 100644 apps/website-ssr/src/tailwind.config.js create mode 100644 apps/website-ssr/src/tsconfig.json create mode 100644 apps/website-ssr/src/typings/typings.ts 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/README.md create mode 100644 apps/website/e2e/index.e2e.ts create mode 100644 apps/website/generators/plopfile.cjs create mode 100644 apps/website/generators/templates/components/index.tsx.hbs create mode 100644 apps/website/generators/templates/components/stories.tsx.hbs create mode 100644 apps/website/generators/templates/components/styles.ts.hbs create mode 100644 apps/website/generators/templates/components/test.tsx.hbs create mode 100644 apps/website/generators/templates/components/types.d.ts.hbs create mode 100644 apps/website/generators/templates/pages/index.tsx.hbs create mode 100644 apps/website/generators/templates/pages/styles.ts.hbs 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 copy.js create mode 100644 apps/website/next.config.js create mode 100644 apps/website/package copy.json 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/public/assets/icons/152x152.png create mode 100644 apps/website/public/assets/icons/167x167.png create mode 100644 apps/website/public/assets/icons/180x180.png create mode 100644 apps/website/public/assets/icons/192x192.png create mode 100644 apps/website/public/assets/icons/384x384.png create mode 100644 apps/website/public/assets/icons/512x512.png create mode 100644 apps/website/public/assets/img/hero-illustration.svg create mode 100644 apps/website/public/manifest.json create mode 100644 apps/website/src/components copy/DefaultImage/index.tsx create mode 100644 apps/website/src/components copy/Main/__snapshots__/test.tsx.snap create mode 100644 apps/website/src/components copy/Main/index.tsx create mode 100644 apps/website/src/components copy/Main/stories.tsx create mode 100644 apps/website/src/components copy/Main/styles.ts create mode 100644 apps/website/src/components copy/Main/test.tsx 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 copy/404.tsx create mode 100644 apps/website/src/pages copy/_app.tsx create mode 100644 apps/website/src/pages copy/_document.tsx create mode 100644 apps/website/src/pages copy/api/hello.ts create mode 100644 apps/website/src/pages copy/index.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/shared/utils/index.ts create mode 100644 apps/website/src/styles.css create mode 100644 apps/website/src/styles/global.ts create mode 100644 apps/website/src/styles/pages/404.ts create mode 100644 apps/website/src/styles/styled.d.ts create mode 100644 apps/website/src/styles/themes/dark.ts create mode 100644 apps/website/src/styles/themes/defaults.ts create mode 100644 apps/website/src/styles/themes/light.ts 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/oracle.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 0000000..0df1d25 --- /dev/null +++ b/.commitlintrc @@ -0,0 +1,5 @@ +{ + "extends": [ + "@commitlint/config-conventional" + ] +} diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..4c0576e --- /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 0000000..0c77b63 --- /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 0000000..e91c96e --- /dev/null +++ b/.github/actions/setup/action.yml @@ -0,0 +1,28 @@ +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 \ No newline at end of file diff --git a/.github/renovate.json b/.github/renovate.json new file mode 100644 index 0000000..db9bf27 --- /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/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..a725dc5 --- /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 0000000..3fbc071 --- /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 0000000..d7f9e31 --- /dev/null +++ b/.gitignore @@ -0,0 +1,47 @@ +.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 + +node_modules +.env +coverage +coverage.json +typechain +typechain-types + +# Default ignored files + +/shelf/ +/workspace.xml + +# Editor-based HTTP Client requests + +/httpRequests/ + +#Hardhat files +cache/ +artifacts/ + +polkadot-account.json diff --git a/.husky/.gitignore b/.husky/.gitignore new file mode 100644 index 0000000..31354ec --- /dev/null +++ b/.husky/.gitignore @@ -0,0 +1 @@ +_ diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100755 index 0000000..a483680 --- /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 0000000..465ccf1 --- /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 0000000..25bf17f --- /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 0000000..84d1458 --- /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 0000000..a43a07b --- /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 0000000..7befee4 --- /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 0000000..dad68f6 --- /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 0000000..2d63161 --- /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 0000000..f43081c --- /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 0000000..f8541a6 --- /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 0000000..2785f7c --- /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 0000000..cbe39e5 --- /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 0000000..097f710 --- /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 0000000..a453a37 --- /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 0000000..e0d0c98 --- /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 0000000..4f11a03 --- /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 0000000..cedf516 --- /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 0000000..87b3db1 --- /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 0000000..e689a91 --- /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 0000000..faf8b59 --- /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 zcmd^E`9D1#kU^FfD*L|gvJPR8tw@rxXDK9P-=fGmqGZXE zy@+?ouD-PDRl4r-v>ntT}@{^ z=%5?S-}I6es2b*52Y~yLK2g&=0iBz##E7rq38)iq~F*bSQ^WuhN2*`SZV%l+k<@b?a$n{AD(Jvy|w1?!z1YW?}w zX!V&>t@`enD8(%pBb2Y7)Y ztse=7AXH6yOL+rn?mh(?CeY;6(bfvovQBqUh$f}vl{3>qPDkDt+JXs_AgIu{eQ;?Px*KFLrTei#Zbv}N?ytKEmA3H z%a{WacfS z)W%AVdlh?-ONS}m2B7eas6Q+k$MfnZJ7!9LOL|If{@q^a{yN`v z_v?kN*2Tz^Ki8B-F8&@oHEZgW;)0ZUyswmFGjS_85ZYYei^?}S6Da>dnM>r;)78?< z7(H6d^}(FdXQBPf+_F7wC%e;L?~}P}Y3g~bZg+0?3PgoqQ44gaug!tK^8xbH@hqYG z=CzLZ@&xRcL~<&x((s?HxjD6ir3|l+#rm_k^sZI&#@qGtF^tWpgJ(wntc`XDu2H)# z4DQN5h0~J7T=j^nl?}6gO0ywFVLzKz`D{?<_L&=KP*mC{9rNZXhzo;INo*snKxc~G= zRm-s2e?8b){)qrX80?2<<3jw;Ofw^2Uhmc#E1PHLlaQ8TnA?i{Z~mj@GOQXkkZL zLe}2>OZ@+p{@Ym}Gh+_E`lcuW@abVdZYm=Jn_5cbtq}8Mr{d9?I7E?bFhyK{-!U1Kk2jqZW2yu%la1 zCx5=)aDKY1I2Z1(1fhkO*1)6_nCM z6NGnete4Y+GV@#ZDGK2ME=QXU4O0a|J#rv39lx>OveiEAY?X+7=k-@UoP+-U1BnaY z63*OwBzY_RS?6Fu6y6cwVPJ}u(rlz7u;|_0PE3t<~YD=T+IfKiAdBo?mTc-#+wMek!EhXSOG_Pj zSn7X?qR-ak-kaZdtF$iPDm+nvHlKurz4ZuLE1<+60G&m1Z(Xbj;nnVx`-tR|zOZM| zLBRnrQnGO#zW2pGjfMuqG;X{eIHbqOkNkE~`C^BzZ2i@*-dz8C_yS#o(k8aG{0BEM zFxk#9R`*@ai)!E6W1fucTQ~lSzR&HJ+$S%msf9&?=;t{_Y3frHz27+!(AmJq;~)+R z(B~ADxt(N(b~u?%tB&_>)@#1{Xdr&)JjFh@cS;aJpar-N01kK77pLBM{;-m$ZvHMd z=bg_C|6D{y_i~Zam3qH`bQ!Qs19~7v+*0ToGuEi|LKob3sV**$pDKtuWrWf&HOB5<`9DRk*i>bO8tH%t4!S?7SfhLG(C$7cB`^BiZvdZTgfll+ax0HYO z^PeGF$VpV``72FHRsD`{7&E%?sm<61;1R%}ATMHfG9TC!(>uj0cQH4RRboXtMMHK* zFIj}83mbPbnI?frQFYBWby_kL=sYI{=K0BXEb8EHkPL-Nm{O0Qzue$);5opqOWBto9ZcnbJex$}tZkj>edHe}G&hh1AV?83Ld@L{&&MFc zpS@;^HI=g;+*CX}kbRH1X`(hHqyQWMKym@hZ>dt4Ls+)8v1V(vdTG`Qf!@Mb9bojo0_%CzPxz!rPf&AWvMoHkMFNRRGQkZ z&!gL+t`-0vkla*;=)G=+O;ACGtY>$N0%ZMuF#~9lK3q)G*cJUGUfud_^@p^lCYNr= z{g-EIB^oB3cm+HYmQ|_pu+EgUw$MKnJOB=_&`U(S8duUH`P}NRC8?O-J3*Gi$YnI7 z<$#N$X7}ccRPXTI)+e7EZ@uF$z`8!$*0LB-eC6(z<3TY!S#57-3_<1!Gvi-7{@Jp1 zxQ59gO!Ixixvz0en7)?a00j2eWzum=%t|lxW}3Nt8N4sA?uh=-Yh?CJFVW8w0lTwd z-rnl+9Dqz0T120KzH*_b=%HwO_e)4-+uPV|CLXA;^8pMoHZQEs#)wUD*ywfMuP_6|5sx6NXbNPoHnvYCo#D z+Dj%=uFLH%hyJKsJ?*q9N&*o6)Z3?IV`=e*S-$)8Sm`nIX+Ah=#?APBwq>bh0ve(r zq=2$dzVWt?d#IV0+#{Je`Ba|;1mbDk*0KQ>K(w2er_9O*Ag*RuVK;XlL?cXd@1mAKi`DtQmm;Ew=yF z!;j0wZc{hRb>H^Xxg5d+$Em57kAGrdWYh@cP1@}DhLq-z_vRCfJ7ewNhx?x?%u+#u z>lxdgWnm$XJbWO3T$LH9`avJ)S&xHMP`yPsl!65b>EW2n<46&ac|`+ z((VF;_(xb~ty0?;-G;~TTyZ{ok<+DL>qtY)JoBHfSu*qwjR7%xjoqUW&H z;o6&WucooOgxscTvsl2$+1fWQQKlNaw}u3@ie+>tF)*8rFEzLE)*%aV;{eE&jJdH~x%lt`m?n?~xi$aYV8w6R@pH(eCfBCMujy*4TiPj=f z3$*E^%#-<9ScOh2xMen68$}Aj$h6A8`p(GFKouZTUT0r8Yf(HP)zLb_g%uhqWI2lm zxbK|S;S050WmkvH;xZmq8$DG$xCpBZB{BCtrvZh8Otk-@V+o7_!LW}!D^r_*?vh(6 z`i9+jGwt-jkXRA*52bz?gkP ztln#h7i*Xw8LXm(m*m)S)X*3NIb{)(p;p3mPorf0)?x|3r6nKCdbMm;C|du50~tyq zHih5bjj|>`mWpN-Dxq_ji`cUef1*bNFqzMTkqJJ$W*k(wCGsKWoPGPU-I|-nejOmQ zkRQLl#>7KFi>&G5?v8F~$1`1-nDq-2DVp4yi;CiyDy9YcT}80Qe{M^C_rEVFHl2PN z%HJ>YK+zKcv>uKlEfD#3JS-vzGS*1B3xRtBmod~k#Q7xG_e%Hoaa8CPv?#xKwM3W0 z$tjSd8=2)K=kL=_rOJfmSF%NS%NW7oyZ2}{aass)B%py)glLYKCUYl7!k~P)S;VWl zSmWZ*uf1^?4k?_KY7DsKHF0tt_(z1bZF(_byd@(@muH{{g=WcoTa&fUnSku<0x#57 zexKRkAQPM*qf(b5n=Y6FE}wmeM^@D1xzVUl%uOBzt&(Srh7SeqE>!q!Yz zd$4bn`8o+r-{BK46Ni6_Iw?btISKXc|Gnp}&2WS~h@rB`e=#cK*=KT20c!X-7wgZ< z-!dsqkq_oX>$UlAy1>srtC94#=f)8hZmxC9V*ht;+4tF7mEY^rx(M6e?jA9iM1GJR z6qMJLvAReC^Y=_x*eiUh&+U}$IJl4N?{-X#0SJffFV-))IS=^ z+4Z0lKJ`zja1ey$~?FC(2w!9xIqy9;2QL{uo;?E_M5oG!QD1@-RA1<2AjM>-4djqad>`*76JwGfq@y1(PbHx9TQD!suzh?!aHyjhBth zWI%Jd0cy1Asw=x_<%mKu+7=zBTHrWxc3wK7@zs+HD6NOOL^_a&9*yriZAr9)`Z@=N zp*jziD|*c|+T74HJbzg7m?@%9kit$wu46pK;8C+xB23kfs^;U{N5-Z4>S6S*a*h4h ziC|%RpN5CwDmbvQYnVVh^biNnl@|r$SU~#6(vSC5AKCHPd>=25?0hw-Ay(hMB%efI zDNpwh@qpOPgFW`!k_sctpUXd!t?BMjW|k9CLwg?=!?tf!An#lUFfC~g+=-m!qzR~5 z$F!f>z17RUG$29}c&8PrO+g0+&)z8&kTUzpx*#rE{41=VKCJssaZ|z;=f}eBEntDh ztB-i*XLeD-{pbM2j;0q9M`{k zCvwfFjs2aq;k5gAhkFLQ=8SpKUiYNh8>{IHot4LD%5wl<5_*lZZ!eK(IHdsN@mMc; zw7Z9=7MpFHW&;1>&QkaTxv2&Y*n0H0eCu7RCNBQ1OL!L%b=w>JW7f$27^zMv;b+xF&gzFVZYA z>8|_FpD9by3Ca`fQ@-{5Tcwnii9hKG@>lgOALVpuU&BBgvZ5CN@mb^sDKMU9z>q2kA2n0d^ijufyl7%CP+t%83_$A%% zuU?V?$7-q+A5l8Zy`Nvrcm;0+13VIj7FC+aP@?YAD<70EPP$jO9UGd8@L$Vmg@M>( zeBy8sZTekAUgD&FrDeUCyW&;9SL{cIx8Tqk8k%$M5hp&^`u*z(IFgiuBx_`$x_;6W z06NwHm*PwQ#BlHZh_4Su+U6?ux7qrb^&$%3Qbz&0NHBPip!5AXPt#s@^%X>CZKmdlrU~>uA?J3Szpq((A+K6Jha*8 z`{fUkpOSXi?RU))jjb>O8hv;c6S?w6_PNMVhV{PX9+=l*9jtCY?0=$#;#5Hx7Cwh- z=I9VT%_{pga-h($`HkoFRpH|eB`JX4FzOy(|6KXRo2~E*Nqhf?20$Zp}GAoLyz5EzqJM3ooEFKbbmvnoN z{$l+Mwj-8@e6%+rbPw;*Gy5;l+^td#{<%?ITQVu^8K!aVO1_`r%8u>f+gN(+ae~J8 zM99)Dwx8@;dGjx%e{etZOk>*Vg3}O&QBO)tf%pea#lL0ljYyxIK6;Phw+c z|4ut%M~9lz?q(YjYVP(CHwuksYw(_%9XX7y(%-d8ZP5R#!KqF-7lT_OM;{6r7O#($ z9&MkAS`9;K3@-LiZp>WQ%A|YV^+kSM!HMT?Ow{pzy{|huYD9Jn>K;>d!0mEO7W`KC zUGf}hS=@fes=;e>9feUgp=Ld-dQ2?K2v^(#E_yFb7j^2gE!;jE+YfR?PfXdf2|hXP z>-za+j=<$V&P<^ELBpZ-?e*Ne?6?<)4HHND2r_@AX9?<@4M<2o_eNL^%H?)kJjHeN zpqxI|u;%>wl}?a<$=&Ll7BnK{kmRYK2B!sTmeU5TrkwyIXy$P_6iWNoMyIYOr9-JI z>am^G$09O}koNhFX)H8C>|>vPzz-#;p>=N_3Kc_HvDWi1SvyevOf9OfWEX@+SY_Y6 iDZT{z|Fe~S0l(rWotOJm0-^tFfWD3qu}aG(=KlbLv5CF_ 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 0000000..2f4e2c5 --- /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 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 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 0000000..1864fcd --- /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/README.md b/apps/website-ssr/src/README.md new file mode 100644 index 0000000..00e7ff3 --- /dev/null +++ b/apps/website-ssr/src/README.md @@ -0,0 +1,53 @@ +# QR Code Generator + +A QR code generator that is fully open source and built with Next.js, TypeScript, and Tailwind. The generator is designed to be fast, easy to use, and does not require users to sign in or create an account. + +[Live Demo](https://qrcode.yaoss-collection.com) + +![screenshot](/screenshot.png) + +## Features + +- Generate QR codes for text, URLs, phone numbers, SMS, email addresses, and more +- Customize QR code colors, size, and margin +- Supports generating codes for WiFi network information, such as SSID, password, and encryption type (coming soon) +- Provides a free API for generating QR codes (coming soon) + +## Installation + +To run the project locally, you will need to have Node.js and npm installed. Once you have those installed, follow these steps: + +1. Clone this repository: + +```git clone https://github.com/yaoss-collection/qrcodegenerator-frontend-nextjs.git``` + +2. Navigate into the project directory: + +```cd qrcodegenerator-frontend-nextjs``` + +3. Install the dependencies: + +```npm install``` + +4. Start the development server: + +```npm run dev``` + + +The QR code generator should now be running at http://localhost:3000. + +## Contributing + +Contributions are welcome! To contribute to the project, please follow these steps: + +1. Fork this repository. +2. Create a new branch for your feature or bug fix. +3. Make your changes and commit them with a descriptive commit message. +4. Push your changes to your forked repository. +5. Submit a pull request to this repository. + +Please make sure to include tests for any new features or bug fixes. + +## License + +This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details. diff --git a/apps/website-ssr/src/api/getGithubData.ts b/apps/website-ssr/src/api/getGithubData.ts new file mode 100644 index 0000000..b5ffb1b --- /dev/null +++ b/apps/website-ssr/src/api/getGithubData.ts @@ -0,0 +1,25 @@ +import { graphFetchApi } from '@/lib/query'; + +export const getGithubData = async () => { + try { + const query = ` + query { + repository(owner: "yaoss-collection", name: "yaoss-qrcodegenerator-frontend") { + stargazerCount + } + } + `; + + const data = await graphFetchApi.post<{ repository: { stargazerCount: number } }>({ + query, + github: true, + auth: true, + token: process.env.GITHUB_TOKEN, + }); + + return data.repository.stargazerCount; + } catch (error) { + console.error(error); + return null; + } +}; diff --git a/apps/website-ssr/src/components/Footer.tsx b/apps/website-ssr/src/components/Footer.tsx new file mode 100644 index 0000000..b744684 --- /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