feat(create-turbo): apply official-starter transform
This commit is contained in:
parent
3c677957ad
commit
7ad732dcfc
19
.direnv/bin/nix-direnv-reload
Executable file
19
.direnv/bin/nix-direnv-reload
Executable file
@ -0,0 +1,19 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
if [[ ! -d "/home/ryan/Documents/Code/nazara" ]]; then
|
||||||
|
echo "Cannot find source directory; Did you move it?"
|
||||||
|
echo "(Looking for "/home/ryan/Documents/Code/nazara")"
|
||||||
|
echo 'Cannot force reload with this script - use "direnv reload" manually and then try again'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# rebuild the cache forcefully
|
||||||
|
_nix_direnv_force_reload=1 direnv exec "/home/ryan/Documents/Code/nazara" true
|
||||||
|
|
||||||
|
# Update the mtime for .envrc.
|
||||||
|
# This will cause direnv to reload again - but without re-building.
|
||||||
|
touch "/home/ryan/Documents/Code/nazara/.envrc"
|
||||||
|
|
||||||
|
# Also update the timestamp of whatever profile_rc we have.
|
||||||
|
# This makes sure that we know we are up to date.
|
||||||
|
touch -r "/home/ryan/Documents/Code/nazara/.envrc" "/home/ryan/Documents/Code/nazara/.direnv"/*.rc
|
||||||
1
.direnv/flake-inputs/01x5k4nlxcpyd85nnr0b9gm89rm8ff4x-source
Symbolic link
1
.direnv/flake-inputs/01x5k4nlxcpyd85nnr0b9gm89rm8ff4x-source
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
/nix/store/01x5k4nlxcpyd85nnr0b9gm89rm8ff4x-source
|
||||||
1
.direnv/flake-inputs/m4wcdchjxw2fdyzjp8i6irpc613pchkr-source
Symbolic link
1
.direnv/flake-inputs/m4wcdchjxw2fdyzjp8i6irpc613pchkr-source
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
/nix/store/m4wcdchjxw2fdyzjp8i6irpc613pchkr-source
|
||||||
1
.direnv/flake-inputs/v693fy6xqbw70nfw0gyv66blwpax2l67-source
Symbolic link
1
.direnv/flake-inputs/v693fy6xqbw70nfw0gyv66blwpax2l67-source
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
/nix/store/v693fy6xqbw70nfw0gyv66blwpax2l67-source
|
||||||
1
.direnv/flake-inputs/yj1wxm9hh8610iyzqnz75kvs6xl8j3my-source
Symbolic link
1
.direnv/flake-inputs/yj1wxm9hh8610iyzqnz75kvs6xl8j3my-source
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
/nix/store/yj1wxm9hh8610iyzqnz75kvs6xl8j3my-source
|
||||||
1
.direnv/flake-profile-a5d5b61aa8a61b7d9d765e1daf971a9a578f1cfa
Symbolic link
1
.direnv/flake-profile-a5d5b61aa8a61b7d9d765e1daf971a9a578f1cfa
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
/nix/store/lr0337b15w70fzrxg79xi6zf3bgcm399-nix-shell-env
|
||||||
2097
.direnv/flake-profile-a5d5b61aa8a61b7d9d765e1daf971a9a578f1cfa.rc
Normal file
2097
.direnv/flake-profile-a5d5b61aa8a61b7d9d765e1daf971a9a578f1cfa.rc
Normal file
File diff suppressed because it is too large
Load Diff
61
flake.lock
generated
Normal file
61
flake.lock
generated
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"flake-utils": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1731533236,
|
||||||
|
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1739019272,
|
||||||
|
"narHash": "sha256-7Fu7oazPoYCbDzb9k8D/DdbKrC3aU1zlnc39Y8jy/s8=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "fa35a3c8e17a3de613240fea68f876e5b4896aec",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixpkgs-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils",
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
||||||
40
flake.nix
Normal file
40
flake.nix
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
description = "Lifetracker";
|
||||||
|
|
||||||
|
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
||||||
|
inputs.flake-utils.url = "github:numtide/flake-utils";
|
||||||
|
|
||||||
|
outputs =
|
||||||
|
{ nixpkgs, flake-utils, ... }:
|
||||||
|
flake-utils.lib.eachDefaultSystem (
|
||||||
|
system:
|
||||||
|
let
|
||||||
|
inherit (pkgs.lib) optional optionals;
|
||||||
|
pkgs = import nixpkgs { inherit system; };
|
||||||
|
|
||||||
|
in
|
||||||
|
with pkgs;
|
||||||
|
{
|
||||||
|
devShell = pkgs.mkShell {
|
||||||
|
buildInputs =
|
||||||
|
[
|
||||||
|
bashInteractive
|
||||||
|
glibcLocales
|
||||||
|
git
|
||||||
|
nodejs
|
||||||
|
pnpm
|
||||||
|
postgresql
|
||||||
|
]
|
||||||
|
++ optional stdenv.isLinux inotify-tools
|
||||||
|
++ optional stdenv.isDarwin terminal-notifier
|
||||||
|
++ optionals stdenv.isDarwin (
|
||||||
|
with darwin.apple_sdk.frameworks;
|
||||||
|
[
|
||||||
|
CoreFoundation
|
||||||
|
CoreServices
|
||||||
|
]
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
1
nazaraa/.dockerignore
Normal file
1
nazaraa/.dockerignore
Normal file
@ -0,0 +1 @@
|
|||||||
|
node_modules
|
||||||
36
nazaraa/.gitignore
vendored
Normal file
36
nazaraa/.gitignore
vendored
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||||
|
|
||||||
|
# dependencies
|
||||||
|
node_modules
|
||||||
|
.pnp
|
||||||
|
.pnp.js
|
||||||
|
|
||||||
|
# testing
|
||||||
|
coverage
|
||||||
|
|
||||||
|
# next.js
|
||||||
|
.next/
|
||||||
|
out/
|
||||||
|
build
|
||||||
|
|
||||||
|
# other
|
||||||
|
dist/
|
||||||
|
|
||||||
|
# misc
|
||||||
|
.DS_Store
|
||||||
|
*.pem
|
||||||
|
|
||||||
|
# debug
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
.pnpm-debug.log*
|
||||||
|
|
||||||
|
# local env files
|
||||||
|
.env.local
|
||||||
|
.env.development.local
|
||||||
|
.env.test.local
|
||||||
|
.env.production.local
|
||||||
|
|
||||||
|
# turbo
|
||||||
|
.turbo
|
||||||
75
nazaraa/README.md
Normal file
75
nazaraa/README.md
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
# Turborepo Docker starter
|
||||||
|
|
||||||
|
This is a community-maintained example. If you experience a problem, please submit a pull request with a fix. GitHub Issues will be closed.
|
||||||
|
|
||||||
|
## Using this example
|
||||||
|
|
||||||
|
Run the following command:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npx create-turbo@latest -e with-docker
|
||||||
|
```
|
||||||
|
|
||||||
|
## What's inside?
|
||||||
|
|
||||||
|
This Turborepo includes the following:
|
||||||
|
|
||||||
|
### Apps and Packages
|
||||||
|
|
||||||
|
- `web`: a [Next.js](https://nextjs.org/) app
|
||||||
|
- `api`: an [Express](https://expressjs.com/) server
|
||||||
|
- `@repo/ui`: a React component library
|
||||||
|
- `@repo/logger`: Isomorphic logger (a small wrapper around console.log)
|
||||||
|
- `@repo/eslint-config`: ESLint presets
|
||||||
|
- `@repo/typescript-config`: tsconfig.json's used throughout the monorepo
|
||||||
|
- `@repo/jest-presets`: Jest configurations
|
||||||
|
|
||||||
|
Each package/app is 100% [TypeScript](https://www.typescriptlang.org/).
|
||||||
|
|
||||||
|
### Docker
|
||||||
|
|
||||||
|
This repo is configured to be built with Docker, and Docker compose. To build all apps in this repo:
|
||||||
|
|
||||||
|
```
|
||||||
|
# Install dependencies
|
||||||
|
yarn install
|
||||||
|
|
||||||
|
# Create a network, which allows containers to communicate
|
||||||
|
# with each other, by using their container name as a hostname
|
||||||
|
docker network create app_network
|
||||||
|
|
||||||
|
# Build prod using new BuildKit engine
|
||||||
|
COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1 docker-compose -f docker-compose.yml build
|
||||||
|
|
||||||
|
# Start prod in detached mode
|
||||||
|
docker-compose -f docker-compose.yml up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
Open http://localhost:3000.
|
||||||
|
|
||||||
|
To shutdown all running containers:
|
||||||
|
|
||||||
|
```
|
||||||
|
# Stop all running containers
|
||||||
|
docker kill $(docker ps -q) && docker rm $(docker ps -a -q)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Remote Caching
|
||||||
|
|
||||||
|
> [!TIP]
|
||||||
|
> Vercel Remote Cache is free for all plans. Get started today at [vercel.com](https://vercel.com/signup?/signup?utm_source=remote-cache-sdk&utm_campaign=free_remote_cache).
|
||||||
|
|
||||||
|
This example includes optional remote caching. In the Dockerfiles of the apps, uncomment the build arguments for `TURBO_TEAM` and `TURBO_TOKEN`. Then, pass these build arguments to your Docker build.
|
||||||
|
|
||||||
|
You can test this behavior using a command like:
|
||||||
|
|
||||||
|
`docker build -f apps/web/Dockerfile . --build-arg TURBO_TEAM=“your-team-name” --build-arg TURBO_TOKEN=“your-token“ --no-cache`
|
||||||
|
|
||||||
|
### Utilities
|
||||||
|
|
||||||
|
This Turborepo has some additional tools already setup for you:
|
||||||
|
|
||||||
|
- [TypeScript](https://www.typescriptlang.org/) for static type checking
|
||||||
|
- [ESLint](https://eslint.org/) for code linting
|
||||||
|
- [Jest](https://jestjs.io) test runner for all things JavaScript
|
||||||
|
- [Prettier](https://prettier.io) for code formatting
|
||||||
5
nazaraa/apps/api/.eslintrc.js
Normal file
5
nazaraa/apps/api/.eslintrc.js
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
/** @type {import("eslint").Linter.Config} */
|
||||||
|
module.exports = {
|
||||||
|
root: true,
|
||||||
|
extends: ["@repo/eslint-config/server.js"],
|
||||||
|
};
|
||||||
47
nazaraa/apps/api/Dockerfile
Normal file
47
nazaraa/apps/api/Dockerfile
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
FROM node:18-alpine AS base
|
||||||
|
|
||||||
|
# The web Dockerfile is copy-pasted into our main docs at /docs/handbook/deploying-with-docker.
|
||||||
|
# Make sure you update this Dockerfile, the Dockerfile in the web workspace and copy that over to Dockerfile in the docs.
|
||||||
|
|
||||||
|
FROM base AS builder
|
||||||
|
# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
|
||||||
|
RUN apk update
|
||||||
|
RUN apk add --no-cache libc6-compat
|
||||||
|
# Set working directory
|
||||||
|
WORKDIR /app
|
||||||
|
RUN yarn global add turbo
|
||||||
|
COPY . .
|
||||||
|
RUN turbo prune api --docker
|
||||||
|
|
||||||
|
# Add lockfile and package.json's of isolated subworkspace
|
||||||
|
FROM base AS installer
|
||||||
|
RUN apk update
|
||||||
|
RUN apk add --no-cache libc6-compat
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# First install dependencies (as they change less often)
|
||||||
|
COPY --from=builder /app/out/json/ .
|
||||||
|
RUN yarn install
|
||||||
|
|
||||||
|
# Build the project and its dependencies
|
||||||
|
COPY --from=builder /app/out/full/ .
|
||||||
|
|
||||||
|
# Uncomment and use build args to enable remote caching
|
||||||
|
# ARG TURBO_TEAM
|
||||||
|
# ENV TURBO_TEAM=$TURBO_TEAM
|
||||||
|
|
||||||
|
# ARG TURBO_TOKEN
|
||||||
|
# ENV TURBO_TOKEN=$TURBO_TOKEN
|
||||||
|
|
||||||
|
RUN yarn turbo build
|
||||||
|
|
||||||
|
FROM base AS runner
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Don't run production as root
|
||||||
|
RUN addgroup --system --gid 1001 expressjs
|
||||||
|
RUN adduser --system --uid 1001 expressjs
|
||||||
|
USER expressjs
|
||||||
|
COPY --from=installer /app .
|
||||||
|
|
||||||
|
CMD node apps/api/dist/index.js
|
||||||
42
nazaraa/apps/api/package.json
Normal file
42
nazaraa/apps/api/package.json
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
{
|
||||||
|
"name": "api",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"build": "tsc",
|
||||||
|
"clean": "rm -rf dist",
|
||||||
|
"dev": "nodemon --exec \"node -r esbuild-register ./src/index.ts\" -e .ts",
|
||||||
|
"lint": "tsc --noEmit && eslint \"src/**/*.ts*\" --max-warnings 0",
|
||||||
|
"start": "node -r esbuild-register ./src/index.ts",
|
||||||
|
"test": "jest --detectOpenHandles"
|
||||||
|
},
|
||||||
|
"jest": {
|
||||||
|
"preset": "@repo/jest-presets/node"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@repo/logger": "*",
|
||||||
|
"body-parser": "^1.20.2",
|
||||||
|
"cors": "^2.8.5",
|
||||||
|
"express": "^4.18.3",
|
||||||
|
"morgan": "^1.10.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@jest/globals": "^29.7.0",
|
||||||
|
"@repo/eslint-config": "*",
|
||||||
|
"@repo/jest-presets": "*",
|
||||||
|
"@repo/typescript-config": "*",
|
||||||
|
"@types/body-parser": "^1.19.5",
|
||||||
|
"@types/cors": "^2.8.17",
|
||||||
|
"@types/express": "^4.17.21",
|
||||||
|
"@types/morgan": "^1.9.9",
|
||||||
|
"@types/node": "^20.11.24",
|
||||||
|
"@types/supertest": "^6.0.2",
|
||||||
|
"esbuild": "^0.20.1",
|
||||||
|
"esbuild-register": "^3.5.0",
|
||||||
|
"eslint": "^8.57.0",
|
||||||
|
"jest": "^29.7.0",
|
||||||
|
"nodemon": "^3.1.0",
|
||||||
|
"supertest": "^6.3.3",
|
||||||
|
"typescript": "5.5.4"
|
||||||
|
}
|
||||||
|
}
|
||||||
23
nazaraa/apps/api/src/__tests__/server.test.ts
Normal file
23
nazaraa/apps/api/src/__tests__/server.test.ts
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import supertest from "supertest";
|
||||||
|
import { describe, it, expect } from "@jest/globals";
|
||||||
|
import { createServer } from "../server";
|
||||||
|
|
||||||
|
describe("server", () => {
|
||||||
|
it("status check returns 200", async () => {
|
||||||
|
await supertest(createServer())
|
||||||
|
.get("/status")
|
||||||
|
.expect(200)
|
||||||
|
.then((res) => {
|
||||||
|
expect(res.body.ok).toBe(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("message endpoint says hello", async () => {
|
||||||
|
await supertest(createServer())
|
||||||
|
.get("/message/jared")
|
||||||
|
.expect(200)
|
||||||
|
.then((res) => {
|
||||||
|
expect(res.body.message).toBe("hello jared");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
9
nazaraa/apps/api/src/index.ts
Normal file
9
nazaraa/apps/api/src/index.ts
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import { createServer } from "./server";
|
||||||
|
import { log } from "@repo/logger";
|
||||||
|
|
||||||
|
const port = process.env.PORT || 3001;
|
||||||
|
const server = createServer();
|
||||||
|
|
||||||
|
server.listen(port, () => {
|
||||||
|
log(`api running on ${port}`);
|
||||||
|
});
|
||||||
22
nazaraa/apps/api/src/server.ts
Normal file
22
nazaraa/apps/api/src/server.ts
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
import { json, urlencoded } from "body-parser";
|
||||||
|
import express, { type Express } from "express";
|
||||||
|
import morgan from "morgan";
|
||||||
|
import cors from "cors";
|
||||||
|
|
||||||
|
export const createServer = (): Express => {
|
||||||
|
const app = express();
|
||||||
|
app
|
||||||
|
.disable("x-powered-by")
|
||||||
|
.use(morgan("dev"))
|
||||||
|
.use(urlencoded({ extended: true }))
|
||||||
|
.use(json())
|
||||||
|
.use(cors())
|
||||||
|
.get("/message/:name", (req, res) => {
|
||||||
|
return res.json({ message: `hello ${req.params.name}` });
|
||||||
|
})
|
||||||
|
.get("/status", (_, res) => {
|
||||||
|
return res.json({ ok: true });
|
||||||
|
});
|
||||||
|
|
||||||
|
return app;
|
||||||
|
};
|
||||||
10
nazaraa/apps/api/tsconfig.json
Normal file
10
nazaraa/apps/api/tsconfig.json
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"extends": "@repo/typescript-config/base.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"lib": ["ES2015"],
|
||||||
|
"outDir": "./dist",
|
||||||
|
"rootDir": "./src"
|
||||||
|
},
|
||||||
|
"exclude": ["node_modules"],
|
||||||
|
"include": ["src"]
|
||||||
|
}
|
||||||
9
nazaraa/apps/web/.eslintrc.js
Normal file
9
nazaraa/apps/web/.eslintrc.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
/** @type {import("eslint").Linter.Config} */
|
||||||
|
module.exports = {
|
||||||
|
root: true,
|
||||||
|
extends: ["@repo/eslint-config/next.js"],
|
||||||
|
parser: "@typescript-eslint/parser",
|
||||||
|
parserOptions: {
|
||||||
|
project: true,
|
||||||
|
},
|
||||||
|
};
|
||||||
52
nazaraa/apps/web/Dockerfile
Normal file
52
nazaraa/apps/web/Dockerfile
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
FROM node:18-alpine AS base
|
||||||
|
|
||||||
|
# This Dockerfile is copy-pasted into our main docs at /docs/handbook/deploying-with-docker.
|
||||||
|
# Make sure you update both files!
|
||||||
|
|
||||||
|
FROM base AS builder
|
||||||
|
# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
|
||||||
|
RUN apk update
|
||||||
|
RUN apk add --no-cache libc6-compat
|
||||||
|
# Set working directory
|
||||||
|
WORKDIR /app
|
||||||
|
RUN yarn global add turbo
|
||||||
|
COPY . .
|
||||||
|
RUN turbo prune web --docker
|
||||||
|
|
||||||
|
# Add lockfile and package.json's of isolated subworkspace
|
||||||
|
FROM base AS installer
|
||||||
|
RUN apk update
|
||||||
|
RUN apk add --no-cache libc6-compat
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# First install the dependencies (as they change less often)
|
||||||
|
COPY --from=builder /app/out/json/ .
|
||||||
|
RUN yarn install
|
||||||
|
|
||||||
|
# Build the project
|
||||||
|
COPY --from=builder /app/out/full/ .
|
||||||
|
|
||||||
|
# Uncomment and use build args to enable remote caching
|
||||||
|
# ARG TURBO_TEAM
|
||||||
|
# ENV TURBO_TEAM=$TURBO_TEAM
|
||||||
|
|
||||||
|
# ARG TURBO_TOKEN
|
||||||
|
# ENV TURBO_TOKEN=$TURBO_TOKEN
|
||||||
|
|
||||||
|
RUN yarn turbo build
|
||||||
|
|
||||||
|
FROM base AS runner
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Don't run production as root
|
||||||
|
RUN addgroup --system --gid 1001 nodejs
|
||||||
|
RUN adduser --system --uid 1001 nextjs
|
||||||
|
USER nextjs
|
||||||
|
|
||||||
|
# Automatically leverage output traces to reduce image size
|
||||||
|
# https://nextjs.org/docs/advanced-features/output-file-tracing
|
||||||
|
COPY --from=installer --chown=nextjs:nodejs /app/apps/web/.next/standalone ./
|
||||||
|
COPY --from=installer --chown=nextjs:nodejs /app/apps/web/.next/static ./apps/web/.next/static
|
||||||
|
COPY --from=installer --chown=nextjs:nodejs /app/apps/web/public ./apps/web/public
|
||||||
|
|
||||||
|
CMD node apps/web/server.js
|
||||||
30
nazaraa/apps/web/README.md
Normal file
30
nazaraa/apps/web/README.md
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
## Getting Started
|
||||||
|
|
||||||
|
First, run the development server:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
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.js`. 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.js`.
|
||||||
|
|
||||||
|
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/foundations/about-nextjs) - 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_source=github.com&utm_medium=referral&utm_campaign=turborepo-readme) from the creators of Next.js.
|
||||||
|
|
||||||
|
Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
|
||||||
5
nazaraa/apps/web/next-env.d.ts
vendored
Normal file
5
nazaraa/apps/web/next-env.d.ts
vendored
Normal file
@ -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.
|
||||||
10
nazaraa/apps/web/next.config.js
Normal file
10
nazaraa/apps/web/next.config.js
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
const path = require("path");
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
reactStrictMode: true,
|
||||||
|
transpilePackages: ["@repo/ui"],
|
||||||
|
output: "standalone",
|
||||||
|
experimental: {
|
||||||
|
outputFileTracingRoot: path.join(__dirname, "../../"),
|
||||||
|
},
|
||||||
|
};
|
||||||
27
nazaraa/apps/web/package.json
Normal file
27
nazaraa/apps/web/package.json
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"name": "web",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"build": "next build",
|
||||||
|
"dev": "next dev",
|
||||||
|
"lint": "eslint . --max-warnings 0",
|
||||||
|
"start": "next start"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"next": "^14.1.1",
|
||||||
|
"react": "^18.2.0",
|
||||||
|
"react-dom": "^18.2.0",
|
||||||
|
"@repo/ui": "*"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@next/eslint-plugin-next": "^14.1.1",
|
||||||
|
"@types/node": "^20.11.24",
|
||||||
|
"@types/react": "^18.2.61",
|
||||||
|
"@types/react-dom": "^18.2.19",
|
||||||
|
"eslint": "^8.57.0",
|
||||||
|
"@repo/eslint-config": "*",
|
||||||
|
"@repo/typescript-config": "*",
|
||||||
|
"typescript": "5.5.4"
|
||||||
|
}
|
||||||
|
}
|
||||||
7
nazaraa/apps/web/public/.gitkeep
Normal file
7
nazaraa/apps/web/public/.gitkeep
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
This public directory can be used to store any static content, see:
|
||||||
|
|
||||||
|
https://nextjs.org/docs/basic-features/static-file-serving
|
||||||
|
|
||||||
|
To remove this directory, also remove the following line from the web `Dockerfile`:
|
||||||
|
|
||||||
|
COPY --from=installer --chown=nextjs:nodejs /app/apps/web/public ./apps/web/public
|
||||||
11
nazaraa/apps/web/src/app/layout.tsx
Normal file
11
nazaraa/apps/web/src/app/layout.tsx
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
export default function RootLayout({
|
||||||
|
children,
|
||||||
|
}: {
|
||||||
|
children: React.ReactNode;
|
||||||
|
}) {
|
||||||
|
return (
|
||||||
|
<html lang="en">
|
||||||
|
<body>{children}</body>
|
||||||
|
</html>
|
||||||
|
);
|
||||||
|
}
|
||||||
67
nazaraa/apps/web/src/app/page.tsx
Normal file
67
nazaraa/apps/web/src/app/page.tsx
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
"use client";
|
||||||
|
|
||||||
|
import { useEffect, useState, ChangeEvent, FormEvent } from "react";
|
||||||
|
import { Button } from "@repo/ui/button";
|
||||||
|
|
||||||
|
const API_HOST = process.env.NEXT_PUBLIC_API_HOST || "http://localhost:3001";
|
||||||
|
|
||||||
|
export default function Web() {
|
||||||
|
const [name, setName] = useState<string>("");
|
||||||
|
const [response, setResponse] = useState<{ message: string } | null>(null);
|
||||||
|
const [error, setError] = useState<string | undefined>();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setResponse(null);
|
||||||
|
setError(undefined);
|
||||||
|
}, [name]);
|
||||||
|
|
||||||
|
const onChange = (e: ChangeEvent<HTMLInputElement>) =>
|
||||||
|
setName(e.target.value);
|
||||||
|
|
||||||
|
const onSubmit = async (e: FormEvent<HTMLFormElement>) => {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
try {
|
||||||
|
const result = await fetch(`${API_HOST}/message/${name}`);
|
||||||
|
const response = await result.json();
|
||||||
|
setResponse(response);
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
setError("Unable to fetch response");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const onReset = () => {
|
||||||
|
setName("");
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<h1>Web</h1>
|
||||||
|
<form onSubmit={onSubmit}>
|
||||||
|
<label htmlFor="name">Name </label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
name="name"
|
||||||
|
id="name"
|
||||||
|
value={name}
|
||||||
|
onChange={onChange}
|
||||||
|
></input>
|
||||||
|
<Button type="submit">Submit</Button>
|
||||||
|
</form>
|
||||||
|
{error && (
|
||||||
|
<div>
|
||||||
|
<h3>Error</h3>
|
||||||
|
<p>{error}</p>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{response && (
|
||||||
|
<div>
|
||||||
|
<h3>Greeting</h3>
|
||||||
|
<p>{response.message}</p>
|
||||||
|
<Button onClick={onReset}>Reset</Button>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
8
nazaraa/apps/web/tsconfig.json
Normal file
8
nazaraa/apps/web/tsconfig.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"extends": "@repo/typescript-config/nextjs.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"plugins": [{ "name": "next" }]
|
||||||
|
},
|
||||||
|
"include": ["next-env.d.ts", "next.config.js", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
||||||
|
"exclude": ["node_modules"]
|
||||||
|
}
|
||||||
29
nazaraa/docker-compose.yml
Normal file
29
nazaraa/docker-compose.yml
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
version: "3"
|
||||||
|
|
||||||
|
services:
|
||||||
|
web:
|
||||||
|
container_name: web
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: ./apps/web/Dockerfile
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- 3000:3000
|
||||||
|
networks:
|
||||||
|
- app_network
|
||||||
|
api:
|
||||||
|
container_name: api
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: ./apps/api/Dockerfile
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- 3001:3001
|
||||||
|
networks:
|
||||||
|
- app_network
|
||||||
|
|
||||||
|
# Define a network, which allows containers to communicate
|
||||||
|
# with each other, by using their container name as a hostname
|
||||||
|
networks:
|
||||||
|
app_network:
|
||||||
|
external: true
|
||||||
27
nazaraa/package.json
Normal file
27
nazaraa/package.json
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"name": "with-docker",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"private": true,
|
||||||
|
"workspaces": [
|
||||||
|
"apps/*",
|
||||||
|
"packages/*"
|
||||||
|
],
|
||||||
|
"scripts": {
|
||||||
|
"build": "turbo run build",
|
||||||
|
"clean": "turbo run clean",
|
||||||
|
"dev": "turbo run dev",
|
||||||
|
"format": "prettier --write \"**/*.{ts,tsx,md}\"",
|
||||||
|
"lint": "turbo run lint",
|
||||||
|
"test": "turbo run test"
|
||||||
|
},
|
||||||
|
"dependencies": {},
|
||||||
|
"devDependencies": {
|
||||||
|
"prettier": "^3.2.5",
|
||||||
|
"turbo": "^2.4.0"
|
||||||
|
},
|
||||||
|
"packageManager": "yarn@1.22.19",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=14.0.0",
|
||||||
|
"npm": ">=7.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
3
nazaraa/packages/eslint-config/README.md
Normal file
3
nazaraa/packages/eslint-config/README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# `@turbo/eslint-config`
|
||||||
|
|
||||||
|
Collection of internal eslint configurations.
|
||||||
34
nazaraa/packages/eslint-config/library.js
Normal file
34
nazaraa/packages/eslint-config/library.js
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
const { resolve } = require("node:path");
|
||||||
|
|
||||||
|
const project = resolve(process.cwd(), "tsconfig.json");
|
||||||
|
|
||||||
|
/** @type {import("eslint").Linter.Config} */
|
||||||
|
module.exports = {
|
||||||
|
extends: ["eslint:recommended", "prettier", "turbo"],
|
||||||
|
plugins: ["only-warn"],
|
||||||
|
globals: {
|
||||||
|
React: true,
|
||||||
|
JSX: true,
|
||||||
|
},
|
||||||
|
env: {
|
||||||
|
node: true,
|
||||||
|
},
|
||||||
|
settings: {
|
||||||
|
"import/resolver": {
|
||||||
|
typescript: {
|
||||||
|
project,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ignorePatterns: [
|
||||||
|
// Ignore dotfiles
|
||||||
|
".*.js",
|
||||||
|
"node_modules/",
|
||||||
|
"dist/",
|
||||||
|
],
|
||||||
|
overrides: [
|
||||||
|
{
|
||||||
|
files: ["*.js?(x)", "*.ts?(x)"],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
42
nazaraa/packages/eslint-config/next.js
Normal file
42
nazaraa/packages/eslint-config/next.js
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
const { resolve } = require("node:path");
|
||||||
|
|
||||||
|
const project = resolve(process.cwd(), "tsconfig.json");
|
||||||
|
|
||||||
|
/** @type {import("eslint").Linter.Config} */
|
||||||
|
module.exports = {
|
||||||
|
extends: [
|
||||||
|
"eslint:recommended",
|
||||||
|
"prettier",
|
||||||
|
require.resolve("@vercel/style-guide/eslint/next"),
|
||||||
|
"turbo",
|
||||||
|
],
|
||||||
|
globals: {
|
||||||
|
React: true,
|
||||||
|
JSX: true,
|
||||||
|
},
|
||||||
|
env: {
|
||||||
|
node: true,
|
||||||
|
},
|
||||||
|
plugins: ["only-warn"],
|
||||||
|
settings: {
|
||||||
|
"import/resolver": {
|
||||||
|
typescript: {
|
||||||
|
project,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ignorePatterns: [
|
||||||
|
// Ignore dotfiles
|
||||||
|
".*.js",
|
||||||
|
"node_modules/",
|
||||||
|
],
|
||||||
|
overrides: [
|
||||||
|
{ files: ["*.js?(x)", "*.ts?(x)"] },
|
||||||
|
{
|
||||||
|
files: ["*.ts", "*.tsx"],
|
||||||
|
rules: {
|
||||||
|
"no-undef": "off",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
20
nazaraa/packages/eslint-config/package.json
Normal file
20
nazaraa/packages/eslint-config/package.json
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"name": "@repo/eslint-config",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"private": true,
|
||||||
|
"files": [
|
||||||
|
"library.js",
|
||||||
|
"next.js",
|
||||||
|
"react-internal.js",
|
||||||
|
"server.js"
|
||||||
|
],
|
||||||
|
"devDependencies": {
|
||||||
|
"@vercel/style-guide": "^5.2.0",
|
||||||
|
"eslint-config-turbo": "^2.0.0",
|
||||||
|
"eslint-config-prettier": "^9.1.0",
|
||||||
|
"eslint-plugin-only-warn": "^1.1.0",
|
||||||
|
"@typescript-eslint/parser": "^7.1.0",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^7.1.0",
|
||||||
|
"typescript": "5.5.4"
|
||||||
|
}
|
||||||
|
}
|
||||||
39
nazaraa/packages/eslint-config/react-internal.js
vendored
Normal file
39
nazaraa/packages/eslint-config/react-internal.js
vendored
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
const { resolve } = require("node:path");
|
||||||
|
|
||||||
|
const project = resolve(process.cwd(), "tsconfig.json");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is a custom ESLint configuration for use with
|
||||||
|
* internal (bundled by their consumer) libraries
|
||||||
|
* that utilize React.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @type {import("eslint").Linter.Config} */
|
||||||
|
module.exports = {
|
||||||
|
extends: ["eslint:recommended", "prettier", "turbo"],
|
||||||
|
plugins: ["only-warn"],
|
||||||
|
globals: {
|
||||||
|
React: true,
|
||||||
|
JSX: true,
|
||||||
|
},
|
||||||
|
env: {
|
||||||
|
browser: true,
|
||||||
|
},
|
||||||
|
settings: {
|
||||||
|
"import/resolver": {
|
||||||
|
typescript: {
|
||||||
|
project,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ignorePatterns: [
|
||||||
|
// Ignore dotfiles
|
||||||
|
".*.js",
|
||||||
|
"node_modules/",
|
||||||
|
"dist/",
|
||||||
|
],
|
||||||
|
overrides: [
|
||||||
|
// Force ESLint to detect .tsx files
|
||||||
|
{ files: ["*.js?(x)", "*.ts?(x)"] },
|
||||||
|
],
|
||||||
|
};
|
||||||
19
nazaraa/packages/eslint-config/server.js
Normal file
19
nazaraa/packages/eslint-config/server.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
module.exports = {
|
||||||
|
extends: ["eslint:recommended"],
|
||||||
|
env: {
|
||||||
|
node: true,
|
||||||
|
es6: true,
|
||||||
|
},
|
||||||
|
parserOptions: {
|
||||||
|
ecmaVersion: "latest",
|
||||||
|
sourceType: "module",
|
||||||
|
},
|
||||||
|
overrides: [
|
||||||
|
{
|
||||||
|
files: ["**/__tests__/**/*"],
|
||||||
|
env: {
|
||||||
|
jest: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
17
nazaraa/packages/jest-presets/node/jest-preset.ts
Normal file
17
nazaraa/packages/jest-presets/node/jest-preset.ts
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import type { Config } from "jest";
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
roots: ["<rootDir>"],
|
||||||
|
transform: {
|
||||||
|
"^.+\\.tsx?$": "ts-jest",
|
||||||
|
},
|
||||||
|
moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"],
|
||||||
|
modulePathIgnorePatterns: [
|
||||||
|
"<rootDir>/test/__fixtures__",
|
||||||
|
"<rootDir>/node_modules",
|
||||||
|
"<rootDir>/dist",
|
||||||
|
],
|
||||||
|
preset: "ts-jest",
|
||||||
|
} as const satisfies Config;
|
||||||
|
|
||||||
|
export default config;
|
||||||
13
nazaraa/packages/jest-presets/package.json
Normal file
13
nazaraa/packages/jest-presets/package.json
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"name": "@repo/jest-presets",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"private": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"files": [
|
||||||
|
"node/jest-preset.ts"
|
||||||
|
],
|
||||||
|
"dependencies": {
|
||||||
|
"jest": "^29.7.0",
|
||||||
|
"ts-jest": "^29.2.5"
|
||||||
|
}
|
||||||
|
}
|
||||||
10
nazaraa/packages/logger/.eslintrc.js
Normal file
10
nazaraa/packages/logger/.eslintrc.js
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
/** @type {import("eslint").Linter.Config} */
|
||||||
|
module.exports = {
|
||||||
|
root: true,
|
||||||
|
extends: ["@repo/eslint-config/react-internal.js"],
|
||||||
|
parser: "@typescript-eslint/parser",
|
||||||
|
parserOptions: {
|
||||||
|
project: true,
|
||||||
|
},
|
||||||
|
ignorePatterns: ["**/__tests__/"],
|
||||||
|
};
|
||||||
30
nazaraa/packages/logger/package.json
Normal file
30
nazaraa/packages/logger/package.json
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
"name": "@repo/logger",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"private": true,
|
||||||
|
"main": "./dist/index.js",
|
||||||
|
"types": "./dist/index.d.ts",
|
||||||
|
"files": [
|
||||||
|
"dist/**"
|
||||||
|
],
|
||||||
|
"scripts": {
|
||||||
|
"build": "tsc",
|
||||||
|
"clean": "rm -rf dist",
|
||||||
|
"dev": "tsc -w",
|
||||||
|
"lint": "eslint \"src/**/*.ts*\" --max-warnings 0",
|
||||||
|
"test": "jest"
|
||||||
|
},
|
||||||
|
"jest": {
|
||||||
|
"preset": "@repo/jest-presets/node"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@jest/globals": "^29.7.0",
|
||||||
|
"@repo/eslint-config": "*",
|
||||||
|
"@repo/jest-presets": "*",
|
||||||
|
"@repo/typescript-config": "*",
|
||||||
|
"@types/node": "^20.11.24",
|
||||||
|
"eslint": "^8.57.0",
|
||||||
|
"jest": "^29.7.0",
|
||||||
|
"typescript": "5.5.4"
|
||||||
|
}
|
||||||
|
}
|
||||||
11
nazaraa/packages/logger/src/__tests__/log.test.ts
Normal file
11
nazaraa/packages/logger/src/__tests__/log.test.ts
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import { describe, it, expect, jest } from "@jest/globals";
|
||||||
|
import { log } from "..";
|
||||||
|
|
||||||
|
jest.spyOn(global.console, "log");
|
||||||
|
|
||||||
|
describe("@repo/logger", () => {
|
||||||
|
it("prints a message", () => {
|
||||||
|
log("hello");
|
||||||
|
expect(console.log).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
});
|
||||||
3
nazaraa/packages/logger/src/index.ts
Normal file
3
nazaraa/packages/logger/src/index.ts
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
export const log = (str: any) => {
|
||||||
|
console.log("logger: " + str);
|
||||||
|
};
|
||||||
11
nazaraa/packages/logger/tsconfig.json
Normal file
11
nazaraa/packages/logger/tsconfig.json
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"extends": "@repo/typescript-config/base.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"lib": ["ES2015", "DOM"],
|
||||||
|
"outDir": "./dist",
|
||||||
|
"rootDir": "./src",
|
||||||
|
"types": ["jest", "node"]
|
||||||
|
},
|
||||||
|
"include": ["src"],
|
||||||
|
"exclude": ["node_modules"]
|
||||||
|
}
|
||||||
3
nazaraa/packages/typescript-config/README.md
Normal file
3
nazaraa/packages/typescript-config/README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# `tsconfig`
|
||||||
|
|
||||||
|
These are base shared `tsconfig.json`s from which all other `tsconfig.json`'s inherit from.
|
||||||
20
nazaraa/packages/typescript-config/base.json
Normal file
20
nazaraa/packages/typescript-config/base.json
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://json.schemastore.org/tsconfig",
|
||||||
|
"compilerOptions": {
|
||||||
|
"composite": false,
|
||||||
|
"declaration": true,
|
||||||
|
"declarationMap": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"forceConsistentCasingInFileNames": true,
|
||||||
|
"inlineSources": false,
|
||||||
|
"isolatedModules": true,
|
||||||
|
"module": "NodeNext",
|
||||||
|
"moduleResolution": "NodeNext",
|
||||||
|
"noUnusedLocals": false,
|
||||||
|
"noUnusedParameters": false,
|
||||||
|
"preserveWatchOutput": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"strict": true
|
||||||
|
},
|
||||||
|
"exclude": ["node_modules"]
|
||||||
|
}
|
||||||
23
nazaraa/packages/typescript-config/nextjs.json
Normal file
23
nazaraa/packages/typescript-config/nextjs.json
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://json.schemastore.org/tsconfig",
|
||||||
|
"extends": "./base.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"plugins": [{ "name": "next" }],
|
||||||
|
"target": "es5",
|
||||||
|
"lib": ["dom", "dom.iterable", "esnext"],
|
||||||
|
"allowJs": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"strict": true,
|
||||||
|
"forceConsistentCasingInFileNames": true,
|
||||||
|
"noEmit": true,
|
||||||
|
"incremental": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"module": "ESNext",
|
||||||
|
"moduleResolution": "Bundler",
|
||||||
|
"resolveJsonModule": true,
|
||||||
|
"isolatedModules": true,
|
||||||
|
"jsx": "preserve"
|
||||||
|
},
|
||||||
|
"include": ["src", "next-env.d.ts"],
|
||||||
|
"exclude": ["node_modules"]
|
||||||
|
}
|
||||||
9
nazaraa/packages/typescript-config/package.json
Normal file
9
nazaraa/packages/typescript-config/package.json
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"name": "@repo/typescript-config",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"private": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"publishConfig": {
|
||||||
|
"access": "public"
|
||||||
|
}
|
||||||
|
}
|
||||||
10
nazaraa/packages/typescript-config/react-library.json
Normal file
10
nazaraa/packages/typescript-config/react-library.json
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://json.schemastore.org/tsconfig",
|
||||||
|
"extends": "./base.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"lib": ["ES2015"],
|
||||||
|
"target": "ES6",
|
||||||
|
"jsx": "react-jsx"
|
||||||
|
},
|
||||||
|
"exclude": ["node_modules"]
|
||||||
|
}
|
||||||
9
nazaraa/packages/ui/.eslintrc.js
Normal file
9
nazaraa/packages/ui/.eslintrc.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
/** @type {import("eslint").Linter.Config} */
|
||||||
|
module.exports = {
|
||||||
|
root: true,
|
||||||
|
extends: ["@repo/eslint-config/react-internal.js"],
|
||||||
|
parser: "@typescript-eslint/parser",
|
||||||
|
parserOptions: {
|
||||||
|
project: true,
|
||||||
|
},
|
||||||
|
};
|
||||||
21
nazaraa/packages/ui/package.json
Normal file
21
nazaraa/packages/ui/package.json
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"name": "@repo/ui",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"exports": {
|
||||||
|
"./button": "./src/button.tsx"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"lint": "eslint \"**/*.ts*\" --max-warnings 0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/react": "^18.2.61",
|
||||||
|
"@types/react-dom": "^18.2.19",
|
||||||
|
"eslint": "^8.57.0",
|
||||||
|
"@repo/eslint-config": "*",
|
||||||
|
"@repo/typescript-config": "*",
|
||||||
|
"typescript": "5.5.4"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"react": "^18.2.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
7
nazaraa/packages/ui/src/button.tsx
Normal file
7
nazaraa/packages/ui/src/button.tsx
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
||||||
|
children: React.ReactNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const Button = ({ children, ...rest }: ButtonProps) => {
|
||||||
|
return <button {...rest}>{children}</button>;
|
||||||
|
};
|
||||||
5
nazaraa/packages/ui/tsconfig.json
Normal file
5
nazaraa/packages/ui/tsconfig.json
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"extends": "@repo/typescript-config/react-library.json",
|
||||||
|
"include": ["."],
|
||||||
|
"exclude": ["dist", "build", "node_modules"]
|
||||||
|
}
|
||||||
25
nazaraa/turbo.json
Normal file
25
nazaraa/turbo.json
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://turbo.build/schema.json",
|
||||||
|
"tasks": {
|
||||||
|
"build": {
|
||||||
|
"inputs": ["$TURBO_DEFAULT$", ".env*"],
|
||||||
|
"outputs": ["dist/**", ".next/**", "!.next/cache/**", "public/dist/**"],
|
||||||
|
"dependsOn": ["^build"],
|
||||||
|
"env": ["NEXT_PUBLIC_API_HOST"]
|
||||||
|
},
|
||||||
|
"test": {
|
||||||
|
"outputs": ["coverage/**"],
|
||||||
|
"dependsOn": []
|
||||||
|
},
|
||||||
|
"lint": {
|
||||||
|
"dependsOn": ["^build"]
|
||||||
|
},
|
||||||
|
"dev": {
|
||||||
|
"cache": false,
|
||||||
|
"persistent": true
|
||||||
|
},
|
||||||
|
"clean": {
|
||||||
|
"cache": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
5603
nazaraa/yarn.lock
Normal file
5603
nazaraa/yarn.lock
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user