Task 001: dockerized monorepo foundation

This commit is contained in:
2026-05-21 16:57:58 +03:00
commit d42f0c4392
83 changed files with 4236 additions and 0 deletions
+17
View File
@@ -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`.
+12
View File
@@ -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"]
+5
View File
@@ -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.
+6
View File
@@ -0,0 +1,6 @@
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
};
export default nextConfig;
+23
View File
@@ -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"
}
}
+21
View File
@@ -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;
}
+5
View File
@@ -0,0 +1,5 @@
export const dynamic = "force-dynamic";
export async function GET() {
return Response.json({ service: "frontend", status: "ok" });
}
+19
View File
@@ -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>
);
}
+8
View File
@@ -0,0 +1,8 @@
export default function HomePage() {
return (
<main>
<h1>AI Content Pipeline</h1>
<p>Dockerized monorepo foundation is running.</p>
</main>
);
}
+3
View File
@@ -0,0 +1,3 @@
# Entities
FSD layer for domain entity UI and client-side models.
+3
View File
@@ -0,0 +1,3 @@
# Features
FSD layer for user-facing actions and feature logic.
+4
View File
@@ -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.
+4
View File
@@ -0,0 +1,4 @@
# Processes
FSD layer for cross-page user workflows. Placeholder for upcoming article
workflow processes.
+3
View File
@@ -0,0 +1,3 @@
# Shared
FSD layer for reusable frontend primitives, API clients, and UI foundations.
+3
View File
@@ -0,0 +1,3 @@
# Widgets
FSD layer for composed UI blocks used by pages.
+27
View File
@@ -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"]
}