Browse Source

build: altera quasar config para alternar entre ambientes diferentes

Gustavo Mantovani 1 week ago
parent
commit
9c633958af
4 changed files with 80 additions and 17 deletions
  1. 6 0
      .env.app.dev
  2. 1 0
      .gitignore
  3. 10 6
      package.json
  4. 63 11
      quasar.config.js

+ 6 - 0
.env.app.dev

@@ -0,0 +1,6 @@
+API_URL=http://localhost:3000
+PASSWORD=S@ft2080.
+WEBSOCKET_API=http://localhost:4321/
+WEBSOCKET_PATH=/socket.io
+WEBSOCKET_ROOM=LARAVEL
+WEBSOCKET_API_KEY=7wArC/kl0nTbt4zBu0agw.NXLyjA96I6x1XmBcuokwPqfo3/CIxzqYw.PTthh5eqa08Uf4ubFlOqatpShoz1CRRID9pZReEFvBk3il6E9u

+ 1 - 0
.gitignore

@@ -6,6 +6,7 @@
 .env
 .env.*
 !.env.example
+!.env.app.dev
 
 npm-debug.log*
 yarn-debug.log*

+ 10 - 6
package.json

@@ -10,12 +10,16 @@
     "lint": "eslint --ext .js,.vue ./",
     "format": "prettier --write \"**/*.{js,vue,scss,html,md,json}\" --ignore-path .gitignore",
     "test": "echo \"No test specified\" && exit 0",
-    "dev": "quasar dev",
-    "dev:android": "quasar dev -m capacitor -T android",
-    "dev:ios": "quasar dev -m capacitor -T ios",
-    "build": "quasar build",
-    "build:ios": "quasar build -m capacitor -T ios --ide",
-    "build:android": "quasar build -m capacitor -T android --ide"
+    "dev": "APP_ENV=dev quasar dev",
+    "dev:staging": "APP_ENV=staging quasar dev",
+    "dev:android": "APP_ENV=dev quasar dev -m capacitor -T android",
+    "dev:ios": "APP_ENV=dev quasar dev -m capacitor -T ios",
+    "build": "APP_ENV=prod quasar build",
+    "build:dev": "APP_ENV=dev quasar build",
+    "build:staging": "APP_ENV=staging quasar build",
+    "build:prod": "APP_ENV=prod quasar build",
+    "build:ios": "APP_ENV=prod quasar build -m capacitor -T ios --ide",
+    "build:android": "APP_ENV=prod quasar build -m capacitor -T android --ide"
   },
   "dependencies": {
     "@bufbuild/protobuf": "^2.5.1",

+ 63 - 11
quasar.config.js

@@ -4,9 +4,71 @@
 // https://v2.quasar.dev/quasar-cli-vite/quasar-config-js
 
 import { defineConfig } from "#q-app/wrappers";
+import { existsSync, readFileSync } from "node:fs";
 import { fileURLToPath } from "node:url";
+import { resolve } from "node:path";
+
+const envFiles = {
+  dev: ".env.app.dev",
+  staging: ".env.app.staging",
+  prod: ".env.app.prod",
+};
+
+const parseEnvFile = (filePath) => {
+  if (!existsSync(filePath)) {
+    return {};
+  }
+
+  return readFileSync(filePath, "utf8")
+    .split(/\r?\n/)
+    .reduce((env, line) => {
+      const trimmedLine = line.trim();
+
+      if (!trimmedLine || trimmedLine.startsWith("#")) {
+        return env;
+      }
+
+      const separatorIndex = trimmedLine.indexOf("=");
+
+      if (separatorIndex === -1) {
+        return env;
+      }
+
+      const key = trimmedLine.slice(0, separatorIndex).trim();
+
+      const value = trimmedLine.slice(separatorIndex + 1).trim();
+
+      env[key] = value.replace(/^["']|["']$/g, "");
+
+      return env;
+    }, {});
+};
+
+const loadAppEnv = (ctx) => {
+  const appEnv = process.env.APP_ENV || (ctx.dev ? "dev" : "prod");
+
+  const envFile = envFiles[appEnv];
+
+  if (!envFile) {
+    throw new Error(`APP_ENV invalido: "${appEnv}". Use dev, staging ou prod.`);
+  }
+
+  const fileEnv = parseEnvFile(resolve(process.cwd(), envFile));
+
+  return {
+    APP_ENV: appEnv,
+    API_URL: fileEnv.API_URL,
+    PASSWORD: fileEnv.PASSWORD,
+    WEBSOCKET_API: fileEnv.WEBSOCKET_API,
+    WEBSOCKET_PATH: fileEnv.WEBSOCKET_PATH,
+    WEBSOCKET_ROOM: fileEnv.WEBSOCKET_ROOM,
+    WEBSOCKET_API_KEY: fileEnv.WEBSOCKET_API_KEY,
+  };
+};
 
 export default defineConfig((ctx) => {
+  const appEnv = loadAppEnv(ctx);
+
   return {
     bin: {
       linuxAndroidStudio: "/snap/bin/android-studio",
@@ -57,17 +119,7 @@ export default defineConfig((ctx) => {
 
       // publicPath: '/',
       // analyze: true,
-      env: {
-        API_URL: ctx.dev ? "http://localhost:3000" : "http://localhost:3000",
-        PASSWORD: ctx.dev ? "S@ft2080." : "",
-        WEBSOCKET_API: ctx.dev
-          ? "http://localhost:4321/"
-          : "http://localhost:4321/",
-        WEBSOCKET_PATH: ctx.dev ? "/socket.io" : "/socket.io",
-        WEBSOCKET_ROOM: ctx.dev ? "LARAVEL" : "LARAVEL",
-        WEBSOCKET_API_KEY:
-          "7wArC/kl0nTbt4zBu0agw.NXLyjA96I6x1XmBcuokwPqfo3/CIxzqYw.PTthh5eqa08Uf4ubFlOqatpShoz1CRRID9pZReEFvBk3il6E9u",
-      },
+      env: appEnv,
       // rawDefine: {}
       // ignorePublicFolder: true,
       // minify: false,