@undp/create-app 0.0.1
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/bin/generateFiles.js +65 -0
- package/bin/generateTemplates/copyTemplate.js +18 -0
- package/bin/generateTemplates/generateIndexHtml.js +15 -0
- package/bin/generateTemplates/generatePackageJson.js +105 -0
- package/bin/generateTemplates/generateReadme.js +143 -0
- package/bin/generateTemplates/generateStyleCss.js +6 -0
- package/bin/generateTemplates/index.js +6 -0
- package/bin/generateTemplates/templates/basic/App.txt +32 -0
- package/bin/generateTemplates/templates/basic/AppWithContainer.txt +32 -0
- package/bin/generateTemplates/templates/basic/main.txt +10 -0
- package/bin/generateTemplates/templates/configFiles/.prettierrc +10 -0
- package/bin/generateTemplates/templates/configFiles/eslint.config.js +97 -0
- package/bin/generateTemplates/templates/configFiles/icon.txt +1 -0
- package/bin/generateTemplates/templates/configFiles/staticwebapp.config.json +44 -0
- package/bin/generateTemplates/templates/configFiles/tailwind.config.js +7 -0
- package/bin/generateTemplates/templates/configFiles/tsconfig.json +29 -0
- package/bin/generateTemplates/templates/configFiles/tsconfig.node.json +9 -0
- package/bin/generateTemplates/templates/configFiles/vite-env.txt +1 -0
- package/bin/generateTemplates/templates/configFiles/vite.config.ts.txt +109 -0
- package/bin/generateTemplates/templates/configFiles/viteWithoutPostCss.config.ts.txt +58 -0
- package/bin/generateTemplates/templates/css/fonts.css +213 -0
- package/bin/generateTemplates/templates/query/App.txt +57 -0
- package/bin/generateTemplates/templates/query/AppWithContainer.txt +67 -0
- package/bin/generateTemplates/templates/query/main.txt +29 -0
- package/bin/generateTemplates/templates/router/App.txt +30 -0
- package/bin/generateTemplates/templates/router/components/Footer.txt +20 -0
- package/bin/generateTemplates/templates/router/components/Header.txt +29 -0
- package/bin/generateTemplates/templates/router/main.txt +60 -0
- package/bin/generateTemplates/templates/router/routes/About.txt +28 -0
- package/bin/generateTemplates/templates/router+query/App.txt +30 -0
- package/bin/generateTemplates/templates/router+query/components/Footer.txt +20 -0
- package/bin/generateTemplates/templates/router+query/components/Header.txt +29 -0
- package/bin/generateTemplates/templates/router+query/integration/tanstack-query.txt +27 -0
- package/bin/generateTemplates/templates/router+query/main.txt +69 -0
- package/bin/generateTemplates/templates/router+query/routes/queryDemo.txt +56 -0
- package/bin/index.js +57 -0
- package/bin/promptUser.js +96 -0
- package/bin/utils/createFolders.js +11 -0
- package/bin/utils/index.js +2 -0
- package/bin/utils/printSuccess.js +23 -0
- package/package.json +32 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import {
|
|
4
|
+
generatePackageJson,
|
|
5
|
+
generateReadme,
|
|
6
|
+
generateStyleCss,
|
|
7
|
+
copyTemplate,
|
|
8
|
+
} from './generateTemplates/index.js';
|
|
9
|
+
|
|
10
|
+
export function generateFiles(config) {
|
|
11
|
+
// Main files
|
|
12
|
+
let projectType = 'basic';
|
|
13
|
+
|
|
14
|
+
if (config.installRouter && config.installQuery) {
|
|
15
|
+
projectType = 'router+query';
|
|
16
|
+
} else if (config.installRouter) {
|
|
17
|
+
projectType = 'router';
|
|
18
|
+
} else if (config.installQuery) {
|
|
19
|
+
projectType = 'query';
|
|
20
|
+
} else {
|
|
21
|
+
projectType = 'basic';
|
|
22
|
+
}
|
|
23
|
+
copyTemplate('src/main.tsx', 'main.txt', ['templates', projectType]);
|
|
24
|
+
copyTemplate(
|
|
25
|
+
'src/App.tsx',
|
|
26
|
+
config.addPostCSSScripts && !config.installRouter ? 'AppWithContainer.txt' : 'App.txt',
|
|
27
|
+
['templates', projectType]
|
|
28
|
+
);
|
|
29
|
+
if (config.installRouter) {
|
|
30
|
+
copyTemplate('src/components/Header.tsx', 'Header.txt', ['templates', projectType, 'components']);
|
|
31
|
+
copyTemplate('src/components/Footer.tsx', 'Footer.txt', ['templates', projectType, 'components']);
|
|
32
|
+
if (config.installQuery) {
|
|
33
|
+
copyTemplate('src/integration/tanstack-query.tsx', 'tanstack-query.txt', ['templates', projectType, 'integration']);
|
|
34
|
+
copyTemplate('src/routes/queryDemo.tsx', 'queryDemo.txt', ['templates', projectType, 'routes']);
|
|
35
|
+
} else {
|
|
36
|
+
copyTemplate('src/routes/About.tsx', 'About.txt', ['templates', projectType, 'routes']);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
fs.writeFileSync('src/styles/style.css', generateStyleCss(config.installDataViz));
|
|
40
|
+
copyTemplate('src/styles/fonts.css', 'fonts.css', ['templates', 'css']);
|
|
41
|
+
copyTemplate('src/assets/undp-logo-blue.svg', 'icon.txt', ['templates', 'configFiles']);
|
|
42
|
+
copyTemplate('public/undp-logo-blue.svg', 'icon.txt', ['templates', 'configFiles']);
|
|
43
|
+
console.log(chalk.green(' ā Created core files and base styles.'));
|
|
44
|
+
|
|
45
|
+
// Config files
|
|
46
|
+
console.log(chalk.bold.yellow('\nāļø Creating configuration and tooling files...'));
|
|
47
|
+
copyTemplate('eslint.config.js', 'eslint.config.js', ['templates', 'configFiles']);
|
|
48
|
+
copyTemplate('.prettierrc', '.prettierrc', ['templates', 'configFiles']);
|
|
49
|
+
copyTemplate('vite.config.ts', config.addPostCSSScripts ? 'vite.config.ts.txt' : 'viteWithoutPostCss.config.ts.txt', ['templates', 'configFiles']);
|
|
50
|
+
fs.writeFileSync('src/vite-env.d.ts', `/// <reference types="vite/client" />`);
|
|
51
|
+
copyTemplate('tsconfig.json', 'tsconfig.json', ['templates', 'configFiles']);
|
|
52
|
+
copyTemplate('tsconfig.node.json', 'tsconfig.node.json', ['templates', 'configFiles']);
|
|
53
|
+
copyTemplate('tailwind.config.js', 'tailwind.config.js', ['templates', 'configFiles']);
|
|
54
|
+
if (config.addStaticWebAppConfig) {
|
|
55
|
+
copyTemplate('staticwebapp.config.json', 'staticwebapp.config.json', ['templates', 'configFiles']);
|
|
56
|
+
}
|
|
57
|
+
copyTemplate('.gitignore', '.gitignore', ['templates', 'configFiles']);
|
|
58
|
+
fs.writeFileSync('README.md', generateReadme(config));
|
|
59
|
+
console.log(chalk.green(' ā Created ESLint, Prettier, Vite, TypeScript, Tailwind, and other configs.'));
|
|
60
|
+
|
|
61
|
+
// Package.json
|
|
62
|
+
console.log(chalk.bold.yellow('\nš Creating package.json and scripts...'));
|
|
63
|
+
fs.writeFileSync('package.json', JSON.stringify(generatePackageJson(config), null, 2));
|
|
64
|
+
console.log(chalk.green(' ā Created package.json.'));
|
|
65
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
|
|
5
|
+
function getTemplatePath(filename, folders) {
|
|
6
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
7
|
+
const __dirname = path.dirname(__filename);
|
|
8
|
+
return path.join(
|
|
9
|
+
__dirname,
|
|
10
|
+
...folders,
|
|
11
|
+
filename
|
|
12
|
+
);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function copyTemplate(destination, filename, folders) {
|
|
16
|
+
const content = fs.readFileSync(getTemplatePath(filename, folders), 'utf-8');
|
|
17
|
+
fs.writeFileSync(destination, content);
|
|
18
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export function generateIndexHtml(projectName){
|
|
2
|
+
return `<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="UTF-8" />
|
|
6
|
+
<link rel="icon" type="image/svg+xml" href="/undp-logo-blue.svg" />
|
|
7
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
8
|
+
<title>${projectName}</title>
|
|
9
|
+
</head>
|
|
10
|
+
<body>
|
|
11
|
+
<div id="root"></div>
|
|
12
|
+
<script type="module" src="/src/main.tsx"></script>
|
|
13
|
+
</body>
|
|
14
|
+
</html>`
|
|
15
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
|
|
4
|
+
function getLatestVersion(pkg) {
|
|
5
|
+
console.log(chalk.gray(` Fetching latest version for ${pkg}`));
|
|
6
|
+
try {
|
|
7
|
+
return execSync(`npm show ${pkg} version`).toString().trim();
|
|
8
|
+
} catch {
|
|
9
|
+
return 'latest';
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function generatePackageJson(config) {
|
|
14
|
+
const DEPENDENCIES = ['@undp/design-system-react', 'react', 'react-dom']
|
|
15
|
+
if(config.installLucide) DEPENDENCIES.push('lucide-react');
|
|
16
|
+
if(config.installDataViz) DEPENDENCIES.push('@undp/data-viz');
|
|
17
|
+
if(config.installQuery) DEPENDENCIES.push('@tanstack/react-query');
|
|
18
|
+
if(config.installRouter) DEPENDENCIES.push('@tanstack/react-router');
|
|
19
|
+
const dependencies = {};
|
|
20
|
+
DEPENDENCIES.forEach((d) => {
|
|
21
|
+
const version = getLatestVersion(d)
|
|
22
|
+
dependencies[d] = version === 'latest' ? 'latest' : `^${version}`;
|
|
23
|
+
})
|
|
24
|
+
const PEER_DEPENDENCIES = config.installDataVizPeerDeps ? [
|
|
25
|
+
'@dnd-kit/core',
|
|
26
|
+
'@dnd-kit/modifiers',
|
|
27
|
+
'ajv',
|
|
28
|
+
'dom-to-svg',
|
|
29
|
+
'file-saver',
|
|
30
|
+
'handlebars',
|
|
31
|
+
'maplibre-gl',
|
|
32
|
+
'marked',
|
|
33
|
+
'math-expression-evaluator',
|
|
34
|
+
'pmtiles',
|
|
35
|
+
'react-globe.gl',
|
|
36
|
+
'three',
|
|
37
|
+
] : [];
|
|
38
|
+
PEER_DEPENDENCIES.forEach((d) => {
|
|
39
|
+
const version = getLatestVersion(d)
|
|
40
|
+
dependencies[d] = version === 'latest' ? 'latest' : `^${version}`;
|
|
41
|
+
})
|
|
42
|
+
const DEV_DEPENDENCIES = [
|
|
43
|
+
'@eslint/config-array',
|
|
44
|
+
'@eslint/js',
|
|
45
|
+
'@nabla/vite-plugin-eslint',
|
|
46
|
+
'@tailwindcss/postcss',
|
|
47
|
+
'@tailwindcss/vite',
|
|
48
|
+
'@types/node',
|
|
49
|
+
'@types/react',
|
|
50
|
+
'@types/react-dom',
|
|
51
|
+
'@vitejs/plugin-react',
|
|
52
|
+
'autoprefixer',
|
|
53
|
+
'babel-plugin-react-compiler',
|
|
54
|
+
'eslint',
|
|
55
|
+
'eslint-config-love',
|
|
56
|
+
'eslint-config-prettier',
|
|
57
|
+
'eslint-plugin-import',
|
|
58
|
+
'eslint-plugin-jsx-a11y',
|
|
59
|
+
'eslint-plugin-n',
|
|
60
|
+
'eslint-plugin-prettier',
|
|
61
|
+
'eslint-plugin-promise',
|
|
62
|
+
'eslint-plugin-react',
|
|
63
|
+
'eslint-plugin-react-hooks',
|
|
64
|
+
'postcss',
|
|
65
|
+
'postcss-nested',
|
|
66
|
+
'prettier',
|
|
67
|
+
'rimraf',
|
|
68
|
+
'rollup-plugin-visualizer',
|
|
69
|
+
'tailwind-animate',
|
|
70
|
+
'tailwind-merge',
|
|
71
|
+
'tailwindcss',
|
|
72
|
+
'tailwindcss-animate',
|
|
73
|
+
'typescript',
|
|
74
|
+
'typescript-eslint',
|
|
75
|
+
'vite',
|
|
76
|
+
'vite-plugin-static-copy',
|
|
77
|
+
]
|
|
78
|
+
const devDependencies = {}
|
|
79
|
+
DEV_DEPENDENCIES.forEach((d) => {
|
|
80
|
+
const version = getLatestVersion(d)
|
|
81
|
+
devDependencies[d] = version === 'latest' ? 'latest' : `^${version}`;
|
|
82
|
+
})
|
|
83
|
+
const packageJson = {
|
|
84
|
+
name: config.projectName,
|
|
85
|
+
private: true,
|
|
86
|
+
version: '0.0.0',
|
|
87
|
+
type: 'module',
|
|
88
|
+
keywords: [],
|
|
89
|
+
author: '',
|
|
90
|
+
sideEffects: [
|
|
91
|
+
'*.css'
|
|
92
|
+
],
|
|
93
|
+
scripts: {
|
|
94
|
+
dev: 'vite',
|
|
95
|
+
build: 'tsc && vite build',
|
|
96
|
+
preview: 'vite preview',
|
|
97
|
+
clean: 'rimraf node_modules && rimraf dist && rimraf package-lock.json',
|
|
98
|
+
'install:build': 'npm install && tsc && vite build',
|
|
99
|
+
lint: 'npx eslint --fix && npx prettier . --write'
|
|
100
|
+
},
|
|
101
|
+
dependencies: dependencies,
|
|
102
|
+
devDependencies: devDependencies
|
|
103
|
+
}
|
|
104
|
+
return packageJson
|
|
105
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
export function generateReadme(config){
|
|
2
|
+
return `# ${config.projectName}
|
|
3
|
+
|
|
4
|
+
React + TypeScript + Vite project with Tailwind CSS ${config.installDataViz ? ', UNDP Design System and data viz library' : 'and UNDP Design System'}.
|
|
5
|
+
|
|
6
|
+
This is a template to initiate project with tooling for linting and prettier and uses React Compiler.
|
|
7
|
+
|
|
8
|
+
## Installed Libraries
|
|
9
|
+
|
|
10
|
+
- React 19.2
|
|
11
|
+
- @undp/design-system-react${config.installLucide ? '\n- lucide-react' : ''}${config.installDataViz ? '\n- @undp/data-viz' : ''}${config.installQuery ? '\n- @tanstack/react-query' : ''}${config.installRouter ? '\n- @tanstack/react-router' : ''}
|
|
12
|
+
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
This project uses \`npm\`. For installation you will need to install \`node\` and \`npm\`, if you don't already have it. \`node\` and \`npm\` can be installed from [here](https://nodejs.org/en/download/).
|
|
16
|
+
|
|
17
|
+
To install the project, simply clone the the repo and them run \`npm install\` in the project folder. You can use terminal on Mac and Command Prompt on Windows.
|
|
18
|
+
|
|
19
|
+
This project is bootstrapped with [\`Vite\`](https://vitejs.dev/) and was created using \`npm create vite@latest\` command.
|
|
20
|
+
|
|
21
|
+
Run the terminal or command prompt and then run the following
|
|
22
|
+
|
|
23
|
+
\`\`\`
|
|
24
|
+
git clone https://github.com/UNDP-Data/${config.projectName}.git
|
|
25
|
+
cd ${config.projectName}
|
|
26
|
+
npm install
|
|
27
|
+
\`\`\`
|
|
28
|
+
|
|
29
|
+
## Local Development
|
|
30
|
+
|
|
31
|
+
To start the project locally, you can run \`npm run dev\` in the project folder in terminal or command prompt.
|
|
32
|
+
|
|
33
|
+
This is run the app in development mode. Open [http://localhost:5173/](http://localhost:5173/) to view it in the browser.
|
|
34
|
+
|
|
35
|
+
The page will reload if you make edits. You will also see any lint errors in the console.
|
|
36
|
+
|
|
37
|
+
## Available Scripts
|
|
38
|
+
|
|
39
|
+
- \`npm run dev\`: Executes \`vite\` and start the local server for local deployment.
|
|
40
|
+
- \`npm run build\`: Executes \`tsc && vite build\` and builds the app for production and deployment.
|
|
41
|
+
- \`npm run clean\`: Executes \`rimraf node_modules && rimraf dist && rimraf package-lock.json\` and remove node_modules folder, dist folder and package-lock.json.
|
|
42
|
+
- \`npm run lint\`: Executes \`npx eslint --fix && npx prettier . --write\` and resolve all the linting and prettier errors.
|
|
43
|
+
|
|
44
|
+
## Tooling Setup
|
|
45
|
+
|
|
46
|
+
This project uses ESLint integrated with prettier, which verifies and formats your code so you don't have to do it manually. You should have your editor set up to display lint errors and automatically fix those which it is possible to fix. See [http://eslint.org/docs/user-guide/integrations](http://eslint.org/docs/user-guide/integrations).
|
|
47
|
+
|
|
48
|
+
This project is build in Visual Studio Code, therefore the project is already set up to work with. Install it from [here](https://code.visualstudio.com/) and then install this [eslint plugin](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) and you should be good to go.
|
|
49
|
+
|
|
50
|
+
## Styling
|
|
51
|
+
|
|
52
|
+
This project uses [Tailwind CSS](https://tailwindcss.com/) for styling.
|
|
53
|
+
|
|
54
|
+
${
|
|
55
|
+
config.installRouter ? `## Routing
|
|
56
|
+
|
|
57
|
+
This project uses [TanStack Router](https://tanstack.com/router). The initial setup is a code based router. Which means that the routes are defined in code (in the \`./src/main.tsx\` file).
|
|
58
|
+
|
|
59
|
+
### Adding A Route
|
|
60
|
+
|
|
61
|
+
To add a new route to your application just add another \`createRoute\` call to the \`./src/main.tsx\` file. The example below adds a new \`/about\`route to the root route.
|
|
62
|
+
|
|
63
|
+
\`\`\`tsx
|
|
64
|
+
const aboutRoute = createRoute({
|
|
65
|
+
getParentRoute: () => rootRoute,
|
|
66
|
+
path: "/about",
|
|
67
|
+
component: () => <h1>About</h1>,
|
|
68
|
+
});
|
|
69
|
+
\`\`\`
|
|
70
|
+
|
|
71
|
+
You will also need to add the route to the \`routeTree\` in the \`./src/main.tsx\` file.
|
|
72
|
+
|
|
73
|
+
\`\`\`tsx
|
|
74
|
+
const routeTree = rootRoute.addChildren([indexRoute, aboutRoute]);
|
|
75
|
+
\`\`\`
|
|
76
|
+
|
|
77
|
+
With this set up you should be able to navigate to \`/about\` and see the about page.
|
|
78
|
+
|
|
79
|
+
Of course you don't need to implement the About page in the \`main.tsx\` file. You can create that component in another file and import it into the \`main.tsx\` file, then use it in the \`component\` property of the \`createRoute\` call, like so:
|
|
80
|
+
|
|
81
|
+
\`\`\`tsx
|
|
82
|
+
import About from "./components/About.tsx";
|
|
83
|
+
|
|
84
|
+
const aboutRoute = createRoute({
|
|
85
|
+
getParentRoute: () => rootRoute,
|
|
86
|
+
path: "/about",
|
|
87
|
+
component: About,
|
|
88
|
+
});
|
|
89
|
+
\`\`\`
|
|
90
|
+
|
|
91
|
+
That is how we have the \`App\` component set up with the home page.
|
|
92
|
+
|
|
93
|
+
For more information on the options you have when you are creating code based routes check out the [Code Based Routing](https://tanstack.com/router/latest/docs/framework/react/guide/code-based-routing) documentation.
|
|
94
|
+
|
|
95
|
+
Now that you have two routes you can use a \`Link\` component to navigate between them.
|
|
96
|
+
|
|
97
|
+
### Adding Links
|
|
98
|
+
|
|
99
|
+
To use SPA (Single Page Application) navigation you will need to import the \`Link\` component from \`@tanstack/react-router\`.
|
|
100
|
+
|
|
101
|
+
\`\`\`tsx
|
|
102
|
+
import { Link } from "@tanstack/react-router";
|
|
103
|
+
\`\`\`
|
|
104
|
+
|
|
105
|
+
Then anywhere in your JSX you can use it like so:
|
|
106
|
+
|
|
107
|
+
\`\`\`tsx
|
|
108
|
+
<Link to="/about">About</Link>
|
|
109
|
+
\`\`\`
|
|
110
|
+
|
|
111
|
+
This will create a link that will navigate to the \`/about\` route.
|
|
112
|
+
|
|
113
|
+
More information on the \`Link\` component can be found in the [Link documentation](https://tanstack.com/router/v1/docs/framework/react/api/router/linkComponent).
|
|
114
|
+
` :''
|
|
115
|
+
}
|
|
116
|
+
${
|
|
117
|
+
config.installQuery ? `## Query
|
|
118
|
+
|
|
119
|
+
This project uses [TanStack Query](https://tanstack.com/query).
|
|
120
|
+
` :''
|
|
121
|
+
}
|
|
122
|
+
## Steps to Embed
|
|
123
|
+
|
|
124
|
+
Add the following div in the page
|
|
125
|
+
|
|
126
|
+
\`\`\`
|
|
127
|
+
<div id="root"></div>
|
|
128
|
+
\`\`\`
|
|
129
|
+
|
|
130
|
+
Apart from the mentioned \`div\` above the following \`script\` and \`link\` needs to be added to the \`head\` or in the embed code
|
|
131
|
+
|
|
132
|
+
\`\`\`
|
|
133
|
+
<link rel="dns-prefetch" href="{{Link to the Visualization}}">
|
|
134
|
+
<script defer="defer" type="module" src="{{Link to the Visualization}}/index.js"></script>
|
|
135
|
+
<link rel="modulepreload" crossorigin href="{{Link to the Visualization}}/react-{{hash}}.js">
|
|
136
|
+
<link rel="modulepreload" crossorigin href="{{Link to the Visualization}}/undp-{{hash}}.js">
|
|
137
|
+
<link rel="stylesheet" href="{{Link to the Visualization}}/style.css"></link>
|
|
138
|
+
\`\`\`
|
|
139
|
+
|
|
140
|
+
# Contact us
|
|
141
|
+
Contact us at [data@undp.org](mailto:data@undp.org) if you have any feedback or questions.
|
|
142
|
+
`;
|
|
143
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
|
|
2
|
+
export { copyTemplate } from './copyTemplate.js';
|
|
3
|
+
export { generateIndexHtml } from './generateIndexHtml.js';
|
|
4
|
+
export { generatePackageJson } from './generatePackageJson.js';
|
|
5
|
+
export { generateReadme } from './generateReadme.js';
|
|
6
|
+
export { generateStyleCss } from './generateStyleCss.js';
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { H3 } from '@undp/design-system-react';
|
|
2
|
+
|
|
3
|
+
import '@/styles/fonts.css';
|
|
4
|
+
import '@/styles/style.css';
|
|
5
|
+
import undpLogo from './assets/undp-logo-blue.svg';
|
|
6
|
+
|
|
7
|
+
function App() {
|
|
8
|
+
return (
|
|
9
|
+
<div>
|
|
10
|
+
<div className='m-5'>
|
|
11
|
+
<div>
|
|
12
|
+
<img
|
|
13
|
+
src={undpLogo}
|
|
14
|
+
className='logo react mb-8'
|
|
15
|
+
alt='React logo'
|
|
16
|
+
width='72px'
|
|
17
|
+
style={{ marginLeft: 'auto', marginRight: 'auto' }}
|
|
18
|
+
/>
|
|
19
|
+
</div>
|
|
20
|
+
<H3 className='text-center'>
|
|
21
|
+
This is template for building visualization and frontend project
|
|
22
|
+
maintained by UNDP's DAI Hub.
|
|
23
|
+
<br />
|
|
24
|
+
<br />
|
|
25
|
+
Contact us at data@undp.org if you have any feedback or questions.
|
|
26
|
+
</H3>
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export default App;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { H3 } from '@undp/design-system-react';
|
|
2
|
+
|
|
3
|
+
import '@/styles/fonts.css';
|
|
4
|
+
import '@/styles/style.css';
|
|
5
|
+
import undpLogo from './assets/undp-logo-blue.svg';
|
|
6
|
+
|
|
7
|
+
function App() {
|
|
8
|
+
return (
|
|
9
|
+
<div className='undp-container'>
|
|
10
|
+
<div className='m-5'>
|
|
11
|
+
<div>
|
|
12
|
+
<img
|
|
13
|
+
src={undpLogo}
|
|
14
|
+
className='logo react mb-8'
|
|
15
|
+
alt='React logo'
|
|
16
|
+
width='72px'
|
|
17
|
+
style={{ marginLeft: 'auto', marginRight: 'auto' }}
|
|
18
|
+
/>
|
|
19
|
+
</div>
|
|
20
|
+
<H3 className='text-center'>
|
|
21
|
+
This is template for building visualization and frontend project
|
|
22
|
+
maintained by UNDP's DAI Hub.
|
|
23
|
+
<br />
|
|
24
|
+
<br />
|
|
25
|
+
Contact us at data@undp.org if you have any feedback or questions.
|
|
26
|
+
</H3>
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export default App;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import js from '@eslint/js';
|
|
2
|
+
import tseslint from 'typescript-eslint';
|
|
3
|
+
import pluginReact from 'eslint-plugin-react';
|
|
4
|
+
import reactHooks from 'eslint-plugin-react-hooks';
|
|
5
|
+
import importPlugin from 'eslint-plugin-import';
|
|
6
|
+
import jsxA11y from 'eslint-plugin-jsx-a11y';
|
|
7
|
+
import { defineConfig } from 'eslint/config';
|
|
8
|
+
import prettierConfig from 'eslint-config-prettier';
|
|
9
|
+
import prettierPlugin from 'eslint-plugin-prettier';
|
|
10
|
+
|
|
11
|
+
export default defineConfig([
|
|
12
|
+
{
|
|
13
|
+
ignores: [
|
|
14
|
+
'node_modules/**',
|
|
15
|
+
'build/**',
|
|
16
|
+
'public/**',
|
|
17
|
+
'dist/**',
|
|
18
|
+
'storybook-static/**',
|
|
19
|
+
'dist-ssr/**',
|
|
20
|
+
'coverage/**',
|
|
21
|
+
'**/*.test.js',
|
|
22
|
+
'**/__snapshots__/**',
|
|
23
|
+
],
|
|
24
|
+
},
|
|
25
|
+
js.configs.recommended,
|
|
26
|
+
reactHooks.configs.flat.recommended,
|
|
27
|
+
...tseslint.configs.recommended,
|
|
28
|
+
{
|
|
29
|
+
files: ['**/*.{js,mjs,cjs,ts,jsx,tsx,ts}'],
|
|
30
|
+
plugins: {
|
|
31
|
+
react: pluginReact,
|
|
32
|
+
'react-hooks': reactHooks,
|
|
33
|
+
import: importPlugin,
|
|
34
|
+
'jsx-a11y': jsxA11y,
|
|
35
|
+
prettier: prettierPlugin,
|
|
36
|
+
},
|
|
37
|
+
settings: {
|
|
38
|
+
react: {
|
|
39
|
+
version: 'detect',
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
rules: {
|
|
43
|
+
// React rules
|
|
44
|
+
'react/self-closing-comp': ['error', { component: true, html: true }],
|
|
45
|
+
'react/react-in-jsx-scope': 'off',
|
|
46
|
+
'react/jsx-uses-react': 'off',
|
|
47
|
+
'react/jsx-uses-vars': 'warn',
|
|
48
|
+
'react/jsx-no-undef': 'error',
|
|
49
|
+
'react/jsx-curly-brace-presence': 'error',
|
|
50
|
+
'react/prop-types': 'off',
|
|
51
|
+
'react/require-default-props': 0,
|
|
52
|
+
'react/jsx-filename-extension': 0,
|
|
53
|
+
'react/no-array-index-key': 0,
|
|
54
|
+
'react/jsx-props-no-spreading': 0,
|
|
55
|
+
|
|
56
|
+
// TypeScript rules
|
|
57
|
+
'no-unused-vars': 'off',
|
|
58
|
+
'@typescript-eslint/no-unused-vars': [
|
|
59
|
+
'error',
|
|
60
|
+
{ argsIgnorePattern: '^_' },
|
|
61
|
+
],
|
|
62
|
+
'@typescript-eslint/no-explicit-any': 'warn',
|
|
63
|
+
|
|
64
|
+
// Import rules
|
|
65
|
+
'import/order': [
|
|
66
|
+
'warn',
|
|
67
|
+
{
|
|
68
|
+
groups: [
|
|
69
|
+
'builtin',
|
|
70
|
+
'external',
|
|
71
|
+
'internal',
|
|
72
|
+
'parent',
|
|
73
|
+
'sibling',
|
|
74
|
+
'index',
|
|
75
|
+
],
|
|
76
|
+
'newlines-between': 'always',
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
'import/no-unresolved': 0,
|
|
80
|
+
'import/no-extraneous-dependencies': ['warn', { devDependencies: true }],
|
|
81
|
+
'import/extensions': 0,
|
|
82
|
+
'import/prefer-default-export': 0,
|
|
83
|
+
|
|
84
|
+
// A11y rules
|
|
85
|
+
'jsx-a11y/alt-text': 'warn',
|
|
86
|
+
'jsx-a11y/anchor-is-valid': 'warn',
|
|
87
|
+
|
|
88
|
+
// General rules
|
|
89
|
+
'prefer-const': 'error',
|
|
90
|
+
'no-console': ['warn', { allow: ['warn', 'error'] }],
|
|
91
|
+
'no-debugger': 'warn',
|
|
92
|
+
'no-nested-ternary': 0,
|
|
93
|
+
'prettier/prettier': 'error',
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
prettierConfig,
|
|
97
|
+
]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 60.8"><style>.st0{fill:#0468b1}.st1{fill:#fff}</style><path class="st0" d="M0 30.9h14.5v14.5H0z"/><path class="st1" d="M3.7 33.2v5.7c0 3 1.5 4.1 3.5 4.1 2.1 0 3.6-1.2 3.6-4.2v-5.7H9.6v5.8c0 2.1-1 3.1-2.4 3.1-1.3 0-2.3-.9-2.3-3.1v-5.7H3.7z"/><path class="st0" d="M15.4 30.9h14.5v14.5H15.4z"/><path class="st1" d="M20.2 43v-4.1c0-1.6 0-2.8-.1-4 .5 1.1 1.1 2.2 1.8 3.2L25 43h1.3v-9.6h-1.1v4.1c0 1.5 0 2.7.2 4-.4-1-1-2-1.7-3.2l-3.1-4.9h-1.4v9.7l1-.1z"/><path class="st0" d="M15.4 46.3h14.5v14.5H15.4z"/><path class="st1" d="M25.1 49.4c-.6-.5-1.5-.8-2.8-.8-1 0-1.8.1-2.4.2v9.6h1.2v-3.9c.3.1.6.1 1 .1 1.2 0 2.3-.4 2.9-1.1.5-.5.8-1.2.8-2.1.2-.8-.1-1.5-.7-2"/><path class="st0" d="M22.3 53.6c-.4 0-.8 0-1.1-.1v-3.7c.2 0 .6-.1 1.2-.1 1.4 0 2.3.6 2.3 1.9 0 1.3-.9 2-2.4 2M0 46.3h14.5v14.5H0z"/><path class="st1" d="M10.2 49.8c-.8-.8-2.1-1.2-3.9-1.2-1 0-1.9.1-2.7.2v9.6c.6.1 1.4.1 2.3.1 1.9 0 3.4-.5 4.3-1.4.9-.9 1.4-2.2 1.4-3.7 0-1.7-.5-2.8-1.4-3.6"/><path class="st0" d="M6.2 57.4c-.5 0-1 0-1.3-.1v-7.6c.3-.1.8-.2 1.5-.2 2.7 0 3.9 1.4 3.9 3.7 0 2.7-1.5 4.3-4.1 4.2M0 0h30v30H0z"/><path class="st1" d="M25.7 15.6c-.4.6-1 1.1-1.3 1.8 0-.5.1-1.1-.1-1.5-.3-1-.6-1.9-.7-3.1v-.4c.2 1.1 1.3 1.9 1.2 3.1 0 .3-.1.6-.2.8v-.1c.2-.6.2-1.2.5-1.8.4-.8.8-1.6.6-2.6.8 1.2.6 2.7 0 3.8"/><path class="st1" d="M25.1 9.4c.7 1 .9 2.5.3 3.6-.2.5-.3 1-.4 1.5 0-.1 0-.2-.1-.3-.2-1.1-1.3-1.9-1.7-2.8-.2-.3-.2-.6-.3-1.1.4.8 1.5 1.2 1.9 2.2.2.2.1.5.2.8-.2-1-.1-1.9 0-2.8 0-.5-.1-1-.3-1.4.1-.1.2.1.4.3"/><path class="st1" d="M24.6 9.2c.2.8-.1 1.6.1 2.5-.5-.9-1.4-1.3-2.1-2-.4-.4-.6-1-.6-1.5.4.9 1.4 1.1 2 1.9.2.2.2.4.4.6-.3-.7-.5-1.5-.6-2.4l-.6-.9c.6.2 1.2 1 1.4 1.8"/><path class="st1" d="M22.5 7.3c.6.6.8 1.2 1 1.9l.1.2c-.8-.6-1.6-1.5-2.2-2.3l-.6-.7c.5.2 1.2.4 1.7.9m-11.1-.7c1.1-.6 2.4-.8 3.6-.9 3 0 5.9 1.8 7.2 4.5.8 1.6 1.1 3.8.6 5.6-.6 2.2-2.4 4.3-4.5 5.2-2.4 1.1-5.7.9-7.8-.6-2.9-1.9-4.1-5.4-3.2-8.8.5-2 2.1-4.1 4.1-5m-2.3 0c-.6.5-1 1.2-1.5 1.8-.4.4-.9.8-1.4 1.2.3-.6.3-1.2.7-1.6.5-.9 1.4-1.1 2.2-1.4"/><path class="st1" d="M5.8 8.4c.2-.4.6-.6 1.1-.7-.8.6-.7 1.5-1 2.4-.1.2-.2.6-.3.8.2-.3.4-.6.6-1 .6-.6 1.4-.9 1.7-1.7 0 1.1-.9 1.9-1.8 2.5-.4.3-.7.6-.9 1.1V11c.1-.9 0-2 .6-2.6"/><path class="st1" d="M4.3 11.5c0-1 .4-1.7.9-2.4-.6.9-.1 2.1-.2 3.1l-.1 1.1c0-.2 0-.2.1-.4.2-.9.9-1.5 1.5-2.1.2-.2.2-.3.3-.5-.1.4-.2.9-.4 1.3-.5 1-1.5 1.8-1.6 2.9.1-1-.7-1.9-.5-3"/><path class="st1" d="M3.8 12.9l.3-.9c-.2 1.2.6 2.2.9 3.2l.3 1.2c-.4-1.1.2-2.2.8-3.2.2-.2.2-.5.3-.8.1.5-.1 1.1-.2 1.6-.2.6-.4 1.4-.6 2-.2.4-.1.9 0 1.3-.4-.8-1.3-1.5-1.5-2.4-.3-.5-.5-1.3-.3-2"/><path class="st1" d="M3.7 15.3c.1 1.3 1.5 2 2.2 3.2.2.2.3.4.6.6 0-.2-.2-.2-.2-.4-.2-.5-.3-1-.2-1.5.1-.6.3-1.3.2-2 .6 1.2.4 2.8.7 4.1.1.3.2.6.4.8-1.2-.8-2.8-1.5-3.3-3.1-.4-.5-.4-1.1-.4-1.7"/><path class="st1" d="M4.5 18.3c.6 1.5 2.4 1.6 3.4 2.5.1.2.4.4.6.4-.2-.2-.6-.5-.7-.8-.6-.9-.4-2.2-.9-3.2.4.6.8 1.1 1.1 1.8.4 1 .6 2.1 1.5 2.8-1-.3-2.2-.2-3.1-.8-.9-.6-1.8-1.5-1.9-2.7"/><path class="st1" d="M6.2 21.2c1.1 1.2 2.8.8 4.2 1.1.2 0 .4.1.6.1-.2-.1-.4-.1-.6-.2-1.1-.4-1.3-1.5-1.9-2.4.8.5 1.4 1.2 2.1 1.9.5.4 1.1.6 1.8.8-.2.1-.4 0-.6.1-1.2.3-2.4.7-3.7.3-.7-.4-1.5-1-1.9-1.7"/><path class="st1" d="M20.6 23.9c-1.2.4-2.4 0-3.4-.7-.4-.2-.7-.6-1.2-.6h-.5c.9.4 1.8 1 2.5 1.8-.2.2-.3.3-.5.4-.7-.8-1.5-1.5-2.5-2-.2 0-.3.2-.5.2-.7.5-1.5 1.1-2 1.9l-.5-.5c.8-.8 1.6-1.4 2.5-1.8-.9-.3-1.5.5-2.2.9-.8.6-1.9.8-2.9.4-.6-.2-1.1-.5-1.4-1 .8.6 1.9.6 2.8.2 1.2-.5 2.4-1.1 3.8-.8.2 0 .4.2.6 0 1.1-.2 2.2-.1 3.2.4l1 .4c.9.3 1.9.2 2.8-.3-.6.6-1 1-1.6 1.1"/><path class="st1" d="M21.9 22.7c-1.4.5-2.7-.1-4-.3h-.2c.6-.2 1.2-.3 1.7-.8.7-.7 1.4-1.4 2.2-1.9-.6.8-.6 1.9-1.6 2.4-.2.2-.6.2-.8.3.4 0 .6-.2 1.1-.2 1.3-.2 2.8 0 3.7-1.1-.5.7-1.4 1.4-2.1 1.6"/><path class="st1" d="M22.6 21.3c-.6.2-1.4.2-2.1.5 1.1-1 1.1-2.5 1.8-3.6.2-.3.4-.6.7-1-.5.9-.2 2.1-.8 3-.2.4-.5.7-.8 1 .1 0 .2-.1.3-.2.9-.8 1.9-1.1 2.9-1.8.4-.3.7-.6.9-1.1-.1 1.5-1.6 2.8-2.9 3.2"/><path class="st1" d="M24.3 18.9c-.6.3-1.1.6-1.5 1.1.8-1.3.4-3.1.9-4.5l.2-.5c-.1.9.3 1.6.2 2.5 0 .6-.2 1-.5 1.5.4-.5.6-1.1 1.1-1.5.7-.6 1.4-1.4 1.5-2.3.3 1.5-.6 2.9-1.9 3.7"/><path class="st0" d="M18.3 18.8c.3-.2.6-.4.8-.6h-.2c-.2 0-.2-.2-.2-.2l-.5-.5v-.1c0 .1-.1.2-.2.2 0 .1 0 .2.1.2.2.1.4.2.4.3-.1.2-.4.3-.2.6.1 0-.1 0 0 .1m-2.8-6.5c.1.1.2 0 .2-.1.1 0 .2.1.2.2h.2c0-.3.5-.2.6-.6h-.1s-.1 0-.1-.1l.2-.2c-.4-.2-.7-.4-1.1-.5-.2 0-.3 0-.5-.1.1.2 0 .6.1.8l.2.1c.1-.2.2-.2.3-.3h.2v.3c0 .4-.3.4-.4.5m4.2 2.7c-.2.6-.4 1.1-.7 1.5-.2.2-.2.4-.4.5l.4.3v-.1s0-.1.1-.1c.2 0 .2.2.2.2 0 .2.1.2.1.4 1-1.1 1.5-2.4 1.6-3.8l.1-.1h-1.2c0 .2 0 .5-.1.7l.2.2v.2c-.2.2-.2.2-.3.1m-1-3.5c-.2-.2-.3-.5-.6-.7-.4.4-.8.8-1.1 1.2l.1.1c0-.1.1-.2.1-.2.1-.2.2 0 .4 0h.6c.2.1.2.2.3.3v.2c0 .3.2-.1.3 0 .1 0 .2 0 .2.1 0 .2.2.1.2.2s-.1.1-.1.1c0 .2-.2.2-.1.3.2 0 .2-.2.3-.3-.1-.2-.1-.4-.2-.6-.2 0-.2-.2-.3-.2-.3-.2 0-.3-.1-.5m-3.5 8.3c.3-.1.6-.1 1-.2-.1 0-.2 0-.2-.1-.2 0-.2-.2-.3-.4 0-.1 0-.2.1-.3-.1-.2-.3 0-.5-.1 0 0-.1-.1-.2-.1l.1.1v1.1m.3-3.1c.1 0 0 .2.1.2.2-.1.3.2.4 0 0-.2.2-.2.3-.2.2-.1.4-.2.4-.5-.2 0-.2.1-.2.2-.1.1-.2-.2-.2-.1v.1c-.2.2-.2-.1-.3 0v.1c-.1-.2-.2-.1-.3-.2h-.2c0 .1-.2 0-.2.1-.1 0-.1.2-.2.2-.2 0-.2.2-.3.1v.1h.2c.1-.2.3 0 .5-.1m1.1-1.5c0 .1 0 .2.1.2.2 0 .1.2.2.2s0-.1 0-.2c0-.2-.1-.2-.3-.2.1 0 .1 0 0 0 .1-.1.1-.1 0 0m-.1-5.6c-.4-.2-.8-.2-1.3-.2v1.2h.1c.6.1 1.3.3 1.8.7v.1c.2-.2.4-.5.6-.7l.2-.1h-.1c-.4-.5-.9-.8-1.3-1M9 14.1l.1.7c0 .2.2.6.2.8 0-.1 0-.2.2-.2 0-.1.1-.2 0-.2 0-.2.1-.4.2-.6.2 0 .2-.2.4-.3.1 0 .2.2.2.2-.2-.2-.2-.4-.1-.6H8.9l.1.2zm7.2 1.9c.1-.1.3-.1.3-.2-.1-.1-.1 0-.3.2-.1-.1-.1 0 0 0m2.5-2.1l.2.2c.2.1 0 .2.2.3s.2.2.2.4v-.1c.1-.2 0-.5.1-.6-.2-.1-.5-.1-.7-.2m-1.6 2.9c.2 0 .2.2.4.2.2-.1.4 0 .5-.1 0-.2.1-.2.2-.4.1.1.1.2.1.3.1-.2.2-.2.3-.4.2-.4.5-.8.6-1.2-.1 0-.2 0-.3.1-.1 0-.2.1-.4 0h-.1c0 .1-.1.2-.2.1-.1 0-.1-.1-.1-.2v.2c-.1.1-.1.2-.2.2-.1.1-.2.1-.3.2 0 .2-.2.2-.3.2h.2c.2 0 .2-.2.2-.2.1 0 .2-.1.2 0 .1.1.1.2.1.4-.1.1 0 .2-.1.4 0 .2-.2.2-.2.3-.1.1-.2.1-.2.1-.3-.2-.6-.2-1-.2 0 0-.1 0 0 .1.3-.2.4-.2.6-.1m-2.4 3.5c-1.6-.1-3-.6-4.1-1.8l-.8.8c1.2 1.1 2.7 1.8 4.3 1.9.2 0 .6 0 .8.1l-.1-.1-.1-.9zM13.1 16c.4.3.9.6 1.5.6v-.3c0-.1.2-.1.2-.1s.1-.1 0-.1-.1-.2-.1-.2.1 0 .1-.1c-.1-.1 0-.2 0-.2l.1-.1c-.2.1-.5 0-.7-.2l-.2-.2-.9.9m-.4-1.3c-.1 0-.1 0 0 0h-.2c0-.2-.2-.1-.3-.2l.3.6c.1.2.2.3.3.5.1-.2.2-.2.3-.4V15c0-.1 0-.2-.1-.2s0 .2 0 .2h-.1c-.1 0-.2-.1-.2-.2.1 0 0 0 0-.1m.8.1c0 .1-.1.2-.2.2.1-.1.2-.2.3-.2h-.1zm1.2 3.9c-1 0-1.8-.4-2.6-1 0 .1.2.2.1.2-.1.1-.2.1-.3.1-.2 0-.4.2-.6.2-.2.1-.2-.2-.4-.2 1.1 1 2.4 1.5 3.9 1.6l.1.1v-1.2l-.2.2z"/><path class="st0" d="M10.3 18.2c-.2-.1-.2-.2-.4-.4-.2 0-.2-.2-.3-.2v-.2.1c-.2.1-.2-.1-.3-.2-.2-.1-.1-.4-.3-.3-.1 0-.1-.1-.2-.1-.2 0-.2-.2-.2-.2v.1c-.2 0-.2-.2-.3-.2h-.1c-.1-.1-.2-.2-.2-.4-.2-.2-.1-.4 0-.6 0 0 .1-.1.1-.2s.2-.1.2-.1.1 0 .1.1c.1 0 .2 0 .2-.1.1-.1.2-.1.2-.1.1.1.1.2.2.2l-.1-.1c-.1-.4-.2-.8-.2-1.2V13.8H7.3c.1 1.3.4 2.4 1 3.5.2.6.7 1 1.1 1.5l.8-.8.1.2zm1.3-9.4c-.2.2-.5.4-.7.6.3.2.6.5.8.7v.1c.6-.6 1.5-1 2.3-1.2.2 0 .4-.1.6 0V7.9c-1.1 0-2 .4-3 .9m-1 4.3c0 .2 0 .4-.1.6.2-.1.3 0 .5 0-.1 0 0-.2-.1-.2 0-.1 0-.2.1-.3 0-.2.2-.2.2-.4s.2-.1.3-.2c.1 0 0-.1 0-.2.1-.1.2-.1.3-.2l.2-.2c.2 0 .2-.3.5-.3-.3-.2-.6-.6-.9-.8-.4.6-.8 1.3-1 2.2m.2 1.6c0-.1-.1-.1-.1-.2.1-.2 0-.4.2-.4-.2 0-.2.1-.4 0l.1.1c0 .2.1.5.1.8 0-.2 0-.3.1-.3m1.1 2.8z"/><path class="st0" d="M10.6 9.7l-.4.6c-.7 1-1.1 2.1-1.1 3.3h1.2v-.1c.1-1.1.5-2.2 1.3-3-.4-.3-.7-.5-1-.8zm3.3 7.5c.1-.1.2-.2.3-.2-.4.1-.6-.2-1-.3-.2-.1-.4-.2-.5-.4-.2.3-.5.6-.8.8.2 0 .2.2.3.2.6.5 1.4.7 2 .9l-.2-.1c-.2-.2-.3-.4-.4-.6.3-.1.3-.2.3-.3M11.2 14v.2c0 .2-.2 0-.2.1v.2c-.1.2.2.3.2.6.1.2 0 .3.2.5 0 .2 0 .6.2.8v.2c0 .2-.2.2-.2.2s.1 0 .1.1c.3-.4.6-.7 1.1-1.1l-.2-.2c-.2-.4-.5-.9-.6-1.4l-.1-.1c0 .2-.1.2-.1.4-.1 0-.2-.1-.2-.1s-.1-.1 0-.2h.1V14c0-.1-.1-.2 0-.2s.2.1.2.2c.1 0 .2 0 .2-.1s.1-.2 0-.2c.1-.2 0-.3 0-.5-.1-.1-.2 0-.3 0-.3.1.1.3 0 .6-.2.3-.3.1-.4.2m10.2 0c-.1 1.4-.6 2.5-1.3 3.6-.2.2-.2.4-.5.5.3.2.6.6.9.9 1.2-1.4 1.9-3 1.9-4.9V14h-1zM10.6 9.2c1.2-1.1 2.5-1.7 4.1-1.8V6.2c-1.6.1-3 .6-4.3 1.5-.2.2-.4.4-.7.6.4.2.7.5.9.9m4.1.2c-1 .1-1.9.5-2.7 1.1.3.2.6.6.8.8 0 0 0-.1.1-.1.4-.2.8-.5 1.2-.6.2 0 .4-.1.6-.1V9.4zm0 1.5c-.7.1-1.2.4-1.7.9h.1c.1.1.2.1.3.2 0 .1-.1.1-.1.2h.1c.1 0 .1 0 .1-.1.1-.1.1.1.2.1h.2c.1-.1.2 0 .2-.1.2-.2.1-.3.2-.4.1 0 0 .1 0 .2.2.1.2-.1.4 0v-1m.1 1.8c-.2.2-.3.2-.5.3-.1.1 0 .2-.2.2 0 .1-.2.2-.2.2-.1.2 0 .3-.1.5-.2.2-.2-.2-.3-.2H13.2c-.1.1-.2.2-.1.2 0 .1-.2 0-.2.2.2 0 .2 0 .4-.1h.2s.1 0 .1.1c.1 0 .1-.2.1-.2 0-.1.1-.1.2-.1s0 .1 0 .1c.2.1 0 .2-.1.3 0 .1 0 .2-.2.2v-.1c0 .1 0 .2.1.2.1-.1.1-.2.2-.2.1-.1 0-.2.1-.3.2 0 .4-.1.6.1v.2c0 .1-.1.2-.2.2v.2c-.1.2-.3.2-.5.2.2.2.6.2.9.2.2 0 .1-.2.2-.3.1-.2.3-.1.5-.2.1-.2.2-.2.2-.4-.2-.1-.2-.2-.2-.3-.1-.1-.1-.2-.2-.2v-.1c0-.1.1-.1.1-.2-.1-.1-.1-.2-.1-.2-.2 0-.2-.2-.3-.2 0-.1-.2-.1-.2-.2-.2.1-.2-.2-.4-.2v-.2c.1-.1.2 0 .2 0h-.1c-.1-.1-.2 0-.3 0 .6.2.5.2.6.3"/><path class="st0" d="M8.6 13.6v-.2c.1-1.3.5-2.4 1.2-3.4.2-.2.3-.5.6-.6l-.8-.8c-1.1 1.3-1.9 2.8-2 4.4 0 .2 0 .5-.1.7.3-.2.8-.2 1.1-.1m10.9 4.8c-.1.2-.4.4-.6.6-.2.2-.6.3-.8.7-.2.2-.2.3-.4.4-.1.2-.2.2-.4.3-.3.3-.6-.2-.8-.2l-.6.1c-.2 0-.4.1-.6 0v1.2h.1c1.9-.1 3.6-.8 5-2.1l-.9-.8v-.2zM15.2 7.3c.1-.1.1-.1.2 0v.2h.1c.9.1 1.8.3 2.5.8.2-.1.4-.2.5 0 .2-.1.2.2.4.2.1 0 .3.3.3.5 0 .1.2.2.2.2.2-.2.4-.5.6-.7l.2-.1c-1.2-1.1-2.7-1.8-4.2-2-.2 0-.6 0-.8-.1v1"/><path class="st0" d="M15.2 9c.2-.1.3 0 .5 0 .8.2 1.5.4 2.2.9-.1-.1-.2-.2-.2-.3 0-.2-.2-.2-.2-.3h.1c.2.2.2.2.3.4.1 0 .2 0 .2.1s0 .2.2.3c0 .2.3.4.3.6 0 .1.1 0 .1 0l.2.3v.2c.1 0 .2-.1.2-.1.2.1 0 .2 0 .3h.2c0 .1-.1.2-.1.2 0 .1.1.1.2.1s.1.1.1.2c.2.2-.1.4 0 .6.1.2 0 .2-.1.4 0 .2-.2.2-.2.4H19c-.1.1.1.2 0 .3h.4c-.1-.2 0-.4.1-.6s.1-.3.2-.4c0 0 .1-.1.1 0 0 .2 0 .3-.1.4.2.2.1.4.2.6h1.2v-.1c-.1-.7-.2-1.5-.5-2.1-.1 0-.2.1-.2 0 0 0-.1 0 0-.1-.2-.2-.2-.3-.4-.5-.2 0-.3-.2-.5-.2s-.1-.3-.3-.2c-.1 0-.2-.2-.2-.2 0-.2 0-.4-.2-.6-.2-.1-.2.2-.3.1-.1 0 0-.2-.1-.2 0-.1-.1-.1-.1-.2.2-.2-.2-.2-.2-.5 0-.2-.2-.2-.3-.4-.6-.2-1.2-.5-1.9-.6-.2 0-.3 0-.5-.1v.1c-.2.5-.2.8-.2 1.2"/><path class="st0" d="M19.5 9.4c.1 0 .1.2.2.2.3.2.4.5.6.6.2.3.5.6.5.9.3.8.6 1.5.6 2.5h1.2c-.1-.1 0-.2-.1-.4-.2-1.8-.9-3.3-2.1-4.6-.2.3-.5.6-.9.8z"/><path class="st1" d="M15.3 7.1c0-.1.2 0 .2 0l.6-.2c.2 0 .5 0 .6.2-.2.2-.3.2-.5.2-.3 0-.6.1-.9-.2m3.4.7c.1 0 .2.1.2.2s.1.2 0 .2c-.2.1-.2-.2-.4-.2v-.1c.1-.2.1 0 .2-.1"/></svg>
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"globalHeaders": {
|
|
3
|
+
"Access-Control-Allow-Origin": "*",
|
|
4
|
+
"Access-Control-Allow-Methods": "GET, OPTIONS"
|
|
5
|
+
},
|
|
6
|
+
"routes": [
|
|
7
|
+
{
|
|
8
|
+
"route": "/react-*.js",
|
|
9
|
+
"headers": {
|
|
10
|
+
"Access-Control-Allow-Origin": "*",
|
|
11
|
+
"Access-Control-Allow-Methods": "GET, OPTIONS",
|
|
12
|
+
"Cache-Control": "public, max-age=31536000, immutable"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"route": "/undp-*.js",
|
|
17
|
+
"headers": {
|
|
18
|
+
"Access-Control-Allow-Origin": "*",
|
|
19
|
+
"Access-Control-Allow-Methods": "GET, OPTIONS",
|
|
20
|
+
"Cache-Control": "public, max-age=31536000, immutable"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"route": "/index.js",
|
|
25
|
+
"headers": {
|
|
26
|
+
"Access-Control-Allow-Origin": "*",
|
|
27
|
+
"Access-Control-Allow-Methods": "GET, OPTIONS",
|
|
28
|
+
"Cache-Control": "no-cache"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"route": "/*",
|
|
33
|
+
"headers": {
|
|
34
|
+
"Access-Control-Allow-Origin": "*",
|
|
35
|
+
"Access-Control-Allow-Methods": "GET, OPTIONS",
|
|
36
|
+
"Cache-Control": "no-cache"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
],
|
|
40
|
+
"navigationFallback": {
|
|
41
|
+
"rewrite": "/index.html",
|
|
42
|
+
"exclude": ["/assets/*", "/*.js", "/*.css", "/*.png", "/*.jpg", "/*.svg"]
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ESNext",
|
|
4
|
+
"allowImportingTsExtensions": true,
|
|
5
|
+
"declaration": true,
|
|
6
|
+
"declarationMap": true,
|
|
7
|
+
"useDefineForClassFields": true,
|
|
8
|
+
"lib": ["DOM", "DOM.Iterable", "ESNext"],
|
|
9
|
+
"allowJs": false,
|
|
10
|
+
"skipLibCheck": true,
|
|
11
|
+
"esModuleInterop": false,
|
|
12
|
+
"allowSyntheticDefaultImports": true,
|
|
13
|
+
"strict": true,
|
|
14
|
+
"forceConsistentCasingInFileNames": true,
|
|
15
|
+
"module": "ESNext",
|
|
16
|
+
"moduleResolution": "bundler",
|
|
17
|
+
"resolveJsonModule": true,
|
|
18
|
+
"isolatedModules": true,
|
|
19
|
+
"noEmit": true,
|
|
20
|
+
"jsx": "react-jsx",
|
|
21
|
+
"baseUrl": ".",
|
|
22
|
+
"paths": {
|
|
23
|
+
"@/*": ["./src/*"]
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"files": [],
|
|
27
|
+
"include": ["eslint.config.js", "src", "tailwind.config.js"],
|
|
28
|
+
"references": [{ "path": "./tsconfig.node.json" }]
|
|
29
|
+
}
|