diff --git a/.changeset/bright-impalas-swim.md b/.changeset/bright-impalas-swim.md deleted file mode 100644 index b3f3cd8260..0000000000 --- a/.changeset/bright-impalas-swim.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@shopify/cli-hydrogen': patch ---- - -Fix the `check routes` command to match optional segments. diff --git a/package-lock.json b/package-lock.json index 8525234cf7..0ab1c2d0d1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29509,7 +29509,7 @@ }, "packages/cli": { "name": "@shopify/cli-hydrogen", - "version": "4.0.9", + "version": "4.1.0", "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "@oclif/core": "2.1.4", @@ -29543,8 +29543,8 @@ }, "peerDependencies": { "@remix-run/react": "^1.15.0", - "@shopify/hydrogen-react": "^2023.1.7", - "@shopify/remix-oxygen": "^1.0.4" + "@shopify/hydrogen-react": "^2023.1.8", + "@shopify/remix-oxygen": "^1.0.5" } }, "packages/cli/node_modules/@oclif/core": { @@ -31713,10 +31713,10 @@ }, "packages/create-hydrogen": { "name": "@shopify/create-hydrogen", - "version": "4.0.5", + "version": "4.1.0", "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "@shopify/cli-hydrogen": "^4.0.9" + "@shopify/cli-hydrogen": "^4.1.0" }, "bin": { "create-hydrogen": "dist/create-app.js" @@ -31724,10 +31724,10 @@ }, "packages/hydrogen": { "name": "@shopify/hydrogen", - "version": "2023.1.6", + "version": "2023.1.7", "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "@shopify/hydrogen-react": "2023.1.7", + "@shopify/hydrogen-react": "2023.1.8", "react": "^18.2.0" }, "devDependencies": { @@ -31743,7 +31743,7 @@ }, "packages/hydrogen-react": { "name": "@shopify/hydrogen-react", - "version": "2023.1.7", + "version": "2023.1.8", "license": "MIT", "dependencies": { "@google/model-viewer": "^1.12.1", @@ -32011,7 +32011,7 @@ }, "packages/remix-oxygen": { "name": "@shopify/remix-oxygen", - "version": "1.0.4", + "version": "1.0.5", "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "@remix-run/server-runtime": "1.15.0" @@ -32024,14 +32024,14 @@ } }, "templates/demo-store": { - "version": "0.1.0", + "version": "0.2.0", "dependencies": { "@headlessui/react": "^1.7.2", "@remix-run/react": "1.15.0", "@shopify/cli": "3.45.0", - "@shopify/cli-hydrogen": "^4.0.9", - "@shopify/hydrogen": "^2023.1.6", - "@shopify/remix-oxygen": "^1.0.4", + "@shopify/cli-hydrogen": "^4.1.0", + "@shopify/hydrogen": "^2023.1.7", + "@shopify/remix-oxygen": "^1.0.5", "clsx": "^1.2.1", "cross-env": "^7.0.3", "graphql": "^16.6.0", @@ -32077,9 +32077,9 @@ "dependencies": { "@remix-run/react": "1.15.0", "@shopify/cli": "3.45.0", - "@shopify/cli-hydrogen": "^4.0.9", - "@shopify/hydrogen": "^2023.1.6", - "@shopify/remix-oxygen": "^1.0.4", + "@shopify/cli-hydrogen": "^4.1.0", + "@shopify/hydrogen": "^2023.1.7", + "@shopify/remix-oxygen": "^1.0.5", "graphql": "^16.6.0", "graphql-tag": "^2.12.6", "isbot": "^3.6.6", @@ -32107,9 +32107,9 @@ "dependencies": { "@remix-run/react": "1.15.0", "@shopify/cli": "3.45.0", - "@shopify/cli-hydrogen": "^4.0.9", - "@shopify/hydrogen": "^2023.1.6", - "@shopify/remix-oxygen": "^1.0.4", + "@shopify/cli-hydrogen": "^4.1.0", + "@shopify/hydrogen": "^2023.1.7", + "@shopify/remix-oxygen": "^1.0.5", "graphql": "^16.6.0", "graphql-tag": "^2.12.6", "isbot": "^3.6.6", @@ -38564,7 +38564,7 @@ "@shopify/create-hydrogen": { "version": "file:packages/create-hydrogen", "requires": { - "@shopify/cli-hydrogen": "^4.0.9" + "@shopify/cli-hydrogen": "^4.1.0" } }, "@shopify/eslint-plugin": { @@ -38631,7 +38631,7 @@ "@shopify/hydrogen": { "version": "file:packages/hydrogen", "requires": { - "@shopify/hydrogen-react": "2023.1.7", + "@shopify/hydrogen-react": "2023.1.8", "@testing-library/react": "^14.0.0", "happy-dom": "^8.9.0", "react": "^18.2.0", @@ -42088,12 +42088,12 @@ "@remix-run/eslint-config": "1.15.0", "@remix-run/react": "1.15.0", "@shopify/cli": "3.45.0", - "@shopify/cli-hydrogen": "^4.0.9", + "@shopify/cli-hydrogen": "^4.1.0", "@shopify/eslint-plugin": "^42.0.1", - "@shopify/hydrogen": "^2023.1.6", + "@shopify/hydrogen": "^2023.1.7", "@shopify/oxygen-workers-types": "^3.17.2", "@shopify/prettier-config": "^1.1.2", - "@shopify/remix-oxygen": "^1.0.4", + "@shopify/remix-oxygen": "^1.0.5", "@tailwindcss/forms": "^0.5.3", "@tailwindcss/typography": "^0.5.9", "@types/eslint": "^8.4.10", @@ -44490,11 +44490,11 @@ "@remix-run/dev": "1.15.0", "@remix-run/react": "1.15.0", "@shopify/cli": "3.45.0", - "@shopify/cli-hydrogen": "^4.0.9", - "@shopify/hydrogen": "^2023.1.6", + "@shopify/cli-hydrogen": "^4.1.0", + "@shopify/hydrogen": "^2023.1.7", "@shopify/oxygen-workers-types": "^3.17.2", "@shopify/prettier-config": "^1.1.2", - "@shopify/remix-oxygen": "^1.0.4", + "@shopify/remix-oxygen": "^1.0.5", "@types/eslint": "^8.4.10", "@types/react": "^18.0.20", "@types/react-dom": "^18.0.6", @@ -50620,11 +50620,11 @@ "@remix-run/dev": "1.15.0", "@remix-run/react": "1.15.0", "@shopify/cli": "3.45.0", - "@shopify/cli-hydrogen": "^4.0.9", - "@shopify/hydrogen": "^2023.1.6", + "@shopify/cli-hydrogen": "^4.1.0", + "@shopify/hydrogen": "^2023.1.7", "@shopify/oxygen-workers-types": "^3.17.2", "@shopify/prettier-config": "^1.1.2", - "@shopify/remix-oxygen": "^1.0.4", + "@shopify/remix-oxygen": "^1.0.5", "@types/eslint": "^8.4.10", "@types/react": "^18.0.20", "@types/react-dom": "^18.0.6", diff --git a/packages/cli/src/lib/missing-routes.test.ts b/packages/cli/src/lib/missing-routes.test.ts deleted file mode 100644 index 62d0b9adb8..0000000000 --- a/packages/cli/src/lib/missing-routes.test.ts +++ /dev/null @@ -1,52 +0,0 @@ -import {describe, it, expect} from 'vitest'; -import {findMissingRoutes} from './missing-routes.js'; - -const createRoute = (path: string) => ({ - routes: { - 'route-id': { - file: 'a/file', - id: 'route-id', - path, - }, - }, -}); - -describe('missing-routes', () => { - it('matches routes with dots', async () => { - const requiredRoutes = ['sitemap.xml']; - - expect(findMissingRoutes({routes: {}}, requiredRoutes)).toHaveLength(1); - expect( - findMissingRoutes(createRoute('sitemap.xml'), requiredRoutes), - ).toHaveLength(0); - }); - - it('matches routes with different parameter names', async () => { - const requiredRoutes = ['collections/:collectionHandle']; - - expect(findMissingRoutes({routes: {}}, requiredRoutes)).toHaveLength(1); - expect( - findMissingRoutes(createRoute('collections/:param'), requiredRoutes), - ).toHaveLength(0); - }); - - it('matches optional segments in different positions', async () => { - const requiredRoutes = ['collections/products']; - const validRoutes = [ - 'segment?/collections/products', - ':segment?/collections/products', - 'collections/segment?/products', - 'collections/:segment?/products', - 'collections/products/segment?', - 'collections/products/:segment?', - ]; - - expect(findMissingRoutes({routes: {}}, requiredRoutes)).toHaveLength(1); - - for (const validRoute of validRoutes) { - expect( - findMissingRoutes(createRoute(validRoute), requiredRoutes), - ).toHaveLength(0); - } - }); -}); diff --git a/packages/cli/src/lib/missing-routes.ts b/packages/cli/src/lib/missing-routes.ts index d6f33f7138..95e09e9ace 100644 --- a/packages/cli/src/lib/missing-routes.ts +++ b/packages/cli/src/lib/missing-routes.ts @@ -41,17 +41,14 @@ const REQUIRED_ROUTES = [ // 'opening_soon', ]; -export function findMissingRoutes( - config: {routes: RemixConfig['routes']}, - requiredRoutes = REQUIRED_ROUTES, -) { +export function findMissingRoutes(config: RemixConfig) { const userRoutes = Object.values(config.routes); - const missingRoutes = new Set(requiredRoutes); + const requiredRoutes = new Set(REQUIRED_ROUTES); for (const requiredRoute of requiredRoutes) { for (const userRoute of userRoutes) { if (!requiredRoute && !userRoute.path) { - missingRoutes.delete(requiredRoute); + requiredRoutes.delete(requiredRoute); } else if (requiredRoute && userRoute.path) { const currentRoute = { path: userRoute.path, @@ -70,23 +67,21 @@ export function findMissingRoutes( currentRoute.parentId = parentRoute.parentId; } - const optionalSegment = ':?[^\\/\\?]+\\?'; const reString = - `^(${optionalSegment}\\/)?` + // Starts with an optional segment - requiredRoute - .replaceAll('.', '\\.') // Escape dots - .replace(/\//g, `\\/(${optionalSegment}\\/)?`) // Has optional segments in the middle - .replace(/:[^/)?]+/g, ':[^\\/]+') + // Replace params with regex - `(\\/${optionalSegment})?$`; // Ends with an optional segment + // Starts with optional params + '^(:[^\\/\\?]+\\?\\/)?' + + // Escape dots and replace params with regex + requiredRoute.replaceAll('.', '\\.').replace(/:[^/]+/g, ':[^\\/]+') + + '$'; if (new RegExp(reString).test(currentRoute.path)) { - missingRoutes.delete(requiredRoute); + requiredRoutes.delete(requiredRoute); } } } } - return [...missingRoutes]; + return [...requiredRoutes]; } const LINE_LIMIT = 100;