diff --git a/app/.env b/.env similarity index 71% rename from app/.env rename to .env index 58cfd98..e27cff0 100644 --- a/app/.env +++ b/.env @@ -1,4 +1,5 @@ EXTENSION_API_KEY= EXTENSION_API_SECRET= EXTENSION_BASE_URL= -PORT=8080 \ No newline at end of file +BACKEND_PORT=8080 +FRONTEND_PORT=8081 \ No newline at end of file diff --git a/.github/workflows/call_test_cases.yml b/.github/workflows/call_test_cases.yml index aeeb489..1bbc60f 100644 --- a/.github/workflows/call_test_cases.yml +++ b/.github/workflows/call_test_cases.yml @@ -1,6 +1,6 @@ name: Run test cases -on: pull_request +on: [pull_request, push] jobs: run-test-cases: @@ -29,20 +29,13 @@ jobs: node-version: ${{ matrix.node-version }} - name: Install packages and run tests for node - working-directory: ./app run: | npm install npm run test - # - name: Install packages and run tests for vue - # working-directory: ./src - # run: | - # npm install - # npm run test - - name: Coveralls (Uploading test report) - #if: ${{ steps.get_branch.outputs.branch == 'master' || steps.get_branch.outputs.branch == 'fpco-38359-test-case-setup' }} - uses: coverallsapp/github-action@master + if: ${{ steps.get_branch.outputs.branch == 'main' }} + uses: coverallsapp/github-action@main with: github-token: ${{ secrets.GITHUB_TOKEN }} path-to-lcov: ./app/coverage/lcov.info \ No newline at end of file diff --git a/.gitignore b/.gitignore index ed968d1..5d780b1 100644 --- a/.gitignore +++ b/.gitignore @@ -21,7 +21,7 @@ pnpm-debug.log* *.sln *.sw? -/dist +web/dist # ignore snapshots __snapshots__/ @@ -30,4 +30,4 @@ __snapshots__/ coverage/ # ignore coverage_output.json -app/coverage_output.json \ No newline at end of file +coverage_output.json \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..bd4a62a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,9 @@ +FROM node:18-alpine +EXPOSE 8080 +WORKDIR /app +COPY ./package.json . +COPY ./package-lock.json . +RUN npm install +COPY . . +RUN cd web && npm install && npm run build +CMD ["npm", "run", "start:prod"] \ No newline at end of file diff --git a/README.md b/README.md index b4c0f9c..2fa196c 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ + # Build a Fynd Extension using node.js + vue.js(vue3) [![Coverage Status][coveralls-badge]]([coveralls-url]) @@ -6,19 +7,23 @@ This project outlines the development process for a Fynd extension that displays ## Quick start ### Prerequisites +* You have installed [Node 16.X.X](https://docs.npmjs.com/) or above version. +* You have fdk-cli installed [install](https://github.com/gofynd/fdk-cli) * You have created a [partner account](https://partners.fynd.com). * You have created a [development account](https://partners.fynd.com/help/docs/partners/testing-extension/development-acc#create-development-account) and [populated test data](https://partners.fynd.com/help/docs/partners/testing-extension/development-acc#populate-test-data) in it. -* You’ve installed [Node 16.X.X](https://docs.npmjs.com/) or above version. * You have created an [extension](https://partners.fynd.com) in partner panel. if not, you can follow [extension guide](https://partners.fynd.com/help/docs/partners/getting-started/create-extension) to create an extension. -* You have setup ngrok account to creates a tunnel and updated `EXTENSION_BASE_URL` env variable value to the ngrok URL. -* Update below environment variable value in `.env` file - - EXTENSION_API_KEY:`extension api key` - - EXTENSION_API_SECRET: `extension api secret` - - EXTENSION_BASE_URL: `ngrok url` - - PORT: `port of an application. defaults to 8080` +* Update below environment variable value in `.env` file, This details you can get from partners panel + - EXTENSION_API_KEY:`Extension api key` + - EXTENSION_API_SECRET: `Extension api secret` + ### Project setup + +### Install dependencies + +**Install backend dependency** + Using yarn: ``` yarn install @@ -28,93 +33,73 @@ Using npm: npm install ``` -### Start local server -Starts the local server in watch mode, meaning it will automatically restart when changes are detected. +**Install frontend dependency** Using yarn: ``` -yarn run start +yarn install --cwd ./web ``` Using npm: ``` -npm run start +npm install --prefix ./web ``` -### Serve frontend -Serves the frontend of the application in watch mode, automatically refreshing when changes are made. -Using yarn: -``` -yarn run serve -``` -Using npm: -``` -npm run serve -``` +### Local development +To start development locally you need to start tunnel on `FRONTEND_PORT` defined in .env file to start tunnel you can use `fdk extension preview-url --port `, it will provide partners panel URL -### Start local server and serve frontend -Starts both the local server and serves the frontend in watch mode. +> Before visiting partners panel URL provided by preview-url command you need to hit below command in new terminal -Using yarn: -``` -yarn run dev-start -``` -Using npm: +This command will start backend and frontend server in watch mode and changes you make locally will be directly visible in partners panel ``` -npm run dev-start +node start-dev.js ``` -### Build -Compiles the application for production. +### Build for production deployment +Build frontend. Using yarn: ``` -yarn run build +cd web && yarn run build ``` Using npm: ``` -npm run build +cd web && npm run build ``` -### Lints and fixes files -Checks for linting errors and automatically fixes them if possible. -Using yarn: -``` -yarn run lint -``` -Using npm -``` -npm run lint -``` +### Backend API Proxying -### Testing -**Test backend** +When developing your application, the Vite development server is configured to handle API requests through a proxy. This setup forwards API calls to a backend server, specified by the `BACKEND_PORT` environment variable, ensuring a smooth integration between your frontend and backend during development. -Using yarn -``` -yarn run test:node -``` -Using npm +### Proxy Configuration + +The Vite development server uses the following proxy configuration to direct API requests: ``` -npm run test:node +const proxyOptions = { + target: `http://127.0.0.1:${process.env.BACKEND_PORT}`, + changeOrigin: false, + secure: true, + ws: false +} ``` -**Test Frontend** +### Database Configuration -Using yarn -``` -yarn run test:vue -``` -Using npm -``` -npm run test:vue -``` +By default, this template uses an `SQLite` database to store session data. SQLite is sufficient for development purpose only, it may not be suitable for all production scenarios. The best database for your application depends on your data requirements and query patterns. + +If your app requires a more robust database solution, you can easily extend the base storage class provided by the `fdk-extension-javascript` library to use a database of your choice for session data. Here are some databases that we support by default: + +- SQLite +- Memory Storage +- Redis + +Feel free to configure and run your preferred database on your server to meet your specific needs. ### Tech Stack 1. [fdk-client-javascript](https://github.com/gofynd/fdk-client-javascript): This library contains all the methods to call Fynd platform APIs. 2. [fdk-extension-javascript](https://github.com/gofynd/fdk-extension-javascript): This library streamlines the setup of authentication for accessing Fynd Platform APIs. It also simplifies the process of subscribing to webhooks for receiving real-time notifications. -[coveralls-badge]: https://coveralls.io/repos/github/gofynd/example-extension-javascript/badge.svg?branch=fpco-38359-test-case-setup&&kill_cache=1 -[coveralls-url]: https://coveralls.io/github/gofynd/example-extension-javascript?branch=fpco-38359-test-case-setup \ No newline at end of file +[coveralls-badge]: https://coveralls.io/repos/github/gofynd/example-extension-javascript/badge.svg?branch=main&&kill_cache=1 +[coveralls-url]: https://coveralls.io/github/gofynd/example-extension-javascript?branch=main diff --git a/app/__tests__/unit/global/test-teardown-globals.js b/__tests__/unit/global/test-teardown-globals.js similarity index 100% rename from app/__tests__/unit/global/test-teardown-globals.js rename to __tests__/unit/global/test-teardown-globals.js diff --git a/app/__tests__/unit/index.js b/__tests__/unit/index.js similarity index 100% rename from app/__tests__/unit/index.js rename to __tests__/unit/index.js diff --git a/app/__tests__/unit/routes/products.route.spec.js b/__tests__/unit/routes/products.route.spec.js similarity index 100% rename from app/__tests__/unit/routes/products.route.spec.js rename to __tests__/unit/routes/products.route.spec.js diff --git a/app/__tests__/unit/utils/server.js b/__tests__/unit/utils/server.js similarity index 100% rename from app/__tests__/unit/utils/server.js rename to __tests__/unit/utils/server.js diff --git a/app/coverage_output.js b/coverage_output.js similarity index 100% rename from app/coverage_output.js rename to coverage_output.js diff --git a/app/index.js b/index.js similarity index 80% rename from app/index.js rename to index.js index 0626a0b..113719c 100644 --- a/app/index.js +++ b/index.js @@ -3,7 +3,7 @@ require("dotenv").config(); require('./sqlite.init'); const app = require("./server"); -const port = process.env.PORT || 8080; +const port = process.env.BACKEND_PORT || 8080; app.listen(port, () => { console.log(`Example app listening at http://localhost:${port}`) diff --git a/app/jest.config.js b/jest.config.js similarity index 88% rename from app/jest.config.js rename to jest.config.js index b230e43..a2f6331 100644 --- a/app/jest.config.js +++ b/jest.config.js @@ -3,6 +3,7 @@ module.exports = { testEnvironment: 'node', coverageReporters: ['json-summary', 'lcov'], globalTeardown: './__tests__/unit/global/test-teardown-globals.js', + testPathIgnorePatterns: ['/web/'], setupFiles: ['./jest.init.js'], testMatch: [ '**/__tests__/**/*.spec.[jt]s?(x)', @@ -23,7 +24,8 @@ module.exports = { '!**/index.js', "!**/coverage/**", "!**/coverage_output.js/**", - "!**/coverage_output.json/**" + "!**/coverage_output.json/**", + "!**/start-dev.js" ], bail: true }; \ No newline at end of file diff --git a/app/jest.init.js b/jest.init.js similarity index 100% rename from app/jest.init.js rename to jest.init.js diff --git a/jsconfig.json b/jsconfig.json index 4aafc5f..9d106cb 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -6,7 +6,7 @@ "moduleResolution": "node", "paths": { "@/*": [ - "src/*" + "web/*" ] }, "lib": [ diff --git a/app/package-lock.json b/package-lock.json similarity index 98% rename from app/package-lock.json rename to package-lock.json index 1358634..0db2905 100644 --- a/app/package-lock.json +++ b/package-lock.json @@ -14,11 +14,13 @@ "cookie-parser": "^1.4.6", "dotenv": "^16.4.5", "express": "^4.19.2", - "fdk-extension-javascript": "git+https://github.com/gofynd/fdk-extension-javascript.git#add-sqlite-support-for-storage", + "fdk-extension-javascript": "git+https://github.com/gofynd/fdk-extension-javascript.git#v0.7.8", + "serve-static": "^1.15.0", "sqlite3": "^5.1.7" }, "devDependencies": { "axios-mock-adapter": "^1.21.2", + "concurrently": "^8.2.2", "jest": "^29.7.0", "nodemon": "^3.1.4", "supertest": "^6.3.0" @@ -514,6 +516,18 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/runtime": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.25.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", @@ -2040,6 +2054,48 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "devOptional": true }, + "node_modules/concurrently": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "date-fns": "^2.30.0", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": "^14.13.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -2142,6 +2198,22 @@ "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -4127,6 +4199,12 @@ "node": ">=8" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, "node_modules/logform": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.1.tgz", @@ -5177,6 +5255,12 @@ "node": ">=8.10.0" } }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -5258,6 +5342,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -5389,6 +5482,15 @@ "node": ">=8" } }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/side-channel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", @@ -5587,6 +5689,12 @@ "source-map": "^0.6.0" } }, + "node_modules/spawn-command": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", + "dev": true + }, "node_modules/split-on-first": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", @@ -5978,6 +6086,15 @@ "nodetouch": "bin/nodetouch.js" } }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, "node_modules/triple-beam": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", @@ -5986,6 +6103,12 @@ "node": ">= 14.0.0" } }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -6693,6 +6816,15 @@ "@babel/helper-plugin-utils": "^7.24.7" } }, + "@babel/runtime": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.14.0" + } + }, "@babel/template": { "version": "7.25.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", @@ -7904,6 +8036,34 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "devOptional": true }, + "concurrently": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", + "dev": true, + "requires": { + "chalk": "^4.1.2", + "date-fns": "^2.30.0", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -7985,6 +8145,15 @@ "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" }, + "date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.21.0" + } + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -8330,7 +8499,7 @@ }, "fdk-extension-javascript": { "version": "git+ssh://git@github.com/gofynd/fdk-extension-javascript.git#e72d0adf29ae001f79b2145a1d57d4556849c9a7", - "from": "fdk-extension-javascript@git+https://github.com/gofynd/fdk-extension-javascript.git#add-sqlite-support-for-storage", + "from": "fdk-extension-javascript@git+https://github.com/gofynd/fdk-extension-javascript.git#v0.7.8", "requires": { "axios": "^1.6.4", "crypto-js": "^4.2.0", @@ -9456,6 +9625,12 @@ "p-locate": "^4.1.0" } }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, "logform": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.1.tgz", @@ -10228,6 +10403,12 @@ "picomatch": "^2.2.1" } }, + "regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -10281,6 +10462,15 @@ "glob": "^7.1.3" } }, + "rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -10379,6 +10569,12 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true + }, "side-channel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", @@ -10515,6 +10711,12 @@ "source-map": "^0.6.0" } }, + "spawn-command": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", + "dev": true + }, "split-on-first": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", @@ -10802,11 +11004,23 @@ "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", "dev": true }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, "triple-beam": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==" }, + "tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", diff --git a/app/package.json b/package.json similarity index 71% rename from app/package.json rename to package.json index 00d2b41..d8ba6bd 100644 --- a/app/package.json +++ b/package.json @@ -3,9 +3,16 @@ "version": "1.0.0", "private": true, "scripts": { - "start": "nodemon index.js", + "start": "npm run start:dev", + "start:dev": "nodemon index.js", + "start:prod": "NODE_ENV=production node index.js", "test": "jest --config jest.config.js --no-cache --detectOpenHandles --json --outputFile=./coverage/coverage.json && node coverage_output.js" }, + "nodemonConfig": { + "ignore": [ + "web/**" + ] + }, "dependencies": { "@gofynd/fdk-client-javascript": "^1.4.7", "axios": "^1.7.2", @@ -13,11 +20,13 @@ "cookie-parser": "^1.4.6", "dotenv": "^16.4.5", "express": "^4.19.2", - "fdk-extension-javascript": "git+https://github.com/gofynd/fdk-extension-javascript.git#add-sqlite-support-for-storage", + "fdk-extension-javascript": "git+https://github.com/gofynd/fdk-extension-javascript.git#v0.7.8", + "serve-static": "^1.15.0", "sqlite3": "^5.1.7" }, "devDependencies": { "axios-mock-adapter": "^1.21.2", + "concurrently": "^8.2.2", "jest": "^29.7.0", "nodemon": "^3.1.4", "supertest": "^6.3.0" diff --git a/app/product.router.js b/product.router.js similarity index 100% rename from app/product.router.js rename to product.router.js diff --git a/public/index.html b/public/index.html deleted file mode 100644 index 3e5a139..0000000 --- a/public/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - <%= htmlWebpackPlugin.options.title %> - - - -
- - - diff --git a/app/server.js b/server.js similarity index 84% rename from app/server.js rename to server.js index db91efb..dd15d53 100644 --- a/app/server.js +++ b/server.js @@ -6,6 +6,8 @@ const productRouter = require("./product.router"); const { setupFdk } = require("fdk-extension-javascript/express"); const { SQLiteStorage } = require("fdk-extension-javascript/express/storage"); const { sqliteInstance } = require("./sqlite.init"); +const serveStatic = require("serve-static"); +const { readFileSync } = require('fs'); const fdkExtension = setupFdk({ api_key: process.env.EXTENSION_API_KEY, @@ -29,6 +31,10 @@ const fdkExtension = setupFdk({ access_mode: "online" }); +const STATIC_PATH = process.env.NODE_ENV === 'production' + ? path.join(process.cwd(), 'web', 'dist') + : path.join(process.cwd(), 'web'); + const app = express(); const healthzRouter = express.Router(); const platformApiRoutes = fdkExtension.platformApiRoutes; @@ -56,7 +62,7 @@ healthzRouter.get('/_readyz', (req, res, next) => { app.use("/", healthzRouter); // Serve static files from the Vue dist directory -app.use(express.static("../dist")); +app.use(serveStatic(STATIC_PATH, { index: false })); // FDK extension handler and API routes (extension launch routes) app.use("/", fdkExtension.fdkHandler); @@ -67,8 +73,10 @@ app.use('/api', platformApiRoutes); // Serve the Vue app for all other routes app.get('*', (req, res) => { - res.contentType('text/html'); - res.sendFile(path.join(__dirname, '../', 'dist/index.html')); + return res + .status(200) + .set("Content-Type", "text/html") + .send(readFileSync(path.join(STATIC_PATH, "index.html"))); }); module.exports = app; diff --git a/app/sqlite.init.js b/sqlite.init.js similarity index 61% rename from app/sqlite.init.js rename to sqlite.init.js index f63687e..757f78a 100644 --- a/app/sqlite.init.js +++ b/sqlite.init.js @@ -1,4 +1,4 @@ const sqlite3 = require('sqlite3').verbose(); -const db = new sqlite3.Database(':memory:'); +const db = new sqlite3.Database('session_storage.db'); module.exports = { sqliteInstance: db }; diff --git a/src/.babelrc b/src/.babelrc deleted file mode 100644 index 84c2e57..0000000 --- a/src/.babelrc +++ /dev/null @@ -1,16 +0,0 @@ -{ - "env": { - "test": { - "presets": [ - [ - "@babel/preset-env", - { - "targets": { - "node": "current" - } - } - ] - ] - } - } -} diff --git a/src/vue.config.js b/src/vue.config.js deleted file mode 100644 index 00d9ac1..0000000 --- a/src/vue.config.js +++ /dev/null @@ -1,7 +0,0 @@ -const path = require('path'); -module.exports = { - outputDir: path.resolve(__dirname, '../dist'), - configureWebpack: { - entry: './main.js' - } -}; \ No newline at end of file diff --git a/start-dev.js b/start-dev.js new file mode 100644 index 0000000..d69c466 --- /dev/null +++ b/start-dev.js @@ -0,0 +1,23 @@ +const concurrently = require('concurrently'); +require('dotenv').config({ path: './.env' }); + +const nodeServerCommand = 'npm run start:dev'; +const viteCommand = 'npm run dev'; + +const { result } = concurrently([ + { command: nodeServerCommand, name: 'backend', prefixColor: 'blue' }, + { command: viteCommand, name: 'frontend', prefixColor: 'green', cwd: 'web' } +],{ + killOthers: ['failure'], + restartTries: 3 +}); + +result.then(success, failure); + +function success() { + console.log('All processes exited successfully'); +} + +function failure() { + console.error('One or more processes failed'); +} diff --git a/vue.config.js b/vue.config.js deleted file mode 100644 index 910e297..0000000 --- a/vue.config.js +++ /dev/null @@ -1,4 +0,0 @@ -const { defineConfig } = require('@vue/cli-service') -module.exports = defineConfig({ - transpileDependencies: true -}) diff --git a/src/App.vue b/web/App.vue similarity index 100% rename from src/App.vue rename to web/App.vue diff --git a/src/__tests__/unit/App.spec.js b/web/__tests__/unit/App.spec.js similarity index 100% rename from src/__tests__/unit/App.spec.js rename to web/__tests__/unit/App.spec.js diff --git a/src/__tests__/unit/helper/utils.spec.js b/web/__tests__/unit/helper/utils.spec.js similarity index 100% rename from src/__tests__/unit/helper/utils.spec.js rename to web/__tests__/unit/helper/utils.spec.js diff --git a/src/__tests__/unit/pages/Home.spec.js b/web/__tests__/unit/pages/Home.spec.js similarity index 100% rename from src/__tests__/unit/pages/Home.spec.js rename to web/__tests__/unit/pages/Home.spec.js diff --git a/src/__tests__/unit/pages/NotFound.spec.js b/web/__tests__/unit/pages/NotFound.spec.js similarity index 100% rename from src/__tests__/unit/pages/NotFound.spec.js rename to web/__tests__/unit/pages/NotFound.spec.js diff --git a/src/__tests__/unit/router/guard.spec.js b/web/__tests__/unit/router/guard.spec.js similarity index 100% rename from src/__tests__/unit/router/guard.spec.js rename to web/__tests__/unit/router/guard.spec.js diff --git a/src/__tests__/unit/router/router.spec.js b/web/__tests__/unit/router/router.spec.js similarity index 92% rename from src/__tests__/unit/router/router.spec.js rename to web/__tests__/unit/router/router.spec.js index 9f812a6..98a0d9d 100644 --- a/src/__tests__/unit/router/router.spec.js +++ b/web/__tests__/unit/router/router.spec.js @@ -1,7 +1,7 @@ import Home from '../../../pages/Home.vue'; import NotFound from '../../../pages/NotFound.vue'; import { routeGuard } from '../../../router/guard'; -import router from '../../../router'; // Ensure this is your actual router configuration +import router from '../../../router'; describe('Router Configuration', () => { it('Should have the correct routes', () => { diff --git a/src/assets/default_icon_listing.png b/web/assets/default_icon_listing.png similarity index 100% rename from src/assets/default_icon_listing.png rename to web/assets/default_icon_listing.png diff --git a/src/assets/gifs/loader.gif b/web/assets/gifs/loader.gif similarity index 100% rename from src/assets/gifs/loader.gif rename to web/assets/gifs/loader.gif diff --git a/src/assets/green-dot.svg b/web/assets/green-dot.svg similarity index 100% rename from src/assets/green-dot.svg rename to web/assets/green-dot.svg diff --git a/src/assets/grey-dot.svg b/web/assets/grey-dot.svg similarity index 100% rename from src/assets/grey-dot.svg rename to web/assets/grey-dot.svg diff --git a/src/assets/logo.png b/web/assets/logo.png similarity index 100% rename from src/assets/logo.png rename to web/assets/logo.png diff --git a/src/babel.config.js b/web/babel.config.js similarity index 100% rename from src/babel.config.js rename to web/babel.config.js diff --git a/src/components/loader.vue b/web/components/loader.vue similarity index 100% rename from src/components/loader.vue rename to web/components/loader.vue diff --git a/src/coverage_output.js b/web/coverage_output.js similarity index 100% rename from src/coverage_output.js rename to web/coverage_output.js diff --git a/src/helper/utils.js b/web/helper/utils.js similarity index 100% rename from src/helper/utils.js rename to web/helper/utils.js diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..518a44c --- /dev/null +++ b/web/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + Vue + + +
+ + + diff --git a/src/jest.config.js b/web/jest.config.js similarity index 95% rename from src/jest.config.js rename to web/jest.config.js index c65c18e..80aa1f9 100644 --- a/src/jest.config.js +++ b/web/jest.config.js @@ -1,7 +1,6 @@ module.exports = { verbose: true, coverageReporters: ["json-summary", "lcov", "cobertura"], - moduleFileExtensions: ["js", "json", "vue"], setupFiles: ["./jest.init.js"], testMatch: ['**/__tests__/**/*.spec.js'], transform: { diff --git a/src/jest.init.js b/web/jest.init.js similarity index 100% rename from src/jest.init.js rename to web/jest.init.js diff --git a/src/main.js b/web/main.js similarity index 100% rename from src/main.js rename to web/main.js diff --git a/src/package-lock.json b/web/package-lock.json similarity index 97% rename from src/package-lock.json rename to web/package-lock.json index d382e21..ee09d07 100644 --- a/src/package-lock.json +++ b/web/package-lock.json @@ -1,16 +1,15 @@ { - "name": "groot", + "name": "web", "version": "0.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "groot", + "name": "web", "version": "0.1.0", "dependencies": { "@gofynd/fdk-client-javascript": "^1.4.7", "axios": "^1.2.2", - "flush-promises": "^1.0.2", "url-join": "^4.0.1", "vue": "^3.2.13", "vue-router": "^4.1.6" @@ -21,6 +20,7 @@ "@babel/plugin-proposal-optional-chaining": "^7.11.0", "@babel/plugin-syntax-dynamic-import": "7.8.3", "@babel/plugin-transform-runtime": "^7.24.7", + "@vitejs/plugin-vue": "^4.0.0", "@vue/cli-plugin-babel": "~5.0.8", "@vue/cli-plugin-eslint": "~5.0.8", "@vue/cli-plugin-router": "~5.0.8", @@ -34,13 +34,16 @@ "babel-loader": "8.3.0", "babel-plugin-dynamic-import-node": "2.3.3", "babel-polyfill": "6.26.0", + "dotenv": "^16.4.5", "eslint": "^8.57.0", "eslint-plugin-vue": "^9.27.0", + "flush-promises": "^1.0.2", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "jest-transform-stub": "^2.0.0", "less": "^4.1.3", - "less-loader": "^11.1.0" + "less-loader": "^11.1.0", + "vite": "^4.0.0" } }, "node_modules/@achrinza/node-ipc": { @@ -1885,6 +1888,358 @@ "node": ">=10.0.0" } }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -3575,6 +3930,19 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.6.2.tgz", + "integrity": "sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0 || ^5.0.0", + "vue": "^3.2.25" + } + }, "node_modules/@vue/babel-helper-vue-jsx-merge-props": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz", @@ -4020,6 +4388,15 @@ } } }, + "node_modules/@vue/cli-service/node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/@vue/cli-shared-utils": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-5.0.8.tgz", @@ -6954,12 +7331,15 @@ } }, "node_modules/dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" } }, "node_modules/dotenv-expand": { @@ -7196,6 +7576,43 @@ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, "node_modules/escalade": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", @@ -8241,7 +8658,8 @@ "node_modules/flush-promises": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/flush-promises/-/flush-promises-1.0.2.tgz", - "integrity": "sha512-G0sYfLQERwKz4+4iOZYQEZVpOt9zQrlItIxQAAYAWpfby3gbHrx0osCHz5RLl/XoXevXk0xoN4hDFky/VV9TrA==" + "integrity": "sha512-G0sYfLQERwKz4+4iOZYQEZVpOt9zQrlItIxQAAYAWpfby3gbHrx0osCHz5RLl/XoXevXk0xoN4hDFky/VV9TrA==", + "dev": true }, "node_modules/follow-redirects": { "version": "1.15.6", @@ -14191,6 +14609,22 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -15534,6 +15968,61 @@ "node": ">= 0.8" } }, + "node_modules/vite": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", + "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, "node_modules/vue": { "version": "3.4.34", "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.34.tgz", @@ -17884,6 +18373,160 @@ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true }, + "@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "dev": true, + "optional": true + }, "@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -19266,6 +19909,13 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, + "@vitejs/plugin-vue": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.6.2.tgz", + "integrity": "sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==", + "dev": true, + "requires": {} + }, "@vue/babel-helper-vue-jsx-merge-props": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz", @@ -19595,6 +20245,14 @@ "webpack-merge": "^5.7.3", "webpack-virtual-modules": "^0.4.2", "whatwg-fetch": "^3.6.2" + }, + "dependencies": { + "dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "dev": true + } } }, "@vue/cli-shared-utils": { @@ -21810,9 +22468,9 @@ } }, "dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "dev": true }, "dotenv-expand": { @@ -21997,6 +22655,36 @@ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, + "esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, "escalade": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", @@ -22780,7 +23468,8 @@ "flush-promises": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/flush-promises/-/flush-promises-1.0.2.tgz", - "integrity": "sha512-G0sYfLQERwKz4+4iOZYQEZVpOt9zQrlItIxQAAYAWpfby3gbHrx0osCHz5RLl/XoXevXk0xoN4hDFky/VV9TrA==" + "integrity": "sha512-G0sYfLQERwKz4+4iOZYQEZVpOt9zQrlItIxQAAYAWpfby3gbHrx0osCHz5RLl/XoXevXk0xoN4hDFky/VV9TrA==", + "dev": true }, "follow-redirects": { "version": "1.15.6", @@ -27101,6 +27790,15 @@ "glob": "^7.1.3" } }, + "rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -28113,6 +28811,18 @@ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true }, + "vite": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", + "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", + "dev": true, + "requires": { + "esbuild": "^0.18.10", + "fsevents": "~2.3.2", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + } + }, "vue": { "version": "3.4.34", "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.34.tgz", diff --git a/src/package.json b/web/package.json similarity index 89% rename from src/package.json rename to web/package.json index 22b42a2..6a801f4 100644 --- a/src/package.json +++ b/web/package.json @@ -1,17 +1,17 @@ { - "name": "groot", + "name": "web", "version": "0.1.0", "private": true, "scripts": { - "serve": "PORT=8081 vue-cli-service serve", - "build": "vue-cli-service build", + "dev": "vite", + "serve": "vite preview", + "build": "vite build", "lint": "vue-cli-service lint", "test": "jest --updateSnapshot --no-cache --detectOpenHandles --json --outputFile=./coverage/coverage.json" }, "dependencies": { "@gofynd/fdk-client-javascript": "^1.4.7", "axios": "^1.2.2", - "flush-promises": "^1.0.2", "url-join": "^4.0.1", "vue": "^3.2.13", "vue-router": "^4.1.6" @@ -22,6 +22,7 @@ "@babel/plugin-proposal-optional-chaining": "^7.11.0", "@babel/plugin-syntax-dynamic-import": "7.8.3", "@babel/plugin-transform-runtime": "^7.24.7", + "@vitejs/plugin-vue": "^4.0.0", "@vue/cli-plugin-babel": "~5.0.8", "@vue/cli-plugin-eslint": "~5.0.8", "@vue/cli-plugin-router": "~5.0.8", @@ -35,13 +36,16 @@ "babel-loader": "8.3.0", "babel-plugin-dynamic-import-node": "2.3.3", "babel-polyfill": "6.26.0", + "dotenv": "^16.4.5", "eslint": "^8.57.0", "eslint-plugin-vue": "^9.27.0", + "flush-promises": "^1.0.2", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "jest-transform-stub": "^2.0.0", "less": "^4.1.3", - "less-loader": "^11.1.0" + "less-loader": "^11.1.0", + "vite": "^4.0.0" }, "eslintConfig": { "root": true, diff --git a/src/pages/Home.vue b/web/pages/Home.vue similarity index 98% rename from src/pages/Home.vue rename to web/pages/Home.vue index 262719a..46724fe 100644 --- a/src/pages/Home.vue +++ b/web/pages/Home.vue @@ -12,7 +12,7 @@
This is an illustrative Platform API call to fetch the list of products - in this company. Go to your extension folder’s '/app/routes/' + in this company. Go to your extension folder’s 'product.router.js' directory to check how to call Platform API and start calling API you require.
diff --git a/src/pages/NotFound.vue b/web/pages/NotFound.vue similarity index 100% rename from src/pages/NotFound.vue rename to web/pages/NotFound.vue diff --git a/public/favicon.ico b/web/public/favicon.ico similarity index 100% rename from public/favicon.ico rename to web/public/favicon.ico diff --git a/src/router/guard.js b/web/router/guard.js similarity index 100% rename from src/router/guard.js rename to web/router/guard.js diff --git a/src/router/index.js b/web/router/index.js similarity index 90% rename from src/router/index.js rename to web/router/index.js index 3296e85..0ff1e36 100644 --- a/src/router/index.js +++ b/web/router/index.js @@ -1,6 +1,6 @@ import { createRouter, createWebHistory } from "vue-router" import { routeGuard } from "./guard" -import Home from "../pages/Home" +import Home from "../pages/Home.vue" import NotFound from '../pages/NotFound.vue' const routes = [ @@ -25,7 +25,7 @@ const routes = [ const router = createRouter({ history: createWebHistory(), - base: process.env.BASE_URL, + base: '/', routes }) diff --git a/src/services/product.service.js b/web/services/product.service.js similarity index 100% rename from src/services/product.service.js rename to web/services/product.service.js diff --git a/web/vite.config.js b/web/vite.config.js new file mode 100644 index 0000000..517421f --- /dev/null +++ b/web/vite.config.js @@ -0,0 +1,49 @@ +/* eslint-disable no-undef */ +import { defineConfig } from 'vite' +import { dirname } from 'path' +import { fileURLToPath } from 'url' +import vue from '@vitejs/plugin-vue' +import { config as loadEnv } from 'dotenv'; +import path from 'path'; +loadEnv({ path: path.resolve(__dirname,'../', '.env') }); + +const proxyOptions = { + target: `http://127.0.0.1:${process.env.BACKEND_PORT}`, + changeOrigin: false, + secure: true, + ws: false +} + +const host = process.env.HOST ? process.env.HOST.replace(/https?:\/\//, '') : 'localhost' + +let hmrConfig +if (host === 'localhost') { + hmrConfig = { + protocol: 'ws', + host: 'localhost', + port: 64999, + clientPort: 64999 + } +} else { + hmrConfig = { + protocol: 'wss', + host: host, + port: process.env.FRONTEND_PORT, + clientPort: 443 + } +} + +export default defineConfig({ + root: dirname(fileURLToPath(import.meta.url)), + plugins: [vue()], + server: { + host: 'localhost', + port: process.env.FRONTEND_PORT, + hmr: hmrConfig, + proxy: { + '^/(\\?.*)?$': proxyOptions, + '^/api(/|(\\?.*)?$)': proxyOptions, + '^/fp(/|(\\?.*)?$)': proxyOptions, + } + } +}) \ No newline at end of file