@incajs/cli 0.0.2 → 0.0.4

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/cli.js CHANGED
@@ -1,69 +1,107 @@
1
- import { i as e, n as t, o as n, r, t as i } from "./chunks/defaults-EWjAFeZ3.js";
2
- import { existsSync as a } from "node:fs";
3
- import { chmod as o, cp as s, mkdir as c, readFile as l, readdir as u, rm as d, writeFile as f } from "node:fs/promises";
4
- import p from "node:path";
5
- import { build as m } from "vite";
6
- import h from "@vitejs/plugin-vue";
7
- import { createRequire as g } from "node:module";
8
- import { spawn as _ } from "node:child_process";
9
- import { once as v } from "node:events";
10
- import y from "node:readline";
11
- import { setTimeout as b } from "node:timers/promises";
12
- //#region src/config/loader.mts
13
- async function x(e) {
14
- let { config: t } = await n({
1
+ import { i as e, n as t, o as n, r, t as i } from "./chunks/defaults-DNvHueCI.js";
2
+ import a from "node:path";
3
+ import { existsSync as o } from "node:fs";
4
+ import { chmod as s, cp as c, link as l, mkdir as u, readFile as d, readdir as f, rm as p, writeFile as m } from "node:fs/promises";
5
+ import { styleText as h } from "node:util";
6
+ import { build as g } from "vite";
7
+ import _ from "@vitejs/plugin-vue";
8
+ import { createRequire as v } from "node:module";
9
+ import { spawn as y } from "node:child_process";
10
+ import { once as b } from "node:events";
11
+ import x from "node:readline";
12
+ import { setTimeout as ee } from "node:timers/promises";
13
+ //#region src/error.mts
14
+ var S = class extends Error {
15
+ code;
16
+ name = "IncaError";
17
+ constructor(e, t) {
18
+ super(t), this.code = e;
19
+ }
20
+ }, te = {
21
+ name: "inca",
22
+ packageJson: "inca",
23
+ rcFile: !1,
24
+ globalRc: !1,
25
+ giget: !1,
26
+ extend: !1
27
+ }, ne = /[/\\:*?"<>|\0]/;
28
+ function re(e) {
29
+ return e === e.trim() && e !== "" && e !== "." && e !== ".." && !ne.test(e);
30
+ }
31
+ function C(e) {
32
+ if (!(typeof e == "string" && re(e))) throw new S("ERR_INCA_PRODUCT_NAME_INVALID", `${JSON.stringify(e)} can't name a directory — set a "productName" in inca.config.ts with no leading or trailing space, and none of \`/\\:*?"<>|\``);
33
+ }
34
+ async function w(e) {
35
+ let { config: t, layers: r } = await n({
15
36
  cwd: e,
16
- name: "inca",
17
- packageJson: "inca",
18
- rcFile: !1,
19
- globalRc: !1,
20
- giget: !1,
21
- extend: !1
22
- });
37
+ ...te
38
+ }), i = r?.find((e) => e.configFile === "package.json");
23
39
  return {
24
- entry: t.entry ? p.resolve(e, t.entry) : void 0,
25
- outDir: p.resolve(e, t.outDir ?? i.outDir)
40
+ config: t,
41
+ usedPackageJsonKey: Object.keys(i?.config ?? {}).length > 0
26
42
  };
27
43
  }
28
- async function S(e) {
29
- let o = p.join(e, "package.json"), s;
44
+ async function T(e) {
45
+ let { config: t } = await w(e);
46
+ return {
47
+ entry: t.entry ? a.resolve(e, t.entry) : void 0,
48
+ outDir: a.resolve(e, t.outDir ?? i.outDir)
49
+ };
50
+ }
51
+ async function E(e) {
52
+ let n = a.join(e, "package.json"), s;
30
53
  try {
31
- s = await l(o, "utf8");
54
+ s = await d(n, "utf8");
32
55
  } catch {
33
- throw Error(`no package.json found at ${o}`);
56
+ throw new S("ERR_INCA_PACKAGE_JSON_NOT_FOUND", `no package.json found at ${n}`);
34
57
  }
35
- let c = JSON.parse(s), { config: u, layers: d } = await n({
36
- cwd: e,
37
- name: "inca",
38
- packageJson: "inca",
39
- rcFile: !1,
40
- globalRc: !1,
41
- giget: !1,
42
- extend: !1
43
- }), f = d?.find((e) => e.configFile === "package.json"), m = Object.keys(f?.config ?? {}).length > 0, h = u.productName ?? r(c.name);
44
- if (!h) throw Error(`${o} needs a "name", or "productName" in inca.config.ts`);
45
- let g = u.version ?? c.version ?? i.version, _ = u.identifier ?? t(h), v;
46
- if (u.icon && (v = p.resolve(e, u.icon), !a(v))) throw Error(`"icon" points to ${v}, which doesn't exist`);
47
- let y = u.entry ? p.resolve(e, u.entry) : void 0, b = p.resolve(e, u.outDir ?? i.outDir);
58
+ let c = JSON.parse(s), { config: l, usedPackageJsonKey: u } = await w(e), f = l.productName ?? r(c.name);
59
+ if (!f) throw new S("ERR_INCA_PRODUCT_NAME_MISSING", `${n} needs a "name", or "productName" in inca.config.ts`);
60
+ C(f);
61
+ let p = l.version ?? c.version ?? i.version, m = l.identifier ?? t(f), h;
62
+ if (l.icon && (h = a.resolve(e, l.icon), !o(h))) throw new S("ERR_INCA_ICON_NOT_FOUND", `"icon" points to ${h}, which doesn't exist`);
63
+ let g = l.entry ? a.resolve(e, l.entry) : void 0, _ = a.resolve(e, l.outDir ?? i.outDir);
48
64
  return {
49
- productName: h,
50
- identifier: _,
51
- identifierIsDefault: u.identifier === void 0,
52
- version: g,
53
- icon: v,
54
- entry: y,
55
- outDir: b,
56
- usedPackageJsonKey: m
65
+ productName: f,
66
+ identifier: m,
67
+ identifierIsDefault: l.identifier === void 0,
68
+ version: p,
69
+ icon: h,
70
+ window: l.window,
71
+ entry: g,
72
+ outDir: _,
73
+ usedPackageJsonKey: u
57
74
  };
58
75
  }
76
+ function D(e) {
77
+ return {
78
+ name: e.productName,
79
+ identifier: e.identifier,
80
+ window: e.window
81
+ };
82
+ }
83
+ async function O(e) {
84
+ let { config: n } = await w(e), i = {};
85
+ try {
86
+ i = JSON.parse(await d(a.join(e, "package.json"), "utf8"));
87
+ } catch {}
88
+ let o = n.productName ?? r(i.name);
89
+ o && C(o);
90
+ let s = {
91
+ name: o,
92
+ identifier: n.identifier ?? (o ? t(o) : void 0),
93
+ window: n.window
94
+ };
95
+ return Object.values(s).some((e) => e !== void 0) ? s : void 0;
96
+ }
59
97
  //#endregion
60
98
  //#region src/adapter/vite/captureOutput.mts
61
- function C(e) {
99
+ function ie(e) {
62
100
  return {
63
101
  name: "inca:capture-output",
64
102
  writeBundle(t, n) {
65
103
  let r = Object.keys(n), i = Object.values(n).find((e) => e.type === "chunk" && e.isEntry);
66
- if (!i) throw Error("inca: build produced no entry chunk");
104
+ if (!i) throw new S("ERR_INCA_BUILD_NO_ENTRY_CHUNK", "build produced no entry chunk");
67
105
  e({
68
106
  entryFile: i.fileName,
69
107
  files: r
@@ -72,22 +110,94 @@ function C(e) {
72
110
  };
73
111
  }
74
112
  //#endregion
113
+ //#region src/adapter/vite/emitConfig.mts
114
+ var ae = "inca.json";
115
+ function oe(e) {
116
+ let t = JSON.stringify(e, void 0, 2), n = t === void 0 || t === "{}";
117
+ return {
118
+ name: "inca:emit-config",
119
+ generateBundle() {
120
+ n || this.emitFile({
121
+ type: "asset",
122
+ fileName: ae,
123
+ source: `${t}\n`
124
+ });
125
+ }
126
+ };
127
+ }
128
+ //#endregion
129
+ //#region src/adapter/vite/logger.mts
130
+ var se = "Build failed with ";
131
+ function k(e, t) {
132
+ let n = /* @__PURE__ */ new WeakSet(), r = /* @__PURE__ */ new Set(), i = {
133
+ hasWarned: !1,
134
+ info(t) {
135
+ e.write(`${t}\n`);
136
+ },
137
+ warn(e) {
138
+ i.hasWarned = !0, t.write(`${e}\n`);
139
+ },
140
+ warnOnce(e) {
141
+ r.has(e) || (r.add(e), i.warn(e));
142
+ },
143
+ error(e, r) {
144
+ i.hasWarned = !0, r?.error && n.add(r.error), !e.includes(se) && t.write(`${e.replace(/\n\s+at .*/g, "")}\n`);
145
+ },
146
+ clearScreen() {},
147
+ hasErrorLogged(e) {
148
+ return n.has(e);
149
+ }
150
+ };
151
+ return i;
152
+ }
153
+ //#endregion
154
+ //#region src/adapter/vite/unsupported.mts
155
+ var ce = /\.(?:css|pcss|postcss|sass|scss|less|styl|stylus)(?:\?|$)/, le = [{
156
+ code: "ERR_INCA_UNSUPPORTED_STYLE",
157
+ name: "a <style> block",
158
+ matches: (e) => e.includes("vue&type=style"),
159
+ hint: "the renderer applies no stylesheet — use a :style binding instead"
160
+ }, {
161
+ code: "ERR_INCA_UNSUPPORTED_STYLESHEET",
162
+ name: "a stylesheet import",
163
+ matches: (e) => ce.test(e),
164
+ hint: "the renderer applies no stylesheet — use a :style binding instead"
165
+ }];
166
+ function ue(e = le) {
167
+ return {
168
+ name: "inca:reject-unsupported",
169
+ enforce: "pre",
170
+ transform(t, n) {
171
+ let r = e.find((e) => e.matches(n));
172
+ if (!r) return null;
173
+ let i = a.relative(process.cwd(), n.split("?")[0] ?? n);
174
+ throw new S(r.code, `${r.code}: ${i} uses ${r.name}, unsupported for now: ${r.hint}`);
175
+ }
176
+ };
177
+ }
178
+ //#endregion
75
179
  //#region src/adapter/vite/config.mts
76
- var w = "bundle.js";
77
- function T({ entry: e, outDir: t, mode: n, watch: r, onOutput: i }) {
180
+ var de = "bundle.js";
181
+ function A({ entry: e, outDir: t, mode: n, watch: r, onOutput: i, stdout: o, stderr: s, quiet: c, runtimeConfig: l }) {
78
182
  return {
79
183
  configFile: !1,
80
- root: p.dirname(e),
184
+ root: a.dirname(e),
81
185
  mode: n,
82
186
  clearScreen: !1,
83
- logLevel: "silent",
187
+ logLevel: c ? "silent" : "info",
188
+ customLogger: k(o, s),
84
189
  define: { "process.env.NODE_ENV": JSON.stringify(n) },
85
- plugins: [h({ template: { compilerOptions: { runtimeModuleName: "@vue/runtime-core" } } }), C(i)],
190
+ plugins: [
191
+ _({ template: { compilerOptions: { runtimeModuleName: "@vue/runtime-core" } } }),
192
+ ue(),
193
+ oe(l),
194
+ ie(i)
195
+ ],
86
196
  build: {
87
197
  lib: {
88
198
  entry: e,
89
199
  formats: ["es"],
90
- fileName: () => w
200
+ fileName: () => de
91
201
  },
92
202
  outDir: t,
93
203
  emptyOutDir: n === "production",
@@ -102,138 +212,94 @@ function T({ entry: e, outDir: t, mode: n, watch: r, onOutput: i }) {
102
212
  }
103
213
  //#endregion
104
214
  //#region src/adapter/vite/build.mts
105
- async function E({ entry: e, outDir: t }) {
106
- let n;
107
- if (await m(T({
215
+ async function fe({ entry: e, outDir: t, runtimeConfig: n, stdout: r = process.stdout, stderr: i = process.stderr, quiet: o = !1 }) {
216
+ let s;
217
+ if (await g(A({
108
218
  entry: e,
109
219
  outDir: t,
220
+ runtimeConfig: n,
110
221
  mode: "production",
111
222
  watch: !1,
223
+ stdout: r,
224
+ stderr: i,
225
+ quiet: o,
112
226
  onOutput: (e) => {
113
- n = {
227
+ s = {
114
228
  outDir: t,
115
- entryFile: p.join(t, e.entryFile),
229
+ entryFile: a.join(t, e.entryFile),
116
230
  files: e.files
117
231
  };
118
232
  }
119
- })), !n) throw Error("inca: build produced no output");
120
- return n;
121
- }
122
- //#endregion
123
- //#region src/adapter/vite/watch.mts
124
- async function D({ onBuild: e, onError: t, ...n }) {
125
- let { outDir: r } = n, i = await m(T({
126
- ...n,
127
- watch: !0,
128
- onOutput: (t) => {
129
- e({
130
- outDir: r,
131
- entryFile: p.join(r, t.entryFile),
132
- files: t.files
133
- });
134
- }
135
- }));
136
- return i.on("event", (e) => {
137
- e.code === "ERROR" && t({
138
- message: e.error.message,
139
- stack: e.error.stack ?? null
140
- });
141
- }), { close: () => i.close() };
142
- }
143
- //#endregion
144
- //#region src/defaultBundler.mts
145
- var O = {
146
- watch: D,
147
- build: E
148
- };
149
- //#endregion
150
- //#region src/entry.mts
151
- async function k(e) {
152
- let t = p.join(e, "src/main.mts");
153
- if (a(t)) return t;
154
- let n = p.join(e, "src/App.vue");
155
- if (a(n)) return A(n, e);
156
- throw Error(`no app entry found — expected ${t} or ${n}`);
157
- }
158
- async function A(e, t) {
159
- let n = p.join(t, "node_modules/.inca");
160
- await c(n, { recursive: !0 });
161
- let r = p.join(n, "entry.mts"), i = JSON.stringify(e.split(p.sep).join("/"));
162
- return await f(r, `import { createIncaApp } from "incajs/vue";\nimport App from ${i};\ncreateIncaApp(App).mount();\n`), r;
163
- }
164
- //#endregion
165
- //#region src/build.mts
166
- async function j(e = {}) {
167
- let t = e.cwd ?? process.cwd(), n = e.config ?? await x(t), r = n.outDir, i = e.bundler ?? O, a = e.entry ?? n.entry ?? await k(t);
168
- return i.build({
169
- entry: a,
170
- outDir: r
171
- });
233
+ })), !s) throw new S("ERR_INCA_BUILD_NO_OUTPUT", "build produced no output");
234
+ return s;
172
235
  }
173
236
  //#endregion
174
237
  //#region src/dev-client/hostBin.mts
175
- var M = "INCA_HOST_BIN";
176
- function N() {
238
+ var j = "INCA_HOST_BIN";
239
+ function M() {
177
240
  let e = process.platform === "darwin" || process.platform === "linux" ? process.platform : void 0, t = process.arch === "arm64" || process.arch === "x64" ? process.arch : void 0;
178
241
  return e && t ? `@incajs/host-${e}-${t}` : void 0;
179
242
  }
180
- function P() {
181
- let e = N();
243
+ function pe() {
244
+ let e = M();
182
245
  if (e) try {
183
- return g(import.meta.url).resolve(`${e}/bin/inca-host`);
246
+ return v(import.meta.url).resolve(`${e}/bin/inca-host`);
184
247
  } catch {
185
248
  return;
186
249
  }
187
250
  }
188
- function F() {
189
- let e = process.env[M];
251
+ function N() {
252
+ let e = process.env[j];
190
253
  if (e) return e;
191
- let t = P();
254
+ let t = pe();
192
255
  if (t) return t;
193
- let n = N(), r = n ? `no ${n} package is installed for it` : `this platform (${process.platform}/${process.arch}) has no published package`;
194
- throw Error(`no inca-host binary found — ${r}, and ${M} isn't set to one`);
256
+ let n = M();
257
+ throw new S("ERR_INCA_HOST_BIN_UNRESOLVED", `no inca-host binary found — ${n ? `no ${n} package is installed for it` : `this platform (${process.platform}/${process.arch}) has no published package`}, and ${j} isn't set to one`);
195
258
  }
196
259
  //#endregion
197
260
  //#region src/dev-client/hostError.mts
198
- var I = class extends Error {
261
+ var P = class extends Error {
199
262
  code;
200
263
  hostStack;
201
264
  constructor(e, t, n = null) {
202
265
  super(e), this.code = t, this.hostStack = n, this.name = "HostError";
203
266
  }
204
267
  };
205
- function L(e) {
268
+ function F(e) {
206
269
  return typeof e == "object" && !!e && e.jsonrpc === "2.0";
207
270
  }
208
271
  //#endregion
209
272
  //#region src/dev-client/hostClient.mts
210
- var R = (e) => {
273
+ var I = (e) => {
211
274
  process.stderr.write(e.endsWith("\n") ? e : `${e}\n`);
212
- }, z = class {
275
+ }, L = class {
213
276
  #e;
214
277
  #t;
215
278
  #n = 1;
216
279
  #r = /* @__PURE__ */ new Map();
280
+ #i = !1;
217
281
  constructor(e) {
218
282
  this.#e = e;
219
283
  }
220
284
  async start() {
221
- let e = this.#e.hostBin ?? F(), t = _(e, ["--dev", this.#e.entryFile], { stdio: [
285
+ let e = this.#e.hostBin ?? N(), t = y(e, ["--dev", this.#e.entryFile], { stdio: [
222
286
  "pipe",
223
287
  "pipe",
224
288
  "pipe"
225
289
  ] });
226
290
  this.#t = t;
227
- let n = this.#e.onStderr ?? R;
228
- t.stderr.setEncoding("utf8"), t.stderr.on("data", (e) => n(e)), y.createInterface({ input: t.stdout }).on("line", (e) => {
229
- this.#i(e, n);
291
+ let n = this.#e.onStderr ?? I;
292
+ t.stderr.setEncoding("utf8"), t.stderr.on("data", (e) => n(e)), t.stdin.on("error", (e) => {
293
+ e.code !== "EPIPE" && n(`inca-host stdin: ${e.message}\n`);
294
+ }), x.createInterface({ input: t.stdout }).on("line", (e) => {
295
+ this.#a(e, n);
230
296
  }), t.on("exit", (e, t) => {
231
297
  let n = /* @__PURE__ */ Error(`inca-host exited (code=${String(e)}, signal=${String(t)}) before answering`);
232
298
  for (let { reject: e } of this.#r.values()) e(n);
233
- this.#r.clear();
234
- }), await v(t, "spawn");
299
+ this.#r.clear(), this.#i || this.#e.onExit?.(e, t);
300
+ }), await b(t, "spawn");
235
301
  }
236
- #i(e, t) {
302
+ #a(e, t) {
237
303
  let n;
238
304
  try {
239
305
  n = JSON.parse(e);
@@ -241,23 +307,23 @@ var R = (e) => {
241
307
  t(`[stray stdout] ${e}`);
242
308
  return;
243
309
  }
244
- if (!L(n)) {
310
+ if (!F(n)) {
245
311
  t(`[stray stdout] ${e}`);
246
312
  return;
247
313
  }
248
314
  if ("method" in n) {
249
- this.#a(n.method, n.params, t);
315
+ this.#o(n.method, n.params, t);
250
316
  return;
251
317
  }
252
318
  let r = this.#r.get(n.id);
253
- r && (this.#r.delete(n.id), "error" in n ? r.reject(new I(n.error.message, n.error.code, n.error.data?.stack ?? null)) : r.resolve(n.result));
319
+ r && (this.#r.delete(n.id), "error" in n ? r.reject(new P(n.error.message, n.error.code, n.error.data?.stack ?? null)) : r.resolve(n.result));
254
320
  }
255
- #a(e, t, n) {
321
+ #o(e, t, n) {
256
322
  switch (e) {
257
323
  case "ready": {
258
324
  let { protocol: e } = t;
259
325
  if (e !== 0) {
260
- n(`inca-host speaks protocol ${String(e)}, this package was built for 0 — stopping it rather than carrying on`), this.#t && this.#o(this.#t);
326
+ n(`inca-host speaks protocol ${String(e)}, this package was built for 0 — stopping it rather than carrying on`), this.#t && this.#s(this.#t);
261
327
  return;
262
328
  }
263
329
  this.#e.onReady?.();
@@ -272,8 +338,9 @@ var R = (e) => {
272
338
  }
273
339
  }
274
340
  }
275
- async #o(e) {
276
- let t = v(e, "exit");
341
+ async #s(e) {
342
+ this.#i = !0;
343
+ let t = b(e, "exit");
277
344
  e.kill(), await t;
278
345
  }
279
346
  async call(e, t) {
@@ -289,215 +356,394 @@ var R = (e) => {
289
356
  this.#r.set(r, {
290
357
  resolve: e,
291
358
  reject: t
292
- }), n.stdin.write(`${i}\n`);
359
+ }), n.stdin.write(`${i}\n`, (e) => {
360
+ e && (this.#r.delete(r), t(e));
361
+ });
293
362
  });
294
363
  }
295
364
  async stop(e = 2e3) {
296
365
  let t = this.#t;
297
366
  if (!t || t.exitCode !== null || t.signalCode !== null) return;
298
- let n = v(t, "exit");
299
- this.call("shutdown").catch(() => {}), await Promise.race([n.then(() => "exited"), b(e).then(() => "timeout")]) === "timeout" && (t.kill(), await n);
367
+ this.#i = !0;
368
+ let n = b(t, "exit");
369
+ this.call("shutdown").catch(() => {}), await Promise.race([n.then(() => "exited"), ee(e).then(() => "timeout")]) === "timeout" && (t.kill(), await n);
300
370
  }
301
- };
302
- //#endregion
303
- //#region src/fault.mts
304
- function B(e) {
305
- return e instanceof I ? {
371
+ }, R = "[inca]", z = new Intl.DateTimeFormat(void 0, {
372
+ hour: "numeric",
373
+ minute: "numeric",
374
+ second: "numeric"
375
+ });
376
+ function B(e, t, n) {
377
+ let r = h(["bold", n], R, { stream: e });
378
+ return t.timestamp ? `${h("dim", z.format(/* @__PURE__ */ new Date()), { stream: e })} ${r}` : r;
379
+ }
380
+ function V(e, t, n = {}) {
381
+ e.write(`${B(e, n, "cyan")} ${t}\n`);
382
+ }
383
+ function H(e) {
384
+ let t = e.code;
385
+ return typeof t == "string" ? t : null;
386
+ }
387
+ function me(e) {
388
+ return /\bERR_INCA_[A-Z0-9_]+/.exec(e)?.[0] ?? null;
389
+ }
390
+ function he(e) {
391
+ let t = e.stack;
392
+ if (!t) return null;
393
+ for (let n of [`${e.name}: ${e.message}`, e.message]) if (t.startsWith(n)) return t.slice(n.length).replace(/^\r?\n/, "") || null;
394
+ return t;
395
+ }
396
+ function ge(e) {
397
+ let t = /^(?:\w*Error: )?(ERR_INCA_[A-Z0-9_]+): /.exec(e);
398
+ return t ? {
399
+ message: e.slice(t[0].length),
400
+ stack: null,
401
+ code: t[1]
402
+ } : {
403
+ message: e.replace(/^\w*Error: /, ""),
404
+ stack: null,
405
+ code: null
406
+ };
407
+ }
408
+ function U(e) {
409
+ return e instanceof P ? {
306
410
  message: e.message,
307
- stack: e.hostStack
411
+ stack: e.hostStack,
412
+ code: H(e)
308
413
  } : e instanceof Error ? {
309
414
  message: e.message,
310
- stack: e.stack ?? null
415
+ stack: he(e),
416
+ code: H(e) ?? me(e.message)
311
417
  } : {
312
418
  message: String(e),
313
- stack: null
419
+ stack: null,
420
+ code: null
314
421
  };
315
422
  }
316
- function V(e, t, n) {
317
- e.write(`[inca] ${t}: ${n.message}\n`), n.stack && e.write(`${n.stack}\n`);
423
+ function W(e, t, n, r = {}) {
424
+ let i = n.code ? ` (${h("bold", n.code, { stream: e })})` : "";
425
+ e.write(`${B(e, r, "red")} ${t}${i}: ${n.message}\n`), n.stack && e.write(`${n.stack}\n`);
426
+ }
427
+ //#endregion
428
+ //#region src/adapter/vite/watch.mts
429
+ async function _e({ onBuild: e, onError: t, stdout: n = process.stdout, stderr: r = process.stderr, quiet: i = !1, ...o }) {
430
+ let { outDir: s } = o, c, l = await g(A({
431
+ ...o,
432
+ watch: !0,
433
+ stdout: n,
434
+ stderr: r,
435
+ quiet: i,
436
+ onOutput: (t) => {
437
+ e({
438
+ outDir: s,
439
+ entryFile: a.join(s, t.entryFile),
440
+ files: t.files,
441
+ changed: c
442
+ }), c = void 0;
443
+ }
444
+ }));
445
+ return l.on("change", (e) => {
446
+ c ??= {
447
+ file: e,
448
+ at: Date.now()
449
+ };
450
+ }), l.on("event", (e) => {
451
+ if (e.code !== "ERROR") return;
452
+ c = void 0;
453
+ let { errors: n } = e.error;
454
+ t(ge(n?.[0]?.message ?? e.error.message));
455
+ }), { close: () => l.close() };
456
+ }
457
+ //#endregion
458
+ //#region src/defaultBundler.mts
459
+ var G = {
460
+ watch: _e,
461
+ build: fe
462
+ };
463
+ //#endregion
464
+ //#region src/entry.mts
465
+ async function K(e) {
466
+ let t = a.join(e, "src/main.mts");
467
+ if (o(t)) return t;
468
+ let n = a.join(e, "src/App.vue");
469
+ if (o(n)) return ve(n, e);
470
+ throw new S("ERR_INCA_ENTRY_NOT_FOUND", `no app entry found — expected ${t} or ${n}`);
471
+ }
472
+ async function ve(e, t) {
473
+ let n = a.join(t, "node_modules/.inca");
474
+ await u(n, { recursive: !0 });
475
+ let r = a.join(n, "entry.mts"), i = JSON.stringify(e.split(a.sep).join("/"));
476
+ return await m(r, `import { createIncaApp } from "incajs/vue";\nimport App from ${i};\ncreateIncaApp(App).mount();\n`), r;
477
+ }
478
+ //#endregion
479
+ //#region src/build.mts
480
+ async function q(e = {}) {
481
+ let t = e.cwd ?? process.cwd(), n = e.config ?? await T(t), r = n.outDir, i = e.bundler ?? G, a = e.entry ?? n.entry ?? await K(t), o = e.runtimeConfig ?? await O(t);
482
+ return i.build({
483
+ entry: a,
484
+ outDir: r,
485
+ runtimeConfig: o,
486
+ stdout: e.stdout,
487
+ stderr: e.stderr
488
+ });
489
+ }
490
+ //#endregion
491
+ //#region src/dev-lock.mts
492
+ function J(e) {
493
+ return a.join(e, "node_modules/.inca/dev.pid");
494
+ }
495
+ function ye(e) {
496
+ try {
497
+ return process.kill(e, 0), !0;
498
+ } catch (e) {
499
+ return e.code === "EPERM";
500
+ }
501
+ }
502
+ async function be(e) {
503
+ let t = J(e), n = Number.parseInt(await d(t, "utf8").catch(() => ""), 10);
504
+ if (Number.isInteger(n) && ye(n)) throw new S("ERR_INCA_DEV_RUNNING", `inca dev is already running for this app (pid ${String(n)})`);
505
+ return await u(a.dirname(t), { recursive: !0 }), await m(t, String(process.pid)), () => p(t, { force: !0 });
506
+ }
507
+ //#endregion
508
+ //#region src/plist.mts
509
+ function Y(e) {
510
+ return e.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;");
511
+ }
512
+ function xe(e) {
513
+ return typeof e == "boolean" ? e ? "<true/>" : "<false/>" : `<string>${Y(e)}</string>`;
514
+ }
515
+ function Se(e) {
516
+ return `<?xml version="1.0" encoding="UTF-8"?>
517
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
518
+ <plist version="1.0">
519
+ <dict>
520
+ ${Object.entries(e).map(([e, t]) => `\t<key>${Y(e)}</key>\n\t${xe(t)}`).join("\n")}\n</dict>
521
+ </plist>
522
+ `;
523
+ }
524
+ //#endregion
525
+ //#region src/macos-app.mts
526
+ async function X(e) {
527
+ let { appPath: t, metadata: n, hostBin: r } = e;
528
+ await p(t, {
529
+ recursive: !0,
530
+ force: !0
531
+ });
532
+ let i = a.join(t, "Contents"), o = a.join(i, "MacOS"), d = a.join(i, "Resources");
533
+ await u(o, { recursive: !0 }), await u(d, { recursive: !0 });
534
+ let f = a.join(o, n.productName);
535
+ e.link ? await l(r, f).catch(() => c(r, f)) : await c(r, f), await s(f, 493);
536
+ let h = {
537
+ CFBundleName: n.productName,
538
+ CFBundleDisplayName: n.productName,
539
+ CFBundleExecutable: n.productName,
540
+ CFBundleIdentifier: n.identifier,
541
+ CFBundleVersion: n.version,
542
+ CFBundleShortVersionString: n.version,
543
+ CFBundlePackageType: "APPL",
544
+ CFBundleInfoDictionaryVersion: "6.0",
545
+ NSHighResolutionCapable: !0
546
+ };
547
+ if (n.icon) {
548
+ let e = a.basename(n.icon);
549
+ await c(n.icon, a.join(d, e)), h.CFBundleIconFile = e;
550
+ }
551
+ return await m(a.join(i, "Info.plist"), Se(h)), await m(a.join(i, "PkgInfo"), "APPL????"), {
552
+ appPath: t,
553
+ executablePath: f,
554
+ resourcesDir: d
555
+ };
318
556
  }
319
557
  //#endregion
320
558
  //#region src/dev.mts
321
- async function H(e, t) {
559
+ var Z = { timestamp: !0 }, Ce = ["ERR_INCA_PACKAGE_JSON_NOT_FOUND", "ERR_INCA_PRODUCT_NAME_MISSING"];
560
+ async function we(e, t) {
561
+ try {
562
+ return await E(e);
563
+ } catch (e) {
564
+ if (!(e instanceof S) || !Ce.includes(e.code)) throw e;
565
+ V(t, `running unnamed — ${e.message}`, Z);
566
+ return;
567
+ }
568
+ }
569
+ async function Te(e, t, n, r) {
570
+ if (process.platform === "darwin" && t) try {
571
+ return (await X({
572
+ appPath: a.join(e, "node_modules/.inca", `${t.productName}.app`),
573
+ metadata: t,
574
+ hostBin: n ?? N(),
575
+ link: !0
576
+ })).executablePath;
577
+ } catch (e) {
578
+ V(r, `running unbundled — ${U(e).message}`, Z);
579
+ return;
580
+ }
581
+ }
582
+ async function Ee(e, t) {
322
583
  let n = new Set(t), r;
323
584
  try {
324
- r = await u(e, {
585
+ r = await f(e, {
325
586
  recursive: !0,
326
587
  withFileTypes: !0
327
588
  });
328
589
  } catch {
329
590
  return;
330
591
  }
331
- await Promise.all(r.filter((e) => e.isFile()).map((t) => p.relative(e, p.join(t.parentPath, t.name))).filter((e) => !n.has(e)).map((t) => d(p.join(e, t), { force: !0 })));
592
+ await Promise.all(r.filter((e) => e.isFile()).map((t) => a.relative(e, a.join(t.parentPath, t.name))).filter((e) => !n.has(e)).map((t) => p(a.join(e, t), { force: !0 })));
332
593
  }
333
- async function U(e) {
334
- let t = e.cwd ?? process.cwd(), n = await x(t), r = n.outDir, i = e.bundler ?? O, a = e.stdout ?? process.stdout, o = e.stderr ?? process.stderr, s = e.entry ?? n.entry ?? await k(t), c, l = !1, u = !1, d = Promise.resolve();
335
- async function f() {
336
- try {
337
- await c?.call("reload");
338
- } catch (e) {
339
- V(o, "reload failed", B(e));
340
- }
341
- }
342
- async function p(t) {
343
- if (await H(t.outDir, t.files), !c) {
344
- let n = new z({
345
- entryFile: t.entryFile,
346
- hostBin: e.hostBin,
347
- onStderr: (e) => o.write(e),
348
- onReady: () => {
349
- l = !0, a.write("[inca] ready\n"), u && (u = !1, f());
350
- },
351
- onAppError: (e) => V(o, "app error", e)
352
- });
594
+ async function De(e) {
595
+ let t = e.cwd ?? process.cwd(), n = await T(t), r = await be(t);
596
+ try {
597
+ let r = n.outDir, i = e.bundler ?? G, o = e.stdout ?? process.stdout, s = e.stderr ?? process.stderr, c = e.entry ?? n.entry ?? await K(t), l = await we(t, o), u = l ? D(l) : await O(t), d = await Te(t, l, e.hostBin, o) ?? e.hostBin, f, p = !1, m = !1, g = Promise.resolve(), _ = () => {}, v = new Promise((e) => {
598
+ _ = e;
599
+ });
600
+ async function y() {
353
601
  try {
354
- await n.start();
602
+ return await f?.call("reload"), !0;
355
603
  } catch (e) {
356
- V(o, "failed to start inca-host", B(e));
357
- return;
604
+ return W(s, "reload failed", U(e), Z), !1;
358
605
  }
359
- c = n;
360
- return;
361
606
  }
362
- if (!l) {
363
- u = !0;
364
- return;
607
+ async function b(e) {
608
+ if (await Ee(e.outDir, e.files), !f) {
609
+ let t = new L({
610
+ entryFile: e.entryFile,
611
+ hostBin: d,
612
+ onStderr: (e) => s.write(e),
613
+ onReady: () => {
614
+ p = !0, V(o, "ready", Z), m && (m = !1, y());
615
+ },
616
+ onAppError: (e) => W(s, "app error", e, Z),
617
+ onExit: () => {
618
+ V(o, "host exited — stopping", Z), _();
619
+ }
620
+ });
621
+ try {
622
+ await t.start();
623
+ } catch (e) {
624
+ W(s, "failed to start inca-host", U(e), Z);
625
+ return;
626
+ }
627
+ f = t;
628
+ return;
629
+ }
630
+ if (!p) {
631
+ m = !0;
632
+ return;
633
+ }
634
+ if (await y() && e.changed) {
635
+ let n = h("dim", a.relative(t, e.changed.file), { stream: o }), r = Date.now() - e.changed.at;
636
+ V(o, `${h("green", "reload")} ${n} (${r}ms)`, Z);
637
+ }
365
638
  }
366
- await f();
639
+ let x = await i.watch({
640
+ entry: c,
641
+ outDir: r,
642
+ runtimeConfig: u,
643
+ mode: "development",
644
+ stdout: o,
645
+ stderr: s,
646
+ onBuild: (e) => {
647
+ g = g.then(() => b(e));
648
+ },
649
+ onError: (e) => {
650
+ W(s, "build failed", e, Z);
651
+ }
652
+ });
653
+ e.signal.aborted ? _() : e.signal.addEventListener("abort", () => _(), { once: !0 }), await v, await g, await f?.stop(), await x.close();
654
+ } finally {
655
+ await r();
367
656
  }
368
- let m = await i.watch({
369
- entry: s,
370
- outDir: r,
371
- mode: "development",
372
- onBuild: (e) => {
373
- d = d.then(() => p(e));
374
- },
375
- onError: (e) => {
376
- V(o, "build failed", e);
377
- }
378
- });
379
- await new Promise((t) => {
380
- if (e.signal.aborted) {
381
- t();
382
- return;
383
- }
384
- e.signal.addEventListener("abort", () => t(), { once: !0 });
385
- }), await d, await c?.stop(), await m.close();
386
- }
387
- //#endregion
388
- //#region src/plist.mts
389
- function W(e) {
390
- return e.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;");
391
- }
392
- function G(e) {
393
- return typeof e == "boolean" ? e ? "<true/>" : "<false/>" : `<string>${W(e)}</string>`;
394
- }
395
- function K(e) {
396
- return `<?xml version="1.0" encoding="UTF-8"?>
397
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
398
- <plist version="1.0">
399
- <dict>
400
- ${Object.entries(e).map(([e, t]) => `\t<key>${W(e)}</key>\n\t${G(t)}`).join("\n")}\n</dict>
401
- </plist>
402
- `;
403
657
  }
404
658
  //#endregion
405
659
  //#region src/package.mts
406
- function q() {
660
+ function Oe() {
407
661
  if (process.platform === "darwin") return "macos";
408
662
  if (process.platform === "linux") return "linux";
409
- throw Error(`inca package doesn't support ${process.platform} yet`);
663
+ throw new S("ERR_INCA_PLATFORM_UNSUPPORTED", `inca package doesn't support ${process.platform} yet`);
410
664
  }
411
- async function J(e, t) {
665
+ async function Q(e, t) {
412
666
  await Promise.all(e.files.map(async (n) => {
413
- let r = p.join(t, n);
414
- await c(p.dirname(r), { recursive: !0 }), await s(p.join(e.outDir, n), r);
667
+ let r = a.join(t, n);
668
+ await u(a.dirname(r), { recursive: !0 }), await c(a.join(e.outDir, n), r);
415
669
  }));
416
670
  }
417
- async function Y({ metadata: e, output: t, hostBin: n }) {
418
- let r = p.join(t.outDir, `${e.productName}.app`);
419
- await d(r, {
420
- recursive: !0,
421
- force: !0
671
+ async function ke({ metadata: e, output: t, hostBin: n }) {
672
+ let { appPath: r, resourcesDir: i } = await X({
673
+ appPath: a.join(t.outDir, `${e.productName}.app`),
674
+ metadata: e,
675
+ hostBin: n
422
676
  });
423
- let i = p.join(r, "Contents"), a = p.join(i, "MacOS"), l = p.join(i, "Resources");
424
- await c(a, { recursive: !0 }), await c(l, { recursive: !0 });
425
- let u = p.join(a, e.productName);
426
- await s(n, u), await o(u, 493), await J(t, l);
427
- let m = {
428
- CFBundleName: e.productName,
429
- CFBundleDisplayName: e.productName,
430
- CFBundleExecutable: e.productName,
431
- CFBundleIdentifier: e.identifier,
432
- CFBundleVersion: e.version,
433
- CFBundleShortVersionString: e.version,
434
- CFBundlePackageType: "APPL",
435
- CFBundleInfoDictionaryVersion: "6.0",
436
- NSHighResolutionCapable: !0
437
- };
438
- if (e.icon) {
439
- let t = p.basename(e.icon);
440
- await s(e.icon, p.join(l, t)), m.CFBundleIconFile = t;
441
- }
442
- return await f(p.join(i, "Info.plist"), K(m)), await f(p.join(i, "PkgInfo"), "APPL????"), r;
677
+ return await Q(t, i), r;
443
678
  }
444
- async function X({ metadata: t, output: n, hostBin: r }) {
445
- let i = e(t.productName), a = p.join(n.outDir, i);
446
- await d(a, {
679
+ async function Ae({ metadata: t, output: n, hostBin: r }) {
680
+ let i = e(t.productName), o = a.join(n.outDir, i);
681
+ await p(o, {
447
682
  recursive: !0,
448
683
  force: !0
449
- }), await c(a, { recursive: !0 });
450
- let l = p.join(a, i);
451
- return await s(r, l), await o(l, 493), await J(n, a), a;
452
- }
453
- async function Z(e = {}) {
454
- let t = e.cwd ?? process.cwd(), n = e.stdout ?? process.stdout, r = e.target ?? q(), i = await S(t);
455
- i.usedPackageJsonKey && n.write("[inca] the \"inca\" key in package.json is deprecated — move these settings to inca.config.ts\n"), i.identifierIsDefault && n.write(`[inca] no "identifier" set in inca.config.ts — using generated identifier ${i.identifier}\n`);
456
- let o = await j({
684
+ }), await u(o, { recursive: !0 });
685
+ let l = a.join(o, i);
686
+ return await c(r, l), await s(l, 493), await Q(n, o), o;
687
+ }
688
+ async function je(e = {}) {
689
+ let t = e.cwd ?? process.cwd(), n = e.stdout ?? process.stdout, r = e.target ?? Oe(), i = await E(t);
690
+ i.usedPackageJsonKey && V(n, "the \"inca\" key in package.json is deprecated — move these settings to inca.config.ts"), i.identifierIsDefault && V(n, `no "identifier" set in inca.config.ts — using generated identifier ${i.identifier}`);
691
+ let a = await q({
457
692
  cwd: t,
458
693
  entry: e.entry,
459
694
  config: i,
460
- bundler: e.bundler
461
- }), s = e.hostBin ?? F();
462
- if (!a(s)) throw Error(`no host binary at ${s} — check that it was built and is executable`);
695
+ runtimeConfig: D(i),
696
+ bundler: e.bundler,
697
+ stdout: n,
698
+ stderr: e.stderr
699
+ }), s = e.hostBin ?? N();
700
+ if (!o(s)) throw new S("ERR_INCA_HOST_BIN_NOT_FOUND", `no host binary at ${s} — check that it was built and is executable`);
463
701
  let c = {
464
702
  metadata: i,
465
- output: o,
703
+ output: a,
466
704
  hostBin: s
467
705
  };
468
- return { appPath: r === "macos" ? await Y(c) : await X(c) };
706
+ return { appPath: r === "macos" ? await ke(c) : await Ae(c) };
469
707
  }
470
708
  //#endregion
471
709
  //#region src/cli.mts
472
- var Q = "Usage: inca <dev|build|package>";
473
- async function $(e = process.argv) {
710
+ var Me = "Usage: inca <dev|build|package>";
711
+ function $(e) {
712
+ return a.relative(process.cwd(), e);
713
+ }
714
+ async function Ne(e = process.argv) {
474
715
  let t = e[2];
475
716
  if (t === "build") {
476
717
  try {
477
- let e = await j();
478
- process.stdout.write(`[inca] built ${e.entryFile}\n`);
718
+ let e = await q();
719
+ V(process.stdout, `built ${$(e.entryFile)}`);
479
720
  } catch (e) {
480
- V(process.stderr, "build failed", B(e)), process.exitCode = 1;
721
+ W(process.stderr, "build failed", U(e)), process.exitCode = 1;
481
722
  }
482
723
  return;
483
724
  }
484
725
  if (t === "package") {
485
726
  try {
486
- let { appPath: e } = await Z();
487
- process.stdout.write(`[inca] packaged ${e}\n`);
727
+ let { appPath: e } = await je();
728
+ V(process.stdout, `packaged ${$(e)}`);
488
729
  } catch (e) {
489
- V(process.stderr, "package failed", B(e)), process.exitCode = 1;
730
+ W(process.stderr, "package failed", U(e)), process.exitCode = 1;
490
731
  }
491
732
  return;
492
733
  }
493
734
  if (t !== "dev") {
494
- process.stderr.write(`${Q}\n`), process.exitCode = 1;
735
+ process.stderr.write(`${Me}\n`), process.exitCode = 1;
495
736
  return;
496
737
  }
497
738
  let n = new AbortController(), r = () => {
498
- process.stderr.write("[inca] shutting down\n"), n.abort();
739
+ n.signal.aborted || (V(process.stderr, "shutting down", { timestamp: !0 }), n.abort());
499
740
  };
500
- process.on("SIGINT", r), process.on("SIGTERM", r), await U({ signal: n.signal });
741
+ process.on("SIGINT", r), process.on("SIGTERM", r);
742
+ try {
743
+ await De({ signal: n.signal });
744
+ } catch (e) {
745
+ W(process.stderr, "dev failed", U(e), { timestamp: !0 }), process.exitCode = 1;
746
+ }
501
747
  }
502
748
  //#endregion
503
- export { $ as run };
749
+ export { Ne as run };