Skip to content

Commit

Permalink
init project
Browse files Browse the repository at this point in the history
  • Loading branch information
reubendrummond committed Jul 16, 2022
1 parent 07e0a08 commit 5aa5591
Show file tree
Hide file tree
Showing 14 changed files with 5,352 additions and 1 deletion.
3 changes: 3 additions & 0 deletions .eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 1,3 @@
{
"extends": "next/core-web-vitals"
}
35 changes: 34 additions & 1 deletion README.md
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1 1,34 @@
# safe-nappi
This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).

## Getting Started

First, run the development server:

```bash
npm run dev
# or
yarn dev
```

Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.

You can start editing the page by modifying `pages/index.tsx`. The page auto-updates as you edit the file.

[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`.

The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages.

## Learn More

To learn more about Next.js, take a look at the following resources:

- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.

You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!

## Deploy on Vercel

The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.

Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
4 changes: 4 additions & 0 deletions lib/dirToRoutes.ts
Original file line number Diff line number Diff line change
@@ -0,0 1,4 @@
/*
dir path -> all possible api routes
*/
63 changes: 63 additions & 0 deletions lib/fetcherClient.ts
Original file line number Diff line number Diff line change
@@ -0,0 1,63 @@
interface UserResponse {
users: {
id: number;
name: string;
status: string;
}[];
}

interface UserIdReponse {
dynamic: boolean;
}

interface UserIdFriendsReponse {
friends: boolean;
}

// generate dynamic types for dynamic routes
type DynamicUserPath = `/api/users/${number}`; // /api/users/[id]
type DynamicUserFriendsPath = `/api/users/${number}/friends`; // /api/users/[id]/friends

// extract api response types from api routes
type ApiPathMap = {
"/api/users": UserResponse;
[key: DynamicUserPath]: UserIdReponse;
[key: DynamicUserFriendsPath]: UserIdFriendsReponse;
};

// wrapper of fetch which only accepts valid keys
const jsonFetch = async <T extends keyof ApiPathMap>(
path: T
): Promise<ApiPathMap[T]> => {
const res = await fetch(path);
const data = await res.json();
return data as ApiPathMap[T];
};

jsonFetch("/api/users").then((res) => {});

jsonFetch("/api/users").then((usersRes) => {
usersRes.users.map((user) => {
user.id;
user.name;
user.status;
});
});

jsonFetch("/api/users/435").then((userRes) => {
userRes.dynamic;
});

jsonFetch("/api/users/435/friends").then((userRes) => {
userRes.friends;
});

jsonFetch("/api/users").then((res) => {
res.users;
});

/*
build script:
run generate && run build
(to ensure up to date types)
*/
5 changes: 5 additions & 0 deletions next-env.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 1,5 @@
/// <reference types="next" />
/// <reference types="next/image-types/global" />

// NOTE: This file should not be edited
// see https://nextjs.org/docs/basic-features/typescript for more information.
7 changes: 7 additions & 0 deletions next.config.js
Original file line number Diff line number Diff line change
@@ -0,0 1,7 @@
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
swcMinify: true,
}

module.exports = nextConfig
Loading

0 comments on commit 5aa5591

Please sign in to comment.