@electrojs/cli 1.0.3 → 1.0.5

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 +11 -8
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.3`;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`)?`generated${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(`
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.5`;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`)?`generated${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
3
  `))}return a?{code:a.toString(),map:i?a.generateMap({hires:`boundary`}):null}:null}}}function gt(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 _t(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(!mt.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 vt=/__filename|__dirname|require\(|require\.resolve\(/,yt=`
4
4
  // -- CommonJS Shims --
5
5
  import __cjs_url__ from "node:url";
package/package.json CHANGED
@@ -1,12 +1,15 @@
1
1
  {
2
2
  "name": "@electrojs/cli",
3
- "version": "1.0.3",
4
- "description": "CLI for @electro dev server, build, and code generation commands",
3
+ "version": "1.0.5",
4
+ "description": "CLI for ElectroJS dev, code generation, build, and preview in Electron apps",
5
5
  "keywords": [
6
6
  "build-tool",
7
7
  "cli",
8
+ "codegen",
8
9
  "dev-server",
10
+ "electrojs",
9
11
  "electron",
12
+ "typescript",
10
13
  "vite"
11
14
  ],
12
15
  "homepage": "https://electrojs.myraxbyte.dev/",
@@ -46,14 +49,14 @@
46
49
  "devDependencies": {
47
50
  "tsdown": "^0.21.4",
48
51
  "vitest": "^4.1.1",
49
- "@electrojs/codegen": "1.0.3",
50
- "@electrojs/config": "1.0.3",
51
- "@electrojs/runtime": "1.0.3"
52
+ "@electrojs/config": "1.0.5",
53
+ "@electrojs/codegen": "1.0.5",
54
+ "@electrojs/runtime": "1.0.5"
52
55
  },
53
56
  "peerDependencies": {
54
- "@electrojs/codegen": "1.0.3",
55
- "@electrojs/config": "1.0.3",
56
- "@electrojs/runtime": "1.0.3",
57
+ "@electrojs/codegen": "1.0.5",
58
+ "@electrojs/config": "1.0.5",
59
+ "@electrojs/runtime": "1.0.5",
57
60
  "@types/node": "^25.5.0",
58
61
  "electron": ">=41",
59
62
  "vite": "^8.0.2"