@evjs/build-tools 0.0.17 → 0.0.18

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/esm/html.d.ts ADDED
@@ -0,0 +1,39 @@
1
+ import { type NodeRepr } from "domparser-rs";
2
+ /**
3
+ * A single asset descriptor — either a plain filename string or an object
4
+ * with a `url` and arbitrary HTML attributes.
5
+ *
6
+ * @example
7
+ * // Plain string
8
+ * "main.abc12345.js"
9
+ *
10
+ * // With attributes
11
+ * { url: "main.abc12345.js", attrs: { crossorigin: "anonymous", integrity: "sha384-..." } }
12
+ */
13
+ export type HtmlAsset = string | {
14
+ url: string;
15
+ attrs?: Record<string, string | boolean>;
16
+ };
17
+ /**
18
+ * Options for generating the final HTML output.
19
+ */
20
+ export interface GenerateHtmlOptions {
21
+ /** Absolute or relative path to the user's HTML template file. */
22
+ template: string;
23
+ /** JS assets to inject (from ClientManifest.assets.js). */
24
+ js: HtmlAsset[];
25
+ /** CSS assets to inject (from ClientManifest.assets.css). */
26
+ css: HtmlAsset[];
27
+ /** Optional public path prefix for asset URLs. Default: "/". */
28
+ publicPath?: string;
29
+ }
30
+ /**
31
+ * Parse the user's HTML template and inject bundled asset tags.
32
+ *
33
+ * - CSS `<link>` tags are appended to `<head>`.
34
+ * - JS `<script>` tags are appended to `<body>` (with `defer`).
35
+ *
36
+ * Returns the parsed DOM document. Call `doc.outerHTML` to serialize.
37
+ */
38
+ export declare function generateHtml(options: GenerateHtmlOptions): NodeRepr;
39
+ //# sourceMappingURL=html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../src/html.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExD;;;;;;;;;;GAUG;AACH,MAAM,MAAM,SAAS,GACjB,MAAM,GACN;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAA;CAAE,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,kEAAkE;IAClE,QAAQ,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,EAAE,EAAE,SAAS,EAAE,CAAC;IAChB,6DAA6D;IAC7D,GAAG,EAAE,SAAS,EAAE,CAAC;IACjB,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA4BD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,QAAQ,CA4CnE"}
package/esm/html.js ADDED
@@ -0,0 +1,61 @@
1
+ import fs from "node:fs";
2
+ import { DOMParser } from "domparser-rs";
3
+ const parser = new DOMParser();
4
+ /** Serialize an attributes record into an HTML attribute string. */
5
+ function renderAttrs(attrs) {
6
+ const parts = [];
7
+ for (const [key, value] of Object.entries(attrs)) {
8
+ if (value === true) {
9
+ parts.push(key);
10
+ }
11
+ else if (value !== false) {
12
+ parts.push(`${key}="${value}"`);
13
+ }
14
+ }
15
+ return parts.length > 0 ? ` ${parts.join(" ")}` : "";
16
+ }
17
+ /** Normalise a HtmlAsset into url + attrs. */
18
+ function normalizeAsset(asset) {
19
+ if (typeof asset === "string") {
20
+ return { url: asset, attrs: {} };
21
+ }
22
+ return { url: asset.url, attrs: asset.attrs ?? {} };
23
+ }
24
+ /**
25
+ * Parse the user's HTML template and inject bundled asset tags.
26
+ *
27
+ * - CSS `<link>` tags are appended to `<head>`.
28
+ * - JS `<script>` tags are appended to `<body>` (with `defer`).
29
+ *
30
+ * Returns the parsed DOM document. Call `doc.outerHTML` to serialize.
31
+ */
32
+ export function generateHtml(options) {
33
+ const { template, js, css, publicPath = "/" } = options;
34
+ const templateContent = fs.readFileSync(template, "utf-8");
35
+ const doc = parser.parseFromString(templateContent, "text/html");
36
+ const head = doc.querySelector("head");
37
+ const body = doc.querySelector("body");
38
+ if (!head) {
39
+ throw new Error(`[evjs] HTML template "${template}" is missing a <head> element.`);
40
+ }
41
+ if (!body) {
42
+ throw new Error(`[evjs] HTML template "${template}" is missing a <body> element.`);
43
+ }
44
+ // Inject CSS <link> tags into <head>
45
+ for (const cssAsset of css) {
46
+ const { url, attrs } = normalizeAsset(cssAsset);
47
+ const href = `${publicPath}${url}`;
48
+ head.insertAdjacentHTML("beforeend", `<link rel="stylesheet" href="${href}"${renderAttrs(attrs)}>`);
49
+ }
50
+ // Inject JS <script defer> tags into <body>
51
+ for (const jsAsset of js) {
52
+ const { url, attrs } = normalizeAsset(jsAsset);
53
+ const src = `${publicPath}${url}`;
54
+ // defer is default; user can override via attrs (e.g. { defer: false, async: true })
55
+ const hasLoadStrategy = "async" in attrs || "defer" in attrs;
56
+ const defaultAttrs = hasLoadStrategy ? "" : " defer";
57
+ body.insertAdjacentHTML("beforeend", `<script${defaultAttrs} src="${src}"${renderAttrs(attrs)}></script>`);
58
+ }
59
+ return doc;
60
+ }
61
+ //# sourceMappingURL=html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../src/html.ts"],"names":[],"mappings":"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"}
package/esm/index.d.ts CHANGED
@@ -2,6 +2,8 @@
2
2
  * Bundler-agnostic build utilities for the ev framework.
3
3
  */
4
4
  export { generateServerEntry } from "./entry.js";
5
+ export type { GenerateHtmlOptions, HtmlAsset } from "./html.js";
6
+ export { generateHtml } from "./html.js";
5
7
  export type { ExtractedRoute } from "./routes.js";
6
8
  export { extractRoutes } from "./routes.js";
7
9
  export type { TransformResult } from "./transforms/index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EACL,eAAe,EACf,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,YAAY,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EACL,eAAe,EACf,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC"}
package/esm/index.js CHANGED
@@ -2,6 +2,7 @@
2
2
  * Bundler-agnostic build utilities for the ev framework.
3
3
  */
4
4
  export { generateServerEntry } from "./entry.js";
5
+ export { generateHtml } from "./html.js";
5
6
  export { extractRoutes } from "./routes.js";
6
7
  export { transformServerFile } from "./transforms/index.js";
7
8
  export { detectUseServer, hashString, makeFnId, makeModuleId, parseModuleRef, } from "./utils.js";
package/esm/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EACL,eAAe,EACf,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EACL,eAAe,EACf,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@evjs/build-tools",
3
- "version": "0.0.17",
3
+ "version": "0.0.18",
4
4
  "description": "Bundler-agnostic build utilities for the ev framework",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -31,7 +31,8 @@
31
31
  "author": "xusd320",
32
32
  "license": "MIT",
33
33
  "dependencies": {
34
- "@swc/core": "^1.15.21"
34
+ "@swc/core": "^1.15.21",
35
+ "domparser-rs": "^0.0.7"
35
36
  },
36
37
  "devDependencies": {
37
38
  "@swc/types": "^0.1.25",