chore(create-twenty-app): align scaffold with unified app test/lint/typecheck configs (#22128)
## What We have unified the unit + integration test, lint, and typecheck configuration across `packages/twenty-apps/internal` and `packages/twenty-apps/public`. This PR updates the `create-twenty-app` scaffolded project template so a freshly generated app complies with that same setup. ### Scaffold template changes (`packages/create-twenty-app/src/constants/template/`) - **`package.json`**: add `typecheck` (`tsgo --noEmit -p tsconfig.spec.json`) and `test:unit` scripts; add `@typescript/native-preview` + `vite-tsconfig-paths` devDeps; bump `vitest` → `^4.0.0` and `packageManager` → `yarn@4.13.0`. - **`vitest.config.ts`**: resolve path aliases via the `vite-tsconfig-paths` plugin (matching the unified apps) instead of the ad-hoc `resolve.tsconfigPaths`. - **`vitest.unit.config.ts`** (new): unit test config targeting `src/**/*.test.ts`, identical to existing apps. - **`tsconfig.json`**: `moduleResolution: node → bundler`, `target: es2018 → es2020`. - **`src/__tests__/application-config.test.ts`** (new): a sample unit test so a fresh scaffold's `test:unit` passes out of the box. - **`.github/workflows/ci.yml`**: run Lint → Typecheck → Unit tests alongside the integration tests, mirroring the central `ci-twenty-apps.yaml` pipeline. - **`README.md`**: document the new `lint` / `typecheck` / `test:unit` commands. ### CLI package changes - **`tsconfig.json` / `tsconfig.lib.json`**: exclude the new `template/vitest.unit.config.ts` from the CLI's own typecheck/build (just like the existing `vitest.config.ts` exclusion) — its `vitest` / `vite-tsconfig-paths` imports aren't deps of the CLI package. ## Notes - The template's committed `yarn.lock` is an intentional empty seed; the scaffold runs `yarn install` at creation time, so the new deps regenerate cleanly — no lockfile change needed. - The sample unit test asserts `typeof APP_DESCRIPTION === 'string'` (not truthiness) because the description is optional at scaffold time and can be empty. https://claude.ai/code/session_01XiJpkiQG3TiDjKncx2XSQq --- _Generated by [Claude Code](https://claude.ai/code/session_01XiJpkiQG3TiDjKncx2XSQq)_ <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/twentyhq/twenty/pull/22128?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. -->
This commit is contained in:
@@ -24,6 +24,12 @@ const jestConfig = {
|
||||
'<rootDir>/src/**/__tests__/**/*.(test|spec).{js,ts}',
|
||||
'<rootDir>/src/**/?(*.)(test|spec).{js,ts}',
|
||||
],
|
||||
// The scaffold template ships its own tests that run under the generated
|
||||
// project's vitest, not this package's jest, so ignore the template directory.
|
||||
testPathIgnorePatterns: [
|
||||
'/node_modules/',
|
||||
'<rootDir>/src/constants/template/',
|
||||
],
|
||||
collectCoverageFrom: [
|
||||
'src/**/*.{ts,js}',
|
||||
'!src/**/*.d.ts',
|
||||
|
||||
@@ -13,6 +13,9 @@ Run `yarn twenty help` to list all available commands.
|
||||
- `yarn twenty dev` - Start the development server and sync your app
|
||||
- `yarn twenty docker:status` - Check the local Twenty server status
|
||||
- `yarn twenty docker:start` - Start the local Twenty server
|
||||
- `yarn lint` - Lint the project with oxlint
|
||||
- `yarn typecheck` - Type-check the project
|
||||
- `yarn test:unit` - Run unit tests
|
||||
- `yarn test` - Run integration tests
|
||||
|
||||
## Learn More
|
||||
|
||||
@@ -41,6 +41,15 @@ jobs:
|
||||
- name: Install dependencies
|
||||
run: yarn install --immutable
|
||||
|
||||
- name: Lint
|
||||
run: yarn lint
|
||||
|
||||
- name: Typecheck
|
||||
run: yarn typecheck
|
||||
|
||||
- name: Unit tests
|
||||
run: yarn test:unit
|
||||
|
||||
- name: Run integration tests
|
||||
run: yarn test
|
||||
env:
|
||||
|
||||
@@ -8,24 +8,28 @@
|
||||
"yarn": ">=4.0.2"
|
||||
},
|
||||
"keywords": [],
|
||||
"packageManager": "yarn@4.9.2",
|
||||
"packageManager": "yarn@4.13.0",
|
||||
"scripts": {
|
||||
"twenty": "twenty",
|
||||
"lint": "oxlint -c .oxlintrc.json .",
|
||||
"lint:fix": "oxlint --fix -c .oxlintrc.json .",
|
||||
"typecheck": "tsgo --noEmit -p tsconfig.spec.json",
|
||||
"test": "vitest run",
|
||||
"test:watch": "vitest"
|
||||
"test:watch": "vitest",
|
||||
"test:unit": "vitest run --config vitest.unit.config.ts"
|
||||
},
|
||||
"dependencies": {},
|
||||
"devDependencies": {
|
||||
"@types/node": "^24.7.2",
|
||||
"@types/react": "^19.0.0",
|
||||
"@typescript/native-preview": "^7.0.0-dev.20260116.1",
|
||||
"oxlint": "^0.16.0",
|
||||
"react": "^19.0.0",
|
||||
"react-dom": "^19.0.0",
|
||||
"twenty-client-sdk": "TO-BE-GENERATED",
|
||||
"twenty-sdk": "TO-BE-GENERATED",
|
||||
"typescript": "^5.9.3",
|
||||
"vitest": "^3.1.1"
|
||||
"vite-tsconfig-paths": "^4.2.1",
|
||||
"vitest": "^4.0.0"
|
||||
}
|
||||
}
|
||||
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
import {
|
||||
APP_DESCRIPTION,
|
||||
APP_DISPLAY_NAME,
|
||||
APPLICATION_UNIVERSAL_IDENTIFIER,
|
||||
} from 'src/constants/universal-identifiers';
|
||||
import { describe, expect, it } from 'vitest';
|
||||
|
||||
describe('application identifiers', () => {
|
||||
it('should expose the application metadata constants', () => {
|
||||
expect(APP_DISPLAY_NAME).toBeTruthy();
|
||||
expect(typeof APP_DESCRIPTION).toBe('string');
|
||||
expect(APPLICATION_UNIVERSAL_IDENTIFIER).toBeTruthy();
|
||||
});
|
||||
});
|
||||
@@ -16,7 +16,7 @@
|
||||
"alwaysStrict": true,
|
||||
"noImplicitAny": true,
|
||||
"strictBindCallApply": false,
|
||||
"target": "es2018",
|
||||
"target": "es2020",
|
||||
"module": "esnext",
|
||||
"lib": ["es2020", "dom"],
|
||||
"skipLibCheck": true,
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import tsconfigPaths from 'vite-tsconfig-paths';
|
||||
import { defineConfig } from 'vitest/config';
|
||||
|
||||
const TWENTY_API_URL = process.env.TWENTY_API_URL ?? 'http://localhost:2020';
|
||||
@@ -10,9 +11,12 @@ process.env.TWENTY_API_URL = TWENTY_API_URL;
|
||||
process.env.TWENTY_API_KEY = TWENTY_API_KEY;
|
||||
|
||||
export default defineConfig({
|
||||
resolve: {
|
||||
tsconfigPaths: true,
|
||||
},
|
||||
plugins: [
|
||||
tsconfigPaths({
|
||||
projects: ['tsconfig.spec.json'],
|
||||
ignoreConfigErrors: true,
|
||||
}),
|
||||
],
|
||||
test: {
|
||||
testTimeout: 120_000,
|
||||
hookTimeout: 120_000,
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
import tsconfigPaths from 'vite-tsconfig-paths';
|
||||
import { defineConfig } from 'vitest/config';
|
||||
|
||||
export default defineConfig({
|
||||
plugins: [
|
||||
tsconfigPaths({
|
||||
projects: ['tsconfig.spec.json'],
|
||||
ignoreConfigErrors: true,
|
||||
}),
|
||||
],
|
||||
test: {
|
||||
include: ['src/**/*.test.ts'],
|
||||
},
|
||||
});
|
||||
@@ -26,6 +26,7 @@
|
||||
],
|
||||
"exclude": [
|
||||
"src/constants/template/vitest.config.ts",
|
||||
"src/constants/template/vitest.unit.config.ts",
|
||||
"src/constants/template/src/**",
|
||||
"src/constants/template/tsconfig.spec.json"
|
||||
]
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
"**/__tests__/**",
|
||||
"src/constants/template/src/**",
|
||||
"src/constants/template/vitest.config.ts",
|
||||
"src/constants/template/vitest.unit.config.ts",
|
||||
"src/constants/template/tsconfig.spec.json"
|
||||
]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user