@zappdev/vite 0.5.0-alpha.0 → 0.5.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +189 -0
- package/package.json +8 -3
package/dist/index.js
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
3
|
+
|
|
4
|
+
// src/index.ts
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { existsSync } from "node:fs";
|
|
7
|
+
import { mkdir, readdir, readFile } from "node:fs/promises";
|
|
8
|
+
var WORKER_PATTERN = /new\s+(?:SharedWorker|Worker)\s*\(\s*(?:new\s+URL\(\s*["'`](.+?)["'`]\s*,\s*import\.meta\.url\s*\)|["'`](.+?)["'`])/g;
|
|
9
|
+
async function scanDir(dir) {
|
|
10
|
+
const results = [];
|
|
11
|
+
try {
|
|
12
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
13
|
+
for (const entry of entries) {
|
|
14
|
+
if (entry.name.startsWith(".") || entry.name === "node_modules" || entry.name === "zapp")
|
|
15
|
+
continue;
|
|
16
|
+
const full = path.join(dir, entry.name);
|
|
17
|
+
if (entry.isDirectory()) {
|
|
18
|
+
results.push(...await scanDir(full));
|
|
19
|
+
} else if (/\.(ts|tsx|js|jsx|mjs)$/.test(entry.name)) {
|
|
20
|
+
results.push(full);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
} catch {}
|
|
24
|
+
return results;
|
|
25
|
+
}
|
|
26
|
+
async function discoverWorkers(srcDir) {
|
|
27
|
+
const files = await scanDir(srcDir);
|
|
28
|
+
const found = new Map;
|
|
29
|
+
for (const file of files) {
|
|
30
|
+
const content = await readFile(file, "utf-8");
|
|
31
|
+
let match;
|
|
32
|
+
WORKER_PATTERN.lastIndex = 0;
|
|
33
|
+
while ((match = WORKER_PATTERN.exec(content)) !== null) {
|
|
34
|
+
const spec = match[1] || match[2];
|
|
35
|
+
if (!spec || found.has(spec))
|
|
36
|
+
continue;
|
|
37
|
+
const sourcePath = path.resolve(path.dirname(file), spec);
|
|
38
|
+
const baseName = path.basename(spec).replace(/\.[^.]+$/, "");
|
|
39
|
+
found.set(spec, {
|
|
40
|
+
specifier: spec,
|
|
41
|
+
sourcePath,
|
|
42
|
+
outputName: `${baseName}.mjs`,
|
|
43
|
+
outputUrl: `/_workers/${baseName}.mjs`
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return [...found.values()];
|
|
48
|
+
}
|
|
49
|
+
async function bundleWorker(entry, outDir, aliases) {
|
|
50
|
+
try {
|
|
51
|
+
const vite = await import("vite");
|
|
52
|
+
await vite.build({
|
|
53
|
+
configFile: false,
|
|
54
|
+
logLevel: "silent",
|
|
55
|
+
build: {
|
|
56
|
+
outDir,
|
|
57
|
+
emptyOutDir: false,
|
|
58
|
+
minify: true,
|
|
59
|
+
rollupOptions: {
|
|
60
|
+
input: entry.sourcePath,
|
|
61
|
+
output: {
|
|
62
|
+
format: "es",
|
|
63
|
+
entryFileNames: entry.outputName,
|
|
64
|
+
dir: outDir
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
resolve: { alias: aliases }
|
|
69
|
+
});
|
|
70
|
+
return true;
|
|
71
|
+
} catch (e) {
|
|
72
|
+
console.error(`[zapp] worker bundle failed: ${entry.specifier}`, e);
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function zappWorkers() {
|
|
77
|
+
let root = "";
|
|
78
|
+
let srcDir = "";
|
|
79
|
+
let workers = [];
|
|
80
|
+
let backendEntry = null;
|
|
81
|
+
let aliases = {};
|
|
82
|
+
let isDev = false;
|
|
83
|
+
let outDir = "";
|
|
84
|
+
return {
|
|
85
|
+
name: "zapp-workers",
|
|
86
|
+
enforce: "pre",
|
|
87
|
+
configResolved(config) {
|
|
88
|
+
root = config.root;
|
|
89
|
+
srcDir = path.join(root, "src");
|
|
90
|
+
outDir = path.join(root, "dist", "_workers");
|
|
91
|
+
isDev = config.command === "serve";
|
|
92
|
+
const resolvedAlias = config.resolve?.alias;
|
|
93
|
+
if (resolvedAlias && typeof resolvedAlias === "object" && !Array.isArray(resolvedAlias)) {
|
|
94
|
+
aliases = resolvedAlias;
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
async buildStart() {
|
|
98
|
+
workers = await discoverWorkers(srcDir);
|
|
99
|
+
const backendPath = path.join(srcDir, "backend.ts");
|
|
100
|
+
if (existsSync(backendPath)) {
|
|
101
|
+
backendEntry = {
|
|
102
|
+
specifier: "./backend.ts",
|
|
103
|
+
sourcePath: backendPath,
|
|
104
|
+
outputName: "backend.mjs",
|
|
105
|
+
outputUrl: "/_workers/backend.mjs"
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
if (workers.length > 0) {
|
|
109
|
+
console.log(`[zapp] discovered ${workers.length} worker(s)`);
|
|
110
|
+
}
|
|
111
|
+
if (backendEntry) {
|
|
112
|
+
console.log("[zapp] backend worker: src/backend.ts");
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
transform(code, id) {
|
|
116
|
+
if (!id.endsWith(".ts") && !id.endsWith(".tsx") && !id.endsWith(".js") && !id.endsWith(".jsx"))
|
|
117
|
+
return null;
|
|
118
|
+
if (id.includes("node_modules"))
|
|
119
|
+
return null;
|
|
120
|
+
let modified = false;
|
|
121
|
+
let result = code;
|
|
122
|
+
for (const entry of workers) {
|
|
123
|
+
const escaped = entry.specifier.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
124
|
+
const regex = new RegExp(`(new\\s+(?:SharedWorker|Worker)\\s*\\(\\s*["'\`])${escaped}(["'\`])`, "g");
|
|
125
|
+
const replaced = result.replace(regex, `$1${entry.outputUrl}$2`);
|
|
126
|
+
if (replaced !== result) {
|
|
127
|
+
result = replaced;
|
|
128
|
+
modified = true;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return modified ? { code: result, map: null } : null;
|
|
132
|
+
},
|
|
133
|
+
async configureServer(server) {
|
|
134
|
+
const devOutDir = path.join(root, ".zapp", "workers");
|
|
135
|
+
await mkdir(devOutDir, { recursive: true });
|
|
136
|
+
workers = await discoverWorkers(srcDir);
|
|
137
|
+
const backendPath = path.join(srcDir, "backend.ts");
|
|
138
|
+
if (existsSync(backendPath)) {
|
|
139
|
+
backendEntry = {
|
|
140
|
+
specifier: "./backend.ts",
|
|
141
|
+
sourcePath: backendPath,
|
|
142
|
+
outputName: "backend.mjs",
|
|
143
|
+
outputUrl: "/_workers/backend.mjs"
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
const allEntries = [...workers];
|
|
147
|
+
if (backendEntry)
|
|
148
|
+
allEntries.push(backendEntry);
|
|
149
|
+
for (const entry of allEntries) {
|
|
150
|
+
const ok = await bundleWorker(entry, devOutDir, aliases);
|
|
151
|
+
if (ok)
|
|
152
|
+
console.log(`[zapp] dev-bundled worker: ${entry.outputName}`);
|
|
153
|
+
}
|
|
154
|
+
server.middlewares.use(async (req, res, next) => {
|
|
155
|
+
if (!req.url?.startsWith("/_workers/"))
|
|
156
|
+
return next();
|
|
157
|
+
const fileName = req.url.slice("/_workers/".length);
|
|
158
|
+
const filePath = path.join(devOutDir, fileName);
|
|
159
|
+
if (existsSync(filePath)) {
|
|
160
|
+
const content = await readFile(filePath, "utf-8");
|
|
161
|
+
res.setHeader("Content-Type", "application/javascript");
|
|
162
|
+
res.end(content);
|
|
163
|
+
} else {
|
|
164
|
+
res.statusCode = 404;
|
|
165
|
+
res.end("Worker not found");
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
},
|
|
169
|
+
async generateBundle() {
|
|
170
|
+
if (isDev)
|
|
171
|
+
return;
|
|
172
|
+
await mkdir(outDir, { recursive: true });
|
|
173
|
+
const allEntries = [...workers];
|
|
174
|
+
if (backendEntry)
|
|
175
|
+
allEntries.push(backendEntry);
|
|
176
|
+
for (const entry of allEntries) {
|
|
177
|
+
const ok = await bundleWorker(entry, outDir, aliases);
|
|
178
|
+
if (ok) {
|
|
179
|
+
console.log(`[zapp] bundled worker: ${entry.outputName}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
var src_default = zappWorkers;
|
|
186
|
+
export {
|
|
187
|
+
zappWorkers,
|
|
188
|
+
src_default as default
|
|
189
|
+
};
|
package/package.json
CHANGED
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zappdev/vite",
|
|
3
|
-
"version": "0.5.0-alpha.
|
|
3
|
+
"version": "0.5.0-alpha.1",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"main": "
|
|
5
|
+
"main": "dist/index.js",
|
|
6
6
|
"types": "src/index.ts",
|
|
7
7
|
"exports": {
|
|
8
|
-
".": "./
|
|
8
|
+
".": "./dist/index.js"
|
|
9
9
|
},
|
|
10
10
|
"files": [
|
|
11
|
+
"dist/",
|
|
11
12
|
"src/"
|
|
12
13
|
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "bun build src/index.ts --outdir dist --format esm --target node",
|
|
16
|
+
"prepack": "bun run build"
|
|
17
|
+
},
|
|
13
18
|
"peerDependencies": {
|
|
14
19
|
"vite": ">=5.0.0"
|
|
15
20
|
}
|