Skip to content

Commit 8793b42

Browse files
committed
chore(deps): update project toolchain
- πŸ“¦ nuxt: 4.4.6 -> 4.4.8 - πŸ“¦ @nuxt/devtools: 4.0.0-alpha.4 -> 4.0.0-alpha.7 - πŸ“¦ @nuxt/icon: 2.2.2 -> 2.2.3 - πŸ“¦ @types/node: 25.9.1 -> 25.9.2 - πŸ“¦ eslint-config-greenpie: 16.1.0 -> 16.3.0 - πŸ“¦ oxlint: 1.67.0 -> 1.69.0 - πŸ“¦ tsx: 4.22.3 -> 4.22.4 - πŸ“¦ vite: 8.0.14 -> 8.0.16 - πŸ“¦ vitest: 4.1.7 -> 4.1.8 - πŸ“¦ vue-tsc: 3.3.2 -> 3.3.4 - πŸ“¦ wrangler: 4.95.0 -> 4.99.0 - πŸ“¦ pnpm: 11.4.0 -> 11.5.3 - βœ… Rename Vitest cases from test to it for lint compatibility - πŸ“š Update README and remove obsolete planning docs
1 parent 9815c4b commit 8793b42

37 files changed

Lines changed: 1794 additions & 1860 deletions

β€Ž.agents/notes/test-formatting-style.mdβ€Ž

Lines changed: 0 additions & 82 deletions
This file was deleted.

β€Ž.agents/skills/roadmap-planning/SKILL.mdβ€Ž

Lines changed: 0 additions & 63 deletions
This file was deleted.

β€ŽREADME.mdβ€Ž

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,16 @@
44

55
Perd is an outdoor equipment companion for people who plan trips, hikes, and other outdoor outings and do not want to forget important gear.
66

7-
The product direction is built around one practical loop:
8-
9-
1. browse a public equipment catalog;
10-
2. keep a personal list of gear you own;
11-
3. build packing lists for a specific trip or activity.
12-
13-
Perd is not meant to stop at a read-only catalog. The goal is a useful packing workflow that still works even when the catalog is incomplete.
14-
157
## What you can do now
168

179
- sign in;
1810
- open the catalog;
1911
- browse the current list of equipment;
2012
- open item detail pages;
21-
- keep a personal inventory with "I have this" actions.
22-
23-
This is still an early product state. The full user workflow is not shipped yet.
24-
25-
## What is planned next
26-
27-
The next user-facing slices are:
28-
29-
- packing lists for specific trips or activities;
30-
- custom checklist entries for things that are not in the catalog yet.
13+
- keep a personal inventory with "I have this" actions;
14+
- create packing lists for specific trips or activities;
15+
- add custom and inventory-backed checklist entries;
16+
- mark checklist entries as packed.
3117

3218
The priority is the user workflow, not internal admin tooling.
3319

@@ -50,7 +36,3 @@ The priority is the user workflow, not internal admin tooling.
5036
- [Cloudflare Workers](https://developers.cloudflare.com/workers/)
5137
- [Neon](https://neon.tech/)
5238
- [Drizzle ORM](https://orm.drizzle.team/)
53-
54-
## Details
55-
56-
[Wiki](https://github.com/Perdolique/perd/wiki)

β€Žapp/pages/login.vueβ€Ž

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,14 @@
77
type="image/avif"
88
>
99

10-
<source
11-
srcset="/images/login-background-desktop.webp"
12-
media="(width >= 860px)"
13-
type="image/webp"
14-
>
15-
1610
<source
1711
srcset="/images/login-background-mobile.avif"
1812
type="image/avif"
1913
>
2014

21-
<source
22-
srcset="/images/login-background-mobile.webp"
23-
type="image/webp"
24-
>
25-
2615
<img
2716
:class="$style.backgroundImage"
28-
src="/images/login-background-mobile.webp"
17+
src="/images/login-background-mobile.avif"
2918
width="941"
3019
height="1672"
3120
alt=""

β€Žapp/utils/__tests__/async.test.tsβ€Ž

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'
1+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
22
import { delay, withMinimumDelay } from '../async'
33

44
async function slowTask() {
@@ -16,15 +16,15 @@ describe(withMinimumDelay, () => {
1616
vi.useRealTimers()
1717
})
1818

19-
test('should return the resolved value of the promise', async () => {
19+
it('should return the resolved value of the promise', async () => {
2020
const promise = withMinimumDelay(Promise.resolve('hello'), 100)
2121

2222
await vi.advanceTimersByTimeAsync(100)
2323

2424
await expect(promise).resolves.toBe('hello')
2525
})
2626

27-
test('should reject when the original promise rejects', async () => {
27+
it('should reject when the original promise rejects', async () => {
2828
const promise = withMinimumDelay(Promise.reject(new Error('boom')), 100)
2929
const assertion = expect(promise).rejects.toThrow('boom')
3030

@@ -33,7 +33,7 @@ describe(withMinimumDelay, () => {
3333
await assertion
3434
})
3535

36-
test('should wait for the minimum delay even if the promise resolves instantly', async () => {
36+
it('should wait for the minimum delay even if the promise resolves instantly', async () => {
3737
let resolved = false
3838
const promise = withMinimumDelay(Promise.resolve('fast'), 500)
3939

@@ -49,15 +49,15 @@ describe(withMinimumDelay, () => {
4949
expect(resolved).toBe(true)
5050
})
5151

52-
test('should not add extra delay when the promise takes longer than the timeout', async () => {
52+
it('should not add extra delay when the promise takes longer than the timeout', async () => {
5353
const promise = withMinimumDelay(slowTask(), 100)
5454

5555
await vi.advanceTimersByTimeAsync(500)
5656

5757
await expect(promise).resolves.toBe('slow')
5858
})
5959

60-
test('should use default timeout of 250ms when not specified', async () => {
60+
it('should use default timeout of 250ms when not specified', async () => {
6161
let resolved = false
6262
const promise = withMinimumDelay(Promise.resolve('default'))
6363

β€Žapp/utils/__tests__/catalog.test.tsβ€Ž

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import { describe, expect, test } from 'vitest'
1+
import { describe, expect, it } from 'vitest'
22
import { buildCatalogRouteQuery, getCatalogItemsApiQuery, getCatalogRouteState } from '../catalog'
33

44
describe(getCatalogRouteState, () => {
5-
test('should normalize the public catalog page query', () => {
5+
it('should normalize the public catalog page query', () => {
66
const result = getCatalogRouteState({
77
page: '2'
88
})
@@ -12,7 +12,7 @@ describe(getCatalogRouteState, () => {
1212
})
1313
})
1414

15-
test('should ignore unsupported query keys and invalid page values', () => {
15+
it('should ignore unsupported query keys and invalid page values', () => {
1616
const result = getCatalogRouteState({
1717
category: 'sleeping-pads',
1818
page: 'wat'
@@ -25,7 +25,7 @@ describe(getCatalogRouteState, () => {
2525
})
2626

2727
describe(getCatalogItemsApiQuery, () => {
28-
test('should map only the public page key to the backend query contract', () => {
28+
it('should map only the public page key to the backend query contract', () => {
2929
const result = getCatalogItemsApiQuery({
3030
category: 'sleeping-pads',
3131
page: '3'
@@ -36,7 +36,7 @@ describe(getCatalogItemsApiQuery, () => {
3636
})
3737
})
3838

39-
test('should default to the first page when the query is empty', () => {
39+
it('should default to the first page when the query is empty', () => {
4040
const result = getCatalogItemsApiQuery({})
4141

4242
expect(result).toStrictEqual({
@@ -46,7 +46,7 @@ describe(getCatalogItemsApiQuery, () => {
4646
})
4747

4848
describe(buildCatalogRouteQuery, () => {
49-
test('should keep only the public page query key', () => {
49+
it('should keep only the public page query key', () => {
5050
const result = buildCatalogRouteQuery({
5151
page: 3
5252
})
@@ -56,7 +56,7 @@ describe(buildCatalogRouteQuery, () => {
5656
})
5757
})
5858

59-
test('should omit page=1 from the public catalog url', () => {
59+
it('should omit page=1 from the public catalog url', () => {
6060
const result = buildCatalogRouteQuery({
6161
page: 1
6262
})

β€Žapp/utils/__tests__/router.test.tsβ€Ž

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import { describe, expect, test } from 'vitest'
1+
import { describe, expect, it } from 'vitest'
22
import { getRedirectNavigationTarget } from '../router'
33

44
describe(getRedirectNavigationTarget, () => {
5-
test('should mark api redirects as external document navigations', () => {
5+
it('should mark api redirects as external document navigations', () => {
66
const result = getRedirectNavigationTarget('/api/equipment/brands')
77

88
expect(result).toStrictEqual({
@@ -11,7 +11,7 @@ describe(getRedirectNavigationTarget, () => {
1111
})
1212
})
1313

14-
test('should keep app routes as internal navigations', () => {
14+
it('should keep app routes as internal navigations', () => {
1515
const result = getRedirectNavigationTarget('/account')
1616

1717
expect(result).toStrictEqual({
@@ -20,7 +20,7 @@ describe(getRedirectNavigationTarget, () => {
2020
})
2121
})
2222

23-
test.each([
23+
it.each([
2424
['', '/'],
2525
[' ', '/'],
2626
['https://evil.example/path', '/'],

β€Ždocs/architecture/container-queries.mdβ€Ž

Lines changed: 0 additions & 21 deletions
This file was deleted.

0 commit comments

Comments
Β (0)