file structure
18
.gitignore
vendored
@@ -1,6 +1,24 @@
|
|||||||
|
# Dependencies (DO NOT PUSH - thousands of files)
|
||||||
|
node_modules/
|
||||||
|
|
||||||
|
# Next.js build output (DO NOT PUSH - compiled files)
|
||||||
|
.next/
|
||||||
|
out/
|
||||||
|
build/
|
||||||
|
|
||||||
|
# Local SQLite Database
|
||||||
|
*.db
|
||||||
|
*.db-journal
|
||||||
|
|
||||||
|
# Environment variables
|
||||||
.env
|
.env
|
||||||
|
.env*.local
|
||||||
|
|
||||||
|
# Agent configuration, learning resources & local data
|
||||||
.agents/
|
.agents/
|
||||||
.gemini/
|
.gemini/
|
||||||
resources/
|
resources/
|
||||||
|
|
||||||
|
# OS metadata
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
6
next-env.d.ts
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
/// <reference types="next" />
|
||||||
|
/// <reference types="next/image-types/global" />
|
||||||
|
import "./.next/types/routes.d.ts";
|
||||||
|
|
||||||
|
// NOTE: This file should not be edited
|
||||||
|
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
|
||||||
|
Before Width: | Height: | Size: 391 B After Width: | Height: | Size: 391 B |
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 128 B After Width: | Height: | Size: 128 B |
|
Before Width: | Height: | Size: 385 B After Width: | Height: | Size: 385 B |
41
to_do_app/.gitignore
vendored
@@ -1,41 +0,0 @@
|
|||||||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
|
||||||
|
|
||||||
# dependencies
|
|
||||||
/node_modules
|
|
||||||
/.pnp
|
|
||||||
.pnp.*
|
|
||||||
.yarn/*
|
|
||||||
!.yarn/patches
|
|
||||||
!.yarn/plugins
|
|
||||||
!.yarn/releases
|
|
||||||
!.yarn/versions
|
|
||||||
|
|
||||||
# testing
|
|
||||||
/coverage
|
|
||||||
|
|
||||||
# next.js
|
|
||||||
/.next/
|
|
||||||
/out/
|
|
||||||
|
|
||||||
# production
|
|
||||||
/build
|
|
||||||
|
|
||||||
# misc
|
|
||||||
.DS_Store
|
|
||||||
*.pem
|
|
||||||
|
|
||||||
# debug
|
|
||||||
npm-debug.log*
|
|
||||||
yarn-debug.log*
|
|
||||||
yarn-error.log*
|
|
||||||
.pnpm-debug.log*
|
|
||||||
|
|
||||||
# env files (can opt-in for committing if needed)
|
|
||||||
.env*
|
|
||||||
|
|
||||||
# vercel
|
|
||||||
.vercel
|
|
||||||
|
|
||||||
# typescript
|
|
||||||
*.tsbuildinfo
|
|
||||||
next-env.d.ts
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
<!-- BEGIN:nextjs-agent-rules -->
|
|
||||||
# This is NOT the Next.js you know
|
|
||||||
|
|
||||||
This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` before writing any code. Heed deprecation notices.
|
|
||||||
<!-- END:nextjs-agent-rules -->
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
@AGENTS.md
|
|
||||||
145
types/cache-life.d.ts
vendored
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
// Type definitions for Next.js cacheLife configs
|
||||||
|
|
||||||
|
declare module 'next/cache' {
|
||||||
|
export { unstable_cache } from 'next/dist/server/web/spec-extension/unstable-cache'
|
||||||
|
export {
|
||||||
|
updateTag,
|
||||||
|
revalidateTag,
|
||||||
|
revalidatePath,
|
||||||
|
refresh,
|
||||||
|
} from 'next/dist/server/web/spec-extension/revalidate'
|
||||||
|
export { unstable_noStore } from 'next/dist/server/web/spec-extension/unstable-no-store'
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cache this `"use cache"` for a timespan defined by the `"default"` profile.
|
||||||
|
* ```
|
||||||
|
* stale: 300 seconds (5 minutes)
|
||||||
|
* revalidate: 900 seconds (15 minutes)
|
||||||
|
* expire: never
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* This cache may be stale on clients for 5 minutes before checking with the server.
|
||||||
|
* If the server receives a new request after 15 minutes, start revalidating new values in the background.
|
||||||
|
* It lives for the maximum age of the server cache. If this entry has no traffic for a while, it may serve an old value the next request.
|
||||||
|
*/
|
||||||
|
export function cacheLife(profile: "default"): void
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cache this `"use cache"` for a timespan defined by the `"seconds"` profile.
|
||||||
|
* ```
|
||||||
|
* stale: 30 seconds
|
||||||
|
* revalidate: 1 seconds
|
||||||
|
* expire: 60 seconds (1 minute)
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* This cache may be stale on clients for 30 seconds before checking with the server.
|
||||||
|
* If the server receives a new request after 1 seconds, start revalidating new values in the background.
|
||||||
|
* If this entry has no traffic for 1 minute it will expire. The next request will recompute it.
|
||||||
|
*/
|
||||||
|
export function cacheLife(profile: "seconds"): void
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cache this `"use cache"` for a timespan defined by the `"minutes"` profile.
|
||||||
|
* ```
|
||||||
|
* stale: 300 seconds (5 minutes)
|
||||||
|
* revalidate: 60 seconds (1 minute)
|
||||||
|
* expire: 3600 seconds (1 hour)
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* This cache may be stale on clients for 5 minutes before checking with the server.
|
||||||
|
* If the server receives a new request after 1 minute, start revalidating new values in the background.
|
||||||
|
* If this entry has no traffic for 1 hour it will expire. The next request will recompute it.
|
||||||
|
*/
|
||||||
|
export function cacheLife(profile: "minutes"): void
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cache this `"use cache"` for a timespan defined by the `"hours"` profile.
|
||||||
|
* ```
|
||||||
|
* stale: 300 seconds (5 minutes)
|
||||||
|
* revalidate: 3600 seconds (1 hour)
|
||||||
|
* expire: 86400 seconds (1 day)
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* This cache may be stale on clients for 5 minutes before checking with the server.
|
||||||
|
* If the server receives a new request after 1 hour, start revalidating new values in the background.
|
||||||
|
* If this entry has no traffic for 1 day it will expire. The next request will recompute it.
|
||||||
|
*/
|
||||||
|
export function cacheLife(profile: "hours"): void
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cache this `"use cache"` for a timespan defined by the `"days"` profile.
|
||||||
|
* ```
|
||||||
|
* stale: 300 seconds (5 minutes)
|
||||||
|
* revalidate: 86400 seconds (1 day)
|
||||||
|
* expire: 604800 seconds (1 week)
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* This cache may be stale on clients for 5 minutes before checking with the server.
|
||||||
|
* If the server receives a new request after 1 day, start revalidating new values in the background.
|
||||||
|
* If this entry has no traffic for 1 week it will expire. The next request will recompute it.
|
||||||
|
*/
|
||||||
|
export function cacheLife(profile: "days"): void
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cache this `"use cache"` for a timespan defined by the `"weeks"` profile.
|
||||||
|
* ```
|
||||||
|
* stale: 300 seconds (5 minutes)
|
||||||
|
* revalidate: 604800 seconds (1 week)
|
||||||
|
* expire: 2592000 seconds (1 month)
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* This cache may be stale on clients for 5 minutes before checking with the server.
|
||||||
|
* If the server receives a new request after 1 week, start revalidating new values in the background.
|
||||||
|
* If this entry has no traffic for 1 month it will expire. The next request will recompute it.
|
||||||
|
*/
|
||||||
|
export function cacheLife(profile: "weeks"): void
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cache this `"use cache"` for a timespan defined by the `"max"` profile.
|
||||||
|
* ```
|
||||||
|
* stale: 300 seconds (5 minutes)
|
||||||
|
* revalidate: 2592000 seconds (1 month)
|
||||||
|
* expire: 31536000 seconds (365 days)
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* This cache may be stale on clients for 5 minutes before checking with the server.
|
||||||
|
* If the server receives a new request after 1 month, start revalidating new values in the background.
|
||||||
|
* If this entry has no traffic for 365 days it will expire. The next request will recompute it.
|
||||||
|
*/
|
||||||
|
export function cacheLife(profile: "max"): void
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cache this `"use cache"` using a custom timespan.
|
||||||
|
* ```
|
||||||
|
* stale: ... // seconds
|
||||||
|
* revalidate: ... // seconds
|
||||||
|
* expire: ... // seconds
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* This is similar to Cache-Control: max-age=`stale`,s-max-age=`revalidate`,stale-while-revalidate=`expire-revalidate`
|
||||||
|
*
|
||||||
|
* If a value is left out, the lowest of other cacheLife() calls or the default, is used instead.
|
||||||
|
*/
|
||||||
|
export function cacheLife(profile: {
|
||||||
|
/**
|
||||||
|
* This cache may be stale on clients for ... seconds before checking with the server.
|
||||||
|
*/
|
||||||
|
stale?: number,
|
||||||
|
/**
|
||||||
|
* If the server receives a new request after ... seconds, start revalidating new values in the background.
|
||||||
|
*/
|
||||||
|
revalidate?: number,
|
||||||
|
/**
|
||||||
|
* If this entry has no traffic for ... seconds it will expire. The next request will recompute it.
|
||||||
|
*/
|
||||||
|
expire?: number
|
||||||
|
}): void
|
||||||
|
|
||||||
|
|
||||||
|
import { cacheTag } from 'next/dist/server/use-cache/cache-tag'
|
||||||
|
export { cacheTag }
|
||||||
|
|
||||||
|
export const unstable_cacheTag: typeof cacheTag
|
||||||
|
export const unstable_cacheLife: typeof cacheLife
|
||||||
|
}
|
||||||
57
types/routes.d.ts
vendored
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
// This file is generated automatically by Next.js
|
||||||
|
// Do not edit this file manually
|
||||||
|
|
||||||
|
type AppRoutes = "/"
|
||||||
|
type PageRoutes = never
|
||||||
|
type LayoutRoutes = "/"
|
||||||
|
type RedirectRoutes = never
|
||||||
|
type RewriteRoutes = never
|
||||||
|
type Routes = AppRoutes | PageRoutes | LayoutRoutes | RedirectRoutes | RewriteRoutes
|
||||||
|
|
||||||
|
|
||||||
|
interface ParamMap {
|
||||||
|
"/": {}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export type ParamsOf<Route extends Routes> = ParamMap[Route]
|
||||||
|
|
||||||
|
interface LayoutSlotMap {
|
||||||
|
"/": never
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export type { AppRoutes, PageRoutes, LayoutRoutes, RedirectRoutes, RewriteRoutes, ParamMap }
|
||||||
|
|
||||||
|
declare global {
|
||||||
|
/**
|
||||||
|
* Props for Next.js App Router page components
|
||||||
|
* @example
|
||||||
|
* ```tsx
|
||||||
|
* export default function Page(props: PageProps<'/blog/[slug]'>) {
|
||||||
|
* const { slug } = await props.params
|
||||||
|
* return <div>Blog post: {slug}</div>
|
||||||
|
* }
|
||||||
|
* ```
|
||||||
|
*/
|
||||||
|
interface PageProps<AppRoute extends AppRoutes> {
|
||||||
|
params: Promise<ParamMap[AppRoute]>
|
||||||
|
searchParams: Promise<Record<string, string | string[] | undefined>>
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Props for Next.js App Router layout components
|
||||||
|
* @example
|
||||||
|
* ```tsx
|
||||||
|
* export default function Layout(props: LayoutProps<'/dashboard'>) {
|
||||||
|
* return <div>{props.children}</div>
|
||||||
|
* }
|
||||||
|
* ```
|
||||||
|
*/
|
||||||
|
type LayoutProps<LayoutRoute extends LayoutRoutes> = {
|
||||||
|
params: Promise<ParamMap[LayoutRoute]>
|
||||||
|
children: React.ReactNode
|
||||||
|
} & {
|
||||||
|
[K in LayoutSlotMap[LayoutRoute]]: React.ReactNode
|
||||||
|
}
|
||||||
|
}
|
||||||
61
types/validator.ts
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
// This file is generated automatically by Next.js
|
||||||
|
// Do not edit this file manually
|
||||||
|
// This file validates that all pages and layouts export the correct types
|
||||||
|
|
||||||
|
import type { AppRoutes, LayoutRoutes, ParamMap } from "./routes.js"
|
||||||
|
import type { ResolvingMetadata, ResolvingViewport } from "next/types.js"
|
||||||
|
|
||||||
|
type AppPageConfig<Route extends AppRoutes = AppRoutes> = {
|
||||||
|
default: React.ComponentType<{ params: Promise<ParamMap[Route]> } & any> | ((props: { params: Promise<ParamMap[Route]> } & any) => React.ReactNode | Promise<React.ReactNode> | never | void | Promise<void>)
|
||||||
|
generateStaticParams?: (props: { params: ParamMap[Route] }) => Promise<any[]> | any[]
|
||||||
|
generateMetadata?: (
|
||||||
|
props: { params: Promise<ParamMap[Route]> } & any,
|
||||||
|
parent: ResolvingMetadata
|
||||||
|
) => Promise<any> | any
|
||||||
|
generateViewport?: (
|
||||||
|
props: { params: Promise<ParamMap[Route]> } & any,
|
||||||
|
parent: ResolvingViewport
|
||||||
|
) => Promise<any> | any
|
||||||
|
metadata?: any
|
||||||
|
viewport?: any
|
||||||
|
}
|
||||||
|
|
||||||
|
type LayoutConfig<Route extends LayoutRoutes = LayoutRoutes> = {
|
||||||
|
default: React.ComponentType<LayoutProps<Route>> | ((props: LayoutProps<Route>) => React.ReactNode | Promise<React.ReactNode> | never | void | Promise<void>)
|
||||||
|
generateStaticParams?: (props: { params: ParamMap[Route] }) => Promise<any[]> | any[]
|
||||||
|
generateMetadata?: (
|
||||||
|
props: { params: Promise<ParamMap[Route]> } & any,
|
||||||
|
parent: ResolvingMetadata
|
||||||
|
) => Promise<any> | any
|
||||||
|
generateViewport?: (
|
||||||
|
props: { params: Promise<ParamMap[Route]> } & any,
|
||||||
|
parent: ResolvingViewport
|
||||||
|
) => Promise<any> | any
|
||||||
|
metadata?: any
|
||||||
|
viewport?: any
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Validate ../../app/page.tsx
|
||||||
|
{
|
||||||
|
type __IsExpected<Specific extends AppPageConfig<"/">> = Specific
|
||||||
|
const handler = {} as typeof import("../../app/page.js")
|
||||||
|
type __Check = __IsExpected<typeof handler>
|
||||||
|
// @ts-ignore
|
||||||
|
type __Unused = __Check
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Validate ../../app/layout.tsx
|
||||||
|
{
|
||||||
|
type __IsExpected<Specific extends LayoutConfig<"/">> = Specific
|
||||||
|
const handler = {} as typeof import("../../app/layout.js")
|
||||||
|
type __Check = __IsExpected<typeof handler>
|
||||||
|
// @ts-ignore
|
||||||
|
type __Unused = __Check
|
||||||
|
}
|
||||||