From fd35640fd84749338a94652133f91a11a71d1386 Mon Sep 17 00:00:00 2001 From: jableader Date: Mon, 20 Oct 2025 00:12:40 +1100 Subject: [PATCH] Squashed commit of the following: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit a94394866d9e957693c7380b846cfee98739b8be Author: jableader Date: Mon Oct 20 00:11:28 2025 +1100 Ran codegen commit affaa0e4a80edbb5185f06b3a252e1790e349ee3 Author: jableader Date: Mon Oct 20 00:09:36 2025 +1100 Moved shopping.ts into composable commit 83ced27a549784a35fa2715630d6fdca7f12f4aa Author: jableader Date: Sun Oct 19 23:43:09 2025 +1100 Purchase fixed commit 2fff14016eedaeb773c0f8b4ee9ccf08a1027449 Author: jableader Date: Sun Oct 19 22:54:36 2025 +1100 typescript migration complete commit 17651bcc8b0f40ac1579563379c8fc45aba1997d Author: jableader Date: Sun Oct 19 22:38:22 2025 +1100 Removing redundant null checks and type checking commit 0cc3a508cd5c7d723eb76d665443b4d0fdad493f Author: jableader Date: Sun Oct 19 22:30:52 2025 +1100 Moving date to sdk layer commit 35d1189009b27876dd167f353c04f217b7c2805e Author: jableader Date: Sun Oct 19 21:42:47 2025 +1100 No components re-parse dates already decoded by the boundary. commit c4b82a31fad75bd5ec987847847076b537d35a7d Author: jableader Date: Sun Oct 19 21:09:03 2025 +1100 Update spec and types commit 55984bf7c9d51e76eaa6713a3ca86e9a73eb6b03 Author: jableader Date: Sun Oct 19 20:22:01 2025 +1100 Disallow casting entirely commit eb02dc6a7b52048281a87924765d9aab1303150f Author: jableader Date: Sun Oct 19 19:24:57 2025 +1100 Replaced components[schemas] outside sdk commit 2f4c1bed56724e4f8a0d586921367604ce127a1a Author: jableader Date: Sun Oct 19 19:06:38 2025 +1100 removed persons.ts commit ae966db8a330c9f521f3c3cb7417c4f201467661 Author: jableader Date: Sun Oct 19 18:56:27 2025 +1100 Remove casts from sdk commit 42c253021e504b45963834e56551ded55be377f1 Author: jableader Date: Sun Oct 19 18:38:05 2025 +1100 Remove *Like types commit b0a4e21f19005fd69c0e9e16edaa9c10b1ca8567 Author: jableader Date: Sun Oct 19 18:32:26 2025 +1100 Defined quantity construct commit bf4666b89e2d395bdd091ffb6ee66a9cfb866c6d Author: jableader Date: Sun Oct 19 18:27:55 2025 +1100 Moved shopping view-model mapping (DTO → UI groups/meals) into `useShopping` (`mapItemToUI`, `groupsFrom`, `mealsFrom`). - Refactored `CurrentShoppingListPage.vue` to consume composable helpers (less duplication, no local cast-heavy mapping). - Refactored `PurchasedShoppingListPage.vue` to consume composable helpers and return typed SDK result; removed casts. commit e7f84b453509a8fcffbb9923ec001f5be85e67e4 Author: jableader Date: Sun Oct 19 18:17:29 2025 +1100 Removing casts, any, unknown and runtime type checking commit 6346eef4aff4d64b04f7dfa837c5b988645c242c Author: jableader Date: Sun Oct 19 17:42:14 2025 +1100 domain/decoders.ts: removed casts; `purchaseDate` and `quantity` now trust API shapes. commit 8b62eb9a9f2c0fe058d2dd37cc80071089379c34 Author: jableader Date: Sun Oct 19 17:36:50 2025 +1100 Plan alignment commit dd81fd454b8e14874930cfc44828abddffd50c41 Author: jableader Date: Sun Oct 19 17:10:11 2025 +1100 More cast removals commit 377d143ffc8596f46a3b32746d3710d99eb257cd Author: jableader Date: Sun Oct 19 16:53:30 2025 +1100 Type tightening in sdk commit ce2577f22190b18a52ae0fa4238c6d1beb7e3bb7 Author: jableader Date: Sun Oct 19 16:24:51 2025 +1100 All mappers removed/neutralized commit 177205561a2d44aae2683e046960ef5fe8992255 Author: jableader Date: Sun Oct 19 16:20:34 2025 +1100 Replace ingredientnormalized with ingredient commit fc75b24977cc89d420dc768fb4dc4ade84ed32c2 Author: jableader Date: Sun Oct 19 16:16:03 2025 +1100 More type safety tweaks and changes commit c35cc2d3d58307290bbc2d5978baa48c1eda97b6 Author: jableader Date: Sun Oct 19 15:46:13 2025 +1100 Update vue-tsc commit 2cd429804ca34a42c83ea81a3ae68e2cfccb5e36 Author: jableader Date: Sun Oct 19 15:28:01 2025 +1100 Ongoing SDK changes to tighten datatypes commit e11847ae515eadf1bd33e88e154125fe361a5191 Author: jableader Date: Sun Oct 19 14:31:03 2025 +1100 Enforce template type checking commit 777b8dee7e9ef0807a2b2c039443920671fe9c2d Author: jableader Date: Sun Oct 19 14:28:52 2025 +1100 Boilerplate Collapse mappers to “decoders” and delete ad‑hoc view types commit 4169c69d59cc16a24298351c38a60b4d4845f0c9 Author: jableader Date: Sun Oct 19 14:25:04 2025 +1100 Plan updates commit de65164c91d9dc641ec86424bd4fe40f91bb4ada Author: jableader Date: Sun Oct 19 14:16:37 2025 +1100 More camelCase changes commit 4121c2157511f706b4704c5d5f769034d9bce5a0 Author: jableader Date: Sun Oct 19 14:00:48 2025 +1100 Remove unused js shims and autoformat project commit d475565529bd0c12f06f85f0bcbf19c857176fa7 Author: jableader Date: Sun Oct 19 13:59:10 2025 +1100 camelCase conversions and api type propogation commit 7b3b633a9d21c74977d4de120138fff192faaa78 Author: jableader Date: Sun Oct 19 13:11:22 2025 +1100 Strategise ts improvements commit 9396e4928abcf9d8a74a656ad21913f95e8e3e41 Author: jableader Date: Sun Oct 19 13:06:19 2025 +1100 Linting errors commit 528fa3bc2f6c42de6de37d9593d2ed31630d0e81 Author: jableader Date: Sun Oct 19 12:59:21 2025 +1100 Recipe search pagination commit 4993c3e53f540e098f3275715c86754dee9392af Author: jableader Date: Sun Oct 19 12:33:13 2025 +1100 Removed redundant nonnull check commit c03d0b582d0a8b17e675cdf9bdab09eac4091d44 Author: jableader Date: Sun Oct 19 12:29:57 2025 +1100 Persons api pagination commit 67008b4a94a90295ed811594ca0e7f37c80a8305 Author: jableader Date: Sat Oct 18 22:44:32 2025 +1100 ts pages starting to work commit 0144e7f70d19289007d6b035594786ce573cbc70 Author: jableader Date: Sat Oct 18 22:39:17 2025 +1100 More typescript fixes commit dc429f84b48ca5892c6043db81b89fa6431d872d Author: jableader Date: Sat Oct 18 18:28:54 2025 +1100 5) API client and codegen guardrails — DONE (scripts) / PARTIAL (CI wiring) commit 36ba555d9a600ca8cca4c18571e0d96584243556 Author: jableader Date: Sat Oct 18 18:26:30 2025 +1100 Tighten composable and UI types (remove last anys) — DONE commit 97523a9ef6aa972497e62d63c6f666453bb7eefc Author: jableader Date: Sat Oct 18 18:24:11 2025 +1100 Align OpenAPI params to remove residual casts, Strengthen MSW tests for the typed client commit 608f6b751cb982487e90560792aec33317981c60 Author: jableader Date: Sat Oct 18 18:14:11 2025 +1100 ts complete, rerun codegen commit ca28376ed7bcb4ff4c7669210ce6eebfd9cb6eaa Author: jableader Date: Sat Oct 18 18:09:29 2025 +1100 Document All JS under `src/` is now removed; the source tree is TS-only. commit ff3338b108bbf094f987302a21f1779d8f23368f Author: jableader Date: Sat Oct 18 17:59:49 2025 +1100 Ts tests commit ce4555a279c715f427f9d00c346561efd74705f8 Author: jableader Date: Sat Oct 18 17:56:18 2025 +1100 Completed Generate real OpenAPI types and wire them commit b7304aa7390f33a372acda46c593d6592aabf3f7 Author: jableader Date: Sat Oct 18 17:02:27 2025 +1100 DatePicker ts conversion commit cb6ebdba286d44dbaae522ee29d95aa3ccfb5dc1 Author: jableader Date: Sat Oct 18 16:56:38 2025 +1100 Removed js files commit 549eefd369499e0a1d35ff88a659c8aecd955a02 Author: jableader Date: Sat Oct 18 16:49:31 2025 +1100 - Utilities converted to TS: `src/dateformats.ts`, `src/units.ts`; imports updated accordingly. - Router converted to TS: `src/router/index.ts`; legacy `index.js` removed. commit 6f7731287f4166df5c02164ec4220e370c6d7a35 Author: jableader Date: Sat Oct 18 16:48:58 2025 +1100 alerts ts conversion commit 4b1baec85a74b75e94d2392fea3b5abee294089c Author: jableader Date: Sat Oct 18 16:27:35 2025 +1100 use v1 api commit da11976b96d791935cb16c7b1fdb074a2c87f53c Author: jableader Date: Sat Oct 18 16:18:17 2025 +1100 - Shopping pages converted to TS: `MyShoppingPage.vue`, `CurrentShoppingListPage.vue`, `PurchasedShoppingListPage.vue` (typed refs/computed; stable keys; wired to helpers). commit acf740380bf53386e12e108ba09a507141176733 Author: jableader Date: Sat Oct 18 16:08:22 2025 +1100 Shopping MyShoppingPage converted to TS with typed refs. commit 744d7e792d013f0ed04f11280f3351950925beee Author: jableader Date: Sat Oct 18 16:05:19 2025 +1100 Shopping gets types commit 4e576dca94424383bdf753403d7764e22a28f377 Author: jableader Date: Sat Oct 18 15:57:50 2025 +1100 Error tests commit ac6ae41b840c30196a370a077e02953c63977908 Author: jableader Date: Sat Oct 18 15:56:20 2025 +1100 More datatypes commit d7ea6538b1af6144933a2603d330cb17e04809db Author: jableader Date: Sat Oct 18 15:45:49 2025 +1100 spec updates commit 0d6cfc1328df8ab4a4baf8f31a7a4e1ea50fd850 Author: jableader Date: Sat Oct 18 15:44:34 2025 +1100 `codegen:check` warns when backend spec is newer than generated types commit 54bff353b8e7429961364803300b38bc70f963c2 Author: jableader Date: Sat Oct 18 15:42:24 2025 +1100 PersonList ts commit e5ffcdde7e9538525704581a82606261596d31f5 Author: jableader Date: Sat Oct 18 15:40:53 2025 +1100 MealCard ts commit 5432d8333c023b0c6e25c9a6ac31519c818e6a58 Author: jableader Date: Sat Oct 18 15:39:29 2025 +1100 ue CLI now serves/builds with TypeScript entry, ESLint configured to parse TS, use ts code commit aba3fd532550a90adeb957b4ddbb43798bcf9e5a Author: jableader Date: Sat Oct 18 15:23:16 2025 +1100 composables typescript commit 28ba44cc951fddfe64c386e77a91c2f46060cfb8 Author: jableader Date: Sat Oct 18 15:19:09 2025 +1100 let the typescriptin begin commit 98e57e4d65cecdd1ed5ed3fbf6b1ebf46ae6af10 Author: jableader Date: Sat Oct 18 15:13:58 2025 +1100 Added typescript --- .github/workflows/ci.yml | 45 + CONTRIBUTING.md | 59 + README.md | 76 +- package-lock.json | 3915 +++++++++++++---- package.json | 68 +- scripts/codegen-check.js | 32 + src/alert.js | 11 - src/api/auth.js | 21 - src/api/auth.ts | 30 + src/api/client.ts | 20 + src/api/http.js | 35 - src/api/mappers/mealMapper.js | 16 - src/api/mappers/recipeMapper.js | 15 - src/api/mappers/shoppingListMapper.js | 73 - src/api/meals.js | 31 - src/api/persons.js | 9 - src/api/recipes.js | 36 - src/api/sdk.ts | 354 ++ src/api/shopping.js | 38 - src/api/types.ts | 1634 +++++++ src/components/AlertToast.vue | 6 +- src/components/LoginPage.vue | 16 +- .../ingredients/CompactParsedIngredient.vue | 6 +- .../ingredients/EditableIngredientsPanel.vue | 14 +- src/components/ingredients/IngredientLine.vue | 16 +- src/components/meals/DatePicker.vue | 23 +- src/components/meals/EditMealPage.vue | 319 +- src/components/meals/MealCard.vue | 43 +- src/components/meals/MealPlanPage.vue | 13 +- src/components/meals/PersonList.vue | 43 +- src/components/recipes/EditRecipePage.vue | 83 +- src/components/recipes/RecipeCard.vue | 16 +- src/components/recipes/RecipeSearchBox.vue | 135 +- src/components/recipes/RecipesPage.vue | 9 +- .../shopping/CurrentShoppingListPage.vue | 79 +- src/components/shopping/MealSelectionList.vue | 74 +- src/components/shopping/MyShoppingPage.vue | 28 +- .../shopping/PurchasedShoppingListPage.vue | 42 +- src/components/shopping/ShoppingListItem.vue | 105 +- src/components/shopping/shopping.js | 42 - src/composables/{useAlert.js => useAlert.ts} | 12 +- src/composables/{useAuth.js => useAuth.ts} | 5 +- src/composables/useMeals.js | 25 - src/composables/useMeals.ts | 46 + src/composables/usePagination.ts | 107 + src/composables/useShopping.js | 27 - src/composables/useShopping.ts | 116 + src/dateformats.js | 25 - src/dateformats.ts | 15 + src/domain/decoders.ts | 83 + src/domain/pagination.ts | 13 + src/domain/types.ts | 69 + src/env.d.ts | 17 + src/{main.js => main.ts} | 0 src/router/helpers.ts | 27 + src/router/{index.js => index.ts} | 11 +- src/shims-vue.d.ts | 10 + src/units.d.ts | 4 + src/{units.js => units.ts} | 65 +- tests/mealMapper.test.js | 24 +- tests/meals.api.errors.test.js | 14 + tests/meals.api.test.js | 43 + tests/parse.api.errors.test.js | 19 + tests/parse.api.test.js | 48 + tests/persons.api.errors.test.js | 12 + tests/persons.api.test.js | 30 + tests/recipes.api.errors.test.js | 12 + tests/recipes.api.test.js | 22 + tests/shopping.api.errors.test.js | 12 + tests/shopping.api.test.js | 31 + tests/shoppingListMapper.test.js | 42 +- tests/test-setup.js | 24 + tests/useAlert.test.js | 29 +- tests/useAlert.test.ts | 26 + tsconfig.eslint.json | 20 + tsconfig.json | 20 + vitest.config.js | 1 + vue.config.js | 2 + 78 files changed, 6953 insertions(+), 1785 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 CONTRIBUTING.md create mode 100644 scripts/codegen-check.js delete mode 100644 src/alert.js delete mode 100644 src/api/auth.js create mode 100644 src/api/auth.ts create mode 100644 src/api/client.ts delete mode 100644 src/api/http.js delete mode 100644 src/api/mappers/mealMapper.js delete mode 100644 src/api/mappers/recipeMapper.js delete mode 100644 src/api/mappers/shoppingListMapper.js delete mode 100644 src/api/meals.js delete mode 100644 src/api/persons.js delete mode 100644 src/api/recipes.js create mode 100644 src/api/sdk.ts delete mode 100644 src/api/shopping.js create mode 100644 src/api/types.ts delete mode 100644 src/components/shopping/shopping.js rename src/composables/{useAlert.js => useAlert.ts} (60%) rename src/composables/{useAuth.js => useAuth.ts} (75%) delete mode 100644 src/composables/useMeals.js create mode 100644 src/composables/useMeals.ts create mode 100644 src/composables/usePagination.ts delete mode 100644 src/composables/useShopping.js create mode 100644 src/composables/useShopping.ts delete mode 100644 src/dateformats.js create mode 100644 src/dateformats.ts create mode 100644 src/domain/decoders.ts create mode 100644 src/domain/pagination.ts create mode 100644 src/domain/types.ts create mode 100644 src/env.d.ts rename src/{main.js => main.ts} (100%) create mode 100644 src/router/helpers.ts rename src/router/{index.js => index.ts} (86%) create mode 100644 src/shims-vue.d.ts create mode 100644 src/units.d.ts rename src/{units.js => units.ts} (57%) create mode 100644 tests/meals.api.errors.test.js create mode 100644 tests/meals.api.test.js create mode 100644 tests/parse.api.errors.test.js create mode 100644 tests/parse.api.test.js create mode 100644 tests/persons.api.errors.test.js create mode 100644 tests/persons.api.test.js create mode 100644 tests/recipes.api.errors.test.js create mode 100644 tests/recipes.api.test.js create mode 100644 tests/shopping.api.errors.test.js create mode 100644 tests/shopping.api.test.js create mode 100644 tests/test-setup.js create mode 100644 tests/useAlert.test.ts create mode 100644 tsconfig.eslint.json create mode 100644 tsconfig.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..c2103c3 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,45 @@ +name: CI + +on: + push: + branches: [ main, master ] + pull_request: + +jobs: + build-test: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Codegen check + run: npm run codegen:check || true + + - name: Generate OpenAPI types + run: | + if [ -f "../munch-ease-backend/openapi.json" ]; then + npm run codegen + else + echo "Backend openapi.json not found. Skipping codegen." + fi + + - name: Typecheck + run: npm run -s typecheck + + - name: Typecheck Vue SFC templates + run: npm run -s typecheck:vue + + - name: Lint + run: npm run -s lint + + - name: Test + run: npm run -s test diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..1f1ff2f --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,59 @@ +# Contributing to Munch Ease + +Thanks for helping make Munch Ease better! This repo aims for a lean, predictable codebase. Please keep changes small, typed, and well‑scoped. + +## Core axioms (must follow) + +- OpenAPI is the single source of truth for shapes (generated in `src/api/types.ts`). +- The SDK (`src/api/sdk.ts`) is the only data access surface. +- Domain types live in `src/domain/types.ts`; minimal normalization in `src/domain/decoders.ts`. +- No casts (`as`, angle brackets) in app code. Generated files are exempt. Boundary-only normalization allowed. +- No `any`/`unknown` in app code. Prefer precise types, `Pick`/`Omit`, and inference. +- Arrays declared in OpenAPI as required are non-nullable in domain types (e.g., `Meal.recipes` is always an array). +- Disallow runtime type checks in app code (`typeof`, `in`, broad `instanceof`). + - Acceptable exceptions: DOM event narrowing (e.g., `HTMLInputElement`), error normalization in SDK, env detection. +- CamelCase across `src/`; no snake_case. + +## Architecture quick tour + +- SDK + decoders boundary + - `src/api/sdk.ts`: All network calls; returns domain-safe types. Normalize errors via `httpError`. + - `src/domain/decoders.ts`: Convert date strings → `Date`, normalize arrays, and decode nested structures. +- Domain and DTOs + - Prefer domain aliases from `src/domain/types.ts` over raw `components['schemas'][...]`. + - Use discriminated unions for UI shapes where needed (e.g., `Group` has `type: 'product' | 'name'`). +- Composables + - UI logic in `src/composables/*`. Keep components thin. +- Routing + - Use helpers from `src/router/helpers.ts` (`parseRouteId`, `parseQueryString`) instead of ad-hoc `typeof` checks. + +## Coding guidelines + +- Keep changes small and incremental. Write a quick unit test when behavior changes. +- Prefer `computed` over ad-hoc recalculation; avoid prop mutation. +- No ad-hoc mappers. If a slimmer shape is needed, use `Pick`/`Omit` with a descriptive name (e.g., `*Summary`). +- Keep runtime guards in the boundary only. UI assumes decoded, normalized types. + +## Tooling + +- TypeScript strict; ESLint with type-aware rules; Prettier formatting. +- Tests: Vitest + MSW. Keep tests fast and focused. +- Node 18+ recommended. + +## Useful scripts + +```bash +npm run serve # Dev server +npm run test # Unit tests (Vitest) +npm run lint # ESLint +npm run typecheck # TS + vue-tsc +npm run build # Production build +``` + +## PR checklist + +- [ ] Types first: no casts in app code, no `any`/`unknown` +- [ ] Boundary-only normalization in decoders/SDK +- [ ] Arrays reflect OpenAPI nullability in domain types +- [ ] No new mappers; use domain aliases or `Pick`/`Omit` +- [ ] Tests updated/added if behavior changed diff --git a/README.md b/README.md index e836aa7..c6e2253 100644 --- a/README.md +++ b/README.md @@ -39,49 +39,35 @@ Environment ## Architecture and conventions -The codebase follows clear boundaries and Vue 3 Composition API throughout. +Strict TypeScript, Vue 3 Composition API, and a single typed API boundary. -- Routing and auth - - Centralized in `src/router/index.js` with named routes and an auth guard via route meta `requiresAuth`. - - Components use `useRouter/useRoute` for navigation and route access. +Key axioms +- OpenAPI (generated `src/api/types.ts`) is the single source of truth for shapes. +- SDK (`src/api/sdk.ts`) is the only data access surface; UI uses domain types from `src/domain/types.ts`. +- Domain normalization is minimal in `src/domain/decoders.ts` (e.g., date strings → `Date`). +- No casts (`as`, angle brackets) and no `any`/`unknown` in app code. Generated files are exempt. +- Arrays that are required in OpenAPI are non-nullable in domain types (e.g., `Meal.recipes`). +- Disallow runtime type checks in app code; acceptable exceptions: DOM event narrowing, error/env handling in the boundary. -- API layer and mappers - - `src/api/http.js` is a tiny JSON fetch wrapper that honors `VUE_APP_API_BASE`. - - Feature services live in `src/api/*` (meals, recipes, shopping, auth, persons). - - Normalization lives in `src/api/mappers/*` (e.g., date parsing, shape cleanup). +Layout +- `src/api/` — Typed client and SDK boundary +- `src/domain/` — Domain types and decoders +- `src/composables/` — Reusable app logic (auth, meals, shopping, pagination, alert) +- `src/components/` — UI components and pages +- `src/router/` — Routes and helpers (`parseRouteId`, `parseQueryString`) -- Composables (UI-facing logic) - - Reusable logic in `src/composables/*` (useAuth, useMeals, useShopping). - - Components stay thin: data via refs/reactive, effects via computed/watch. - -- Components - - All Single File Components use ` diff --git a/src/components/meals/MealCard.vue b/src/components/meals/MealCard.vue index 7d2f6e5..9e04311 100644 --- a/src/components/meals/MealCard.vue +++ b/src/components/meals/MealCard.vue @@ -25,21 +25,31 @@ somebody?

-

- Purchased {{ ago(meal.purchase_date) }} +

+ Purchased {{ ago(meal.purchaseDate) }}

- diff --git a/src/components/recipes/RecipesPage.vue b/src/components/recipes/RecipesPage.vue index d966deb..b764940 100644 --- a/src/components/recipes/RecipesPage.vue +++ b/src/components/recipes/RecipesPage.vue @@ -6,19 +6,22 @@ /> - diff --git a/src/components/shopping/MealSelectionList.vue b/src/components/shopping/MealSelectionList.vue index 3e1b0b0..c6f6c04 100644 --- a/src/components/shopping/MealSelectionList.vue +++ b/src/components/shopping/MealSelectionList.vue @@ -7,31 +7,35 @@ - diff --git a/src/components/shopping/MyShoppingPage.vue b/src/components/shopping/MyShoppingPage.vue index 06845c1..047e433 100644 --- a/src/components/shopping/MyShoppingPage.vue +++ b/src/components/shopping/MyShoppingPage.vue @@ -39,42 +39,42 @@ --> -