100 lines
5.0 KiB
JavaScript
100 lines
5.0 KiB
JavaScript
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-availability-and-access-status';
|
|
|
|
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 = `<!doctype html>
|
|
<html lang="es">
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<meta name="theme-color" content="#ffffff" />
|
|
<meta name="description" content="Hub interno de aplicaciones de GomezLee Marketing." />
|
|
<link rel="icon" type="image/png" sizes="512x512" href="https://dbit.digitalcompass.agency/storage/v1/object/public/public-assets/GLM.png?v=glm-hub-20260728-access" />
|
|
<link rel="shortcut icon" type="image/png" href="https://dbit.digitalcompass.agency/storage/v1/object/public/public-assets/GLM.png?v=glm-hub-20260728-access" />
|
|
<link rel="apple-touch-icon" href="https://dbit.digitalcompass.agency/storage/v1/object/public/public-assets/GLM.png?v=glm-hub-20260728-access" />
|
|
<title>GLM Hub — GomezLee Marketing</title>
|
|
<link rel="stylesheet" href="/assets/styles.css?v=${BUILD_VERSION}" />
|
|
<script type="importmap">
|
|
{
|
|
"imports": {
|
|
"react": "https://cdn.jsdelivr.net/npm/react@19.2.7/+esm",
|
|
"react/jsx-runtime": "https://cdn.jsdelivr.net/npm/react@19.2.7/jsx-runtime/+esm",
|
|
"react-dom/client": "https://cdn.jsdelivr.net/npm/react-dom@19.2.7/client/+esm",
|
|
"lucide-react": "https://cdn.jsdelivr.net/npm/lucide-react@0.575.0/+esm"
|
|
}
|
|
}
|
|
</script>
|
|
</head>
|
|
<body>
|
|
<div id="root"></div>
|
|
<script src="https://cdn.jsdelivr.net/npm/@supabase/supabase-js@2.110.8"></script>
|
|
<script type="module" src="/assets/main.js?v=${BUILD_VERSION}"></script>
|
|
</body>
|
|
</html>`;
|
|
fs.writeFileSync(path.join(distDir, 'index.html'), indexHtml);
|
|
console.log(`Static ESM build created at ${distDir}`);
|