diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml index cc887ef..4fa8630 100644 --- a/.github/workflows/quality.yml +++ b/.github/workflows/quality.yml @@ -29,7 +29,7 @@ jobs: - name: Run Prettier run: turbo format - + eslint: name: ESLint timeout-minutes: 15 diff --git a/.npmrc b/.npmrc index 894c167..ef38df8 100644 --- a/.npmrc +++ b/.npmrc @@ -1,4 +1,3 @@ -public-hoist-pattern[]=*prisma* auto-install-peers=true legacy-peer-deps=true node-linker=hoisted diff --git a/apps/maestros/app/(maestros)/monorepos/[...slug]/page.tsx b/apps/maestros/app/(maestros)/monorepos/[...slug]/page.tsx index aa86e0d..3b530e3 100644 --- a/apps/maestros/app/(maestros)/monorepos/[...slug]/page.tsx +++ b/apps/maestros/app/(maestros)/monorepos/[...slug]/page.tsx @@ -67,7 +67,7 @@ function Page({ params }: { params: { slug: string[] } }) { {/* @ts-expect-error Don't care, we shippin'! */} -
+
{headings.length > 0 ?

On this page

: null} {headings.map((rawHeading) => { diff --git a/apps/maestros/app/(maestros)/monorepos/email-list/page.tsx b/apps/maestros/app/(maestros)/monorepos/email-list/page.tsx index 768e5b8..fc40248 100644 --- a/apps/maestros/app/(maestros)/monorepos/email-list/page.tsx +++ b/apps/maestros/app/(maestros)/monorepos/email-list/page.tsx @@ -6,7 +6,6 @@ export const revalidate = 0; const Page = async () => { const session = await getServerSession(authOptions); - const isAnthony = session?.user?.email === 'anthonyshew@gmail.com'; if (!isAnthony) { @@ -17,9 +16,10 @@ const Page = async () => { const emails = peeps.map((peep) => peep.email); return ( -
+
+

Count: {emails.length}

{JSON.stringify(emails, null, 2)}
-
+ ); }; diff --git a/apps/maestros/content/maestros/lessons/basics/index.mdx b/apps/maestros/content/maestros/lessons/basics/index.mdx index 4f39a2c..a342ef7 100644 --- a/apps/maestros/content/maestros/lessons/basics/index.mdx +++ b/apps/maestros/content/maestros/lessons/basics/index.mdx @@ -18,7 +18,7 @@ In a monorepo, we're building one repository that handles all of our application ## Workspaces are like mini-projects -Every application and package that you build will be in its own workspace. The key is to think of your workspaces as independent, small projects in your repository whose purpose is to straightforwardly share code to other parts of your repository. +Every application and package that you build will be in its own workspace. The key is to think of your workspaces as independent, small projects in your repository whose purpose is to straightforwardly share code to other parts of your repository. This includes dependencies and source code that is required to develop and build that workspace. In this way, you'll start thinking of your monorepo in self-contained slices that expose an API to the outside world. This should sound familiar if you're used to writing modular code. In a monorepo, we can encourage ourselves and our teammates to use the workspace boundary as a module boundary. diff --git a/apps/maestros/content/maestros/lessons/ci-cd/caching.mdx b/apps/maestros/content/maestros/lessons/ci-cd/caching.mdx index 700385d..e65a80e 100644 --- a/apps/maestros/content/maestros/lessons/ci-cd/caching.mdx +++ b/apps/maestros/content/maestros/lessons/ci-cd/caching.mdx @@ -1,7 +1,6 @@ --- title: Cache means fast sidebarOrderPosition: 0 -unpublished: true ogDescription: Using caching in your monorepo --- diff --git a/apps/maestros/content/maestros/lessons/ci-cd/deployment.mdx b/apps/maestros/content/maestros/lessons/ci-cd/deployment.mdx new file mode 100644 index 0000000..3384efb --- /dev/null +++ b/apps/maestros/content/maestros/lessons/ci-cd/deployment.mdx @@ -0,0 +1,9 @@ +--- +title: Deploy to Vercel +sidebarOrderPosition: 3 +ogDescription: Deploy to Vercel from a monorepo +--- + +import { UnderConstruction } from '../../UnderConstruction'; + + diff --git a/apps/maestros/content/maestros/lessons/ci-cd/ignoring.mdx b/apps/maestros/content/maestros/lessons/ci-cd/feature-flags.mdx similarity index 52% rename from apps/maestros/content/maestros/lessons/ci-cd/ignoring.mdx rename to apps/maestros/content/maestros/lessons/ci-cd/feature-flags.mdx index 4bb0570..e2c2cfc 100644 --- a/apps/maestros/content/maestros/lessons/ci-cd/ignoring.mdx +++ b/apps/maestros/content/maestros/lessons/ci-cd/feature-flags.mdx @@ -1,8 +1,7 @@ --- -title: Ignoring unnecessary work +title: Feature flags sidebarOrderPosition: 2 -unpublished: true -ogDescription: Ignoring unnecessary work in a monorepo +ogDescription: Using feature flags in a monorepo --- import { UnderConstruction } from '../../UnderConstruction'; diff --git a/apps/maestros/content/maestros/lessons/ci-cd/github-actions.mdx b/apps/maestros/content/maestros/lessons/ci-cd/github-actions.mdx index b956e09..4d9018e 100644 --- a/apps/maestros/content/maestros/lessons/ci-cd/github-actions.mdx +++ b/apps/maestros/content/maestros/lessons/ci-cd/github-actions.mdx @@ -1,7 +1,6 @@ --- title: GitHub Actions sidebarOrderPosition: 1 -unpublished: true ogDescription: Using GitHub Actions in a monorepo --- diff --git a/apps/maestros/content/maestros/lessons/ci-cd/index.mdx b/apps/maestros/content/maestros/lessons/ci-cd/index.mdx index 9b3aef0..2c3dac1 100644 --- a/apps/maestros/content/maestros/lessons/ci-cd/index.mdx +++ b/apps/maestros/content/maestros/lessons/ci-cd/index.mdx @@ -4,4 +4,46 @@ sidebarOrderPosition: 6 ogDescription: Handling CI/CD in a monorepo --- -Developing an app is good fun but, at the end of it all, shipping is what matters. +Developing an app is great fun but, at the end of it all, shipping is what matters. + +Continuous deployment and continuous integration can be done in a lot of different ways. In Maestros, we'll discuss simple, powerful patterns to get web applications online to get you started. As your skills grow into more bespoke system, you'll have a good foundation to work from. + +On this page, we'll discuss the high-level process of getting an application out to production in a fast, maintainable, and predictable way. + +## General process + +The conventional process for getting code out to production in a modern CI/CD process follows this general pattern: + +1. Developer writes code. +2. Developer commits code to git and creates a pull request to the main branch of the codebase. +3. Automated checks are ran against the newly committed code. Additionally, one or more reviewers are asked to read through the code. +4. Once code passes all automated checks and has been reviewed, it is merged and deployed to production. + +## Common objections + +In a monorepo, specifically, issues can arise in this process if you aren't using good tooling. Let's talk about these potential problems below and discuss how the techniques in Maestros solve them. + +### Release management + +A common misconception is that constantly putting new code on the mainline means that you will be constantly releasing new code to the hot paths of your application. If you're working on a new feature, you want to release it when it is complete instead of the first time that you write code for it. + +To account for this, we use [feature flags](/monorepos/ci-cd/feature-flags). In a modern CI/CD process, you (nearly) always want to be merging into main through [trunk-based development](https://www.atlassian.com/continuous-delivery/continuous-integration/trunk-based-development). This allows you to: + +- Develop in small batches +- Learn about merge conflicts faster (and reduce them in general) +- Test code sooner +- Ship faster + +We'll discuss what this looks like more on the [Feature Flags page](/monorepos/ci-cd/feature-flags). + +### Slower feedback loops + +A common concern with monorepos is that there's simply more code in the codebase to run checks against. That means that checks will run slower since there is more work to do for more code. + +This is a very valid concern. Our developers deserve tight feedback loops. Waiting an hour for checks to run against millions of lines of code should be considered unacceptable. + +The good news is that we can easily resolve this concern with Turborepo. [With caching](/monorepos/ci-cd/caching), we can ensure that we never do the same work twice. + +## Tools for the job + +As mentioned before, we're going to administer a straightforward pipeline using [GitHub Actions](/monorepos/ci-cd/github-actions) and [deploying to Vercel](/monorepos/ci-cd/deployment). There are absolutely other actions providers, platforms, and tooling that you can use if you prefer others (and we hope to add more in the future!). diff --git a/apps/maestros/content/maestros/lessons/package-managers/index.mdx b/apps/maestros/content/maestros/lessons/package-managers/index.mdx index 0ad972d..9079a30 100644 --- a/apps/maestros/content/maestros/lessons/package-managers/index.mdx +++ b/apps/maestros/content/maestros/lessons/package-managers/index.mdx @@ -6,9 +6,9 @@ ogDescription: Monorepo package managers **We will be using pnpm throughout Maestros.** If you need to use a different package manager, we'll leave it to you to adjust accordingly. -- [pnpm](/monorepos/padckage-managers/pnpm) -- [yarn](/monorepos/padckage-managers/yarn) -- [npm](/monorepos/padckage-managers/npm) +- [pnpm](/monorepos/package-managers/pnpm) +- [yarn](/monorepos/package-managers/yarn) +- [npm](/monorepos/package-managers/npm) Your package manager lays the foundation of your repository. It has two core responsibilities in your monorepo: diff --git a/package.json b/package.json index 1079d53..cc7736b 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "eslint": "^8.47.0", "prettier": "^2.8.0", "prettier-plugin-packagejson": "^2.4.3", - "turbo": "^1.10.13" + "turbo": "^1.10.14" }, "packageManager": "pnpm@8.6.5", "engines": { diff --git a/packages/analytics/tsup.config.ts b/packages/analytics/tsup.config.ts index 798e5d7..d0e6193 100644 --- a/packages/analytics/tsup.config.ts +++ b/packages/analytics/tsup.config.ts @@ -10,4 +10,7 @@ export default defineConfig((options: Options) => ({ splitting: true, treeshake: true, ...options, + banner: { + js: '"use client"', + }, })); diff --git a/packages/db/schema.prisma b/packages/db/schema.prisma index 0b3dbcc..d23400f 100644 --- a/packages/db/schema.prisma +++ b/packages/db/schema.prisma @@ -1,27 +1,27 @@ datasource db { - provider = "postgresql" - url = env("POSTGRES_PRISMA_URL") - directUrl = env("POSTGRES_URL_NON_POOLING") + provider = "postgresql" + url = env("POSTGRES_PRISMA_URL") + directUrl = env("POSTGRES_URL_NON_POOLING") shadowDatabaseUrl = env("POSTGRES_URL_NON_POOLING") } generator client { - provider = "prisma-client-js" + provider = "prisma-client-js" } model Account { - id String @id @default(cuid()) - userId String - type String - provider String - providerAccountId String - refresh_token String? @db.Text - access_token String? @db.Text - expires_at Int? - token_type String? - scope String? - id_token String? @db.Text - session_state String? + id String @id @default(cuid()) + userId String + type String + provider String + providerAccountId String + refresh_token String? @db.Text + access_token String? @db.Text + expires_at Int? + token_type String? + scope String? + id_token String? @db.Text + session_state String? user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@ -52,4 +52,4 @@ model VerificationToken { expires DateTime @@unique([identifier, token]) -} \ No newline at end of file +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7c84f02..ec9ec2a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: devDependencies: '@vercel/style-guide': specifier: ^4.0.2 - version: 4.0.2(@next/eslint-plugin-next@13.4.20-canary.15)(eslint@8.49.0)(prettier@2.8.0)(typescript@5.2.2) + version: 4.0.2(@next/eslint-plugin-next@13.4.20-canary.33)(eslint@8.49.0)(prettier@2.8.0)(typescript@5.2.2) eslint: specifier: ^8.47.0 version: 8.49.0 @@ -21,7 +21,7 @@ importers: specifier: ^2.4.3 version: 2.4.3(prettier@2.8.0) turbo: - specifier: ^1.10.13 + specifier: ^1.10.14 version: 1.10.14 apps/maestros: @@ -61,7 +61,7 @@ importers: version: 0.108.0(react@18.2.0) next: specifier: ^13.4.19 - version: 13.4.19(@babel/core@7.22.19)(@opentelemetry/api@1.6.0)(react-dom@18.2.0)(react@18.2.0) + version: 13.4.19(@babel/core@7.22.20)(@opentelemetry/api@1.6.0)(react-dom@18.2.0)(react@18.2.0) next-auth: specifier: ^4.22.1 version: 4.22.1(next@13.4.19)(react-dom@18.2.0)(react@18.2.0) @@ -161,7 +161,7 @@ importers: version: 0.8.5 next: specifier: ^13.4.19 - version: 13.4.19(@babel/core@7.22.19)(@opentelemetry/api@1.6.0)(react-dom@18.2.0)(react@18.2.0) + version: 13.4.19(@babel/core@7.22.20)(@opentelemetry/api@1.6.0)(react-dom@18.2.0)(react@18.2.0) postcss: specifier: ^8.4.21 version: 8.4.24 @@ -318,7 +318,7 @@ importers: dependencies: '@next/eslint-plugin-next': specifier: canary - version: 13.4.20-canary.15 + version: 13.4.20-canary.33 '@repo/tsconfig': specifier: workspace:* version: link:../typescript-config @@ -333,7 +333,7 @@ importers: version: 5.59.1(eslint@8.49.0)(typescript@5.2.2) '@vercel/style-guide': specifier: ^4.0.2 - version: 4.0.2(@next/eslint-plugin-next@13.4.20-canary.15)(eslint@8.49.0)(prettier@2.8.0)(typescript@5.2.2) + version: 4.0.2(@next/eslint-plugin-next@13.4.20-canary.33)(eslint@8.49.0)(prettier@2.8.0)(typescript@5.2.2) eslint: specifier: ^8.47.0 version: 8.49.0 @@ -404,26 +404,26 @@ packages: resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.22.13 + '@babel/highlight': 7.22.20 chalk: 2.4.2 - /@babel/compat-data@7.22.9: - resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} + /@babel/compat-data@7.22.20: + resolution: {integrity: sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==} engines: {node: '>=6.9.0'} - /@babel/core@7.22.19: - resolution: {integrity: sha512-Q8Yj5X4LHVYTbLCKVz0//2D2aDmHF4xzCdEttYvKOnWvErGsa6geHXD6w46x64n5tP69VfeH+IfSrdyH3MLhwA==} + /@babel/core@7.22.20: + resolution: {integrity: sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.22.13 '@babel/generator': 7.22.15 '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.22.19(@babel/core@7.22.19) + '@babel/helper-module-transforms': 7.22.20(@babel/core@7.22.20) '@babel/helpers': 7.22.15 '@babel/parser': 7.22.16 '@babel/template': 7.22.15 - '@babel/traverse': 7.22.19 + '@babel/traverse': 7.22.20 '@babel/types': 7.22.19 convert-source-map: 1.9.0 debug: 4.3.4 @@ -433,14 +433,14 @@ packages: transitivePeerDependencies: - supports-color - /@babel/eslint-parser@7.22.15(@babel/core@7.22.19)(eslint@8.49.0): + /@babel/eslint-parser@7.22.15(@babel/core@7.22.20)(eslint@8.49.0): resolution: {integrity: sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: '@babel/core': ^7.11.0 eslint: ^7.5.0 || ^8.0.0 dependencies: - '@babel/core': 7.22.19 + '@babel/core': 7.22.20 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 eslint: 8.49.0 eslint-visitor-keys: 2.1.0 @@ -459,14 +459,14 @@ packages: resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.22.9 + '@babel/compat-data': 7.22.20 '@babel/helper-validator-option': 7.22.15 browserslist: 4.21.10 lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-environment-visitor@7.22.5: - resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} /@babel/helper-function-name@7.22.5: @@ -488,18 +488,18 @@ packages: dependencies: '@babel/types': 7.22.19 - /@babel/helper-module-transforms@7.22.19(@babel/core@7.22.19): - resolution: {integrity: sha512-m6h1cJvn+OJ+R3jOHp30faq5xKJ7VbjwDj5RGgHuRlU9hrMeKsGC+JpihkR5w1g7IfseCPPtZ0r7/hB4UKaYlA==} + /@babel/helper-module-transforms@7.22.20(@babel/core@7.22.20): + resolution: {integrity: sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.19 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/core': 7.22.20 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-module-imports': 7.22.15 '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.19 + '@babel/helper-validator-identifier': 7.22.20 /@babel/helper-simple-access@7.22.5: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} @@ -517,8 +517,8 @@ packages: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-identifier@7.22.19: - resolution: {integrity: sha512-Tinq7ybnEPFFXhlYOYFiSjespWQk0dq2dRNAiMdRTOYQzEGqnnNyrTxPYHP5r6wGjlF1rFgABdDV0g8EwD6Qbg==} + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} /@babel/helper-validator-option@7.22.15: @@ -530,16 +530,16 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.22.15 - '@babel/traverse': 7.22.19 + '@babel/traverse': 7.22.20 '@babel/types': 7.22.19 transitivePeerDependencies: - supports-color - /@babel/highlight@7.22.13: - resolution: {integrity: sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==} + /@babel/highlight@7.22.20: + resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.22.19 + '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 @@ -572,13 +572,13 @@ packages: '@babel/parser': 7.22.16 '@babel/types': 7.22.19 - /@babel/traverse@7.22.19: - resolution: {integrity: sha512-ZCcpVPK64krfdScRbpxF6xA5fz7IOsfMwx1tcACvCzt6JY+0aHkBk7eIU8FRDSZRU5Zei6Z4JfgAxN1bqXGECg==} + /@babel/traverse@7.22.20: + resolution: {integrity: sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.22.13 '@babel/generator': 7.22.15 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.22.5 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 @@ -594,7 +594,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.19 + '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 /@code-hike/lighter@0.8.1: @@ -1466,8 +1466,8 @@ packages: glob: 7.1.7 dev: true - /@next/eslint-plugin-next@13.4.20-canary.15: - resolution: {integrity: sha512-Bolwt8DYYASzNADy9XIu/q5tLp+/9pVL3DWuaSWpb4UvaJMgyHIgmi+5pM5oRQiC7BwBDErnTBdiEmaP7zl/dQ==} + /@next/eslint-plugin-next@13.4.20-canary.33: + resolution: {integrity: sha512-oVec/t9lnmxbKeWXsPag+llh1GItT9VqDdVq0+zyupHG7HQHUDik+6/QFzykwKDbZiSnzoQQZ00/Oj2w7Ad77w==} dependencies: glob: 7.1.7 @@ -3460,7 +3460,7 @@ packages: yoga-wasm-web: 0.3.0 dev: false - /@vercel/style-guide@4.0.2(@next/eslint-plugin-next@13.4.20-canary.15)(eslint@8.49.0)(prettier@2.8.0)(typescript@5.2.2): + /@vercel/style-guide@4.0.2(@next/eslint-plugin-next@13.4.20-canary.33)(eslint@8.49.0)(prettier@2.8.0)(typescript@5.2.2): resolution: {integrity: sha512-FroL+oOePzhw7n/I+f7zr4WNroGHT/+2TlW6WH9+CVSjMNsEyu7Qstj2mI5gWIBjT1Y2ZImKPppCzI2cIYmNZw==} engines: {node: '>=16'} peerDependencies: @@ -3478,16 +3478,16 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.22.19 - '@babel/eslint-parser': 7.22.15(@babel/core@7.22.19)(eslint@8.49.0) - '@next/eslint-plugin-next': 13.4.20-canary.15 + '@babel/core': 7.22.20 + '@babel/eslint-parser': 7.22.15(@babel/core@7.22.20)(eslint@8.49.0) + '@next/eslint-plugin-next': 13.4.20-canary.33 '@rushstack/eslint-patch': 1.4.0 '@typescript-eslint/eslint-plugin': 5.59.1(@typescript-eslint/parser@5.59.1)(eslint@8.49.0)(typescript@5.2.2) '@typescript-eslint/parser': 5.59.1(eslint@8.49.0)(typescript@5.2.2) eslint: 8.49.0 eslint-config-prettier: 8.10.0(eslint@8.49.0) eslint-import-resolver-alias: 1.1.2(eslint-plugin-import@2.28.1) - eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@5.59.1)(eslint-plugin-import@2.28.1)(eslint@8.49.0) + eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@5.59.1)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.49.0) eslint-plugin-eslint-comments: 3.2.0(eslint@8.49.0) eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.59.1)(eslint-import-resolver-typescript@3.6.0)(eslint@8.49.0) eslint-plugin-jest: 27.4.0(@typescript-eslint/eslint-plugin@5.59.1)(eslint@8.49.0)(typescript@5.2.2) @@ -4737,28 +4737,6 @@ packages: - eslint-import-resolver-webpack - supports-color - /eslint-import-resolver-typescript@3.6.0(@typescript-eslint/parser@5.59.1)(eslint-plugin-import@2.28.1)(eslint@8.49.0): - resolution: {integrity: sha512-QTHR9ddNnn35RTxlaEnx2gCxqFlF2SEN0SE2d17SqwyM7YOSI2GHWRYp5BiRkObTUNYPupC/3Fq2a0PpT+EKpg==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' - dependencies: - debug: 4.3.4 - enhanced-resolve: 5.15.0 - eslint: 8.49.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.1)(eslint-import-resolver-typescript@3.6.0)(eslint@8.49.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.59.1)(eslint-import-resolver-typescript@3.6.0)(eslint@8.49.0) - fast-glob: 3.3.1 - get-tsconfig: 4.7.0 - is-core-module: 2.13.0 - is-glob: 4.0.3 - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-node - - eslint-import-resolver-webpack - - supports-color - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.59.1)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.0)(eslint@8.49.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} @@ -4788,34 +4766,6 @@ packages: transitivePeerDependencies: - supports-color - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.59.1)(eslint-import-resolver-typescript@3.6.0)(eslint@8.49.0): - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': 5.59.1(eslint@8.49.0)(typescript@5.2.2) - debug: 3.2.7 - eslint: 8.49.0 - eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@5.59.1)(eslint-plugin-import@2.28.1)(eslint@8.49.0) - transitivePeerDependencies: - - supports-color - /eslint-plugin-eslint-comments@3.2.0(eslint@8.49.0): resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} engines: {node: '>=6.5.0'} @@ -4980,7 +4930,7 @@ packages: peerDependencies: eslint: '>=8.18.0' dependencies: - '@babel/helper-validator-identifier': 7.22.19 + '@babel/helper-validator-identifier': 7.22.20 ci-info: 3.8.0 clean-regexp: 1.0.0 eslint: 8.49.0 @@ -5306,12 +5256,12 @@ packages: resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==} engines: {node: '>=12.0.0'} dependencies: - flatted: 3.2.8 + flatted: 3.2.9 keyv: 4.5.3 rimraf: 3.0.2 - /flatted@3.2.8: - resolution: {integrity: sha512-6qu0W+A94UKNJRs3ffE8s/fWSHQbjqdNx8elGAe95IqnJA77P68TFz4+2cwC28ouAibiZdGBeV6DsvvMg+4vhQ==} + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -6958,7 +6908,7 @@ packages: '@panva/hkdf': 1.1.1 cookie: 0.5.0 jose: 4.14.6 - next: 13.4.19(@babel/core@7.22.19)(@opentelemetry/api@1.6.0)(react-dom@18.2.0)(react@18.2.0) + next: 13.4.19(@babel/core@7.22.20)(@opentelemetry/api@1.6.0)(react-dom@18.2.0)(react@18.2.0) oauth: 0.9.15 openid-client: 5.5.0 preact: 10.17.1 @@ -6979,7 +6929,7 @@ packages: '@contentlayer/core': 0.3.4(esbuild@0.19.3) '@contentlayer/utils': 0.3.4 contentlayer: 0.3.4(esbuild@0.19.3) - next: 13.4.19(@babel/core@7.22.19)(@opentelemetry/api@1.6.0)(react-dom@18.2.0)(react@18.2.0) + next: 13.4.19(@babel/core@7.22.20)(@opentelemetry/api@1.6.0)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: @@ -6996,12 +6946,12 @@ packages: react: '*' react-dom: '*' dependencies: - next: 13.4.19(@babel/core@7.22.19)(@opentelemetry/api@1.6.0)(react-dom@18.2.0)(react@18.2.0) + next: 13.4.19(@babel/core@7.22.20)(@opentelemetry/api@1.6.0)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /next@13.4.19(@babel/core@7.22.19)(@opentelemetry/api@1.6.0)(react-dom@18.2.0)(react@18.2.0): + /next@13.4.19(@babel/core@7.22.20)(@opentelemetry/api@1.6.0)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-HuPSzzAbJ1T4BD8e0bs6B9C1kWQ6gv8ykZoRWs5AQoiIuqbGHHdQO7Ljuvg05Q0Z24E2ABozHe6FxDvI6HfyAw==} engines: {node: '>=16.8.0'} hasBin: true @@ -7024,7 +6974,7 @@ packages: postcss: 8.4.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.1(@babel/core@7.22.19)(react@18.2.0) + styled-jsx: 5.1.1(@babel/core@7.22.20)(react@18.2.0) watchpack: 2.4.0 zod: 3.21.4 optionalDependencies: @@ -8622,7 +8572,7 @@ packages: inline-style-parser: 0.1.1 dev: false - /styled-jsx@5.1.1(@babel/core@7.22.19)(react@18.2.0): + /styled-jsx@5.1.1(@babel/core@7.22.20)(react@18.2.0): resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} engines: {node: '>= 12.0.0'} peerDependencies: @@ -8635,7 +8585,7 @@ packages: babel-plugin-macros: optional: true dependencies: - '@babel/core': 7.22.19 + '@babel/core': 7.22.20 client-only: 0.0.1 react: 18.2.0 dev: false