@unhead/bundler 3.0.0-rc.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.
Files changed (69) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +124 -0
  3. package/dist/devtools/bridge.d.mts +10 -0
  4. package/dist/devtools/bridge.d.ts +10 -0
  5. package/dist/devtools/bridge.mjs +324 -0
  6. package/dist/devtools-ui/200.html +1 -0
  7. package/dist/devtools-ui/404.html +1 -0
  8. package/dist/devtools-ui/_nuxt/B8PEiB0p.js +1 -0
  9. package/dist/devtools-ui/_nuxt/B9CgE5J6.js +1 -0
  10. package/dist/devtools-ui/_nuxt/BJ42UJro.js +1 -0
  11. package/dist/devtools-ui/_nuxt/BOzzsL9j.js +1 -0
  12. package/dist/devtools-ui/_nuxt/CC8iqwL_.js +1 -0
  13. package/dist/devtools-ui/_nuxt/CLj8gQPS.js +1 -0
  14. package/dist/devtools-ui/_nuxt/CUZFOKWE.js +1 -0
  15. package/dist/devtools-ui/_nuxt/CVGS_sMg.js +1 -0
  16. package/dist/devtools-ui/_nuxt/CVO1_9PV.js +1 -0
  17. package/dist/devtools-ui/_nuxt/Cp-IABpG.js +1 -0
  18. package/dist/devtools-ui/_nuxt/D0r3Knsf.js +1 -0
  19. package/dist/devtools-ui/_nuxt/D2XNJYSt.js +1 -0
  20. package/dist/devtools-ui/_nuxt/D2j1X0ma.js +181 -0
  21. package/dist/devtools-ui/_nuxt/DNXA5IKg.js +1 -0
  22. package/dist/devtools-ui/_nuxt/D_TuKxep.js +1 -0
  23. package/dist/devtools-ui/_nuxt/Deu7B_Ux.js +1 -0
  24. package/dist/devtools-ui/_nuxt/DevtoolsKeyValue.CGQNexGc.css +1 -0
  25. package/dist/devtools-ui/_nuxt/DevtoolsTagTable.Bi_gUiSE.css +1 -0
  26. package/dist/devtools-ui/_nuxt/DevtoolsTip.By8OtGoF.css +1 -0
  27. package/dist/devtools-ui/_nuxt/Dpg3GvfJ.js +1 -0
  28. package/dist/devtools-ui/_nuxt/DuAJIi38.js +1 -0
  29. package/dist/devtools-ui/_nuxt/OCodeBlock.cuqShMa1.css +1 -0
  30. package/dist/devtools-ui/_nuxt/QXSvvKqL.js +1 -0
  31. package/dist/devtools-ui/_nuxt/UQ4k7j0M.js +1 -0
  32. package/dist/devtools-ui/_nuxt/aDaU-lXw.js +1 -0
  33. package/dist/devtools-ui/_nuxt/builds/latest.json +1 -0
  34. package/dist/devtools-ui/_nuxt/builds/meta/cae94e84-32db-4da4-8b0f-478d21dcc68b.json +1 -0
  35. package/dist/devtools-ui/_nuxt/cBFzznMP.js +1 -0
  36. package/dist/devtools-ui/_nuxt/entry.clcQIxBm.css +1 -0
  37. package/dist/devtools-ui/_nuxt/error-404.Cu92rxSa.css +1 -0
  38. package/dist/devtools-ui/_nuxt/error-500.B9_6I3ju.css +1 -0
  39. package/dist/devtools-ui/_nuxt/identity.qqB_zwgO.css +1 -0
  40. package/dist/devtools-ui/_nuxt/schema-validation.CRmraV8c.css +1 -0
  41. package/dist/devtools-ui/_nuxt/schema.CFjU2dVl.css +1 -0
  42. package/dist/devtools-ui/_nuxt/scripts.UkRMfT5v.css +1 -0
  43. package/dist/devtools-ui/_nuxt/serp.CZGidvZH.css +1 -0
  44. package/dist/devtools-ui/_nuxt/wDzz0qaB.js +1 -0
  45. package/dist/devtools-ui/index.html +1 -0
  46. package/dist/index.d.mts +28 -0
  47. package/dist/index.d.ts +28 -0
  48. package/dist/index.mjs +79 -0
  49. package/dist/minify/esbuild.d.mts +5 -0
  50. package/dist/minify/esbuild.d.ts +5 -0
  51. package/dist/minify/esbuild.mjs +10 -0
  52. package/dist/minify/lightningcss.d.mts +5 -0
  53. package/dist/minify/lightningcss.d.ts +5 -0
  54. package/dist/minify/lightningcss.mjs +14 -0
  55. package/dist/minify/rolldown.d.mts +5 -0
  56. package/dist/minify/rolldown.d.ts +5 -0
  57. package/dist/minify/rolldown.mjs +10 -0
  58. package/dist/shared/bundler.BwKIGaKX.d.mts +60 -0
  59. package/dist/shared/bundler.BwKIGaKX.d.ts +60 -0
  60. package/dist/shared/bundler.DRWfqG8C.mjs +453 -0
  61. package/dist/vite.d.mts +6 -0
  62. package/dist/vite.d.ts +6 -0
  63. package/dist/vite.mjs +282 -0
  64. package/dist/webpack.d.mts +5 -0
  65. package/dist/webpack.d.ts +5 -0
  66. package/dist/webpack.mjs +31 -0
  67. package/package.json +111 -0
  68. package/vite.d.ts +1 -0
  69. package/webpack.d.ts +1 -0
@@ -0,0 +1,453 @@
1
+ import { pathToFileURL } from 'node:url';
2
+ import MagicString from 'magic-string';
3
+ import { parseSync } from 'oxc-parser';
4
+ import { ScopeTracker, walk, ScopeTrackerImport } from 'oxc-walker';
5
+ import { parseURL, parseQuery } from 'ufo';
6
+ import { createUnplugin } from 'unplugin';
7
+ import { createContext, runInContext } from 'node:vm';
8
+ import { resolveMetaKeyType, resolveMetaKeyValue, resolvePackedMetaObjectValue } from 'unhead/utils';
9
+
10
+ const NODE_MODULES_RE$2 = /[\\/]node_modules[\\/]/;
11
+ const TRANSFORM_RE$2 = /\.(?:(?:c|m)?j|t)sx?$/;
12
+ const SKIP_JS_TYPES = /* @__PURE__ */ new Set(["application/json", "application/ld+json", "speculationrules", "importmap"]);
13
+ const MinifyTransform = createUnplugin((options = {}) => {
14
+ const jsMinifier = options.js !== false ? options.js : void 0;
15
+ const cssMinifier = options.css !== false ? options.css : void 0;
16
+ const doJS = !!jsMinifier;
17
+ const doCSS = !!cssMinifier;
18
+ const HEAD_FN_NAMES = /* @__PURE__ */ new Set(["useHead", "useServerHead"]);
19
+ const CONTENT_PROPS = /* @__PURE__ */ new Set(["innerHTML", "textContent"]);
20
+ return {
21
+ name: "unhead:minify-transform",
22
+ enforce: "post",
23
+ transformInclude(id) {
24
+ const { pathname, search } = parseURL(decodeURIComponent(pathToFileURL(id).href));
25
+ const { type } = parseQuery(search);
26
+ if (NODE_MODULES_RE$2.test(pathname))
27
+ return false;
28
+ if (options.filter?.include?.some((pattern) => id.match(pattern)))
29
+ return true;
30
+ if (options.filter?.exclude?.some((pattern) => id.match(pattern)))
31
+ return false;
32
+ if (pathname.endsWith(".vue") && (type === "script" || !search))
33
+ return true;
34
+ if (TRANSFORM_RE$2.test(pathname))
35
+ return true;
36
+ return false;
37
+ },
38
+ async transform(code, id) {
39
+ if (!code.includes("useHead") && !code.includes("useServerHead"))
40
+ return;
41
+ let ast;
42
+ try {
43
+ ast = parseSync(id, code);
44
+ } catch {
45
+ return;
46
+ }
47
+ const scopeTracker = new ScopeTracker();
48
+ const s = new MagicString(code);
49
+ const pendingMinifications = [];
50
+ walk(ast.program, {
51
+ scopeTracker,
52
+ enter(node, _parent) {
53
+ if (node.type !== "CallExpression" || node.callee.type !== "Identifier")
54
+ return;
55
+ const decl = scopeTracker.getDeclaration(node.callee.name);
56
+ let originalName;
57
+ if (decl instanceof ScopeTrackerImport) {
58
+ if (decl.node.type !== "ImportSpecifier" || decl.node.imported.type !== "Identifier")
59
+ return;
60
+ originalName = decl.node.imported.name;
61
+ } else if (!decl && HEAD_FN_NAMES.has(node.callee.name)) {
62
+ originalName = node.callee.name;
63
+ } else {
64
+ return;
65
+ }
66
+ if (!HEAD_FN_NAMES.has(originalName))
67
+ return;
68
+ const arg = node.arguments[0];
69
+ if (!arg || arg.type !== "ObjectExpression")
70
+ return;
71
+ for (const prop of arg.properties) {
72
+ if (prop.type !== "Property" || prop.key?.type !== "Identifier")
73
+ continue;
74
+ const tagType = prop.key.name;
75
+ if (tagType !== "script" && tagType !== "style")
76
+ continue;
77
+ if (tagType === "script" && !doJS)
78
+ continue;
79
+ if (tagType === "style" && !doCSS)
80
+ continue;
81
+ const elements = prop.value?.type === "ArrayExpression" ? prop.value.elements : [prop.value];
82
+ for (const element of elements) {
83
+ if (!element || element.type !== "ObjectExpression")
84
+ continue;
85
+ processScriptOrStyleObject(element, tagType, code, s, pendingMinifications);
86
+ }
87
+ }
88
+ }
89
+ });
90
+ await Promise.all(pendingMinifications);
91
+ if (s.hasChanged()) {
92
+ return {
93
+ code: s.toString(),
94
+ map: s.generateMap({ includeContent: true, source: id })
95
+ };
96
+ }
97
+ }
98
+ };
99
+ function processScriptOrStyleObject(objectNode, tagType, code, s, pendingMinifications) {
100
+ if (tagType === "script") {
101
+ const typeProp = objectNode.properties.find(
102
+ (p) => p.type === "Property" && p.key?.type === "Identifier" && p.key.name === "type"
103
+ );
104
+ if (typeProp?.value?.type === "Literal" && SKIP_JS_TYPES.has(typeProp.value.value))
105
+ return;
106
+ }
107
+ for (const prop of objectNode.properties) {
108
+ if (prop.type !== "Property" || prop.key?.type !== "Identifier")
109
+ continue;
110
+ if (!CONTENT_PROPS.has(prop.key.name))
111
+ continue;
112
+ if (prop.value?.type === "Literal") {
113
+ const raw = prop.value.value;
114
+ if (raw.length < 20)
115
+ continue;
116
+ pendingMinifications.push(
117
+ minifyStringContent(raw, tagType).then((minified) => {
118
+ if (minified && minified.length < raw.length) {
119
+ s.overwrite(prop.value.start, prop.value.end, JSON.stringify(minified));
120
+ }
121
+ })
122
+ );
123
+ } else if (prop.value?.type === "TemplateLiteral" && prop.value.expressions.length === 0) {
124
+ const raw = prop.value.quasis[0]?.value?.cooked;
125
+ if (!raw || raw.length < 20)
126
+ continue;
127
+ pendingMinifications.push(
128
+ minifyStringContent(raw, tagType).then((minified) => {
129
+ if (minified && minified.length < raw.length) {
130
+ s.overwrite(prop.value.start, prop.value.end, JSON.stringify(minified));
131
+ }
132
+ })
133
+ );
134
+ }
135
+ }
136
+ }
137
+ async function minifyStringContent(content, tagType) {
138
+ if (tagType === "script" && jsMinifier)
139
+ return jsMinifier(content);
140
+ if (tagType === "style" && cssMinifier)
141
+ return cssMinifier(content);
142
+ return null;
143
+ }
144
+ });
145
+
146
+ const UNHEAD_MODULE_RE = /[\\/]node_modules[\\/](?:@unhead[\\/][^\\/]+|unhead)[\\/]/;
147
+ const HEAD_SSR_RE = /\bhead\.ssr\b/g;
148
+ const JS_RE = /\.(?:c|m)?js$/;
149
+ const SSRStaticReplace = createUnplugin(() => {
150
+ let ssr = false;
151
+ return {
152
+ name: "unhead:ssr-static-replace",
153
+ enforce: "pre",
154
+ transformInclude(id) {
155
+ if (!UNHEAD_MODULE_RE.test(id))
156
+ return false;
157
+ return JS_RE.test(id);
158
+ },
159
+ transform(code) {
160
+ if (!code.includes("head.ssr"))
161
+ return;
162
+ const s = new MagicString(code);
163
+ for (const match of code.matchAll(HEAD_SSR_RE)) {
164
+ s.overwrite(match.index, match.index + match[0].length, String(ssr));
165
+ }
166
+ if (s.hasChanged()) {
167
+ return {
168
+ code: s.toString(),
169
+ map: s.generateMap({ includeContent: true })
170
+ };
171
+ }
172
+ },
173
+ webpack(ctx) {
174
+ if (ctx.name === "server")
175
+ ssr = true;
176
+ },
177
+ vite: {
178
+ apply(_config, env) {
179
+ if (env.isSsrBuild)
180
+ ssr = true;
181
+ return true;
182
+ }
183
+ }
184
+ };
185
+ });
186
+
187
+ const NODE_MODULES_RE$1 = /[\\/]node_modules[\\/]/;
188
+ const TRANSFORM_RE$1 = /\.(?:(?:c|m)?j|t)sx?$/;
189
+ const functionNames = [
190
+ "useServerHead",
191
+ "useServerHeadSafe",
192
+ "useServerSeoMeta",
193
+ // plugins
194
+ "useSchemaOrg"
195
+ ];
196
+ const TreeshakeServerComposables = createUnplugin((options = {}) => {
197
+ options.enabled = options.enabled !== void 0 ? options.enabled : true;
198
+ return {
199
+ name: "unhead:remove-server-composables",
200
+ enforce: "post",
201
+ transformInclude(id) {
202
+ if (!options.enabled)
203
+ return false;
204
+ const { pathname, search } = parseURL(decodeURIComponent(pathToFileURL(id).href));
205
+ const { type } = parseQuery(search);
206
+ if (NODE_MODULES_RE$1.test(pathname))
207
+ return false;
208
+ if (options.filter?.include?.some((pattern) => id.match(pattern)))
209
+ return true;
210
+ if (options.filter?.exclude?.some((pattern) => id.match(pattern)))
211
+ return false;
212
+ if (pathname.endsWith(".vue") && (type === "script" || !search))
213
+ return true;
214
+ if (TRANSFORM_RE$1.test(pathname))
215
+ return true;
216
+ return false;
217
+ },
218
+ transform(code, id) {
219
+ if (!code.includes("useServerHead") && !code.includes("useServerHeadSafe") && !code.includes("useServerSeoMeta") && !code.includes("useSchemaOrg")) {
220
+ return;
221
+ }
222
+ const ast = parseSync(id, code);
223
+ const s = new MagicString(code);
224
+ walk(ast.program, {
225
+ enter(node) {
226
+ if (node.type === "ExpressionStatement" && node.expression.type === "CallExpression" && node.expression.callee.type === "Identifier" && functionNames.includes(node.expression.callee.name)) {
227
+ s.remove(node.start, node.end);
228
+ }
229
+ }
230
+ });
231
+ if (s.hasChanged()) {
232
+ return {
233
+ code: s.toString(),
234
+ map: s.generateMap({ includeContent: true, source: id })
235
+ };
236
+ }
237
+ },
238
+ webpack(ctx) {
239
+ if (ctx.name === "server")
240
+ options.enabled = false;
241
+ },
242
+ vite: {
243
+ apply(config, env) {
244
+ if (env.isSsrBuild) {
245
+ options.enabled = false;
246
+ return true;
247
+ }
248
+ return false;
249
+ }
250
+ }
251
+ };
252
+ });
253
+
254
+ const NODE_MODULES_RE = /[\\/]node_modules[\\/]/;
255
+ const TRANSFORM_RE = /\.(?:(?:c|m)?j|t)sx?$/;
256
+ const SEO_META_NAMES = /* @__PURE__ */ new Set(["useSeoMeta", "useServerSeoMeta"]);
257
+ const UseSeoMetaTransform = createUnplugin((options = {}) => {
258
+ options.imports = options.imports || true;
259
+ function isValidPackage(s) {
260
+ if (s === "unhead" || s.startsWith("@unhead")) {
261
+ return true;
262
+ }
263
+ return [...options.importPaths || []].includes(s);
264
+ }
265
+ return {
266
+ name: "unhead:use-seo-meta-transform",
267
+ enforce: "post",
268
+ transformInclude(id) {
269
+ const { pathname, search } = parseURL(decodeURIComponent(pathToFileURL(id).href));
270
+ const { type } = parseQuery(search);
271
+ if (NODE_MODULES_RE.test(pathname))
272
+ return false;
273
+ if (options.filter?.include?.some((pattern) => id.match(pattern)))
274
+ return true;
275
+ if (options.filter?.exclude?.some((pattern) => id.match(pattern)))
276
+ return false;
277
+ if (pathname.endsWith(".vue") && (type === "script" || !search))
278
+ return true;
279
+ if (TRANSFORM_RE.test(pathname))
280
+ return true;
281
+ return false;
282
+ },
283
+ async transform(code, id) {
284
+ if (!code.includes("useSeoMeta") && !code.includes("useServerSeoMeta"))
285
+ return;
286
+ const scopeTracker = new ScopeTracker();
287
+ const ast = parseSync(id, code);
288
+ const s = new MagicString(code);
289
+ const importRewrites = /* @__PURE__ */ new Map();
290
+ const valueReferenced = /* @__PURE__ */ new Set();
291
+ walk(ast.program, {
292
+ scopeTracker,
293
+ enter(node, parent) {
294
+ if (node.type === "Identifier" && !(parent?.type === "CallExpression" && parent.callee === node) && parent?.type !== "ImportSpecifier") {
295
+ const decl2 = scopeTracker.getDeclaration(node.name);
296
+ if (decl2 instanceof ScopeTrackerImport && isValidPackage(decl2.importNode.source.value) && decl2.node.type === "ImportSpecifier" && decl2.node.imported.type === "Identifier" && SEO_META_NAMES.has(decl2.node.imported.name)) {
297
+ valueReferenced.add(decl2.node.imported.name);
298
+ }
299
+ }
300
+ if (node.type !== "CallExpression" || node.callee.type !== "Identifier")
301
+ return;
302
+ const decl = scopeTracker.getDeclaration(node.callee.name);
303
+ let originalName;
304
+ let importDecl = null;
305
+ if (decl instanceof ScopeTrackerImport) {
306
+ if (!isValidPackage(decl.importNode.source.value) || decl.node.type !== "ImportSpecifier" || decl.node.imported.type !== "Identifier")
307
+ return;
308
+ originalName = decl.node.imported.name;
309
+ importDecl = decl.importNode;
310
+ } else if (!decl && SEO_META_NAMES.has(node.callee.name)) {
311
+ originalName = node.callee.name;
312
+ } else {
313
+ return;
314
+ }
315
+ if (!SEO_META_NAMES.has(originalName))
316
+ return;
317
+ const properties = node.arguments[0]?.properties;
318
+ if (!properties)
319
+ return;
320
+ let output = [];
321
+ const title = properties.find((property) => property.key?.name === "title");
322
+ const titleTemplate = properties.find((property) => property.key?.name === "titleTemplate");
323
+ const meta = properties.filter((property) => property.key?.name !== "title" && property.key?.name !== "titleTemplate");
324
+ if (title || titleTemplate || originalName === "useSeoMeta") {
325
+ output.push("useHead({");
326
+ if (title) {
327
+ output.push(` title: ${code.substring(title.value.start, title.value.end)},`);
328
+ }
329
+ if (titleTemplate) {
330
+ output.push(` titleTemplate: ${code.substring(titleTemplate.value.start, titleTemplate.value.end)},`);
331
+ }
332
+ }
333
+ if (originalName === "useServerSeoMeta") {
334
+ if (output.length) {
335
+ const secondArg = node.arguments[1];
336
+ if (secondArg)
337
+ output.push(`}, ${code.substring(secondArg.start, secondArg.end)});`);
338
+ else
339
+ output.push("});");
340
+ }
341
+ output.push("useServerHead({");
342
+ }
343
+ if (meta.length)
344
+ output.push(" meta: [");
345
+ meta.forEach((property) => {
346
+ if (property.type === "SpreadElement") {
347
+ output = false;
348
+ return;
349
+ }
350
+ if (property.key.type !== "Identifier" || !property.value) {
351
+ output = false;
352
+ return;
353
+ }
354
+ if (output === false)
355
+ return;
356
+ const propertyKey = property.key;
357
+ let key = resolveMetaKeyType(propertyKey.name);
358
+ const keyValue = resolveMetaKeyValue(propertyKey.name);
359
+ let valueKey = "content";
360
+ if (keyValue === "charset") {
361
+ valueKey = "charset";
362
+ key = "charset";
363
+ }
364
+ let value = code.substring(property.value.start, property.value.end);
365
+ if (property.value.type === "ArrayExpression") {
366
+ const elements = property.value.elements;
367
+ if (!elements.length)
368
+ return;
369
+ const metaTags = elements.map((element) => {
370
+ if (element.type !== "ObjectExpression")
371
+ return ` { ${key}: '${keyValue}', ${valueKey}: ${code.substring(element.start, element.end)} },`;
372
+ return element.properties.map((p) => {
373
+ const propKey = p.key.name;
374
+ const propValue = code.substring(p.value.start, p.value.end);
375
+ return ` { ${key}: '${keyValue}:${propKey}', ${valueKey}: ${propValue} },`;
376
+ }).join("\n");
377
+ });
378
+ output.push(metaTags.join("\n"));
379
+ return;
380
+ } else if (property.value.type === "ObjectExpression") {
381
+ const isStatic = property.value.properties.every((p) => p.value.type === "StringLiteral" && typeof p.value.value === "string");
382
+ if (!isStatic) {
383
+ output = false;
384
+ return;
385
+ }
386
+ const context = createContext({
387
+ resolvePackedMetaObjectValue
388
+ });
389
+ const start = property.value.start;
390
+ const end = property.value.end;
391
+ try {
392
+ value = JSON.stringify(runInContext(`resolvePackedMetaObjectValue(${code.slice(start, end)})`, context));
393
+ } catch {
394
+ output = false;
395
+ return;
396
+ }
397
+ }
398
+ if (valueKey === "charset")
399
+ output.push(` { ${key}: ${value} },`);
400
+ else
401
+ output.push(` { ${key}: '${keyValue}', ${valueKey}: ${value} },`);
402
+ });
403
+ if (output) {
404
+ if (meta.length)
405
+ output.push(" ]");
406
+ if (node.arguments.length >= 2) {
407
+ const optionsArg = code.substring(node.arguments[1].start, node.arguments[1].end);
408
+ output.push(`}, ${optionsArg})`);
409
+ } else {
410
+ output.push("})");
411
+ }
412
+ s.overwrite(node.start, node.end, output.join("\n"));
413
+ if (importDecl) {
414
+ if (!importRewrites.has(importDecl))
415
+ importRewrites.set(importDecl, /* @__PURE__ */ new Set());
416
+ importRewrites.get(importDecl).add(originalName);
417
+ }
418
+ }
419
+ }
420
+ });
421
+ if (options.imports && importRewrites.size > 0) {
422
+ for (const [importNode, transformedNames] of importRewrites) {
423
+ const newSpecifiers = /* @__PURE__ */ new Set();
424
+ for (const spec of importNode.specifiers) {
425
+ if (spec.type !== "ImportSpecifier")
426
+ continue;
427
+ const importedName = spec.imported.name;
428
+ if (transformedNames.has(importedName)) {
429
+ newSpecifiers.add(importedName.includes("Server") ? "useServerHead" : "useHead");
430
+ if (valueReferenced.has(importedName))
431
+ newSpecifiers.add(importedName);
432
+ } else {
433
+ newSpecifiers.add(importedName);
434
+ }
435
+ }
436
+ s.overwrite(
437
+ importNode.specifiers[0].start,
438
+ importNode.specifiers.at(-1).end,
439
+ [...newSpecifiers].join(", ")
440
+ );
441
+ }
442
+ }
443
+ if (s.hasChanged()) {
444
+ return {
445
+ code: s.toString(),
446
+ map: s.generateMap({ includeContent: true, source: id })
447
+ };
448
+ }
449
+ }
450
+ };
451
+ });
452
+
453
+ export { MinifyTransform as M, SSRStaticReplace as S, TreeshakeServerComposables as T, UseSeoMetaTransform as U };
@@ -0,0 +1,6 @@
1
+ import { Plugin } from 'vite';
2
+ import { V as VitePluginOptions } from './shared/bundler.BwKIGaKX.mjs';
3
+
4
+ declare function Unhead(options?: VitePluginOptions): Plugin[];
5
+
6
+ export { Unhead, VitePluginOptions };
package/dist/vite.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ import { Plugin } from 'vite';
2
+ import { V as VitePluginOptions } from './shared/bundler.BwKIGaKX.js';
3
+
4
+ declare function Unhead(options?: VitePluginOptions): Plugin[];
5
+
6
+ export { Unhead, VitePluginOptions };