@marko/vite 2.0.1 → 2.2.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 (61) hide show
  1. package/{components → dist/components}/vite-watch.marko +0 -0
  2. package/{components → dist/components}/vite.marko +0 -0
  3. package/dist/{cjs/index.d.ts → index.d.ts} +0 -0
  4. package/dist/index.js +413 -0
  5. package/dist/index.mjs +408 -0
  6. package/dist/{cjs/manifest-generator.d.ts → manifest-generator.d.ts} +0 -0
  7. package/dist/manifest-generator.js +88 -0
  8. package/dist/manifest-generator.mjs +60 -0
  9. package/dist/{cjs/render-assets-transform.d.ts → render-assets-transform.d.ts} +0 -0
  10. package/dist/render-assets-transform.js +21 -0
  11. package/dist/render-assets-transform.mjs +12 -0
  12. package/dist/{cjs/serializer.d.ts → serializer.d.ts} +0 -0
  13. package/dist/serializer.js +103 -0
  14. package/dist/serializer.mjs +78 -0
  15. package/dist/{cjs/server-entry-template.d.ts → server-entry-template.d.ts} +0 -0
  16. package/dist/server-entry-template.js +45 -0
  17. package/dist/server-entry-template.mjs +20 -0
  18. package/package.json +44 -42
  19. package/dist/cjs/index.js +0 -413
  20. package/dist/cjs/index.js.map +0 -1
  21. package/dist/cjs/manifest-generator.js +0 -63
  22. package/dist/cjs/manifest-generator.js.map +0 -1
  23. package/dist/cjs/package-relative-path.d.ts +0 -2
  24. package/dist/cjs/package-relative-path.js +0 -22
  25. package/dist/cjs/package-relative-path.js.map +0 -1
  26. package/dist/cjs/precompile-dependencies.d.ts +0 -5
  27. package/dist/cjs/precompile-dependencies.js +0 -73
  28. package/dist/cjs/precompile-dependencies.js.map +0 -1
  29. package/dist/cjs/relative-imports-translate.d.ts +0 -3
  30. package/dist/cjs/relative-imports-translate.js +0 -24
  31. package/dist/cjs/relative-imports-translate.js.map +0 -1
  32. package/dist/cjs/render-assets-transform.js +0 -12
  33. package/dist/cjs/render-assets-transform.js.map +0 -1
  34. package/dist/cjs/serializer.js +0 -81
  35. package/dist/cjs/serializer.js.map +0 -1
  36. package/dist/cjs/server-entry-template.js +0 -22
  37. package/dist/cjs/server-entry-template.js.map +0 -1
  38. package/dist/esm/index.d.ts +0 -10
  39. package/dist/esm/index.js +0 -409
  40. package/dist/esm/index.js.map +0 -1
  41. package/dist/esm/manifest-generator.d.ts +0 -11
  42. package/dist/esm/manifest-generator.js +0 -57
  43. package/dist/esm/manifest-generator.js.map +0 -1
  44. package/dist/esm/package-relative-path.d.ts +0 -2
  45. package/dist/esm/package-relative-path.js +0 -17
  46. package/dist/esm/package-relative-path.js.map +0 -1
  47. package/dist/esm/precompile-dependencies.d.ts +0 -5
  48. package/dist/esm/precompile-dependencies.js +0 -69
  49. package/dist/esm/precompile-dependencies.js.map +0 -1
  50. package/dist/esm/relative-imports-translate.d.ts +0 -3
  51. package/dist/esm/relative-imports-translate.js +0 -21
  52. package/dist/esm/relative-imports-translate.js.map +0 -1
  53. package/dist/esm/render-assets-transform.d.ts +0 -3
  54. package/dist/esm/render-assets-transform.js +0 -10
  55. package/dist/esm/render-assets-transform.js.map +0 -1
  56. package/dist/esm/serializer.d.ts +0 -2
  57. package/dist/esm/serializer.js +0 -78
  58. package/dist/esm/serializer.js.map +0 -1
  59. package/dist/esm/server-entry-template.d.ts +0 -6
  60. package/dist/esm/server-entry-template.js +0 -19
  61. package/dist/esm/server-entry-template.js.map +0 -1
File without changes
File without changes
File without changes
package/dist/index.js ADDED
@@ -0,0 +1,413 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __defProps = Object.defineProperties;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
8
+ var __getProtoOf = Object.getPrototypeOf;
9
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
10
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
11
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12
+ var __spreadValues = (a, b) => {
13
+ for (var prop in b || (b = {}))
14
+ if (__hasOwnProp.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ if (__getOwnPropSymbols)
17
+ for (var prop of __getOwnPropSymbols(b)) {
18
+ if (__propIsEnum.call(b, prop))
19
+ __defNormalProp(a, prop, b[prop]);
20
+ }
21
+ return a;
22
+ };
23
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
24
+ var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
25
+ var __export = (target, all) => {
26
+ __markAsModule(target);
27
+ for (var name in all)
28
+ __defProp(target, name, { get: all[name], enumerable: true });
29
+ };
30
+ var __reExport = (target, module2, desc) => {
31
+ if (module2 && typeof module2 === "object" || typeof module2 === "function") {
32
+ for (let key of __getOwnPropNames(module2))
33
+ if (!__hasOwnProp.call(target, key) && key !== "default")
34
+ __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
35
+ }
36
+ return target;
37
+ };
38
+ var __toModule = (module2) => {
39
+ return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
40
+ };
41
+ __export(exports, {
42
+ default: () => markoPlugin
43
+ });
44
+ var import_os = __toModule(require("os"));
45
+ var import_fs = __toModule(require("fs"));
46
+ var import_path = __toModule(require("path"));
47
+ var import_crypto = __toModule(require("crypto"));
48
+ var import_url = __toModule(require("url"));
49
+ var import_anymatch = __toModule(require("anymatch"));
50
+ var import_server_entry_template = __toModule(require("./server-entry-template"));
51
+ var import_manifest_generator = __toModule(require("./manifest-generator"));
52
+ const import_meta = {};
53
+ const virtualFiles = /* @__PURE__ */ new Map();
54
+ const queryReg = /\?marko-.+$/;
55
+ const browserEntryQuery = "?marko-browser-entry";
56
+ const serverEntryQuery = "?marko-server-entry";
57
+ const virtualFileQuery = "?marko-virtual";
58
+ const markoExt = ".marko";
59
+ const htmlExt = ".html";
60
+ const resolveOpts = { skipSelf: true };
61
+ let tempDir;
62
+ function markoPlugin(opts = {}) {
63
+ var _a;
64
+ let compiler;
65
+ const { runtimeId, linked = true } = opts;
66
+ const baseConfig = {
67
+ runtimeId,
68
+ sourceMaps: true,
69
+ writeVersionComment: false,
70
+ cache: /* @__PURE__ */ new Map(),
71
+ babelConfig: __spreadProps(__spreadValues({}, opts.babelConfig), {
72
+ caller: __spreadValues({
73
+ name: "@marko/vite",
74
+ supportsStaticESM: true,
75
+ supportsDynamicImport: true,
76
+ supportsTopLevelAwait: true,
77
+ supportsExportNamespaceFrom: true
78
+ }, (_a = opts.babelConfig) == null ? void 0 : _a.caller)
79
+ })
80
+ };
81
+ const ssrConfig = __spreadProps(__spreadValues({}, baseConfig), {
82
+ output: "html"
83
+ });
84
+ const domConfig = __spreadProps(__spreadValues({}, baseConfig), {
85
+ resolveVirtualDependency(from, dep) {
86
+ const query = `${virtualFileQuery}&id=${dep.virtualPath}`;
87
+ const id = from + query;
88
+ if (devServer) {
89
+ const prev = virtualFiles.get(id);
90
+ if (prev && prev.code !== dep.code) {
91
+ devServer.moduleGraph.invalidateModule(devServer.moduleGraph.getModuleById(id));
92
+ }
93
+ }
94
+ virtualFiles.set(id, dep);
95
+ return `./${import_path.default.basename(from) + query}`;
96
+ },
97
+ output: "dom"
98
+ });
99
+ const hydrateConfig = __spreadProps(__spreadValues({}, domConfig), {
100
+ output: "hydrate"
101
+ });
102
+ let root;
103
+ let isBuild = false;
104
+ let isSSRBuild = false;
105
+ let devServer;
106
+ let registeredTag = false;
107
+ let serverManifest;
108
+ const transformWatchFiles = /* @__PURE__ */ new Map();
109
+ const transformOptionalFiles = /* @__PURE__ */ new Map();
110
+ return [
111
+ {
112
+ name: "marko-vite:pre",
113
+ enforce: "pre",
114
+ async config(config, env) {
115
+ var _a2, _b, _c, _d, _e;
116
+ compiler != null ? compiler : compiler = await Promise.resolve().then(() => __toModule(require(opts.compiler || "@marko/compiler")));
117
+ root = config.root || process.cwd();
118
+ isBuild = env.command === "build";
119
+ isSSRBuild = isBuild && linked && Boolean(config.build.ssr);
120
+ if (!registeredTag) {
121
+ const transformer = import_path.default.resolve(__filename, "../render-assets-transform");
122
+ registeredTag = import_path.default.resolve(__filename, "../components", isBuild ? "vite.marko" : "vite-watch.marko");
123
+ compiler.taglib.register("@marko/vite", {
124
+ "<_vite>": { template: registeredTag },
125
+ "<head>": { transformer },
126
+ "<body>": { transformer }
127
+ });
128
+ }
129
+ if (!isBuild) {
130
+ const lookup = compiler.taglib.buildLookup(root);
131
+ const domRuntimeDeps = compiler.getRuntimeEntryFiles("dom", opts.translator);
132
+ const htmlRuntimeDeps = compiler.getRuntimeEntryFiles("html", opts.translator);
133
+ const taglibDeps = [];
134
+ for (const name in lookup.taglibsById) {
135
+ const taglib = lookup.taglibsById[name];
136
+ if (/[\\/]node_modules[\\/](?!@marko[\\/])/.test(taglib.dirname)) {
137
+ for (const tagName in taglib.tags) {
138
+ const tag = taglib.tags[tagName];
139
+ const entry = tag.template || tag.renderer;
140
+ if (entry) {
141
+ taglibDeps.push(entry.replace(/^.*?[\\/]node_modules[\\/]/, ""));
142
+ }
143
+ }
144
+ }
145
+ }
146
+ const domDeps = Array.from(new Set(domRuntimeDeps.concat(taglibDeps)));
147
+ const serverDeps = Array.from(new Set(htmlRuntimeDeps.concat(taglibDeps)));
148
+ const optimizeDeps = (_a2 = config.optimizeDeps) != null ? _a2 : config.optimizeDeps = {};
149
+ (_b = optimizeDeps.include) != null ? _b : optimizeDeps.include = [];
150
+ optimizeDeps.include = optimizeDeps.include.concat(domDeps.filter((dep) => import_path.default.extname(dep) !== markoExt));
151
+ (_c = optimizeDeps.exclude) != null ? _c : optimizeDeps.exclude = [];
152
+ optimizeDeps.exclude = optimizeDeps.exclude.concat(domDeps.filter((dep) => import_path.default.extname(dep) === markoExt));
153
+ const ssr = (_d = config.ssr) != null ? _d : config.ssr = {};
154
+ (_e = ssr.external) != null ? _e : ssr.external = [];
155
+ ssr.external = ssr.external.concat(serverDeps);
156
+ (await Promise.resolve().then(() => __toModule(require("@marko/compiler/register")))).default(__spreadProps(__spreadValues({}, ssrConfig), {
157
+ sourceMaps: "inline",
158
+ modules: "cjs"
159
+ }));
160
+ }
161
+ },
162
+ configureServer(_server) {
163
+ ssrConfig.hot = domConfig.hot = true;
164
+ devServer = _server;
165
+ devServer.watcher.on("all", (type, filename) => {
166
+ for (const [id, files] of transformWatchFiles) {
167
+ if ((0, import_anymatch.default)(files, filename)) {
168
+ devServer.watcher.emit("change", id);
169
+ }
170
+ }
171
+ if (type === "add" || type === "unlink") {
172
+ let clearedCache = false;
173
+ for (const [id, files] of transformOptionalFiles) {
174
+ if ((0, import_anymatch.default)(files, filename)) {
175
+ if (!clearedCache) {
176
+ baseConfig.cache.clear();
177
+ clearedCache = true;
178
+ }
179
+ devServer.watcher.emit("change", id);
180
+ }
181
+ }
182
+ }
183
+ });
184
+ },
185
+ async buildStart(inputOptions) {
186
+ if (isBuild && linked && !isSSRBuild) {
187
+ const serverMetaFile = await getServerManifestFile(root);
188
+ this.addWatchFile(serverMetaFile);
189
+ try {
190
+ serverManifest = JSON.parse(await import_fs.default.promises.readFile(serverMetaFile, "utf-8"));
191
+ inputOptions.input = toHTMLEntries(root, serverManifest.entries);
192
+ } catch (err) {
193
+ this.error(`You must run the "ssr" build before the "browser" build.`);
194
+ }
195
+ if (isEmpty(inputOptions.input)) {
196
+ this.error("No Marko files were found when compiling the server.");
197
+ }
198
+ }
199
+ },
200
+ async resolveId(importee, importer, importOpts, ssr = importOpts.ssr) {
201
+ if (virtualFiles.has(importee)) {
202
+ return importee;
203
+ }
204
+ let importeeQuery = getMarkoQuery(importee);
205
+ if (importeeQuery) {
206
+ importee = importee.slice(0, -importeeQuery.length);
207
+ } else if (ssr && linked && importer && isMarkoFile(importee) && !isMarkoFile(importer.replace(queryReg, ""))) {
208
+ importeeQuery = serverEntryQuery;
209
+ } else if (!ssr && isBuild && importer && isMarkoFile(importee) && this.getModuleInfo(importer).isEntry) {
210
+ importeeQuery = browserEntryQuery;
211
+ }
212
+ if (importeeQuery) {
213
+ const resolved = importee[0] === "." ? {
214
+ id: importer ? import_path.default.resolve(importer, "..", importee) : import_path.default.resolve(root, importee)
215
+ } : await this.resolve(importee, importer, resolveOpts);
216
+ if (resolved) {
217
+ resolved.id += importeeQuery;
218
+ }
219
+ return resolved;
220
+ }
221
+ return null;
222
+ },
223
+ async load(id) {
224
+ const query = getMarkoQuery(id);
225
+ if (query) {
226
+ if (!id.startsWith(root)) {
227
+ id = import_path.default.join(root, id);
228
+ }
229
+ switch (query) {
230
+ case serverEntryQuery: {
231
+ const fileName = id.slice(0, -serverEntryQuery.length);
232
+ let entryData;
233
+ if (isBuild) {
234
+ const relativeFileName = import_path.default.relative(root, fileName);
235
+ const entryId = toEntryId(relativeFileName);
236
+ serverManifest != null ? serverManifest : serverManifest = {
237
+ entries: {},
238
+ chunksNeedingAssets: []
239
+ };
240
+ serverManifest.entries[entryId] = relativeFileName;
241
+ entryData = JSON.stringify(entryId);
242
+ } else {
243
+ entryData = JSON.stringify(await (0, import_manifest_generator.generateDocManifest)(await devServer.transformIndexHtml("/", (0, import_manifest_generator.generateInputDoc)(fileNameToURL(fileName, root)))));
244
+ }
245
+ return (0, import_server_entry_template.default)({
246
+ fileName,
247
+ entryData,
248
+ runtimeId
249
+ });
250
+ }
251
+ case browserEntryQuery:
252
+ return import_fs.default.promises.readFile(id.slice(0, -browserEntryQuery.length), "utf-8");
253
+ }
254
+ }
255
+ return virtualFiles.get(id) || null;
256
+ },
257
+ async transformIndexHtml(html) {
258
+ if (isBuild) {
259
+ return html;
260
+ }
261
+ return html.replace(/src\s*=\s*(['"])(\\.|(?!\1).)*\.marko\1/gim, (m) => m.slice(0, -1) + browserEntryQuery + m.slice(-1));
262
+ },
263
+ async transform(source, id, ssr) {
264
+ const query = getMarkoQuery(id);
265
+ if (query && !query.startsWith(virtualFileQuery)) {
266
+ id = id.slice(0, -query.length);
267
+ if (query === serverEntryQuery) {
268
+ id = `${id.slice(0, -markoExt.length)}.entry.marko`;
269
+ }
270
+ }
271
+ if (!isMarkoFile(id)) {
272
+ return null;
273
+ }
274
+ const compiled = await compiler.compile(source, id, (typeof ssr === "object" ? ssr.ssr : ssr) ? ssrConfig : query === browserEntryQuery ? hydrateConfig : domConfig);
275
+ const { map, meta } = compiled;
276
+ let { code } = compiled;
277
+ if (query !== browserEntryQuery && devServer) {
278
+ code += `
279
+ if (import.meta.hot) import.meta.hot.accept();`;
280
+ }
281
+ if (devServer) {
282
+ const templateName = getBasenameWithoutExt(id);
283
+ const optionalFilePrefix = import_path.default.dirname(id) + import_path.default.sep + (templateName === "index" ? "" : `${templateName}.`);
284
+ for (const file of meta.watchFiles) {
285
+ this.addWatchFile(file);
286
+ }
287
+ transformOptionalFiles.set(id, [
288
+ `${optionalFilePrefix}style.*`,
289
+ `${optionalFilePrefix}component.*`,
290
+ `${optionalFilePrefix}component-browser.*`,
291
+ `${optionalFilePrefix}marko-tag.json`
292
+ ]);
293
+ transformWatchFiles.set(id, meta.watchFiles);
294
+ }
295
+ return { code, map };
296
+ }
297
+ },
298
+ {
299
+ name: "marko-vite:post",
300
+ apply: "build",
301
+ enforce: "post",
302
+ async generateBundle(outputOptions, bundle, isWrite) {
303
+ if (!linked) {
304
+ return;
305
+ }
306
+ if (!isWrite) {
307
+ this.error(`Linked builds are currently only supported when in "write" mode.`);
308
+ }
309
+ if (!serverManifest) {
310
+ this.error("No Marko files were found when bundling the server in linked mode.");
311
+ }
312
+ if (isSSRBuild) {
313
+ const dir = outputOptions.dir ? import_path.default.resolve(outputOptions.dir) : import_path.default.resolve(outputOptions.file, "..");
314
+ for (const fileName in bundle) {
315
+ const chunk = bundle[fileName];
316
+ if (chunk.type === "chunk") {
317
+ for (const id in chunk.modules) {
318
+ if (id === registeredTag) {
319
+ serverManifest.chunksNeedingAssets.push(import_path.default.resolve(dir, fileName));
320
+ break;
321
+ }
322
+ }
323
+ }
324
+ }
325
+ await import_fs.default.promises.writeFile(await getServerManifestFile(root), JSON.stringify(serverManifest));
326
+ } else {
327
+ const browserManifest = {};
328
+ for (const entryId in serverManifest.entries) {
329
+ const fileName = serverManifest.entries[entryId];
330
+ const chunkId = fileName + htmlExt;
331
+ const chunk = bundle[chunkId];
332
+ if ((chunk == null ? void 0 : chunk.type) === "asset") {
333
+ browserManifest[entryId] = await (0, import_manifest_generator.generateDocManifest)(chunk.source.toString());
334
+ delete bundle[chunkId];
335
+ } else {
336
+ this.error(`Marko template had unexpected output from vite, ${fileName}`);
337
+ }
338
+ }
339
+ const manifestStr = `;var __MARKO_MANIFEST__=${JSON.stringify(browserManifest)};
340
+ `;
341
+ for (const fileName of serverManifest.chunksNeedingAssets) {
342
+ await import_fs.default.promises.appendFile(fileName, manifestStr);
343
+ }
344
+ }
345
+ }
346
+ }
347
+ ];
348
+ }
349
+ function getMarkoQuery(id) {
350
+ var _a;
351
+ return ((_a = queryReg.exec(id)) == null ? void 0 : _a[0]) || "";
352
+ }
353
+ function isMarkoFile(id) {
354
+ return id.endsWith(markoExt);
355
+ }
356
+ function toHTMLEntries(root, serverEntries) {
357
+ const result = [];
358
+ for (const id in serverEntries) {
359
+ const markoFile = import_path.default.join(root, serverEntries[id]);
360
+ const htmlFile = markoFile + htmlExt;
361
+ virtualFiles.set(htmlFile, {
362
+ code: (0, import_manifest_generator.generateInputDoc)(markoFile)
363
+ });
364
+ result.push(htmlFile);
365
+ }
366
+ return result;
367
+ }
368
+ async function getServerManifestFile(root) {
369
+ return import_path.default.join(await getTempDir(root), "manifest.json");
370
+ }
371
+ function getTempDir(root) {
372
+ return tempDir || (tempDir = (async () => {
373
+ const dir = import_path.default.join(import_os.default.tmpdir(), `marko-vite-${import_crypto.default.createHash("SHA1").update(root).digest("hex")}`);
374
+ try {
375
+ const stat = await import_fs.default.promises.stat(dir);
376
+ if (stat.isDirectory()) {
377
+ return dir;
378
+ }
379
+ } catch {
380
+ await import_fs.default.promises.mkdir(dir);
381
+ return dir;
382
+ }
383
+ throw new Error("Unable to create temp directory");
384
+ })());
385
+ }
386
+ function toEntryId(id) {
387
+ const lastSepIndex = id.lastIndexOf(import_path.default.sep);
388
+ let name = id.slice(lastSepIndex + 1, id.indexOf(".", lastSepIndex));
389
+ if (name === "index" || name === "template") {
390
+ name = id.slice(id.lastIndexOf(import_path.default.sep, lastSepIndex - 1) + 1, lastSepIndex);
391
+ }
392
+ return `${name}_${import_crypto.default.createHash("SHA1").update(id).digest("base64").replace(/[/+]/g, "-").slice(0, 4)}`;
393
+ }
394
+ function fileNameToURL(fileName, root) {
395
+ const relativeURL = import_path.default.posix.relative((0, import_url.pathToFileURL)(root).pathname, (0, import_url.pathToFileURL)(fileName).pathname);
396
+ if (relativeURL[0] === ".") {
397
+ throw new Error("@marko/vite: Entry templates must exist under the current root directory.");
398
+ }
399
+ return `/${relativeURL}`;
400
+ }
401
+ function getBasenameWithoutExt(file) {
402
+ const baseStart = file.lastIndexOf(import_path.default.sep) + 1;
403
+ const extStart = file.indexOf(".", baseStart + 1);
404
+ return file.slice(baseStart, extStart);
405
+ }
406
+ function isEmpty(obj) {
407
+ for (const _ in obj) {
408
+ return false;
409
+ }
410
+ return true;
411
+ }
412
+ // Annotate the CommonJS export names for ESM import in node:
413
+ 0 && (module.exports = {});