Task 001: dockerized monorepo foundation
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
# Frontend Architecture
|
||||
|
||||
This app uses Next.js App Router in `src/app/` for routing. Feature-Sliced
|
||||
Design layers live next to it under `src/`:
|
||||
|
||||
```text
|
||||
src/app/
|
||||
src/processes/
|
||||
src/pages/
|
||||
src/widgets/
|
||||
src/features/
|
||||
src/entities/
|
||||
src/shared/
|
||||
```
|
||||
|
||||
`src/pages` is an FSD page-composition layer. It is not the legacy Next.js Pages
|
||||
Router; the App Router is `src/app`.
|
||||
@@ -0,0 +1,12 @@
|
||||
FROM node:22-alpine
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY apps/frontend/package.json ./package.json
|
||||
RUN npm install
|
||||
|
||||
COPY apps/frontend ./
|
||||
|
||||
EXPOSE 3000
|
||||
|
||||
CMD ["npm", "run", "dev", "--", "--hostname", "0.0.0.0"]
|
||||
Vendored
+5
@@ -0,0 +1,5 @@
|
||||
/// <reference types="next" />
|
||||
/// <reference types="next/image-types/global" />
|
||||
|
||||
// This file is generated by Next.js and kept here so TypeScript works before
|
||||
// the first local `next dev` run.
|
||||
@@ -0,0 +1,6 @@
|
||||
/** @type {import('next').NextConfig} */
|
||||
const nextConfig = {
|
||||
reactStrictMode: true,
|
||||
};
|
||||
|
||||
export default nextConfig;
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"name": "@pipeline/frontend",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
"build": "next build",
|
||||
"start": "next start"
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "16.2.6",
|
||||
"react": "19.0.0",
|
||||
"react-dom": "19.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "22.10.5",
|
||||
"@types/react": "19.0.2",
|
||||
"@types/react-dom": "19.0.2",
|
||||
"typescript": "5.7.2"
|
||||
},
|
||||
"overrides": {
|
||||
"postcss": "8.5.14"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
:root {
|
||||
color-scheme: light;
|
||||
font-family:
|
||||
Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
|
||||
sans-serif;
|
||||
background: #f6f7f9;
|
||||
color: #1d2733;
|
||||
}
|
||||
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
main {
|
||||
min-height: 100vh;
|
||||
padding: 48px;
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
export const dynamic = "force-dynamic";
|
||||
|
||||
export async function GET() {
|
||||
return Response.json({ service: "frontend", status: "ok" });
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
import "./globals.css";
|
||||
import type { ReactNode } from "react";
|
||||
|
||||
export const metadata = {
|
||||
title: "AI Content Pipeline",
|
||||
description: "Internal editorial workflow foundation",
|
||||
};
|
||||
|
||||
export default function RootLayout({
|
||||
children,
|
||||
}: Readonly<{
|
||||
children: ReactNode;
|
||||
}>) {
|
||||
return (
|
||||
<html lang="en">
|
||||
<body>{children}</body>
|
||||
</html>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
export default function HomePage() {
|
||||
return (
|
||||
<main>
|
||||
<h1>AI Content Pipeline</h1>
|
||||
<p>Dockerized monorepo foundation is running.</p>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
# Entities
|
||||
|
||||
FSD layer for domain entity UI and client-side models.
|
||||
@@ -0,0 +1,3 @@
|
||||
# Features
|
||||
|
||||
FSD layer for user-facing actions and feature logic.
|
||||
@@ -0,0 +1,4 @@
|
||||
# Pages
|
||||
|
||||
FSD page-composition layer. This is separate from the Next.js App Router
|
||||
`app/` route layer and does not enable the legacy Pages Router.
|
||||
@@ -0,0 +1,4 @@
|
||||
# Processes
|
||||
|
||||
FSD layer for cross-page user workflows. Placeholder for upcoming article
|
||||
workflow processes.
|
||||
@@ -0,0 +1,3 @@
|
||||
# Shared
|
||||
|
||||
FSD layer for reusable frontend primitives, API clients, and UI foundations.
|
||||
@@ -0,0 +1,3 @@
|
||||
# Widgets
|
||||
|
||||
FSD layer for composed UI blocks used by pages.
|
||||
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "ES2017",
|
||||
"lib": ["dom", "dom.iterable", "esnext"],
|
||||
"allowJs": false,
|
||||
"skipLibCheck": true,
|
||||
"strict": true,
|
||||
"noEmit": true,
|
||||
"esModuleInterop": true,
|
||||
"module": "esnext",
|
||||
"moduleResolution": "bundler",
|
||||
"resolveJsonModule": true,
|
||||
"isolatedModules": true,
|
||||
"jsx": "preserve",
|
||||
"incremental": true,
|
||||
"plugins": [
|
||||
{
|
||||
"name": "next"
|
||||
}
|
||||
],
|
||||
"paths": {
|
||||
"@/*": ["./src/*"]
|
||||
}
|
||||
},
|
||||
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
Reference in New Issue
Block a user