import fs from 'node:fs'; import path from 'node:path'; import ts from '../node_modules/typescript/lib/typescript.js'; const root = path.resolve(new URL('..', import.meta.url).pathname); const srcDir = path.join(root, 'src'); const distDir = path.join(root, 'dist'); const assetsDir = path.join(distDir, 'assets'); const BUILD_VERSION = '20260814-access-request-disabled-cursor'; const env = { VITE_SUPABASE_URL: 'https://dbit.digitalcompass.agency', VITE_SUPABASE_ANON_KEY: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE', VITE_ICON_GENERATOR_WEBHOOK_URL: 'https://agenteit.digitalcompass.agency/webhook/glm-hub-generar-icono', VITE_ACCESS_REQUEST_WEBHOOK_URL: 'https://agenteit.digitalcompass.agency/webhook/glm-hub-solicitar-acceso', BASE_URL: '/', }; function replaceEnv(source) { return source .replaceAll('import.meta.env.VITE_SUPABASE_URL', JSON.stringify(env.VITE_SUPABASE_URL)) .replaceAll('import.meta.env.VITE_SUPABASE_ANON_KEY', JSON.stringify(env.VITE_SUPABASE_ANON_KEY)) .replaceAll('import.meta.env.VITE_ICON_GENERATOR_WEBHOOK_URL', JSON.stringify(env.VITE_ICON_GENERATOR_WEBHOOK_URL)) .replaceAll('import.meta.env.VITE_ACCESS_REQUEST_WEBHOOK_URL', JSON.stringify(env.VITE_ACCESS_REQUEST_WEBHOOK_URL)) .replaceAll('import.meta.env.BASE_URL', JSON.stringify(env.BASE_URL)); } function fixLocalImports(code) { return code .replace(/^import\s+["']\.\/styles\.css["'];?\s*$/gm, '') .replace(/(from\s+["'])(\.\.?\/[^"']+)(["'])/g, (_m, start, spec, end) => { if (/\.(?:js|mjs|cjs|json|css)$/.test(spec)) return `${start}${spec}${end}`; return `${start}${spec}.js?v=${BUILD_VERSION}${end}`; }); } fs.rmSync(distDir, { recursive: true, force: true }); fs.mkdirSync(assetsDir, { recursive: true }); const sourceFiles = ['main.tsx', 'App.tsx', 'data.ts', 'repository.ts', 'storage.ts', 'supabase.ts', 'types.ts']; for (const file of sourceFiles) { const sourcePath = path.join(srcDir, file); const source = replaceEnv(fs.readFileSync(sourcePath, 'utf8')); const result = ts.transpileModule(source, { fileName: file, compilerOptions: { target: ts.ScriptTarget.ES2022, module: ts.ModuleKind.ESNext, jsx: ts.JsxEmit.ReactJSX, importsNotUsedAsValues: ts.ImportsNotUsedAsValues.Remove, sourceMap: false, }, reportDiagnostics: true, }); const errors = (result.diagnostics ?? []).filter((diagnostic) => diagnostic.category === ts.DiagnosticCategory.Error); if (errors.length) { throw new Error(`${file}: ${errors.map((diagnostic) => ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n')).join('\n')}`); } const outputName = file.replace(/\.tsx?$/, '.js'); fs.writeFileSync(path.join(assetsDir, outputName), fixLocalImports(result.outputText)); } fs.copyFileSync(path.join(srcDir, 'styles.css'), path.join(assetsDir, 'styles.css')); for (const asset of ['glm-logo.png', 'glm-favicon.png', 'glm-tab-icon-16-20260722.png', 'glm-tab-icon-32-20260722.png', 'glm-tab-icon-64-20260722.png', 'glm-tab-icon-180-20260722.png', 'glm-tab-icon-20260722.ico']) { const source = path.join(root, 'public', asset); if (fs.existsSync(source)) fs.copyFileSync(source, path.join(distDir, asset)); } const indexHtml = `