@vrowzer/vite-plugin 0.0.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 (39) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +290 -0
  3. package/dist/ide/assets/css.worker-uWEFNxvl.js +89 -0
  4. package/dist/ide/assets/html.worker-1tLoAl5Z.js +502 -0
  5. package/dist/ide/assets/json.worker-CL3sVQd6.js +58 -0
  6. package/dist/ide/assets/ts.worker-BFpNHPy5.js +67719 -0
  7. package/dist/ide/css-CPSW8DVZ.js +286 -0
  8. package/dist/ide/cssMode-B5DtFEwy.js +65 -0
  9. package/dist/ide/graphql-BteLL2CG.js +176 -0
  10. package/dist/ide/handlebars-BcqMM6pa.js +412 -0
  11. package/dist/ide/html-CxO5OaJl.js +333 -0
  12. package/dist/ide/htmlMode-DxpUG2jm.js +74 -0
  13. package/dist/ide/ide.css +2 -0
  14. package/dist/ide/ide.js +5523 -0
  15. package/dist/ide/javascript-CvtLx4_Z.js +21 -0
  16. package/dist/ide/jsonMode-LVtiYWKr.js +449 -0
  17. package/dist/ide/less-BubkcFWW.js +244 -0
  18. package/dist/ide/lspLanguageFeatures-BDyekQt2.js +1455 -0
  19. package/dist/ide/markdown-DPB5N4OB.js +264 -0
  20. package/dist/ide/mdx-Sun87_nd.js +329 -0
  21. package/dist/ide/monaco.contribution-DVj8eGe_.js +116 -0
  22. package/dist/ide/pug-BONHZNEg.js +302 -0
  23. package/dist/ide/scss-0r6NeK1P.js +419 -0
  24. package/dist/ide/shell-Vh_eZpea.js +225 -0
  25. package/dist/ide/toggleHighContrast-DI4ZeqFk.js +113328 -0
  26. package/dist/ide/tsMode-BKTkt1bt.js +567 -0
  27. package/dist/ide/typescript-CHC4VYBW.js +257 -0
  28. package/dist/ide/workers-IG_hD8Jy.js +47 -0
  29. package/dist/ide/xml-C0QFzMaz.js +130 -0
  30. package/dist/ide/yaml-o-RP7lYY.js +223 -0
  31. package/dist/index.d.mts +138 -0
  32. package/dist/index.d.mts.map +1 -0
  33. package/dist/index.mjs +1335 -0
  34. package/dist/index.mjs.map +1 -0
  35. package/dist/manifest-generate.d.mts +89 -0
  36. package/dist/manifest-generate.d.mts.map +1 -0
  37. package/dist/manifest-generate.mjs +438 -0
  38. package/dist/manifest-generate.mjs.map +1 -0
  39. package/package.json +88 -0
@@ -0,0 +1,438 @@
1
+ import { basename, dirname, extname, join, relative, resolve } from "node:path";
2
+ import { mkdir, readdir, realpath, stat, writeFile } from "node:fs/promises";
3
+ import { rolldown } from "rolldown";
4
+
5
+ //#region src/manifest-generate.ts
6
+ /**
7
+ * Core logic for generating vrowzer-manifest.json.
8
+ *
9
+ * Shared between `scripts/generate-manifest.ts` (CLI) and
10
+ * the `Vrowzer()` plugin (auto-generation mode).
11
+ *
12
+ * @module manifest-generate
13
+ */
14
+ /**
15
+ * @author kazuya kawaguchi (a.k.a. kazupon)
16
+ * @license MIT
17
+ */
18
+ const INCLUDE_EXTENSIONS = new Set([
19
+ ".js",
20
+ ".mjs",
21
+ ".cjs",
22
+ ".json",
23
+ ".ts",
24
+ ".mts",
25
+ ".d.ts",
26
+ ".d.mts",
27
+ ".d.cts",
28
+ ".svelte",
29
+ ".vue",
30
+ ".jsx",
31
+ ".tsx",
32
+ ".css",
33
+ ".html",
34
+ ".svg",
35
+ ".yaml",
36
+ ".yml",
37
+ ".wasm"
38
+ ]);
39
+ const EXCLUDE_DIRS = new Set([
40
+ ".git",
41
+ ".github",
42
+ ".pnpm",
43
+ ".vite",
44
+ ".vrowzer",
45
+ "__tests__",
46
+ "__mocks__",
47
+ "node_modules",
48
+ "test",
49
+ "tests",
50
+ "benchmark",
51
+ "benchmarks"
52
+ ]);
53
+ const EXCLUDE_FILE_PREFIXES = [
54
+ "README",
55
+ "LICENSE",
56
+ "CHANGELOG",
57
+ "LICENCE"
58
+ ];
59
+ const EXCLUDE_FILE_SUFFIXES = [".map"];
60
+ const EXCLUDE_FILE_NAMES = new Set([
61
+ "manifest.json",
62
+ "vrowzer-manifest.json",
63
+ "package.json"
64
+ ]);
65
+ const TEST_FILE_RE = /\.(test|spec)\.(js|mjs|cjs|ts|cts|mts)$/;
66
+ const PROJECT_SOURCE_PATTERNS = [
67
+ "index.html",
68
+ "src",
69
+ "public"
70
+ ];
71
+ const ACTIVE_FILE_CANDIDATES = [
72
+ "App.vue",
73
+ "App.svelte",
74
+ "App.tsx",
75
+ "App.jsx",
76
+ "main.ts",
77
+ "main.js",
78
+ "index.html"
79
+ ];
80
+ async function exists(path$1) {
81
+ try {
82
+ await stat(path$1);
83
+ return true;
84
+ } catch {
85
+ return false;
86
+ }
87
+ }
88
+ const EMPTY_PKG_JSON = Object.freeze({
89
+ name: "",
90
+ dependencies: {},
91
+ devDependencies: {},
92
+ files: []
93
+ });
94
+ async function readPackageJson(dir) {
95
+ const pkgPath = join(dir, "package.json");
96
+ if (!await exists(pkgPath)) return EMPTY_PKG_JSON;
97
+ try {
98
+ const { default: pkg } = await import(pkgPath, { with: { type: "json" } });
99
+ return pkg;
100
+ } catch {
101
+ return EMPTY_PKG_JSON;
102
+ }
103
+ }
104
+ function shouldIncludeFile(filePath) {
105
+ const name = basename(filePath);
106
+ if (name.startsWith(".")) return false;
107
+ if (EXCLUDE_FILE_NAMES.has(name)) return false;
108
+ if (EXCLUDE_FILE_PREFIXES.some((p) => name.startsWith(p))) return false;
109
+ if (EXCLUDE_FILE_SUFFIXES.some((s) => name.endsWith(s))) return false;
110
+ if (TEST_FILE_RE.test(name)) return false;
111
+ const ext = extname(name);
112
+ return INCLUDE_EXTENSIONS.has(ext);
113
+ }
114
+ function shouldExcludeDir(dirName) {
115
+ return EXCLUDE_DIRS.has(dirName) || dirName.startsWith(".");
116
+ }
117
+ /**
118
+ * Recursively walk a directory and collect files.
119
+ * Follows symlinks but records logical paths.
120
+ */
121
+ async function walkDir(dir, files = []) {
122
+ let entries;
123
+ try {
124
+ entries = await readdir(dir, { withFileTypes: true });
125
+ } catch {
126
+ return files;
127
+ }
128
+ for (const entry of entries) {
129
+ const name = String(entry.name);
130
+ const fullPath = join(dir, name);
131
+ if (entry.isDirectory() || entry.isSymbolicLink()) try {
132
+ const s = await stat(fullPath);
133
+ if (s.isDirectory()) {
134
+ if (!shouldExcludeDir(name)) await walkDir(fullPath, files);
135
+ } else if (s.isFile() && shouldIncludeFile(name)) files.push(fullPath);
136
+ } catch {}
137
+ else if (entry.isFile() && shouldIncludeFile(name)) files.push(fullPath);
138
+ }
139
+ return files;
140
+ }
141
+ /**
142
+ * Walk a package directory, respecting its package.json "files" field if present.
143
+ */
144
+ async function walkPackageFiles(pkgDir) {
145
+ const pkgFiles = (await readPackageJson(pkgDir)).files;
146
+ if (pkgFiles && pkgFiles.length > 0) {
147
+ const result$1 = [join(pkgDir, "package.json")];
148
+ for (const pattern of pkgFiles) {
149
+ const target = join(pkgDir, pattern);
150
+ if (!await exists(target)) continue;
151
+ try {
152
+ const s = await stat(target);
153
+ if (s.isDirectory()) await walkDir(target, result$1);
154
+ else if (s.isFile() && shouldIncludeFile(target)) result$1.push(target);
155
+ } catch {}
156
+ }
157
+ return result$1;
158
+ }
159
+ const result = [join(pkgDir, "package.json")];
160
+ await walkDir(pkgDir, result);
161
+ return result;
162
+ }
163
+ async function resolvePackageDir(dep, fromDir) {
164
+ const dirs = [fromDir];
165
+ try {
166
+ const real = await realpath(fromDir);
167
+ if (real !== fromDir) dirs.push(real);
168
+ } catch {}
169
+ for (const dir of dirs) {
170
+ let current = dir;
171
+ while (true) {
172
+ const candidate = join(current, "node_modules", dep);
173
+ if (await exists(candidate)) return candidate;
174
+ const parent = dirname(current);
175
+ if (parent === current) break;
176
+ current = parent;
177
+ }
178
+ }
179
+ return null;
180
+ }
181
+ async function collectDependencies(pkgDir, visited, isRoot = false) {
182
+ const pkg = await readPackageJson(pkgDir);
183
+ const deps = isRoot ? [...Object.keys(pkg.dependencies || {}), ...Object.keys(pkg.devDependencies || {})] : Object.keys(pkg.dependencies || {});
184
+ const result = [];
185
+ for (const dep of deps) {
186
+ const depDir = await resolvePackageDir(dep, pkgDir);
187
+ if (!depDir) continue;
188
+ if (visited.has(depDir)) continue;
189
+ visited.add(depDir);
190
+ result.push(depDir);
191
+ const transitive = await collectDependencies(depDir, visited);
192
+ result.push(...transitive);
193
+ }
194
+ return result;
195
+ }
196
+ async function collectProjectFiles(projectDir) {
197
+ const files = {};
198
+ for (const pattern of PROJECT_SOURCE_PATTERNS) {
199
+ const target = join(projectDir, pattern);
200
+ if (!await exists(target)) continue;
201
+ try {
202
+ const s = await stat(target);
203
+ if (s.isDirectory()) {
204
+ const walked = await walkDir(target);
205
+ for (const filePath of walked) {
206
+ const relPath = relative(projectDir, filePath).replace(/\\/g, "/");
207
+ files["/" + relPath] = "./" + relPath;
208
+ }
209
+ } else if (s.isFile() && shouldIncludeFile(target)) {
210
+ const relPath = relative(projectDir, target).replace(/\\/g, "/");
211
+ files["/" + relPath] = "./" + relPath;
212
+ }
213
+ } catch {}
214
+ }
215
+ try {
216
+ const rootEntries = await readdir(projectDir, { withFileTypes: true });
217
+ for (const entry of rootEntries) {
218
+ const entryName = String(entry.name);
219
+ if (entry.isFile() && shouldIncludeFile(entryName)) {
220
+ const virtualPath = "/" + entryName;
221
+ if (!files[virtualPath]) files[virtualPath] = "./" + entryName;
222
+ }
223
+ }
224
+ } catch {}
225
+ return files;
226
+ }
227
+ function detectActiveFile(files) {
228
+ for (const candidate of ACTIVE_FILE_CANDIDATES) {
229
+ const rootPath = "/" + candidate;
230
+ const srcPath = "/src/" + candidate;
231
+ if (files[rootPath]) return rootPath;
232
+ if (files[srcPath]) return srcPath;
233
+ }
234
+ const keys = Object.keys(files);
235
+ return keys.length > 0 ? keys[0] : void 0;
236
+ }
237
+ function isCjsPackage(pkg) {
238
+ if (pkg.type === "module") return false;
239
+ const mainExport = typeof pkg.exports === "object" && pkg.exports !== null ? pkg.exports["."] : void 0;
240
+ if (mainExport && typeof mainExport === "object" && "import" in mainExport) return false;
241
+ return true;
242
+ }
243
+ function extractExportEntries(pkg, conditions = [
244
+ "browser",
245
+ "import",
246
+ "default"
247
+ ]) {
248
+ const entries = {};
249
+ const exportsField = pkg.exports;
250
+ if (!exportsField || typeof exportsField === "string") return entries;
251
+ for (const [subpath, value] of Object.entries(exportsField)) {
252
+ if (subpath.endsWith(".json") || subpath.includes("*")) continue;
253
+ const resolved = resolveExportCondition(value, conditions);
254
+ if (resolved && resolved.endsWith(".js")) entries[subpath] = resolved;
255
+ }
256
+ return entries;
257
+ }
258
+ function resolveExportCondition(value, conditions) {
259
+ if (typeof value === "string") return value;
260
+ if (typeof value === "object" && value !== null) {
261
+ for (const cond of conditions) if (cond in value) return resolveExportCondition(value[cond], conditions);
262
+ }
263
+ return null;
264
+ }
265
+ function subpathToEntryName(pkgName, subpath) {
266
+ if (subpath === ".") return pkgName.replace(/\//g, "_").replace(/@/g, "");
267
+ const sub = subpath.slice(2).replace(/\//g, "_");
268
+ return `${pkgName.replace(/\//g, "_").replace(/@/g, "")}_${sub}`;
269
+ }
270
+ async function bundleCjsPackages(cjsPackages, sourceDir, nodeModulesRoot) {
271
+ const entryToSubpath = {};
272
+ for (const { pkgName, pkg } of cjsPackages) {
273
+ const exportEntries = extractExportEntries(pkg);
274
+ for (const [subpath] of Object.entries(exportEntries)) {
275
+ const entryName = subpathToEntryName(pkgName, subpath);
276
+ entryToSubpath[entryName] = {
277
+ pkgName,
278
+ subpath
279
+ };
280
+ }
281
+ }
282
+ if (Object.keys(entryToSubpath).length === 0) return { nodeModulesEntries: {} };
283
+ const esmDir = resolve(nodeModulesRoot, ".vrowzer-esm");
284
+ await mkdir(esmDir, { recursive: true });
285
+ const wrapperPlugin = {
286
+ name: "cjs-esm-wrapper",
287
+ resolveId(id) {
288
+ if (id.startsWith("\0esm-wrapper:")) return id;
289
+ },
290
+ load(id) {
291
+ if (id.startsWith("\0esm-wrapper:")) {
292
+ const specifier = id.slice(13);
293
+ const wrapperCode = esmWrappers.get(specifier);
294
+ if (wrapperCode) return wrapperCode;
295
+ return `export { default } from '${specifier}';`;
296
+ }
297
+ }
298
+ };
299
+ const { createRequire } = await import("node:module");
300
+ const require = createRequire(join(nodeModulesRoot, "_"));
301
+ const esmWrappers = /* @__PURE__ */ new Map();
302
+ for (const [_entryName, { pkgName, subpath }] of Object.entries(entryToSubpath)) {
303
+ const specifier = subpath === "." ? pkgName : `${pkgName}/${subpath.slice(2)}`;
304
+ try {
305
+ const mod = require(specifier);
306
+ const namedExports = Object.keys(mod).filter((k) => k !== "default" && k !== "__esModule" && /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(k));
307
+ if (namedExports.length > 0) {
308
+ const lines = [
309
+ `import __cjs_mod__ from '${specifier}';`,
310
+ `export default __cjs_mod__;`,
311
+ ...namedExports.map((name) => `export const ${name} = __cjs_mod__.${name};`)
312
+ ];
313
+ esmWrappers.set(specifier, lines.join("\n"));
314
+ } else esmWrappers.set(specifier, `export { default } from '${specifier}';`);
315
+ } catch {
316
+ esmWrappers.set(specifier, `export { default } from '${specifier}';`);
317
+ }
318
+ }
319
+ const wrapperEntries = {};
320
+ for (const [entryName, { pkgName, subpath }] of Object.entries(entryToSubpath)) wrapperEntries[entryName] = `\0esm-wrapper:${subpath === "." ? pkgName : `${pkgName}/${subpath.slice(2)}`}`;
321
+ const bundle = await rolldown({
322
+ input: wrapperEntries,
323
+ resolve: {
324
+ conditionNames: [
325
+ "browser",
326
+ "import",
327
+ "default"
328
+ ],
329
+ modules: [nodeModulesRoot, "node_modules"]
330
+ },
331
+ transform: { define: { "process.env.NODE_ENV": JSON.stringify("development") } },
332
+ plugins: [wrapperPlugin]
333
+ });
334
+ const { output } = await bundle.write({
335
+ format: "esm",
336
+ dir: esmDir,
337
+ entryFileNames: "[name].js",
338
+ chunkFileNames: "[name]-[hash].js",
339
+ minify: false
340
+ });
341
+ await bundle.close();
342
+ const nodeModulesEntries = {};
343
+ for (const chunk of output) if (chunk.type === "chunk") {
344
+ const virtualPath = `/node_modules/.vrowzer-esm/${chunk.fileName}`;
345
+ nodeModulesEntries[virtualPath] = "./" + relative(sourceDir, resolve(esmDir, chunk.fileName)).replace(/\\/g, "/");
346
+ }
347
+ const pkgExportsMap = /* @__PURE__ */ new Map();
348
+ for (const [entryName, { pkgName, subpath }] of Object.entries(entryToSubpath)) {
349
+ if (!pkgExportsMap.has(pkgName)) pkgExportsMap.set(pkgName, {});
350
+ pkgExportsMap.get(pkgName)[subpath] = `../.vrowzer-esm/${entryName}.js`;
351
+ }
352
+ for (const { pkgName, pkg } of cjsPackages) {
353
+ const modifiedExports = pkgExportsMap.get(pkgName) || {};
354
+ const modifiedPkg = {
355
+ name: pkg.name,
356
+ type: "module",
357
+ exports: modifiedExports
358
+ };
359
+ const modifiedPkgPath = resolve(esmDir, `${pkgName.replace(/\//g, "_").replace(/@/g, "")}-package.json`);
360
+ await writeFile(modifiedPkgPath, JSON.stringify(modifiedPkg, null, 2) + "\n");
361
+ const virtualPkgJsonPath = `/node_modules/${pkgName}/package.json`;
362
+ nodeModulesEntries[virtualPkgJsonPath] = "./" + relative(sourceDir, modifiedPkgPath).replace(/\\/g, "/");
363
+ }
364
+ return { nodeModulesEntries };
365
+ }
366
+ /**
367
+ * Generate a vrowzer manifest from a project directory.
368
+ *
369
+ * This is the main entry point for manifest generation, used by both
370
+ * the CLI script and the Vrowzer plugin's auto-generation mode.
371
+ */
372
+ async function generateManifest(options, log = console.log) {
373
+ const { pkgDir, targets = [], includeDevDependencies = false, activeFile } = options;
374
+ const sourceDir = options.sourceDir || pkgDir;
375
+ const pkg = await readPackageJson(pkgDir);
376
+ const name = options.name || pkg.name;
377
+ if (!name) throw new Error("No \"name\" field in package.json. Use the name option to specify.");
378
+ log(`Generating manifest for: ${pkgDir}`);
379
+ if (sourceDir !== pkgDir) log(` Source directory: ${sourceDir}`);
380
+ const projectFiles = await collectProjectFiles(sourceDir);
381
+ log(` Project files: ${Object.keys(projectFiles).length}`);
382
+ const visited = /* @__PURE__ */ new Set();
383
+ let depDirs;
384
+ if (targets.length > 0) {
385
+ depDirs = [];
386
+ for (const target of targets) {
387
+ const depDir = await resolvePackageDir(target, pkgDir);
388
+ if (!depDir) {
389
+ log(` Warning: target package "${target}" not found in node_modules`);
390
+ continue;
391
+ }
392
+ if (!visited.has(depDir)) {
393
+ visited.add(depDir);
394
+ depDirs.push(depDir);
395
+ const transitive = await collectDependencies(depDir, visited);
396
+ depDirs.push(...transitive);
397
+ }
398
+ }
399
+ log(` Target packages: ${targets.join(", ")}`);
400
+ } else depDirs = await collectDependencies(pkgDir, visited, includeDevDependencies);
401
+ log(` Dependencies: ${depDirs.length} packages`);
402
+ const cjsPackages = [];
403
+ const nodeModulesFiles = {};
404
+ for (const depDir of depDirs) {
405
+ const depPkg = await readPackageJson(depDir);
406
+ const pkgName = depPkg.name;
407
+ if (!pkgName) continue;
408
+ if (isCjsPackage(depPkg) && depPkg.exports) cjsPackages.push({
409
+ pkgName,
410
+ pkg: depPkg
411
+ });
412
+ else {
413
+ const files = await walkPackageFiles(depDir);
414
+ for (const filePath of files) {
415
+ const virtualPath = `/node_modules/${pkgName}/${relative(depDir, filePath).replace(/\\/g, "/")}`;
416
+ nodeModulesFiles[virtualPath] = "./" + relative(sourceDir, filePath).replace(/\\/g, "/");
417
+ }
418
+ }
419
+ }
420
+ if (cjsPackages.length > 0) {
421
+ log(` CJS packages: ${cjsPackages.map((p) => p.pkgName).join(", ")}`);
422
+ const { nodeModulesEntries } = await bundleCjsPackages(cjsPackages, sourceDir, join(pkgDir, "node_modules"));
423
+ Object.assign(nodeModulesFiles, nodeModulesEntries);
424
+ }
425
+ log(` Node modules files: ${Object.keys(nodeModulesFiles).length}`);
426
+ const manifest = {
427
+ name,
428
+ files: projectFiles
429
+ };
430
+ if (Object.keys(nodeModulesFiles).length > 0) manifest.nodeModules = nodeModulesFiles;
431
+ const resolvedActiveFile = activeFile || detectActiveFile(projectFiles);
432
+ if (resolvedActiveFile) manifest.activeFile = resolvedActiveFile;
433
+ return manifest;
434
+ }
435
+
436
+ //#endregion
437
+ export { bundleCjsPackages, collectDependencies, collectProjectFiles, detectActiveFile, extractExportEntries, generateManifest, isCjsPackage, readPackageJson, resolvePackageDir, shouldExcludeDir, shouldIncludeFile, subpathToEntryName, walkDir, walkPackageFiles };
438
+ //# sourceMappingURL=manifest-generate.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-generate.mjs","names":["path","entries: import('node:fs').Dirent[]","result: string[]","result","files: Record<string, string>","entries: Record<string, string>","entryToSubpath: Record<string, { pkgName: string; subpath: string }>","wrapperEntries: Record<string, string>","nodeModulesEntries: Record<string, string>","depDirs: string[]","cjsPackages: { pkgName: string; pkg: PackageJson }[]","nodeModulesFiles: Record<string, string>","manifest: ManifestResult"],"sources":["../src/manifest-generate.ts"],"sourcesContent":["/**\n * Core logic for generating vrowzer-manifest.json.\n *\n * Shared between `scripts/generate-manifest.ts` (CLI) and\n * the `Vrowzer()` plugin (auto-generation mode).\n *\n * @module manifest-generate\n */\n\n/**\n * @author kazuya kawaguchi (a.k.a. kazupon)\n * @license MIT\n */\n\nimport { readdir, realpath, stat, writeFile, mkdir } from 'node:fs/promises'\nimport { basename, dirname, extname, join, relative, resolve } from 'node:path'\nimport { rolldown } from 'rolldown'\n\n// --- Types ---\n\nexport type PackageJson = {\n name: string\n type?: string\n exports?: Record<string, any> | string\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n files?: string[]\n}\n\nexport interface GenerateManifestOptions {\n /**\n * Directory containing the target package.json (for node_modules resolution)\n */\n pkgDir: string\n /**\n * Directory to scan for project source files. Defaults to pkgDir.\n */\n sourceDir?: string\n /**\n * Package name(s) to include in nodeModules. When omitted, all dependencies are included.\n */\n targets?: string[]\n /**\n * When true, include devDependencies in dependency collection (default: false).\n * Used by CLI for fixture projects where runtime deps may be in devDependencies.\n */\n includeDevDependencies?: boolean\n /**\n * Override manifest name. Defaults to package.json name.\n */\n name?: string\n /**\n * Default file to open in editor\n */\n activeFile?: string\n}\n\nexport interface ManifestResult {\n name: string\n files: Record<string, string>\n nodeModules?: Record<string, string>\n activeFile?: string\n}\n\n// --- Config ---\n\nconst INCLUDE_EXTENSIONS = new Set([\n '.js',\n '.mjs',\n '.cjs',\n '.json',\n '.ts',\n '.mts',\n '.d.ts',\n '.d.mts',\n '.d.cts',\n '.svelte',\n '.vue',\n '.jsx',\n '.tsx',\n '.css',\n '.html',\n '.svg',\n '.yaml',\n '.yml',\n '.wasm'\n])\n\nconst EXCLUDE_DIRS = new Set([\n '.git',\n '.github',\n '.pnpm',\n '.vite',\n '.vrowzer',\n '__tests__',\n '__mocks__',\n 'node_modules',\n 'test',\n 'tests',\n 'benchmark',\n 'benchmarks'\n])\n\nconst EXCLUDE_FILE_PREFIXES = ['README', 'LICENSE', 'CHANGELOG', 'LICENCE']\nconst EXCLUDE_FILE_SUFFIXES = ['.map']\nconst EXCLUDE_FILE_NAMES = new Set(['manifest.json', 'vrowzer-manifest.json', 'package.json'])\nconst TEST_FILE_RE = /\\.(test|spec)\\.(js|mjs|cjs|ts|cts|mts)$/\n\nconst PROJECT_SOURCE_PATTERNS = ['index.html', 'src', 'public']\nconst ACTIVE_FILE_CANDIDATES = [\n 'App.vue',\n 'App.svelte',\n 'App.tsx',\n 'App.jsx',\n 'main.ts',\n 'main.js',\n 'index.html'\n]\n\n// --- Helpers ---\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path)\n return true\n } catch {\n return false\n }\n}\n\nconst EMPTY_PKG_JSON = Object.freeze({\n name: '',\n dependencies: {},\n devDependencies: {},\n files: []\n} as PackageJson)\n\nexport async function readPackageJson(dir: string): Promise<PackageJson> {\n const pkgPath = join(dir, 'package.json')\n if (!(await exists(pkgPath))) {\n return EMPTY_PKG_JSON\n }\n try {\n const { default: pkg } = (await import(pkgPath, { with: { type: 'json' } })) as {\n default: PackageJson\n }\n return pkg\n } catch {\n return EMPTY_PKG_JSON\n }\n}\n\nexport function shouldIncludeFile(filePath: string): boolean {\n const name = basename(filePath)\n\n if (name.startsWith('.')) {\n return false\n }\n\n if (EXCLUDE_FILE_NAMES.has(name)) {\n return false\n }\n\n if (EXCLUDE_FILE_PREFIXES.some(p => name.startsWith(p))) {\n return false\n }\n\n if (EXCLUDE_FILE_SUFFIXES.some(s => name.endsWith(s))) {\n return false\n }\n\n if (TEST_FILE_RE.test(name)) {\n return false\n }\n\n const ext = extname(name)\n return INCLUDE_EXTENSIONS.has(ext)\n}\n\nexport function shouldExcludeDir(dirName: string): boolean {\n return EXCLUDE_DIRS.has(dirName) || dirName.startsWith('.')\n}\n\n/**\n * Recursively walk a directory and collect files.\n * Follows symlinks but records logical paths.\n */\nexport async function walkDir(dir: string, files: string[] = []): Promise<string[]> {\n let entries: import('node:fs').Dirent[]\n try {\n entries = (await readdir(dir, { withFileTypes: true })) as unknown as import('node:fs').Dirent[]\n } catch {\n return files\n }\n\n for (const entry of entries) {\n const name = String(entry.name)\n const fullPath = join(dir, name)\n\n if (entry.isDirectory() || entry.isSymbolicLink()) {\n try {\n const s = await stat(fullPath)\n if (s.isDirectory()) {\n if (!shouldExcludeDir(name)) {\n await walkDir(fullPath, files)\n }\n } else if (s.isFile() && shouldIncludeFile(name)) {\n files.push(fullPath)\n }\n } catch {\n // broken symlink, skip\n }\n } else if (entry.isFile() && shouldIncludeFile(name)) {\n files.push(fullPath)\n }\n }\n\n return files\n}\n\n/**\n * Walk a package directory, respecting its package.json \"files\" field if present.\n */\nexport async function walkPackageFiles(pkgDir: string): Promise<string[]> {\n const pkg = await readPackageJson(pkgDir)\n const pkgFiles = pkg.files\n\n if (pkgFiles && pkgFiles.length > 0) {\n const result: string[] = [join(pkgDir, 'package.json')]\n\n for (const pattern of pkgFiles) {\n const target = join(pkgDir, pattern)\n if (!(await exists(target))) {\n continue\n }\n\n try {\n const s = await stat(target)\n if (s.isDirectory()) {\n await walkDir(target, result)\n } else if (s.isFile() && shouldIncludeFile(target)) {\n result.push(target)\n }\n } catch {\n // skip\n }\n }\n\n return result\n }\n\n // No \"files\" field — walk everything with extension filter\n const result = [join(pkgDir, 'package.json')]\n await walkDir(pkgDir, result)\n return result\n}\n\n// --- Dependency collection ---\n\nexport async function resolvePackageDir(dep: string, fromDir: string): Promise<string | null> {\n const dirs = [fromDir]\n try {\n const real = await realpath(fromDir)\n if (real !== fromDir) {\n dirs.push(real)\n }\n } catch {\n // ignore\n }\n\n for (const dir of dirs) {\n let current = dir\n while (true) {\n const candidate = join(current, 'node_modules', dep)\n if (await exists(candidate)) {\n return candidate\n }\n\n const parent = dirname(current)\n if (parent === current) {\n break\n }\n current = parent\n }\n }\n return null\n}\n\nexport async function collectDependencies(\n pkgDir: string,\n visited: Set<string>,\n isRoot = false\n): Promise<string[]> {\n const pkg = await readPackageJson(pkgDir)\n const deps = isRoot\n ? [...Object.keys(pkg.dependencies || {}), ...Object.keys(pkg.devDependencies || {})]\n : Object.keys(pkg.dependencies || {})\n const result: string[] = []\n\n for (const dep of deps) {\n const depDir = await resolvePackageDir(dep, pkgDir)\n if (!depDir) {\n continue\n }\n\n if (visited.has(depDir)) {\n continue\n }\n visited.add(depDir)\n result.push(depDir)\n\n const transitive = await collectDependencies(depDir, visited)\n result.push(...transitive)\n }\n\n return result\n}\n\n// --- Project source files ---\n\nexport async function collectProjectFiles(projectDir: string): Promise<Record<string, string>> {\n const files: Record<string, string> = {}\n\n for (const pattern of PROJECT_SOURCE_PATTERNS) {\n const target = join(projectDir, pattern)\n if (!(await exists(target))) {\n continue\n }\n\n try {\n const s = await stat(target)\n if (s.isDirectory()) {\n const walked = await walkDir(target)\n for (const filePath of walked) {\n const relPath = relative(projectDir, filePath).replace(/\\\\/g, '/')\n files['/' + relPath] = './' + relPath\n }\n } else if (s.isFile() && shouldIncludeFile(target)) {\n const relPath = relative(projectDir, target).replace(/\\\\/g, '/')\n files['/' + relPath] = './' + relPath\n }\n } catch {\n // skip\n }\n }\n\n // Also pick up root-level source files (*.ts, *.js, *.vue, etc.)\n try {\n const rootEntries = (await readdir(projectDir, {\n withFileTypes: true\n })) as unknown as import('node:fs').Dirent[]\n for (const entry of rootEntries) {\n const entryName = String(entry.name)\n if (entry.isFile() && shouldIncludeFile(entryName)) {\n const virtualPath = '/' + entryName\n if (!files[virtualPath]) {\n files[virtualPath] = './' + entryName\n }\n }\n }\n } catch {\n // skip\n }\n\n return files\n}\n\nexport function detectActiveFile(files: Record<string, string>): string | undefined {\n for (const candidate of ACTIVE_FILE_CANDIDATES) {\n const rootPath = '/' + candidate\n const srcPath = '/src/' + candidate\n if (files[rootPath]) {\n return rootPath\n }\n if (files[srcPath]) {\n return srcPath\n }\n }\n const keys = Object.keys(files)\n return keys.length > 0 ? keys[0] : undefined\n}\n\n// --- CJS → ESM bundling ---\n\nexport function isCjsPackage(pkg: PackageJson): boolean {\n if (pkg.type === 'module') {\n return false\n }\n\n // Packages with ESM entries in exports (e.g. vue) are not truly CJS —\n // they provide ESM via the \"import\" condition and can be used directly.\n const mainExport =\n typeof pkg.exports === 'object' && pkg.exports !== null\n ? (pkg.exports as Record<string, any>)['.']\n : undefined\n if (mainExport && typeof mainExport === 'object' && 'import' in mainExport) {\n return false\n }\n\n return true\n}\n\nexport function extractExportEntries(\n pkg: PackageJson,\n conditions: string[] = ['browser', 'import', 'default']\n): Record<string, string> {\n const entries: Record<string, string> = {}\n const exportsField = pkg.exports\n\n if (!exportsField || typeof exportsField === 'string') {\n return entries\n }\n\n for (const [subpath, value] of Object.entries(exportsField)) {\n if (subpath.endsWith('.json') || subpath.includes('*')) {\n continue\n }\n\n const resolved = resolveExportCondition(value, conditions)\n if (resolved && resolved.endsWith('.js')) {\n entries[subpath] = resolved\n }\n }\n\n return entries\n}\n\nfunction resolveExportCondition(value: unknown, conditions: string[]): string | null {\n if (typeof value === 'string') {\n return value\n }\n if (typeof value === 'object' && value !== null) {\n for (const cond of conditions) {\n if (cond in value) {\n return resolveExportCondition((value as Record<string, unknown>)[cond], conditions)\n }\n }\n }\n return null\n}\n\nexport function subpathToEntryName(pkgName: string, subpath: string): string {\n if (subpath === '.') {\n return pkgName.replace(/\\//g, '_').replace(/@/g, '')\n }\n const sub = subpath.slice(2).replace(/\\//g, '_')\n return `${pkgName.replace(/\\//g, '_').replace(/@/g, '')}_${sub}`\n}\n\ninterface CjsBundleResult {\n nodeModulesEntries: Record<string, string>\n}\n\nexport async function bundleCjsPackages(\n cjsPackages: { pkgName: string; pkg: PackageJson }[],\n sourceDir: string,\n nodeModulesRoot: string\n): Promise<CjsBundleResult> {\n const entryToSubpath: Record<string, { pkgName: string; subpath: string }> = {}\n\n for (const { pkgName, pkg } of cjsPackages) {\n const exportEntries = extractExportEntries(pkg)\n for (const [subpath] of Object.entries(exportEntries)) {\n const entryName = subpathToEntryName(pkgName, subpath)\n entryToSubpath[entryName] = { pkgName, subpath }\n }\n }\n\n if (Object.keys(entryToSubpath).length === 0) {\n return { nodeModulesEntries: {} }\n }\n\n const esmDir = resolve(nodeModulesRoot, '.vrowzer-esm')\n await mkdir(esmDir, { recursive: true })\n\n // Generate ESM wrapper entries with explicit named exports\n const wrapperPlugin = {\n name: 'cjs-esm-wrapper',\n resolveId(id: string) {\n if (id.startsWith('\\0esm-wrapper:')) {\n return id\n }\n },\n load(id: string) {\n if (id.startsWith('\\0esm-wrapper:')) {\n const specifier = id.slice('\\0esm-wrapper:'.length)\n const wrapperCode = esmWrappers.get(specifier)\n if (wrapperCode) {\n return wrapperCode\n }\n return `export { default } from '${specifier}';`\n }\n }\n }\n\n const { createRequire } = await import('node:module')\n const require = createRequire(join(nodeModulesRoot, '_'))\n const esmWrappers = new Map<string, string>()\n\n for (const [_entryName, { pkgName, subpath }] of Object.entries(entryToSubpath)) {\n const specifier = subpath === '.' ? pkgName : `${pkgName}/${subpath.slice(2)}`\n try {\n const mod = require(specifier)\n const namedExports = Object.keys(mod).filter(\n k => k !== 'default' && k !== '__esModule' && /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(k)\n )\n if (namedExports.length > 0) {\n const lines = [\n `import __cjs_mod__ from '${specifier}';`,\n `export default __cjs_mod__;`,\n ...namedExports.map(name => `export const ${name} = __cjs_mod__.${name};`)\n ]\n esmWrappers.set(specifier, lines.join('\\n'))\n } else {\n esmWrappers.set(specifier, `export { default } from '${specifier}';`)\n }\n } catch {\n esmWrappers.set(specifier, `export { default } from '${specifier}';`)\n }\n }\n\n const wrapperEntries: Record<string, string> = {}\n for (const [entryName, { pkgName, subpath }] of Object.entries(entryToSubpath)) {\n const specifier = subpath === '.' ? pkgName : `${pkgName}/${subpath.slice(2)}`\n wrapperEntries[entryName] = `\\0esm-wrapper:${specifier}`\n }\n\n const bundle = await rolldown({\n input: wrapperEntries,\n resolve: {\n conditionNames: ['browser', 'import', 'default'],\n modules: [nodeModulesRoot, 'node_modules']\n },\n transform: {\n define: {\n 'process.env.NODE_ENV': JSON.stringify('development')\n }\n },\n plugins: [wrapperPlugin]\n })\n\n const { output } = await bundle.write({\n format: 'esm',\n dir: esmDir,\n entryFileNames: '[name].js',\n chunkFileNames: '[name]-[hash].js',\n minify: false\n })\n await bundle.close()\n\n const nodeModulesEntries: Record<string, string> = {}\n\n for (const chunk of output) {\n if (chunk.type === 'chunk') {\n const virtualPath = `/node_modules/.vrowzer-esm/${chunk.fileName}`\n const relPath = relative(sourceDir, resolve(esmDir, chunk.fileName)).replace(/\\\\/g, '/')\n nodeModulesEntries[virtualPath] = './' + relPath\n }\n }\n\n // Generate modified package.json for each CJS package\n const pkgExportsMap = new Map<string, Record<string, string>>()\n for (const [entryName, { pkgName, subpath }] of Object.entries(entryToSubpath)) {\n if (!pkgExportsMap.has(pkgName)) {\n pkgExportsMap.set(pkgName, {})\n }\n pkgExportsMap.get(pkgName)![subpath] = `../.vrowzer-esm/${entryName}.js`\n }\n\n for (const { pkgName, pkg } of cjsPackages) {\n const modifiedExports = pkgExportsMap.get(pkgName) || {}\n\n const modifiedPkg = {\n name: pkg.name,\n type: 'module',\n exports: modifiedExports\n }\n const modifiedPkgPath = resolve(\n esmDir,\n `${pkgName.replace(/\\//g, '_').replace(/@/g, '')}-package.json`\n )\n await writeFile(modifiedPkgPath, JSON.stringify(modifiedPkg, null, 2) + '\\n')\n\n const virtualPkgJsonPath = `/node_modules/${pkgName}/package.json`\n const relPkgJsonPath = relative(sourceDir, modifiedPkgPath).replace(/\\\\/g, '/')\n nodeModulesEntries[virtualPkgJsonPath] = './' + relPkgJsonPath\n }\n\n return { nodeModulesEntries }\n}\n\n// --- High-level API ---\n\nexport interface GenerateManifestLog {\n (message: string): void\n}\n\n/**\n * Generate a vrowzer manifest from a project directory.\n *\n * This is the main entry point for manifest generation, used by both\n * the CLI script and the Vrowzer plugin's auto-generation mode.\n */\nexport async function generateManifest(\n options: GenerateManifestOptions,\n log: GenerateManifestLog = console.log\n): Promise<ManifestResult> {\n const { pkgDir, targets = [], includeDevDependencies = false, activeFile } = options\n const sourceDir = options.sourceDir || pkgDir\n\n // Read package.json\n const pkg = await readPackageJson(pkgDir)\n const name = options.name || pkg.name\n if (!name) {\n throw new Error('No \"name\" field in package.json. Use the name option to specify.')\n }\n\n log(`Generating manifest for: ${pkgDir}`)\n if (sourceDir !== pkgDir) {\n log(` Source directory: ${sourceDir}`)\n }\n\n // 1. Collect project source files\n const projectFiles = await collectProjectFiles(sourceDir)\n log(` Project files: ${Object.keys(projectFiles).length}`)\n\n // 2. Collect dependency packages\n const visited = new Set<string>()\n let depDirs: string[]\n if (targets.length > 0) {\n depDirs = []\n for (const target of targets) {\n const depDir = await resolvePackageDir(target, pkgDir)\n if (!depDir) {\n log(` Warning: target package \"${target}\" not found in node_modules`)\n continue\n }\n if (!visited.has(depDir)) {\n visited.add(depDir)\n depDirs.push(depDir)\n const transitive = await collectDependencies(depDir, visited)\n depDirs.push(...transitive)\n }\n }\n log(` Target packages: ${targets.join(', ')}`)\n } else {\n depDirs = await collectDependencies(pkgDir, visited, includeDevDependencies)\n }\n log(` Dependencies: ${depDirs.length} packages`)\n\n // 3. Separate CJS and ESM packages\n const cjsPackages: { pkgName: string; pkg: PackageJson }[] = []\n const nodeModulesFiles: Record<string, string> = {}\n\n for (const depDir of depDirs) {\n const depPkg = await readPackageJson(depDir)\n const pkgName = depPkg.name\n if (!pkgName) {\n continue\n }\n\n if (isCjsPackage(depPkg) && depPkg.exports) {\n cjsPackages.push({ pkgName, pkg: depPkg })\n } else {\n const files = await walkPackageFiles(depDir)\n for (const filePath of files) {\n const fileRelToPkg = relative(depDir, filePath).replace(/\\\\/g, '/')\n const virtualPath = `/node_modules/${pkgName}/${fileRelToPkg}`\n const relPath = relative(sourceDir, filePath).replace(/\\\\/g, '/')\n nodeModulesFiles[virtualPath] = './' + relPath\n }\n }\n }\n\n // 4. Bundle CJS packages into ESM\n if (cjsPackages.length > 0) {\n log(` CJS packages: ${cjsPackages.map(p => p.pkgName).join(', ')}`)\n const nodeModulesRoot = join(pkgDir, 'node_modules')\n const { nodeModulesEntries } = await bundleCjsPackages(cjsPackages, sourceDir, nodeModulesRoot)\n Object.assign(nodeModulesFiles, nodeModulesEntries)\n }\n\n log(` Node modules files: ${Object.keys(nodeModulesFiles).length}`)\n\n // 5. Build manifest\n const manifest: ManifestResult = { name, files: projectFiles }\n\n if (Object.keys(nodeModulesFiles).length > 0) {\n manifest.nodeModules = nodeModulesFiles\n }\n\n const resolvedActiveFile = activeFile || detectActiveFile(projectFiles)\n if (resolvedActiveFile) {\n manifest.activeFile = resolvedActiveFile\n }\n\n return manifest\n}\n"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,88 @@
1
+ {
2
+ "name": "@vrowzer/vite-plugin",
3
+ "description": "Vite plugin for vrowzer",
4
+ "version": "0.0.0",
5
+ "author": {
6
+ "name": "kazuya kawaguchi",
7
+ "email": "kawakazu80@gmail.com"
8
+ },
9
+ "license": "MIT",
10
+ "funding": "https://github.com/sponsors/kazupon",
11
+ "bugs": {
12
+ "url": "https://github.com/kazupon/vrowzer/issues"
13
+ },
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/kazupon/vrowzer.git",
17
+ "directory": "packages/vite-plugin"
18
+ },
19
+ "keywords": [
20
+ "vrowzer",
21
+ "vite"
22
+ ],
23
+ "publishConfig": {
24
+ "access": "public"
25
+ },
26
+ "engines": {
27
+ "node": ">= 20.19.0"
28
+ },
29
+ "type": "module",
30
+ "files": [
31
+ "dist"
32
+ ],
33
+ "exports": {
34
+ ".": {
35
+ "types": "./dist/index.d.mts",
36
+ "import": "./dist/index.mjs"
37
+ },
38
+ "./manifest-generate": {
39
+ "types": "./dist/manifest-generate.d.mts",
40
+ "import": "./dist/manifest-generate.mjs"
41
+ },
42
+ "./package.json": "./package.json"
43
+ },
44
+ "typesVersions": {
45
+ "*": {
46
+ "*": [
47
+ "./dist/*",
48
+ "./*"
49
+ ]
50
+ }
51
+ },
52
+ "dependencies": {
53
+ "@rollup/plugin-inject": "^5.0.5",
54
+ "birpc": "^2.3.0",
55
+ "buffer": "^6.0.3",
56
+ "obug": "^2.1.1",
57
+ "pathe": "^2.0.3",
58
+ "readable-stream": "^4.7.0",
59
+ "rolldown": "1.0.0-rc.9",
60
+ "ws": "^8.18.0",
61
+ "@vrowzer/fs": "0.0.0",
62
+ "@vrowzer/node-polyfill": "0.0.0",
63
+ "@vrowzer/rolldown": "0.0.0",
64
+ "@vrowzer/unplugin-service-worker": "0.0.0"
65
+ },
66
+ "peerDependencies": {
67
+ "@vrowzer/vite-dev-server": "0.0.0",
68
+ "vrowzer": "0.0.0"
69
+ },
70
+ "devDependencies": {
71
+ "@iconify-icons/vscode-icons": "^1.2.29",
72
+ "@iconify/vue": "^5.0.0",
73
+ "@oxc-project/types": "0.110.0",
74
+ "@types/ws": "^8.18.0",
75
+ "@vitejs/plugin-vue": "^6.0.1",
76
+ "monaco-editor": "^0.55.1",
77
+ "publint": "^0.3.18",
78
+ "tsdown": "0.18.4",
79
+ "vite": "^8.0.0",
80
+ "vitest": "^4.0.18",
81
+ "vue": "^3.5.24"
82
+ },
83
+ "scripts": {
84
+ "build": "tsdown && pnpm build:ide",
85
+ "build:ide": "vite build --config vite.ide.config.ts",
86
+ "typecheck": "tsgo --noEmit -p tsconfig.json"
87
+ }
88
+ }