Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
c8e60a2
created starter login page, need to iron out the kinks of passing the…
RianovRV1 Mar 23, 2026
0a6f3f4
removed nuxt ui, installed daisy ui, updated form to account for dais…
RianovRV1 Mar 23, 2026
dbd5522
bumbling around to use the dev database
RianovRV1 Mar 24, 2026
b7fd59c
Bump oven-sh/setup-bun from 2.1.3 to 2.2.0 in the all-dependencies group
dependabot[bot] Mar 16, 2026
6190932
Bump @nuxt/hints from 1.0.0 to 1.0.1 in the all-dependencies group
dependabot[bot] Mar 20, 2026
158da98
⬆️ Upgrade dependencies across trunk linters, mise tools, and npm pac…
synmux Mar 22, 2026
03ebda1
⬆️ Upgrade @nuxt/hints and related dependencies
synmux Mar 22, 2026
4645667
⬆️ Upgrade wrangler dependency from 4.76.0 to 4.77.0
synmux Mar 24, 2026
1d040b9
➖ Remove rust from mise.toml development tools
synmux Mar 24, 2026
92fde5c
♻️ Refactor Cloudflare type definitions into shared module
synmux Mar 24, 2026
9d8518c
🔥 Remove unused D1Database type definition
synmux Mar 24, 2026
7795f24
♻️ (login.vue): refactor login form to use $fetch instead of useFetch…
synmux Mar 24, 2026
3991777
included dependency for nuxt hints
RianovRV1 Mar 24, 2026
40271bd
♻️ Refactor insertSample API endpoint to use Nuxt event handler
synmux Mar 24, 2026
7843fdd
💡 Add TODO comment for password field nullability in users schema
synmux Mar 24, 2026
7a7dce9
Merge branch 'rianovrv1/starting' of https://github.com/tecapps/affir…
RianovRV1 Mar 24, 2026
d533630
🎉 Add scripts directory with .keep file
synmux Mar 24, 2026
94abbd6
added blank test.ts for sample on running stand alone typescript
RianovRV1 Mar 24, 2026
239cb21
some attempt at Using secrets to hash
RianovRV1 Apr 18, 2026
4acf894
added registration pages
RianovRV1 Apr 19, 2026
2254469
Got comfortable with a basic select in SQLite have the logic in sampl…
RianovRV1 Apr 19, 2026
fabf3e9
Merge branch 'staging' into rianovrv1/starting
synmux Apr 21, 2026
8befe3e
🔇 Remove unused database query result in test script
synmux Apr 21, 2026
87da5fc
➕ Add argon2 dependency for password hashing
synmux Apr 21, 2026
77ba584
🚧 Add empty grass file
synmux Apr 22, 2026
132ead9
🔥 Remove empty 'grass' file
synmux Apr 22, 2026
0b42bf0
Just some stuff
RianovRV1 Apr 27, 2026
35f6c33
intentionally add error
RianovRV1 Apr 27, 2026
e7ffe24
added extra path thingy
RianovRV1 Apr 27, 2026
6abd964
⬆️ Upgrade dependencies to latest versions
synmux Apr 28, 2026
1994e69
futzing with the POST request
RianovRV1 Apr 28, 2026
3e01bc4
Merge branch 'rianovrv1/starting' of https://github.com/tecapps/affir…
RianovRV1 Apr 28, 2026
14166b3
reading body of POST request
RianovRV1 Apr 28, 2026
50ee737
set up input form values being passed properly, also casted them to e…
RianovRV1 Apr 28, 2026
2f73264
Merge pull request #42 from tecapps/production
synmux Apr 29, 2026
c1f6a7a
Merge branch 'production' into rianovrv1/starting
synmux Apr 29, 2026
03b41db
login prototype finished!
RianovRV1 May 5, 2026
ab348c9
Bump trunk-io/trunk-action in the all-dependencies group
dependabot[bot] May 15, 2026
072e2cf
Merge pull request #46 from tecapps/dependabot/github_actions/staging…
synmux May 19, 2026
98575a8
Merge branch 'staging' into rianovrv1/starting
synmux May 19, 2026
95b61e4
⬆️ (Dependencies): upgrade various dependencies and update worker typ…
synmux May 19, 2026
040b595
Bump npm-run-all2 from 8.0.4 to 9.0.0 in the all-dependencies group
dependabot[bot] May 20, 2026
f1d8a02
Merge pull request #47 from tecapps/dependabot/npm_and_yarn/staging/a…
synmux May 20, 2026
8b32763
Merge branch 'staging' into rianovrv1/starting
synmux May 20, 2026
e061fdb
⬆️ (package.json): update vitest dependency to the latest minor version
synmux May 20, 2026
f5bcd48
♻️ (Multiple files): Refactor authentication logic and improve securi…
synmux May 20, 2026
0985e2d
🔥 (FIXES.md): remove outdated and comprehensive fixes documentation
synmux May 20, 2026
d06e90c
👷 (ci.yaml): update CI workflow to include Node.js setup
synmux May 20, 2026
b7e57af
♻️ (API/Config): Update default API endpoint and clean up Nuxt modules
synmux May 20, 2026
6c3ddf1
✨ (module): integrate nuxt-auth-utils for session management
synmux May 20, 2026
3feb86f
Added missing await for registration insertion
RianovRV1 May 21, 2026
f6a1fa6
Merge pull request #48 from tecapps/synmux/fixes
RianovRV1 May 21, 2026
d47dafb
Merge pull request #45 from tecapps/rianovrv1/starting
synmux May 21, 2026
07790b0
Bump actions/setup-node in the all-dependencies group
dependabot[bot] May 27, 2026
a6baa69
Merge pull request #50 from tecapps/dependabot/github_actions/staging…
synmux Jun 1, 2026
14fb661
add button component
walaura May 29, 2026
091d205
oops
walaura May 29, 2026
18c88ed
♻️ (trunk.yaml, package.json, worker-configuration.d.ts): update depe…
synmux Jun 1, 2026
8a31093
set up base pages (#55)
walaura Jun 12, 2026
123aa53
Bump the all-dependencies group across 1 directory with 2 updates (#54)
dependabot[bot] Jun 19, 2026
789f880
Bump @types/node from 25.9.4 to 26.0.0 in the all-dependencies group …
dependabot[bot] Jun 19, 2026
a35d3b9
Clean up signup/signin (#53)
walaura Jun 19, 2026
6075a0d
Set up Storybook (#52)
walaura Jun 19, 2026
09b79ae
iPad-style nav (#56)
walaura Jun 19, 2026
559a0a7
⬆️ Upgrade dependencies and tooling
synmux Jun 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ CLOUDFLARE_DATABASE_ID=
CLOUDFLARE_PRODUCTION_DATABASE_ID=
CLOUDFLARE_STAGING_DATABASE_ID=
CLOUDFLARE_D1_TOKEN=
NUXT_SESSION_PASSWORD=
8 changes: 6 additions & 2 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,19 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10
- name: node
uses: actions/setup-node@f4a67bbeca970f103397d3d2b9462cf787cd2980
with:
node-version: 24
- name: bun
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6
with:
bun-version: 1.3.13
- name: install
run: bun install
- name: trunk
uses: trunk-io/trunk-action@bf81325059d2534b31df5365182237788c5e0338
uses: trunk-io/trunk-action@04ba50e7658c81db7356da96657e6e77f220bfa3
- name: typecheck
run: bun run lint:types
- name: build
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/devskim.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10
- name: analysis
uses: microsoft/DevSkim-Action@4b5047945a44163b94642a1cecc0d93a3f428cc6
- name: upload
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,6 @@ logs
# Gemini
.gemini/


*storybook.log
storybook-static
2 changes: 1 addition & 1 deletion .node-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
24.15.0
24.16.0
8 changes: 8 additions & 0 deletions .storybook/main.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import type { StorybookConfig } from "@storybook-vue/nuxt";

const config: StorybookConfig = {
stories: ["../app/components/**/__stories__/*.stories.@(js|jsx|ts|tsx|mdx)"],
addons: [],
framework: "@storybook-vue/nuxt",
};
export default config;
14 changes: 14 additions & 0 deletions .storybook/preview.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import type { Preview } from "@storybook-vue/nuxt";

const preview: Preview = {
parameters: {
controls: {
matchers: {
color: /(background|color)$/i,
date: /Date$/i,
},
},
},
};

export default preview;
2 changes: 1 addition & 1 deletion .tool-versions
Original file line number Diff line number Diff line change
@@ -1 +1 @@
nodejs 24.15.0
nodejs 24.16.0
15 changes: 8 additions & 7 deletions .trunk/trunk.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,31 +7,32 @@ cli:
plugins:
sources:
- id: trunk
ref: v1.7.6
ref: v1.10.0
uri: https://github.com/trunk-io/plugins
# Many linters and tools depend on runtimes - configure them here. (https://docs.trunk.io/runtimes)
runtimes:
enabled:
- go@1.21.0
- node@22.16.0
- python@3.10.8
- python@3.14.4
# This is the section where you manage your linters. (https://docs.trunk.io/check/configuration)
lint:
disabled:
- osv-scanner
enabled:
- grype@0.112.0
- shellcheck@0.11.0
- shfmt@3.6.0
- trunk-toolbox@0.7.0
- oxipng@10.1.1
- actionlint@1.7.12
- checkov@3.2.525
- eslint@10.2.1
- checkov@3.3.1
- eslint@10.5.0
- git-diff-check
- markdownlint@0.48.0
- prettier@3.8.3
- markdownlint@0.49.0
- prettier@3.8.4
- taplo@0.10.0
- trufflehog@3.95.2
- trufflehog@3.95.3
- yamllint@1.38.0
ignore:
- linters:
Expand Down
8 changes: 4 additions & 4 deletions GETTING-STARTED.md
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,7 @@ affirm/
│ └── pages/ # File-based routing
├── server/ # ⚙️ Nitro server backend
│ ├── api/ # API endpoints (e.g. /api/hello)
│ ├── api/ # API endpoints (e.g. /api/ping)
│ ├── database/ # Drizzle schema and migrations
│ └── utils/ # Auto-imported server utilities (e.g. useDB)
Expand Down Expand Up @@ -378,7 +378,7 @@ All Vue components should use the **Composition API** with `<script setup lang="

```vue
<script setup lang="ts">
const { data } = await useFetch("/api/hello");
const { data } = await useFetch("/api/ping");
</script>

<template>
Expand Down Expand Up @@ -411,15 +411,15 @@ Refer to the [DaisyUI documentation](https://daisyui.com/) for available compone
Use `useFetch` for all data fetching in pages and components. It handles SSR hydration automatically:

```typescript
const { data, pending, error } = await useFetch("/api/hello");
const { data, pending, error } = await useFetch("/api/ping");
```

### Server API Routes

Create API endpoints in `server/api/`. Export a default event handler:

```typescript
// server/api/hello.ts
// server/api/ping.ts
export default defineEventHandler((event) => {
return { message: "Hello from the server" };
});
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ This project follows the **Nuxt 4** directory structure (source in `app/`).
- **`middleware/`**: Route middleware.
- **`assets/`**: CSS and static assets (Tailwind entry point).
- **`server/`**: Nitro server backend.
- **`api/`**: API endpoints (e.g., `/api/hello`).
- **`api/`**: API endpoints (e.g., `/api/ping`).
- **`database/`**: Drizzle schema and migrations.
- **`utils/`**: Auto-imported server utilities (e.g., `useDB`).
- **`shared/`**: Code shared between client and server.
Expand All @@ -162,7 +162,7 @@ This project follows the **Nuxt 4** directory structure (source in `app/`).

- Use **`useFetch`** for data fetching in pages/components. It handles SSR hydration automatically.
```ts
const { data } = await useFetch("/api/hello");
const { data } = await useFetch("/api/ping");
```

#### Server API
Expand Down
2 changes: 1 addition & 1 deletion app/components/AppFooter.vue
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<template>
<footer class="footer footer-center bg-base-200 p-4 text-base-content">
<footer class="mt-12 p-4 text-base-content/60 text-sm text-center items-center">
<aside>
<p>&copy; {{ new Date().getFullYear() }} TEC. Built with Nuxt 4 + DaisyUI.</p>
</aside>
Expand Down
27 changes: 16 additions & 11 deletions app/components/AppHeader.vue
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
<script setup lang="ts"></script>

<template>
<header class="navbar bg-base-200">
<div class="flex-1">
<NuxtLink to="/" class="btn btn-ghost text-xl">Affirm</NuxtLink>
</div>
<nav class="flex-none">
<ul class="menu menu-horizontal px-1">
<li><NuxtLink to="/">Home</NuxtLink></li>
<li><NuxtLink to="/about">About</NuxtLink></li>
</ul>
</nav>
</header>
<nav>
<h1 class="mb-8 text-xl font-bold ml-4">Affirm</h1>
<ul class="menu menu-lg w-full p-0">
<li>
<NuxtLink to="/" class="link link-hover" active-class="menu-active">Home</NuxtLink>
</li>
<li>
<NuxtLink to="/about" class="link link-hover" active-class="menu-active">About</NuxtLink>
</li>
<li>
<NuxtLink to="/list" class="link link-hover" active-class="menu-active">List</NuxtLink>
</li>
</ul>
</nav>
</template>
23 changes: 23 additions & 0 deletions app/components/places/PlaceLink.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<script setup lang="ts">
defineProps<{
place: {
id: number;
name: string;
rating: number;
description: string;
};
}>();
</script>

<template>
<NuxtLink
:to="`/place/${place.id}`"
class="block p-4 bg-base-200 border-base-300 rounded-box hover:bg-base-300 transition-colors"
>
<h2 class="text-lg font-semibold">{{ place.name }}</h2>
<p class="text-secondary-content">{{ place.description }}</p>
<div class="mt-2">
<PlacesRatingDisplay :rating="place.rating" />
</div>
</NuxtLink>
</template>
14 changes: 14 additions & 0 deletions app/components/places/RatingDisplay.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<script setup lang="ts">
defineProps<{
rating: number;
}>();
</script>

<template>
<div class="flex items-center">
<span v-for="i in 5" :key="i" class="mr-1">
<span :class="i <= rating ? 'text-yellow-500' : 'text-base-content/50'">★</span>
</span>
<span class="ml-2 text-sm text-base-content/80">{{ rating }}</span>
</div>
</template>
24 changes: 24 additions & 0 deletions app/components/places/ReviewCard.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<script setup lang="ts">
defineProps<{
review: {
id: number;
author: string;
rating: number;
comment: string;
date: string;
};
}>();
</script>

<template>
<div class="card card-border">
<div class="card-body space-y-1">
<div class="flex justify-between items-start">
<h3 class="font-semibold">{{ review.author }}</h3>
<span class="text-base-content/50">{{ review.date }}</span>
</div>
<p>{{ review.comment }}</p>
<PlacesRatingDisplay :rating="review.rating" />
</div>
</div>
</template>
23 changes: 23 additions & 0 deletions app/components/ui/Button.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<template>
<NuxtLink v-if="isLink" :to="to" :class="buttonClasses" v-bind="$attrs">
<slot />
</NuxtLink>
<button v-else :class="buttonClasses" v-bind="$attrs" :type="buttonType">
<slot />
</button>
</template>

<script setup lang="ts">
const props = defineProps<{
type: "primary" | "secondary" | "accent";
isSubmit?: boolean;
to?: string;
}>();

const buttonType = computed(() => (props.isSubmit ? "submit" : "button"));
const isLink = computed(() => !!props.to);

const buttonClasses = computed(() => {
return ["btn", props.type === "primary" ? "btn-primary" : props.type === "accent" ? "btn-accent" : "btn-secondary"];
});
</script>
22 changes: 22 additions & 0 deletions app/components/ui/Input.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<script setup lang="ts">
withDefaults(
defineProps<{
type?: string;
placeholder: string;
label: string;
}>(),
{
type: "text",
},
);

const model = defineModel<string>();
const id = useId();
</script>

<template>
<div>
<label :for="id" class="label mb-1">{{ label }}</label>
<input id="id" v-model="model" :type="type" :placeholder="placeholder" class="input w-full" />
</div>
</template>
60 changes: 60 additions & 0 deletions app/components/ui/__stories__/Button.stories.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import type { Meta, StoryObj } from "@storybook/vue3";
import Button from "../Button.vue";

const meta: Meta<typeof Button> = {
title: "Components/UI/Button",
component: Button,
argTypes: {
type: {
control: "radio",
options: ["primary", "secondary", "accent"],
},
to: {
control: "text",
description: "The URL or route to navigate to when the button is clicked",
},
isSubmit: {
control: "boolean",
description: "Whether the button is a submit button for forms",
},
default: {
control: "text",
},
},
args: {
default: "Click me",
},
};

export default meta;
type Story = StoryObj<typeof Button>;

export const Primary: Story = {
args: {
type: "primary",
},
};

export const Secondary: Story = {
args: {
type: "secondary",
},
};

export const Accent: Story = {
args: {
type: "accent",
},
};

export const WithLink: Story = {
args: {
to: "/example",
},
};

export const SubmitButton: Story = {
args: {
isSubmit: true,
},
};
18 changes: 18 additions & 0 deletions app/composables/useFakePlaceDataDeletMe.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
const PLACES = [
{
id: 1,
name: "Moe's tavern",
rating: 4.5,
description: "Cozy local bar with a wide selection of beers and a friendly atmosphere.",
},
{
id: 2,
name: "Kwik-E-Mart",
rating: 3.8,
description: "Convenience store with a variety of groceries and household items.",
},
];

export const useFakePlaceDataDeletMe = () => {
return PLACES;
};
Loading