mirror of
https://github.com/vercel/commerce.git
synced 2025-05-18 23:46:58 +00:00
added cypress tests and GitHub action config
This commit is contained in:
parent
3a18f9a098
commit
c62c3ae631
@ -1,7 +0,0 @@
|
||||
COMPANY_NAME="Vercel Inc."
|
||||
TWITTER_CREATOR="@vercel"
|
||||
TWITTER_SITE="https://nextjs.org/commerce"
|
||||
SITE_NAME="Next.js Commerce"
|
||||
SHOPIFY_REVALIDATION_SECRET=""
|
||||
SHOPIFY_STOREFRONT_ACCESS_TOKEN=""
|
||||
SHOPIFY_STORE_DOMAIN="[your-shopify-store-subdomain].myshopify.com"
|
23
.github/main.yml
vendored
Normal file
23
.github/main.yml
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
name: E2E on Chrome
|
||||
|
||||
on: [push]
|
||||
|
||||
jobs:
|
||||
install:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Cypress run
|
||||
uses: cypress-io/github-action@v3
|
||||
with:
|
||||
project: ./site
|
||||
browser: chrome
|
||||
build: yarn build
|
||||
start: yarn start
|
||||
wait-on: 'http://localhost:3000'
|
||||
env:
|
||||
COMMERCE_PROVIDER: ${{ secrets.COMMERCE_PROVIDER }}
|
||||
NEXT_PUBLIC_SHOPIFY_STOREFRONT_ACCESS_TOKEN: ${{ secrets.NEXT_PUBLIC_SHOPIFY_STOREFRONT_ACCESS_TOKEN }}
|
||||
NEXT_PUBLIC_SHOPIFY_STORE_DOMAIN: ${{ secrets.NEXT_PUBLIC_SHOPIFY_STORE_DOMAIN }}
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -36,3 +36,4 @@ yarn-error.log*
|
||||
# typescript
|
||||
*.tsbuildinfo
|
||||
next-env.d.ts
|
||||
.env*.local
|
||||
|
6
.vscode/settings.json
vendored
6
.vscode/settings.json
vendored
@ -2,8 +2,8 @@
|
||||
"typescript.tsdk": "node_modules/typescript/lib",
|
||||
"typescript.enablePromptUseWorkspaceTsdk": true,
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.fixAll": true,
|
||||
"source.organizeImports": true,
|
||||
"source.sortMembers": true
|
||||
"source.fixAll": "explicit",
|
||||
"source.organizeImports": "explicit",
|
||||
"source.sortMembers": "explicit"
|
||||
}
|
||||
}
|
||||
|
@ -142,7 +142,9 @@ export default function CartModal({ cart }: { cart: Cart | undefined }) {
|
||||
<div className="ml-auto flex h-9 flex-row items-center rounded-full border border-neutral-200 dark:border-neutral-700">
|
||||
<EditItemQuantityButton item={item} type="minus" />
|
||||
<p className="w-6 text-center">
|
||||
<span className="w-full text-sm">{item.quantity}</span>
|
||||
<span className="w-full text-sm" aria-label="Cart items:">
|
||||
{item.quantity}
|
||||
</span>
|
||||
</p>
|
||||
<EditItemQuantityButton item={item} type="plus" />
|
||||
</div>
|
||||
|
@ -19,7 +19,12 @@ const Label = ({
|
||||
})}
|
||||
>
|
||||
<div className="flex items-center rounded-full border bg-white/70 p-1 text-xs font-semibold text-black backdrop-blur-md dark:border-neutral-800 dark:bg-black/70 dark:text-white">
|
||||
<h3 className="mr-4 line-clamp-2 flex-grow pl-2 leading-none tracking-tight">{title}</h3>
|
||||
<h3
|
||||
className="mr-4 line-clamp-2 flex-grow pl-2 leading-none tracking-tight"
|
||||
data-test="product-name"
|
||||
>
|
||||
{title}
|
||||
</h3>
|
||||
<Price
|
||||
className="flex-none rounded-full bg-blue-600 p-2 text-white"
|
||||
amount={amount}
|
||||
|
@ -21,7 +21,10 @@ export default async function Navbar() {
|
||||
<div className="flex w-full md:w-1/3">
|
||||
<Link href="/" className="mr-2 flex w-full items-center justify-center md:w-auto lg:mr-6">
|
||||
<LogoSquare />
|
||||
<div className="ml-2 flex-none text-sm font-medium uppercase md:hidden lg:block">
|
||||
<div
|
||||
className="ml-2 flex-none text-sm font-medium uppercase md:hidden lg:block"
|
||||
data-test="nav-link-home-page"
|
||||
>
|
||||
{SITE_NAME}
|
||||
</div>
|
||||
</Link>
|
||||
|
@ -25,7 +25,11 @@ export default function Search() {
|
||||
}
|
||||
|
||||
return (
|
||||
<form onSubmit={onSubmit} className="w-max-[550px] relative w-full lg:w-80 xl:w-full">
|
||||
<form
|
||||
onSubmit={onSubmit}
|
||||
className="w-max-[550px] relative w-full lg:w-80 xl:w-full"
|
||||
data-test="search-input"
|
||||
>
|
||||
<input
|
||||
key={searchParams?.get('q')}
|
||||
type="text"
|
||||
|
@ -7,7 +7,7 @@ export default function ProductGridItems({ products }: { products: Product[] })
|
||||
return (
|
||||
<>
|
||||
{products.map((product) => (
|
||||
<Grid.Item key={product.handle} className="animate-fadeIn">
|
||||
<Grid.Item key={product.handle} className="animate-fadeIn" data-test="product-tag">
|
||||
<Link className="relative inline-block h-full w-full" href={`/product/${product.handle}`}>
|
||||
<GridTileImage
|
||||
alt={product.title}
|
||||
|
@ -11,6 +11,7 @@ export default function LogoSquare({ size }: { size?: 'sm' | undefined }) {
|
||||
'h-[30px] w-[30px] rounded-lg': size === 'sm'
|
||||
}
|
||||
)}
|
||||
data-test="logo"
|
||||
>
|
||||
<LogoIcon
|
||||
className={clsx({
|
||||
|
@ -11,7 +11,7 @@ const Price = ({
|
||||
currencyCode: string;
|
||||
currencyCodeClassName?: string;
|
||||
} & React.ComponentProps<'p'>) => (
|
||||
<p suppressHydrationWarning={true} className={className}>
|
||||
<p suppressHydrationWarning={true} className={className} data-test="product-price">
|
||||
{`${new Intl.NumberFormat(undefined, {
|
||||
style: 'currency',
|
||||
currency: currencyCode,
|
||||
|
@ -95,6 +95,7 @@ export function VariantSelector({
|
||||
!isAvailableForSale
|
||||
}
|
||||
)}
|
||||
data-test={`${value}`}
|
||||
>
|
||||
{value}
|
||||
</button>
|
||||
|
12
cypress.config.ts
Normal file
12
cypress.config.ts
Normal file
@ -0,0 +1,12 @@
|
||||
import { defineConfig } from 'cypress';
|
||||
|
||||
export default defineConfig({
|
||||
e2e: {
|
||||
baseUrl: 'http://localhost:3000',
|
||||
viewportHeight: 1000,
|
||||
viewportWidth: 1280,
|
||||
setupNodeEvents(on, config) {
|
||||
// implement node event listeners here
|
||||
}
|
||||
}
|
||||
});
|
23
cypress/e2e/integration/header.cy.js
Normal file
23
cypress/e2e/integration/header.cy.js
Normal file
@ -0,0 +1,23 @@
|
||||
describe('Shopping Cart', () => {
|
||||
beforeEach(() => {
|
||||
cy.visit('/');
|
||||
});
|
||||
it('users can add products to the cart', () => {
|
||||
cy.get('[name="search"]').type('{enter}');
|
||||
cy.getBySel('product-tag').eq(0).click();
|
||||
cy.getBySel('Rubber').eq(0).click();
|
||||
cy.get('[aria-label="Add to cart"]').click();
|
||||
cy.get('[aria-label="Cart items:"]').contains('1');
|
||||
});
|
||||
it('links to the correct pages', () => {
|
||||
cy.getBySel('logo').click({ multiple: true });
|
||||
cy.location('pathname').should('eq', '/');
|
||||
cy.getBySel('nav-link-home-page').click();
|
||||
cy.location('pathname').should('eq', '/');
|
||||
});
|
||||
it.only('the search bar returns the correct search results', () => {
|
||||
cy.get('[name="search"]').type('{enter}');
|
||||
cy.location('pathname').should('eq', '/search');
|
||||
cy.getBySel('search-input').eq(0);
|
||||
});
|
||||
});
|
26
cypress/e2e/integration/home.cy.js
Normal file
26
cypress/e2e/integration/home.cy.js
Normal file
@ -0,0 +1,26 @@
|
||||
describe('Home Page', () => {
|
||||
it('displays all 3 products on the home page', () => {
|
||||
cy.visit('http://localhost:3000');
|
||||
cy.get('[name="search"]').type('{enter}');
|
||||
cy.get('[data-test="product-tag"]')
|
||||
.eq(0)
|
||||
.within(() => {
|
||||
cy.get('[data-test="product-name"]').should('contain', 'Lego Star Wars');
|
||||
cy.get('[data-test="product-price"]').should('contain', '$7.00');
|
||||
});
|
||||
|
||||
cy.get('[data-test="product-tag"]')
|
||||
.eq(1)
|
||||
.within(() => {
|
||||
cy.get('[data-test="product-name"]').should('contain', 'Tatyana');
|
||||
cy.get('[data-test="product-price"]').should('contain', '$6.00');
|
||||
});
|
||||
|
||||
cy.get('[data-test="product-tag"]')
|
||||
.eq(2)
|
||||
.within(() => {
|
||||
cy.get('[data-test="product-name"]').should('contain', 'Star Wars');
|
||||
cy.get('[data-test="product-price"]').should('contain', '$5.00');
|
||||
});
|
||||
});
|
||||
});
|
5
cypress/fixtures/example.json
Normal file
5
cypress/fixtures/example.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"name": "Using fixtures to represent data",
|
||||
"email": "hello@cypress.io",
|
||||
"body": "Fixtures are a great way to mock data for responses to routes"
|
||||
}
|
40
cypress/support/commands.ts
Normal file
40
cypress/support/commands.ts
Normal file
@ -0,0 +1,40 @@
|
||||
/// <reference types="cypress" />
|
||||
// ***********************************************
|
||||
// This example commands.ts shows you how to
|
||||
// create various custom commands and overwrite
|
||||
// existing commands.
|
||||
//
|
||||
// For more comprehensive examples of custom
|
||||
// commands please read more here:
|
||||
// https://on.cypress.io/custom-commands
|
||||
// ***********************************************
|
||||
//
|
||||
//
|
||||
// -- This is a parent command --
|
||||
// Cypress.Commands.add('login', (email, password) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This is a child command --
|
||||
// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This is a dual command --
|
||||
// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This will overwrite an existing command --
|
||||
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
|
||||
//
|
||||
// declare global {
|
||||
// namespace Cypress {
|
||||
// interface Chainable {
|
||||
// login(email: string, password: string): Chainable<void>
|
||||
// drag(subject: string, options?: Partial<TypeOptions>): Chainable<Element>
|
||||
// dismiss(subject: string, options?: Partial<TypeOptions>): Chainable<Element>
|
||||
// visit(originalFn: CommandOriginalFn, url: string, options: Partial<VisitOptions>): Chainable<Element>
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
Cypress.Commands.add('getBySel', (selector, ...args) => {
|
||||
return cy.get(`[data-test=${selector}]`, ...args);
|
||||
});
|
20
cypress/support/e2e.ts
Normal file
20
cypress/support/e2e.ts
Normal file
@ -0,0 +1,20 @@
|
||||
// ***********************************************************
|
||||
// This example support/e2e.ts is processed and
|
||||
// loaded automatically before your test files.
|
||||
//
|
||||
// This is a great place to put global configuration and
|
||||
// behavior that modifies Cypress.
|
||||
//
|
||||
// You can change the location of this file or turn off
|
||||
// automatically serving support files with the
|
||||
// 'supportFile' configuration option.
|
||||
//
|
||||
// You can read more here:
|
||||
// https://on.cypress.io/configuration
|
||||
// ***********************************************************
|
||||
|
||||
// Import commands.js using ES2015 syntax:
|
||||
import './commands';
|
||||
|
||||
// Alternatively you can use CommonJS syntax:
|
||||
// require('./commands')
|
5
cypress/support/index.d.ts
vendored
Normal file
5
cypress/support/index.d.ts
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
declare namespace Cypress {
|
||||
interface Chainable {
|
||||
getBySel(selector, ...args): Cypress.Chainable;
|
||||
}
|
||||
}
|
@ -52,7 +52,7 @@ import {
|
||||
|
||||
const domain = process.env.SHOPIFY_STORE_DOMAIN
|
||||
? ensureStartsWith(process.env.SHOPIFY_STORE_DOMAIN, 'https://')
|
||||
: '';
|
||||
: console.log(process.env.SHOPIFY_STORE_DOMAIN);
|
||||
const endpoint = `${domain}${SHOPIFY_GRAPHQL_API_ENDPOINT}`;
|
||||
const key = process.env.SHOPIFY_STOREFRONT_ACCESS_TOKEN!;
|
||||
|
||||
|
6083
package-lock.json
generated
Normal file
6083
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
@ -13,7 +13,9 @@
|
||||
"lint-staged": "lint-staged",
|
||||
"prettier": "prettier --write --ignore-unknown .",
|
||||
"prettier:check": "prettier --check --ignore-unknown .",
|
||||
"test": "pnpm lint && pnpm prettier:check"
|
||||
"test": "pnpm lint && pnpm prettier:check",
|
||||
"cypress:open": "cypress open",
|
||||
"cypress:run": "cypress run"
|
||||
},
|
||||
"git": {
|
||||
"pre-commit": "lint-staged"
|
||||
@ -26,7 +28,7 @@
|
||||
"@heroicons/react": "^2.0.18",
|
||||
"clsx": "^2.0.0",
|
||||
"geist": "^1.0.0",
|
||||
"next": "14.0.0",
|
||||
"next": "^14.0.4",
|
||||
"react": "18.2.0",
|
||||
"react-dom": "18.2.0"
|
||||
},
|
||||
@ -38,6 +40,7 @@
|
||||
"@types/react-dom": "18.2.14",
|
||||
"@vercel/git-hooks": "^1.0.0",
|
||||
"autoprefixer": "^10.4.16",
|
||||
"cypress": "^13.6.2",
|
||||
"eslint": "^8.52.0",
|
||||
"eslint-config-next": "^14.0.0",
|
||||
"eslint-config-prettier": "^9.0.0",
|
||||
|
69
pnpm-lock.yaml
generated
69
pnpm-lock.yaml
generated
@ -18,8 +18,8 @@ dependencies:
|
||||
specifier: ^1.0.0
|
||||
version: 1.0.0
|
||||
next:
|
||||
specifier: 14.0.0
|
||||
version: 14.0.0(react-dom@18.2.0)(react@18.2.0)
|
||||
specifier: ^14.0.4
|
||||
version: 14.0.4(react-dom@18.2.0)(react@18.2.0)
|
||||
react:
|
||||
specifier: 18.2.0
|
||||
version: 18.2.0
|
||||
@ -228,8 +228,8 @@ packages:
|
||||
'@jridgewell/sourcemap-codec': 1.4.15
|
||||
dev: true
|
||||
|
||||
/@next/env@14.0.0:
|
||||
resolution: {integrity: sha512-cIKhxkfVELB6hFjYsbtEeTus2mwrTC+JissfZYM0n+8Fv+g8ucUfOlm3VEDtwtwydZ0Nuauv3bl0qF82nnCAqA==}
|
||||
/@next/env@14.0.4:
|
||||
resolution: {integrity: sha512-irQnbMLbUNQpP1wcE5NstJtbuA/69kRfzBrpAD7Gsn8zm/CY6YQYc3HQBz8QPxwISG26tIm5afvvVbu508oBeQ==}
|
||||
dev: false
|
||||
|
||||
/@next/eslint-plugin-next@14.0.0:
|
||||
@ -242,8 +242,8 @@ packages:
|
||||
resolution: {integrity: sha512-urmUq05uCVJsBqAAJEV+xK5OTTodrSxdiG+351SOSjlWctywdBM6qX+K9pIe3K48RxjfnxlBbXjGyOJAji+pfw==}
|
||||
dev: false
|
||||
|
||||
/@next/swc-darwin-arm64@14.0.0:
|
||||
resolution: {integrity: sha512-HQKi159jCz4SRsPesVCiNN6tPSAFUkOuSkpJsqYTIlbHLKr1mD6be/J0TvWV6fwJekj81bZV9V/Tgx3C2HO9lA==}
|
||||
/@next/swc-darwin-arm64@14.0.4:
|
||||
resolution: {integrity: sha512-mF05E/5uPthWzyYDyptcwHptucf/jj09i2SXBPwNzbgBNc+XnwzrL0U6BmPjQeOL+FiB+iG1gwBeq7mlDjSRPg==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [darwin]
|
||||
@ -251,8 +251,8 @@ packages:
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/@next/swc-darwin-x64@14.0.0:
|
||||
resolution: {integrity: sha512-4YyQLMSaCgX/kgC1jjF3s3xSoBnwHuDhnF6WA1DWNEYRsbOOPWjcYhv8TKhRe2ApdOam+VfQSffC4ZD+X4u1Cg==}
|
||||
/@next/swc-darwin-x64@14.0.4:
|
||||
resolution: {integrity: sha512-IZQ3C7Bx0k2rYtrZZxKKiusMTM9WWcK5ajyhOZkYYTCc8xytmwSzR1skU7qLgVT/EY9xtXDG0WhY6fyujnI3rw==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [darwin]
|
||||
@ -260,8 +260,8 @@ packages:
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/@next/swc-linux-arm64-gnu@14.0.0:
|
||||
resolution: {integrity: sha512-io7fMkJ28Glj7SH8yvnlD6naIhRDnDxeE55CmpQkj3+uaA2Hko6WGY2pT5SzpQLTnGGnviK85cy8EJ2qsETj/g==}
|
||||
/@next/swc-linux-arm64-gnu@14.0.4:
|
||||
resolution: {integrity: sha512-VwwZKrBQo/MGb1VOrxJ6LrKvbpo7UbROuyMRvQKTFKhNaXjUmKTu7wxVkIuCARAfiI8JpaWAnKR+D6tzpCcM4w==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
@ -269,8 +269,8 @@ packages:
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/@next/swc-linux-arm64-musl@14.0.0:
|
||||
resolution: {integrity: sha512-nC2h0l1Jt8LEzyQeSs/BKpXAMe0mnHIMykYALWaeddTqCv5UEN8nGO3BG8JAqW/Y8iutqJsaMe2A9itS0d/r8w==}
|
||||
/@next/swc-linux-arm64-musl@14.0.4:
|
||||
resolution: {integrity: sha512-8QftwPEW37XxXoAwsn+nXlodKWHfpMaSvt81W43Wh8dv0gkheD+30ezWMcFGHLI71KiWmHK5PSQbTQGUiidvLQ==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
@ -278,8 +278,8 @@ packages:
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/@next/swc-linux-x64-gnu@14.0.0:
|
||||
resolution: {integrity: sha512-Wf+WjXibJQ7hHXOdNOmSMW5bxeJHVf46Pwb3eLSD2L76NrytQlif9NH7JpHuFlYKCQGfKfgSYYre5rIfmnSwQw==}
|
||||
/@next/swc-linux-x64-gnu@14.0.4:
|
||||
resolution: {integrity: sha512-/s/Pme3VKfZAfISlYVq2hzFS8AcAIOTnoKupc/j4WlvF6GQ0VouS2Q2KEgPuO1eMBwakWPB1aYFIA4VNVh667A==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
@ -287,8 +287,8 @@ packages:
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/@next/swc-linux-x64-musl@14.0.0:
|
||||
resolution: {integrity: sha512-WTZb2G7B+CTsdigcJVkRxfcAIQj7Lf0ipPNRJ3vlSadU8f0CFGv/ST+sJwF5eSwIe6dxKoX0DG6OljDBaad+rg==}
|
||||
/@next/swc-linux-x64-musl@14.0.4:
|
||||
resolution: {integrity: sha512-m8z/6Fyal4L9Bnlxde5g2Mfa1Z7dasMQyhEhskDATpqr+Y0mjOBZcXQ7G5U+vgL22cI4T7MfvgtrM2jdopqWaw==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
@ -296,8 +296,8 @@ packages:
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/@next/swc-win32-arm64-msvc@14.0.0:
|
||||
resolution: {integrity: sha512-7R8/x6oQODmNpnWVW00rlWX90sIlwluJwcvMT6GXNIBOvEf01t3fBg0AGURNKdTJg2xNuP7TyLchCL7Lh2DTiw==}
|
||||
/@next/swc-win32-arm64-msvc@14.0.4:
|
||||
resolution: {integrity: sha512-7Wv4PRiWIAWbm5XrGz3D8HUkCVDMMz9igffZG4NB1p4u1KoItwx9qjATHz88kwCEal/HXmbShucaslXCQXUM5w==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [win32]
|
||||
@ -305,8 +305,8 @@ packages:
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/@next/swc-win32-ia32-msvc@14.0.0:
|
||||
resolution: {integrity: sha512-RLK1nELvhCnxaWPF07jGU4x3tjbyx2319q43loZELqF0+iJtKutZ+Lk8SVmf/KiJkYBc7Cragadz7hb3uQvz4g==}
|
||||
/@next/swc-win32-ia32-msvc@14.0.4:
|
||||
resolution: {integrity: sha512-zLeNEAPULsl0phfGb4kdzF/cAVIfaC7hY+kt0/d+y9mzcZHsMS3hAS829WbJ31DkSlVKQeHEjZHIdhN+Pg7Gyg==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [ia32]
|
||||
os: [win32]
|
||||
@ -314,8 +314,8 @@ packages:
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/@next/swc-win32-x64-msvc@14.0.0:
|
||||
resolution: {integrity: sha512-g6hLf1SUko+hnnaywQQZzzb3BRecQsoKkF3o/C+F+dOA4w/noVAJngUVkfwF0+2/8FzNznM7ofM6TGZO9svn7w==}
|
||||
/@next/swc-win32-x64-msvc@14.0.4:
|
||||
resolution: {integrity: sha512-yEh2+R8qDlDCjxVpzOTEpBLQTEFAcP2A8fUFLaWNap9GitYKkKv1//y2S6XY6zsR4rCOPRpU7plYDR+az2n30A==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
@ -2204,8 +2204,8 @@ packages:
|
||||
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
|
||||
dev: true
|
||||
|
||||
/next@14.0.0(react-dom@18.2.0)(react@18.2.0):
|
||||
resolution: {integrity: sha512-J0jHKBJpB9zd4+c153sair0sz44mbaCHxggs8ryVXSFBuBqJ8XdE9/ozoV85xGh2VnSjahwntBZZgsihL9QznA==}
|
||||
/next@14.0.4(react-dom@18.2.0)(react@18.2.0):
|
||||
resolution: {integrity: sha512-qbwypnM7327SadwFtxXnQdGiKpkuhaRLE2uq62/nRul9cj9KhQ5LhHmlziTNqUidZotw/Q1I9OjirBROdUJNgA==}
|
||||
engines: {node: '>=18.17.0'}
|
||||
hasBin: true
|
||||
peerDependencies:
|
||||
@ -2219,25 +2219,26 @@ packages:
|
||||
sass:
|
||||
optional: true
|
||||
dependencies:
|
||||
'@next/env': 14.0.0
|
||||
'@next/env': 14.0.4
|
||||
'@swc/helpers': 0.5.2
|
||||
busboy: 1.6.0
|
||||
caniuse-lite: 1.0.30001554
|
||||
graceful-fs: 4.2.11
|
||||
postcss: 8.4.31
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
styled-jsx: 5.1.1(react@18.2.0)
|
||||
watchpack: 2.4.0
|
||||
optionalDependencies:
|
||||
'@next/swc-darwin-arm64': 14.0.0
|
||||
'@next/swc-darwin-x64': 14.0.0
|
||||
'@next/swc-linux-arm64-gnu': 14.0.0
|
||||
'@next/swc-linux-arm64-musl': 14.0.0
|
||||
'@next/swc-linux-x64-gnu': 14.0.0
|
||||
'@next/swc-linux-x64-musl': 14.0.0
|
||||
'@next/swc-win32-arm64-msvc': 14.0.0
|
||||
'@next/swc-win32-ia32-msvc': 14.0.0
|
||||
'@next/swc-win32-x64-msvc': 14.0.0
|
||||
'@next/swc-darwin-arm64': 14.0.4
|
||||
'@next/swc-darwin-x64': 14.0.4
|
||||
'@next/swc-linux-arm64-gnu': 14.0.4
|
||||
'@next/swc-linux-arm64-musl': 14.0.4
|
||||
'@next/swc-linux-x64-gnu': 14.0.4
|
||||
'@next/swc-linux-x64-musl': 14.0.4
|
||||
'@next/swc-win32-arm64-msvc': 14.0.4
|
||||
'@next/swc-win32-ia32-msvc': 14.0.4
|
||||
'@next/swc-win32-x64-msvc': 14.0.4
|
||||
transitivePeerDependencies:
|
||||
- '@babel/core'
|
||||
- babel-plugin-macros
|
||||
|
Loading…
x
Reference in New Issue
Block a user