@totaland/create-starter-kit 1.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +130 -18
- package/bin/index.js +109 -21
- package/package.json +2 -2
- package/templates/backend/.github/agents/ /360/237/216/255 planner.agent.md" +92 -0
- package/templates/backend/.github/agents/api-architect.agent.md +41 -0
- package/templates/backend/.github/agents/code-reviewer.agent.md +26 -0
- package/templates/backend/.github/agents/code-simplifier.agent.md +41 -0
- package/templates/backend/.github/agents/code-skeptic.agent.md +74 -0
- package/templates/backend/.github/agents/docs-specialist.agent.md +25 -0
- package/templates/backend/.github/agents/implementation-plan.agent.md +160 -0
- package/templates/backend/.github/agents/janitor.agent.md +90 -0
- package/templates/backend/.github/agents/ms-sql-dba.agent.md +25 -0
- package/templates/backend/.github/agents/plan.agent.md +115 -0
- package/templates/backend/.github/agents/planner.agent.md +15 -0
- package/templates/backend/.github/agents/playwright-tester.agent.md +13 -0
- package/templates/backend/.github/agents/postgresql-dba.agent.md +18 -0
- package/templates/backend/.github/agents/prd.agent.md +202 -0
- package/templates/backend/.github/agents/research-technical-spike.agent.md +170 -0
- package/templates/backend/.github/agents/software-engineer-agent-v1.agent.md +165 -0
- package/templates/backend/.github/agents/task-planner.agent.md +375 -0
- package/templates/backend/.github/agents/task-researcher.agent.md +255 -0
- package/templates/backend/.github/agents/tdd-green.agent.md +60 -0
- package/templates/backend/.github/agents/tdd-red.agent.md +60 -0
- package/templates/backend/.github/agents/tdd-refactor.agent.md +85 -0
- package/templates/backend/.github/agents/tech-debt-remediation-plan.agent.md +50 -0
- package/templates/backend/.github/agents/typescript-mcp-expert.agent.md +91 -0
- package/templates/backend/.github/agents/ultimate-thinking-beastmode.agent.md +644 -0
- package/templates/backend/.github/agents//360/237/216/255 generator.agent.md" +264 -0
- package/templates/backend/.github/agents//360/237/216/255 healer.agent.md" +44 -0
- package/templates/backend/.github/agents//360/237/216/255 pom.agent.md" +308 -0
- package/templates/backend/.github/instructions/a11y.instructions.md +369 -0
- package/templates/backend/.github/instructions/ms-sql-dba.instructions.md +25 -0
- package/templates/backend/.github/instructions/object-calisthenics.instructions.md +302 -0
- package/templates/backend/.github/instructions/performance-optimization.instructions.md +420 -0
- package/templates/backend/.github/instructions/playwright-python.instructions.md +62 -0
- package/templates/backend/.github/instructions/playwright-typescript.instructions.md +86 -0
- package/templates/backend/.github/instructions/security-and-owasp.instructions.md +51 -0
- package/templates/backend/.github/instructions/self-explanatory-code-commenting.instructions.md +162 -0
- package/templates/backend/.github/instructions/spec-driven-workflow-v1.instructions.md +323 -0
- package/templates/backend/.github/instructions/sql-sp-generation.instructions.md +74 -0
- package/templates/backend/.github/instructions/task-implementation.instructions.md +190 -0
- package/templates/backend/.github/instructions/typescript-mcp-server.instructions.md +228 -0
- package/templates/backend/.github/prompts/ai-prompt-engineering-safety-review.prompt.md +229 -0
- package/templates/backend/.github/prompts/architecture-blueprint-generator.prompt.md +321 -0
- package/templates/backend/.github/prompts/breakdown-epic-arch.prompt.md +65 -0
- package/templates/backend/.github/prompts/breakdown-epic-pm.prompt.md +57 -0
- package/templates/backend/.github/prompts/breakdown-feature-implementation.prompt.md +127 -0
- package/templates/backend/.github/prompts/breakdown-feature-prd.prompt.md +60 -0
- package/templates/backend/.github/prompts/breakdown-plan.prompt.md +508 -0
- package/templates/backend/.github/prompts/copilot-instructions-blueprint-generator.prompt.md +293 -0
- package/templates/backend/.github/prompts/create-agentsmd.prompt.md +248 -0
- package/templates/backend/.github/prompts/create-github-issue-feature-from-specification.prompt.md +27 -0
- package/templates/backend/.github/prompts/create-github-issues-feature-from-implementation-plan.prompt.md +27 -0
- package/templates/backend/.github/prompts/create-github-issues-for-unmet-specification-requirements.prompt.md +35 -0
- package/templates/backend/.github/prompts/create-implementation-plan.prompt.md +156 -0
- package/templates/backend/.github/prompts/create-llms.prompt.md +209 -0
- package/templates/backend/.github/prompts/create-specification.prompt.md +126 -0
- package/templates/backend/.github/prompts/create-technical-spike.prompt.md +230 -0
- package/templates/backend/.github/prompts/csharp-nunit.prompt.md +71 -0
- package/templates/backend/.github/prompts/ef-core.prompt.md +76 -0
- package/templates/backend/.github/prompts/folder-structure-blueprint-generator.prompt.md +404 -0
- package/templates/backend/.github/prompts/gen-specs-as-issues.prompt.md +165 -0
- package/templates/backend/.github/prompts/generate-custom-instructions-from-codebase.prompt.md +239 -0
- package/templates/backend/.github/prompts/java-junit.prompt.md +64 -0
- package/templates/backend/.github/prompts/memory-merger.prompt.md +107 -0
- package/templates/backend/.github/prompts/multi-stage-dockerfile.prompt.md +46 -0
- package/templates/backend/.github/prompts/playwright-automation-fill-in-form.prompt.md +29 -0
- package/templates/backend/.github/prompts/playwright-explore-website.prompt.md +19 -0
- package/templates/backend/.github/prompts/playwright-generate-test.prompt.md +19 -0
- package/templates/backend/.github/prompts/postgresql-code-review.prompt.md +214 -0
- package/templates/backend/.github/prompts/postgresql-optimization.prompt.md +406 -0
- package/templates/backend/.github/prompts/project-workflow-analysis-blueprint-generator.prompt.md +294 -0
- package/templates/backend/.github/prompts/prompt-builder.prompt.md +142 -0
- package/templates/backend/.github/prompts/remember.prompt.md +125 -0
- package/templates/backend/.github/prompts/review-and-refactor.prompt.md +15 -0
- package/templates/backend/.github/prompts/sql-code-review.prompt.md +303 -0
- package/templates/backend/.github/prompts/sql-optimization.prompt.md +298 -0
- package/templates/backend/.github/prompts/suggest-awesome-github-copilot-agents.prompt.md +72 -0
- package/templates/backend/.github/prompts/suggest-awesome-github-copilot-chatmodes.prompt.md +71 -0
- package/templates/backend/.github/prompts/suggest-awesome-github-copilot-collections.prompt.md +149 -0
- package/templates/backend/.github/prompts/suggest-awesome-github-copilot-instructions.prompt.md +88 -0
- package/templates/backend/.github/prompts/suggest-awesome-github-copilot-prompts.prompt.md +71 -0
- package/templates/backend/.github/prompts/technology-stack-blueprint-generator.prompt.md +242 -0
- package/templates/backend/.github/prompts/typescript-mcp-server-generator.prompt.md +90 -0
- package/templates/backend/.github/prompts/update-implementation-plan.prompt.md +157 -0
- package/templates/backend/.github/prompts/update-markdown-file-index.prompt.md +76 -0
- package/templates/backend/Project_Folders_Structure_Blueprint.md +529 -0
- package/templates/backend/README.md +99 -0
- package/templates/backend/biome.json +45 -0
- package/{template → templates/backend}/drizzle.config.ts +1 -1
- package/{template → templates/backend}/package.json +9 -4
- package/templates/backend/pnpm-lock.yaml +4240 -0
- package/templates/backend/src/features/health/health.test.ts +23 -0
- package/{template → templates/backend}/src/features/health/index.ts +1 -0
- package/templates/backend/src/features/health/schemas.ts +29 -0
- package/templates/backend/src/features/orders/controller.ts +18 -0
- package/templates/backend/src/features/orders/index.ts +10 -0
- package/templates/backend/src/features/orders/schemas.ts +62 -0
- package/{template → templates/backend}/src/index.ts +3 -36
- package/templates/backend/src/lib/openapi.ts +25 -0
- package/templates/backend/src/lib/validateRequest.test.ts +84 -0
- package/templates/backend/src/lib/validateRequest.ts +72 -0
- package/{template → templates/backend}/tsconfig.json +2 -2
- package/{template → templates/backend}/vitest.config.ts +8 -1
- package/templates/frontend/.env.example +7 -0
- package/templates/frontend/.github/agents/ /360/237/216/255 planner.agent.md" +92 -0
- package/templates/frontend/.github/agents/api-architect.agent.md +41 -0
- package/templates/frontend/.github/agents/code-reviewer.agent.md +26 -0
- package/templates/frontend/.github/agents/code-simplifier.agent.md +41 -0
- package/templates/frontend/.github/agents/code-skeptic.agent.md +74 -0
- package/templates/frontend/.github/agents/docs-specialist.agent.md +25 -0
- package/templates/frontend/.github/agents/implementation-plan.agent.md +160 -0
- package/templates/frontend/.github/agents/janitor.agent.md +90 -0
- package/templates/frontend/.github/agents/ms-sql-dba.agent.md +25 -0
- package/templates/frontend/.github/agents/plan.agent.md +115 -0
- package/templates/frontend/.github/agents/planner.agent.md +15 -0
- package/templates/frontend/.github/agents/playwright-tester.agent.md +13 -0
- package/templates/frontend/.github/agents/postgresql-dba.agent.md +18 -0
- package/templates/frontend/.github/agents/prd.agent.md +202 -0
- package/templates/frontend/.github/agents/research-technical-spike.agent.md +170 -0
- package/templates/frontend/.github/agents/software-engineer-agent-v1.agent.md +165 -0
- package/templates/frontend/.github/agents/task-planner.agent.md +375 -0
- package/templates/frontend/.github/agents/task-researcher.agent.md +255 -0
- package/templates/frontend/.github/agents/tdd-green.agent.md +60 -0
- package/templates/frontend/.github/agents/tdd-red.agent.md +60 -0
- package/templates/frontend/.github/agents/tdd-refactor.agent.md +85 -0
- package/templates/frontend/.github/agents/tech-debt-remediation-plan.agent.md +50 -0
- package/templates/frontend/.github/agents/typescript-mcp-expert.agent.md +91 -0
- package/templates/frontend/.github/agents/ultimate-thinking-beastmode.agent.md +644 -0
- package/templates/frontend/.github/agents//360/237/216/255 generator.agent.md" +264 -0
- package/templates/frontend/.github/agents//360/237/216/255 healer.agent.md" +44 -0
- package/templates/frontend/.github/agents//360/237/216/255 pom.agent.md" +308 -0
- package/templates/frontend/.github/instructions/a11y.instructions.md +369 -0
- package/templates/frontend/.github/instructions/ms-sql-dba.instructions.md +25 -0
- package/templates/frontend/.github/instructions/object-calisthenics.instructions.md +302 -0
- package/templates/frontend/.github/instructions/performance-optimization.instructions.md +420 -0
- package/templates/frontend/.github/instructions/playwright-python.instructions.md +62 -0
- package/templates/frontend/.github/instructions/playwright-typescript.instructions.md +86 -0
- package/templates/frontend/.github/instructions/security-and-owasp.instructions.md +51 -0
- package/templates/frontend/.github/instructions/self-explanatory-code-commenting.instructions.md +162 -0
- package/templates/frontend/.github/instructions/spec-driven-workflow-v1.instructions.md +323 -0
- package/templates/frontend/.github/instructions/sql-sp-generation.instructions.md +74 -0
- package/templates/frontend/.github/instructions/task-implementation.instructions.md +190 -0
- package/templates/frontend/.github/instructions/typescript-mcp-server.instructions.md +228 -0
- package/templates/frontend/.github/prompts/ai-prompt-engineering-safety-review.prompt.md +229 -0
- package/templates/frontend/.github/prompts/architecture-blueprint-generator.prompt.md +321 -0
- package/templates/frontend/.github/prompts/breakdown-epic-arch.prompt.md +65 -0
- package/templates/frontend/.github/prompts/breakdown-epic-pm.prompt.md +57 -0
- package/templates/frontend/.github/prompts/breakdown-feature-implementation.prompt.md +127 -0
- package/templates/frontend/.github/prompts/breakdown-feature-prd.prompt.md +60 -0
- package/templates/frontend/.github/prompts/breakdown-plan.prompt.md +508 -0
- package/templates/frontend/.github/prompts/copilot-instructions-blueprint-generator.prompt.md +293 -0
- package/templates/frontend/.github/prompts/create-agentsmd.prompt.md +248 -0
- package/templates/frontend/.github/prompts/create-github-issue-feature-from-specification.prompt.md +27 -0
- package/templates/frontend/.github/prompts/create-github-issues-feature-from-implementation-plan.prompt.md +27 -0
- package/templates/frontend/.github/prompts/create-github-issues-for-unmet-specification-requirements.prompt.md +35 -0
- package/templates/frontend/.github/prompts/create-implementation-plan.prompt.md +156 -0
- package/templates/frontend/.github/prompts/create-llms.prompt.md +209 -0
- package/templates/frontend/.github/prompts/create-specification.prompt.md +126 -0
- package/templates/frontend/.github/prompts/create-technical-spike.prompt.md +230 -0
- package/templates/frontend/.github/prompts/csharp-nunit.prompt.md +71 -0
- package/templates/frontend/.github/prompts/ef-core.prompt.md +76 -0
- package/templates/frontend/.github/prompts/folder-structure-blueprint-generator.prompt.md +404 -0
- package/templates/frontend/.github/prompts/gen-specs-as-issues.prompt.md +165 -0
- package/templates/frontend/.github/prompts/generate-custom-instructions-from-codebase.prompt.md +239 -0
- package/templates/frontend/.github/prompts/java-junit.prompt.md +64 -0
- package/templates/frontend/.github/prompts/memory-merger.prompt.md +107 -0
- package/templates/frontend/.github/prompts/multi-stage-dockerfile.prompt.md +46 -0
- package/templates/frontend/.github/prompts/playwright-automation-fill-in-form.prompt.md +29 -0
- package/templates/frontend/.github/prompts/playwright-explore-website.prompt.md +19 -0
- package/templates/frontend/.github/prompts/playwright-generate-test.prompt.md +19 -0
- package/templates/frontend/.github/prompts/postgresql-code-review.prompt.md +214 -0
- package/templates/frontend/.github/prompts/postgresql-optimization.prompt.md +406 -0
- package/templates/frontend/.github/prompts/project-workflow-analysis-blueprint-generator.prompt.md +294 -0
- package/templates/frontend/.github/prompts/prompt-builder.prompt.md +142 -0
- package/templates/frontend/.github/prompts/remember.prompt.md +125 -0
- package/templates/frontend/.github/prompts/review-and-refactor.prompt.md +15 -0
- package/templates/frontend/.github/prompts/sql-code-review.prompt.md +303 -0
- package/templates/frontend/.github/prompts/sql-optimization.prompt.md +298 -0
- package/templates/frontend/.github/prompts/suggest-awesome-github-copilot-agents.prompt.md +72 -0
- package/templates/frontend/.github/prompts/suggest-awesome-github-copilot-chatmodes.prompt.md +71 -0
- package/templates/frontend/.github/prompts/suggest-awesome-github-copilot-collections.prompt.md +149 -0
- package/templates/frontend/.github/prompts/suggest-awesome-github-copilot-instructions.prompt.md +88 -0
- package/templates/frontend/.github/prompts/suggest-awesome-github-copilot-prompts.prompt.md +71 -0
- package/templates/frontend/.github/prompts/technology-stack-blueprint-generator.prompt.md +242 -0
- package/templates/frontend/.github/prompts/typescript-mcp-server-generator.prompt.md +90 -0
- package/templates/frontend/.github/prompts/update-implementation-plan.prompt.md +157 -0
- package/templates/frontend/.github/prompts/update-markdown-file-index.prompt.md +76 -0
- package/templates/frontend/README.md +199 -0
- package/templates/frontend/biome.json +45 -0
- package/templates/frontend/components.json +22 -0
- package/templates/frontend/index.html +13 -0
- package/templates/frontend/package.json +44 -0
- package/templates/frontend/pnpm-lock.yaml +2011 -0
- package/templates/frontend/postcss.config.js +6 -0
- package/templates/frontend/public/vite.svg +1 -0
- package/templates/frontend/src/App.css +42 -0
- package/templates/frontend/src/App.tsx +17 -0
- package/templates/frontend/src/assets/react.svg +1 -0
- package/templates/frontend/src/components/layout/layout.component.tsx +31 -0
- package/templates/frontend/src/components/menu-toggle-icon.tsx +53 -0
- package/templates/frontend/src/components/ui/button.tsx +57 -0
- package/templates/frontend/src/docs/RECOMMENDED_LIBRARIES.md +226 -0
- package/templates/frontend/src/docs/SETUP_SUMMARY.md +162 -0
- package/templates/frontend/src/hooks/use-scroll.ts +21 -0
- package/templates/frontend/src/index.css +121 -0
- package/templates/frontend/src/lib/api-client.ts +46 -0
- package/templates/frontend/src/lib/utils.ts +6 -0
- package/templates/frontend/src/main.tsx +30 -0
- package/templates/frontend/src/pages/about/about.page.tsx +50 -0
- package/templates/frontend/src/pages/home/home.page.tsx +43 -0
- package/templates/frontend/tailwind.config.js +59 -0
- package/templates/frontend/tsconfig.app.json +41 -0
- package/templates/frontend/tsconfig.json +13 -0
- package/templates/frontend/tsconfig.node.json +26 -0
- package/templates/frontend/vite.config.ts +14 -0
- package/template/.env.example +0 -8
- package/template/AGENTS.md +0 -23
- package/template/ARCHITECTURE.md +0 -53
- package/template/ORDER_SYSTEM.md +0 -93
- package/template/biome.json +0 -3
- package/template/src/features/orders/controller.ts +0 -13
- package/template/src/features/orders/index.ts +0 -7
- /package/{template → templates/backend}/knip.json +0 -0
- /package/{template → templates/backend}/playwright.config.ts +0 -0
- /package/{template → templates/backend}/pnpm-workspace.yaml +0 -0
- /package/{template → templates/backend}/src/features/health/controller.ts +0 -0
- /package/{template → templates/backend}/tsconfig.build.json +0 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
@import "tailwindcss";
|
|
2
|
+
|
|
3
|
+
@plugin "tailwindcss-animate";
|
|
4
|
+
|
|
5
|
+
@custom-variant dark (&:is(.dark *));
|
|
6
|
+
|
|
7
|
+
@theme inline {
|
|
8
|
+
--radius-sm: calc(var(--radius) - 4px);
|
|
9
|
+
--radius-md: calc(var(--radius) - 2px);
|
|
10
|
+
--radius-lg: var(--radius);
|
|
11
|
+
--radius-xl: calc(var(--radius) + 4px);
|
|
12
|
+
--color-background: var(--background);
|
|
13
|
+
--color-foreground: var(--foreground);
|
|
14
|
+
--color-card: var(--card);
|
|
15
|
+
--color-card-foreground: var(--card-foreground);
|
|
16
|
+
--color-popover: var(--popover);
|
|
17
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
18
|
+
--color-primary: var(--primary);
|
|
19
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
20
|
+
--color-secondary: var(--secondary);
|
|
21
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
22
|
+
--color-muted: var(--muted);
|
|
23
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
24
|
+
--color-accent: var(--accent);
|
|
25
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
26
|
+
--color-destructive: var(--destructive);
|
|
27
|
+
--color-border: var(--border);
|
|
28
|
+
--color-input: var(--input);
|
|
29
|
+
--color-ring: var(--ring);
|
|
30
|
+
--color-chart-1: var(--chart-1);
|
|
31
|
+
--color-chart-2: var(--chart-2);
|
|
32
|
+
--color-chart-3: var(--chart-3);
|
|
33
|
+
--color-chart-4: var(--chart-4);
|
|
34
|
+
--color-chart-5: var(--chart-5);
|
|
35
|
+
--color-sidebar: var(--sidebar);
|
|
36
|
+
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
37
|
+
--color-sidebar-primary: var(--sidebar-primary);
|
|
38
|
+
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
39
|
+
--color-sidebar-accent: var(--sidebar-accent);
|
|
40
|
+
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
41
|
+
--color-sidebar-border: var(--sidebar-border);
|
|
42
|
+
--color-sidebar-ring: var(--sidebar-ring);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
:root {
|
|
46
|
+
--radius: 0.625rem;
|
|
47
|
+
--background: oklch(1 0 0);
|
|
48
|
+
--foreground: oklch(0.145 0 0);
|
|
49
|
+
--card: oklch(1 0 0);
|
|
50
|
+
--card-foreground: oklch(0.145 0 0);
|
|
51
|
+
--popover: oklch(1 0 0);
|
|
52
|
+
--popover-foreground: oklch(0.145 0 0);
|
|
53
|
+
--primary: oklch(0.205 0 0);
|
|
54
|
+
--primary-foreground: oklch(0.985 0 0);
|
|
55
|
+
--secondary: oklch(0.97 0 0);
|
|
56
|
+
--secondary-foreground: oklch(0.205 0 0);
|
|
57
|
+
--muted: oklch(0.97 0 0);
|
|
58
|
+
--muted-foreground: oklch(0.556 0 0);
|
|
59
|
+
--accent: oklch(0.97 0 0);
|
|
60
|
+
--accent-foreground: oklch(0.205 0 0);
|
|
61
|
+
--destructive: oklch(0.577 0.245 27.325);
|
|
62
|
+
--border: oklch(0.922 0 0);
|
|
63
|
+
--input: oklch(0.922 0 0);
|
|
64
|
+
--ring: oklch(0.708 0 0);
|
|
65
|
+
--chart-1: oklch(0.646 0.222 41.116);
|
|
66
|
+
--chart-2: oklch(0.6 0.118 184.704);
|
|
67
|
+
--chart-3: oklch(0.398 0.07 227.392);
|
|
68
|
+
--chart-4: oklch(0.828 0.189 84.429);
|
|
69
|
+
--chart-5: oklch(0.769 0.188 70.08);
|
|
70
|
+
--sidebar: oklch(0.985 0 0);
|
|
71
|
+
--sidebar-foreground: oklch(0.145 0 0);
|
|
72
|
+
--sidebar-primary: oklch(0.205 0 0);
|
|
73
|
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
74
|
+
--sidebar-accent: oklch(0.97 0 0);
|
|
75
|
+
--sidebar-accent-foreground: oklch(0.205 0 0);
|
|
76
|
+
--sidebar-border: oklch(0.922 0 0);
|
|
77
|
+
--sidebar-ring: oklch(0.708 0 0);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.dark {
|
|
81
|
+
--background: oklch(0.145 0 0);
|
|
82
|
+
--foreground: oklch(0.985 0 0);
|
|
83
|
+
--card: oklch(0.205 0 0);
|
|
84
|
+
--card-foreground: oklch(0.985 0 0);
|
|
85
|
+
--popover: oklch(0.205 0 0);
|
|
86
|
+
--popover-foreground: oklch(0.985 0 0);
|
|
87
|
+
--primary: oklch(0.922 0 0);
|
|
88
|
+
--primary-foreground: oklch(0.205 0 0);
|
|
89
|
+
--secondary: oklch(0.269 0 0);
|
|
90
|
+
--secondary-foreground: oklch(0.985 0 0);
|
|
91
|
+
--muted: oklch(0.269 0 0);
|
|
92
|
+
--muted-foreground: oklch(0.708 0 0);
|
|
93
|
+
--accent: oklch(0.269 0 0);
|
|
94
|
+
--accent-foreground: oklch(0.985 0 0);
|
|
95
|
+
--destructive: oklch(0.704 0.191 22.216);
|
|
96
|
+
--border: oklch(1 0 0 / 10%);
|
|
97
|
+
--input: oklch(1 0 0 / 15%);
|
|
98
|
+
--ring: oklch(0.556 0 0);
|
|
99
|
+
--chart-1: oklch(0.488 0.243 264.376);
|
|
100
|
+
--chart-2: oklch(0.696 0.17 162.48);
|
|
101
|
+
--chart-3: oklch(0.769 0.188 70.08);
|
|
102
|
+
--chart-4: oklch(0.627 0.265 303.9);
|
|
103
|
+
--chart-5: oklch(0.645 0.246 16.439);
|
|
104
|
+
--sidebar: oklch(0.205 0 0);
|
|
105
|
+
--sidebar-foreground: oklch(0.985 0 0);
|
|
106
|
+
--sidebar-primary: oklch(0.488 0.243 264.376);
|
|
107
|
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
108
|
+
--sidebar-accent: oklch(0.269 0 0);
|
|
109
|
+
--sidebar-accent-foreground: oklch(0.985 0 0);
|
|
110
|
+
--sidebar-border: oklch(1 0 0 / 10%);
|
|
111
|
+
--sidebar-ring: oklch(0.556 0 0);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
@layer base {
|
|
115
|
+
* {
|
|
116
|
+
@apply border-border outline-ring/50;
|
|
117
|
+
}
|
|
118
|
+
body {
|
|
119
|
+
@apply bg-background text-foreground;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// Example API client configuration
|
|
2
|
+
const API_BASE_URL = import.meta.env.VITE_API_URL || 'http://localhost:3000/api';
|
|
3
|
+
|
|
4
|
+
export const apiClient = {
|
|
5
|
+
baseUrl: API_BASE_URL,
|
|
6
|
+
|
|
7
|
+
async request<T>(endpoint: string, options?: RequestInit): Promise<T> {
|
|
8
|
+
const response = await fetch(`${this.baseUrl}${endpoint}`, {
|
|
9
|
+
headers: {
|
|
10
|
+
'Content-Type': 'application/json',
|
|
11
|
+
...options?.headers,
|
|
12
|
+
},
|
|
13
|
+
...options,
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
if (!response.ok) {
|
|
17
|
+
throw new Error(`API Error: ${response.statusText}`);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return response.json();
|
|
21
|
+
},
|
|
22
|
+
|
|
23
|
+
get<T>(endpoint: string): Promise<T> {
|
|
24
|
+
return this.request<T>(endpoint);
|
|
25
|
+
},
|
|
26
|
+
|
|
27
|
+
post<T>(endpoint: string, data: unknown): Promise<T> {
|
|
28
|
+
return this.request<T>(endpoint, {
|
|
29
|
+
method: 'POST',
|
|
30
|
+
body: JSON.stringify(data),
|
|
31
|
+
});
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
put<T>(endpoint: string, data: unknown): Promise<T> {
|
|
35
|
+
return this.request<T>(endpoint, {
|
|
36
|
+
method: 'PUT',
|
|
37
|
+
body: JSON.stringify(data),
|
|
38
|
+
});
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
delete<T>(endpoint: string): Promise<T> {
|
|
42
|
+
return this.request<T>(endpoint, {
|
|
43
|
+
method: 'DELETE',
|
|
44
|
+
});
|
|
45
|
+
},
|
|
46
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
|
2
|
+
import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
|
|
3
|
+
import { StrictMode } from 'react';
|
|
4
|
+
import { createRoot } from 'react-dom/client';
|
|
5
|
+
import { BrowserRouter } from 'react-router-dom';
|
|
6
|
+
import App from './App';
|
|
7
|
+
import './index.css';
|
|
8
|
+
|
|
9
|
+
// Create a client
|
|
10
|
+
const queryClient = new QueryClient({
|
|
11
|
+
defaultOptions: {
|
|
12
|
+
queries: {
|
|
13
|
+
staleTime: 1000 * 60 * 5, // 5 minutes
|
|
14
|
+
gcTime: 1000 * 60 * 10, // 10 minutes (formerly cacheTime)
|
|
15
|
+
refetchOnWindowFocus: false,
|
|
16
|
+
retry: 1,
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
createRoot(document.getElementById('root')!).render(
|
|
22
|
+
<StrictMode>
|
|
23
|
+
<QueryClientProvider client={queryClient}>
|
|
24
|
+
<BrowserRouter>
|
|
25
|
+
<App />
|
|
26
|
+
</BrowserRouter>
|
|
27
|
+
<ReactQueryDevtools initialIsOpen={false} />
|
|
28
|
+
</QueryClientProvider>
|
|
29
|
+
</StrictMode>,
|
|
30
|
+
);
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export function AboutPage() {
|
|
2
|
+
return (
|
|
3
|
+
<div className="space-y-6">
|
|
4
|
+
<h1 className="text-4xl font-bold">About</h1>
|
|
5
|
+
<div className="prose dark:prose-invert max-w-none">
|
|
6
|
+
<p>
|
|
7
|
+
This is a modern React starter kit with a carefully selected stack of tools and
|
|
8
|
+
libraries.
|
|
9
|
+
</p>
|
|
10
|
+
<h2 className="text-2xl font-semibold mt-6 mb-3">Tech Stack</h2>
|
|
11
|
+
<ul className="space-y-2">
|
|
12
|
+
<li>
|
|
13
|
+
<strong>React 19</strong> - Latest React with improved performance
|
|
14
|
+
</li>
|
|
15
|
+
<li>
|
|
16
|
+
<strong>TypeScript</strong> - Type-safe development
|
|
17
|
+
</li>
|
|
18
|
+
<li>
|
|
19
|
+
<strong>Vite</strong> - Fast build tool and dev server
|
|
20
|
+
</li>
|
|
21
|
+
<li>
|
|
22
|
+
<strong>Tailwind CSS</strong> - Utility-first CSS framework
|
|
23
|
+
</li>
|
|
24
|
+
<li>
|
|
25
|
+
<strong>shadcn/ui</strong> - Beautiful, accessible components
|
|
26
|
+
</li>
|
|
27
|
+
<li>
|
|
28
|
+
<strong>TanStack Query</strong> - Powerful data fetching and caching
|
|
29
|
+
</li>
|
|
30
|
+
<li>
|
|
31
|
+
<strong>React Router</strong> - Client-side routing
|
|
32
|
+
</li>
|
|
33
|
+
<li>
|
|
34
|
+
<strong>Drizzle ORM</strong> - Type-safe database access
|
|
35
|
+
</li>
|
|
36
|
+
<li>
|
|
37
|
+
<strong>Biome</strong> - Fast linter and formatter
|
|
38
|
+
</li>
|
|
39
|
+
</ul>
|
|
40
|
+
<h2 className="text-2xl font-semibold mt-6 mb-3">Adding shadcn/ui Components</h2>
|
|
41
|
+
<p>
|
|
42
|
+
To add shadcn/ui components, use the CLI. For example, to add a button component:
|
|
43
|
+
</p>
|
|
44
|
+
<pre className="bg-muted p-4 rounded-lg overflow-x-auto">
|
|
45
|
+
<code>pnpm dlx shadcn@latest add button</code>
|
|
46
|
+
</pre>
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
);
|
|
50
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { useQuery } from '@tanstack/react-query';
|
|
2
|
+
|
|
3
|
+
// Example query function
|
|
4
|
+
async function fetchWelcomeMessage() {
|
|
5
|
+
// Replace with actual API call
|
|
6
|
+
return new Promise<string>((resolve) => {
|
|
7
|
+
setTimeout(() => resolve('Welcome to the Starter Kit!'), 500);
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function HomePage() {
|
|
12
|
+
const { data, isLoading } = useQuery({
|
|
13
|
+
queryKey: ['welcome'],
|
|
14
|
+
queryFn: fetchWelcomeMessage,
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<div className="space-y-6">
|
|
19
|
+
<h1 className="text-4xl font-bold">Home Page</h1>
|
|
20
|
+
{isLoading ? (
|
|
21
|
+
<p className="text-muted-foreground">Loading...</p>
|
|
22
|
+
) : (
|
|
23
|
+
<p className="text-lg">{data}</p>
|
|
24
|
+
)}
|
|
25
|
+
<div className="space-y-4">
|
|
26
|
+
<p className="text-muted-foreground">
|
|
27
|
+
This is an example home page with TanStack Query integration.
|
|
28
|
+
</p>
|
|
29
|
+
<div className="rounded-lg border p-4">
|
|
30
|
+
<h2 className="text-xl font-semibold mb-2">Features included:</h2>
|
|
31
|
+
<ul className="list-disc list-inside space-y-1 text-sm">
|
|
32
|
+
<li>React Router for navigation</li>
|
|
33
|
+
<li>TanStack Query for data fetching</li>
|
|
34
|
+
<li>Tailwind CSS for styling</li>
|
|
35
|
+
<li>shadcn/ui ready (use CLI to add components)</li>
|
|
36
|
+
<li>Drizzle ORM integration</li>
|
|
37
|
+
<li>Biome for linting and formatting</li>
|
|
38
|
+
</ul>
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
);
|
|
43
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import tailwindcssAnimate from 'tailwindcss-animate';
|
|
2
|
+
|
|
3
|
+
/** @type {import('tailwindcss').Config} */
|
|
4
|
+
export default {
|
|
5
|
+
darkMode: ['class'],
|
|
6
|
+
content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'],
|
|
7
|
+
theme: {
|
|
8
|
+
extend: {
|
|
9
|
+
borderRadius: {
|
|
10
|
+
lg: 'var(--radius)',
|
|
11
|
+
md: 'calc(var(--radius) - 2px)',
|
|
12
|
+
sm: 'calc(var(--radius) - 4px)',
|
|
13
|
+
},
|
|
14
|
+
colors: {
|
|
15
|
+
background: 'hsl(var(--background))',
|
|
16
|
+
foreground: 'hsl(var(--foreground))',
|
|
17
|
+
card: {
|
|
18
|
+
DEFAULT: 'hsl(var(--card))',
|
|
19
|
+
foreground: 'hsl(var(--card-foreground))',
|
|
20
|
+
},
|
|
21
|
+
popover: {
|
|
22
|
+
DEFAULT: 'hsl(var(--popover))',
|
|
23
|
+
foreground: 'hsl(var(--popover-foreground))',
|
|
24
|
+
},
|
|
25
|
+
primary: {
|
|
26
|
+
DEFAULT: 'hsl(var(--primary))',
|
|
27
|
+
foreground: 'hsl(var(--primary-foreground))',
|
|
28
|
+
},
|
|
29
|
+
secondary: {
|
|
30
|
+
DEFAULT: 'hsl(var(--secondary))',
|
|
31
|
+
foreground: 'hsl(var(--secondary-foreground))',
|
|
32
|
+
},
|
|
33
|
+
muted: {
|
|
34
|
+
DEFAULT: 'hsl(var(--muted))',
|
|
35
|
+
foreground: 'hsl(var(--muted-foreground))',
|
|
36
|
+
},
|
|
37
|
+
accent: {
|
|
38
|
+
DEFAULT: 'hsl(var(--accent))',
|
|
39
|
+
foreground: 'hsl(var(--accent-foreground))',
|
|
40
|
+
},
|
|
41
|
+
destructive: {
|
|
42
|
+
DEFAULT: 'hsl(var(--destructive))',
|
|
43
|
+
foreground: 'hsl(var(--destructive-foreground))',
|
|
44
|
+
},
|
|
45
|
+
border: 'hsl(var(--border))',
|
|
46
|
+
input: 'hsl(var(--input))',
|
|
47
|
+
ring: 'hsl(var(--ring))',
|
|
48
|
+
chart: {
|
|
49
|
+
1: 'hsl(var(--chart-1))',
|
|
50
|
+
2: 'hsl(var(--chart-2))',
|
|
51
|
+
3: 'hsl(var(--chart-3))',
|
|
52
|
+
4: 'hsl(var(--chart-4))',
|
|
53
|
+
5: 'hsl(var(--chart-5))',
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
plugins: [tailwindcssAnimate],
|
|
59
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
|
4
|
+
"target": "ES2022",
|
|
5
|
+
"useDefineForClassFields": true,
|
|
6
|
+
"lib": [
|
|
7
|
+
"ES2022",
|
|
8
|
+
"DOM",
|
|
9
|
+
"DOM.Iterable"
|
|
10
|
+
],
|
|
11
|
+
"module": "ESNext",
|
|
12
|
+
"types": [
|
|
13
|
+
"vite/client"
|
|
14
|
+
],
|
|
15
|
+
"skipLibCheck": true,
|
|
16
|
+
/* Bundler mode */
|
|
17
|
+
"moduleResolution": "bundler",
|
|
18
|
+
"allowImportingTsExtensions": true,
|
|
19
|
+
"verbatimModuleSyntax": true,
|
|
20
|
+
"moduleDetection": "force",
|
|
21
|
+
"noEmit": true,
|
|
22
|
+
"jsx": "react-jsx",
|
|
23
|
+
/* Linting */
|
|
24
|
+
"strict": true,
|
|
25
|
+
"noUnusedLocals": true,
|
|
26
|
+
"noUnusedParameters": true,
|
|
27
|
+
"erasableSyntaxOnly": true,
|
|
28
|
+
"noFallthroughCasesInSwitch": true,
|
|
29
|
+
"noUncheckedSideEffectImports": true,
|
|
30
|
+
/* Path Aliases */
|
|
31
|
+
"baseUrl": ".",
|
|
32
|
+
"paths": {
|
|
33
|
+
"@/*": [
|
|
34
|
+
"./src/*"
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"include": [
|
|
39
|
+
"src"
|
|
40
|
+
]
|
|
41
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
|
|
4
|
+
"target": "ES2023",
|
|
5
|
+
"lib": ["ES2023"],
|
|
6
|
+
"module": "ESNext",
|
|
7
|
+
"types": ["node"],
|
|
8
|
+
"skipLibCheck": true,
|
|
9
|
+
|
|
10
|
+
/* Bundler mode */
|
|
11
|
+
"moduleResolution": "bundler",
|
|
12
|
+
"allowImportingTsExtensions": true,
|
|
13
|
+
"verbatimModuleSyntax": true,
|
|
14
|
+
"moduleDetection": "force",
|
|
15
|
+
"noEmit": true,
|
|
16
|
+
|
|
17
|
+
/* Linting */
|
|
18
|
+
"strict": true,
|
|
19
|
+
"noUnusedLocals": true,
|
|
20
|
+
"noUnusedParameters": true,
|
|
21
|
+
"erasableSyntaxOnly": true,
|
|
22
|
+
"noFallthroughCasesInSwitch": true,
|
|
23
|
+
"noUncheckedSideEffectImports": true
|
|
24
|
+
},
|
|
25
|
+
"include": ["vite.config.ts"]
|
|
26
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import tailwindcss from "@tailwindcss/vite"
|
|
3
|
+
import react from '@vitejs/plugin-react-swc';
|
|
4
|
+
import { defineConfig } from 'vite';
|
|
5
|
+
|
|
6
|
+
// https://vite.dev/config/
|
|
7
|
+
export default defineConfig({
|
|
8
|
+
plugins: [react(), tailwindcss()],
|
|
9
|
+
resolve: {
|
|
10
|
+
alias: {
|
|
11
|
+
'@': path.resolve(__dirname, './src'),
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
});
|
package/template/.env.example
DELETED
package/template/AGENTS.md
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
# Repository Guidelines
|
|
2
|
-
|
|
3
|
-
## Project Structure & Module Organization
|
|
4
|
-
TypeScript sources live in `src/`, with graph traversal logic under `src/graph/` (crawl policy, state hashing, trajectory storage) and telemetry helpers in `src/telemetry.ts`. Example entrypoints such as `src/demo.ts` show how agents orchestrate flows. Generated JavaScript lands in `build/` (never hand-edit). Documentation and design notes are under `docs/`, and replay artifacts persist to `storage/` while running crawls or demo scripts. Keep tests adjacent to the code (for example `src/graph/xstate.test.ts`).
|
|
5
|
-
|
|
6
|
-
## Build, Test, and Development Commands
|
|
7
|
-
- `pnpm install`: sets up dependencies for both the CLI and Playwright runtime.
|
|
8
|
-
- `pnpm typecheck`: runs `tsc --noEmit` against `tsconfig.json` to catch type regressions early.
|
|
9
|
-
- `pnpm build`: compiles `src/` to ESM output in `build/` via SWC; use `pnpm build:debug` when you need source maps.
|
|
10
|
-
- `pnpm test`, `pnpm test:watch`, `pnpm test:ui`: execute the Vitest suite in batch, watch, or UI mode.
|
|
11
|
-
- `pnpm knip`: detects unused files, exports, and dependencies—fix warnings before raising a PR.
|
|
12
|
-
|
|
13
|
-
## Coding Style & Naming Conventions
|
|
14
|
-
Follow the repository's Biome configuration (`biome.json`) and run `npx biome check .` if needed. Use 2-space indentation, TypeScript `strict` semantics, and ECMAScript modules (`import/export`). Exported symbols and files should read as actions or nouns (`discoverState`, `persist.ts`). Tests mirror the file under test (`xstate.test.ts`). Prefer descriptive async function names reflecting their side effects.
|
|
15
|
-
|
|
16
|
-
## Testing Guidelines
|
|
17
|
-
Vitest drives all unit and integration coverage. Name suites after the module (`describe("bfs")`) and isolate Playwright-heavy tests behind capability checks to keep CI fast. New behavior must include at least one test validating failure handling and a corresponding happy path. Run `pnpm test` locally before committing; `storage/` fixtures may be stubbed with lightweight mocks to avoid hitting real browsers.
|
|
18
|
-
|
|
19
|
-
## Commit & Pull Request Guidelines
|
|
20
|
-
Use imperative, conventional messages observed in history (`feat:`, `chore:`, `fix:`). One logical change per commit, referencing an issue ID when relevant. Pull requests should describe motivation, summarize testing (`pnpm test` output, screenshots for Playwright interactions), and link design docs in `docs/` if expanded. Request review from an owner when touching crawl policy or telemetry layers, and ensure CI (typecheck, build, tests) passes before assignment.
|
|
21
|
-
|
|
22
|
-
## Environment & Configuration Tips
|
|
23
|
-
Configure credentials through `.env` files consumed by Crawlee/Playwright—never hard-code tokens. For telemetry, set OpenTelemetry exporters via environment variables before running demos. Heavy crawls persist checkpoints to `storage/`; clean stale runs before committing to keep diffs focused.
|
package/template/ARCHITECTURE.md
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
# Architecture Pattern Examples
|
|
2
|
-
|
|
3
|
-
This starter kit demonstrates a blend of patterns from **"Designing Data-Intensive Applications"** and **"Patterns of Enterprise Application Architecture"**.
|
|
4
|
-
|
|
5
|
-
## Order System Example
|
|
6
|
-
|
|
7
|
-
### From Designing Data-Intensive Applications (DDIA):
|
|
8
|
-
|
|
9
|
-
1. **Event Sourcing** - All state changes stored as immutable events
|
|
10
|
-
- `order.entity.ts`: Events are the source of truth
|
|
11
|
-
- Events: `OrderCreated`, `ItemAdded`, `OrderPlaced`
|
|
12
|
-
|
|
13
|
-
2. **CQRS (Command Query Responsibility Segregation)**
|
|
14
|
-
- Commands: `commands.usecase.ts` - Write operations that generate events
|
|
15
|
-
- Queries: `queries.usecase.ts` - Read operations from materialized views
|
|
16
|
-
|
|
17
|
-
3. **Materialized Views** - Denormalized data for fast queries
|
|
18
|
-
- `order.repository.impl.ts`: `readModel` maintains pre-computed summaries
|
|
19
|
-
- User index for O(1) lookups by user ID
|
|
20
|
-
|
|
21
|
-
4. **Append-Only Log** - Event store never modifies existing data
|
|
22
|
-
- New events are appended, never updated or deleted
|
|
23
|
-
|
|
24
|
-
### From Patterns of Enterprise Application Architecture (PEAA):
|
|
25
|
-
|
|
26
|
-
1. **Repository Pattern** - Abstract data access
|
|
27
|
-
- `order.repository.ts`: Interface defining data operations
|
|
28
|
-
- Separates domain logic from persistence
|
|
29
|
-
|
|
30
|
-
2. **Domain Model** - Rich business logic in entities
|
|
31
|
-
- `order.entity.ts`: Order entity with business rules and validation
|
|
32
|
-
|
|
33
|
-
3. **Use Case / Service Layer** - Application logic orchestration
|
|
34
|
-
- Commands and queries as separate use cases
|
|
35
|
-
- Transaction boundaries and workflow management
|
|
36
|
-
|
|
37
|
-
## API Endpoints
|
|
38
|
-
|
|
39
|
-
```
|
|
40
|
-
POST /orders # Create new order
|
|
41
|
-
POST /orders/:id/items # Add item to order
|
|
42
|
-
POST /orders/:id/place # Place order
|
|
43
|
-
GET /orders/:id # Get order details
|
|
44
|
-
GET /orders/user/:userId # Get user's orders (fast via materialized view)
|
|
45
|
-
GET /orders/:id/events # Get event stream (audit log)
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
## Key Benefits
|
|
49
|
-
|
|
50
|
-
- **Scalability**: Read/write separation allows independent scaling
|
|
51
|
-
- **Auditability**: Complete event history for compliance/debugging
|
|
52
|
-
- **Performance**: Materialized views optimize common queries
|
|
53
|
-
- **Maintainability**: Clean architecture with separated concerns
|
package/template/ORDER_SYSTEM.md
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
# Order System with Drizzle ORM
|
|
2
|
-
|
|
3
|
-
## Setup
|
|
4
|
-
|
|
5
|
-
### 1. Environment Variables
|
|
6
|
-
|
|
7
|
-
Create a `.env` file:
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
# Optional: PostgreSQL connection (if not set, uses in-memory)
|
|
11
|
-
DATABASE_URL=postgres://user:password@localhost:5432/orders_db
|
|
12
|
-
|
|
13
|
-
PORT=3000
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
### 2. Database Setup (Optional - for PostgreSQL)
|
|
17
|
-
|
|
18
|
-
If you want to use PostgreSQL instead of in-memory storage:
|
|
19
|
-
|
|
20
|
-
```bash
|
|
21
|
-
# Generate migration
|
|
22
|
-
pnpm drizzle-kit generate
|
|
23
|
-
|
|
24
|
-
# Run migration
|
|
25
|
-
pnpm drizzle-kit migrate
|
|
26
|
-
|
|
27
|
-
# Or use push for development
|
|
28
|
-
pnpm drizzle-kit push
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
### 3. Run the Server
|
|
32
|
-
|
|
33
|
-
```bash
|
|
34
|
-
# Development
|
|
35
|
-
pnpm dev
|
|
36
|
-
|
|
37
|
-
# Production
|
|
38
|
-
pnpm build
|
|
39
|
-
pnpm start
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
## API Endpoints
|
|
43
|
-
|
|
44
|
-
Base URL: `http://localhost:3000/api`
|
|
45
|
-
|
|
46
|
-
### Create Order
|
|
47
|
-
```bash
|
|
48
|
-
POST /api/orders
|
|
49
|
-
Content-Type: application/json
|
|
50
|
-
|
|
51
|
-
{
|
|
52
|
-
"userId": "550e8400-e29b-41d4-a716-446655440000"
|
|
53
|
-
}
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
### Add Item to Order
|
|
57
|
-
```bash
|
|
58
|
-
POST /api/orders/:orderId/items
|
|
59
|
-
Content-Type: application/json
|
|
60
|
-
|
|
61
|
-
{
|
|
62
|
-
"productId": "660e8400-e29b-41d4-a716-446655440000",
|
|
63
|
-
"quantity": 2,
|
|
64
|
-
"price": 29.99
|
|
65
|
-
}
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
### Place Order
|
|
69
|
-
```bash
|
|
70
|
-
POST /api/orders/:orderId/place
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
### Get Order Details
|
|
74
|
-
```bash
|
|
75
|
-
GET /api/orders/:orderId
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
### Get User's Orders (Fast - from materialized view)
|
|
79
|
-
```bash
|
|
80
|
-
GET /api/orders/user/:userId
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
### Get Order Event Stream (Audit log)
|
|
84
|
-
```bash
|
|
85
|
-
GET /api/orders/:orderId/events
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
## Architecture
|
|
89
|
-
|
|
90
|
-
- **No DATABASE_URL**: Uses in-memory repository (for testing/demo)
|
|
91
|
-
- **With DATABASE_URL**: Uses Drizzle ORM with PostgreSQL
|
|
92
|
-
- Event Sourcing with materialized views for optimal read performance
|
|
93
|
-
- CQRS pattern with separate command and query operations
|
package/template/biome.json
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { Request, Response } from 'ultimate-express';
|
|
2
|
-
|
|
3
|
-
export const getOrders = (req: Request, res: Response) => {
|
|
4
|
-
res.json([
|
|
5
|
-
{ id: 1, item: 'Laptop', price: 1200 },
|
|
6
|
-
{ id: 2, item: 'Mouse', price: 25 },
|
|
7
|
-
]);
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
export const createOrder = (req: Request, res: Response) => {
|
|
11
|
-
const { item, price } = req.body;
|
|
12
|
-
res.status(201).json({ id: 3, item, price });
|
|
13
|
-
};
|
|
File without changes
|
|
File without changes
|
|
File without changes
|