@evjs/build-tools 0.0.18 → 0.0.20

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 CHANGED
@@ -1,4 +1,4 @@
1
- import { type NodeRepr } from "domparser-rs";
1
+ import { type Document } from "domparser-rs";
2
2
  /**
3
3
  * A single asset descriptor — either a plain filename string or an object
4
4
  * with a `url` and arbitrary HTML attributes.
@@ -24,8 +24,8 @@ export interface GenerateHtmlOptions {
24
24
  js: HtmlAsset[];
25
25
  /** CSS assets to inject (from ClientManifest.assets.css). */
26
26
  css: HtmlAsset[];
27
- /** Optional public path prefix for asset URLs. Default: "/". */
28
- publicPath?: string;
27
+ /** Optional prefix for asset URLs (e.g. for CDN deploys). Default: "/". */
28
+ assetPrefix?: string;
29
29
  }
30
30
  /**
31
31
  * Parse the user's HTML template and inject bundled asset tags.
@@ -33,7 +33,7 @@ export interface GenerateHtmlOptions {
33
33
  * - CSS `<link>` tags are appended to `<head>`.
34
34
  * - JS `<script>` tags are appended to `<body>` (with `defer`).
35
35
  *
36
- * Returns the parsed DOM document. Call `doc.outerHTML` to serialize.
36
+ * Returns the parsed DOM document. Call `doc.toString()` to serialize.
37
37
  */
38
- export declare function generateHtml(options: GenerateHtmlOptions): NodeRepr;
38
+ export declare function generateHtml(options: GenerateHtmlOptions): Document;
39
39
  //# sourceMappingURL=html.d.ts.map
package/esm/html.d.ts.map CHANGED
@@ -1 +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"}
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,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA4BD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,QAAQ,CA4CnE"}
package/esm/html.js CHANGED
@@ -27,10 +27,10 @@ function normalizeAsset(asset) {
27
27
  * - CSS `<link>` tags are appended to `<head>`.
28
28
  * - JS `<script>` tags are appended to `<body>` (with `defer`).
29
29
  *
30
- * Returns the parsed DOM document. Call `doc.outerHTML` to serialize.
30
+ * Returns the parsed DOM document. Call `doc.toString()` to serialize.
31
31
  */
32
32
  export function generateHtml(options) {
33
- const { template, js, css, publicPath = "/" } = options;
33
+ const { template, js, css, assetPrefix = "/" } = options;
34
34
  const templateContent = fs.readFileSync(template, "utf-8");
35
35
  const doc = parser.parseFromString(templateContent, "text/html");
36
36
  const head = doc.querySelector("head");
@@ -44,13 +44,13 @@ export function generateHtml(options) {
44
44
  // Inject CSS <link> tags into <head>
45
45
  for (const cssAsset of css) {
46
46
  const { url, attrs } = normalizeAsset(cssAsset);
47
- const href = `${publicPath}${url}`;
47
+ const href = `${assetPrefix}${url}`;
48
48
  head.insertAdjacentHTML("beforeend", `<link rel="stylesheet" href="${href}"${renderAttrs(attrs)}>`);
49
49
  }
50
50
  // Inject JS <script defer> tags into <body>
51
51
  for (const jsAsset of js) {
52
52
  const { url, attrs } = normalizeAsset(jsAsset);
53
- const src = `${publicPath}${url}`;
53
+ const src = `${assetPrefix}${url}`;
54
54
  // defer is default; user can override via attrs (e.g. { defer: false, async: true })
55
55
  const hasLoadStrategy = "async" in attrs || "defer" in attrs;
56
56
  const defaultAttrs = hasLoadStrategy ? "" : " defer";
package/esm/html.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"html.js","sourceRoot":"","sources":["../src/html.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../src/html.ts"],"names":[],"mappings":"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"}
package/esm/index.d.ts CHANGED
@@ -5,7 +5,7 @@ export { generateServerEntry } from "./entry.js";
5
5
  export type { GenerateHtmlOptions, HtmlAsset } from "./html.js";
6
6
  export { generateHtml } from "./html.js";
7
7
  export type { ExtractedRoute } from "./routes.js";
8
- export { extractRoutes } from "./routes.js";
8
+ export { extractRoutes, resolveRoutes } from "./routes.js";
9
9
  export type { TransformResult } from "./transforms/index.js";
10
10
  export { transformServerFile } from "./transforms/index.js";
11
11
  export type { ServerEntryConfig, TransformOptions } from "./types.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,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"}
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,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3D,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
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export { generateServerEntry } from "./entry.js";
5
5
  export { generateHtml } from "./html.js";
6
- export { extractRoutes } from "./routes.js";
6
+ export { extractRoutes, resolveRoutes } from "./routes.js";
7
7
  export { transformServerFile } from "./transforms/index.js";
8
8
  export { detectUseServer, hashString, makeFnId, makeModuleId, parseModuleRef, } from "./utils.js";
9
9
  //# sourceMappingURL=index.js.map
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,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"}
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,aAAa,EAAE,MAAM,aAAa,CAAC;AAE3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EACL,eAAe,EACf,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC"}
package/esm/routes.d.ts CHANGED
@@ -2,6 +2,10 @@
2
2
  export interface ExtractedRoute {
3
3
  /** Route path (e.g. "/", "/posts/$postId"). */
4
4
  path: string;
5
+ /** Variable name of the parent route (e.g. "rootRoute", "postsRoute"). */
6
+ parentName?: string;
7
+ /** Variable name this route is assigned to (e.g. "homeRoute"). */
8
+ varName?: string;
5
9
  }
6
10
  /**
7
11
  * Extract route metadata from source code by scanning for createRoute() calls.
@@ -16,4 +20,26 @@ export interface ExtractedRoute {
16
20
  * ```
17
21
  */
18
22
  export declare function extractRoutes(source: string): ExtractedRoute[];
23
+ /**
24
+ * Resolve a flat list of extracted routes into de-duplicated full paths.
25
+ *
26
+ * Builds the parent-child hierarchy using `varName` / `parentName` and
27
+ * walks the tree to construct full URL paths.
28
+ *
29
+ * Index routes (child `path: "/"` under a non-root parent) are excluded
30
+ * since they resolve to the same URL as their parent route.
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * resolveRoutes([
35
+ * { path: "/posts", varName: "postsRoute", parentName: "rootRoute" },
36
+ * { path: "/", varName: "postsIndexRoute", parentName: "postsRoute" },
37
+ * { path: "$postId", varName: "postDetailRoute", parentName: "postsRoute" },
38
+ * ])
39
+ * // => [{ path: "/posts" }, { path: "/posts/$postId" }]
40
+ * ```
41
+ */
42
+ export declare function resolveRoutes(routes: ExtractedRoute[]): Array<{
43
+ path: string;
44
+ }>;
19
45
  //# sourceMappingURL=routes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AASA,0DAA0D;AAC1D,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,EAAE,CAmB9D"}
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AASA,0DAA0D;AAC1D,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,EAAE,CAmB9D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,cAAc,EAAE,GACvB,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAkDzB"}
package/esm/routes.js CHANGED
@@ -29,6 +29,78 @@ export function extractRoutes(source) {
29
29
  }
30
30
  return routes;
31
31
  }
32
+ /**
33
+ * Resolve a flat list of extracted routes into de-duplicated full paths.
34
+ *
35
+ * Builds the parent-child hierarchy using `varName` / `parentName` and
36
+ * walks the tree to construct full URL paths.
37
+ *
38
+ * Index routes (child `path: "/"` under a non-root parent) are excluded
39
+ * since they resolve to the same URL as their parent route.
40
+ *
41
+ * @example
42
+ * ```ts
43
+ * resolveRoutes([
44
+ * { path: "/posts", varName: "postsRoute", parentName: "rootRoute" },
45
+ * { path: "/", varName: "postsIndexRoute", parentName: "postsRoute" },
46
+ * { path: "$postId", varName: "postDetailRoute", parentName: "postsRoute" },
47
+ * ])
48
+ * // => [{ path: "/posts" }, { path: "/posts/$postId" }]
49
+ * ```
50
+ */
51
+ export function resolveRoutes(routes) {
52
+ // Build a lookup: varName → ExtractedRoute
53
+ const byName = new Map();
54
+ for (const r of routes) {
55
+ if (r.varName) {
56
+ byName.set(r.varName, r);
57
+ }
58
+ }
59
+ /**
60
+ * Walk up the parent chain to build the full path prefix for a route.
61
+ * Returns the full resolved path of the given route variable.
62
+ */
63
+ function resolveParentPath(route) {
64
+ if (!route.parentName)
65
+ return route.path;
66
+ const parent = byName.get(route.parentName);
67
+ if (!parent) {
68
+ // Parent not in the extracted set (e.g. rootRoute from createRootRoute)
69
+ // — treat as top-level, no prefix.
70
+ return route.path;
71
+ }
72
+ const parentPath = resolveParentPath(parent);
73
+ return joinPaths(parentPath, route.path);
74
+ }
75
+ const seen = new Set();
76
+ const result = [];
77
+ for (const r of routes) {
78
+ const fullPath = resolveParentPath(r);
79
+ // Skip index routes that resolve to the same path as their parent.
80
+ // An index route has path "/" and a parent that is not the root.
81
+ if (r.path === "/" && r.parentName) {
82
+ const parent = byName.get(r.parentName);
83
+ if (parent) {
84
+ // This is a non-root index route — it duplicates the parent path.
85
+ continue;
86
+ }
87
+ }
88
+ if (!seen.has(fullPath)) {
89
+ seen.add(fullPath);
90
+ result.push({ path: fullPath });
91
+ }
92
+ }
93
+ return result;
94
+ }
95
+ /** Join two path segments, normalizing double slashes. */
96
+ function joinPaths(parent, child) {
97
+ if (child === "/")
98
+ return parent;
99
+ if (child.startsWith("/"))
100
+ return child;
101
+ const base = parent.endsWith("/") ? parent : `${parent}/`;
102
+ return base + child;
103
+ }
32
104
  /** Walk a top-level module item looking for createRoute calls. */
33
105
  function collectFromItem(item, routes) {
34
106
  // export const fooRoute = createRoute({ ... })
@@ -37,7 +109,8 @@ function collectFromItem(item, routes) {
37
109
  if (decl.type === "VariableDeclaration") {
38
110
  for (const d of decl.declarations) {
39
111
  if (d.init) {
40
- tryExtractFromExpr(d.init, routes);
112
+ const varName = d.id.type === "Identifier" ? d.id.value : undefined;
113
+ tryExtractFromExpr(d.init, routes, varName);
41
114
  }
42
115
  }
43
116
  }
@@ -47,13 +120,14 @@ function collectFromItem(item, routes) {
47
120
  if (item.type === "VariableDeclaration") {
48
121
  for (const d of item.declarations) {
49
122
  if (d.init) {
50
- tryExtractFromExpr(d.init, routes);
123
+ const varName = d.id.type === "Identifier" ? d.id.value : undefined;
124
+ tryExtractFromExpr(d.init, routes, varName);
51
125
  }
52
126
  }
53
127
  }
54
128
  }
55
129
  /** If the expression is a createRoute() call, extract route metadata. */
56
- function tryExtractFromExpr(expr, routes) {
130
+ function tryExtractFromExpr(expr, routes, varName) {
57
131
  if (!isCreateRouteCall(expr))
58
132
  return;
59
133
  const call = expr;
@@ -62,15 +136,51 @@ function tryExtractFromExpr(expr, routes) {
62
136
  const arg = call.arguments[0].expression;
63
137
  if (arg.type !== "ObjectExpression")
64
138
  return;
139
+ let path;
140
+ let parentName;
65
141
  for (const prop of arg.properties) {
66
142
  if (prop.type !== "KeyValueProperty")
67
143
  continue;
68
144
  const key = getPropertyName(prop);
69
145
  if (key === "path" && prop.value.type === "StringLiteral") {
70
- routes.push({ path: prop.value.value });
71
- return;
146
+ path = prop.value.value;
147
+ }
148
+ if (key === "getParentRoute") {
149
+ parentName = extractParentName(prop.value);
150
+ }
151
+ }
152
+ if (path !== undefined) {
153
+ const route = { path };
154
+ if (parentName)
155
+ route.parentName = parentName;
156
+ if (varName)
157
+ route.varName = varName;
158
+ routes.push(route);
159
+ }
160
+ }
161
+ /**
162
+ * Extract the parent route variable name from a `getParentRoute` value.
163
+ *
164
+ * Handles arrow functions like:
165
+ * - `() => rootRoute` (expression body)
166
+ * - `() => { return rootRoute; }` (block body — not common but safe)
167
+ */
168
+ function extractParentName(expr) {
169
+ if (expr.type !== "ArrowFunctionExpression")
170
+ return undefined;
171
+ // () => rootRoute (expression body)
172
+ if (expr.body.type === "Identifier") {
173
+ return expr.body.value;
174
+ }
175
+ // () => { return rootRoute; }
176
+ if (expr.body.type === "BlockStatement" && expr.body.stmts.length === 1) {
177
+ const stmt = expr.body.stmts[0];
178
+ if (stmt.type === "ReturnStatement" &&
179
+ stmt.argument?.type === "Identifier") {
180
+ return stmt.argument.value;
72
181
  }
73
182
  }
183
+ return undefined;
74
184
  }
75
185
  function isCreateRouteCall(expr) {
76
186
  if (expr.type !== "CallExpression")
package/esm/routes.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@evjs/build-tools",
3
- "version": "0.0.18",
3
+ "version": "0.0.20",
4
4
  "description": "Bundler-agnostic build utilities for the ev framework",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -32,7 +32,7 @@
32
32
  "license": "MIT",
33
33
  "dependencies": {
34
34
  "@swc/core": "^1.15.21",
35
- "domparser-rs": "^0.0.7"
35
+ "domparser-rs": "^0.1.0"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@swc/types": "^0.1.25",