@electrojs/cli 1.0.8 → 1.0.9

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.
Files changed (2) hide show
  1. package/dist/index.mjs +1 -1
  2. package/package.json +7 -7
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
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.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`)?`generated${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(`
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.9`;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`)?`generated${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
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";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@electrojs/cli",
3
- "version": "1.0.8",
3
+ "version": "1.0.9",
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.8",
53
- "@electrojs/runtime": "1.0.8",
54
- "@electrojs/config": "1.0.8"
52
+ "@electrojs/config": "1.0.9",
53
+ "@electrojs/runtime": "1.0.9",
54
+ "@electrojs/codegen": "1.0.9"
55
55
  },
56
56
  "peerDependencies": {
57
- "@electrojs/codegen": "1.0.8",
58
- "@electrojs/config": "1.0.8",
59
- "@electrojs/runtime": "1.0.8",
57
+ "@electrojs/codegen": "1.0.9",
58
+ "@electrojs/config": "1.0.9",
59
+ "@electrojs/runtime": "1.0.9",
60
60
  "@types/node": "^25.5.0",
61
61
  "electron": ">=41",
62
62
  "vite": "^8.0.2"