Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reconcile Git Proxy with most up-to-date improvements #335

Merged
merged 169 commits into from
May 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
169 commits
Select commit Hold shift + click to select a range
80c49b1
chore: remove unused images & files + renaming of files
JamieSlome Oct 31, 2023
b5162fc
chore: implement eslint and prettier scripts + run lint and formatter
JamieSlome Oct 31, 2023
0d67262
chore: remove eslint-disable at file level and fix import statements …
JamieSlome Nov 1, 2023
fa2f029
Merge branch 'main' into reconcile
JamieSlome Nov 7, 2023
37d37ef
chore: cascade changes to root of /src folder
JamieSlome Nov 7, 2023
dc6ce86
Merge branch 'reconcile' of https://github.com/finos/git-proxy into r…
JamieSlome Nov 7, 2023
2c2ad15
chore: reconcile src/ui/assets folder
JamieSlome Nov 7, 2023
250cde4
chore: reconcile src/ui/components folder
JamieSlome Nov 7, 2023
3b59292
chore: reconcile src/ui/layouts folder
JamieSlome Nov 7, 2023
dea18e5
fix: convert default user array to object in admin.jsx
JamieSlome Nov 7, 2023
25dbeb7
chore: replace usage of react-router-dom history with useNavigate
JamieSlome Nov 7, 2023
832274d
chore: reconcile src/ui/services and VITE_API_URI env loading
JamieSlome Nov 7, 2023
bb60c65
chore: remove /api/v1 from user ui services
JamieSlome Nov 7, 2023
0b19e46
chore: reconcile login and open push requests views in src/ui/views
JamieSlome Nov 7, 2023
2a933e3
chore: reconcile src/ui/views lists with simpler design
JamieSlome Nov 7, 2023
8187de9
chore: simplify further src/ui/views lists
JamieSlome Nov 7, 2023
9c32fcd
chore: reconcile userlist.jsx in userlist component
JamieSlome Nov 7, 2023
c00b7b7
chore: remove deprecated NewUser component
JamieSlome Nov 7, 2023
db02ec2
chore: reconcile pushes table in src/ui/views
JamieSlome Nov 7, 2023
31fe1be
chore: remove unused Navigate in PushesTable
JamieSlome Nov 7, 2023
9952482
chore: reconcile repo details in src/ui/views
JamieSlome Nov 7, 2023
ef491e6
chore: reconcile new repositories and repository overview component
JamieSlome Nov 8, 2023
b2b51de
chore: add new repository component for creating repository record
JamieSlome Nov 8, 2023
72cfc61
chore: reconcile service routes except auth
JamieSlome Nov 15, 2023
5d1d505
chore: reconcile index.html in project root
JamieSlome Nov 15, 2023
195cf8f
chore: reconcile remaining ui/views
JamieSlome Dec 6, 2023
646cc37
Merge branch 'main' into reconcile
JamieSlome Jan 8, 2024
0648576
Merge branch 'main' into reconcile
JamieSlome Jan 8, 2024
71167b5
chore: update all mongo functions for database connector
JamieSlome Jan 8, 2024
d60f9e3
chore: update Action class definition to deprecate unused functions
JamieSlome Jan 8, 2024
23bdd89
chore: reconcile proxy index.js and chain.js with @coopernetes plugin…
JamieSlome Jan 8, 2024
347b656
chore: reconcile proxy/routes/index.js
JamieSlome Jan 8, 2024
f70d405
chore: reconcile proxy/processors/pre-processor
JamieSlome Jan 8, 2024
11af71d
chore: reconcile and push all push-action lambdas
JamieSlome Jan 8, 2024
7f57020
chore: fix const spelling mistake for mongoSession in mongo/helper.js
JamieSlome Jan 9, 2024
6186e90
chore: reconcile src/db/index.js
JamieSlome Jan 9, 2024
20c9061
chore: reconcile src/service/index.js
JamieSlome Jan 9, 2024
1a6d113
fix: replace usage of useHistory and Redirect with useNavigate and Na…
JamieSlome Jan 9, 2024
97cb775
Merge branch 'main' into reconcile
JamieSlome Jan 10, 2024
b326e26
chore: resolve code linting failure in CI
JamieSlome Jan 11, 2024
7e8806d
Merge branch 'main' into reconcile
JamieSlome Jan 26, 2024
848186e
chore: remove plaintext logging of user credentials (CodeQL spot)
JamieSlome Jan 26, 2024
08b3b6d
chore: install missing dependency express-mongodb-session
JamieSlome Jan 26, 2024
aed9e4e
Update src/proxy/processors/push-action/parsePush.js
JamieSlome Jan 26, 2024
744cec8
Update src/proxy/routes/index.js
JamieSlome Jan 26, 2024
51c2505
chore: remove checkTraining lambda reference due to undefined
JamieSlome Jan 26, 2024
4cc2da0
Merge branch 'reconcile' of https://github.com/finos/git-proxy into r…
JamieSlome Jan 26, 2024
9903517
Merge branch 'main' into reconcile
JamieSlome Feb 8, 2024
5ffdb80
Merge branch 'main' into reconcile
JamieSlome Feb 9, 2024
0c7004f
fix: re-attach file sink to sink loader
JamieSlome Feb 9, 2024
9f81370
chore: re-instate default repository loading
JamieSlome Feb 9, 2024
9175f5d
chore: update equality expression for default authorised repository list
JamieSlome Feb 9, 2024
4a82e6b
chore: remove self signed cert configuration option
JamieSlome Feb 9, 2024
bd4d0bb
chore: add latest config options to proxy.config.json
JamieSlome Feb 9, 2024
b3b5fa8
chore: add new config features and associated functions
JamieSlome Feb 9, 2024
0858219
feat: add email sender functionality with smtp host and port from config
JamieSlome Feb 9, 2024
dc887be
chore: reconcile src/service/passport and src/service/routes
JamieSlome Feb 13, 2024
d1d76af
chore: update get third party apis call to latest rename
JamieSlome Feb 13, 2024
f8f6a72
fix: update absolute build path to build instead of dist folder
JamieSlome Feb 13, 2024
c3bb9ba
test: update test api calls with /api
JamieSlome Feb 21, 2024
de1a54d
chore: only assign store value to session when database type is mongo
JamieSlome Feb 22, 2024
5aa904d
chore: fix calls to favicon.ico and manifest.json in index.html
JamieSlome Feb 22, 2024
7ae25ff
fix: remove concat of prop.layout and prop.path in admin.jsx @coopern…
JamieSlome Feb 26, 2024
30e8392
fix: deprecate usage of props and replace with useParams in RepoDetai…
JamieSlome Feb 26, 2024
f4b2ae7
fix: replace props with useParams in PushDetails.jsx
JamieSlome Feb 26, 2024
55164ae
fix: deprecate usage of props and replace with useParams in User.jsx
JamieSlome Feb 26, 2024
9b49930
fix: fix navigate call to specific push ID in PushesTable.jsx
JamieSlome Feb 26, 2024
44c028a
Merge branch 'main' into reconcile
JamieSlome Feb 26, 2024
3c9dbb7
fix: correct input on Snackbar open property to type Boolean
JamieSlome Feb 28, 2024
4152896
fix: call useParams() outside of useEffect hook
JamieSlome Feb 28, 2024
c4c5da1
chore: fix React warnings @maoo
JamieSlome Feb 28, 2024
b72ab8e
Merge branch 'main' into reconcile
JamieSlome Feb 28, 2024
efc5434
Merge branch 'main' into reconcile
JamieSlome Feb 29, 2024
6ff82d3
chore: fix api/auth/login endpoint from #453
JamieSlome Feb 29, 2024
5ef246d
chore: uninstall unused deps chartist and react-chartist
JamieSlome Feb 29, 2024
9ae59a6
Merge branch 'main' into reconcile
JamieSlome Feb 29, 2024
3a7f75e
chore: move add repository button to top of repositories page
JamieSlome Feb 29, 2024
d8acd59
chore: fix admin page title via usage of useParams
JamieSlome Feb 29, 2024
a9fc315
chore: remove usage of activeClassName - closes #451
JamieSlome Feb 29, 2024
fe26a4b
chore: remove unused deps email-validator and generate-password
JamieSlome Feb 29, 2024
76f4532
chore: update source.fixAll.eslint to explicit flag in VSCode settings
JamieSlome Feb 29, 2024
14c9377
Merge branch 'main' into reconcile
JamieSlome Mar 6, 2024
26fcd9d
fix: extract both full name and git account name from commit (@cooper…
JamieSlome Mar 8, 2024
1f8e80d
fix: move domain email domain configuration under email property in c…
JamieSlome Mar 8, 2024
b96d261
chore: only run email local and domain check if config exists
JamieSlome Mar 8, 2024
b6c4351
chore: add isUserPushAllowed function to file DB
JamieSlome Mar 8, 2024
30f671c
chore: await bcrypt.hash call when creating password payload
JamieSlome Mar 12, 2024
e91e418
chore: set cookie secure flag to auto
JamieSlome Mar 12, 2024
c4c28d1
chore: show all rows in repository permissions including admin
JamieSlome Mar 12, 2024
d80fd24
Merge branch 'main' into reconcile
JamieSlome Mar 12, 2024
1100721
chore: fix logout flow and return isAuth and user state to client
JamieSlome Mar 12, 2024
1618d00
chore: remove author and committer split to support usernames and ful…
JamieSlome Mar 12, 2024
b2d403a
Merge branch 'main' into reconcile
JamieSlome Mar 13, 2024
d85f4c8
chore: remove incorrect version tag in auth api endpoint
JamieSlome Mar 14, 2024
36637f8
test: remove unused parameters for user creation in before hook
JamieSlome Mar 14, 2024
df62439
chore: remove tests for deprecated change password functionality
JamieSlome Mar 14, 2024
d299f24
test: remove incorrect usage of setEncoding in test
JamieSlome Mar 14, 2024
4151f4a
chore: add VITE_SERVER_URI to .env and use for clone URL
JamieSlome Mar 15, 2024
479a2eb
chore: strip author and committer correct in get commit data function
JamieSlome Mar 15, 2024
0693912
chore: add cancel push functionality to file db
JamieSlome Mar 15, 2024
d1ec773
chore: allow admin account to approve and reject pushes
JamieSlome Mar 15, 2024
0a4ac9c
chore: add user review permissions assessment for file db
JamieSlome Mar 15, 2024
d74c311
chore: add user approve and reject push for repo permissions for file db
JamieSlome Mar 15, 2024
308918d
chore: fix usage of string based prop with number based input
JamieSlome Mar 15, 2024
295e78a
chore: support attestation views with file db
JamieSlome Mar 15, 2024
3e08ff0
test: skip failing test due to functionality drift
JamieSlome Mar 18, 2024
9062764
Merge branch 'main' into reconcile
JamieSlome Mar 18, 2024
5a4b261
fix: remove usage of async on handleMessage function as flow is synch…
JamieSlome Mar 18, 2024
1a9458c
chore: remove todo comment as implementation is abstract and generic …
JamieSlome Mar 18, 2024
489206a
chore: set active directory domain via configuration instead of magic…
JamieSlome Mar 18, 2024
b64b8eb
chore: fix shareable link in success message and add color styling an…
JamieSlome Mar 18, 2024
acf7601
chore: remove ERR string from returned proxy message
JamieSlome Mar 18, 2024
6cbb887
chore: remove deprecated send notification for auth processor
JamieSlome Mar 18, 2024
aebc55a
chore: regenerate package-lock.json to fix eslint-react-plugin conflict
JamieSlome Mar 18, 2024
955313c
chore: update docs to reflect new terminal output for intercepted push
JamieSlome Mar 18, 2024
cb0f943
docs: instructions for approving push using the UI 🎉
JamieSlome Mar 18, 2024
490a312
Merge branch 'main' into reconcile
JamieSlome Mar 20, 2024
473c048
Merge branch 'main' into reconcile
JamieSlome Mar 21, 2024
93bac7e
chore: update package-lock.json
JamieSlome Mar 21, 2024
f16f025
Merge branch 'main' into reconcile
JamieSlome Mar 21, 2024
f6a8382
fix: address codeql database query using user controlled source
JamieSlome Mar 21, 2024
59e6ee0
fix: address codeql stack trace and exception text reinterpreted as html
JamieSlome Mar 22, 2024
dde7a53
fix: address codeql stack trace exposure at login
JamieSlome Mar 22, 2024
2b64fc5
fix: address codeql dom text reinterpreted as html with escape html func
JamieSlome Mar 22, 2024
75ffe48
Merge branch 'main' into reconcile
JamieSlome Mar 22, 2024
f044286
Merge branch 'main' into reconcile
JamieSlome Mar 22, 2024
8d5d996
Merge branch 'main' into reconcile
JamieSlome Mar 22, 2024
e834149
chore: remove unused file user-settings.json
JamieSlome Mar 22, 2024
c233f1f
Merge branch 'main' into reconcile
JamieSlome Mar 25, 2024
32299f2
Merge branch 'main' into reconcile
JamieSlome Mar 25, 2024
22ac6cb
Merge branch 'main' into reconcile
JamieSlome Mar 25, 2024
876611d
chore: move usage of lusca csrf before serving of files with .get()
JamieSlome Mar 26, 2024
90dacc7
chore: move csrf app usage before express static build path
JamieSlome Mar 26, 2024
691b005
Merge branch 'main' into reconcile
JamieSlome Mar 26, 2024
ee08d24
Merge branch 'main' into reconcile
JamieSlome Apr 4, 2024
aaa633d
chore: introduce multiple npx bin commands for fullstack option with ui
JamieSlome Apr 4, 2024
34b21fe
Merge branch 'main' into reconcile
JamieSlome Apr 8, 2024
af11413
chore: add httpOnly flag to express session cookie
JamieSlome Apr 8, 2024
753274b
Merge branch 'main' into reconcile
JamieSlome Apr 9, 2024
850120b
Update package.json
JamieSlome Apr 9, 2024
ffd3602
chore: track bin command changes in package-lock.json
JamieSlome Apr 9, 2024
3481a18
chore: implement csrf protections with lusca
JamieSlome Apr 12, 2024
adcd961
chore: add getCookie util for ui + CSRF protection on login/logout
JamieSlome Apr 12, 2024
1e2677e
Merge branch 'main' into reconcile
JamieSlome Apr 12, 2024
d6d2c91
chore: fix ESLINT warnings of undefined variables @msagi
JamieSlome Apr 12, 2024
9de9012
chore: attach csrf header to write-based ui service functions
JamieSlome Apr 18, 2024
ecde243
Merge branch 'main' into reconcile
JamieSlome Apr 18, 2024
aedfb16
feat: make csrf protections configurable with config property and getter
JamieSlome Apr 18, 2024
5531de9
chore: only enable csrf protections when config set to true
JamieSlome Apr 19, 2024
767f2bf
chore: set csrfProtection default to false
JamieSlome Apr 19, 2024
77ab2be
test: adjust login endpoint test pass tests
JamieSlome Apr 19, 2024
0553c80
chore: update cli to include api namespacing @msagi
JamieSlome Apr 19, 2024
003c8ca
chore: update invocation usage of /auth/profile with /api
JamieSlome Apr 19, 2024
b577d2e
chore: replace express-mongodb-session with connect-mongodb-session
JamieSlome Apr 19, 2024
e62fae3
chore: update tar in package-lock.json to 6.2.1
JamieSlome Apr 19, 2024
0ccd552
chore: replace connect-mongodb-session with connect-mongo
JamieSlome Apr 19, 2024
efe5554
Merge branch 'main' into reconcile
JamieSlome Apr 23, 2024
ef2896d
fix: git-proxy-cli tests
msagi Apr 27, 2024
2c09552
fix: cosmetics
msagi Apr 27, 2024
3b51e5c
Merge pull request #538 from msagi/reconcile
JamieSlome Apr 29, 2024
62c17e4
Merge branch 'main' into reconcile
JamieSlome Apr 29, 2024
6314353
chore: fix ESLINT JSON errors by introducing eslint-plugin-json depen…
JamieSlome Apr 29, 2024
a06f5f1
chore: update config.schema.json to reflect latest configuration feat…
JamieSlome Apr 30, 2024
ae88e2e
fix: add csrf protections to delete repo functionality
JamieSlome May 1, 2024
dc782be
fix: prevent csrf token mismatch on logout and re-login
JamieSlome May 1, 2024
437b8a4
chore: enable CSRF security protections by default
JamieSlome May 1, 2024
c03b884
chore: disable csrf protection for test runner
JamieSlome May 1, 2024
51fac5b
chore: expose test ENV to test runner and remove unused scripts
JamieSlome May 1, 2024
248e5f8
chore: add NODE_ENV test variable for CLI tests
JamieSlome May 1, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .env.development
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
VITE_API_URI=http://localhost:8080
VITE_SERVER_URI=http://localhost:8000
1 change: 1 addition & 0 deletions .env.production
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
VITE_API_URI=
40 changes: 0 additions & 40 deletions .eslintrc.cjs

This file was deleted.

41 changes: 41 additions & 0 deletions .eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
{
"parser": "@babel/eslint-parser",
"env": {
"node": true,
"browser": true,
"commonjs": true,
"es2021": true,
"mocha": true
},
"extends": [
"eslint:recommended",
"plugin:react/recommended",
"google",
"prettier",
"plugin:json/recommended"
],
"overrides": [],
"parserOptions": {
"requireConfigFile": false,
"ecmaVersion": 12,
"sourceType": "module",
"ecmaFeatures": {
"jsx": true,
"modules": true
},
"babelOptions": {
"presets": ["@babel/preset-react"]
}
},
"plugins": ["react", "prettier"],
"rules": {
"react/prop-types": "off",
"require-jsdoc": "off",
"no-async-promise-executor": "off"
},
"settings": {
"react": {
"version": "detect"
}
}
}
10 changes: 10 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"semi": true,
"tabWidth": 2,
"printWidth": 100,
"singleQuote": true,
"trailingComma": "all",
"jsxSingleQuote": true,
"bracketSpacing": true,
"arrowParens": "always"
}
25 changes: 11 additions & 14 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
{
"javascript.suggestionActions.enabled": false,
"editor.tabSize": 2,
"files.eol": "\n",
"terminal.integrated.disableLineWrapping": true,
"debug.console.wordWrap": false,
"editor.wordWrap": "off",
"editor.codeActionsOnSave": {
"source.fixAll": true
},
"eslint.validate": [
"javascript",
"javascriptreact",
]
}
"javascript.suggestionActions.enabled": false,
"editor.tabSize": 2,
"files.eol": "\n",
"debug.console.wordWrap": false,
"editor.wordWrap": "off",
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
},
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true
}
39 changes: 35 additions & 4 deletions config.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,37 @@
"description": "Configuration for customizing git-proxy",
"type": "object",
"properties": {
"proxyUrl": { "type": "string" },
"cookieSecret": { "type": "string" },
"sessionMaxAgeHours": { "type": "number" },
"api": {
"description": "Third party APIs",
"type": "object"
},
"commitConfig": {
"description": "Enforce rules and patterns on commits including e-mail and message",
"type": "object"
},
"attestationConfig": {
"description": "Customisable questions to add to attestation form",
"type": "object"
},
"privateOrganizations": {
"description": "Pattern searches for listed private organizations are disabled",
"type": "array"
},
"urlShortener": {
"description": "Customisable URL shortener to share in proxy responses and warnings",
"type": "string"
},
"contactEmail": {
"description": "Customisable e-mail address to share in proxy responses and warnings",
"type": "string"
},
"csrfProtection": {
"description": "Flag to enable CSRF protections for UI",
"type": "boolean"
},
"authorisedList": {
"description": "List of repositories that are authorised to be pushed to through the proxy.",
"type": "array",
Expand Down Expand Up @@ -46,7 +77,7 @@
"name": { "type": "string" },
"url": { "type": "string" }
},
"required": [ "project", "name", "url" ]
"required": ["project", "name", "url"]
},
"database": {
"type": "object",
Expand All @@ -57,7 +88,7 @@
"options": { "type": "object" },
"params": { "type": "object" }
},
"required": [ "type", "enabled" ]
"required": ["type", "enabled"]
},
"authentication": {
"type": "object",
Expand All @@ -66,8 +97,8 @@
"enabled": { "type": "boolean" },
"options": { "type": "object" }
},
"required": [ "type", "enabled" ]
"required": ["type", "enabled"]
}
},
"additionalProperties": false
}
}
41 changes: 18 additions & 23 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -18,53 +18,48 @@
*/

-->
<!DOCTYPE html>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1, shrink-to-fit=no"
/>
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<meta name="theme-color" content="#000000" />
<!--
manifest.json provides metadata used when your web app is added to the
homescreen on Android. See https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/
-->
<link rel="manifest" href="/manifest.json" />
<link rel="shortcut icon" href="/favicon.ico" />
<link
rel="apple-touch-icon"
sizes="76x76"
href="/apple-icon.png"
/>
<link
rel="stylesheet"
href="//cdn.jsdelivr.net/chartist.js/latest/chartist.min.css"
/>
<link rel="apple-touch-icon" sizes="76x76" href="/apple-icon.png" />
<link rel="stylesheet" href="//cdn.jsdelivr.net/chartist.js/latest/chartist.min.css" />

<script src="//cdn.jsdelivr.net/chartist.js/latest/chartist.min.js"></script>
<script
src="https://cdn.jsdelivr.net/chartist.js/0.11.0/chartist.min.js"
integrity="sha384-BnJvHBnDyKVZFn8I5i6LHXOscPlizGS+cgZi1crgdHmjU9lVKXwtNsqXQ521P++Z"
crossorigin="anonymous"
></script>
<link
rel="stylesheet"
href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Material+Icons"
/>
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet" />
<link
href="https://fonts.googleapis.com/icon?family=Material+Icons"
rel="stylesheet"
href="//maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"
/>

<link
rel="stylesheet"
href="//maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"
type="text/css"
href="https://cdn.jsdelivr.net/npm/diff2html/bundles/css/diff2html.min.css"
/>

<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/diff2html/bundles/css/diff2html.min.css" />

<!--
Notice the use of %PUBLIC_URL% in the tags above.
Notice the use of / in the tags above.
It will be replaced with the URL of the `public` folder during the build.
Only files inside the `public` folder can be referenced from the HTML.

Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
Unlike "/favicon.ico" or "favicon.ico", "//favicon.ico" will
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
Expand All @@ -73,7 +68,6 @@
<body>
<noscript> You need to enable JavaScript to run this app. </noscript>
<div id="root"></div>
<script type="module" src="/src/index.jsx"></script>
<!--
This HTML file is a template.
If you open it directly in the browser, you will see an empty page.
Expand All @@ -85,4 +79,5 @@
To create a production bundle, use `npm run build` or `yarn build`.
-->
</body>
</html>
<script type="module" src="/src/index.jsx"></script>
</html>
Loading
Loading