create-tririga-react-ts-vite-app 1.0.0 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,28 +1,28 @@
1
- # create-pb-tririga-react-app
2
-
3
- A CLI tool to scaffold modern TRIRIGA UX applications using React, TypeScript, and Vite.
4
-
5
- ## Usage
6
-
7
- You don't need to install this package locally. You can run it directly using `npx` and replace `my-tririga-app` with your desired app name:
8
-
9
- ```bash
10
- npx create-pb-tririga-react-app my-tririga-app
11
- ```
12
-
13
- ## Features
14
-
15
- - **Framework**: React 18 + TypeScript
16
- - **Build Tool**: Vite (Fast HMR & Bundling)
17
- - **UI Library**: ShadCN
18
- - **Routing**: HashRouter (Compatible with TRIRIGA context paths)
19
- - **Deployment**: Ready-to-use scripts for `tri-deploy`
20
-
21
- ## Getting Started with your new app
22
-
23
- Once created:
24
-
25
- 1. `cd my-tririga-app`
26
- 2. Install pnpm `npm install -g pnpm`
27
- 3. Install dependencies `pnpm install`
1
+ # create-pb-tririga-react-app
2
+
3
+ A CLI tool to scaffold modern TRIRIGA UX applications using React, TypeScript, and Vite.
4
+
5
+ ## Usage
6
+
7
+ You don't need to install this package locally. You can run it directly using `npx` and replace `my-tririga-app` with your desired app name:
8
+
9
+ ```bash
10
+ npx create-pb-tririga-react-app my-tririga-app
11
+ ```
12
+
13
+ ## Features
14
+
15
+ - **Framework**: React 18 + TypeScript
16
+ - **Build Tool**: Vite (Fast HMR & Bundling)
17
+ - **UI Library**: ShadCN
18
+ - **Routing**: HashRouter (Compatible with TRIRIGA context paths)
19
+ - **Deployment**: Ready-to-use scripts for `tri-deploy`
20
+
21
+ ## Getting Started with your new app
22
+
23
+ Once created:
24
+
25
+ 1. `cd my-tririga-app`
26
+ 2. Install pnpm `npm install -g pnpm`
27
+ 3. Install dependencies `pnpm install`
28
28
  4. Make your first deployment with `pnpm run build:deploy`
package/index.js CHANGED
@@ -1,138 +1,138 @@
1
- #!/usr/bin/env node
2
-
3
- const fs = require('fs');
4
- const path = require('path');
5
- const readline = require('readline');
6
-
7
- // 1. Get project name from command line
8
- const projectName = process.argv[2] || 'my-tririga-app';
9
- const currentDir = process.cwd();
10
- const projectDir = path.join(currentDir, projectName);
11
-
12
- // 2. Create Directory
13
- if (fs.existsSync(projectDir)) {
14
- console.error(`Directory ${projectName} already exists.`);
15
- process.exit(1);
16
- }
17
- fs.mkdirSync(projectDir);
18
-
19
- // 3. Copy Template Files
20
- const templateDir = path.join(__dirname, 'template');
21
-
22
- function copyRecursiveSync(src, dest) {
23
- const exists = fs.existsSync(src);
24
- const stats = exists && fs.statSync(src);
25
- const isDirectory = exists && stats.isDirectory();
26
-
27
- if (isDirectory) {
28
- fs.mkdirSync(dest, { recursive: true });
29
- fs.readdirSync(src).forEach(childItemName => {
30
- copyRecursiveSync(path.join(src, childItemName), path.join(dest, childItemName));
31
- });
32
- } else {
33
- fs.copyFileSync(src, dest);
34
- }
35
- }
36
-
37
- copyRecursiveSync(templateDir, projectDir);
38
-
39
- // Rename _gitignore to .gitignore
40
- const gitignorePath = path.join(projectDir, '_gitignore');
41
- if (fs.existsSync(gitignorePath)) {
42
- fs.renameSync(gitignorePath, path.join(projectDir, '.gitignore'));
43
- }
44
-
45
- // Helper function for user prompts
46
- function askQuestion(query, hidden = false) {
47
- const rl = readline.createInterface({
48
- input: process.stdin,
49
- output: process.stdout,
50
- });
51
-
52
- if (hidden) {
53
- let stdinListener = (char) => {
54
- char = char + '';
55
- switch (char) {
56
- case '\n':
57
- case '\r':
58
- case '\u0004':
59
- process.stdin.removeListener('data', stdinListener);
60
- break;
61
- default:
62
- process.stdout.write('\x1B[2K\x1B[200D' + query + Array(rl.line.length + 1).join('*'));
63
- break;
64
- }
65
- };
66
- process.stdin.on('data', stdinListener);
67
- }
68
-
69
- return new Promise((resolve) => rl.question(query, (ans) => {
70
- rl.close();
71
- if (hidden) console.log(); // Add newline after hidden input
72
- resolve(ans);
73
- }));
74
- }
75
-
76
- async function configureApp() {
77
- console.log('\n--- Configuration Setup ---\n');
78
-
79
- const triUrl = await askQuestion('TRIRIGA Environment URL (e.g., https://your-tririga-server.com): ');
80
- const triUser = await askQuestion('TRIRIGA Username: ');
81
- const triPassword = await askQuestion('TRIRIGA Password: ', true);
82
- const appTitle = await askQuestion('App Title (e.g., TRIRIGA Service Request): ');
83
- const appExposedName = await askQuestion('Application Exposed Name (e.g., myTririgaApp): ');
84
- const modelAndView = await askQuestion('Model and View Name (e.g., myTririgaApp): ');
85
- const webViewMetadataName = await askQuestion(`Web View Metadata Exposed Name (default: ${projectName}): `);
86
-
87
- const finalWebViewName = webViewMetadataName || projectName;
88
-
89
- // 4. Update package.json name with Web View Metadata Exposed Name
90
- const pkgJsonPath = path.join(projectDir, 'package.json');
91
- const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf8'));
92
- pkgJson.name = finalWebViewName;
93
- fs.writeFileSync(pkgJsonPath, JSON.stringify(pkgJson, null, 2));
94
-
95
- // 5. Update .env file
96
- const envExamplePath = path.join(projectDir, '.env.example');
97
- const envPath = path.join(projectDir, '.env');
98
- if (fs.existsSync(envExamplePath)) {
99
- let envContent = fs.readFileSync(envExamplePath, 'utf8');
100
- envContent = envContent.replace(/TRI_URL=.*/g, `TRI_URL=${triUrl}`);
101
- envContent = envContent.replace(/TRI_USER=.*/g, `TRI_USER=${triUser}`);
102
- envContent = envContent.replace(/TRI_PASSWORD=.*/g, `TRI_PASSWORD=${triPassword}`);
103
- fs.writeFileSync(envPath, envContent);
104
- // Delete .env.example
105
- fs.unlinkSync(envExamplePath);
106
- }
107
-
108
- // 6. Update tririgaService.ts
109
- const tririgaServicePath = path.join(projectDir, 'src', 'services', 'tririgaService.ts');
110
- if (fs.existsSync(tririgaServicePath)) {
111
- let tsContent = fs.readFileSync(tririgaServicePath, 'utf8');
112
- tsContent = tsContent.replace(/modelAndView:\s*"[^"]*"/, `modelAndView: "${modelAndView}"`);
113
- tsContent = tsContent.replace(/appExposedName:\s*"[^"]*"/, `appExposedName: "${appExposedName}"`);
114
- fs.writeFileSync(tririgaServicePath, tsContent);
115
- }
116
-
117
- // 7. Update vite.config.ts base path
118
- const viteConfigPath = path.join(projectDir, 'vite.config.ts');
119
- if (fs.existsSync(viteConfigPath)) {
120
- let viteContent = fs.readFileSync(viteConfigPath, 'utf8');
121
- // Regex matches the whole base line and replaces it, handling single or double quotes
122
- viteContent = viteContent.replace(/base:\s*['"]\/app\/[^/]+\/['"],/, `base: '/app/${appExposedName}/',`);
123
- fs.writeFileSync(viteConfigPath, viteContent);
124
- }
125
-
126
- // 8. Update index.html Title
127
- const indexHtmlPath = path.join(projectDir, 'index.html');
128
- if (fs.existsSync(indexHtmlPath) && appTitle) {
129
- let htmlContent = fs.readFileSync(indexHtmlPath, 'utf8');
130
- htmlContent = htmlContent.replace(/<title>.*<\/title>/, `<title>${appTitle}</title>`);
131
- fs.writeFileSync(indexHtmlPath, htmlContent);
132
- }
133
-
134
- console.log(`\nSuccess! Created and configured ${projectName}.`);
135
- console.log(`\nTo get started:\n cd ${projectName}\n npm install -g pnpm\n pnpm install\n pnpm run build:deploy\n`);
136
- }
137
-
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+ const readline = require('readline');
6
+
7
+ // 1. Get project name from command line
8
+ const projectName = process.argv[2] || 'my-tririga-app';
9
+ const currentDir = process.cwd();
10
+ const projectDir = path.join(currentDir, projectName);
11
+
12
+ // 2. Create Directory
13
+ if (fs.existsSync(projectDir)) {
14
+ console.error(`Directory ${projectName} already exists.`);
15
+ process.exit(1);
16
+ }
17
+ fs.mkdirSync(projectDir);
18
+
19
+ // 3. Copy Template Files
20
+ const templateDir = path.join(__dirname, 'template');
21
+
22
+ function copyRecursiveSync(src, dest) {
23
+ const exists = fs.existsSync(src);
24
+ const stats = exists && fs.statSync(src);
25
+ const isDirectory = exists && stats.isDirectory();
26
+
27
+ if (isDirectory) {
28
+ fs.mkdirSync(dest, { recursive: true });
29
+ fs.readdirSync(src).forEach(childItemName => {
30
+ copyRecursiveSync(path.join(src, childItemName), path.join(dest, childItemName));
31
+ });
32
+ } else {
33
+ fs.copyFileSync(src, dest);
34
+ }
35
+ }
36
+
37
+ copyRecursiveSync(templateDir, projectDir);
38
+
39
+ // Rename _gitignore to .gitignore
40
+ const gitignorePath = path.join(projectDir, '_gitignore');
41
+ if (fs.existsSync(gitignorePath)) {
42
+ fs.renameSync(gitignorePath, path.join(projectDir, '.gitignore'));
43
+ }
44
+
45
+ // Helper function for user prompts
46
+ function askQuestion(query, hidden = false) {
47
+ const rl = readline.createInterface({
48
+ input: process.stdin,
49
+ output: process.stdout,
50
+ });
51
+
52
+ if (hidden) {
53
+ let stdinListener = (char) => {
54
+ char = char + '';
55
+ switch (char) {
56
+ case '\n':
57
+ case '\r':
58
+ case '\u0004':
59
+ process.stdin.removeListener('data', stdinListener);
60
+ break;
61
+ default:
62
+ process.stdout.write('\x1B[2K\x1B[200D' + query + Array(rl.line.length + 1).join('*'));
63
+ break;
64
+ }
65
+ };
66
+ process.stdin.on('data', stdinListener);
67
+ }
68
+
69
+ return new Promise((resolve) => rl.question(query, (ans) => {
70
+ rl.close();
71
+ if (hidden) console.log(); // Add newline after hidden input
72
+ resolve(ans);
73
+ }));
74
+ }
75
+
76
+ async function configureApp() {
77
+ console.log('\n--- Configuration Setup ---\n');
78
+
79
+ const triUrl = await askQuestion('TRIRIGA Environment URL (e.g., https://your-tririga-server.com): ');
80
+ const triUser = await askQuestion('TRIRIGA Username: ');
81
+ const triPassword = await askQuestion('TRIRIGA Password: ', true);
82
+ const appTitle = await askQuestion('App Title (e.g., TRIRIGA Service Request): ');
83
+ const appExposedName = await askQuestion('Application Exposed Name (e.g., myTririgaApp): ');
84
+ const modelAndView = await askQuestion('Model and View Name (e.g., myTririgaApp): ');
85
+ const webViewMetadataName = await askQuestion(`Web View Metadata Exposed Name (default: ${projectName}): `);
86
+
87
+ const finalWebViewName = webViewMetadataName || projectName;
88
+
89
+ // 4. Update package.json name with Web View Metadata Exposed Name
90
+ const pkgJsonPath = path.join(projectDir, 'package.json');
91
+ const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf8'));
92
+ pkgJson.name = finalWebViewName;
93
+ fs.writeFileSync(pkgJsonPath, JSON.stringify(pkgJson, null, 2));
94
+
95
+ // 5. Update .env file
96
+ const envExamplePath = path.join(projectDir, '.env.example');
97
+ const envPath = path.join(projectDir, '.env');
98
+ if (fs.existsSync(envExamplePath)) {
99
+ let envContent = fs.readFileSync(envExamplePath, 'utf8');
100
+ envContent = envContent.replace(/TRI_URL=.*/g, `TRI_URL=${triUrl}`);
101
+ envContent = envContent.replace(/TRI_USER=.*/g, `TRI_USER=${triUser}`);
102
+ envContent = envContent.replace(/TRI_PASSWORD=.*/g, `TRI_PASSWORD=${triPassword}`);
103
+ fs.writeFileSync(envPath, envContent);
104
+ // Delete .env.example
105
+ fs.unlinkSync(envExamplePath);
106
+ }
107
+
108
+ // 6. Update tririgaService.ts
109
+ const tririgaServicePath = path.join(projectDir, 'src', 'services', 'tririgaService.ts');
110
+ if (fs.existsSync(tririgaServicePath)) {
111
+ let tsContent = fs.readFileSync(tririgaServicePath, 'utf8');
112
+ tsContent = tsContent.replace(/modelAndView:\s*"[^"]*"/, `modelAndView: "${modelAndView}"`);
113
+ tsContent = tsContent.replace(/appExposedName:\s*"[^"]*"/, `appExposedName: "${appExposedName}"`);
114
+ fs.writeFileSync(tririgaServicePath, tsContent);
115
+ }
116
+
117
+ // 7. Update vite.config.ts base path
118
+ const viteConfigPath = path.join(projectDir, 'vite.config.ts');
119
+ if (fs.existsSync(viteConfigPath)) {
120
+ let viteContent = fs.readFileSync(viteConfigPath, 'utf8');
121
+ // Regex matches the whole base line and replaces it, handling single or double quotes
122
+ viteContent = viteContent.replace(/base:\s*['"]\/app\/[^/]+\/['"],/, `base: '/app/${appExposedName}/',`);
123
+ fs.writeFileSync(viteConfigPath, viteContent);
124
+ }
125
+
126
+ // 8. Update index.html Title
127
+ const indexHtmlPath = path.join(projectDir, 'index.html');
128
+ if (fs.existsSync(indexHtmlPath) && appTitle) {
129
+ let htmlContent = fs.readFileSync(indexHtmlPath, 'utf8');
130
+ htmlContent = htmlContent.replace(/<title>.*<\/title>/, `<title>${appTitle}</title>`);
131
+ fs.writeFileSync(indexHtmlPath, htmlContent);
132
+ }
133
+
134
+ console.log(`\nSuccess! Created and configured ${projectName}.`);
135
+ console.log(`\nTo get started:\n cd ${projectName}\n npm install -g pnpm\n pnpm install\n pnpm run build:deploy\n`);
136
+ }
137
+
138
138
  configureApp();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-tririga-react-ts-vite-app",
3
- "version": "1.0.0",
3
+ "version": "1.0.3",
4
4
  "description": "Scaffold a TRIRIGA React app with Vite and TypeScript",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -17,6 +17,10 @@
17
17
  "vite",
18
18
  "scaffold"
19
19
  ],
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/nrichard1/create-tririga-react-ts-vite-app.git"
23
+ },
20
24
  "author": "Noah Richard",
21
25
  "license": "ISC"
22
26
  }
@@ -1,14 +1,14 @@
1
- # Local Development Config
2
- VITE_TRIRIGA_URL=http://localhost:8001
3
- VITE_INSTANCE_ID=-1
4
- VITE_CONTEXT_PATH=/app
5
- VITE_MODEL_AND_VIEW=devView
6
- VITE_BASE_PATH=/app/devView
7
- VITE_EXPOSED_NAME=devView
8
- VITE_SSO=false
9
- VITE_AUTO_LOGIN=true
10
-
11
- # Deployment Config (used by tri-deploy)
12
- TRI_URL=https://your-tririga-server.com
13
- TRI_USER=your-username
14
- TRI_PASSWORD=your-password
1
+ # Local Development Config
2
+ VITE_TRIRIGA_URL=http://localhost:8001
3
+ VITE_INSTANCE_ID=-1
4
+ VITE_CONTEXT_PATH=/app
5
+ VITE_MODEL_AND_VIEW=devView
6
+ VITE_BASE_PATH=/app/devView
7
+ VITE_EXPOSED_NAME=devView
8
+ VITE_SSO=false
9
+ VITE_AUTO_LOGIN=true
10
+
11
+ # Deployment Config (used by tri-deploy)
12
+ TRI_URL=https://your-tririga-server.com
13
+ TRI_USER=your-username
14
+ TRI_PASSWORD=your-password
@@ -1,73 +1,73 @@
1
- # TRIRIGA React App Template
2
-
3
- This is a template for building IBM TRIRIGA UX applications using React, TypeScript, and Vite.
4
-
5
- ## Getting Started
6
-
7
- 1. **Install pnpm** (If not already installed)
8
- ```
9
- npm install -g pnpm
10
- ```
11
-
12
- 2. **Install Dependencies**
13
- ```
14
- pnpm install
15
- ```
16
-
17
-
18
- ## Deployment
19
-
20
- To deploy to a TRIRIGA environment:
21
-
22
- 1. **Install Depoyment Tool** (If not already installed globally)
23
- ```
24
- npm install -g @tririga/tri-deploy
25
- ```
26
- *Note: If you prefer not to install globally, you can add `@tririga/tri-deploy` to your devDependencies.*
27
-
28
- 2. **Configure Credentials**
29
- Copy `.env.example` to `.env` and update the values for your deployment settings.
30
- ```
31
- cp .env.example .env
32
- ```
33
- Ensure your `.env` file has the correct `TRI_URL`, `TRI_USER`, and `TRI_PASSWORD`.
34
-
35
- 3. **Configure tririgaService.js file**
36
- Update the TriAppConfig values `modelAndView` and `appExposedName` to match your app configuration in TRIRIGA.
37
- Example:
38
- `modelAndView: "myTririgaApp",`
39
- `appExposedName: "myTririgaApp",`
40
-
41
- 4. **Configure vite.config.ts file**
42
- Update the base value to match your application's exposed name in TRIRIGA.
43
- Example:
44
- base: '/app/myReactApp/',
45
-
46
- 5. **Configure package.json**
47
- "name": "my-tririga-app",
48
-
49
- *Note: the name should match your Web View Metadata Exposed Name n TRIRIGA*
50
-
51
- 6. **Run Deployment**
52
- The view name will be taken from the `name` field in `package.json`.
53
- ```
54
- pnpm run build:deploy
55
- ```
56
-
57
- ## Browser Support & Polyfills
58
-
59
- ## Project Structure
60
-
61
- - `src/components`: Reusable UI components.
62
- - `src/pages`: Top-level page definitions (routes).
63
- - `src/model`: TRIRIGA AppModel (Datasources).
64
- - `src/services`: API services (Auth, Config).
65
- - `public/tri-app-config.json`: Local development configuration mocking the server response.
66
-
67
- ## Tech Stack
68
-
69
- - [React](https://react.dev/)
70
- - [TypeScript](https://www.typescriptlang.org/)
71
- - [Vite](https://vitejs.dev/)
72
- - [Carbon Design System](https://carbondesignsystem.com/)
73
- - [@tririga/tririga-react-components](https://www.npmjs.com/package/@tririga/tririga-react-components)
1
+ # TRIRIGA React App Template
2
+
3
+ This is a template for building IBM TRIRIGA UX applications using React, TypeScript, and Vite.
4
+
5
+ ## Getting Started
6
+
7
+ 1. **Install pnpm** (If not already installed)
8
+ ```
9
+ npm install -g pnpm
10
+ ```
11
+
12
+ 2. **Install Dependencies**
13
+ ```
14
+ pnpm install
15
+ ```
16
+
17
+
18
+ ## Deployment
19
+
20
+ To deploy to a TRIRIGA environment:
21
+
22
+ 1. **Install Depoyment Tool** (If not already installed globally)
23
+ ```
24
+ npm install -g @tririga/tri-deploy
25
+ ```
26
+ *Note: If you prefer not to install globally, you can add `@tririga/tri-deploy` to your devDependencies.*
27
+
28
+ 2. **Configure Credentials**
29
+ Copy `.env.example` to `.env` and update the values for your deployment settings.
30
+ ```
31
+ cp .env.example .env
32
+ ```
33
+ Ensure your `.env` file has the correct `TRI_URL`, `TRI_USER`, and `TRI_PASSWORD`.
34
+
35
+ 3. **Configure tririgaService.js file**
36
+ Update the TriAppConfig values `modelAndView` and `appExposedName` to match your app configuration in TRIRIGA.
37
+ Example:
38
+ `modelAndView: "myTririgaApp",`
39
+ `appExposedName: "myTririgaApp",`
40
+
41
+ 4. **Configure vite.config.ts file**
42
+ Update the base value to match your application's exposed name in TRIRIGA.
43
+ Example:
44
+ base: '/app/myReactApp/',
45
+
46
+ 5. **Configure package.json**
47
+ "name": "my-tririga-app",
48
+
49
+ *Note: the name should match your Web View Metadata Exposed Name n TRIRIGA*
50
+
51
+ 6. **Run Deployment**
52
+ The view name will be taken from the `name` field in `package.json`.
53
+ ```
54
+ pnpm run build:deploy
55
+ ```
56
+
57
+ ## Browser Support & Polyfills
58
+
59
+ ## Project Structure
60
+
61
+ - `src/components`: Reusable UI components.
62
+ - `src/pages`: Top-level page definitions (routes).
63
+ - `src/model`: TRIRIGA AppModel (Datasources).
64
+ - `src/services`: API services (Auth, Config).
65
+ - `public/tri-app-config.json`: Local development configuration mocking the server response.
66
+
67
+ ## Tech Stack
68
+
69
+ - [React](https://react.dev/)
70
+ - [TypeScript](https://www.typescriptlang.org/)
71
+ - [Vite](https://vitejs.dev/)
72
+ - [Carbon Design System](https://carbondesignsystem.com/)
73
+ - [@tririga/tririga-react-components](https://www.npmjs.com/package/@tririga/tririga-react-components)
@@ -1,26 +1,26 @@
1
- # Logs
2
- logs
3
- *.log
4
- npm-debug.log*
5
- yarn-debug.log*
6
- yarn-error.log*
7
- pnpm-debug.log*
8
- lerna-debug.log*
9
-
10
- node_modules
11
- dist
12
- dist-ssr
13
- *.local
14
- .env
15
- ux-work-task-form
16
-
17
- # Editor directories and files
18
- .vscode/*
19
- !.vscode/extensions.json
20
- .idea
21
- .DS_Store
22
- *.suo
23
- *.ntvs*
24
- *.njsproj
25
- *.sln
26
- *.sw?
1
+ # Logs
2
+ logs
3
+ *.log
4
+ npm-debug.log*
5
+ yarn-debug.log*
6
+ yarn-error.log*
7
+ pnpm-debug.log*
8
+ lerna-debug.log*
9
+
10
+ node_modules
11
+ dist
12
+ dist-ssr
13
+ *.local
14
+ .env
15
+ ux-work-task-form
16
+
17
+ # Editor directories and files
18
+ .vscode/*
19
+ !.vscode/extensions.json
20
+ .idea
21
+ .DS_Store
22
+ *.suo
23
+ *.ntvs*
24
+ *.njsproj
25
+ *.sln
26
+ *.sw?
@@ -1,13 +1,13 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
- <title>Tririga React App</title>
8
- </head>
9
- <body>
10
- <div id="root"></div>
11
- <script type="module" src="/src/main.tsx"></script>
12
- </body>
13
- </html>
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>Tririga React App</title>
8
+ </head>
9
+ <body>
10
+ <div id="root"></div>
11
+ <script type="module" src="/src/main.tsx"></script>
12
+ </body>
13
+ </html>