@undp/create-app 0.2.21 → 0.3.0

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.
Files changed (62) hide show
  1. package/README.md +8 -8
  2. package/bin/generateFiles/generateGitIgnore.js +0 -1
  3. package/bin/generateFiles/generatePackageJson.js +62 -61
  4. package/bin/generateFiles/generatePageForNext.js +3 -3
  5. package/bin/generateFiles/generateViteConfig.js +12 -4
  6. package/bin/templates/next/auth/README.md +6 -6
  7. package/bin/templates/next/auth/app/about/page.tsx +1 -1
  8. package/bin/templates/next/auth/app/login/page.tsx +1 -1
  9. package/bin/templates/next/auth/app/page.tsx +2 -2
  10. package/bin/templates/next/auth/app/user/page.tsx +1 -1
  11. package/bin/templates/next/auth/biome.json +3 -0
  12. package/bin/templates/next/basic/README.md +6 -6
  13. package/bin/templates/next/basic/app/about/page.tsx +1 -1
  14. package/bin/templates/next/basic/app/page.tsx +2 -2
  15. package/bin/templates/next/basic/biome.json +3 -0
  16. package/bin/templates/vite/basic/README.md +6 -6
  17. package/bin/templates/vite/basic/biome.json +3 -0
  18. package/bin/templates/vite/basic/src/App.tsx +3 -3
  19. package/bin/templates/vite/basic/tsconfig.json +1 -1
  20. package/bin/templates/vite/basic/vite.config.ts +1 -7
  21. package/bin/templates/vite/query/README.md +6 -6
  22. package/bin/templates/vite/query/biome.json +3 -0
  23. package/bin/templates/vite/query/src/App.tsx +4 -4
  24. package/bin/templates/vite/query/tsconfig.json +1 -1
  25. package/bin/templates/vite/query/vite.config.ts +1 -7
  26. package/bin/templates/vite/query+router/README.md +6 -6
  27. package/bin/templates/vite/query+router/biome.json +3 -0
  28. package/bin/templates/vite/query+router/src/App.tsx +2 -2
  29. package/bin/templates/vite/query+router/src/routes/queryDemo.tsx +2 -2
  30. package/bin/templates/vite/query+router/tsconfig.json +1 -1
  31. package/bin/templates/vite/query+router/vite.config.ts +1 -7
  32. package/bin/templates/vite/router/README.md +6 -6
  33. package/bin/templates/vite/router/biome.json +3 -0
  34. package/bin/templates/vite/router/src/App.tsx +2 -2
  35. package/bin/templates/vite/router/src/routes/about.tsx +1 -1
  36. package/bin/templates/vite/router/tsconfig.json +1 -1
  37. package/bin/templates/vite/router/vite.config.ts +1 -7
  38. package/bin/templates/viteWithLanguage/basic/README.md +18 -6
  39. package/bin/templates/viteWithLanguage/basic/biome.json +3 -0
  40. package/bin/templates/viteWithLanguage/basic/src/App.tsx +3 -3
  41. package/bin/templates/viteWithLanguage/basic/tsconfig.json +1 -1
  42. package/bin/templates/viteWithLanguage/basic/vite.config.ts +1 -7
  43. package/bin/templates/viteWithLanguage/query/README.md +18 -6
  44. package/bin/templates/viteWithLanguage/query/biome.json +3 -0
  45. package/bin/templates/viteWithLanguage/query/src/App.tsx +4 -4
  46. package/bin/templates/viteWithLanguage/query/tsconfig.json +1 -1
  47. package/bin/templates/viteWithLanguage/query/vite.config.ts +1 -7
  48. package/bin/templates/viteWithLanguage/query+router/README.md +20 -6
  49. package/bin/templates/viteWithLanguage/query+router/biome.json +3 -0
  50. package/bin/templates/viteWithLanguage/query+router/src/App.tsx +2 -2
  51. package/bin/templates/viteWithLanguage/query+router/src/components/Header.tsx +1 -1
  52. package/bin/templates/viteWithLanguage/query+router/src/routes/queryDemo.tsx +2 -2
  53. package/bin/templates/viteWithLanguage/query+router/tsconfig.json +1 -1
  54. package/bin/templates/viteWithLanguage/query+router/vite.config.ts +1 -7
  55. package/bin/templates/viteWithLanguage/router/README.md +20 -6
  56. package/bin/templates/viteWithLanguage/router/biome.json +3 -0
  57. package/bin/templates/viteWithLanguage/router/src/App.tsx +2 -2
  58. package/bin/templates/viteWithLanguage/router/src/components/Header.tsx +1 -1
  59. package/bin/templates/viteWithLanguage/router/src/routes/about.tsx +1 -1
  60. package/bin/templates/viteWithLanguage/router/tsconfig.json +1 -1
  61. package/bin/templates/viteWithLanguage/router/vite.config.ts +1 -7
  62. package/package.json +1 -1
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # 🏗️ UNDP Create App CLI ![npm](https://img.shields.io/npm/v/@undp/create-app)
2
2
 
3
- **`@undp/create-app`** is UNDP’s official **project scaffolding tool** for quickly bootstrapping frontend applications using **React**, and **TypeScript** — complete with sensible defaults for ESLint, Prettier.
3
+ **`@undp/create-app`** is UNDP’s official **project scaffolding tool** for quickly bootstrapping frontend applications using **React**, and **TypeScript** — complete with sensible defaults for Biome.
4
4
 
5
5
  [NPM Package](https://www.npmjs.com/package/@undp/create-app)
6
6
 
@@ -16,7 +16,7 @@
16
16
  - 🎨 Preconfigured for **UNDP’s Design System**
17
17
  - ⚡️ Optional integration with **Tanstack query** for data fetching
18
18
  - 📊 Optional integration with **@undp/data-viz** for interactive data visualization
19
- - 🌐 Optional integration with **i18next** for internationalization
19
+ - 🔣 Optional integration with **i18next** for internationalization
20
20
  - ✨ **Biome** preconfigured for consistent code style
21
21
 
22
22
  ---
@@ -25,12 +25,12 @@
25
25
 
26
26
  All setups include **Tailwind CSS** for styling and **Zustand** for state management.
27
27
 
28
- | Framework | Variants | Description |
29
- |------------|-----------|-------------|
30
- | **Vite** | Basic | Minimal React + TypeScript setup |
31
- | **Vite** | + Router | Adds TanStack Router for routing |
32
- | **Next.js** | Basic | SSR and file-based routing |
33
- | **Next.js** | + Auth | Includes authentication via Better Auth |
28
+ | Framework | Variants | Description | Internationalization Available |
29
+ |------------|-----------|-------------|-------------|
30
+ | **Vite** | Basic | Minimal React + TypeScript setup | ✅ |
31
+ | **Vite** | + Router | Adds TanStack Router for routing | ✅ |
32
+ | **Next.js** | Basic | SSR and file-based routing | ❌ |
33
+ | **Next.js** | + Auth | Includes authentication via Better Auth | ❌ |
34
34
 
35
35
  ---
36
36
 
@@ -13,7 +13,6 @@ build
13
13
  dist
14
14
  dist-ssr
15
15
  *.local
16
- .eslintcache
17
16
  stats.html
18
17
 
19
18
  # Editor directories and files
@@ -14,34 +14,34 @@ export function generatePackageJson(config) {
14
14
  const designSystemVer = `^${getLatestVersion('@undp/design-system-react')}`
15
15
  const zustandVer = `^${getLatestVersion('zustand')}`
16
16
  const dependenciesTemp = config.libraries.includes('peer') && config.libraries.includes('@undp/data-viz') ? {
17
- "@undp/design-system-react": designSystemVer,
18
- "@dnd-kit/core": "^6.3.1",
19
- "@dnd-kit/modifiers": "^9.0.0",
20
- "ajv": "^8.17.1",
21
- "dom-to-svg": "^0.12.2",
22
- "file-saver": "^2.0.5",
23
- "handlebars": "^4.7.8",
24
- "maplibre-gl": "^5.12.0",
25
- "marked": "^16.4.1",
26
- "math-expression-evaluator": "^2.0.7",
27
- "pmtiles": "^4.3.0",
28
- "react": "^19.2.3",
29
- "react-dom": "^19.2.3",
30
- "react-globe.gl": "^2.37.0",
31
- "three": "^0.180.0",
32
- "zustand": zustandVer
17
+ '@undp/design-system-react': designSystemVer,
18
+ '@dnd-kit/core': '^6.3.1',
19
+ '@dnd-kit/modifiers': '^9.0.0',
20
+ 'ajv': '^8.17.1',
21
+ 'dom-to-svg': '^0.12.2',
22
+ 'file-saver': '^2.0.5',
23
+ 'handlebars': '^4.7.8',
24
+ 'maplibre-gl': '^5.12.0',
25
+ 'marked': '^16.4.1',
26
+ 'math-expression-evaluator': '^2.0.7',
27
+ 'pmtiles': '^4.3.0',
28
+ 'react': '^19.2.3',
29
+ 'react-dom': '^19.2.3',
30
+ 'react-globe.gl': '^2.37.0',
31
+ 'three': '^0.180.0',
32
+ 'zustand': zustandVer
33
33
  } : {
34
- "@undp/design-system-react": designSystemVer,
35
- "react": "^19.2.3",
36
- "react-dom": "^19.2.3",
37
- "zustand": zustandVer
34
+ '@undp/design-system-react': designSystemVer,
35
+ 'react': '^19.2.3',
36
+ 'react-dom': '^19.2.3',
37
+ 'zustand': zustandVer
38
38
  };
39
39
 
40
40
  const dependencies = config.language && !config.framework.includes('next') ? {
41
41
  ...dependenciesTemp,
42
- "i18next": "^26.0.8",
43
- "i18next-browser-languagedetector": "^8.2.1",
44
- "react-i18next": "^17.0.6",
42
+ 'i18next': '^26.0.8',
43
+ 'i18next-browser-languagedetector': '^8.2.1',
44
+ 'react-i18next': '^17.0.6',
45
45
  } : {...dependenciesTemp}
46
46
 
47
47
  switch (config.framework) {
@@ -73,43 +73,40 @@ export function generatePackageJson(config) {
73
73
  Object.entries(dependencies).sort(([a], [b]) => a.localeCompare(b))
74
74
  );
75
75
  const devDependencies = config.framework.includes('vite') ? {
76
- "@biomejs/biome": "^2.4.12",
77
- "@tailwindcss/postcss": "^4.1.17",
78
- "@tailwindcss/vite": "^4.3.0",
79
- "@types/node": "^24.10.0",
80
- "@types/react": "^19.2.7",
81
- "@types/react-dom": "^19.2.3",
82
- "@vitejs/plugin-react": "^6.0.2",
83
- "autoprefixer": "^10.4.21",
84
- "babel-plugin-react-compiler": "^1.0.0",
85
- "postcss": "^8.5.6",
86
- "postcss-nested": "^7.0.2",
87
- "rimraf": "^6.1.0",
88
- "rollup-plugin-visualizer": "^6.0.5",
89
- "tailwind-animate": "^0.2.10",
90
- "tailwind-merge": "^3.4.0",
91
- "tailwindcss": "^4.1.17",
92
- "tailwindcss-animate": "^1.0.7",
93
- "typescript": "^5.9.3",
94
- "typescript-eslint": "^8.46.3",
95
- "vite": "^8.0.13",
96
- "vite-plugin-static-copy": "^4.1.0"
76
+ '@biomejs/biome': '^2.4.12',
77
+ '@tailwindcss/postcss': '^4.1.17',
78
+ '@tailwindcss/vite': '^4.3.0',
79
+ '@types/node': '^24.10.0',
80
+ '@types/react': '^19.2.7',
81
+ '@types/react-dom': '^19.2.3',
82
+ '@vitejs/plugin-react': '^6.0.2',
83
+ 'autoprefixer': '^10.4.21',
84
+ 'postcss': '^8.5.6',
85
+ 'postcss-nested': '^7.0.2',
86
+ 'rimraf': '^6.1.0',
87
+ 'rollup-plugin-visualizer': '^6.0.5',
88
+ 'tailwind-animate': '^0.2.10',
89
+ 'tailwind-merge': '^3.4.0',
90
+ 'tailwindcss': '^4.1.17',
91
+ 'tailwindcss-animate': '^1.0.7',
92
+ 'typescript': '^5.9.3',
93
+ 'vite': '^8.0.13',
94
+ 'vite-plugin-static-copy': '^4.1.0'
97
95
  } : {
98
- "@biomejs/biome": "^2.4.12",
99
- "@tailwindcss/postcss": "^4.1.17",
100
- "@types/node": "^24.10.0",
101
- "@types/react": "^19.2.7",
102
- "@types/react-dom": "^19.2.3",
103
- "postcss": "^8.5.6",
104
- "postcss-nested": "^7.0.2",
105
- "rimraf": "^6.1.0",
106
- "rollup-plugin-visualizer": "^6.0.5",
107
- "tailwind-animate": "^0.2.10",
108
- "tailwind-merge": "^3.3.1",
109
- "tailwindcss": "^4.1.17",
110
- "tailwindcss-animate": "^1.0.7",
111
- "typescript": "^5.9.3",
112
- "typescript-eslint": "^8.46.3"
96
+ '@biomejs/biome': '^2.4.12',
97
+ '@tailwindcss/postcss': '^4.1.17',
98
+ '@types/node': '^24.10.0',
99
+ '@types/react': '^19.2.7',
100
+ '@types/react-dom': '^19.2.3',
101
+ 'postcss': '^8.5.6',
102
+ 'postcss-nested': '^7.0.2',
103
+ 'rimraf': '^6.1.0',
104
+ 'rollup-plugin-visualizer': '^6.0.5',
105
+ 'tailwind-animate': '^0.2.10',
106
+ 'tailwind-merge': '^3.3.1',
107
+ 'tailwindcss': '^4.1.17',
108
+ 'tailwindcss-animate': '^1.0.7',
109
+ 'typescript': '^5.9.3',
113
110
  };
114
111
  const sortedDevDependencies = Object.fromEntries(
115
112
  Object.entries(devDependencies).sort(([a], [b]) => a.localeCompare(b))
@@ -131,14 +128,18 @@ export function generatePackageJson(config) {
131
128
  build: 'next build',
132
129
  start: 'next start',
133
130
  clean: 'rimraf node_modules && rimraf .next && rimraf package-lock.json',
134
- lint: "biome check . --write"
131
+ check: 'biome check .',
132
+ 'check:fix': 'biome check --write .',
133
+ 'check:unsafe': 'biome check --write --unsafe .',
135
134
  } : {
136
135
  dev: 'vite',
137
136
  build: 'tsc && vite build',
138
137
  preview: 'vite preview',
139
138
  clean: 'rimraf node_modules && rimraf dist && rimraf package-lock.json',
140
139
  'install:build': 'npm install && tsc && vite build',
141
- lint: "biome check . --write"
140
+ check: 'biome check .',
141
+ 'check:fix': 'biome check --write .',
142
+ 'check:unsafe': 'biome check --write --unsafe .',
142
143
  },
143
144
  dependencies: sortedDependencies,
144
145
  devDependencies: sortedDevDependencies
@@ -27,12 +27,12 @@ export default function Home() {
27
27
 
28
28
  const { data, isLoading, isError } = useTodoData();
29
29
 
30
- if (isLoading) return <Spinner size='lg' className='my-20 m-auto' />;
30
+ if (isLoading) return <Spinner size='lg' className='mx-auto my-20' />;
31
31
 
32
32
  if (isError) return <>Error</>;` : ''}
33
33
  return (
34
34
  <>
35
- <div className='flex gap-4 items-center justify-center my-8 mx-auto'>
35
+ <div className='mx-auto my-8 flex items-center justify-center gap-4'>
36
36
  <Image
37
37
  className='dark:invert'
38
38
  src='/imgs/next.svg'
@@ -73,7 +73,7 @@ export default function Home() {
73
73
  To get started, edit the App.tsx file.{' '}
74
74
  <span className='font-bold'>Count: {count}</span>
75
75
  </P>
76
- <div className='flex gap-4 justify-center mb-8'>
76
+ <div className='mb-8 flex justify-center gap-4'>
77
77
  <Button
78
78
  variant='tertiary'
79
79
  onClick={() => {
@@ -95,12 +95,16 @@ export default defineConfig({
95
95
  // 1. Append media first
96
96
  mediaRules
97
97
  .sort((a, b) => a.pxValue - b.pxValue)
98
- .forEach(({ rule }) => root.append(rule));
98
+ .forEach(({ rule }) => {
99
+ root.append(rule);
100
+ });
99
101
 
100
102
  // 2. Append container after
101
103
  containerRules
102
104
  .sort((a, b) => a.pxValue - b.pxValue)
103
- .forEach(({ rule }) => root.append(rule));
105
+ .forEach(({ rule }) => {
106
+ root.append(rule);
107
+ });
104
108
  },
105
109
  },` : `
106
110
  {
@@ -144,12 +148,16 @@ export default defineConfig({
144
148
  // 1. Append media first
145
149
  mediaRules
146
150
  .sort((a, b) => a.pxValue - b.pxValue)
147
- .forEach(({ rule }) => root.append(rule));
151
+ .forEach(({ rule }) => {
152
+ root.append(rule);
153
+ });
148
154
 
149
155
  // 2. Append container after
150
156
  containerRules
151
157
  .sort((a, b) => a.pxValue - b.pxValue)
152
- .forEach(({ rule }) => root.append(rule));
158
+ .forEach(({ rule }) => {
159
+ root.append(rule);
160
+ });
153
161
  },
154
162
  },`
155
163
  }
@@ -5,7 +5,7 @@ It includes:
5
5
  * UNDP Design System
6
6
  * Authentication with [Better Auth](https://www.better-auth.com/)
7
7
  * TailwindCSS
8
- * Code linting and formatting via ESLint and Prettier
8
+ * Code linting and formatting via Biome
9
9
 
10
10
  ## 🧩 Installation
11
11
 
@@ -33,19 +33,19 @@ The page will reload if you make edits. You will also see any lint errors in the
33
33
  - `npm run build`: Executes `next build` and builds the app for production and deployment.
34
34
  - `npm run preview`: Executes `next start` and serves the static build output locally.
35
35
  - `npm run clean`: Executes `rimraf node_modules && rimraf .next && rimraf package-lock.json` and remove node_modules folder, dist folder and package-lock.json.
36
- - `npm run lint`: Executes `npx eslint --fix && npx prettier . --write` and resolve all the linting and prettier errors.
36
+ - `npm run check`: Executes `biome check .` and lists all the linting and prettier errors.
37
+ - `npm run check:fix`: Executes `biome check --write .` and resolve all the linting and prettier errors.
37
38
 
38
39
  ## 🧰 Tooling Setup
39
40
 
40
- This project uses ESLint integrated with Prettier to automatically format and lint your code.
41
+ This project uses Biome integrated to automatically format and lint your code.
41
42
 
42
43
  If you’re using Visual Studio Code, install:
43
- * [ESLint extension](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)
44
- * [Prettier extension](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)
44
+ * [Biome extension](https://marketplace.visualstudio.com/items?itemName=biomejs.biome)
45
45
 
46
46
  Your editor should now show linting errors and automatically fix issues where possible.
47
47
 
48
- More info: [ESLint Integrations](http://eslint.org/docs/user-guide/integrations)
48
+ More info: [Biome Docs](https://biomejs.dev/guides/getting-started/)
49
49
 
50
50
  ## 🎨 Styling
51
51
 
@@ -6,7 +6,7 @@ import Image from 'next/image';
6
6
  export default function About() {
7
7
  return (
8
8
  <>
9
- <div className='flex gap-4 items-center justify-center my-8 mx-auto'>
9
+ <div className='mx-auto my-8 flex items-center justify-center gap-4'>
10
10
  <Image
11
11
  className='dark:invert'
12
12
  src='/imgs/next.svg'
@@ -16,7 +16,7 @@ export default function LoginPage() {
16
16
 
17
17
  return (
18
18
  <>
19
- <div className='flex gap-4 items-center justify-center my-8 mx-auto'>
19
+ <div className='mx-auto my-8 flex items-center justify-center gap-4'>
20
20
  <Image
21
21
  className='dark:invert'
22
22
  src='/imgs/next.svg'
@@ -11,7 +11,7 @@ export default function Home() {
11
11
  const { increment, decrement } = useCounterActions();
12
12
  return (
13
13
  <>
14
- <div className='flex gap-4 items-center justify-center my-8 mx-auto'>
14
+ <div className='mx-auto my-8 flex items-center justify-center gap-4'>
15
15
  <Image
16
16
  className='dark:invert'
17
17
  src='/imgs/next.svg'
@@ -52,7 +52,7 @@ export default function Home() {
52
52
  To get started, edit the App.tsx file.{' '}
53
53
  <span className='font-bold'>Count: {count}</span>
54
54
  </P>
55
- <div className='flex gap-4 justify-center'>
55
+ <div className='flex justify-center gap-4'>
56
56
  <Button
57
57
  variant='tertiary'
58
58
  onClick={() => {
@@ -26,7 +26,7 @@ export default function UserPage() {
26
26
 
27
27
  return (
28
28
  <>
29
- <div className='flex gap-4 items-center justify-center my-8 mx-auto'>
29
+ <div className='mx-auto my-8 flex items-center justify-center gap-4'>
30
30
  <Image
31
31
  className='dark:invert'
32
32
  src='/imgs/next.svg'
@@ -45,6 +45,9 @@
45
45
  "correctness": {
46
46
  "noUnusedVariables": "error",
47
47
  "noUndeclaredVariables": "error"
48
+ },
49
+ "nursery": {
50
+ "useSortedClasses": "error"
48
51
  }
49
52
  }
50
53
  },
@@ -4,7 +4,7 @@ It includes:
4
4
  * Next 16.x with React compiler
5
5
  * UNDP Design System
6
6
  * TailwindCSS
7
- * Code linting and formatting via ESLint and Prettier
7
+ * Code linting and formatting via Biome
8
8
 
9
9
  ## 🧩 Installation
10
10
 
@@ -32,19 +32,19 @@ The page will reload if you make edits. You will also see any lint errors in the
32
32
  - `npm run build`: Executes `next build` and builds the app for production and deployment.
33
33
  - `npm run preview`: Executes `next start` and serves the static build output locally.
34
34
  - `npm run clean`: Executes `rimraf node_modules && rimraf .next && rimraf package-lock.json` and remove node_modules folder, dist folder and package-lock.json.
35
- - `npm run lint`: Executes `npx eslint --fix && npx prettier . --write` and resolve all the linting and prettier errors.
35
+ - `npm run check`: Executes `biome check .` and lists all the linting and prettier errors.
36
+ - `npm run check:fix`: Executes `biome check --write .` and resolve all the linting and prettier errors.
36
37
 
37
38
  ## 🧰 Tooling Setup
38
39
 
39
- This project uses ESLint integrated with Prettier to automatically format and lint your code.
40
+ This project uses Biome integrated to automatically format and lint your code.
40
41
 
41
42
  If you’re using Visual Studio Code, install:
42
- * [ESLint extension](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)
43
- * [Prettier extension](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)
43
+ * [Biome extension](https://marketplace.visualstudio.com/items?itemName=biomejs.biome)
44
44
 
45
45
  Your editor should now show linting errors and automatically fix issues where possible.
46
46
 
47
- More info: [ESLint Integrations](http://eslint.org/docs/user-guide/integrations)
47
+ More info: [Biome Docs](https://biomejs.dev/guides/getting-started/)
48
48
 
49
49
  ## 🎨 Styling
50
50
 
@@ -6,7 +6,7 @@ import Image from 'next/image';
6
6
  export default function About() {
7
7
  return (
8
8
  <>
9
- <div className='flex gap-4 items-center justify-center my-8 mx-auto'>
9
+ <div className='mx-auto my-8 flex items-center justify-center gap-4'>
10
10
  <Image
11
11
  className='dark:invert'
12
12
  src='/imgs/next.svg'
@@ -11,7 +11,7 @@ export default function Home() {
11
11
  const { increment, decrement } = useCounterActions();
12
12
  return (
13
13
  <>
14
- <div className='flex gap-4 items-center justify-center my-8 mx-auto'>
14
+ <div className='mx-auto my-8 flex items-center justify-center gap-4'>
15
15
  <Image
16
16
  className='dark:invert'
17
17
  src='/imgs/next.svg'
@@ -52,7 +52,7 @@ export default function Home() {
52
52
  To get started, edit the App.tsx file.{' '}
53
53
  <span className='font-bold'>Count: {count}</span>
54
54
  </P>
55
- <div className='flex gap-4 justify-center'>
55
+ <div className='flex justify-center gap-4'>
56
56
  <Button
57
57
  variant='tertiary'
58
58
  onClick={() => {
@@ -45,6 +45,9 @@
45
45
  "correctness": {
46
46
  "noUnusedVariables": "error",
47
47
  "noUndeclaredVariables": "error"
48
+ },
49
+ "nursery": {
50
+ "useSortedClasses": "error"
48
51
  }
49
52
  }
50
53
  },
@@ -4,7 +4,7 @@ It includes:
4
4
  * React 19.x with React compiler
5
5
  * UNDP Design System
6
6
  * TailwindCSS
7
- * Code linting and formatting via ESLint and Prettier
7
+ * Code linting and formatting via Biome
8
8
 
9
9
  ## 🧩 Installation
10
10
 
@@ -32,19 +32,19 @@ The page will reload if you make edits. You will also see any lint errors in the
32
32
  - `npm run build`: Executes `tsc && vite build` and builds the app for production and deployment.
33
33
  - `npm run preview`: Executes `vite preview` and serves the static build output (from vite build) locally.
34
34
  - `npm run clean`: Executes `rimraf node_modules && rimraf dist && rimraf package-lock.json` and remove node_modules folder, dist folder and package-lock.json.
35
- - `npm run lint`: Executes `npx eslint --fix && npx prettier . --write` and resolve all the linting and prettier errors.
35
+ - `npm run check`: Executes `biome check .` and lists all the linting and prettier errors.
36
+ - `npm run check:fix`: Executes `biome check --write .` and resolve all the linting and prettier errors.
36
37
 
37
38
  ## 🧰 Tooling Setup
38
39
 
39
- This project uses ESLint integrated with Prettier to automatically format and lint your code.
40
+ This project uses Biome integrated to automatically format and lint your code.
40
41
 
41
42
  If you’re using Visual Studio Code, install:
42
- * [ESLint extension](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)
43
- * [Prettier extension](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)
43
+ * [Biome extension](https://marketplace.visualstudio.com/items?itemName=biomejs.biome)
44
44
 
45
45
  Your editor should now show linting errors and automatically fix issues where possible.
46
46
 
47
- More info: [ESLint Integrations](http://eslint.org/docs/user-guide/integrations)
47
+ More info: [Biome Docs](https://biomejs.dev/guides/getting-started/)
48
48
 
49
49
  ## 🎨 Styling
50
50
 
@@ -45,6 +45,9 @@
45
45
  "correctness": {
46
46
  "noUnusedVariables": "error",
47
47
  "noUndeclaredVariables": "error"
48
+ },
49
+ "nursery": {
50
+ "useSortedClasses": "error"
48
51
  }
49
52
  }
50
53
  },
@@ -10,8 +10,8 @@ function App() {
10
10
  const count = useCounter();
11
11
  const { increment, decrement } = useCounterActions();
12
12
  return (
13
- <div className=' min-h-screen flex flex-col justify-center'>
14
- <div className='flex gap-4 items-center justify-center my-8 mx-auto'>
13
+ <div className='flex min-h-screen flex-col justify-center'>
14
+ <div className='mx-auto my-8 flex items-center justify-center gap-4'>
15
15
  <img
16
16
  src='./imgs/Vitejs-logo.svg'
17
17
  alt='vite logo'
@@ -44,7 +44,7 @@ function App() {
44
44
  To get started, edit the App.tsx file.{' '}
45
45
  <span className='font-bold'>Count: {count}</span>
46
46
  </P>
47
- <div className='flex gap-4 justify-center'>
47
+ <div className='flex justify-center gap-4'>
48
48
  <Button
49
49
  variant='tertiary'
50
50
  onClick={() => {
@@ -24,6 +24,6 @@
24
24
  }
25
25
  },
26
26
  "files": [],
27
- "include": ["eslint.config.mjs", "src", "tailwind.config.js"],
27
+ "include": ["src", "tailwind.config.js"],
28
28
  "references": [{ "path": "./tsconfig.node.json" }]
29
29
  }
@@ -2,7 +2,6 @@ import path from 'path';
2
2
 
3
3
  import { defineConfig } from 'vite';
4
4
  import react from '@vitejs/plugin-react';
5
- import eslint from '@nabla/vite-plugin-eslint';
6
5
  import { visualizer } from 'rollup-plugin-visualizer';
7
6
  import postcssNested from 'postcss-nested';
8
7
  import tailwindcss from '@tailwindcss/postcss';
@@ -10,12 +9,7 @@ import { viteStaticCopy } from 'vite-plugin-static-copy';
10
9
 
11
10
  export default defineConfig({
12
11
  plugins: [
13
- react({
14
- babel: {
15
- plugins: ['babel-plugin-react-compiler'],
16
- },
17
- }),
18
- eslint(),
12
+ react(),
19
13
  visualizer({ filename: 'stats.html', open: true }),
20
14
  viteStaticCopy({
21
15
  targets: [{ src: 'staticwebapp.config.json', dest: '' }],
@@ -5,7 +5,7 @@ It includes:
5
5
  * UNDP Design System
6
6
  * Data fetching with [TanStack Query](https://tanstack.com/query)
7
7
  * TailwindCSS
8
- * Code linting and formatting via ESLint and Prettier
8
+ * Code linting and formatting via Biome
9
9
 
10
10
  ## 🧩 Installation
11
11
 
@@ -33,19 +33,19 @@ The page will reload if you make edits. You will also see any lint errors in the
33
33
  - `npm run build`: Executes `tsc && vite build` and builds the app for production and deployment.
34
34
  - `npm run preview`: Executes `vite preview` and serves the static build output (from vite build) locally.
35
35
  - `npm run clean`: Executes `rimraf node_modules && rimraf dist && rimraf package-lock.json` and remove node_modules folder, dist folder and package-lock.json.
36
- - `npm run lint`: Executes `npx eslint --fix && npx prettier . --write` and resolve all the linting and prettier errors.
36
+ - `npm run check`: Executes `biome check .` and lists all the linting and prettier errors.
37
+ - `npm run check:fix`: Executes `biome check --write .` and resolve all the linting and prettier errors.
37
38
 
38
39
  ## 🧰 Tooling Setup
39
40
 
40
- This project uses ESLint integrated with Prettier to automatically format and lint your code.
41
+ This project uses Biome integrated to automatically format and lint your code.
41
42
 
42
43
  If you’re using Visual Studio Code, install:
43
- * [ESLint extension](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)
44
- * [Prettier extension](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)
44
+ * [Biome extension](https://marketplace.visualstudio.com/items?itemName=biomejs.biome)
45
45
 
46
46
  Your editor should now show linting errors and automatically fix issues where possible.
47
47
 
48
- More info: [ESLint Integrations](http://eslint.org/docs/user-guide/integrations)
48
+ More info: [Biome Docs](https://biomejs.dev/guides/getting-started/)
49
49
 
50
50
  ## 🎨 Styling
51
51
 
@@ -45,6 +45,9 @@
45
45
  "correctness": {
46
46
  "noUnusedVariables": "error",
47
47
  "noUndeclaredVariables": "error"
48
+ },
49
+ "nursery": {
50
+ "useSortedClasses": "error"
48
51
  }
49
52
  }
50
53
  },
@@ -26,12 +26,12 @@ function App() {
26
26
  const count = useCounter();
27
27
  const { increment, decrement } = useCounterActions();
28
28
 
29
- if (isLoading) return <Spinner size='lg' className='my-20 m-auto' />;
29
+ if (isLoading) return <Spinner size='lg' className='mx-auto my-20' />;
30
30
 
31
31
  if (isError) return <>Error</>;
32
32
  return (
33
- <div className=' min-h-screen flex flex-col justify-center'>
34
- <div className='flex gap-4 items-center justify-center my-8 mx-auto'>
33
+ <div className='flex min-h-screen flex-col justify-center'>
34
+ <div className='mx-auto my-8 flex items-center justify-center gap-4'>
35
35
  <img
36
36
  src='./imgs/Vitejs-logo.svg'
37
37
  alt='vite logo'
@@ -71,7 +71,7 @@ function App() {
71
71
  To get started, edit the App.tsx file.{' '}
72
72
  <span className='font-bold'>Count: {count}</span>
73
73
  </P>
74
- <div className='flex gap-4 justify-center mb-8'>
74
+ <div className='mb-8 flex justify-center gap-4'>
75
75
  <Button
76
76
  variant='tertiary'
77
77
  onClick={() => {
@@ -24,6 +24,6 @@
24
24
  }
25
25
  },
26
26
  "files": [],
27
- "include": ["eslint.config.mjs", "src", "tailwind.config.js"],
27
+ "include": ["src", "tailwind.config.js"],
28
28
  "references": [{ "path": "./tsconfig.node.json" }]
29
29
  }