solokit 0.1.1__py3-none-any.whl
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.
- solokit/__init__.py +10 -0
- solokit/__version__.py +3 -0
- solokit/cli.py +374 -0
- solokit/core/__init__.py +1 -0
- solokit/core/cache.py +102 -0
- solokit/core/command_runner.py +278 -0
- solokit/core/config.py +453 -0
- solokit/core/config_validator.py +204 -0
- solokit/core/constants.py +291 -0
- solokit/core/error_formatter.py +279 -0
- solokit/core/error_handlers.py +346 -0
- solokit/core/exceptions.py +1567 -0
- solokit/core/file_ops.py +309 -0
- solokit/core/logging_config.py +166 -0
- solokit/core/output.py +99 -0
- solokit/core/performance.py +57 -0
- solokit/core/protocols.py +141 -0
- solokit/core/types.py +312 -0
- solokit/deployment/__init__.py +1 -0
- solokit/deployment/executor.py +411 -0
- solokit/git/__init__.py +1 -0
- solokit/git/integration.py +619 -0
- solokit/init/__init__.py +41 -0
- solokit/init/claude_commands_installer.py +87 -0
- solokit/init/dependency_installer.py +313 -0
- solokit/init/docs_structure.py +90 -0
- solokit/init/env_generator.py +160 -0
- solokit/init/environment_validator.py +334 -0
- solokit/init/git_hooks_installer.py +71 -0
- solokit/init/git_setup.py +188 -0
- solokit/init/gitignore_updater.py +195 -0
- solokit/init/initial_commit.py +145 -0
- solokit/init/initial_scans.py +109 -0
- solokit/init/orchestrator.py +246 -0
- solokit/init/readme_generator.py +207 -0
- solokit/init/session_structure.py +239 -0
- solokit/init/template_installer.py +424 -0
- solokit/learning/__init__.py +1 -0
- solokit/learning/archiver.py +115 -0
- solokit/learning/categorizer.py +126 -0
- solokit/learning/curator.py +428 -0
- solokit/learning/extractor.py +352 -0
- solokit/learning/reporter.py +351 -0
- solokit/learning/repository.py +254 -0
- solokit/learning/similarity.py +342 -0
- solokit/learning/validator.py +144 -0
- solokit/project/__init__.py +1 -0
- solokit/project/init.py +1162 -0
- solokit/project/stack.py +436 -0
- solokit/project/sync_plugin.py +438 -0
- solokit/project/tree.py +375 -0
- solokit/quality/__init__.py +1 -0
- solokit/quality/api_validator.py +424 -0
- solokit/quality/checkers/__init__.py +25 -0
- solokit/quality/checkers/base.py +114 -0
- solokit/quality/checkers/context7.py +221 -0
- solokit/quality/checkers/custom.py +162 -0
- solokit/quality/checkers/deployment.py +323 -0
- solokit/quality/checkers/documentation.py +179 -0
- solokit/quality/checkers/formatting.py +161 -0
- solokit/quality/checkers/integration.py +394 -0
- solokit/quality/checkers/linting.py +159 -0
- solokit/quality/checkers/security.py +261 -0
- solokit/quality/checkers/spec_completeness.py +127 -0
- solokit/quality/checkers/tests.py +184 -0
- solokit/quality/env_validator.py +306 -0
- solokit/quality/gates.py +655 -0
- solokit/quality/reporters/__init__.py +10 -0
- solokit/quality/reporters/base.py +25 -0
- solokit/quality/reporters/console.py +98 -0
- solokit/quality/reporters/json_reporter.py +34 -0
- solokit/quality/results.py +98 -0
- solokit/session/__init__.py +1 -0
- solokit/session/briefing/__init__.py +245 -0
- solokit/session/briefing/documentation_loader.py +53 -0
- solokit/session/briefing/formatter.py +476 -0
- solokit/session/briefing/git_context.py +282 -0
- solokit/session/briefing/learning_loader.py +212 -0
- solokit/session/briefing/milestone_builder.py +78 -0
- solokit/session/briefing/orchestrator.py +137 -0
- solokit/session/briefing/stack_detector.py +51 -0
- solokit/session/briefing/tree_generator.py +52 -0
- solokit/session/briefing/work_item_loader.py +209 -0
- solokit/session/briefing.py +353 -0
- solokit/session/complete.py +1188 -0
- solokit/session/status.py +246 -0
- solokit/session/validate.py +452 -0
- solokit/templates/.claude/commands/end.md +109 -0
- solokit/templates/.claude/commands/init.md +159 -0
- solokit/templates/.claude/commands/learn-curate.md +88 -0
- solokit/templates/.claude/commands/learn-search.md +62 -0
- solokit/templates/.claude/commands/learn-show.md +69 -0
- solokit/templates/.claude/commands/learn.md +136 -0
- solokit/templates/.claude/commands/start.md +114 -0
- solokit/templates/.claude/commands/status.md +22 -0
- solokit/templates/.claude/commands/validate.md +27 -0
- solokit/templates/.claude/commands/work-delete.md +119 -0
- solokit/templates/.claude/commands/work-graph.md +139 -0
- solokit/templates/.claude/commands/work-list.md +26 -0
- solokit/templates/.claude/commands/work-new.md +114 -0
- solokit/templates/.claude/commands/work-next.md +25 -0
- solokit/templates/.claude/commands/work-show.md +24 -0
- solokit/templates/.claude/commands/work-update.md +141 -0
- solokit/templates/CHANGELOG.md +17 -0
- solokit/templates/WORK_ITEM_TYPES.md +141 -0
- solokit/templates/__init__.py +1 -0
- solokit/templates/bug_spec.md +217 -0
- solokit/templates/config.schema.json +150 -0
- solokit/templates/dashboard_refine/base/.gitignore +36 -0
- solokit/templates/dashboard_refine/base/app/(dashboard)/layout.tsx +22 -0
- solokit/templates/dashboard_refine/base/app/(dashboard)/page.tsx +68 -0
- solokit/templates/dashboard_refine/base/app/(dashboard)/users/page.tsx +77 -0
- solokit/templates/dashboard_refine/base/app/globals.css +60 -0
- solokit/templates/dashboard_refine/base/app/layout.tsx +23 -0
- solokit/templates/dashboard_refine/base/app/page.tsx +9 -0
- solokit/templates/dashboard_refine/base/components/client-refine-wrapper.tsx +21 -0
- solokit/templates/dashboard_refine/base/components/layout/header.tsx +44 -0
- solokit/templates/dashboard_refine/base/components/layout/sidebar.tsx +82 -0
- solokit/templates/dashboard_refine/base/components/ui/button.tsx +53 -0
- solokit/templates/dashboard_refine/base/components/ui/card.tsx +78 -0
- solokit/templates/dashboard_refine/base/components/ui/table.tsx +116 -0
- solokit/templates/dashboard_refine/base/components.json +16 -0
- solokit/templates/dashboard_refine/base/lib/refine.tsx +65 -0
- solokit/templates/dashboard_refine/base/lib/utils.ts +13 -0
- solokit/templates/dashboard_refine/base/next.config.ts +10 -0
- solokit/templates/dashboard_refine/base/package.json.template +40 -0
- solokit/templates/dashboard_refine/base/postcss.config.mjs +8 -0
- solokit/templates/dashboard_refine/base/providers/refine-provider.tsx +26 -0
- solokit/templates/dashboard_refine/base/tailwind.config.ts +57 -0
- solokit/templates/dashboard_refine/base/tsconfig.json +27 -0
- solokit/templates/dashboard_refine/docker/Dockerfile +57 -0
- solokit/templates/dashboard_refine/docker/docker-compose.prod.yml +31 -0
- solokit/templates/dashboard_refine/docker/docker-compose.yml +21 -0
- solokit/templates/dashboard_refine/tier-1-essential/.eslintrc.json +7 -0
- solokit/templates/dashboard_refine/tier-1-essential/jest.config.ts +17 -0
- solokit/templates/dashboard_refine/tier-1-essential/jest.setup.ts +1 -0
- solokit/templates/dashboard_refine/tier-1-essential/package.json.tier1.template +57 -0
- solokit/templates/dashboard_refine/tier-1-essential/tests/setup.ts +26 -0
- solokit/templates/dashboard_refine/tier-1-essential/tests/unit/example.test.tsx +73 -0
- solokit/templates/dashboard_refine/tier-2-standard/package.json.tier2.template +62 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/eslint.config.mjs +22 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/package.json.tier3.template +79 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/playwright.config.ts +66 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/stryker.conf.json +38 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/tests/e2e/dashboard.spec.ts +88 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/tests/e2e/user-management.spec.ts +102 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/tests/integration/dashboard.test.tsx +90 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/type-coverage.json +16 -0
- solokit/templates/dashboard_refine/tier-4-production/instrumentation.ts +9 -0
- solokit/templates/dashboard_refine/tier-4-production/k6/dashboard-load-test.js +70 -0
- solokit/templates/dashboard_refine/tier-4-production/next.config.ts +46 -0
- solokit/templates/dashboard_refine/tier-4-production/package.json.tier4.template +89 -0
- solokit/templates/dashboard_refine/tier-4-production/sentry.client.config.ts +26 -0
- solokit/templates/dashboard_refine/tier-4-production/sentry.edge.config.ts +11 -0
- solokit/templates/dashboard_refine/tier-4-production/sentry.server.config.ts +11 -0
- solokit/templates/deployment_spec.md +500 -0
- solokit/templates/feature_spec.md +248 -0
- solokit/templates/fullstack_nextjs/base/.gitignore +36 -0
- solokit/templates/fullstack_nextjs/base/app/api/example/route.ts +65 -0
- solokit/templates/fullstack_nextjs/base/app/globals.css +27 -0
- solokit/templates/fullstack_nextjs/base/app/layout.tsx +20 -0
- solokit/templates/fullstack_nextjs/base/app/page.tsx +32 -0
- solokit/templates/fullstack_nextjs/base/components/example-component.tsx +20 -0
- solokit/templates/fullstack_nextjs/base/lib/prisma.ts +17 -0
- solokit/templates/fullstack_nextjs/base/lib/utils.ts +13 -0
- solokit/templates/fullstack_nextjs/base/lib/validations.ts +20 -0
- solokit/templates/fullstack_nextjs/base/next.config.ts +7 -0
- solokit/templates/fullstack_nextjs/base/package.json.template +32 -0
- solokit/templates/fullstack_nextjs/base/postcss.config.mjs +8 -0
- solokit/templates/fullstack_nextjs/base/prisma/schema.prisma +21 -0
- solokit/templates/fullstack_nextjs/base/tailwind.config.ts +19 -0
- solokit/templates/fullstack_nextjs/base/tsconfig.json +27 -0
- solokit/templates/fullstack_nextjs/docker/Dockerfile +60 -0
- solokit/templates/fullstack_nextjs/docker/docker-compose.prod.yml +57 -0
- solokit/templates/fullstack_nextjs/docker/docker-compose.yml +47 -0
- solokit/templates/fullstack_nextjs/tier-1-essential/.eslintrc.json +7 -0
- solokit/templates/fullstack_nextjs/tier-1-essential/jest.config.ts +17 -0
- solokit/templates/fullstack_nextjs/tier-1-essential/jest.setup.ts +1 -0
- solokit/templates/fullstack_nextjs/tier-1-essential/package.json.tier1.template +48 -0
- solokit/templates/fullstack_nextjs/tier-1-essential/tests/api/example.test.ts +88 -0
- solokit/templates/fullstack_nextjs/tier-1-essential/tests/setup.ts +22 -0
- solokit/templates/fullstack_nextjs/tier-1-essential/tests/unit/example.test.tsx +22 -0
- solokit/templates/fullstack_nextjs/tier-2-standard/package.json.tier2.template +52 -0
- solokit/templates/fullstack_nextjs/tier-3-comprehensive/eslint.config.mjs +39 -0
- solokit/templates/fullstack_nextjs/tier-3-comprehensive/package.json.tier3.template +68 -0
- solokit/templates/fullstack_nextjs/tier-3-comprehensive/playwright.config.ts +66 -0
- solokit/templates/fullstack_nextjs/tier-3-comprehensive/stryker.conf.json +33 -0
- solokit/templates/fullstack_nextjs/tier-3-comprehensive/tests/e2e/flow.spec.ts +59 -0
- solokit/templates/fullstack_nextjs/tier-3-comprehensive/tests/integration/api.test.ts +165 -0
- solokit/templates/fullstack_nextjs/tier-3-comprehensive/type-coverage.json +12 -0
- solokit/templates/fullstack_nextjs/tier-4-production/instrumentation.ts +9 -0
- solokit/templates/fullstack_nextjs/tier-4-production/k6/load-test.js +45 -0
- solokit/templates/fullstack_nextjs/tier-4-production/next.config.ts +46 -0
- solokit/templates/fullstack_nextjs/tier-4-production/package.json.tier4.template +77 -0
- solokit/templates/fullstack_nextjs/tier-4-production/sentry.client.config.ts +26 -0
- solokit/templates/fullstack_nextjs/tier-4-production/sentry.edge.config.ts +11 -0
- solokit/templates/fullstack_nextjs/tier-4-production/sentry.server.config.ts +11 -0
- solokit/templates/git-hooks/prepare-commit-msg +24 -0
- solokit/templates/integration_test_spec.md +363 -0
- solokit/templates/learnings.json +15 -0
- solokit/templates/ml_ai_fastapi/base/.gitignore +104 -0
- solokit/templates/ml_ai_fastapi/base/alembic/env.py +96 -0
- solokit/templates/ml_ai_fastapi/base/alembic.ini +114 -0
- solokit/templates/ml_ai_fastapi/base/pyproject.toml.template +91 -0
- solokit/templates/ml_ai_fastapi/base/requirements.txt.template +28 -0
- solokit/templates/ml_ai_fastapi/base/src/__init__.py +5 -0
- solokit/templates/ml_ai_fastapi/base/src/api/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/base/src/api/dependencies.py +20 -0
- solokit/templates/ml_ai_fastapi/base/src/api/routes/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/base/src/api/routes/example.py +134 -0
- solokit/templates/ml_ai_fastapi/base/src/api/routes/health.py +66 -0
- solokit/templates/ml_ai_fastapi/base/src/core/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/base/src/core/config.py +64 -0
- solokit/templates/ml_ai_fastapi/base/src/core/database.py +50 -0
- solokit/templates/ml_ai_fastapi/base/src/main.py +64 -0
- solokit/templates/ml_ai_fastapi/base/src/models/__init__.py +7 -0
- solokit/templates/ml_ai_fastapi/base/src/models/example.py +61 -0
- solokit/templates/ml_ai_fastapi/base/src/services/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/base/src/services/example.py +115 -0
- solokit/templates/ml_ai_fastapi/docker/Dockerfile +59 -0
- solokit/templates/ml_ai_fastapi/docker/docker-compose.prod.yml +112 -0
- solokit/templates/ml_ai_fastapi/docker/docker-compose.yml +77 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/pyproject.toml.tier1.template +112 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/pyrightconfig.json +41 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/pytest.ini +69 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/requirements-dev.txt +17 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/ruff.toml +81 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/tests/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/tests/conftest.py +72 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/tests/test_main.py +49 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/tests/unit/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/tests/unit/test_example.py +113 -0
- solokit/templates/ml_ai_fastapi/tier-2-standard/pyproject.toml.tier2.template +130 -0
- solokit/templates/ml_ai_fastapi/tier-3-comprehensive/locustfile.py +99 -0
- solokit/templates/ml_ai_fastapi/tier-3-comprehensive/mutmut_config.py +53 -0
- solokit/templates/ml_ai_fastapi/tier-3-comprehensive/pyproject.toml.tier3.template +150 -0
- solokit/templates/ml_ai_fastapi/tier-3-comprehensive/tests/integration/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/tier-3-comprehensive/tests/integration/conftest.py +74 -0
- solokit/templates/ml_ai_fastapi/tier-3-comprehensive/tests/integration/test_api.py +131 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/pyproject.toml.tier4.template +162 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/requirements-prod.txt +25 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/src/api/routes/metrics.py +19 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/src/core/logging.py +74 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/src/core/monitoring.py +68 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/src/core/sentry.py +66 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/src/middleware/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/src/middleware/logging.py +79 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/src/middleware/tracing.py +60 -0
- solokit/templates/refactor_spec.md +287 -0
- solokit/templates/saas_t3/base/.gitignore +36 -0
- solokit/templates/saas_t3/base/app/api/trpc/[trpc]/route.ts +33 -0
- solokit/templates/saas_t3/base/app/globals.css +27 -0
- solokit/templates/saas_t3/base/app/layout.tsx +23 -0
- solokit/templates/saas_t3/base/app/page.tsx +31 -0
- solokit/templates/saas_t3/base/lib/api.tsx +77 -0
- solokit/templates/saas_t3/base/lib/utils.ts +13 -0
- solokit/templates/saas_t3/base/next.config.ts +7 -0
- solokit/templates/saas_t3/base/package.json.template +38 -0
- solokit/templates/saas_t3/base/postcss.config.mjs +8 -0
- solokit/templates/saas_t3/base/prisma/schema.prisma +20 -0
- solokit/templates/saas_t3/base/server/api/root.ts +19 -0
- solokit/templates/saas_t3/base/server/api/routers/example.ts +28 -0
- solokit/templates/saas_t3/base/server/api/trpc.ts +52 -0
- solokit/templates/saas_t3/base/server/db.ts +17 -0
- solokit/templates/saas_t3/base/tailwind.config.ts +19 -0
- solokit/templates/saas_t3/base/tsconfig.json +27 -0
- solokit/templates/saas_t3/docker/Dockerfile +60 -0
- solokit/templates/saas_t3/docker/docker-compose.prod.yml +59 -0
- solokit/templates/saas_t3/docker/docker-compose.yml +49 -0
- solokit/templates/saas_t3/tier-1-essential/.eslintrc.json +7 -0
- solokit/templates/saas_t3/tier-1-essential/jest.config.ts +17 -0
- solokit/templates/saas_t3/tier-1-essential/jest.setup.ts +1 -0
- solokit/templates/saas_t3/tier-1-essential/package.json.tier1.template +54 -0
- solokit/templates/saas_t3/tier-1-essential/tests/setup.ts +22 -0
- solokit/templates/saas_t3/tier-1-essential/tests/unit/example.test.tsx +24 -0
- solokit/templates/saas_t3/tier-2-standard/package.json.tier2.template +58 -0
- solokit/templates/saas_t3/tier-3-comprehensive/eslint.config.mjs +39 -0
- solokit/templates/saas_t3/tier-3-comprehensive/package.json.tier3.template +74 -0
- solokit/templates/saas_t3/tier-3-comprehensive/playwright.config.ts +66 -0
- solokit/templates/saas_t3/tier-3-comprehensive/stryker.conf.json +34 -0
- solokit/templates/saas_t3/tier-3-comprehensive/tests/e2e/home.spec.ts +41 -0
- solokit/templates/saas_t3/tier-3-comprehensive/tests/integration/api.test.ts +44 -0
- solokit/templates/saas_t3/tier-3-comprehensive/type-coverage.json +12 -0
- solokit/templates/saas_t3/tier-4-production/instrumentation.ts +9 -0
- solokit/templates/saas_t3/tier-4-production/k6/load-test.js +51 -0
- solokit/templates/saas_t3/tier-4-production/next.config.ts +46 -0
- solokit/templates/saas_t3/tier-4-production/package.json.tier4.template +83 -0
- solokit/templates/saas_t3/tier-4-production/sentry.client.config.ts +26 -0
- solokit/templates/saas_t3/tier-4-production/sentry.edge.config.ts +11 -0
- solokit/templates/saas_t3/tier-4-production/sentry.server.config.ts +11 -0
- solokit/templates/saas_t3/tier-4-production/vercel.json +37 -0
- solokit/templates/security_spec.md +287 -0
- solokit/templates/stack-versions.yaml +617 -0
- solokit/templates/status_update.json +6 -0
- solokit/templates/template-registry.json +257 -0
- solokit/templates/work_items.json +11 -0
- solokit/testing/__init__.py +1 -0
- solokit/testing/integration_runner.py +550 -0
- solokit/testing/performance.py +637 -0
- solokit/visualization/__init__.py +1 -0
- solokit/visualization/dependency_graph.py +788 -0
- solokit/work_items/__init__.py +1 -0
- solokit/work_items/creator.py +217 -0
- solokit/work_items/delete.py +264 -0
- solokit/work_items/get_dependencies.py +185 -0
- solokit/work_items/get_dependents.py +113 -0
- solokit/work_items/get_metadata.py +121 -0
- solokit/work_items/get_next_recommendations.py +133 -0
- solokit/work_items/manager.py +235 -0
- solokit/work_items/milestones.py +137 -0
- solokit/work_items/query.py +376 -0
- solokit/work_items/repository.py +267 -0
- solokit/work_items/scheduler.py +184 -0
- solokit/work_items/spec_parser.py +838 -0
- solokit/work_items/spec_validator.py +493 -0
- solokit/work_items/updater.py +157 -0
- solokit/work_items/validator.py +205 -0
- solokit-0.1.1.dist-info/METADATA +640 -0
- solokit-0.1.1.dist-info/RECORD +323 -0
- solokit-0.1.1.dist-info/WHEEL +5 -0
- solokit-0.1.1.dist-info/entry_points.txt +2 -0
- solokit-0.1.1.dist-info/licenses/LICENSE +21 -0
- solokit-0.1.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{project_name}",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "{project_description}",
|
|
5
|
+
"private": true,
|
|
6
|
+
"type": "module",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"dev": "next dev",
|
|
9
|
+
"build": "next build",
|
|
10
|
+
"start": "next start",
|
|
11
|
+
"lint": "next lint",
|
|
12
|
+
"type-check": "tsc --noEmit"
|
|
13
|
+
},
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"next": "16.0.1",
|
|
16
|
+
"react": "19.2.0",
|
|
17
|
+
"react-dom": "19.2.0",
|
|
18
|
+
"@trpc/server": "11.7.1",
|
|
19
|
+
"@trpc/client": "11.7.1",
|
|
20
|
+
"@trpc/react-query": "11.7.1",
|
|
21
|
+
"@trpc/next": "11.7.1",
|
|
22
|
+
"@tanstack/react-query": "5.90.7",
|
|
23
|
+
"prisma": "6.19.0",
|
|
24
|
+
"@prisma/client": "6.19.0",
|
|
25
|
+
"zod": "4.1.12",
|
|
26
|
+
"tailwindcss": "4.1.17",
|
|
27
|
+
"@tailwindcss/postcss": "4.1.17",
|
|
28
|
+
"superjson": "2.2.2",
|
|
29
|
+
"clsx": "2.1.1",
|
|
30
|
+
"tailwind-merge": "3.3.1"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"typescript": "5.9.3",
|
|
34
|
+
"@types/node": "20.19.24",
|
|
35
|
+
"@types/react": "19.2.2",
|
|
36
|
+
"@types/react-dom": "19.2.2"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// This is your Prisma schema file,
|
|
2
|
+
// learn more about it in the docs: https://pris.ly/d/prisma-schema
|
|
3
|
+
|
|
4
|
+
generator client {
|
|
5
|
+
provider = "prisma-client-js"
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
datasource db {
|
|
9
|
+
provider = "postgresql"
|
|
10
|
+
url = env("DATABASE_URL")
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
model Post {
|
|
14
|
+
id Int @id @default(autoincrement())
|
|
15
|
+
name String
|
|
16
|
+
createdAt DateTime @default(now())
|
|
17
|
+
updatedAt DateTime @updatedAt
|
|
18
|
+
|
|
19
|
+
@@index([name])
|
|
20
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createCallerFactory, createTRPCRouter } from "@/server/api/trpc";
|
|
2
|
+
import { exampleRouter } from "@/server/api/routers/example";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* This is the primary router for your server.
|
|
6
|
+
*
|
|
7
|
+
* All routers added in /api/routers should be manually added here.
|
|
8
|
+
*/
|
|
9
|
+
export const appRouter = createTRPCRouter({
|
|
10
|
+
example: exampleRouter,
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
// export type definition of API
|
|
14
|
+
export type AppRouter = typeof appRouter;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Create a server-side caller for the tRPC API.
|
|
18
|
+
*/
|
|
19
|
+
export const createCaller = createCallerFactory(appRouter);
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { createTRPCRouter, publicProcedure } from "@/server/api/trpc";
|
|
3
|
+
|
|
4
|
+
export const exampleRouter = createTRPCRouter({
|
|
5
|
+
hello: publicProcedure
|
|
6
|
+
.input(z.object({ text: z.string() }))
|
|
7
|
+
.query(({ input }) => {
|
|
8
|
+
return {
|
|
9
|
+
greeting: `Hello ${input.text}`,
|
|
10
|
+
};
|
|
11
|
+
}),
|
|
12
|
+
|
|
13
|
+
create: publicProcedure
|
|
14
|
+
.input(z.object({ name: z.string().min(1) }))
|
|
15
|
+
.mutation(async ({ ctx, input }) => {
|
|
16
|
+
// This is a placeholder - you'll need to implement your database logic
|
|
17
|
+
return {
|
|
18
|
+
id: "1",
|
|
19
|
+
name: input.name,
|
|
20
|
+
createdAt: new Date(),
|
|
21
|
+
};
|
|
22
|
+
}),
|
|
23
|
+
|
|
24
|
+
getAll: publicProcedure.query(async ({ ctx }) => {
|
|
25
|
+
// This is a placeholder - you'll need to implement your database logic
|
|
26
|
+
return [];
|
|
27
|
+
}),
|
|
28
|
+
});
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This is the server-side tRPC API setup
|
|
3
|
+
*
|
|
4
|
+
* 1. CONTEXT
|
|
5
|
+
* This section defines the "contexts" that are available in the backend API.
|
|
6
|
+
* These allow you to access things when processing a request, like the database or session.
|
|
7
|
+
*/
|
|
8
|
+
import { initTRPC } from "@trpc/server";
|
|
9
|
+
import superjson from "superjson";
|
|
10
|
+
import { ZodError } from "zod";
|
|
11
|
+
import { db } from "@/server/db";
|
|
12
|
+
|
|
13
|
+
export const createTRPCContext = async (opts: { headers: Headers }) => {
|
|
14
|
+
return {
|
|
15
|
+
db,
|
|
16
|
+
...opts,
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* 2. INITIALIZATION
|
|
22
|
+
* This is where the tRPC API is initialized, connecting the context and transformer.
|
|
23
|
+
*/
|
|
24
|
+
const t = initTRPC.context<typeof createTRPCContext>().create({
|
|
25
|
+
transformer: superjson,
|
|
26
|
+
errorFormatter({ shape, error }) {
|
|
27
|
+
return {
|
|
28
|
+
...shape,
|
|
29
|
+
data: {
|
|
30
|
+
...shape.data,
|
|
31
|
+
zodError:
|
|
32
|
+
error.cause instanceof ZodError ? error.cause.flatten() : null,
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Create a server-side caller
|
|
40
|
+
*/
|
|
41
|
+
export const createCallerFactory = t.createCallerFactory;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* 3. ROUTER & PROCEDURE
|
|
45
|
+
* These are the pieces you use to build your tRPC API. You should import these a lot.
|
|
46
|
+
*/
|
|
47
|
+
export const createTRPCRouter = t.router;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Public (unauthenticated) procedure
|
|
51
|
+
*/
|
|
52
|
+
export const publicProcedure = t.procedure;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { PrismaClient } from "@prisma/client";
|
|
2
|
+
|
|
3
|
+
const createPrismaClient = () =>
|
|
4
|
+
new PrismaClient({
|
|
5
|
+
log:
|
|
6
|
+
process.env.NODE_ENV === "development"
|
|
7
|
+
? ["query", "error", "warn"]
|
|
8
|
+
: ["error"],
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
const globalForPrisma = globalThis as unknown as {
|
|
12
|
+
prisma: ReturnType<typeof createPrismaClient> | undefined;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export const db = globalForPrisma.prisma ?? createPrismaClient();
|
|
16
|
+
|
|
17
|
+
if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = db;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Config } from "tailwindcss";
|
|
2
|
+
|
|
3
|
+
const config: Config = {
|
|
4
|
+
content: [
|
|
5
|
+
"./app/**/*.{js,ts,jsx,tsx,mdx}",
|
|
6
|
+
"./components/**/*.{js,ts,jsx,tsx,mdx}",
|
|
7
|
+
],
|
|
8
|
+
theme: {
|
|
9
|
+
extend: {
|
|
10
|
+
colors: {
|
|
11
|
+
background: "var(--background)",
|
|
12
|
+
foreground: "var(--foreground)",
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
plugins: [],
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export default config;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2017",
|
|
4
|
+
"lib": ["dom", "dom.iterable", "esnext"],
|
|
5
|
+
"allowJs": true,
|
|
6
|
+
"skipLibCheck": true,
|
|
7
|
+
"strict": true,
|
|
8
|
+
"noEmit": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"module": "esnext",
|
|
11
|
+
"moduleResolution": "bundler",
|
|
12
|
+
"resolveJsonModule": true,
|
|
13
|
+
"isolatedModules": true,
|
|
14
|
+
"jsx": "preserve",
|
|
15
|
+
"incremental": true,
|
|
16
|
+
"plugins": [
|
|
17
|
+
{
|
|
18
|
+
"name": "next"
|
|
19
|
+
}
|
|
20
|
+
],
|
|
21
|
+
"paths": {
|
|
22
|
+
"@/*": ["./*"]
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
|
26
|
+
"exclude": ["node_modules"]
|
|
27
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# syntax=docker/dockerfile:1
|
|
2
|
+
|
|
3
|
+
# Base image
|
|
4
|
+
FROM node:20-alpine AS base
|
|
5
|
+
|
|
6
|
+
# Install dependencies only when needed
|
|
7
|
+
FROM base AS deps
|
|
8
|
+
RUN apk add --no-cache libc6-compat
|
|
9
|
+
WORKDIR /app
|
|
10
|
+
|
|
11
|
+
# Install dependencies based on the preferred package manager
|
|
12
|
+
COPY package.json package-lock.json* ./
|
|
13
|
+
RUN npm ci
|
|
14
|
+
|
|
15
|
+
# Rebuild the source code only when needed
|
|
16
|
+
FROM base AS builder
|
|
17
|
+
WORKDIR /app
|
|
18
|
+
COPY --from=deps /app/node_modules ./node_modules
|
|
19
|
+
COPY . .
|
|
20
|
+
|
|
21
|
+
# Generate Prisma Client
|
|
22
|
+
RUN npx prisma generate
|
|
23
|
+
|
|
24
|
+
# Next.js collects completely anonymous telemetry data about general usage.
|
|
25
|
+
# Learn more here: https://nextjs.org/telemetry
|
|
26
|
+
# Uncomment the following line in case you want to disable telemetry during the build.
|
|
27
|
+
# ENV NEXT_TELEMETRY_DISABLED 1
|
|
28
|
+
|
|
29
|
+
RUN npm run build
|
|
30
|
+
|
|
31
|
+
# Production image, copy all the files and run next
|
|
32
|
+
FROM base AS runner
|
|
33
|
+
WORKDIR /app
|
|
34
|
+
|
|
35
|
+
ENV NODE_ENV production
|
|
36
|
+
# Uncomment the following line in case you want to disable telemetry during runtime.
|
|
37
|
+
# ENV NEXT_TELEMETRY_DISABLED 1
|
|
38
|
+
|
|
39
|
+
RUN addgroup --system --gid 1001 nodejs
|
|
40
|
+
RUN adduser --system --uid 1001 nextjs
|
|
41
|
+
|
|
42
|
+
# Copy necessary files
|
|
43
|
+
COPY --from=builder /app/public ./public
|
|
44
|
+
COPY --from=builder /app/package.json ./package.json
|
|
45
|
+
|
|
46
|
+
# Automatically leverage output traces to reduce image size
|
|
47
|
+
# https://nextjs.org/docs/advanced-features/output-file-tracing
|
|
48
|
+
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
|
49
|
+
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
|
50
|
+
|
|
51
|
+
USER nextjs
|
|
52
|
+
|
|
53
|
+
EXPOSE 3000
|
|
54
|
+
|
|
55
|
+
ENV PORT 3000
|
|
56
|
+
ENV HOSTNAME "0.0.0.0"
|
|
57
|
+
|
|
58
|
+
# server.js is created by next build from the standalone output
|
|
59
|
+
# https://nextjs.org/docs/pages/api-reference/next-config-js/output
|
|
60
|
+
CMD ["node", "server.js"]
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
version: '3.8'
|
|
2
|
+
|
|
3
|
+
services:
|
|
4
|
+
# PostgreSQL database for production
|
|
5
|
+
db:
|
|
6
|
+
image: postgres:16-alpine
|
|
7
|
+
container_name: saas-t3-db-prod
|
|
8
|
+
restart: always
|
|
9
|
+
environment:
|
|
10
|
+
POSTGRES_USER: ${POSTGRES_USER:-postgres}
|
|
11
|
+
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
|
12
|
+
POSTGRES_DB: ${POSTGRES_DB:-mydb}
|
|
13
|
+
ports:
|
|
14
|
+
- '5432:5432'
|
|
15
|
+
volumes:
|
|
16
|
+
- postgres_data_prod:/var/lib/postgresql/data
|
|
17
|
+
healthcheck:
|
|
18
|
+
test: ['CMD-SHELL', 'pg_isready -U postgres']
|
|
19
|
+
interval: 10s
|
|
20
|
+
timeout: 5s
|
|
21
|
+
retries: 5
|
|
22
|
+
networks:
|
|
23
|
+
- app_network
|
|
24
|
+
|
|
25
|
+
# Next.js application (production)
|
|
26
|
+
app:
|
|
27
|
+
build:
|
|
28
|
+
context: ..
|
|
29
|
+
dockerfile: docker/Dockerfile
|
|
30
|
+
target: runner
|
|
31
|
+
container_name: saas-t3-app-prod
|
|
32
|
+
restart: always
|
|
33
|
+
depends_on:
|
|
34
|
+
db:
|
|
35
|
+
condition: service_healthy
|
|
36
|
+
environment:
|
|
37
|
+
- NODE_ENV=production
|
|
38
|
+
- DATABASE_URL=postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB:-mydb}?schema=public
|
|
39
|
+
- NEXTAUTH_SECRET=${NEXTAUTH_SECRET}
|
|
40
|
+
- NEXTAUTH_URL=${NEXTAUTH_URL}
|
|
41
|
+
- SENTRY_DSN=${SENTRY_DSN}
|
|
42
|
+
ports:
|
|
43
|
+
- '3000:3000'
|
|
44
|
+
networks:
|
|
45
|
+
- app_network
|
|
46
|
+
healthcheck:
|
|
47
|
+
test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:3000/api/health']
|
|
48
|
+
interval: 30s
|
|
49
|
+
timeout: 10s
|
|
50
|
+
retries: 3
|
|
51
|
+
start_period: 40s
|
|
52
|
+
|
|
53
|
+
volumes:
|
|
54
|
+
postgres_data_prod:
|
|
55
|
+
driver: local
|
|
56
|
+
|
|
57
|
+
networks:
|
|
58
|
+
app_network:
|
|
59
|
+
driver: bridge
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
version: '3.8'
|
|
2
|
+
|
|
3
|
+
services:
|
|
4
|
+
# PostgreSQL database for development
|
|
5
|
+
db:
|
|
6
|
+
image: postgres:16-alpine
|
|
7
|
+
container_name: saas-t3-db
|
|
8
|
+
restart: unless-stopped
|
|
9
|
+
environment:
|
|
10
|
+
POSTGRES_USER: postgres
|
|
11
|
+
POSTGRES_PASSWORD: postgres
|
|
12
|
+
POSTGRES_DB: mydb
|
|
13
|
+
ports:
|
|
14
|
+
- '5432:5432'
|
|
15
|
+
volumes:
|
|
16
|
+
- postgres_data:/var/lib/postgresql/data
|
|
17
|
+
healthcheck:
|
|
18
|
+
test: ['CMD-SHELL', 'pg_isready -U postgres']
|
|
19
|
+
interval: 10s
|
|
20
|
+
timeout: 5s
|
|
21
|
+
retries: 5
|
|
22
|
+
|
|
23
|
+
# Next.js application (development)
|
|
24
|
+
app:
|
|
25
|
+
build:
|
|
26
|
+
context: ..
|
|
27
|
+
dockerfile: docker/Dockerfile
|
|
28
|
+
target: builder
|
|
29
|
+
container_name: saas-t3-app
|
|
30
|
+
restart: unless-stopped
|
|
31
|
+
depends_on:
|
|
32
|
+
db:
|
|
33
|
+
condition: service_healthy
|
|
34
|
+
environment:
|
|
35
|
+
- NODE_ENV=development
|
|
36
|
+
- DATABASE_URL=postgresql://postgres:postgres@db:5432/mydb?schema=public
|
|
37
|
+
- NEXTAUTH_SECRET=your-secret-here
|
|
38
|
+
- NEXTAUTH_URL=http://localhost:3000
|
|
39
|
+
ports:
|
|
40
|
+
- '3000:3000'
|
|
41
|
+
volumes:
|
|
42
|
+
- ..:/app
|
|
43
|
+
- /app/node_modules
|
|
44
|
+
- /app/.next
|
|
45
|
+
command: npm run dev
|
|
46
|
+
|
|
47
|
+
volumes:
|
|
48
|
+
postgres_data:
|
|
49
|
+
driver: local
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Config } from 'jest'
|
|
2
|
+
import nextJest from 'next/jest.js'
|
|
3
|
+
|
|
4
|
+
const createJestConfig = nextJest({
|
|
5
|
+
// Provide the path to your Next.js app to load next.config.js and .env files in your test environment
|
|
6
|
+
dir: './',
|
|
7
|
+
})
|
|
8
|
+
|
|
9
|
+
// Add any custom config to be passed to Jest
|
|
10
|
+
const config: Config = {
|
|
11
|
+
coverageProvider: 'v8',
|
|
12
|
+
testEnvironment: 'jsdom',
|
|
13
|
+
setupFilesAfterEnv: ['<rootDir>/jest.setup.ts'],
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// createJestConfig is exported this way to ensure that next/jest can load the Next.js config which is async
|
|
17
|
+
export default createJestConfig(config)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import '@testing-library/jest-dom'
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{project_name}",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "{project_description}",
|
|
5
|
+
"private": true,
|
|
6
|
+
"type": "module",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"dev": "next dev",
|
|
9
|
+
"build": "next build",
|
|
10
|
+
"start": "next start",
|
|
11
|
+
"lint": "next lint",
|
|
12
|
+
"type-check": "tsc --noEmit",
|
|
13
|
+
"test": "jest",
|
|
14
|
+
"test:watch": "jest --watch",
|
|
15
|
+
"test:coverage": "jest --coverage",
|
|
16
|
+
"format": "prettier --write \"**/*.{js,jsx,ts,tsx,json,md}\"",
|
|
17
|
+
"format:check": "prettier --check \"**/*.{js,jsx,ts,tsx,json,md}\""
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"next": "16.0.1",
|
|
21
|
+
"react": "19.2.0",
|
|
22
|
+
"react-dom": "19.2.0",
|
|
23
|
+
"@trpc/server": "11.7.1",
|
|
24
|
+
"@trpc/client": "11.7.1",
|
|
25
|
+
"@trpc/react-query": "11.7.1",
|
|
26
|
+
"@trpc/next": "11.7.1",
|
|
27
|
+
"@tanstack/react-query": "5.90.7",
|
|
28
|
+
"prisma": "6.19.0",
|
|
29
|
+
"@prisma/client": "6.19.0",
|
|
30
|
+
"zod": "4.1.12",
|
|
31
|
+
"tailwindcss": "4.1.17",
|
|
32
|
+
"@tailwindcss/postcss": "4.1.17",
|
|
33
|
+
"superjson": "2.2.2",
|
|
34
|
+
"clsx": "2.1.1",
|
|
35
|
+
"tailwind-merge": "3.3.1"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"typescript": "5.9.3",
|
|
39
|
+
"@types/node": "20.19.24",
|
|
40
|
+
"@types/react": "19.2.2",
|
|
41
|
+
"@types/react-dom": "19.2.2",
|
|
42
|
+
"eslint": "9.39.1",
|
|
43
|
+
"eslint-config-next": "16.0.1",
|
|
44
|
+
"@typescript-eslint/parser": "8.46.3",
|
|
45
|
+
"@typescript-eslint/eslint-plugin": "8.46.3",
|
|
46
|
+
"prettier": "3.6.2",
|
|
47
|
+
"jest": "30.2.0",
|
|
48
|
+
"@types/jest": "30.0.0",
|
|
49
|
+
"ts-jest": "29.4.5",
|
|
50
|
+
"jest-environment-jsdom": "30.2.0",
|
|
51
|
+
"@testing-library/react": "16.3.0",
|
|
52
|
+
"@testing-library/jest-dom": "6.9.1"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Add custom jest matchers from jest-dom
|
|
2
|
+
import "@testing-library/jest-dom";
|
|
3
|
+
|
|
4
|
+
// Mock Next.js router
|
|
5
|
+
jest.mock("next/navigation", () => ({
|
|
6
|
+
useRouter() {
|
|
7
|
+
return {
|
|
8
|
+
push: jest.fn(),
|
|
9
|
+
replace: jest.fn(),
|
|
10
|
+
prefetch: jest.fn(),
|
|
11
|
+
};
|
|
12
|
+
},
|
|
13
|
+
useSearchParams() {
|
|
14
|
+
return new URLSearchParams();
|
|
15
|
+
},
|
|
16
|
+
usePathname() {
|
|
17
|
+
return "";
|
|
18
|
+
},
|
|
19
|
+
}));
|
|
20
|
+
|
|
21
|
+
// Mock environment variables
|
|
22
|
+
process.env.NEXT_PUBLIC_APP_URL = "http://localhost:3000";
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { render, screen } from "@testing-library/react";
|
|
2
|
+
import { describe, it, expect } from "@jest/globals";
|
|
3
|
+
|
|
4
|
+
// Example component for testing
|
|
5
|
+
function ExampleComponent({ text }: { text: string }) {
|
|
6
|
+
return <div data-testid="example">{text}</div>;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
describe("ExampleComponent", () => {
|
|
10
|
+
it("should render the text prop", () => {
|
|
11
|
+
render(<ExampleComponent text="Hello World" />);
|
|
12
|
+
const element = screen.getByTestId("example");
|
|
13
|
+
expect(element).toBeInTheDocument();
|
|
14
|
+
expect(element).toHaveTextContent("Hello World");
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it("should render different text when prop changes", () => {
|
|
18
|
+
const { rerender } = render(<ExampleComponent text="First" />);
|
|
19
|
+
expect(screen.getByTestId("example")).toHaveTextContent("First");
|
|
20
|
+
|
|
21
|
+
rerender(<ExampleComponent text="Second" />);
|
|
22
|
+
expect(screen.getByTestId("example")).toHaveTextContent("Second");
|
|
23
|
+
});
|
|
24
|
+
});
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{project_name}",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "{project_description}",
|
|
5
|
+
"private": true,
|
|
6
|
+
"type": "module",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"dev": "next dev",
|
|
9
|
+
"build": "next build",
|
|
10
|
+
"start": "next start",
|
|
11
|
+
"lint": "next lint",
|
|
12
|
+
"type-check": "tsc --noEmit",
|
|
13
|
+
"test": "jest",
|
|
14
|
+
"test:watch": "jest --watch",
|
|
15
|
+
"test:coverage": "jest --coverage",
|
|
16
|
+
"format": "prettier --write \"**/*.{js,jsx,ts,tsx,json,md}\"",
|
|
17
|
+
"format:check": "prettier --check \"**/*.{js,jsx,ts,tsx,json,md}\"",
|
|
18
|
+
"prepare": "husky install",
|
|
19
|
+
"audit": "npm audit --audit-level=moderate"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"next": "16.0.1",
|
|
23
|
+
"react": "19.2.0",
|
|
24
|
+
"react-dom": "19.2.0",
|
|
25
|
+
"@trpc/server": "11.7.1",
|
|
26
|
+
"@trpc/client": "11.7.1",
|
|
27
|
+
"@trpc/react-query": "11.7.1",
|
|
28
|
+
"@trpc/next": "11.7.1",
|
|
29
|
+
"@tanstack/react-query": "5.90.7",
|
|
30
|
+
"prisma": "6.19.0",
|
|
31
|
+
"@prisma/client": "6.19.0",
|
|
32
|
+
"zod": "4.1.12",
|
|
33
|
+
"tailwindcss": "4.1.17",
|
|
34
|
+
"@tailwindcss/postcss": "4.1.17",
|
|
35
|
+
"superjson": "2.2.2",
|
|
36
|
+
"clsx": "2.1.1",
|
|
37
|
+
"tailwind-merge": "3.3.1"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"typescript": "5.9.3",
|
|
41
|
+
"@types/node": "20.19.24",
|
|
42
|
+
"@types/react": "19.2.2",
|
|
43
|
+
"@types/react-dom": "19.2.2",
|
|
44
|
+
"eslint": "9.39.1",
|
|
45
|
+
"eslint-config-next": "16.0.1",
|
|
46
|
+
"@typescript-eslint/parser": "8.46.3",
|
|
47
|
+
"@typescript-eslint/eslint-plugin": "8.46.3",
|
|
48
|
+
"prettier": "3.6.2",
|
|
49
|
+
"jest": "30.2.0",
|
|
50
|
+
"@types/jest": "30.0.0",
|
|
51
|
+
"ts-jest": "29.4.5",
|
|
52
|
+
"jest-environment-jsdom": "30.2.0",
|
|
53
|
+
"@testing-library/react": "16.3.0",
|
|
54
|
+
"@testing-library/jest-dom": "6.9.1",
|
|
55
|
+
"husky": "9.1.7",
|
|
56
|
+
"lint-staged": "16.2.6"
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { dirname } from "path";
|
|
2
|
+
import { fileURLToPath } from "url";
|
|
3
|
+
import { FlatCompat } from "@eslint/eslintrc";
|
|
4
|
+
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = dirname(__filename);
|
|
7
|
+
|
|
8
|
+
const compat = new FlatCompat({
|
|
9
|
+
baseDirectory: __dirname,
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
const eslintConfig = [
|
|
13
|
+
...compat.extends("next/core-web-vitals", "next/typescript"),
|
|
14
|
+
{
|
|
15
|
+
plugins: {
|
|
16
|
+
"jest-dom": (await import("eslint-plugin-jest-dom")).default,
|
|
17
|
+
"testing-library": (await import("eslint-plugin-testing-library")).default,
|
|
18
|
+
},
|
|
19
|
+
rules: {
|
|
20
|
+
"@typescript-eslint/no-unused-vars": [
|
|
21
|
+
"error",
|
|
22
|
+
{ argsIgnorePattern: "^_" },
|
|
23
|
+
],
|
|
24
|
+
"@typescript-eslint/no-explicit-any": "warn",
|
|
25
|
+
// jest-dom rules
|
|
26
|
+
"jest-dom/prefer-checked": "error",
|
|
27
|
+
"jest-dom/prefer-enabled-disabled": "error",
|
|
28
|
+
"jest-dom/prefer-required": "error",
|
|
29
|
+
"jest-dom/prefer-to-have-attribute": "error",
|
|
30
|
+
// testing-library rules
|
|
31
|
+
"testing-library/await-async-queries": "error",
|
|
32
|
+
"testing-library/no-await-sync-queries": "error",
|
|
33
|
+
"testing-library/no-debugging-utils": "warn",
|
|
34
|
+
"testing-library/prefer-screen-queries": "error",
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
];
|
|
38
|
+
|
|
39
|
+
export default eslintConfig;
|