@zappdev/vite 0.5.0-alpha.4 → 0.6.0-alpha.0

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 (3) hide show
  1. package/dist/index.js +26 -28
  2. package/package.json +1 -1
  3. package/src/index.ts +38 -38
package/dist/index.js CHANGED
@@ -73,15 +73,33 @@ async function bundleWorker(entry, outDir, aliases) {
73
73
  return false;
74
74
  }
75
75
  }
76
+ function resolveHeadlessEntries(root, headless) {
77
+ if (!headless)
78
+ return [];
79
+ const entries = [];
80
+ for (const [id, srcPath] of Object.entries(headless)) {
81
+ const abs = path.resolve(root, srcPath);
82
+ if (!existsSync(abs)) {
83
+ console.warn(`[zapp] headless worker "${id}" not found at ${srcPath}`);
84
+ continue;
85
+ }
86
+ entries.push({
87
+ specifier: srcPath,
88
+ sourcePath: abs,
89
+ outputName: `_headless_${id}.mjs`,
90
+ outputUrl: `/_workers/_headless_${id}.mjs`
91
+ });
92
+ }
93
+ return entries;
94
+ }
76
95
  function zappWorkers(options) {
77
96
  let root = "";
78
97
  let srcDir = "";
79
98
  let workers = [];
80
- let backendEntry = null;
99
+ let headlessEntries = [];
81
100
  let aliases = {};
82
101
  let isDev = false;
83
102
  let outDir = "";
84
- let backendFromConfig = options?.backend;
85
103
  return {
86
104
  name: "zapp-workers",
87
105
  enforce: "pre",
@@ -97,20 +115,12 @@ function zappWorkers(options) {
97
115
  },
98
116
  async buildStart() {
99
117
  workers = await discoverWorkers(srcDir);
100
- const backendSrc = backendFromConfig ? path.resolve(root, backendFromConfig) : path.join(srcDir, "backend.ts");
101
- if (existsSync(backendSrc)) {
102
- backendEntry = {
103
- specifier: path.relative(srcDir, backendSrc),
104
- sourcePath: backendSrc,
105
- outputName: "backend.mjs",
106
- outputUrl: "/_workers/backend.mjs"
107
- };
108
- }
118
+ headlessEntries = resolveHeadlessEntries(root, options?.headless);
109
119
  if (workers.length > 0) {
110
120
  console.log(`[zapp] discovered ${workers.length} worker(s)`);
111
121
  }
112
- if (backendEntry) {
113
- console.log(`[zapp] backend worker: ${path.relative(root, backendSrc)}`);
122
+ for (const entry of headlessEntries) {
123
+ console.log(`[zapp] headless worker: ${path.relative(root, entry.sourcePath)}`);
114
124
  }
115
125
  },
116
126
  transform(code, id) {
@@ -135,18 +145,8 @@ function zappWorkers(options) {
135
145
  const devOutDir = path.join(root, ".zapp", "workers");
136
146
  await mkdir(devOutDir, { recursive: true });
137
147
  workers = await discoverWorkers(srcDir);
138
- const backendSrc = backendFromConfig ? path.resolve(root, backendFromConfig) : path.join(srcDir, "backend.ts");
139
- if (existsSync(backendSrc)) {
140
- backendEntry = {
141
- specifier: path.relative(srcDir, backendSrc),
142
- sourcePath: backendSrc,
143
- outputName: "backend.mjs",
144
- outputUrl: "/_workers/backend.mjs"
145
- };
146
- }
147
- const allEntries = [...workers];
148
- if (backendEntry)
149
- allEntries.push(backendEntry);
148
+ headlessEntries = resolveHeadlessEntries(root, options?.headless);
149
+ const allEntries = [...workers, ...headlessEntries];
150
150
  for (const entry of allEntries) {
151
151
  const ok = await bundleWorker(entry, devOutDir, aliases);
152
152
  if (ok)
@@ -171,9 +171,7 @@ function zappWorkers(options) {
171
171
  if (isDev)
172
172
  return;
173
173
  await mkdir(outDir, { recursive: true });
174
- const allEntries = [...workers];
175
- if (backendEntry)
176
- allEntries.push(backendEntry);
174
+ const allEntries = [...workers, ...headlessEntries];
177
175
  for (const entry of allEntries) {
178
176
  const ok = await bundleWorker(entry, outDir, aliases);
179
177
  if (ok) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zappdev/vite",
3
- "version": "0.5.0-alpha.4",
3
+ "version": "0.6.0-alpha.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
package/src/index.ts CHANGED
@@ -105,19 +105,41 @@ async function bundleWorker(entry: WorkerEntry, outDir: string, aliases: Record<
105
105
  }
106
106
 
107
107
  interface ZappWorkersOptions {
108
- /** Path to backend worker source, relative to project root. Overrides zapp.config.ts. */
109
- backend?: string;
108
+ /**
109
+ * Headless workers to bundle, keyed by ID. Values are source paths relative
110
+ * to project root. Output URL is `/_workers/_headless_<id>.mjs` — the native
111
+ * runtime loads these at app startup via generated Zen-C code.
112
+ */
113
+ headless?: Record<string, string>;
114
+ }
115
+
116
+ function resolveHeadlessEntries(root: string, headless?: Record<string, string>): WorkerEntry[] {
117
+ if (!headless) return [];
118
+ const entries: WorkerEntry[] = [];
119
+ for (const [id, srcPath] of Object.entries(headless)) {
120
+ const abs = path.resolve(root, srcPath);
121
+ if (!existsSync(abs)) {
122
+ console.warn(`[zapp] headless worker "${id}" not found at ${srcPath}`);
123
+ continue;
124
+ }
125
+ entries.push({
126
+ specifier: srcPath,
127
+ sourcePath: abs,
128
+ outputName: `_headless_${id}.mjs`,
129
+ outputUrl: `/_workers/_headless_${id}.mjs`,
130
+ });
131
+ }
132
+ return entries;
110
133
  }
111
134
 
112
135
  export function zappWorkers(options?: ZappWorkersOptions): Plugin {
113
136
  let root = "";
114
137
  let srcDir = "";
115
138
  let workers: WorkerEntry[] = [];
116
- let backendEntry: WorkerEntry | null = null;
139
+ let headlessEntries: WorkerEntry[] = [];
117
140
  let aliases: Record<string, string> = {};
118
141
  let isDev = false;
119
142
  let outDir = "";
120
- let backendFromConfig = options?.backend;
121
143
 
122
144
  return {
123
145
  name: "zapp-workers",
@@ -137,27 +159,17 @@ export function zappWorkers(options?: ZappWorkersOptions): Plugin {
137
159
  },
138
160
 
139
161
  async buildStart() {
140
- // Discover workers from source
162
+ // Webview-spawned workers: discovered by scanning source.
141
163
  workers = await discoverWorkers(srcDir);
142
164
 
143
- // Backend worker path from config, or fall back to src/backend.ts convention
144
- const backendSrc = backendFromConfig
145
- ? path.resolve(root, backendFromConfig)
146
- : path.join(srcDir, "backend.ts");
147
- if (existsSync(backendSrc)) {
148
- backendEntry = {
149
- specifier: path.relative(srcDir, backendSrc),
150
- sourcePath: backendSrc,
151
- outputName: "backend.mjs",
152
- outputUrl: "/_workers/backend.mjs",
153
- };
154
- }
165
+ // Headless workers: declared in zapp.config.ts.
166
+ headlessEntries = resolveHeadlessEntries(root, options?.headless);
155
167
 
156
168
  if (workers.length > 0) {
157
169
  console.log(`[zapp] discovered ${workers.length} worker(s)`);
158
170
  }
159
- if (backendEntry) {
160
- console.log(`[zapp] backend worker: ${path.relative(root, backendSrc)}`);
171
+ for (const entry of headlessEntries) {
172
+ console.log(`[zapp] headless worker: ${path.relative(root, entry.sourcePath)}`);
161
173
  }
162
174
  },
163
175
 
@@ -184,9 +196,10 @@ export function zappWorkers(options?: ZappWorkersOptions): Plugin {
184
196
  },
185
197
 
186
198
  // Dev: bundle workers eagerly so they exist on disk before the native
187
- // binary launches. The backend worker is loaded directly by native code
188
- // and never goes through HTTP, so a lazy-on-request middleware would never
189
- // bundle it. Eager bundling also lets native fall back to filesystem.
199
+ // binary launches. Headless workers are loaded directly by native code
200
+ // via the generated .zapp/zapp_headless_workers.zc, so a lazy-on-request
201
+ // middleware would never bundle them. Eager bundling also lets native
202
+ // fall back to filesystem.
190
203
  //
191
204
  // configureServer runs before buildStart, so we re-discover workers here
192
205
  // (buildStart's results aren't yet available).
@@ -195,21 +208,9 @@ export function zappWorkers(options?: ZappWorkersOptions): Plugin {
195
208
  await mkdir(devOutDir, { recursive: true });
196
209
 
197
210
  workers = await discoverWorkers(srcDir);
198
- const backendSrc = backendFromConfig
199
- ? path.resolve(root, backendFromConfig)
200
- : path.join(srcDir, "backend.ts");
201
- if (existsSync(backendSrc)) {
202
- backendEntry = {
203
- specifier: path.relative(srcDir, backendSrc),
204
- sourcePath: backendSrc,
205
- outputName: "backend.mjs",
206
- outputUrl: "/_workers/backend.mjs",
207
- };
208
- }
209
-
210
- const allEntries = [...workers];
211
- if (backendEntry) allEntries.push(backendEntry);
211
+ headlessEntries = resolveHeadlessEntries(root, options?.headless);
212
212
 
213
+ const allEntries = [...workers, ...headlessEntries];
213
214
  for (const entry of allEntries) {
214
215
  const ok = await bundleWorker(entry, devOutDir, aliases);
215
216
  if (ok) console.log(`[zapp] dev-bundled worker: ${entry.outputName}`);
@@ -240,8 +241,7 @@ export function zappWorkers(options?: ZappWorkersOptions): Plugin {
240
241
 
241
242
  await mkdir(outDir, { recursive: true });
242
243
 
243
- const allEntries = [...workers];
244
- if (backendEntry) allEntries.push(backendEntry);
244
+ const allEntries = [...workers, ...headlessEntries];
245
245
 
246
246
  for (const entry of allEntries) {
247
247
  const ok = await bundleWorker(entry, outDir, aliases);