@electrojs/cli 1.0.6 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +10 -10
- package/package.json +7 -7
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{builtinModules as e}from"node:module";import t from"cac";import{access as n,mkdir as r,readFile as i,readdir as a,rm as o,unlink as s,writeFile as c}from"node:fs/promises";import{basename as l,dirname as u,extname as d,join as f,relative as p,resolve as m}from"node:path";import{generate as h,scan as g}from"@electrojs/codegen";import{build as _,createLogger as v,createServer as y,loadConfigFromFile as ee,mergeConfig as b,normalizePath as x,version as te}from"vite";import{existsSync as S}from"node:fs";import{ResolverFactory as C}from"oxc-resolver";import{pathToFileURL as ne}from"node:url";import w from"magic-string";import{spawn as re}from"node:child_process";import{tmpdir as ie}from"node:os";import{setTimeout as T}from"node:timers/promises";var ae=`1.0.6`;const E=`\x1B[33m`,D=`\x1B[32m`,O=`\x1B[36m`,oe=`\x1B[31m`,k=`\x1B[90m`,se=`\x1B[1m`,A=`\x1B[0m`,j={info:0,warn:1,error:2,silent:3};let M=`info`;function ce(e){M=e}function le(e){j[M]>j.info||console.log(` ${k}▸${A} ${e}`)}function ue(e){j[M]>j.warn||console.log(` ${E}⚠ ${e}${A}`)}function N(e){j[M]>j.error||console.error(` ${oe}✗ ${e}${A}`)}function P(e){j[M]>j.info||console.log(` ${k}${e}${A}`)}function F(){let e=Date.now();return()=>de(Date.now()-e)}function de(e){if(e<1e3)return`${e}ms`;let t=e/1e3;return t<60?`${t.toFixed(1)}s`:`${Math.floor(t/60)}m${Math.round(t%60).toString().padStart(2,`0`)}s`}function I(e,t,n){if(j[M]>j.info)return;let r=Math.max(2,26-e.length-1),i=`·`.repeat(r),a=t.padStart(5),o=n?` ${k}${n}${A}`:``;console.log(` ${e} ${k}${i}${A} ${D}✓${A} ${D}${a}${A}${o}`)}function L(e,t){let n=Math.max(2,26-e.length-1),r=`·`.repeat(n);console.error(` ${e} ${k}${r}${A} ${oe}✗ ${t}${A}`)}function fe(e){return e.startsWith(`hmr update`)?`${D}${e}${A}`:e.startsWith(`page reload`)?`${E}page reload${A}${e.slice(11)}`:e.startsWith(`rebuild`)?`${O}rebuild${A}${e.slice(7)}`:e.startsWith(`generated`)?`[35mgenerated${A}`:e.startsWith(`crashed`)?`${oe}${e}${A}`:e.startsWith(`exited`)?`${k}exited${A}`:e}function pe(e){return`${String(e.getHours()).padStart(2,`0`)}:${String(e.getMinutes()).padStart(2,`0`)}:${String(e.getSeconds()).padStart(2,`0`)}`}function me(){process.stdout.isTTY&&(process.stdout.clearLine(0),process.stdout.cursorTo(0))}function R(e,t,n){if(j[M]>j.info)return;me();let r=pe(new Date),i=n?` ${k}${n}${A}`:``;console.log(`${k}${r}${A} ${E}[electro]${A} ${k}(${e})${A} ${fe(t)}${i}`)}function z(e,t){if(!(j[M]>j.info)){if(console.log(`\n ${se}${D}✓ ${e}${A}`),typeof t==`string`)console.log(` ${E}→ ${t}${A}`);else for(let e of t??[])console.log(` ${E}${e.label}${A} ${k}→${A} ${e.url}`);console.log(``)}}function B(e,t){return p(e,t)||`.`}function he(e){if(j[M]>j.info)return;let t=e.mode===`build`,n=l(e.root),r=B(e.root,e.runtime),i=e.preload?B(e.root,e.preload):`${k}(none)${A}`,a=e.views??[],o=a.length===0?`${k}(none)${A}`:a.length===1?B(e.root,a[0].entry):`${a.length} configured`;console.log(`\n${se}${E}⚡ electro ${t?`build`:`dev`}${A} → ${O}${n}${A}\n`);let s=t?`build`:`watch`,c=t?`build`:`watch`,u=t?`build`:`dev server`,d=[{scope:`${O}runtime${A}`,entry:r,mode:`${k}${s}${A}`},{scope:`${E}preload${A}`,entry:i,mode:`${k}${c}${A}`},{scope:`${D}${a.length>1?`views`:`view`}${A}`,entry:o,mode:`${k}${u}${A}`}],f=Math.max(5,...d.map(e=>ve(e.scope)))+2,p=Math.max(5,...d.map(e=>ve(e.entry)))+2;console.log(` ${k}${H(`Scope`,f)}${H(`Entry`,p)}Mode${A}`);for(let e of d)console.log(` ${H(e.scope,f)}${H(e.entry,p)}${e.mode}`);if(e.views&&e.views.length>0){console.log(``),console.log(` ${k}Views${A} ${e.views.length} configured`);let t=Math.max(2,...e.views.map(e=>e.id.length))+2;for(let n of e.views){let r=B(e.root,n.entry);console.log(` ${H(n.id,t)}${k}${r}${A}`)}}console.log(``)}const ge=new RegExp(String.raw`\x1b\[[0-9;]*m`,`g`),_e=new RegExp(String.raw`(?:\x1b\[[0-9;]*m)*\[(vite(?:-plugin-[^\]]+)?)\](?:\x1b\[[0-9;]*m)*`,`g`);function V(e){return e.replace(_e,`[${se}${E}electro${A}]`)}function ve(e){return e.replace(ge,``).length}function H(e,t){let n=ve(e);return e+` `.repeat(Math.max(0,t-n))}function ye(e,t){let n=e.info.bind(e);e.info=(e,r)=>{if(typeof e!=`string`)return n(e,r);let i=e.replace(ge,``).trim();if(!(!i||i.includes(`ready in`)||i.includes(`➜`))){if(i.includes(`hmr update`)){let e=be(i,`hmr update`);R(t,`hmr update${e?` ${e}`:``}`);return}if(i.includes(`hmr invalidate`)){let e=be(i,`hmr invalidate`);R(t,`hmr invalidate${e?` ${e}`:``}`);return}if(i.includes(`page reload`)){let e=be(i,`page reload`);R(t,`page reload${e?` ${e}`:``}`);return}n(V(e),r)}};let r=e.warn.bind(e);e.warn=(e,t)=>{if(typeof e!=`string`)return r(e,t);r(V(e),t)};let i=e.error.bind(e);e.error=(e,t)=>{if(typeof e!=`string`)return i(e,t);i(V(e),t)}}function be(e,t){return e.match(RegExp(`\\b${t}\\b\\s+(.+)$`))?.[1]?.trim()??null}function xe(e){j[M]>j.info||console.log(`\n ${e===`main`?O:e===`preload`?E:D}${e}${A}`)}function Se(){let e=v(M,{allowClearScreen:!1}),t=e.info.bind(e);e.info=(e,n)=>{if(typeof e!=`string`)return t(e,n);let r=e.replace(ge,``).trim();/^vite v[\d.]+/.test(r)&&r.includes(`building`)||r&&t(V(e),n)};let n=e.warn.bind(e);e.warn=(e,t)=>{if(typeof e!=`string`)return n(e,t);n(V(e),t)};let r=e.error.bind(e);return e.error=(e,t)=>{if(typeof e!=`string`)return r(e,t);r(V(e),t)},e}function Ce(e,t){if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`View config "${t}" must export a defineViewConfig(...) object as default.`);let{id:n,viewId:r,preload:i,__source:a,entry:o}=e,s=typeof r==`string`?r:n;if(typeof s!=`string`||s.trim().length===0)throw Error(`View config "${t}" must define a non-empty string viewId.`);if(a!==void 0&&typeof a!=`string`)throw Error(`View config "${t}" exported an invalid "__source" value.`);if(o!==void 0&&typeof o!=`string`)throw Error(`View config "${t}" exported an invalid "entry" value.`);if(i!==void 0&&typeof i!=`string`)throw Error(`View config "${t}" exported an invalid "preload" value.`)}function we(e,t){let n=e.vite;if(typeof n==`object`&&n&&!Array.isArray(n))return n;let r=Object.entries(e).filter(([e])=>!t.includes(e));if(r.length!==0)return Object.fromEntries(r)}function Te(e,t){let n=(typeof e.viewId==`string`?e.viewId:e.id)?.trim();if(!n)throw Error(`View config "${t}" must define a non-empty string viewId.`);return{id:n,__source:t,entry:e.entry,preload:e.preload,userConfig:we(e,[`id`,`viewId`,`entry`,`preload`,`__source`,`vite`])}}function U(e){return u(e.__source)}function Ee(e){return e.entry??`./index.html`}function De(e){return e.map(e=>{let t=Ee(e),n=U(e);return{...e,root:n,entry:t}})}function Oe(e){return m(e.root,e.entry)}function ke(e,t){return m(e,`generated`,`preload`,`${t.id}.gen.ts`)}const Ae=[`linked`,`inline`,`external`,`none`];function je(e){let t=m(u(e.runtime.__source),e.runtime.entry);S(t)||(N(`Main entry not found: ${t}`),process.exit(1))}function W(e){let t=new Set;for(let n of e)t.has(n.id)&&(N(`Duplicate view id "${n.id}". View ids must be unique.`),process.exit(1)),t.add(n.id);for(let t of e){S(t.__source)||(N(`View "${t.id}" config source not found: ${t.__source}`),process.exit(1));let e=m(U(t),Ee(t));S(e)||(N(`View "${t.id}" entry not found: ${e}`),process.exit(1))}}function Me(e){Ae.includes(e)||ue(`Unknown --sourcemap value "${e}". Valid values: ${Ae.join(`, `)}. Defaulting to "linked".`)}function Ne(e,t){let n=e.build?.target;if(n){let e=Array.isArray(n)?n:[n];for(let n of e)if(typeof n==`string`&&n!==`esnext`)throw Error(`[electro] ${t}: invalid target "${n}". ElectroJS requires target: "esnext" (Electron 40+). Remove the target override from your config.`)}let r=e.build?.rolldownOptions;if(r&&typeof r==`object`&&!Array.isArray(r)){let e=r.output;if(e&&typeof e==`object`&&!Array.isArray(e)){let n=e.format;if(n!==void 0&&n!==`es`&&n!==`cjs`)throw Error(`[electro] ${t}: invalid output format ${JSON.stringify(n)}. ElectroJS supports "es" and "cjs" for Node scopes. Update build.rolldownOptions.output.format in your config.`)}}if(e.ssr===!1||e.build?.ssr===!1)throw Error(`[electro] ${t}: SSR cannot be disabled in Node scopes. SSR mode is required for correct Node.js module resolution.`)}function Pe(e,t){let n=e.build;n&&(n.target!==`esnext`&&(n.target=`esnext`),n.ssr||=!0)}function Fe(e){let t=e.split(`.`,1)[0],n=Number.parseInt(t??``,10);(!Number.isFinite(n)||n<8)&&(N(`Unsupported Vite version: ${e}. @electrojs/runtime requires Vite 8+.`),process.exit(1))}const Ie=new Set([`.git`,`.hg`,`.svn`,`.electro`,`coverage`,`dist`,`node_modules`,`out`]),Le=[`.ts`,`.mts`,`.cts`,`.js`,`.mjs`,`.cjs`,`.json`];function Re(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ze(e,t){return[...new Set([e,...t??[]])]}async function Be(e,t){let n=await ee({command:`build`,mode:`production`},e),r=n?.config;if(!r)throw Error(`${t} "${e}" must have a default export`);return{value:r,dependencies:ze(e,n?.dependencies)}}async function Ve(e,t){let n=[];async function r(e){let i=await a(e,{withFileTypes:!0});for(let a of i){if(a.isDirectory()){if(Ie.has(a.name))continue;await r(f(e,a.name));continue}a.isFile()&&a.name===t&&n.push(f(e,a.name))}}return await r(e),n.sort(),n}async function He(e){let t=e;for(;;){if(S(f(t,`pnpm-workspace.yaml`)))return t;let e=f(t,`package.json`);if(S(e))try{let n=JSON.parse(await i(e,`utf-8`));if(Array.isArray(n.workspaces)||Re(n.workspaces)&&Array.isArray(n.workspaces.packages))return t}catch{}let n=u(t);if(n===t)return null;t=n}}async function Ue(e){let t=await He(e);if(!t)return{root:null,packages:new Map};let n=new Map,r=await Ve(t,`package.json`);for(let e of r)try{let t=JSON.parse(await i(e,`utf-8`));if(typeof t.name!=`string`||t.name.trim().length===0)continue;let r=u(e),a=n.get(t.name);if(a&&a!==r)throw Error(`Found duplicate workspace package name "${t.name}" in:\n${a}\n${r}`);n.set(t.name,r)}catch(e){if(e instanceof Error&&e.message.startsWith(`Found duplicate workspace package name "`))throw e}return{root:t,packages:n}}function We(e){return new C({alias:e.size>0?Object.fromEntries([...e.entries()].map(([e,t])=>[e,[t]])):void 0,conditionNames:[`node`,`import`],extensions:Le,mainFields:[`module`,`main`],tsconfig:`auto`})}function Ge(e){return e.startsWith(`.`)||e.startsWith(`/`)||/^[A-Za-z]:[\\/]/.test(e)}function Ke(e,t){let n=e.trim().replace(/[/\\]+$/,``);return n.endsWith(`/${t}`)||n.endsWith(`\\${t}`)||n===t?n:`${n}/${t}`}function qe(e,t,n,r){try{let i=t.resolveFileSync(e,Ke(n,r));if(typeof i.path==`string`&&S(i.path))return i.path}catch{}return null}function Je(e,t,n){let r=e.get(t);if(!r)return null;let i=m(r,n);return S(i)?i:null}function Ye(e,t,n){if(!Ge(t))return null;let r=m(e,Ke(t,n));return S(r)?r:null}function Xe(e,t,n,r,i,a){let o=qe(t,n,i,a);if(o)return o;let s=Je(r.packages,i,a);if(s)return s;let c=Ye(e,i,a);if(c)return c;throw r.root&&!Ge(i)?r.packages.has(i)?Error(`Workspace package "${i}" does not contain "${a}".`):Error(`Workspace package "${i}" could not be resolved from "${r.root}".`):Error(`Could not resolve "${i}" to "${a}" from "${t}".`)}function Ze(e,t){if(typeof e.entry!=`string`||e.entry.trim().length===0)throw Error(`Runtime config "${t}" must define a non-empty string entry.`);return{entry:e.entry,__source:t,userConfig:we(e,[`entry`,`__source`,`vite`])}}function Qe(e){return Re(e)&&typeof e.entry==`string`}function $e(e,t,n){return t?.scanDir&&t.scanDir.trim().length>0?m(e,t.scanDir):u(n)}function et(e){if(!Array.isArray(e)||e.some(e=>typeof e!=`string`||e.trim().length===0))throw Error(`electro.config.ts "views" must be an array of non-empty package specifiers.`);return e}async function tt(e,t,n,r,i){let a=et(n.views).map(n=>Xe(e,t,r,i,n,`view.config.ts`)),o=[],s=new Set;for(let e of a){let t=await Be(e,`View config`);Ce(t.value,e),o.push(Te(t.value,e));for(let e of t.dependencies)s.add(e)}return{views:o,watchFiles:[...s].sort()}}async function G(e){let t=m(process.cwd(),e),n=u(t);if(!S(t))throw Error(`Config file not found: ${t}`);let r=await Be(t,`ElectroJS config`);if(!Re(r.value))throw Error(`${e} must export an object from defineElectroConfig(...)`);let i=r.value,a=await Ue(n),o=We(a.packages),s,c=new Set(r.dependencies);if(Qe(i.runtime))s=Ze(i.runtime,t);else{if(typeof i.runtime!=`string`||i.runtime.trim().length===0)throw Error(`electro.config.ts "runtime" must be a non-empty package specifier.`);let e=Xe(n,t,o,a,i.runtime,`runtime.config.ts`),r=await Be(e,`Runtime config`);s=Ze(r.value,e);for(let e of r.dependencies)c.add(e)}let l=await tt(n,t,i,o,a);for(let e of l.watchFiles)c.add(e);let d={codegen:i.codegen,runtime:s};return je(d),{config:d,views:l.views,scanDir:$e(n,d.codegen,s.__source),watchFiles:[...c].sort(),configPath:t,root:n}}async function nt(t){let n=m(t,`package.json`),r=JSON.parse(await i(n,`utf-8`)),a=new Set([`electron`,...Object.keys(r.dependencies??{}),...Object.keys(r.optionalDependencies??{})]),o=new Set([...a,...Object.keys(r.devDependencies??{})]);a.delete(`@electrojs/runtime`),o.delete(`@electrojs/runtime`);let s=e.flatMap(e=>[e,`node:${e}`]),c=[...a],l=[...o],u=(await Promise.all(l.map(async e=>({dep:e,isCommonJs:await it(t,e)})))).filter(e=>e.isCommonJs).map(e=>e.dep),d=c.length>0?RegExp(`^(${c.map(rt).join(`|`)})/.+`):null;return{externals:d?[...c,...s,d]:[...c,...s],cjsInteropDeps:u}}function rt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}async function it(e,t){if(t===`electron`||t.startsWith(`node:`))return!1;let n=m(e,`node_modules`,t,`package.json`);try{return!at(JSON.parse(await i(n,`utf-8`)))}catch{return!1}}function at(e){return!!(e.type===`module`||typeof e.module==`string`||typeof e.main==`string`&&e.main.endsWith(`.mjs`)||typeof e.exports==`string`&&e.exports.endsWith(`.mjs`)||ot(e.exports))}function ot(e){if(!e||typeof e!=`object`)return!1;if(Array.isArray(e))return e.some(ot);let t=e;if(`import`in t)return!0;for(let e of Object.values(t))if(ot(e))return!0;return!1}async function st(e){let t=m(e,`package.json`);try{let e=await i(t,`utf-8`);return JSON.parse(e).type===`module`?`es`:`cjs`}catch{return`cjs`}}const ct=[`index.mjs`,`index.cjs`,`index.js`];async function lt(e){for(let t of ct){let n=m(e,t);if(await ut(n))return n}throw Error(`Main entry not found in ${e}. Expected one of: ${ct.join(`, `)}`)}async function ut(e){try{return await n(e),!0}catch{return!1}}function dt(e,t,n){return n.map(n=>({id:n.id,preload:m(e,`preload`,`${n.id}.cjs`),source:t.get(n.id)??`about:blank`}))}function ft(e,t){return t.map(t=>({id:t.id,preload:m(e,`preload`,`${t.id}.cjs`),source:ne(m(e,`renderer`,t.id,`index.html`)).href}))}const pt=/(?<=\s|^|;)import\s*([\s"']*(?<imports>[\p{L}\p{M}\w\t\n\r $*,/{}@.]+)from\s*)?["']\s*(?<specifier>(?<="\s*)[^"]*[^\s"](?=\s*")|(?<='\s*)[^']*[^\s'](?=\s*'))\s*["'][\s;]*/gmu,mt=/^[A-Za-z_$][\w$]*$/;function ht(e){if(e.length===0)return{name:`electro:cjs-external-interop`,apply:`build`};let t=new Set(e);return{name:`electro:cjs-external-interop`,apply:`build`,enforce:`post`,renderChunk(e,n,{format:r,sourcemap:i}){if(r!==`es`)return null;let a=null,o=0;for(let n of e.matchAll(pt)){let r=n[0],i=n.index??0,s=n.groups?.specifier?.trim(),c=n.groups?.imports?.trim();if(!s||!c||!gt(s,t))continue;let l=_t(c);if(!l)continue;let u=`__cjs_ext_${o++}__`,d=[`import * as ${u} from ${JSON.stringify(s)};`];l.defaultImport&&d.push(`const ${l.defaultImport} = ${u}.default ?? ${u};`),l.namespaceImport&&d.push(`const ${l.namespaceImport} = ${u}.default ?? ${u};`);for(let{imported:e,local:t}of l.named)d.push(`const ${t} = ${u}.${e} ?? ${u}.default?.${e};`);a??=new w(e),a.overwrite(i,i+r.length,d.join(`
|
|
3
|
-
`))}return a?{code:a.toString(),map:i?a.generateMap({hires:`boundary`}):null}:null}}}function
|
|
2
|
+
import{builtinModules as e}from"node:module";import t from"cac";import{access as n,mkdir as r,readFile as i,readdir as a,rm as o,unlink as s,writeFile as c}from"node:fs/promises";import{basename as l,dirname as u,extname as d,join as f,relative as p,resolve as m}from"node:path";import{generate as h,scan as g}from"@electrojs/codegen";import{build as _,createLogger as v,createServer as y,loadConfigFromFile as ee,mergeConfig as b,normalizePath as x,version as te}from"vite";import{existsSync as S}from"node:fs";import{ResolverFactory as C}from"oxc-resolver";import{pathToFileURL as ne}from"node:url";import w from"magic-string";import{spawn as re}from"node:child_process";import{tmpdir as ie}from"node:os";import{setTimeout as T}from"node:timers/promises";var ae=`1.0.8`;const E=`\x1B[33m`,D=`\x1B[32m`,O=`\x1B[36m`,oe=`\x1B[31m`,k=`\x1B[90m`,se=`\x1B[1m`,A=`\x1B[0m`,j={info:0,warn:1,error:2,silent:3};let M=`info`;const ce=[];function le(e){M=e}function ue(e){j[M]>j.info||console.log(` ${k}▸${A} ${e}`)}function de(e){j[M]>j.warn||console.log(` ${E}⚠ ${e}${A}`)}function N(e){j[M]>j.error||console.error(` ${oe}✗ ${e}${A}`)}function P(e){j[M]>j.info||console.log(` ${k}${e}${A}`)}function F(){let e=Date.now();return()=>fe(Date.now()-e)}function fe(e){if(e<1e3)return`${e}ms`;let t=e/1e3;return t<60?`${t.toFixed(1)}s`:`${Math.floor(t/60)}m${Math.round(t%60).toString().padStart(2,`0`)}s`}function I(e,t,n){if(j[M]>j.info)return;let r=Math.max(2,26-e.length-1),i=`·`.repeat(r),a=t.padStart(5),o=n?` ${k}${n}${A}`:``;console.log(` ${e} ${k}${i}${A} ${D}✓${A} ${D}${a}${A}${o}`)}function L(e,t){let n=Math.max(2,26-e.length-1),r=`·`.repeat(n);console.error(` ${e} ${k}${r}${A} ${oe}✗ ${t}${A}`)}function pe(e){return e.startsWith(`hmr update`)?`${D}${e}${A}`:e.startsWith(`page reload`)?`${E}page reload${A}${e.slice(11)}`:e.startsWith(`rebuild`)?`${O}rebuild${A}${e.slice(7)}`:e.startsWith(`generated`)?`[35mgenerated${A}`:e.startsWith(`crashed`)?`${oe}${e}${A}`:e.startsWith(`exited`)?`${k}exited${A}`:e}function me(e){return`${String(e.getHours()).padStart(2,`0`)}:${String(e.getMinutes()).padStart(2,`0`)}:${String(e.getSeconds()).padStart(2,`0`)}`}function he(){process.stdout.isTTY&&(process.stdout.clearLine(0),process.stdout.cursorTo(0))}function R(e,t,n){if(j[M]>j.info)return;he();let r=me(new Date),i=n?` ${k}${n}${A}`:``;console.log(`${k}${r}${A} ${E}[electro]${A} ${k}(${e})${A} ${pe(t)}${i}`)}function ge(e,t,n){ce.push(()=>R(e,t,n))}function _e(){for(;ce.length>0;)ce.shift()?.()}function z(e,t){if(!(j[M]>j.info)){if(console.log(`\n ${se}${D}✓ ${e}${A}`),typeof t==`string`)console.log(` ${E}→ ${t}${A}`);else for(let e of t??[])console.log(` ${E}${e.label}${A} ${k}→${A} ${e.url}`);console.log(``)}}function B(e,t){return p(e,t)||`.`}function ve(e){if(j[M]>j.info)return;let t=e.mode===`build`,n=l(e.root),r=B(e.root,e.runtime),i=e.preload?B(e.root,e.preload):`${k}(none)${A}`,a=e.views??[],o=a.length===0?`${k}(none)${A}`:a.length===1?B(e.root,a[0].entry):`${a.length} configured`;console.log(`\n${se}${E}⚡ electro ${t?`build`:`dev`}${A} → ${O}${n}${A}\n`);let s=t?`build`:`watch`,c=t?`build`:`watch`,u=t?`build`:`dev server`,d=[{scope:`${O}runtime${A}`,entry:r,mode:`${k}${s}${A}`},{scope:`${E}preload${A}`,entry:i,mode:`${k}${c}${A}`},{scope:`${D}${a.length>1?`views`:`view`}${A}`,entry:o,mode:`${k}${u}${A}`}],f=Math.max(5,...d.map(e=>xe(e.scope)))+2,p=Math.max(5,...d.map(e=>xe(e.entry)))+2;console.log(` ${k}${H(`Scope`,f)}${H(`Entry`,p)}Mode${A}`);for(let e of d)console.log(` ${H(e.scope,f)}${H(e.entry,p)}${e.mode}`);if(e.views&&e.views.length>0){console.log(``),console.log(` ${k}Views${A} ${e.views.length} configured`);let t=Math.max(2,...e.views.map(e=>e.id.length))+2;for(let n of e.views){let r=B(e.root,n.entry);console.log(` ${H(n.id,t)}${k}${r}${A}`)}}console.log(``)}const ye=new RegExp(String.raw`\x1b\[[0-9;]*m`,`g`),be=new RegExp(String.raw`(?:\x1b\[[0-9;]*m)*\[(vite(?:-plugin-[^\]]+)?)\](?:\x1b\[[0-9;]*m)*`,`g`);function V(e){return e.replace(be,`[${se}${E}electro${A}]`)}function xe(e){return e.replace(ye,``).length}function H(e,t){let n=xe(e);return e+` `.repeat(Math.max(0,t-n))}function Se(e,t){let n=e.info.bind(e);e.info=(e,r)=>{if(typeof e!=`string`)return n(e,r);let i=e.replace(ye,``).trim();if(!(!i||i.includes(`ready in`)||i.includes(`➜`))){if(i.includes(`hmr update`)){let e=Ce(i,`hmr update`);R(t,`hmr update${e?` ${e}`:``}`);return}if(i.includes(`hmr invalidate`)){let e=Ce(i,`hmr invalidate`);R(t,`hmr invalidate${e?` ${e}`:``}`);return}if(i.includes(`page reload`)){let e=Ce(i,`page reload`);R(t,`page reload${e?` ${e}`:``}`);return}if(i.includes(`Re-optimizing dependencies because`)){let e=we(i,`Re-optimizing dependencies because`);ge(t,`deps re-optimize${e?` (${e})`:``}`);return}n(V(e),r)}};let r=e.warn.bind(e);e.warn=(e,t)=>{if(typeof e!=`string`)return r(e,t);r(V(e),t)};let i=e.error.bind(e);e.error=(e,t)=>{if(typeof e!=`string`)return i(e,t);i(V(e),t)}}function Ce(e,t){return e.match(RegExp(`\\b${t}\\b\\s+(.+)$`))?.[1]?.trim()??null}function we(e,t){let n=e.indexOf(t);if(n===-1)return null;let r=e.slice(n+t.length).trim();return r.length>0?r:null}function Te(e){let t=v(M,{allowClearScreen:!1});return Se(t,e),t}function Ee(e){j[M]>j.info||console.log(`\n ${e===`main`?O:e===`preload`?E:D}${e}${A}`)}function De(){let e=v(M,{allowClearScreen:!1}),t=e.info.bind(e);e.info=(e,n)=>{if(typeof e!=`string`)return t(e,n);let r=e.replace(ye,``).trim();/^vite v[\d.]+/.test(r)&&r.includes(`building`)||r&&t(V(e),n)};let n=e.warn.bind(e);e.warn=(e,t)=>{if(typeof e!=`string`)return n(e,t);n(V(e),t)};let r=e.error.bind(e);return e.error=(e,t)=>{if(typeof e!=`string`)return r(e,t);r(V(e),t)},e}function Oe(e,t){if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`View config "${t}" must export a defineViewConfig(...) object as default.`);let{id:n,viewId:r,preload:i,__source:a,entry:o}=e,s=typeof r==`string`?r:n;if(typeof s!=`string`||s.trim().length===0)throw Error(`View config "${t}" must define a non-empty string viewId.`);if(a!==void 0&&typeof a!=`string`)throw Error(`View config "${t}" exported an invalid "__source" value.`);if(o!==void 0&&typeof o!=`string`)throw Error(`View config "${t}" exported an invalid "entry" value.`);if(i!==void 0&&typeof i!=`string`)throw Error(`View config "${t}" exported an invalid "preload" value.`)}function ke(e,t){let n=e.vite;if(typeof n==`object`&&n&&!Array.isArray(n))return n;let r=Object.entries(e).filter(([e])=>!t.includes(e));if(r.length!==0)return Object.fromEntries(r)}function Ae(e,t){let n=(typeof e.viewId==`string`?e.viewId:e.id)?.trim();if(!n)throw Error(`View config "${t}" must define a non-empty string viewId.`);return{id:n,__source:t,entry:e.entry,preload:e.preload,userConfig:ke(e,[`id`,`viewId`,`entry`,`preload`,`__source`,`vite`])}}function U(e){return u(e.__source)}function je(e){return e.entry??`./index.html`}function Me(e){return e.map(e=>{let t=je(e),n=U(e);return{...e,root:n,entry:t}})}function Ne(e){return m(e.root,e.entry)}function Pe(e,t){return m(e,`generated`,`preload`,`${t.id}.gen.ts`)}const Fe=[`linked`,`inline`,`external`,`none`];function Ie(e){let t=m(u(e.runtime.__source),e.runtime.entry);S(t)||(N(`Main entry not found: ${t}`),process.exit(1))}function W(e){let t=new Set;for(let n of e)t.has(n.id)&&(N(`Duplicate view id "${n.id}". View ids must be unique.`),process.exit(1)),t.add(n.id);for(let t of e){S(t.__source)||(N(`View "${t.id}" config source not found: ${t.__source}`),process.exit(1));let e=m(U(t),je(t));S(e)||(N(`View "${t.id}" entry not found: ${e}`),process.exit(1))}}function Le(e){Fe.includes(e)||de(`Unknown --sourcemap value "${e}". Valid values: ${Fe.join(`, `)}. Defaulting to "linked".`)}function Re(e,t){let n=e.build?.target;if(n){let e=Array.isArray(n)?n:[n];for(let n of e)if(typeof n==`string`&&n!==`esnext`)throw Error(`[electro] ${t}: invalid target "${n}". ElectroJS requires target: "esnext" (Electron 40+). Remove the target override from your config.`)}let r=e.build?.rolldownOptions;if(r&&typeof r==`object`&&!Array.isArray(r)){let e=r.output;if(e&&typeof e==`object`&&!Array.isArray(e)){let n=e.format;if(n!==void 0&&n!==`es`&&n!==`cjs`)throw Error(`[electro] ${t}: invalid output format ${JSON.stringify(n)}. ElectroJS supports "es" and "cjs" for Node scopes. Update build.rolldownOptions.output.format in your config.`)}}if(e.ssr===!1||e.build?.ssr===!1)throw Error(`[electro] ${t}: SSR cannot be disabled in Node scopes. SSR mode is required for correct Node.js module resolution.`)}function ze(e,t){let n=e.build;n&&(n.target!==`esnext`&&(n.target=`esnext`),n.ssr||=!0)}function Be(e){let t=e.split(`.`,1)[0],n=Number.parseInt(t??``,10);(!Number.isFinite(n)||n<8)&&(N(`Unsupported Vite version: ${e}. @electrojs/runtime requires Vite 8+.`),process.exit(1))}const Ve=new Set([`.git`,`.hg`,`.svn`,`.electro`,`coverage`,`dist`,`node_modules`,`out`]),He=[`.ts`,`.mts`,`.cts`,`.js`,`.mjs`,`.cjs`,`.json`],Ue={command:`build`,mode:`production`,isSsrBuild:!1,isPreview:!1};function We(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Ge(e,t){return[...new Set([e,...t??[]])]}async function Ke(e,t,n){let r=await ee(n,e),i=r?.config;if(!i)throw Error(`${t} "${e}" must have a default export`);return{value:i,dependencies:Ge(e,r?.dependencies)}}async function qe(e,t){let n=[];async function r(e){let i=await a(e,{withFileTypes:!0});for(let a of i){if(a.isDirectory()){if(Ve.has(a.name))continue;await r(f(e,a.name));continue}a.isFile()&&a.name===t&&n.push(f(e,a.name))}}return await r(e),n.sort(),n}async function Je(e){let t=e;for(;;){if(S(f(t,`pnpm-workspace.yaml`)))return t;let e=f(t,`package.json`);if(S(e))try{let n=JSON.parse(await i(e,`utf-8`));if(Array.isArray(n.workspaces)||We(n.workspaces)&&Array.isArray(n.workspaces.packages))return t}catch{}let n=u(t);if(n===t)return null;t=n}}async function Ye(e){let t=await Je(e);if(!t)return{root:null,packages:new Map};let n=new Map,r=await qe(t,`package.json`);for(let e of r)try{let t=JSON.parse(await i(e,`utf-8`));if(typeof t.name!=`string`||t.name.trim().length===0)continue;let r=u(e),a=n.get(t.name);if(a&&a!==r)throw Error(`Found duplicate workspace package name "${t.name}" in:\n${a}\n${r}`);n.set(t.name,r)}catch(e){if(e instanceof Error&&e.message.startsWith(`Found duplicate workspace package name "`))throw e}return{root:t,packages:n}}function Xe(e){return new C({alias:e.size>0?Object.fromEntries([...e.entries()].map(([e,t])=>[e,[t]])):void 0,conditionNames:[`node`,`import`],extensions:He,mainFields:[`module`,`main`],tsconfig:`auto`})}function Ze(e){return e.startsWith(`.`)||e.startsWith(`/`)||/^[A-Za-z]:[\\/]/.test(e)}function Qe(e,t){let n=e.trim().replace(/[/\\]+$/,``);return n.endsWith(`/${t}`)||n.endsWith(`\\${t}`)||n===t?n:`${n}/${t}`}function $e(e,t,n,r){try{let i=t.resolveFileSync(e,Qe(n,r));if(typeof i.path==`string`&&S(i.path))return i.path}catch{}return null}function et(e,t,n){let r=e.get(t);if(!r)return null;let i=m(r,n);return S(i)?i:null}function tt(e,t,n){if(!Ze(t))return null;let r=m(e,Qe(t,n));return S(r)?r:null}function nt(e,t,n,r,i,a){let o=$e(t,n,i,a);if(o)return o;let s=et(r.packages,i,a);if(s)return s;let c=tt(e,i,a);if(c)return c;throw r.root&&!Ze(i)?r.packages.has(i)?Error(`Workspace package "${i}" does not contain "${a}".`):Error(`Workspace package "${i}" could not be resolved from "${r.root}".`):Error(`Could not resolve "${i}" to "${a}" from "${t}".`)}function rt(e,t){if(typeof e.entry!=`string`||e.entry.trim().length===0)throw Error(`Runtime config "${t}" must define a non-empty string entry.`);return{entry:e.entry,__source:t,userConfig:ke(e,[`entry`,`__source`,`vite`])}}function it(e){return We(e)&&typeof e.entry==`string`}function at(e,t,n){return t?.scanDir&&t.scanDir.trim().length>0?m(e,t.scanDir):u(n)}function ot(e){if(!Array.isArray(e)||e.some(e=>typeof e!=`string`||e.trim().length===0))throw Error(`electro.config.ts "views" must be an array of non-empty package specifiers.`);return e}async function st(e,t,n,r,i,a){let o=ot(n.views).map(n=>nt(e,t,r,i,n,`view.config.ts`)),s=[],c=new Set;for(let e of o){let t=await Ke(e,`View config`,a);Oe(t.value,e),s.push(Ae(t.value,e));for(let e of t.dependencies)c.add(e)}return{views:s,watchFiles:[...c].sort()}}async function G(e,t){let n=m(process.cwd(),e),r=u(n),i=t?.appEnv??Ue,a=t?.runtimeEnv??Ue,o=t?.viewEnv??Ue;if(!S(n))throw Error(`Config file not found: ${n}`);let s=await Ke(n,`ElectroJS config`,i);if(!We(s.value))throw Error(`${e} must export an object from defineElectroConfig(...)`);let c=s.value,l=await Ye(r),d=Xe(l.packages),f,p=new Set(s.dependencies);if(it(c.runtime))f=rt(c.runtime,n);else{if(typeof c.runtime!=`string`||c.runtime.trim().length===0)throw Error(`electro.config.ts "runtime" must be a non-empty package specifier.`);let e=nt(r,n,d,l,c.runtime,`runtime.config.ts`),t=await Ke(e,`Runtime config`,a);f=rt(t.value,e);for(let e of t.dependencies)p.add(e)}let h=await st(r,n,c,d,l,o);for(let e of h.watchFiles)p.add(e);let g={codegen:c.codegen,runtime:f};return Ie(g),{config:g,views:h.views,scanDir:at(r,g.codegen,f.__source),watchFiles:[...p].sort(),configPath:n,root:r}}async function ct(t){let n=m(t,`package.json`),r=JSON.parse(await i(n,`utf-8`)),a=new Set([`electron`,...Object.keys(r.dependencies??{}),...Object.keys(r.optionalDependencies??{})]),o=new Set([...a,...Object.keys(r.devDependencies??{})]);a.delete(`@electrojs/runtime`),o.delete(`@electrojs/runtime`);let s=e.flatMap(e=>[e,`node:${e}`]),c=[...a],l=[...o],u=(await Promise.all(l.map(async e=>({dep:e,isCommonJs:await ut(t,e)})))).filter(e=>e.isCommonJs).map(e=>e.dep),d=c.length>0?RegExp(`^(${c.map(lt).join(`|`)})/.+`):null;return{externals:d?[...c,...s,d]:[...c,...s],cjsInteropDeps:u}}function lt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}async function ut(e,t){if(t===`electron`||t.startsWith(`node:`))return!1;let n=m(e,`node_modules`,t,`package.json`);try{return!dt(JSON.parse(await i(n,`utf-8`)))}catch{return!1}}function dt(e){return!!(e.type===`module`||typeof e.module==`string`||typeof e.main==`string`&&e.main.endsWith(`.mjs`)||typeof e.exports==`string`&&e.exports.endsWith(`.mjs`)||ft(e.exports))}function ft(e){if(!e||typeof e!=`object`)return!1;if(Array.isArray(e))return e.some(ft);let t=e;if(`import`in t)return!0;for(let e of Object.values(t))if(ft(e))return!0;return!1}async function pt(e){let t=m(e,`package.json`);try{let e=await i(t,`utf-8`);return JSON.parse(e).type===`module`?`es`:`cjs`}catch{return`cjs`}}const mt=[`index.mjs`,`index.cjs`,`index.js`];async function ht(e){for(let t of mt){let n=m(e,t);if(await gt(n))return n}throw Error(`Main entry not found in ${e}. Expected one of: ${mt.join(`, `)}`)}async function gt(e){try{return await n(e),!0}catch{return!1}}function _t(e,t,n){return n.map(n=>({id:n.id,preload:m(e,`preload`,`${n.id}.cjs`),source:t.get(n.id)??`about:blank`}))}function vt(e,t){return t.map(t=>({id:t.id,preload:m(e,`preload`,`${t.id}.cjs`),source:ne(m(e,`renderer`,t.id,`index.html`)).href}))}const yt=/(?<=\s|^|;)import\s*([\s"']*(?<imports>[\p{L}\p{M}\w\t\n\r $*,/{}@.]+)from\s*)?["']\s*(?<specifier>(?<="\s*)[^"]*[^\s"](?=\s*")|(?<='\s*)[^']*[^\s'](?=\s*'))\s*["'][\s;]*/gmu,bt=/^[A-Za-z_$][\w$]*$/;function xt(e){if(e.length===0)return{name:`electro:cjs-external-interop`,apply:`build`};let t=new Set(e);return{name:`electro:cjs-external-interop`,apply:`build`,enforce:`post`,renderChunk(e,n,{format:r,sourcemap:i}){if(r!==`es`)return null;let a=null,o=0;for(let n of e.matchAll(yt)){let r=n[0],i=n.index??0,s=n.groups?.specifier?.trim(),c=n.groups?.imports?.trim();if(!s||!c||!St(s,t))continue;let l=Ct(c);if(!l)continue;let u=`__cjs_ext_${o++}__`,d=[`import * as ${u} from ${JSON.stringify(s)};`];l.defaultImport&&d.push(`const ${l.defaultImport} = ${u}.default ?? ${u};`),l.namespaceImport&&d.push(`const ${l.namespaceImport} = ${u}.default ?? ${u};`);for(let{imported:e,local:t}of l.named)d.push(`const ${t} = ${u}.${e} ?? ${u}.default?.${e};`);a??=new w(e),a.overwrite(i,i+r.length,d.join(`
|
|
3
|
+
`))}return a?{code:a.toString(),map:i?a.generateMap({hires:`boundary`}):null}:null}}}function St(e,t){if(e.startsWith(`.`)||e.startsWith(`/`)||e.startsWith(`\0`)||e.startsWith(`node:`))return!1;if(t.has(e))return!0;for(let n of t)if(e.startsWith(`${n}/`))return!0;return!1}function Ct(e){let t=/^(\s*type\s+)?\*\s+as\s+([A-Za-z_$][\w$]*)\s*$/.exec(e);if(t){let e=t[2];return e?{namespaceImport:e,named:[]}:null}let n=/^([A-Za-z_$][\w$]*)\s*,\s*(?:type\s+)?\*\s+as\s+([A-Za-z_$][\w$]*)\s*$/.exec(e);if(n){let e=n[1],t=n[2];return!e||!t?null:{defaultImport:e,namespaceImport:t,named:[]}}let r=e.indexOf(`{`),i=e.lastIndexOf(`}`);if(r<0||i<r)return null;let a=e.slice(0,r).trim().replace(/,$/,``).trim();if(a.startsWith(`*`))return null;let o;if(a.length>0){let e=a.replace(/^type\s+/,``).trim();if(!bt.test(e))return null;o=e}let s=e.slice(r+1,i).trim();if(s.length===0)return null;let c=[];for(let e of s.split(`,`)){let t=e.trim();if(t.length===0)continue;let n=t.replace(/^type\s+/,``).trim(),r=/^([A-Za-z_$][\w$]*)(?:\s+as\s+([A-Za-z_$][\w$]*))?$/.exec(n);if(!r)return null;let i=r[1];if(!i)return null;c.push({imported:i,local:r[2]??i})}return!o&&c.length===0?null:{defaultImport:o,named:c}}const wt=/__filename|__dirname|require\(|require\.resolve\(/,Tt=`
|
|
4
4
|
// -- CommonJS Shims --
|
|
5
5
|
import __cjs_url__ from "node:url";
|
|
6
6
|
import __cjs_path__ from "node:path";
|
|
@@ -8,12 +8,12 @@ import __cjs_mod__ from "node:module";
|
|
|
8
8
|
const __filename = __cjs_url__.fileURLToPath(import.meta.url);
|
|
9
9
|
const __dirname = __cjs_path__.dirname(__filename);
|
|
10
10
|
const require = __cjs_mod__.createRequire(import.meta.url);
|
|
11
|
-
`,
|
|
11
|
+
`,Et=/(?<=\s|^|;)import\s*([\s"']*(?<imports>[\p{L}\p{M}\w\t\n\r $*,/{}@.]+)from\s*)?["']\s*(?<specifier>(?<="\s*)[^"]*[^\s"](?=\s*")|(?<='\s*)[^']*[^\s'](?=\s*'))\s*["'][\s;]*/gmu;function Dt(e){let t=[];for(let n of e.matchAll(Et))t.push({end:(n.index||0)+n[0].length});return t}function Ot(){return{name:`electro:esm-shim`,apply:`build`,enforce:`post`,renderChunk(e,t,{format:n,sourcemap:r}){if(n!==`es`||e.includes(Tt)||!wt.test(e))return null;let i=Dt(e).pop(),a=i?i.end:0,o=new w(e);return o.appendRight(a,Tt),{code:o.toString(),map:r?o.generateMap({hires:`boundary`}):null}}}}function kt(){return{name:`electro:import-meta`,apply:`build`,enforce:`pre`,resolveImportMeta(e,{format:t}){return t===`cjs`?e===`url`?`require("node:url").pathToFileURL(__filename).href`:e===`filename`?`__filename`:e===`dirname`?`__dirname`:null:null}}}function At(e){return!e||e===`linked`||e===`external`?!0:e===`inline`?`inline`:e!==`none`}function K(e){let t=e.format??`es`,n=t===`cjs`?`require`:`import`,r=e.scope===`preload`?[`node`,n,`default`]:[`node`,n],i=e.scope===`main`?[`MAIN_VITE_`,`VITE_`]:[`PRELOAD_VITE_`,`VITE_`],a=t===`cjs`?`cjs`:`mjs`,o={configFile:!1,root:e.root,plugins:[kt(),...e.plugins??[],xt(e.cjsInteropDeps??[]),Ot()],customLogger:e.customLogger,envPrefix:i,define:{"process.env":`process.env`,...e.define},build:{ssr:e.entry,ssrEmitAssets:!0,outDir:e.outDir,emptyOutDir:!0,rolldownOptions:{output:{format:t,entryFileNames:`index.${a}`},external:e.externals},target:`esnext`,sourcemap:At(e.sourcemap),minify:!1,modulePreload:!1,watch:e.watch?{}:null,reportCompressedSize:!e.watch},ssr:{target:`node`,noExternal:[/^@electrojs\/runtime(?:\/.*)?$/]},resolve:{conditions:r},logLevel:e.logLevel??`warn`,clearScreen:e.clearScreen};if(e.scope===`main`){let t=m(e.root,`resources`);S(t)&&(o.publicDir=t)}if(e.userViteConfig){let t=b(o,e.userViteConfig);return Re(t,e.scope),ze(t,e.scope),t}return o}function jt(e){let{view:t}=e,n={[t.id]:m(t.root,t.entry)},r={configFile:!1,root:t.root,customLogger:e.customLogger,cacheDir:e.cacheDir,envPrefix:[`RENDERER_VITE_`,`VITE_`],server:{host:`127.0.0.1`,port:e.port??5173,strictPort:!1},build:{rolldownOptions:{input:n}},logLevel:e.logLevel??`info`,clearScreen:e.clearScreen};if(t.userConfig){let e=b(r,t.userConfig);return e.plugins=Pt(e.plugins),e}return r}function Mt(e){return!e||e===`linked`||e===`external`?!0:e===`inline`?`inline`:e!==`none`}function Nt(e){let t={};for(let n of e.views)t[n.id]=m(n.root,n.entry);let n=!!e.outDir,r={configFile:!1,root:e.root,customLogger:e.customLogger,envPrefix:[`RENDERER_VITE_`,`VITE_`],...!n&&{server:{host:`127.0.0.1`,strictPort:!1}},...n&&{base:`./`},build:{rolldownOptions:{input:t},...n&&{outDir:e.outDir,emptyOutDir:!0,minify:e.minify??!0,sourcemap:Mt(e.sourcemap),reportCompressedSize:!0,modulePreload:{polyfill:!1}}},logLevel:e.logLevel??`info`,clearScreen:e.clearScreen};if(e.userViteConfigs?.length){let t=r;for(let n of e.userViteConfigs)t=b(t,n);return t.plugins=Pt(t.plugins),t}return r}function Pt(e){if(!e)return[];let t=new Set,n=[];for(let r of e.flat(1/0)){let e=r?.name;if(!e){n.push(r);continue}t.has(e)||(t.add(e),n.push(r))}return n}function Ft(e){let[t=``]=e.split(`?`),[n=``]=t.split(`#`);return n}function It(e,t){let n=p(u(e),t);return n.startsWith(`.`)?n:`./${n}`}const Lt=/[?&]asset(?:&|$)/,Rt=/(?:[?&]asset(?:&|$)|\.node$)/,zt=/__ELECTRO_ASSET__([\w$]+)__/g;function q(){let e=new Map;return{name:`electro:asset`,apply:`build`,async load(t){if(t.startsWith(`\0`)||!Rt.test(t))return;let n=Ft(t),r,a=e.get(n);if(a)r=a;else{let t=await i(n);r=`__ELECTRO_ASSET__${this.emitFile({type:`asset`,name:l(n),source:t})}__`,e.set(n,r)}if(Lt.test(t))return[`import { join } from "node:path"`,`export default join(import.meta.dirname, ${r})`].join(`
|
|
12
12
|
`);if(t.endsWith(`.node`))return[`const __require = process.getBuiltinModule("module").createRequire(import.meta.url)`,`export default __require(new URL(${r}, import.meta.url).pathname)`].join(`
|
|
13
|
-
`)},renderChunk(e,t){
|
|
14
|
-
`);n=
|
|
15
|
-
`),
|
|
16
|
-
`);function
|
|
17
|
-
`)}\n`}function
|
|
18
|
-
`)},renderChunk(e,t,n){
|
|
19
|
-
`)},renderChunk(e,t,n){nn.lastIndex=0;let r=nn.exec(e);if(!r)return null;let i=typeof n==`object`&&`sourcemap`in n?n.sourcemap:!1,a=new w(e);for(;r;){let[n,i]=r;if(!i)throw Error(`Missing emitted worker placeholder hash`);let o=this.getFileName(i);if(!o)throw Error(`Missing emitted worker filename for placeholder "${i}"`);let s=JSON.stringify(At(t.fileName,o));a.overwrite(r.index,r.index+n.length,s,{contentOnly:!0}),r=nn.exec(e)}return{code:a.toString(),map:i?a.generateMap({hires:`boundary`}):null}}}}async function on(e){e.sourcemap&&Me(e.sourcemap),e.logLevel&&ce(e.logLevel);let t=F();Fe(te);let n=await G(e.config),i=n.config,a=n.root,o=m(a,e.outDir),s=m(a,`.electro`),l=await st(a),d=n.scanDir,p=await g(d),v=n.views;W(v);let y=De(v);he({root:a,runtime:m(u(i.runtime.__source),i.runtime.entry),preload:v.length>0?m(s,`generated/preload`):null,mode:`build`,views:y.map(e=>({id:e.id,root:e.root,entry:Oe(e)}))});let ee=F();try{let{files:e,envTypes:t,packageTypes:n}=h({scanResult:p,views:v,outputDir:s,srcDir:d,packageTargets:v.map(e=>({packageRoot:U(e),viewId:e.id}))});await dn(s),await r(s,{recursive:!0});for(let t of e){let e=m(s,t.path);await r(u(e),{recursive:!0}),await c(e,t.content)}let i=m(d,t.path);await r(u(i),{recursive:!0}),await un(i,t.content);for(let e of n){let t=f(e.packageRoot,e.path);await r(u(t),{recursive:!0}),await un(t,e.content)}I(`codegen`,ee())}catch(e){L(`codegen`,e instanceof Error?e.message:String(e)),process.exit(1)}let b=await nt(a),x=b.externals,S=b.cjsInteropDeps,C=Se();try{xe(`main`),await sn({config:i,root:a,outDir:o,rendererViews:y,externals:x,sourcemap:e.sourcemap,logger:C,bytecode:e.bytecode,format:l,cjsInteropDeps:S})}catch(e){L(`main`,e instanceof Error?e.message:String(e)),process.exit(1)}if(v.length>0)try{xe(`preload`),await cn({config:i,views:v,root:a,outDir:o,codegenDir:s,externals:x,sourcemap:e.sourcemap,logger:C,bytecode:e.bytecode,format:l,cjsInteropDeps:S})}catch(e){L(`preload`,e instanceof Error?e.message:String(e)),process.exit(1)}if(y.length>0)try{xe(`renderer`);let t=y.map(e=>e.userConfig).filter(e=>e!==void 0);await _(Dt({root:a,views:y,userViteConfigs:t.length>0?t:void 0,logLevel:`info`,customLogger:C,outDir:m(o,`renderer`),minify:e.minify,sourcemap:e.sourcemap})),await ln(m(o,`renderer`),y,a)}catch(e){L(`renderer`,e instanceof Error?e.message:String(e)),process.exit(1)}z(`Built in ${t()}`,o)}async function sn(e){let t=e.config.runtime.entry,n=m(u(e.config.runtime.__source),t),r=ft(e.outDir,e.rendererViews);await _(K({scope:`main`,root:e.root,entry:n,externals:e.externals,outDir:m(e.outDir,`main`),watch:!1,plugins:[q(),Z(),X(),...e.bytecode?[Wt()]:[]],userViteConfig:e.config.runtime.userConfig,sourcemap:e.sourcemap,customLogger:e.logger,logLevel:`info`,format:e.bytecode?`cjs`:e.format,cjsInteropDeps:e.cjsInteropDeps,define:{__ELECTRO_VIEW_REGISTRY__:JSON.stringify(r)}}))}async function cn(e){let t=m(e.outDir,`preload`);for(let[n,r]of e.views.entries()){let i=ke(e.codegenDir,r),a=K({scope:`preload`,root:e.root,entry:i,externals:e.externals,outDir:t,watch:!1,plugins:[tn(e.config.runtime.__source),q(),Z(),X(),...e.bytecode?[Wt()]:[]],sourcemap:e.sourcemap,customLogger:e.logger,logLevel:`info`,format:`cjs`,cjsInteropDeps:e.cjsInteropDeps});if(a.build){let e=a.build.rolldownOptions?.output;a.build.emptyOutDir=n===0,a.build.rolldownOptions={...a.build.rolldownOptions,output:Array.isArray(e)?e.map(e=>({...e,entryFileNames:`${r.id}.cjs`})):{...e,entryFileNames:`${r.id}.cjs`}}}await _(a)}}async function ln(e,t,n){let a=new Set;for(let o of t){let t=p(n,Oe(o)),l=m(e,t),d=m(e,o.id,`index.html`);if(l===d)continue;let f=await i(l,`utf-8`),h=t.split(`/`).length-1-o.id.split(`/`).length;h>0&&(f=f.replace(/(["'(])((?:\.\.\/)+)/g,(e,t,n)=>{let r=(n.match(/\.\.\//g)||[]).length,i=Math.max(0,r-h);return t+(i>0?`../`.repeat(i):`./`)})),await r(u(d),{recursive:!0}),await c(d,f),await s(l);let[g]=t.split(`/`),[_]=o.id.split(`/`);g!==_&&g&&a.add(m(e,g))}for(let e of a)await o(e,{recursive:!0,force:!0})}async function un(e,t){try{if(await i(e,`utf-8`)===t)return}catch{}await c(e,t)}async function dn(e){await o(m(e,`generated/views`),{recursive:!0,force:!0}),await o(m(e,`generated/renderer-env.d.ts`),{force:!0})}async function fn(e,t={}){if((t.mode??`fast`)===`fast`){e.kill(`SIGKILL`),await e.exited;return}let n=T(t.graceMs??5e3).then(()=>`timeout`);e.kill(`SIGTERM`),await Promise.race([e.exited,n])===`timeout`&&(await t.onGraceTimeout?.(),e.kill(`SIGKILL`),await e.exited)}const Q=1e4;var pn=class{constructor(e,t){this.configPath=e,this.rendererServers=new Map,this.electronProcess=null,this.config=null,this.views=[],this.rendererViews=[],this.root=``,this.scanDir=``,this.lastScanResult=null,this.shuttingDown=!1,this.cleanedUp=!1,this.stopPromise=null,this.restartInFlight=!1,this.restartQueued=!1,this.restartQueuedFile=null,this.mainRestartQueued=!1,this.mainRestartReason=null,this.mainRestartFlushTimer=null,this.mainRestartFlushInFlight=!1,this.mainWatch=null,this.preloadWatch=null,this.outputDir=``,this.nodeFormat=`es`,this.mainInitialBuildPromise=null,this.resolveMainInitialBuild=null,this.preloadInitialBuildPromise=null,this.resolvePreloadInitialBuild=null,this.configPaths=new Set,this.configDebounce=null,this.onRestart=null,this.rendererUrls=new Map,this.rendererDisplayUrls=new Map,this.rendererDevToolsEnabled=new Set,this.readyEndpoints=[],this.logLevel=t?.logLevel,this.clearScreen=t?.clearScreen,this.rendererOnly=t?.rendererOnly??!1,this.sourcemap=t?.sourcemap,this.outDirOverride=t?.outDir,this.logLevel&&ce(this.logLevel)}async start(){this.cleanedUp=!1,this.shuttingDown=!1,this.stopPromise=null,this.readyEndpoints=[],Fe(te);let e=F(),t=await G(this.configPath);this.config=t.config,this.root=t.root,this.scanDir=t.scanDir,this.lastScanResult=await g(this.scanDir),this.views=t.views,W(this.views),this.rendererViews=De(this.views),this.outputDir=this.outDirOverride?m(this.root,this.outDirOverride):m(this.root,`.electro`),this.nodeFormat=await st(this.root),this.configPaths=new Set(t.watchFiles);for(let e of this.views)this.configPaths.add(e.__source);let n=m(u(this.config.runtime.__source),this.config.runtime.entry);he({root:this.root,runtime:n,preload:this.views.length>0?m(this.outputDir,`generated/preload`):null,views:this.rendererViews.map(e=>({id:e.id,root:e.root,entry:Oe(e)}))});let r=F();try{await this.runCodegen(this.outputDir,this.scanDir),I(`codegen`,r())}catch(e){throw L(`codegen`,e instanceof Error?e.message:String(e)),e}if(this.rendererViews.length>0){let e=F();try{await this.startRenderer(),I(`renderer`,e())}catch(e){throw L(`renderer`,e instanceof Error?e.message:String(e)),e}}if(this.rendererOnly){P(`Renderer-only mode — skipping main, preload, Electron`),z(`Ready in ${e()}`,this.readyEndpoints),this.logDevToolsHints(),this.attachConfigWatcher();return}let i=await nt(this.root),a=i.externals,o=i.cjsInteropDeps,s=F(),c=F(),[l,d]=await Promise.allSettled([this.views.length>0?this.buildPreload(a,o):Promise.resolve(),this.buildMain(a,o)]);if(this.views.length>0&&(l.status===`fulfilled`?I(`preload`,s()):L(`preload`,l.reason instanceof Error?l.reason.message:String(l.reason))),d.status===`fulfilled`?I(`main`,c()):L(`main`,d.reason instanceof Error?d.reason.message:String(d.reason)),l.status===`rejected`)throw l.reason;if(d.status===`rejected`)throw d.reason;let f=F();try{await this.waitForPreloadInitialBuild(),await this.waitForMainInitialBuild(),await this.attachElectronProcess(),I(`electron`,f())}catch(e){throw L(`electron`,e instanceof Error?e.message:String(e)),e}z(`Ready in ${e()}`,this.readyEndpoints),this.logDevToolsHints(),this.attachConfigWatcher()}setOnRestart(e){this.onRestart=e}async stop(){if(this.stopPromise){await this.stopPromise;return}this.cleanedUp=!0,this.shuttingDown=!0,this.stopPromise=(async()=>{this.configDebounce&&=(clearTimeout(this.configDebounce),null);for(let e of this.rendererServers.values())if(e.watcher)for(let t of this.configPaths)e.watcher.unwatch(t);if(this.configPaths.clear(),this.electronProcess){let e=this.electronProcess;this.electronProcess=null,await this.terminateElectronProcess(e)}if(this.mainWatch?.close(),this.mainWatch=null,this.preloadWatch?.close(),this.preloadWatch=null,this.resolveMainInitialBuild=null,this.mainInitialBuildPromise=null,this.resolvePreloadInitialBuild=null,this.preloadInitialBuildPromise=null,this.mainRestartFlushTimer&&=(clearTimeout(this.mainRestartFlushTimer),null),this.rendererServers.size>0){let e=[...this.rendererServers.values()].map(e=>e.close());this.rendererServers.clear(),this.rendererUrls.clear(),this.rendererDisplayUrls.clear(),this.rendererDevToolsEnabled.clear(),this.readyEndpoints=[],await Promise.allSettled(e)}})(),await this.stopPromise}async runCodegen(e,t,n){let i=n??await g(t);this.lastScanResult=i,W(this.views),this.rendererViews=De(this.views);let a=this.views.map(e=>({packageRoot:U(e),viewId:e.id})),{files:o,envTypes:s,packageTypes:l}=h({scanResult:i,views:this.views,outputDir:e,srcDir:t,packageTargets:a});await hn(e),await r(e,{recursive:!0});for(let t of o){let n=m(e,t.path);await r(u(n),{recursive:!0}),await c(n,t.content)}let d=m(t,s.path);await r(u(d),{recursive:!0}),await mn(d,s.content);for(let e of l){let t=f(e.packageRoot,e.path);await r(u(t),{recursive:!0}),await mn(t,e.content)}}async startRenderer(){let e=5173,t=[];try{let n=await Promise.all(this.rendererViews.map(async(n,r)=>{let i=await y(Tt({view:n,cacheDir:m(this.root,`node_modules`,`.vite`,`electro`,n.id),port:e+r,logLevel:this.logLevel,clearScreen:this.clearScreen}));return t.push(i),ye(i.config.logger,`renderer:${n.id}`),await i.listen(),{viewId:n.id,requestedPort:e+r,server:i}}));for(let{viewId:e,requestedPort:t,server:r}of n){let n=this.resolveRendererRuntimeUrl(r,t),i=this.resolveRendererDisplayUrl(r,n),a=this.isRendererDevToolsEnabled(r);this.rendererServers.set(e,r),this.rendererUrls.set(e,n),this.rendererDisplayUrls.set(e,i),a&&this.rendererDevToolsEnabled.add(e)}}catch(e){throw await Promise.allSettled(t.map(e=>e.close())),e}this.readyEndpoints=this.collectReadyEndpoints()}resolveRendererRuntimeUrl(e,t){let n=e.httpServer?.address();return`http://127.0.0.1:${typeof n==`object`&&n?n.port:t}`}resolveRendererDisplayUrl(e,t){return e.resolvedUrls?.local[0]??t}isRendererDevToolsEnabled(e){return!!e.config.devtools?.enabled}collectReadyEndpoints(){let e=this.rendererViews.length>1,t=[];for(let n of this.rendererViews){let r=this.rendererDisplayUrls.get(n.id);r&&t.push({label:e?`renderer:${n.id}`:`renderer`,url:r})}return t}logDevToolsHints(){if(this.isRuntimeDevToolsEnabled()&&P("Vite config `devtools` is enabled for runtime, but this Vite version supports that flag only in build mode. `electro dev` will not expose a DevTools UI for main/preload."),this.rendererDevToolsEnabled.size===0)return;let e=this.rendererViews.length>1;for(let t of this.rendererViews)this.rendererDevToolsEnabled.has(t.id)&&P(`Vite config \`devtools\` is enabled for ${e?`renderer:${t.id}`:`renderer`}, but this Vite version supports that flag only in build mode. \`electro dev\` will not expose a DevTools UI for it.`)}isRuntimeDevToolsEnabled(){return!!(this.config?.runtime.userConfig)?.devtools?.enabled}async buildPreload(e,t){let n=m(this.outputDir,`preload`);this.preloadInitialBuildPromise=new Promise(e=>{this.resolvePreloadInitialBuild=()=>{e(),this.resolvePreloadInitialBuild=null}});let r=this.views.length,i=[],a=()=>{--r,r===0&&this.resolvePreloadInitialBuild?.()};for(let[r,o]of this.views.entries()){let s=ke(this.outputDir,o),c=K({scope:`preload`,root:this.root,entry:s,externals:e,outDir:n,watch:!0,plugins:[tn(this.config.runtime.__source),q(),Z(),X()],logLevel:this.logLevel,clearScreen:this.clearScreen,sourcemap:this.sourcemap,format:`cjs`,cjsInteropDeps:t});if(c.build){let e=c.build.rolldownOptions?.output;c.build.emptyOutDir=r===0,c.build.rolldownOptions={...c.build.rolldownOptions,output:Array.isArray(e)?e.map(e=>({...e,entryFileNames:`${o.id}.cjs`})):{...e,entryFileNames:`${o.id}.cjs`}}}let l=!0;c.plugins.push({name:`electro:preload-watch:${o.id}`,apply:`build`,watchChange:e=>{l||R(`preload`,`rebuild → page reload`,p(this.root,e))},closeBundle:()=>{if(l){l=!1,a();return}let e=this.rendererServers.get(o.id);e&&e.ws.send({type:`full-reload`})}});let u=await _(c);i.push(u)}this.preloadWatch={close(){for(let e of i)e.close()}}}async buildMain(e,t){let n=this.config.runtime.entry,r=m(u(this.config.runtime.__source),n);this.mainInitialBuildPromise=new Promise(e=>{this.resolveMainInitialBuild=()=>{e(),this.resolveMainInitialBuild=null}});let i=this.rendererUrls.size>0&&this.rendererViews.length>0?dt(this.outputDir,this.rendererUrls,this.rendererViews):[],a=K({scope:`main`,root:this.root,entry:r,externals:e,outDir:m(this.outputDir,`main`),watch:!0,plugins:[q(),Z(),X()],logLevel:this.logLevel,clearScreen:this.clearScreen,userViteConfig:this.config.runtime.userConfig,sourcemap:this.sourcemap,format:this.nodeFormat,cjsInteropDeps:t,define:{__ELECTRO_VIEW_REGISTRY__:JSON.stringify(i)}}),o=!0,s=null;a.plugins.push({name:`electro:main-watch`,apply:`build`,watchChange:e=>{s??=e},closeBundle:async()=>{if(o){o=!1,s=null,this.resolveMainInitialBuild?.();return}let e=s;s=null;let t=await g(this.scanDir);JSON.stringify(t)!==JSON.stringify(this.lastScanResult)&&(R(`main`,`generated`),await this.runCodegen(this.outputDir,this.scanDir,t)),this.queueMainRestart(e)}}),this.mainWatch=await _(a)}async waitForMainInitialBuild(){if(!this.mainInitialBuildPromise)return;let e=T(Q).then(()=>{throw Error(`Main initial build did not finish in ${Q}ms.`)}),t=this.mainInitialBuildPromise;this.mainInitialBuildPromise=null,await Promise.race([t,e])}async waitForPreloadInitialBuild(){if(!this.preloadInitialBuildPromise)return;let e=T(Q).then(()=>{throw Error(`Preload initial build did not finish in ${Q}ms.`)}),t=this.preloadInitialBuildPromise;this.preloadInitialBuildPromise=null,await Promise.race([t,e])}async attachElectronProcess(){let e=await this.waitForMainEntry(),t={ELECTRO_DEV:`true`},n=u(this.config?.runtime.__source??this.root),r=[...new Set([this.root,n,...this.views.map(e=>e.root)])];if(this.rendererUrls.size>0){let e=this.rendererViews[0]?.id;if(e){let n=this.rendererUrls.get(e);n&&(t.ELECTRO_RENDERER_BASE=n)}for(let e of this.rendererViews){let n=this.rendererUrls.get(e.id);n&&(t[`ELECTRO_DEV_URL_${e.id}`]=n)}}let i=await Bt({searchRoots:r,cwd:this.root,entry:e,env:t});this.electronProcess=i,i.exited.then(async e=>{this.electronProcess===i&&(this.shuttingDown||(e===0?R(`main`,`exited`):R(`main`,`crashed (exit ${e})`),await this.stop(),process.exit(e===0?0:1)))})}async waitForMainEntry(){let e=m(this.outputDir,`main`),t=Date.now()+Q,n;for(;Date.now()<t;)try{return await lt(e)}catch(e){n=e,await T(50)}let r=n instanceof Error?` Last error: ${n.message}`:``;throw Error(`Main entry was not generated in time (${Q}ms). Checked in: ${e}.${r}`)}async restartElectron(e){if(this.restartInFlight){this.restartQueued=!0,this.restartQueuedFile=e??this.restartQueuedFile;return}this.restartInFlight=!0;let t=e;do{if(this.restartQueued=!1,R(`main`,`rebuild → restart`,t?p(this.root,t):null),t=null,this.electronProcess){let e=this.electronProcess;this.electronProcess=null,await this.terminateElectronProcess(e)}await this.attachElectronProcess(),this.restartQueued&&(t=this.restartQueuedFile,this.restartQueuedFile=null)}while(this.restartQueued);this.restartInFlight=!1}async terminateElectronProcess(e){await fn(e,{mode:`fast`})}queueMainRestart(e){e?this.mainRestartReason=e:this.mainRestartReason||=e,this.mainRestartQueued=!0,this.scheduleMainRestartFlush()}scheduleMainRestartFlush(){this.mainRestartFlushTimer&&clearTimeout(this.mainRestartFlushTimer),this.mainRestartFlushTimer=setTimeout(()=>{this.mainRestartFlushTimer=null,this.flushMainRestartQueue()},80)}async flushMainRestartQueue(){if(!(this.mainRestartFlushInFlight||!this.mainRestartQueued)){this.mainRestartFlushInFlight=!0;try{let e=this.mainRestartReason;this.mainRestartQueued=!1,this.mainRestartReason=null,await this.restartElectron(e)}finally{this.mainRestartFlushInFlight=!1,this.mainRestartQueued&&!this.mainRestartFlushTimer&&this.scheduleMainRestartFlush()}}}attachConfigWatcher(){let e=this.rendererServers.values().next().value;if(!e?.watcher)return;let t=e.watcher;for(let e of this.configPaths)t.add(e);t.on(`change`,e=>{this.configPaths.has(e)&&(this.shuttingDown||(this.configDebounce&&clearTimeout(this.configDebounce),this.configDebounce=setTimeout(()=>{this.configDebounce=null,le(`Config file changed, restarting...`),(async()=>{await this.stop(),this.onRestart?.()})()},300)))})}};async function mn(e,t){try{if(await i(e,`utf-8`)===t)return}catch{}await c(e,t)}async function hn(e){await o(m(e,`generated/views`),{recursive:!0,force:!0}),await o(m(e,`generated/renderer-env.d.ts`),{force:!0})}async function gn(e){if(e.remoteDebuggingPort&&(process.env.REMOTE_DEBUGGING_PORT=e.remoteDebuggingPort),e.inspect){let t=typeof e.inspect==`number`?e.inspect:9229;process.env.NODE_OPTIONS=`--inspect=${t}`}if(e.inspectBrk){let t=typeof e.inspectBrk==`number`?e.inspectBrk:9229;process.env.NODE_OPTIONS=`--inspect-brk=${t}`}e.noSandbox&&(process.env.NO_SANDBOX=`1`),e[`--`]&&(process.env.ELECTRON_CLI_ARGS=JSON.stringify(e[`--`])),e.sourcemap&&Me(e.sourcemap),process.env.ELECTRO_MODE=`development`;let t=()=>new pn(e.config,{logLevel:e.logLevel,clearScreen:e.clearScreen,rendererOnly:e.rendererOnly,sourcemap:e.sourcemap,outDir:e.outDir}),n=t(),r=!1,i=async(e=0)=>{r||(r=!0,await n.stop(),process.exit(e))};process.on(`SIGINT`,()=>{i(0)}),process.on(`SIGTERM`,()=>{i(0)});let a=async()=>{n.setOnRestart(()=>{n=t(),a()});try{await n.start()}catch(e){N(`Failed to start dev server: ${e instanceof Error?e.message:String(e)}`),await n.stop(),process.exit(1)}};await a(),await new Promise(()=>{})}async function _n(e){let t=await G(e.config),n=t.root,i=m(n,e.output);console.log(`Loaded config`);let a=t.scanDir;console.log(`Scanning ${a}...`);let o=await g(a),s=t.views;W(s),console.log(`Found ${o.modules.length} module(s), ${o.windows.length} window(s), ${o.views.length} runtime view(s), ${s.length} build view(s)`);let{files:l,envTypes:d,packageTypes:_}=h({scanResult:o,views:s,outputDir:i,srcDir:a,packageTargets:s.map(e=>({packageRoot:U(e),viewId:e.id}))});console.log(`Generating ${l.length+1+_.length} file(s)...`),await vn(i);for(let e of l){let t=m(i,e.path);await r(u(t),{recursive:!0}),await c(t,e.content),console.log(` ${p(n,t)}`)}let v=m(a,d.path);await r(u(v),{recursive:!0}),await c(v,d.content),console.log(` ${p(n,v)}`);for(let e of _){let t=f(e.packageRoot,e.path);await r(u(t),{recursive:!0}),await c(t,e.content),console.log(` ${p(n,t)}`)}console.log(`Done.`)}async function vn(e){await o(m(e,`generated/views`),{recursive:!0,force:!0}),await o(m(e,`generated/renderer-env.d.ts`),{force:!0})}async function yn(e){e.sourcemap&&Me(e.sourcemap),e.logLevel&&ce(e.logLevel);let t=F();e.skipBuild?P(`Skipped build (--skip-build)`):await on(e);let n=await G(e.config),r=n.root,i=await lt(m(m(r,e.outDir),`main`)),a=u(n.config.runtime.__source),o=[...new Set([r,a,...n.views.map(e=>e.root)])],s=F();try{let e=await Bt({searchRoots:o,cwd:r,entry:i});I(`electron`,s()),z(`Preview ready in ${t()}`);let n=()=>e.kill();process.on(`SIGINT`,n),process.on(`SIGTERM`,n);let a=await e.exited??0;process.off(`SIGINT`,n),process.off(`SIGTERM`,n),a===0?R(`main`,`exited`):(R(`main`,`crashed (exit ${a})`),process.exit(1))}catch(e){L(`electron`,e instanceof Error?e.message:String(e)),process.exit(1)}}const $=t(`electro`);$.command(`generate`,`Generate preload scripts, runtime registry, and electro env types`).option(`-c, --config <path>`,`Path to electro.config.ts`,{default:`electro.config.ts`}).option(`-o, --output <dir>`,`Output directory`,{default:`.electro`}).action(_n),$.command(`build`,`Build for production`).option(`-c, --config <path>`,`Path to electro.config.ts`,{default:`electro.config.ts`}).option(`-o, --outDir <dir>`,`Output directory`,{default:`dist`}).option(`--sourcemap <mode>`,`Sourcemap mode (linked | inline | external | none)`).option(`--minify`,`Minify output (default: true)`,{default:!0}).option(`--no-minify`,`Disable minification`).option(`--bytecode`,`Compile main/preload to V8 bytecode for source protection`).option(`-l, --logLevel <level>`,`Log level (info | warn | error | silent)`).action(on),$.command(`preview`,`Build and preview in Electron`).option(`-c, --config <path>`,`Path to electro.config.ts`,{default:`electro.config.ts`}).option(`-o, --outDir <dir>`,`Output directory`,{default:`dist`}).option(`--sourcemap <mode>`,`Sourcemap mode (linked | inline | external | none)`).option(`--minify`,`Minify output (default: true)`,{default:!0}).option(`--no-minify`,`Disable minification`).option(`--bytecode`,`Compile main/preload to V8 bytecode for source protection`).option(`--skip-build`,`Skip build step and launch from existing output`).option(`-l, --logLevel <level>`,`Log level (info | warn | error | silent)`).action(yn),$.command(`dev`,`Start development server with Electron`).option(`--config <path>`,`Path to electro.config.ts`,{default:`electro.config.ts`}).option(`--clearScreen`,`Clear screen on rebuild`,{default:!0}).option(`--logLevel <level>`,`Log level (info | warn | error | silent)`).option(`--sourcemap <mode>`,`Sourcemap mode (linked | inline | external | none)`).option(`--outDir <dir>`,`Output directory override (default: .electro)`).option(`--inspect [port]`,`[boolean | number] enable V8 inspector on the specified port`).option(`--inspectBrk [port]`,`[boolean | number] enable V8 inspector on the specified port`).option(`--remoteDebuggingPort <port>`,`[string] port for remote debugging`).option(`--noSandbox`,`[boolean] forces renderer process to run un-sandboxed`).option(`--rendererOnly`,`[boolean] only dev server for the renderer`).action(gn),$.help(),$.version(ae),$.parse();export{};
|
|
13
|
+
`)},renderChunk(e,t){zt.lastIndex=0;let n=zt.exec(e);if(!n)return null;let r=new w(e);for(;n;){let[i,a]=n;if(!a)throw Error(`Missing emitted asset placeholder hash`);let o=this.getFileName(a);if(!o)throw Error(`Missing emitted asset filename for placeholder "${a}"`);let s=JSON.stringify(It(t.fileName,o));r.overwrite(n.index,n.index+i.length,s,{contentOnly:!0}),n=zt.exec(e)}return{code:r.toString(),map:r.generateMap({hires:`boundary`})}}}}const J=`\x1B[90m`,Y=`\x1B[0m`,Bt=new RegExp(String.raw`^(\d{2}:\d{2}:\d{2}) \[(electro|warn|error)\] (.+?) \u2192 (.+)$`),Vt=new Set([`initializing`,`initialized`,`starting`,`started`,`stopping`,`stopped`,`failed`]),Ht=new Set([`initialized`,`started`,`stopped`,`failed`]),Ut=new Set([`initializing`,`starting`,`stopping`]);function Wt(e){let t=e.match(Bt);if(!t)return null;let[,n,r,i,a]=t;return{time:n,tag:r,code:i,message:a}}function Gt(e){return e===`error`?`[31m[${e}]${Y}`:`[33m[${e}]${Y}`}function Kt(e){return`${J}${e.time}${Y} ${Gt(e.tag)} ${J}${e.code}${Y} \u2192 ${e.message}`}function qt(e,t=``){return`${J}${e.time}${Y} ${Gt(e.tag)} [1mkernel${Y} ${e.message}${t}`}function Jt(e,t){return` [32m\u2713${Y} ${e} ${t}`}function Yt(e,t){return` [36mui${Y} ${e} ${t}`}function Xt(e){return` [35mapp${Y} ${e}`}function Zt(e){return e.code===`AppKernel`&&Vt.has(e.message)}function Qt(e){return e.code.endsWith(`Module`)&&(Ut.has(e.message)||Ht.has(e.message))}function $t(e){return e.code.endsWith(`Window`)||e.code.endsWith(`View`)}function en(e){return!!(e.code===`MainWindow`&&e.message===`created`||e.code.endsWith(`Window`)&&e.message===`shown`||e.code.endsWith(`View`)&&e.message.startsWith(`loaded `))}function tn(e){let t=e.trim();return t?t.startsWith(`at `)||t.startsWith(`Error:`)||/^\w*Error\b/.test(t)?e:t.startsWith(`Skip checkForUpdates because application is not packed`)?Xt(`updater skipped update check ${J}(dev build)${Y}`):Xt(t):null}var nn=class{constructor(){this.currentPhase=null,this.currentPhaseModuleCount=0}formatLine(e){let t=Wt(e);if(!t){let t=tn(e);return t?[t]:[]}if(t.tag!==`electro`)return[Kt(t)];if(Zt(t)){if(t.message===`initializing`||t.message===`starting`||t.message===`stopping`)return this.currentPhase=t.message,this.currentPhaseModuleCount=0,[qt(t)];let e=this.currentPhaseModuleCount>0?` ${J}(${this.currentPhaseModuleCount} modules)${Y}`:``;return this.currentPhase=null,this.currentPhaseModuleCount=0,[qt(t,e)]}return Qt(t)?Ut.has(t.message)?[]:(this.currentPhaseModuleCount+=1,[Jt(t.code,t.message)]):$t(t)?en(t)?[Yt(t.code,t.message)]:[]:[Kt(t)]}flush(){return[]}},rn=class{formatLine(e){let t=Wt(e);return[t?Kt(t):e]}flush(){return[]}};function an(e=`pretty`){return e===`raw`?new rn:new nn}async function on(e){try{return await n(e),!0}catch{return!1}}async function sn(e){if(process.env.ELECTRON_EXEC_PATH)return process.env.ELECTRON_EXEC_PATH;for(let t of e){try{let e=m(t,`node_modules/electron`),n=m(e,`path.txt`);if(await on(n)){let t=m(e,`dist`,(await i(n,`utf-8`)).trim());if(await on(t))return t}}catch{}let e=m(t,`node_modules/.bin/electron`);if(await on(e))return e}throw Error(`Could not find Electron binary. Install electron: npm add -D electron`)}function cn(e=process.env){return e.ELECTRO_RUNTIME_LOGS===`raw`?`raw`:`pretty`}function ln(e,t){let n=``,r=an(cn());e.on(`data`,e=>{n+=e.toString();let i=n.split(`
|
|
14
|
+
`);n=i.pop()??``;for(let e of i)for(let n of r.formatLine(e))t.write(`${n}\n`)}),e.on(`end`,()=>{if(n)for(let e of r.formatLine(n))t.write(`${e}\n`);for(let e of r.flush())t.write(`${e}\n`)})}async function un(e){let t=re(await sn(e.searchRoots),[e.entry],{cwd:e.cwd,stdio:[`ignore`,`pipe`,`pipe`],env:{...process.env,...e.env}});return t.stdout&&ln(t.stdout,process.stdout),t.stderr&&ln(t.stderr,process.stderr),{kill:(e=`SIGTERM`)=>t.kill(e),exited:new Promise(e=>{t.on(`exit`,t=>e(t)),t.on(`error`,()=>e(null))})}}const dn=`bytecode-loader.cjs`,fn=[`"use strict";`,`const fs = require("fs");`,`const path = require("path");`,`const vm = require("vm");`,`const v8 = require("v8");`,`const Module = require("module");`,``,`v8.setFlagsFromString("--no-lazy");`,`v8.setFlagsFromString("--no-flush-bytecode");`,``,`const FLAG_HASH_OFFSET = 12;`,`const SOURCE_HASH_OFFSET = 8;`,``,`let dummyBytecode;`,`function fixFlagHash(buffer) {`,` if (!dummyBytecode) {`,` dummyBytecode = new vm.Script("", { produceCachedData: true }).createCachedData();`,` }`,` dummyBytecode.copy(buffer, FLAG_HASH_OFFSET, FLAG_HASH_OFFSET, FLAG_HASH_OFFSET + 4);`,`}`,``,`Module._extensions[".jsc"] = function(module, filename) {`,` const bytecode = fs.readFileSync(filename);`,` fixFlagHash(bytecode);`,` const sourceLength = bytecode.readUInt32LE(SOURCE_HASH_OFFSET);`,` const dummyCode = sourceLength > 1 ? '"' + "\\u200b".repeat(sourceLength - 2) + '"' : "";`,` const script = new vm.Script(dummyCode, { filename, cachedData: bytecode });`,` if (script.cachedDataRejected) {`,` throw new Error("Bytecode cache rejected (V8 version mismatch?): " + filename);`,` }`,` const wrapper = script.runInThisContext({ filename });`,` const dir = path.dirname(filename);`,` wrapper.apply(module.exports, [module.exports, module.require.bind(module), module, filename, dir]);`,`};`,``].join(`
|
|
15
|
+
`),pn=[`"use strict";`,`const vm = require("vm");`,`const v8 = require("v8");`,`const Module = require("module");`,``,`v8.setFlagsFromString("--no-lazy");`,`v8.setFlagsFromString("--no-flush-bytecode");`,``,`let code = "";`,`process.stdin.setEncoding("utf-8");`,`process.stdin.on("data", chunk => { code += chunk; });`,`process.stdin.on("end", () => {`,` const wrapped = Module.wrap(code);`,` const script = new vm.Script(wrapped, { produceCachedData: true });`,` const bytecode = script.createCachedData();`,` process.stdout.write(bytecode);`,`});`].join(`
|
|
16
|
+
`);function mn(e={}){let{chunkAlias:t=[],keepSource:n=!1,protectedStrings:r=[]}=e,i=t.length===0,a=new Set(r),o,s=!1,l=``;function u(e){return i||t.includes(e)}return{name:`electro:bytecode`,apply:`build`,enforce:`post`,configResolved(e){o=e.logger,s=e.isProduction,l=e.root},renderChunk(e,t,n){if(!s||!u(t.name)||a.size===0)return null;let r=_n(e,a);if(!r)return null;let i=typeof n==`object`&&`sourcemap`in n?n.sourcemap:!1;return{code:r.toString(),map:i?r.generateMap({hires:`boundary`}):void 0}},async generateBundle(e,t){if(!s)return;let r;try{r=await sn(l)}catch{try{r=await sn(f(l,`../..`))}catch{}}if(!r){o.warn(`[electro:bytecode] Electron binary not found — skipping bytecode compilation`);return}let i=f(ie(),`electro-bc-compiler-${process.pid}.cjs`);await c(i,pn);let a=[];for(let e of Object.values(t))e.type===`chunk`&&e.isEntry&&u(e.name)&&a.push(e);if(a.length===0){await bn(i);return}let d=0;for(let e of a)try{let t=await hn(e.code,r,i),a=`${e.fileName}c`;this.emitFile({type:`asset`,fileName:a,source:t}),n&&this.emitFile({type:`asset`,fileName:`_${e.fileName}`,source:e.code}),e.code=gn(yn(dn,e.fileName),yn(a,e.fileName),e.exports),d++}catch(t){let n=t instanceof Error?t.message:String(t);o.error(`[electro:bytecode] Failed to compile ${e.fileName}: ${n}`)}d>0&&(Object.values(t).some(e=>e.type===`asset`&&e.fileName===dn)||this.emitFile({type:`asset`,fileName:dn,source:fn}),o.info(`\x1b[32m\u2713\x1b[0m ${d} chunk(s) compiled to bytecode`)),await bn(i)}}}async function hn(e,t,n){let r=re(t,[n],{env:{...process.env,ELECTRON_RUN_AS_NODE:`1`},stdio:[`pipe`,`pipe`,`pipe`]}),i=[],a=[];r.stdout?.on(`data`,e=>{i.push(Buffer.isBuffer(e)?e:Buffer.from(e))}),r.stderr?.on(`data`,e=>{a.push(Buffer.isBuffer(e)?e:Buffer.from(e))});let o=await new Promise((t,n)=>{r.on(`error`,n),r.on(`close`,e=>t(e??-1)),r.stdin?.end(e)});if(o!==0){let e=Buffer.concat(a).toString(`utf-8`);throw Error(`Bytecode compilation failed (exit ${o}): ${e}`)}let s=Buffer.concat(i);if(s.length===0)throw Error(`Bytecode compilation returned empty buffer`);return s}function gn(e,t){return`${[`"use strict";`,`require(${JSON.stringify(e)});`,`const __mod = require(${JSON.stringify(t)});`,`module.exports = __mod;`].join(`
|
|
17
|
+
`)}\n`}function _n(e,t){if(t.size===0)return null;let n,r=/"((?:[^"\\]|\\.)*)"|'((?:[^'\\]|\\.)*)'/g,i;for(i=r.exec(e);i;){let a=i[1]??i[2];if(a&&t.has(a)&&!vn(e,i.index,i[0].length)){n??=new w(e);let t=Array.from(a).map(e=>e.charCodeAt(0)).join(`,`);n.overwrite(i.index,i.index+i[0].length,`String.fromCharCode(${t})`,{contentOnly:!0})}i=r.exec(e)}return n??null}function vn(e,t,n){let r=e.slice(Math.max(0,t-80),t).trimEnd();return!!(/\bimport\s*$/.test(r)||/\bfrom\s*$/.test(r)||/\brequire\s*\(\s*$/.test(r)||r.endsWith(`[`)||e.slice(t+n,t+n+20).trimStart().startsWith(`:`)&&!r.endsWith(`?`))}function yn(e,t){let n=p(u(t),e);return n.startsWith(`.`)||(n=`./${n}`),n}async function bn(e){try{await o(e,{force:!0})}catch{}}const xn=/__ELECTRO_MODULE_PATH__([\w$]+)__/g,Sn=new Set([`electro:module-path`,`electro:isolate-entries`,`electro:bytecode`]);function X(){let e=new Set,t;return{name:`electro:module-path`,apply:`build`,enforce:`pre`,configResolved(e){t=e},buildStart(){e.clear()},async load(n){if(!n.endsWith(`?modulePath`))return;let r=Ft(n),i=await Tn(r,Cn(t),this.meta.watchMode),[a,...o]=i.output;if(!a||a.type!==`chunk`)throw Error(`Expected a main output chunk for "${r}"`);let s=this.emitFile({type:`asset`,fileName:a.fileName,source:a.code??``});for(let t of o){if(e.has(t.fileName))continue;let n=t.type===`chunk`?t.code:t.source;n!=null&&(this.emitFile({type:`asset`,fileName:t.fileName,source:n}),e.add(t.fileName))}for(let e of i.watchFiles)this.addWatchFile(e);return[`import { join } from 'path'`,`export default join(import.meta.dirname, ${`__ELECTRO_MODULE_PATH__${s}__`})`].join(`
|
|
18
|
+
`)},renderChunk(e,t,n){xn.lastIndex=0;let r=xn.exec(e);if(!r)return null;let i=typeof n==`object`&&`sourcemap`in n?n.sourcemap:!1,a=new w(e);for(;r;){let[n,i]=r;if(!i)throw Error(`Missing emitted module-path placeholder hash`);let o=this.getFileName(i);if(!o)throw Error(`Missing emitted module-path filename for placeholder "${i}"`);let s=JSON.stringify(It(t.fileName,o));a.overwrite(r.index,r.index+n.length,s,{contentOnly:!0}),r=xn.exec(e)}return{code:a.toString(),map:i?a.generateMap({hires:`boundary`}):null}}}}function Cn(e){let t=(e.plugins??[]).filter(e=>!Sn.has(e.name));return{configFile:!1,root:e.root,mode:e.mode,envDir:e.envDir,envPrefix:e.envPrefix,plugins:t,resolve:e.resolve,define:e.define,build:{ssr:e.build.ssr,outDir:e.build.outDir,rolldownOptions:{output:e.build.rolldownOptions.output,external:e.build.rolldownOptions.external},target:e.build.target,sourcemap:e.build.sourcemap,minify:e.build.minify},ssr:e.ssr,logLevel:`warn`}}function wn(e){return{name:`electro:module-path-watch`,buildEnd(){for(let t of this.getModuleIds())t.includes(`node_modules`)||t.startsWith(`\0`)||this.getModuleInfo(t)?.code!=null&&e.push(t)}}}async function Tn(e,t,n){let r=[],i=b(t,{build:{write:!1,watch:!1},plugins:[{name:`electro:module-path-entry-name`,outputOptions(e){if(typeof e.entryFileNames!=`function`&&e.entryFileNames)return{...e,entryFileNames:`[name]-[hash]${d(e.entryFileNames)}`}}},...n?[wn(r)]:[]],logLevel:`warn`,configFile:!1});return i.build&&(i.build.rolldownOptions={...i.build?.rolldownOptions,input:e,plugins:[...i.build?.rolldownOptions?.plugins??[]]}),{output:(await _(i)).output,watchFiles:r}}function En(e){let t=m(u(e),`node_modules/@electrojs/runtime`),n=new Map([[`@electrojs/runtime`,x(m(t,`dist/index.mjs`))],[`@electrojs/runtime/client`,x(m(t,`dist/client.mjs`))]]);return{name:`electro:runtime-package-alias`,enforce:`pre`,resolveId(e){return n.get(e)??null}}}const Dn=/__ELECTRO_WORKER__([\w$]+)__/g,On=/\?nodeWorker(?:&|$)/,kn=/\?nodeWorker&importer=([^&]+)(?:&|$)/;function Z(){return{name:`electro:worker`,apply:`build`,enforce:`pre`,resolveId(e,t){if(e.endsWith(`?nodeWorker`))return`${e}&importer=${t}`},load(e){if(!On.test(e))return;let t=kn.exec(e);if(!t)return;let n=t[1];if(n)return[`import { Worker } from 'worker_threads';`,`export default function createWorker(options) {`,` return new Worker(new URL(${`__ELECTRO_WORKER__${this.emitFile({type:`chunk`,id:Ft(e),importer:n})}__`}, import.meta.url), options);`,`};`].join(`
|
|
19
|
+
`)},renderChunk(e,t,n){Dn.lastIndex=0;let r=Dn.exec(e);if(!r)return null;let i=typeof n==`object`&&`sourcemap`in n?n.sourcemap:!1,a=new w(e);for(;r;){let[n,i]=r;if(!i)throw Error(`Missing emitted worker placeholder hash`);let o=this.getFileName(i);if(!o)throw Error(`Missing emitted worker filename for placeholder "${i}"`);let s=JSON.stringify(It(t.fileName,o));a.overwrite(r.index,r.index+n.length,s,{contentOnly:!0}),r=Dn.exec(e)}return{code:a.toString(),map:i?a.generateMap({hires:`boundary`}):null}}}}async function An(e){e.sourcemap&&Le(e.sourcemap),e.logLevel&&le(e.logLevel);let t=F();Be(te);let n=await G(e.config),i=n.config,a=n.root,o=m(a,e.outDir),s=m(a,`.electro`),l=await pt(a),d=n.scanDir,p=await g(d),v=n.views;W(v);let y=Me(v);ve({root:a,runtime:m(u(i.runtime.__source),i.runtime.entry),preload:v.length>0?m(s,`generated/preload`):null,mode:`build`,views:y.map(e=>({id:e.id,root:e.root,entry:Ne(e)}))});let ee=F();try{let{files:e,envTypes:t,packageTypes:n}=h({scanResult:p,views:v,outputDir:s,srcDir:d,packageTargets:v.map(e=>({packageRoot:U(e),viewId:e.id}))});await Fn(s),await r(s,{recursive:!0});for(let t of e){let e=m(s,t.path);await r(u(e),{recursive:!0}),await c(e,t.content)}let i=m(d,t.path);await r(u(i),{recursive:!0}),await Pn(i,t.content);for(let e of n){let t=f(e.packageRoot,e.path);await r(u(t),{recursive:!0}),await Pn(t,e.content)}I(`codegen`,ee())}catch(e){L(`codegen`,e instanceof Error?e.message:String(e)),process.exit(1)}let b=await ct(a),x=b.externals,S=b.cjsInteropDeps,C=De();try{Ee(`main`),await jn({config:i,root:a,outDir:o,rendererViews:y,externals:x,sourcemap:e.sourcemap,logger:C,bytecode:e.bytecode,format:l,cjsInteropDeps:S})}catch(e){L(`main`,e instanceof Error?e.message:String(e)),process.exit(1)}if(v.length>0)try{Ee(`preload`),await Mn({config:i,views:v,root:a,outDir:o,codegenDir:s,externals:x,sourcemap:e.sourcemap,logger:C,bytecode:e.bytecode,format:l,cjsInteropDeps:S})}catch(e){L(`preload`,e instanceof Error?e.message:String(e)),process.exit(1)}if(y.length>0)try{Ee(`renderer`);let t=y.map(e=>e.userConfig).filter(e=>e!==void 0);await _(Nt({root:a,views:y,userViteConfigs:t.length>0?t:void 0,logLevel:`info`,customLogger:C,outDir:m(o,`renderer`),minify:e.minify,sourcemap:e.sourcemap})),await Nn(m(o,`renderer`),y,a)}catch(e){L(`renderer`,e instanceof Error?e.message:String(e)),process.exit(1)}z(`Built in ${t()}`,o)}async function jn(e){let t=e.config.runtime.entry,n=m(u(e.config.runtime.__source),t),r=vt(e.outDir,e.rendererViews);await _(K({scope:`main`,root:e.root,entry:n,externals:e.externals,outDir:m(e.outDir,`main`),watch:!1,plugins:[q(),Z(),X(),...e.bytecode?[mn()]:[]],userViteConfig:e.config.runtime.userConfig,sourcemap:e.sourcemap,customLogger:e.logger,logLevel:`info`,format:e.bytecode?`cjs`:e.format,cjsInteropDeps:e.cjsInteropDeps,define:{__ELECTRO_VIEW_REGISTRY__:JSON.stringify(r)}}))}async function Mn(e){let t=m(e.outDir,`preload`);for(let[n,r]of e.views.entries()){let i=Pe(e.codegenDir,r),a=K({scope:`preload`,root:e.root,entry:i,externals:e.externals,outDir:t,watch:!1,plugins:[En(e.config.runtime.__source),q(),Z(),X(),...e.bytecode?[mn()]:[]],sourcemap:e.sourcemap,customLogger:e.logger,logLevel:`info`,format:`cjs`,cjsInteropDeps:e.cjsInteropDeps});if(a.build){let e=a.build.rolldownOptions?.output;a.build.emptyOutDir=n===0,a.build.rolldownOptions={...a.build.rolldownOptions,output:Array.isArray(e)?e.map(e=>({...e,entryFileNames:`${r.id}.cjs`})):{...e,entryFileNames:`${r.id}.cjs`}}}await _(a)}}async function Nn(e,t,n){let a=new Set;for(let o of t){let t=p(n,Ne(o)),l=m(e,t),d=m(e,o.id,`index.html`);if(l===d)continue;let f=await i(l,`utf-8`),h=t.split(`/`).length-1-o.id.split(`/`).length;h>0&&(f=f.replace(/(["'(])((?:\.\.\/)+)/g,(e,t,n)=>{let r=(n.match(/\.\.\//g)||[]).length,i=Math.max(0,r-h);return t+(i>0?`../`.repeat(i):`./`)})),await r(u(d),{recursive:!0}),await c(d,f),await s(l);let[g]=t.split(`/`),[_]=o.id.split(`/`);g!==_&&g&&a.add(m(e,g))}for(let e of a)await o(e,{recursive:!0,force:!0})}async function Pn(e,t){try{if(await i(e,`utf-8`)===t)return}catch{}await c(e,t)}async function Fn(e){await o(m(e,`generated/views`),{recursive:!0,force:!0}),await o(m(e,`generated/renderer-env.d.ts`),{force:!0})}async function In(e,t={}){if((t.mode??`fast`)===`fast`){e.kill(`SIGKILL`),await e.exited;return}let n=T(t.graceMs??5e3).then(()=>`timeout`);e.kill(`SIGTERM`),await Promise.race([e.exited,n])===`timeout`&&(await t.onGraceTimeout?.(),e.kill(`SIGKILL`),await e.exited)}const Q=1e4,Ln={command:`serve`,mode:`development`,isSsrBuild:!1,isPreview:!1},Rn={command:`build`,mode:`development`,isSsrBuild:!1,isPreview:!1},zn={command:`serve`,mode:`development`,isSsrBuild:!1,isPreview:!1};var Bn=class{constructor(e,t){this.configPath=e,this.rendererServers=new Map,this.electronProcess=null,this.config=null,this.views=[],this.rendererViews=[],this.root=``,this.scanDir=``,this.lastScanResult=null,this.shuttingDown=!1,this.cleanedUp=!1,this.stopPromise=null,this.restartInFlight=!1,this.restartQueued=!1,this.restartQueuedFile=null,this.mainRestartQueued=!1,this.mainRestartReason=null,this.mainRestartFlushTimer=null,this.mainRestartFlushInFlight=!1,this.mainWatch=null,this.preloadWatch=null,this.outputDir=``,this.nodeFormat=`es`,this.mainInitialBuildPromise=null,this.resolveMainInitialBuild=null,this.preloadInitialBuildPromise=null,this.resolvePreloadInitialBuild=null,this.configPaths=new Set,this.configDebounce=null,this.onRestart=null,this.rendererUrls=new Map,this.rendererDisplayUrls=new Map,this.rendererDevToolsEnabled=new Set,this.readyEndpoints=[],this.logLevel=t?.logLevel,this.clearScreen=t?.clearScreen,this.rendererOnly=t?.rendererOnly??!1,this.sourcemap=t?.sourcemap,this.outDirOverride=t?.outDir,this.logLevel&&le(this.logLevel)}async start(){this.cleanedUp=!1,this.shuttingDown=!1,this.stopPromise=null,this.readyEndpoints=[],Be(te);let e=F(),t=await G(this.configPath,{appEnv:Ln,runtimeEnv:Rn,viewEnv:zn});this.config=t.config,this.root=t.root,this.scanDir=t.scanDir,this.lastScanResult=await g(this.scanDir),this.views=t.views,W(this.views),this.rendererViews=Me(this.views),this.outputDir=this.outDirOverride?m(this.root,this.outDirOverride):m(this.root,`.electro`),this.nodeFormat=await pt(this.root),this.configPaths=new Set(t.watchFiles);for(let e of this.views)this.configPaths.add(e.__source);let n=m(u(this.config.runtime.__source),this.config.runtime.entry);ve({root:this.root,runtime:n,preload:this.views.length>0?m(this.outputDir,`generated/preload`):null,views:this.rendererViews.map(e=>({id:e.id,root:e.root,entry:Ne(e)}))});let r=F();try{await this.runCodegen(this.outputDir,this.scanDir),I(`codegen`,r())}catch(e){throw L(`codegen`,e instanceof Error?e.message:String(e)),e}if(this.rendererViews.length>0){let e=F();try{await this.startRenderer(),I(`renderer`,e())}catch(e){throw L(`renderer`,e instanceof Error?e.message:String(e)),e}}if(this.rendererOnly){P(`Renderer-only mode — skipping main, preload, Electron`),_e(),z(`Ready in ${e()}`,this.readyEndpoints),this.logDevToolsHints(),this.attachConfigWatcher();return}let i=await ct(this.root),a=i.externals,o=i.cjsInteropDeps,s=F(),c=F(),[l,d]=await Promise.allSettled([this.views.length>0?this.buildPreload(a,o):Promise.resolve(),this.buildMain(a,o)]);if(this.views.length>0&&(l.status===`fulfilled`?I(`preload`,s()):L(`preload`,l.reason instanceof Error?l.reason.message:String(l.reason))),d.status===`fulfilled`?I(`main`,c()):L(`main`,d.reason instanceof Error?d.reason.message:String(d.reason)),l.status===`rejected`)throw l.reason;if(d.status===`rejected`)throw d.reason;let f=F();try{await this.waitForPreloadInitialBuild(),await this.waitForMainInitialBuild(),await this.attachElectronProcess(),I(`electron`,f())}catch(e){throw L(`electron`,e instanceof Error?e.message:String(e)),e}_e(),z(`Ready in ${e()}`,this.readyEndpoints),this.logDevToolsHints(),this.attachConfigWatcher()}setOnRestart(e){this.onRestart=e}async stop(){if(this.stopPromise){await this.stopPromise;return}this.cleanedUp=!0,this.shuttingDown=!0,this.stopPromise=(async()=>{this.configDebounce&&=(clearTimeout(this.configDebounce),null);for(let e of this.rendererServers.values())if(e.watcher)for(let t of this.configPaths)e.watcher.unwatch(t);if(this.configPaths.clear(),this.electronProcess){let e=this.electronProcess;this.electronProcess=null,await this.terminateElectronProcess(e)}if(this.mainWatch?.close(),this.mainWatch=null,this.preloadWatch?.close(),this.preloadWatch=null,this.resolveMainInitialBuild=null,this.mainInitialBuildPromise=null,this.resolvePreloadInitialBuild=null,this.preloadInitialBuildPromise=null,this.mainRestartFlushTimer&&=(clearTimeout(this.mainRestartFlushTimer),null),this.rendererServers.size>0){let e=[...this.rendererServers.values()].map(e=>e.close());this.rendererServers.clear(),this.rendererUrls.clear(),this.rendererDisplayUrls.clear(),this.rendererDevToolsEnabled.clear(),this.readyEndpoints=[],await Promise.allSettled(e)}})(),await this.stopPromise}async runCodegen(e,t,n){let i=n??await g(t);this.lastScanResult=i,W(this.views),this.rendererViews=Me(this.views);let a=this.views.map(e=>({packageRoot:U(e),viewId:e.id})),{files:o,envTypes:s,packageTypes:l}=h({scanResult:i,views:this.views,outputDir:e,srcDir:t,packageTargets:a});await Hn(e),await r(e,{recursive:!0});for(let t of o){let n=m(e,t.path);await r(u(n),{recursive:!0}),await c(n,t.content)}let d=m(t,s.path);await r(u(d),{recursive:!0}),await Vn(d,s.content);for(let e of l){let t=f(e.packageRoot,e.path);await r(u(t),{recursive:!0}),await Vn(t,e.content)}}async startRenderer(){let e=5173,t=[];try{let n=await Promise.all(this.rendererViews.map(async(n,r)=>{let i=`renderer:${n.id}`,a=await y(jt({view:n,cacheDir:m(this.root,`node_modules`,`.vite`,`electro`,n.id),port:e+r,logLevel:this.logLevel,clearScreen:this.clearScreen,customLogger:Te(i)}));return t.push(a),await a.listen(),{viewId:n.id,requestedPort:e+r,server:a}}));for(let{viewId:e,requestedPort:t,server:r}of n){let n=this.resolveRendererRuntimeUrl(r,t),i=this.resolveRendererDisplayUrl(r,n),a=this.isRendererDevToolsEnabled(r);this.rendererServers.set(e,r),this.rendererUrls.set(e,n),this.rendererDisplayUrls.set(e,i),a&&this.rendererDevToolsEnabled.add(e)}}catch(e){throw await Promise.allSettled(t.map(e=>e.close())),e}this.readyEndpoints=this.collectReadyEndpoints()}resolveRendererRuntimeUrl(e,t){let n=e.httpServer?.address();return`http://127.0.0.1:${typeof n==`object`&&n?n.port:t}`}resolveRendererDisplayUrl(e,t){return e.resolvedUrls?.local[0]??t}isRendererDevToolsEnabled(e){return!!e.config.devtools?.enabled}collectReadyEndpoints(){let e=this.rendererViews.length>1,t=[];for(let n of this.rendererViews){let r=this.rendererDisplayUrls.get(n.id);r&&t.push({label:e?`renderer:${n.id}`:`renderer`,url:r})}return t}logDevToolsHints(){if(this.isRuntimeDevToolsEnabled()&&P("Vite config `devtools` is enabled for runtime, but this Vite version supports that flag only in build mode. `electro dev` will not expose a DevTools UI for main/preload."),this.rendererDevToolsEnabled.size===0)return;let e=this.rendererViews.length>1;for(let t of this.rendererViews)this.rendererDevToolsEnabled.has(t.id)&&P(`Vite config \`devtools\` is enabled for ${e?`renderer:${t.id}`:`renderer`}, but this Vite version supports that flag only in build mode. \`electro dev\` will not expose a DevTools UI for it.`)}isRuntimeDevToolsEnabled(){return!!(this.config?.runtime.userConfig)?.devtools?.enabled}async buildPreload(e,t){let n=m(this.outputDir,`preload`);this.preloadInitialBuildPromise=new Promise(e=>{this.resolvePreloadInitialBuild=()=>{e(),this.resolvePreloadInitialBuild=null}});let r=this.views.length,i=[],a=()=>{--r,r===0&&this.resolvePreloadInitialBuild?.()};for(let[r,o]of this.views.entries()){let s=Pe(this.outputDir,o),c=K({scope:`preload`,root:this.root,entry:s,externals:e,outDir:n,watch:!0,plugins:[En(this.config.runtime.__source),q(),Z(),X()],logLevel:this.logLevel,clearScreen:this.clearScreen,sourcemap:this.sourcemap,format:`cjs`,cjsInteropDeps:t});if(c.build){let e=c.build.rolldownOptions?.output;c.build.emptyOutDir=r===0,c.build.rolldownOptions={...c.build.rolldownOptions,output:Array.isArray(e)?e.map(e=>({...e,entryFileNames:`${o.id}.cjs`})):{...e,entryFileNames:`${o.id}.cjs`}}}let l=!0;c.plugins.push({name:`electro:preload-watch:${o.id}`,apply:`build`,watchChange:e=>{l||R(`preload`,`rebuild → page reload`,p(this.root,e))},closeBundle:()=>{if(l){l=!1,a();return}let e=this.rendererServers.get(o.id);e&&e.ws.send({type:`full-reload`})}});let u=await _(c);i.push(u)}this.preloadWatch={close(){for(let e of i)e.close()}}}async buildMain(e,t){let n=this.config.runtime.entry,r=m(u(this.config.runtime.__source),n);this.mainInitialBuildPromise=new Promise(e=>{this.resolveMainInitialBuild=()=>{e(),this.resolveMainInitialBuild=null}});let i=this.rendererUrls.size>0&&this.rendererViews.length>0?_t(this.outputDir,this.rendererUrls,this.rendererViews):[],a=K({scope:`main`,root:this.root,entry:r,externals:e,outDir:m(this.outputDir,`main`),watch:!0,plugins:[q(),Z(),X()],logLevel:this.logLevel,clearScreen:this.clearScreen,userViteConfig:this.config.runtime.userConfig,sourcemap:this.sourcemap,format:this.nodeFormat,cjsInteropDeps:t,define:{__ELECTRO_VIEW_REGISTRY__:JSON.stringify(i)}}),o=!0,s=null;a.plugins.push({name:`electro:main-watch`,apply:`build`,watchChange:e=>{s??=e},closeBundle:async()=>{if(o){o=!1,s=null,this.resolveMainInitialBuild?.();return}let e=s;s=null;let t=await g(this.scanDir);JSON.stringify(t)!==JSON.stringify(this.lastScanResult)&&(R(`main`,`generated`),await this.runCodegen(this.outputDir,this.scanDir,t)),this.queueMainRestart(e)}}),this.mainWatch=await _(a)}async waitForMainInitialBuild(){if(!this.mainInitialBuildPromise)return;let e=T(Q).then(()=>{throw Error(`Main initial build did not finish in ${Q}ms.`)}),t=this.mainInitialBuildPromise;this.mainInitialBuildPromise=null,await Promise.race([t,e])}async waitForPreloadInitialBuild(){if(!this.preloadInitialBuildPromise)return;let e=T(Q).then(()=>{throw Error(`Preload initial build did not finish in ${Q}ms.`)}),t=this.preloadInitialBuildPromise;this.preloadInitialBuildPromise=null,await Promise.race([t,e])}async attachElectronProcess(){let e=await this.waitForMainEntry(),t={ELECTRO_DEV:`true`},n=u(this.config?.runtime.__source??this.root),r=[...new Set([this.root,n,...this.views.map(e=>e.root)])];if(this.rendererUrls.size>0){let e=this.rendererViews[0]?.id;if(e){let n=this.rendererUrls.get(e);n&&(t.ELECTRO_RENDERER_BASE=n)}for(let e of this.rendererViews){let n=this.rendererUrls.get(e.id);n&&(t[`ELECTRO_DEV_URL_${e.id}`]=n)}}let i=await un({searchRoots:r,cwd:this.root,entry:e,env:t});this.electronProcess=i,i.exited.then(async e=>{this.electronProcess===i&&(this.shuttingDown||(e===0?R(`main`,`exited`):R(`main`,`crashed (exit ${e})`),await this.stop(),process.exit(e===0?0:1)))})}async waitForMainEntry(){let e=m(this.outputDir,`main`),t=Date.now()+Q,n;for(;Date.now()<t;)try{return await ht(e)}catch(e){n=e,await T(50)}let r=n instanceof Error?` Last error: ${n.message}`:``;throw Error(`Main entry was not generated in time (${Q}ms). Checked in: ${e}.${r}`)}async restartElectron(e){if(this.restartInFlight){this.restartQueued=!0,this.restartQueuedFile=e??this.restartQueuedFile;return}this.restartInFlight=!0;let t=e;do{if(this.restartQueued=!1,R(`main`,`rebuild → restart`,t?p(this.root,t):null),t=null,this.electronProcess){let e=this.electronProcess;this.electronProcess=null,await this.terminateElectronProcess(e)}await this.attachElectronProcess(),this.restartQueued&&(t=this.restartQueuedFile,this.restartQueuedFile=null)}while(this.restartQueued);this.restartInFlight=!1}async terminateElectronProcess(e){await In(e,{mode:`fast`})}queueMainRestart(e){e?this.mainRestartReason=e:this.mainRestartReason||=e,this.mainRestartQueued=!0,this.scheduleMainRestartFlush()}scheduleMainRestartFlush(){this.mainRestartFlushTimer&&clearTimeout(this.mainRestartFlushTimer),this.mainRestartFlushTimer=setTimeout(()=>{this.mainRestartFlushTimer=null,this.flushMainRestartQueue()},80)}async flushMainRestartQueue(){if(!(this.mainRestartFlushInFlight||!this.mainRestartQueued)){this.mainRestartFlushInFlight=!0;try{let e=this.mainRestartReason;this.mainRestartQueued=!1,this.mainRestartReason=null,await this.restartElectron(e)}finally{this.mainRestartFlushInFlight=!1,this.mainRestartQueued&&!this.mainRestartFlushTimer&&this.scheduleMainRestartFlush()}}}attachConfigWatcher(){let e=this.rendererServers.values().next().value;if(!e?.watcher)return;let t=e.watcher;for(let e of this.configPaths)t.add(e);t.on(`change`,e=>{this.configPaths.has(e)&&(this.shuttingDown||(this.configDebounce&&clearTimeout(this.configDebounce),this.configDebounce=setTimeout(()=>{this.configDebounce=null,ue(`Config file changed, restarting...`),(async()=>{await this.stop(),this.onRestart?.()})()},300)))})}};async function Vn(e,t){try{if(await i(e,`utf-8`)===t)return}catch{}await c(e,t)}async function Hn(e){await o(m(e,`generated/views`),{recursive:!0,force:!0}),await o(m(e,`generated/renderer-env.d.ts`),{force:!0})}async function Un(e){if(e.remoteDebuggingPort&&(process.env.REMOTE_DEBUGGING_PORT=e.remoteDebuggingPort),e.inspect){let t=typeof e.inspect==`number`?e.inspect:9229;process.env.NODE_OPTIONS=`--inspect=${t}`}if(e.inspectBrk){let t=typeof e.inspectBrk==`number`?e.inspectBrk:9229;process.env.NODE_OPTIONS=`--inspect-brk=${t}`}e.noSandbox&&(process.env.NO_SANDBOX=`1`),e[`--`]&&(process.env.ELECTRON_CLI_ARGS=JSON.stringify(e[`--`])),e.sourcemap&&Le(e.sourcemap),process.env.ELECTRO_MODE=`development`;let t=()=>new Bn(e.config,{logLevel:e.logLevel,clearScreen:e.clearScreen,rendererOnly:e.rendererOnly,sourcemap:e.sourcemap,outDir:e.outDir}),n=t(),r=!1,i=async(e=0)=>{r||(r=!0,await n.stop(),process.exit(e))};process.on(`SIGINT`,()=>{i(0)}),process.on(`SIGTERM`,()=>{i(0)});let a=async()=>{n.setOnRestart(()=>{n=t(),a()});try{await n.start()}catch(e){N(`Failed to start dev server: ${e instanceof Error?e.message:String(e)}`),await n.stop(),process.exit(1)}};await a(),await new Promise(()=>{})}async function Wn(e){let t=await G(e.config),n=t.root,i=m(n,e.output);console.log(`Loaded config`);let a=t.scanDir;console.log(`Scanning ${a}...`);let o=await g(a),s=t.views;W(s),console.log(`Found ${o.modules.length} module(s), ${o.windows.length} window(s), ${o.views.length} runtime view(s), ${s.length} build view(s)`);let{files:l,envTypes:d,packageTypes:_}=h({scanResult:o,views:s,outputDir:i,srcDir:a,packageTargets:s.map(e=>({packageRoot:U(e),viewId:e.id}))});console.log(`Generating ${l.length+1+_.length} file(s)...`),await Gn(i);for(let e of l){let t=m(i,e.path);await r(u(t),{recursive:!0}),await c(t,e.content),console.log(` ${p(n,t)}`)}let v=m(a,d.path);await r(u(v),{recursive:!0}),await c(v,d.content),console.log(` ${p(n,v)}`);for(let e of _){let t=f(e.packageRoot,e.path);await r(u(t),{recursive:!0}),await c(t,e.content),console.log(` ${p(n,t)}`)}console.log(`Done.`)}async function Gn(e){await o(m(e,`generated/views`),{recursive:!0,force:!0}),await o(m(e,`generated/renderer-env.d.ts`),{force:!0})}async function Kn(e){e.sourcemap&&Le(e.sourcemap),e.logLevel&&le(e.logLevel);let t=F();e.skipBuild?P(`Skipped build (--skip-build)`):await An(e);let n=await G(e.config),r=n.root,i=await ht(m(m(r,e.outDir),`main`)),a=u(n.config.runtime.__source),o=[...new Set([r,a,...n.views.map(e=>e.root)])],s=F();try{let e=await un({searchRoots:o,cwd:r,entry:i});I(`electron`,s()),z(`Preview ready in ${t()}`);let n=()=>e.kill();process.on(`SIGINT`,n),process.on(`SIGTERM`,n);let a=await e.exited??0;process.off(`SIGINT`,n),process.off(`SIGTERM`,n),a===0?R(`main`,`exited`):(R(`main`,`crashed (exit ${a})`),process.exit(1))}catch(e){L(`electron`,e instanceof Error?e.message:String(e)),process.exit(1)}}const $=t(`electro`);$.command(`generate`,`Generate preload scripts, runtime registry, and electro env types`).option(`-c, --config <path>`,`Path to electro.config.ts`,{default:`electro.config.ts`}).option(`-o, --output <dir>`,`Output directory`,{default:`.electro`}).action(Wn),$.command(`build`,`Build for production`).option(`-c, --config <path>`,`Path to electro.config.ts`,{default:`electro.config.ts`}).option(`-o, --outDir <dir>`,`Output directory`,{default:`dist`}).option(`--sourcemap <mode>`,`Sourcemap mode (linked | inline | external | none)`).option(`--minify`,`Minify output (default: true)`,{default:!0}).option(`--no-minify`,`Disable minification`).option(`--bytecode`,`Compile main/preload to V8 bytecode for source protection`).option(`-l, --logLevel <level>`,`Log level (info | warn | error | silent)`).action(An),$.command(`preview`,`Build and preview in Electron`).option(`-c, --config <path>`,`Path to electro.config.ts`,{default:`electro.config.ts`}).option(`-o, --outDir <dir>`,`Output directory`,{default:`dist`}).option(`--sourcemap <mode>`,`Sourcemap mode (linked | inline | external | none)`).option(`--minify`,`Minify output (default: true)`,{default:!0}).option(`--no-minify`,`Disable minification`).option(`--bytecode`,`Compile main/preload to V8 bytecode for source protection`).option(`--skip-build`,`Skip build step and launch from existing output`).option(`-l, --logLevel <level>`,`Log level (info | warn | error | silent)`).action(Kn),$.command(`dev`,`Start development server with Electron`).option(`--config <path>`,`Path to electro.config.ts`,{default:`electro.config.ts`}).option(`--clearScreen`,`Clear screen on rebuild`,{default:!0}).option(`--logLevel <level>`,`Log level (info | warn | error | silent)`).option(`--sourcemap <mode>`,`Sourcemap mode (linked | inline | external | none)`).option(`--outDir <dir>`,`Output directory override (default: .electro)`).option(`--inspect [port]`,`[boolean | number] enable V8 inspector on the specified port`).option(`--inspectBrk [port]`,`[boolean | number] enable V8 inspector on the specified port`).option(`--remoteDebuggingPort <port>`,`[string] port for remote debugging`).option(`--noSandbox`,`[boolean] forces renderer process to run un-sandboxed`).option(`--rendererOnly`,`[boolean] only dev server for the renderer`).action(Un),$.help(),$.version(ae),$.parse();export{};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@electrojs/cli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.8",
|
|
4
4
|
"description": "CLI for ElectroJS dev, code generation, build, and preview in Electron apps",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"build-tool",
|
|
@@ -49,14 +49,14 @@
|
|
|
49
49
|
"devDependencies": {
|
|
50
50
|
"tsdown": "^0.21.4",
|
|
51
51
|
"vitest": "^4.1.1",
|
|
52
|
-
"@electrojs/codegen": "1.0.
|
|
53
|
-
"@electrojs/runtime": "1.0.
|
|
54
|
-
"@electrojs/config": "1.0.
|
|
52
|
+
"@electrojs/codegen": "1.0.8",
|
|
53
|
+
"@electrojs/runtime": "1.0.8",
|
|
54
|
+
"@electrojs/config": "1.0.8"
|
|
55
55
|
},
|
|
56
56
|
"peerDependencies": {
|
|
57
|
-
"@electrojs/codegen": "1.0.
|
|
58
|
-
"@electrojs/config": "1.0.
|
|
59
|
-
"@electrojs/runtime": "1.0.
|
|
57
|
+
"@electrojs/codegen": "1.0.8",
|
|
58
|
+
"@electrojs/config": "1.0.8",
|
|
59
|
+
"@electrojs/runtime": "1.0.8",
|
|
60
60
|
"@types/node": "^25.5.0",
|
|
61
61
|
"electron": ">=41",
|
|
62
62
|
"vite": "^8.0.2"
|