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,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://ui.shadcn.com/schema.json",
|
|
3
|
+
"style": "default",
|
|
4
|
+
"rsc": true,
|
|
5
|
+
"tsx": true,
|
|
6
|
+
"tailwind": {
|
|
7
|
+
"config": "tailwind.config.ts",
|
|
8
|
+
"css": "app/globals.css",
|
|
9
|
+
"baseColor": "slate",
|
|
10
|
+
"cssVariables": true
|
|
11
|
+
},
|
|
12
|
+
"aliases": {
|
|
13
|
+
"components": "@/components",
|
|
14
|
+
"utils": "@/lib/utils"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import routerProvider from "@refinedev/nextjs-router";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Refine configuration
|
|
5
|
+
* This file centralizes all Refine-related configuration
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Data provider configuration
|
|
10
|
+
* TODO: Add a data provider when you have a backend API
|
|
11
|
+
* Example: import dataProvider from "@refinedev/simple-rest";
|
|
12
|
+
* Then: export const refineDataProvider = dataProvider(API_URL);
|
|
13
|
+
*/
|
|
14
|
+
export const refineDataProvider = undefined;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Router provider configuration
|
|
18
|
+
* Integrates Refine with Next.js App Router
|
|
19
|
+
*/
|
|
20
|
+
export const refineRouterProvider = routerProvider;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Resource definitions
|
|
24
|
+
* Define all resources that will be managed in the dashboard
|
|
25
|
+
*/
|
|
26
|
+
export const refineResources = [
|
|
27
|
+
{
|
|
28
|
+
name: "users",
|
|
29
|
+
list: "/dashboard/users",
|
|
30
|
+
create: "/dashboard/users/create",
|
|
31
|
+
edit: "/dashboard/users/edit/:id",
|
|
32
|
+
show: "/dashboard/users/show/:id",
|
|
33
|
+
meta: {
|
|
34
|
+
canDelete: true,
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: "orders",
|
|
39
|
+
list: "/dashboard/orders",
|
|
40
|
+
create: "/dashboard/orders/create",
|
|
41
|
+
edit: "/dashboard/orders/edit/:id",
|
|
42
|
+
show: "/dashboard/orders/show/:id",
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: "products",
|
|
46
|
+
list: "/dashboard/products",
|
|
47
|
+
create: "/dashboard/products/create",
|
|
48
|
+
edit: "/dashboard/products/edit/:id",
|
|
49
|
+
show: "/dashboard/products/show/:id",
|
|
50
|
+
meta: {
|
|
51
|
+
canDelete: true,
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Refine options
|
|
58
|
+
* Global configuration for Refine behavior
|
|
59
|
+
*/
|
|
60
|
+
export const refineOptions = {
|
|
61
|
+
syncWithLocation: true,
|
|
62
|
+
warnWhenUnsavedChanges: true,
|
|
63
|
+
useNewQueryKeys: true,
|
|
64
|
+
projectId: "refine-dashboard",
|
|
65
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { clsx, type ClassValue } from "clsx";
|
|
2
|
+
import { twMerge } from "tailwind-merge";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Utility function to merge Tailwind CSS classes
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* cn("px-2 py-1", "bg-blue-500") // "px-2 py-1 bg-blue-500"
|
|
9
|
+
* cn("px-2", condition && "py-1") // "px-2 py-1" or "px-2"
|
|
10
|
+
*/
|
|
11
|
+
export function cn(...inputs: ClassValue[]) {
|
|
12
|
+
return twMerge(clsx(inputs));
|
|
13
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
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
|
+
"@refinedev/cli": "latest",
|
|
19
|
+
"@refinedev/core": "latest",
|
|
20
|
+
"@refinedev/nextjs-router": "latest",
|
|
21
|
+
"@refinedev/react-table": "latest",
|
|
22
|
+
"@refinedev/react-hook-form": "latest",
|
|
23
|
+
"recharts": "latest",
|
|
24
|
+
"react-hook-form": "7.66.0",
|
|
25
|
+
"zod": "4.1.12",
|
|
26
|
+
"@hookform/resolvers": "latest",
|
|
27
|
+
"lucide-react": "latest",
|
|
28
|
+
"class-variance-authority": "0.7.1",
|
|
29
|
+
"clsx": "2.1.1",
|
|
30
|
+
"tailwind-merge": "3.3.1",
|
|
31
|
+
"tailwindcss": "4.1.17",
|
|
32
|
+
"@tailwindcss/postcss": "4.1.17"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"typescript": "5.9.3",
|
|
36
|
+
"@types/node": "20.19.24",
|
|
37
|
+
"@types/react": "19.2.2",
|
|
38
|
+
"@types/react-dom": "19.2.2"
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { Refine } from "@refinedev/core";
|
|
4
|
+
import {
|
|
5
|
+
refineDataProvider,
|
|
6
|
+
refineRouterProvider,
|
|
7
|
+
refineResources,
|
|
8
|
+
refineOptions,
|
|
9
|
+
} from "@/lib/refine";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Refine Provider Component
|
|
13
|
+
* Wraps the application with Refine context and configuration
|
|
14
|
+
*/
|
|
15
|
+
export function RefineProvider({ children }: { children: React.ReactNode }) {
|
|
16
|
+
return (
|
|
17
|
+
<Refine
|
|
18
|
+
dataProvider={refineDataProvider}
|
|
19
|
+
routerProvider={refineRouterProvider}
|
|
20
|
+
resources={refineResources}
|
|
21
|
+
options={refineOptions}
|
|
22
|
+
>
|
|
23
|
+
{children}
|
|
24
|
+
</Refine>
|
|
25
|
+
);
|
|
26
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { Config } from "tailwindcss";
|
|
2
|
+
|
|
3
|
+
const config: Config = {
|
|
4
|
+
darkMode: "class",
|
|
5
|
+
content: [
|
|
6
|
+
"./pages/**/*.{js,ts,jsx,tsx,mdx}",
|
|
7
|
+
"./components/**/*.{js,ts,jsx,tsx,mdx}",
|
|
8
|
+
"./app/**/*.{js,ts,jsx,tsx,mdx}",
|
|
9
|
+
],
|
|
10
|
+
theme: {
|
|
11
|
+
extend: {
|
|
12
|
+
colors: {
|
|
13
|
+
border: "hsl(var(--border))",
|
|
14
|
+
input: "hsl(var(--input))",
|
|
15
|
+
ring: "hsl(var(--ring))",
|
|
16
|
+
background: "hsl(var(--background))",
|
|
17
|
+
foreground: "hsl(var(--foreground))",
|
|
18
|
+
primary: {
|
|
19
|
+
DEFAULT: "hsl(var(--primary))",
|
|
20
|
+
foreground: "hsl(var(--primary-foreground))",
|
|
21
|
+
},
|
|
22
|
+
secondary: {
|
|
23
|
+
DEFAULT: "hsl(var(--secondary))",
|
|
24
|
+
foreground: "hsl(var(--secondary-foreground))",
|
|
25
|
+
},
|
|
26
|
+
destructive: {
|
|
27
|
+
DEFAULT: "hsl(var(--destructive))",
|
|
28
|
+
foreground: "hsl(var(--destructive-foreground))",
|
|
29
|
+
},
|
|
30
|
+
muted: {
|
|
31
|
+
DEFAULT: "hsl(var(--muted))",
|
|
32
|
+
foreground: "hsl(var(--muted-foreground))",
|
|
33
|
+
},
|
|
34
|
+
accent: {
|
|
35
|
+
DEFAULT: "hsl(var(--accent))",
|
|
36
|
+
foreground: "hsl(var(--accent-foreground))",
|
|
37
|
+
},
|
|
38
|
+
popover: {
|
|
39
|
+
DEFAULT: "hsl(var(--popover))",
|
|
40
|
+
foreground: "hsl(var(--popover-foreground))",
|
|
41
|
+
},
|
|
42
|
+
card: {
|
|
43
|
+
DEFAULT: "hsl(var(--card))",
|
|
44
|
+
foreground: "hsl(var(--card-foreground))",
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
borderRadius: {
|
|
48
|
+
lg: "var(--radius)",
|
|
49
|
+
md: "calc(var(--radius) - 2px)",
|
|
50
|
+
sm: "calc(var(--radius) - 4px)",
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
plugins: [],
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
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,57 @@
|
|
|
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
|
+
# Next.js collects completely anonymous telemetry data about general usage.
|
|
22
|
+
# Learn more here: https://nextjs.org/telemetry
|
|
23
|
+
# Uncomment the following line in case you want to disable telemetry during the build.
|
|
24
|
+
# ENV NEXT_TELEMETRY_DISABLED 1
|
|
25
|
+
|
|
26
|
+
RUN npm run build
|
|
27
|
+
|
|
28
|
+
# Production image, copy all the files and run next
|
|
29
|
+
FROM base AS runner
|
|
30
|
+
WORKDIR /app
|
|
31
|
+
|
|
32
|
+
ENV NODE_ENV production
|
|
33
|
+
# Uncomment the following line in case you want to disable telemetry during runtime.
|
|
34
|
+
# ENV NEXT_TELEMETRY_DISABLED 1
|
|
35
|
+
|
|
36
|
+
RUN addgroup --system --gid 1001 nodejs
|
|
37
|
+
RUN adduser --system --uid 1001 nextjs
|
|
38
|
+
|
|
39
|
+
# Copy necessary files
|
|
40
|
+
COPY --from=builder /app/public ./public
|
|
41
|
+
COPY --from=builder /app/package.json ./package.json
|
|
42
|
+
|
|
43
|
+
# Automatically leverage output traces to reduce image size
|
|
44
|
+
# https://nextjs.org/docs/advanced-features/output-file-tracing
|
|
45
|
+
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
|
46
|
+
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
|
47
|
+
|
|
48
|
+
USER nextjs
|
|
49
|
+
|
|
50
|
+
EXPOSE 3000
|
|
51
|
+
|
|
52
|
+
ENV PORT 3000
|
|
53
|
+
ENV HOSTNAME "0.0.0.0"
|
|
54
|
+
|
|
55
|
+
# server.js is created by next build from the standalone output
|
|
56
|
+
# https://nextjs.org/docs/pages/api-reference/next-config-js/output
|
|
57
|
+
CMD ["node", "server.js"]
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
version: '3.8'
|
|
2
|
+
|
|
3
|
+
services:
|
|
4
|
+
# Next.js application (production)
|
|
5
|
+
app:
|
|
6
|
+
build:
|
|
7
|
+
context: ..
|
|
8
|
+
dockerfile: docker/Dockerfile
|
|
9
|
+
target: runner
|
|
10
|
+
container_name: dashboard-refine-app-prod
|
|
11
|
+
restart: always
|
|
12
|
+
environment:
|
|
13
|
+
- NODE_ENV=production
|
|
14
|
+
- NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL}
|
|
15
|
+
- SENTRY_DSN=${SENTRY_DSN}
|
|
16
|
+
- SENTRY_ORG=${SENTRY_ORG}
|
|
17
|
+
- SENTRY_PROJECT=${SENTRY_PROJECT}
|
|
18
|
+
ports:
|
|
19
|
+
- '3000:3000'
|
|
20
|
+
networks:
|
|
21
|
+
- app_network
|
|
22
|
+
healthcheck:
|
|
23
|
+
test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:3000']
|
|
24
|
+
interval: 30s
|
|
25
|
+
timeout: 10s
|
|
26
|
+
retries: 3
|
|
27
|
+
start_period: 40s
|
|
28
|
+
|
|
29
|
+
networks:
|
|
30
|
+
app_network:
|
|
31
|
+
driver: bridge
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
version: '3.8'
|
|
2
|
+
|
|
3
|
+
services:
|
|
4
|
+
# Next.js application (development)
|
|
5
|
+
app:
|
|
6
|
+
build:
|
|
7
|
+
context: ..
|
|
8
|
+
dockerfile: docker/Dockerfile
|
|
9
|
+
target: builder
|
|
10
|
+
container_name: dashboard-refine-app
|
|
11
|
+
restart: unless-stopped
|
|
12
|
+
environment:
|
|
13
|
+
- NODE_ENV=development
|
|
14
|
+
- NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL:-https://api.fake-rest.refine.dev}
|
|
15
|
+
ports:
|
|
16
|
+
- '3000:3000'
|
|
17
|
+
volumes:
|
|
18
|
+
- ..:/app
|
|
19
|
+
- /app/node_modules
|
|
20
|
+
- /app/.next
|
|
21
|
+
command: npm run dev
|
|
@@ -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,57 @@
|
|
|
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
|
+
"lint:fix": "next lint --fix",
|
|
13
|
+
"format": "prettier --write \"**/*.{ts,tsx,js,jsx,json,css,md}\"",
|
|
14
|
+
"format:check": "prettier --check \"**/*.{ts,tsx,js,jsx,json,css,md}\"",
|
|
15
|
+
"type-check": "tsc --noEmit",
|
|
16
|
+
"test": "jest",
|
|
17
|
+
"test:watch": "jest --watch",
|
|
18
|
+
"test:coverage": "jest --coverage"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"next": "16.0.1",
|
|
22
|
+
"react": "19.2.0",
|
|
23
|
+
"react-dom": "19.2.0",
|
|
24
|
+
"@refinedev/cli": "2.16.50",
|
|
25
|
+
"@refinedev/core": "5.0.5",
|
|
26
|
+
"@refinedev/nextjs-router": "7.0.4",
|
|
27
|
+
"@refinedev/react-table": "6.0.1",
|
|
28
|
+
"@refinedev/react-hook-form": "5.0.2",
|
|
29
|
+
"recharts": "3.3.0",
|
|
30
|
+
"react-hook-form": "7.66.0",
|
|
31
|
+
"zod": "4.1.12",
|
|
32
|
+
"@hookform/resolvers": "5.2.2",
|
|
33
|
+
"lucide-react": "0.553.0",
|
|
34
|
+
"class-variance-authority": "0.7.1",
|
|
35
|
+
"clsx": "2.1.1",
|
|
36
|
+
"tailwind-merge": "3.3.1",
|
|
37
|
+
"tailwindcss": "4.1.17",
|
|
38
|
+
"@tailwindcss/postcss": "4.1.17"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"typescript": "5.9.3",
|
|
42
|
+
"@types/node": "20.19.24",
|
|
43
|
+
"@types/react": "19.2.2",
|
|
44
|
+
"@types/react-dom": "19.2.2",
|
|
45
|
+
"eslint": "9.39.1",
|
|
46
|
+
"eslint-config-next": "16.0.1",
|
|
47
|
+
"@typescript-eslint/parser": "8.46.3",
|
|
48
|
+
"@typescript-eslint/eslint-plugin": "8.46.3",
|
|
49
|
+
"prettier": "3.6.2",
|
|
50
|
+
"jest": "30.2.0",
|
|
51
|
+
"@types/jest": "30.0.0",
|
|
52
|
+
"ts-jest": "29.4.5",
|
|
53
|
+
"jest-environment-jsdom": "30.2.0",
|
|
54
|
+
"@testing-library/react": "16.3.0",
|
|
55
|
+
"@testing-library/jest-dom": "6.9.1"
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
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
|
+
back: jest.fn(),
|
|
12
|
+
pathname: "/",
|
|
13
|
+
query: {},
|
|
14
|
+
asPath: "/",
|
|
15
|
+
};
|
|
16
|
+
},
|
|
17
|
+
usePathname() {
|
|
18
|
+
return "/";
|
|
19
|
+
},
|
|
20
|
+
useSearchParams() {
|
|
21
|
+
return new URLSearchParams();
|
|
22
|
+
},
|
|
23
|
+
}));
|
|
24
|
+
|
|
25
|
+
// Mock environment variables
|
|
26
|
+
process.env.NEXT_PUBLIC_API_URL = "https://api.fake-rest.refine.dev";
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { render, screen } from "@testing-library/react";
|
|
2
|
+
import { Button } from "@/components/ui/button";
|
|
3
|
+
import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Example Component Tests using Jest
|
|
7
|
+
* These tests demonstrate the testing setup and best practices
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
describe("Button Component", () => {
|
|
11
|
+
it("renders children correctly", () => {
|
|
12
|
+
render(<Button>Click me</Button>);
|
|
13
|
+
expect(screen.getByText("Click me")).toBeInTheDocument();
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it("applies variant classes", () => {
|
|
17
|
+
render(<Button variant="destructive">Delete</Button>);
|
|
18
|
+
const button = screen.getByText("Delete");
|
|
19
|
+
expect(button).toBeInTheDocument();
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it("handles click events", () => {
|
|
23
|
+
let clicked = false;
|
|
24
|
+
render(<Button onClick={() => (clicked = true)}>Click</Button>);
|
|
25
|
+
const button = screen.getByText("Click");
|
|
26
|
+
button.click();
|
|
27
|
+
expect(clicked).toBe(true);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it("is accessible with proper aria attributes", () => {
|
|
31
|
+
render(<Button aria-label="Submit form">Submit</Button>);
|
|
32
|
+
expect(screen.getByLabelText("Submit form")).toBeInTheDocument();
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
describe("Card Component", () => {
|
|
37
|
+
it("renders with all parts", () => {
|
|
38
|
+
render(
|
|
39
|
+
<Card>
|
|
40
|
+
<CardHeader>
|
|
41
|
+
<CardTitle>Test Card</CardTitle>
|
|
42
|
+
</CardHeader>
|
|
43
|
+
<CardContent>
|
|
44
|
+
<p>Card content</p>
|
|
45
|
+
</CardContent>
|
|
46
|
+
</Card>
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
expect(screen.getByText("Test Card")).toBeInTheDocument();
|
|
50
|
+
expect(screen.getByText("Card content")).toBeInTheDocument();
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it("applies custom className", () => {
|
|
54
|
+
const { container } = render(
|
|
55
|
+
<Card className="custom-class">
|
|
56
|
+
<CardContent>Content</CardContent>
|
|
57
|
+
</Card>
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
const card = container.querySelector(".custom-class");
|
|
61
|
+
expect(card).toBeInTheDocument();
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
describe("Utility Functions", () => {
|
|
66
|
+
it("cn() merges classes correctly", () => {
|
|
67
|
+
const { cn } = require("@/lib/utils");
|
|
68
|
+
|
|
69
|
+
expect(cn("px-2 py-1", "bg-blue-500")).toBe("px-2 py-1 bg-blue-500");
|
|
70
|
+
expect(cn("px-2", false && "py-1")).toBe("px-2");
|
|
71
|
+
expect(cn("px-2", true && "py-1")).toBe("px-2 py-1");
|
|
72
|
+
});
|
|
73
|
+
});
|
|
@@ -0,0 +1,62 @@
|
|
|
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
|
+
"lint:fix": "next lint --fix",
|
|
13
|
+
"format": "prettier --write \"**/*.{ts,tsx,js,jsx,json,css,md}\"",
|
|
14
|
+
"format:check": "prettier --check \"**/*.{ts,tsx,js,jsx,json,css,md}\"",
|
|
15
|
+
"type-check": "tsc --noEmit",
|
|
16
|
+
"test": "jest",
|
|
17
|
+
|
|
18
|
+
"test:coverage": "jest --coverage",
|
|
19
|
+
"test:watch": "jest --watch",
|
|
20
|
+
"prepare": "husky install",
|
|
21
|
+
"audit": "npm audit --audit-level=moderate"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"next": "16.0.1",
|
|
25
|
+
"react": "19.2.0",
|
|
26
|
+
"react-dom": "19.2.0",
|
|
27
|
+
"@refinedev/cli": "2.16.50",
|
|
28
|
+
"@refinedev/core": "5.0.5",
|
|
29
|
+
"@refinedev/nextjs-router": "7.0.4",
|
|
30
|
+
"@refinedev/react-table": "6.0.1",
|
|
31
|
+
"@refinedev/react-hook-form": "5.0.2",
|
|
32
|
+
"recharts": "3.3.0",
|
|
33
|
+
"react-hook-form": "7.66.0",
|
|
34
|
+
"zod": "4.1.12",
|
|
35
|
+
"@hookform/resolvers": "5.2.2",
|
|
36
|
+
"lucide-react": "0.553.0",
|
|
37
|
+
"class-variance-authority": "0.7.1",
|
|
38
|
+
"clsx": "2.1.1",
|
|
39
|
+
"tailwind-merge": "3.3.1",
|
|
40
|
+
"tailwindcss": "4.1.17",
|
|
41
|
+
"@tailwindcss/postcss": "4.1.17"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"typescript": "5.9.3",
|
|
45
|
+
"@types/node": "20.19.24",
|
|
46
|
+
"@types/react": "19.2.2",
|
|
47
|
+
"@types/react-dom": "19.2.2",
|
|
48
|
+
"eslint": "9.39.1",
|
|
49
|
+
"eslint-config-next": "16.0.1",
|
|
50
|
+
"@typescript-eslint/parser": "8.46.3",
|
|
51
|
+
"@typescript-eslint/eslint-plugin": "8.46.3",
|
|
52
|
+
"prettier": "3.6.2",
|
|
53
|
+
"jest": "30.2.0",
|
|
54
|
+
"@types/jest": "30.0.0",
|
|
55
|
+
"ts-jest": "29.4.5",
|
|
56
|
+
"jest-environment-jsdom": "30.2.0",
|
|
57
|
+
"@testing-library/react": "16.3.0",
|
|
58
|
+
"@testing-library/jest-dom": "6.9.1",
|
|
59
|
+
"husky": "9.1.7",
|
|
60
|
+
"lint-staged": "16.2.6"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
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
|
+
rules: {
|
|
16
|
+
"@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_" }],
|
|
17
|
+
"@typescript-eslint/no-explicit-any": "warn",
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
export default eslintConfig;
|