diff --git a/packages/common/src/ENVIRONMENT_VARS.ts b/packages/common/src/ENVIRONMENT_VARS.ts index fb0f1d60e..09dd8919c 100644 --- a/packages/common/src/ENVIRONMENT_VARS.ts +++ b/packages/common/src/ENVIRONMENT_VARS.ts @@ -1,4 +1,5 @@ -interface Environment { +// packages/common/src/ENVIRONMENT_VARS.ts +export interface Environment { /** * URL to the remote couchDB instance that the app connects to. * @@ -29,7 +30,6 @@ interface Environment { type ProtocolString = 'http' | 'https'; -// Create a global reference to ensure singleton behavior declare global { interface Window { __SKUILDER_ENV__: Environment | undefined; @@ -38,7 +38,7 @@ declare global { // Default fallback values if all else fails const defaultEnv: Environment = { - COUCHDB_SERVER_URL: 'localhost:5984/', + COUCHDB_SERVER_URL: 'default:5984/', COUCHDB_SERVER_PROTOCOL: 'http', EXPRESS_SERVER_URL: 'localhost:3000/', EXPRESS_SERVER_PROTOCOL: 'http', @@ -46,121 +46,13 @@ const defaultEnv: Environment = { MOCK: false, }; -// Function to load environment variables from Vite -function loadFromVite(): Partial { - const result: Partial = {}; - - try { - // Use typeof check to avoid issues in non-Vite environments - if (typeof import.meta !== 'undefined' && 'env' in import.meta) { - const env = (import.meta as any).env; - - if (env.VITE_COUCHDB_SERVER) { - result.COUCHDB_SERVER_URL = env.VITE_COUCHDB_SERVER; - } - - if (env.VITE_COUCHDB_PROTOCOL) { - result.COUCHDB_SERVER_PROTOCOL = env.VITE_COUCHDB_PROTOCOL as ProtocolString; - } - - if (env.VITE_EXPRESS_SERVER) { - result.EXPRESS_SERVER_URL = env.VITE_EXPRESS_SERVER; - } - - if (env.VITE_EXPRESS_PROTOCOL) { - result.EXPRESS_SERVER_PROTOCOL = env.VITE_EXPRESS_PROTOCOL as ProtocolString; - } - - if (env.VITE_DEBUG !== undefined) { - result.DEBUG = env.VITE_DEBUG === 'true'; - } - - if (env.VITE_MOCK !== undefined) { - result.MOCK = env.VITE_MOCK === 'true'; - } - } - } catch (e) { - console.warn('Unable to load environment variables from Vite:', e); - } - - return result; -} - -// Function to validate if environment is properly loaded -function isValidEnv(env: Environment): boolean { - return Boolean(env.COUCHDB_SERVER_URL && env.EXPRESS_SERVER_URL); -} - -// Initialize ENV with a blocking retry mechanism if needed -let ENV: Environment; - -// First check if we have a global instance already -if ( - typeof window !== 'undefined' && - window.__SKUILDER_ENV__ && - isValidEnv(window.__SKUILDER_ENV__) -) { - console.log('Using existing ENV from global scope'); - ENV = window.__SKUILDER_ENV__; -} else { - // Try loading with a blocking retry if in browser environment - if (typeof window !== 'undefined') { - let viteEnv = loadFromVite(); - - // If initial load didn't succeed, do a blocking retry - if (!viteEnv.COUCHDB_SERVER_URL || !viteEnv.EXPRESS_SERVER_URL) { - console.warn('Initial ENV load incomplete, performing blocking retries...'); - - // Synchronous retries with exponential backoff - const maxRetries = 5; - let retryCount = 0; - let baseDelay = 20; // ms - - while ( - retryCount < maxRetries && - (!viteEnv.COUCHDB_SERVER_URL || !viteEnv.EXPRESS_SERVER_URL) - ) { - // Create a delay using a synchronous approach - const delay = baseDelay * Math.pow(2, retryCount); - const startTime = Date.now(); - while (Date.now() - startTime < delay) { - // Empty blocking loop - } - - retryCount++; - console.log(`Retry ${retryCount}/${maxRetries} for ENV initialization...`); - viteEnv = loadFromVite(); - } - - if (!viteEnv.COUCHDB_SERVER_URL || !viteEnv.EXPRESS_SERVER_URL) { - console.error('ENV initialization failed after retries, using defaults'); - // Use default values if all retries fail - ENV = { ...defaultEnv }; - } else { - console.log('ENV successfully initialized after retries'); - ENV = { ...defaultEnv, ...viteEnv }; - } - } else { - ENV = { ...defaultEnv, ...viteEnv }; - } - - // Store in global scope - window.__SKUILDER_ENV__ = ENV; - console.log('ENV initialized and stored in global scope'); - } else { - // Node.js environment (SSR or build) - const viteEnv = loadFromVite(); - ENV = { ...defaultEnv, ...viteEnv }; - } -} +// Get environment from global or default +const ENV: Environment = + typeof window !== 'undefined' && window.__SKUILDER_ENV__ + ? { ...defaultEnv, ...window.__SKUILDER_ENV__ } + : defaultEnv; // Log the initialized environment -console.log(`ENV init:`); -console.log(` COUCHDB_SERVER_URL: ${ENV.COUCHDB_SERVER_URL}`); -console.log(` COUCHDB_SERVER_PROTOCOL: ${ENV.COUCHDB_SERVER_PROTOCOL}`); -console.log(` EXPRESS_SERVER_URL: ${ENV.EXPRESS_SERVER_URL}`); -console.log(` EXPRESS_SERVER_PROTOCOL: ${ENV.EXPRESS_SERVER_PROTOCOL}`); -console.log(` DEBUG: ${ENV.DEBUG}`); -console.log(` MOCK: ${ENV.MOCK}`); +console.log('ENV initialized:', ENV); export default ENV; diff --git a/packages/platform-ui/vite-env-plugin.js b/packages/platform-ui/vite-env-plugin.js new file mode 100644 index 000000000..007aca078 --- /dev/null +++ b/packages/platform-ui/vite-env-plugin.js @@ -0,0 +1,44 @@ +// packages/platform-ui/vite-env-plugin.js +export default function injectEnvPlugin() { + // Store the config for use in transformIndexHtml + let configEnv = {}; + + return { + name: 'inject-env', + configResolved(config) { + // Store the resolved config for use in transformIndexHtml + configEnv = config.env; + console.log('Vite config ENV stored:', configEnv); + }, + transformIndexHtml(html) { + console.log('Transform HTML running with configEnv:', configEnv); + + // Extract relevant environment variables + const envVars = { + COUCHDB_SERVER_URL: configEnv.VITE_COUCHDB_SERVER || 'injected-server:5984/', + COUCHDB_SERVER_PROTOCOL: configEnv.VITE_COUCHDB_PROTOCOL || 'http', + EXPRESS_SERVER_URL: configEnv.VITE_EXPRESS_SERVER || 'injected-express:3000/', + EXPRESS_SERVER_PROTOCOL: configEnv.VITE_EXPRESS_PROTOCOL || 'http', + DEBUG: configEnv.VITE_DEBUG === 'true', + MOCK: configEnv.VITE_MOCK === 'true', + }; + + console.log('Injecting ENV vars:', envVars); + + // Create the script tag to inject at build time + return { + html, + tags: [ + { + tag: 'script', + attrs: { type: 'text/javascript' }, + children: `console.log("ENV injection running"); window.__SKUILDER_ENV__ = ${JSON.stringify( + envVars + )};`, + injectTo: 'head-prepend', + }, + ], + }; + }, + }; +} diff --git a/packages/platform-ui/vite.config.js b/packages/platform-ui/vite.config.js index 89e3edb2e..fb731c6fe 100644 --- a/packages/platform-ui/vite.config.js +++ b/packages/platform-ui/vite.config.js @@ -3,7 +3,7 @@ import vue from '@vitejs/plugin-vue'; import { VitePWA } from 'vite-plugin-pwa'; import eslint from 'vite-plugin-eslint'; import { fileURLToPath, URL } from 'node:url'; -import { resolve } from 'path'; +import injectEnvPlugin from './vite-env-plugin'; // https://vitejs.dev/config/ export default defineConfig({ @@ -21,6 +21,7 @@ export default defineConfig({ 'process.version': JSON.stringify(process.version), }, plugins: [ + injectEnvPlugin(), vue(), VitePWA({ registerType: 'autoUpdate',