diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000000..51e2294cc2 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,105 @@ +{ + "name": "LiteFarm Codespace", + "image": "mcr.microsoft.com/devcontainers/base:bookworm", + "features": { + "ghcr.io/devcontainers/features/node:1": { + "version": "18.16.1", + "installYarnUsingApt": false + }, + "ghcr.io/devcontainers/features/docker-in-docker:2": {} + }, + "customizations": { + "vscode": { + "settings": { + "cSpell.language": "pl,en", + "cSpell.words": ["LiteFarm"], + "cSpell.overrides": [ + { + "filename": "packages/api/src/jobs/locales/en/*.*", + "language": "en" + }, + { + "filename": "packages/api/src/jobs/locales/pl/*.*", + "language": "pl" + }, + { + "filename": "packages/api/src/templates/locales/en.json", + "language": "en" + }, + { + "filename": "packages/api/src/templates/locales/pl.json", + "language": "pl" + }, + { + "filename": "packages/webapp/public/locales/en/*.*", + "language": "en" + }, + { + "filename": "packages/webapp/public/locales/pl/*.*", + "language": "pl" + } + ], + "cSpell.ignorePaths": [ + "package-lock.json", + "node_modules", + "**/node_modules", + "vscode-extension", + ".git/objects", + ".vscode", + ".vscode-insiders", + ".gradle", + ".svn", + "logs", + ".cache" + ], + "files.defaultLanguage": "en", + "vscode.php-language-features": false, + "vscode.php": false, + "vscode.swift": false, + "vscode.rust": false, + "vscode.ruby": false, + "vscode.r": false, + "vscode.pug": false, + "vscode.objective-c": false, + "vscode.make": false, + "vscode.lua": false, + "vscode.less": false, + "vscode.go": false, + "vscode.dart": false, + "vscode.fsharp": false, + "vscode.coffeescript": false, + "vscode.csharp": false, + "vscode.vb": false, + "vscode.latex": false, + "vscjava.vscode-maven": false + }, + "extensions": [ + "streetsidesoftware.code-spell-checker", + "streetsidesoftware.code-spell-checker-polish", + "streetsidesoftware.code-spell-checker-british-english", + "redhat.vscode-yaml", + "shd101wyy.markdown-preview-enhanced" + ] + } + }, + "forwardPorts": [3000, 5001, 5433, 9000, 8088], + "portsAttributes": { + "3000": { + "label": "Frontend (React)" + }, + "5001": { + "label": "Backend (Express)" + }, + "5433": { + "label": "Postgres" + }, + "9000": { + "label": "MinIO" + }, + "8088": { + "label": "Imaginary" + } + }, + "postCreateCommand": "bash .devcontainer/post-create.sh", + "postStartCommand": "bash .devcontainer/post-start.sh" +} diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh new file mode 100644 index 0000000000..1c1f396631 --- /dev/null +++ b/.devcontainer/post-create.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +DIR=`pwd` +echo "Current directory: $DIR" + +nvm use + +# Install the root package dependencies +npm install + +# Install the API package dependencies +cd $DIR/packages/api +npm install + +# Install the API package dependencies +cd $DIR/packages/webapp +pnpm install + +# Install the shared package dependencies +cd $DIR/packages/shared +npm install + +# Copy the default environment files +cp $DIR/packages/api/.env.default $DIR/packages/api/.env +cp $DIR/packages/webapp/.env.default $DIR/packages/webapp/.env + +if [ -x "$(command -v docker-compose)" ]; then + docker-compose up --detach +else + docker compose up --detach +fi + +sleep 10 + +# Set up the PostgreSQL database used by the app +cd $DIR/packages/api +npm run migrate:dev:db diff --git a/.devcontainer/post-start.sh b/.devcontainer/post-start.sh new file mode 100644 index 0000000000..cea089be96 --- /dev/null +++ b/.devcontainer/post-start.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +if [ -x "$(command -v docker-compose)" ]; then + docker-compose up --detach +else + docker compose up --detach +fi diff --git a/package-lock.json b/package-lock.json index ca1dcfa481..3450330e27 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,6 +5,7 @@ "packages": { "": { "devDependencies": { + "concurrently": "^9.0.1", "husky": "^7.0.4", "lerna": "^5.0.0", "lint-staged": "^13.2.2", @@ -2708,6 +2709,87 @@ "typedarray": "^0.0.6" } }, + "node_modules/concurrently": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.0.1.tgz", + "integrity": "sha512-wYKvCd/f54sTXJMSfV6Ln/B8UrfLBKOYa+lzc6CHay3Qek+LorVSBdMVfyewFhRbH0Rbabsk4D+3PL/VjQ5gzg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "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": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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/concurrently/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/concurrently/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/config-chain": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", @@ -7446,6 +7528,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/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -7897,6 +7988,15 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, + "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/treeverse": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-2.0.0.tgz", diff --git a/package.json b/package.json index a197324667..a83a5455bf 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "devDependencies": { + "concurrently": "^9.0.1", "husky": "^7.0.4", "lerna": "^5.0.0", "lint-staged": "^13.2.2", @@ -14,7 +15,8 @@ "ngrok": "ngrok start --config=./ngrok/ngrok.yml --all", "ngrok:setup": "node ./ngrok/ngrok-setup.js", "ngrok:api": "ngrok start --config=./ngrok/ngrok.yml api", - "ngrok:webapp": "ngrok start --config=./ngrok/ngrok.yml webapp" + "ngrok:webapp": "ngrok start --config=./ngrok/ngrok.yml webapp", + "dev": "concurrently -n api,webapp \"cd packages/api && npm run nodemon\" \"cd packages/webapp && pnpm dev\"" }, "type": "module", "jest": {