Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
126 changes: 9 additions & 117 deletions packages/common/src/ENVIRONMENT_VARS.ts
Original file line number Diff line number Diff line change
@@ -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.
*
Expand Down Expand Up @@ -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;
Expand All @@ -38,129 +38,21 @@ 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',
DEBUG: false,
MOCK: false,
};

// Function to load environment variables from Vite
function loadFromVite(): Partial<Environment> {
const result: Partial<Environment> = {};

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;
44 changes: 44 additions & 0 deletions packages/platform-ui/vite-env-plugin.js
Original file line number Diff line number Diff line change
@@ -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',
},
],
};
},
};
}
3 changes: 2 additions & 1 deletion packages/platform-ui/vite.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -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({
Expand All @@ -21,6 +21,7 @@ export default defineConfig({
'process.version': JSON.stringify(process.version),
},
plugins: [
injectEnvPlugin(),
vue(),
VitePWA({
registerType: 'autoUpdate',
Expand Down
Loading