@weave-framework/cli 0.2.107 → 0.2.162

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/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  The Weave CLI — `weave build`, `weave dev` (watch + live-reload), `weave check`, `weave routes`.
4
4
 
5
- Part of **[Weave](https://weave-framework.github.io/weave/)** — a fine-grained reactive, signal-native UI framework: no Virtual DOM, zero third-party runtime dependencies.
5
+ Part of **[Weave](https://weaveframework.dev/)** — a fine-grained reactive, signal-native UI framework: no Virtual DOM, zero third-party runtime dependencies.
6
6
 
7
7
  ```bash
8
8
  npm install -D @weave-framework/cli
@@ -14,7 +14,7 @@ Scaffolded apps already include it (with scripts wired up):
14
14
  npm create weave@latest my-app
15
15
  ```
16
16
 
17
- 📚 **Guides + full API reference:** [weave-framework.github.io/weave](https://weave-framework.github.io/weave/)
17
+ 📚 **Guides + full API reference:** [weaveframework.dev](https://weaveframework.dev/)
18
18
 
19
19
  ## License
20
20
 
package/bin/weave.mjs CHANGED
@@ -23,6 +23,9 @@ await esbuild({
23
23
  bundle: true,
24
24
  format: 'esm',
25
25
  platform: 'node',
26
+ // NB: @weave-framework/mcp stays INLINED in the dev bin (unlike the prod build, which
27
+ // externalizes it) — the dev bundle runs from node_modules/.weave/, whose module
28
+ // resolution can't reach the workspace-linked package, so we bundle it in.
26
29
  external: ['esbuild', 'typescript', 'sass'],
27
30
  outfile: out,
28
31
  });
package/dist/cli.js CHANGED
@@ -507,6 +507,9 @@ var Parser = class {
507
507
  if (rawName.startsWith("class:")) {
508
508
  return { type: "class", name: rawName.slice(6), expr: exprOf(), offset };
509
509
  }
510
+ if (rawName.startsWith("style:")) {
511
+ return { type: "style", name: rawName.slice(6), expr: exprOf(), offset };
512
+ }
510
513
  if (rawName.startsWith("bind:")) {
511
514
  return { type: "bind", name: rawName.slice(5), expr: exprOf(), offset };
512
515
  }
@@ -1005,9 +1008,9 @@ var Gen = class {
1005
1008
  this.usedComponents.add(name);
1006
1009
  return this.mode === "function" ? `_c.${name}` : name;
1007
1010
  }
1008
- tpl(html) {
1011
+ tpl(html, svg = false) {
1009
1012
  const v = `_t${this.tplN++}`;
1010
- this.templates.push(`const ${v} = ${this.H("template")}(${JSON.stringify(html)});`);
1013
+ this.templates.push(`const ${v} = ${this.H(svg ? "templateSvg" : "template")}(${JSON.stringify(html)});`);
1011
1014
  return v;
1012
1015
  }
1013
1016
  fn(prefix = "_b") {
@@ -1031,6 +1034,62 @@ function compileTemplate(input, options = {}) {
1031
1034
  const code = [domImport + "\n" + coreImport, ...gen.templates, `export default ${render}`].join("\n");
1032
1035
  return { code, components };
1033
1036
  }
1037
+ var SVG_TAGS = /* @__PURE__ */ new Set([
1038
+ "path",
1039
+ "rect",
1040
+ "circle",
1041
+ "ellipse",
1042
+ "line",
1043
+ "polyline",
1044
+ "polygon",
1045
+ "g",
1046
+ "defs",
1047
+ "use",
1048
+ "symbol",
1049
+ "marker",
1050
+ "mask",
1051
+ "pattern",
1052
+ "clipPath",
1053
+ "linearGradient",
1054
+ "radialGradient",
1055
+ "stop",
1056
+ "image",
1057
+ "foreignObject",
1058
+ "text",
1059
+ "tspan",
1060
+ "textPath",
1061
+ "desc",
1062
+ "view",
1063
+ "filter",
1064
+ "feBlend",
1065
+ "feColorMatrix",
1066
+ "feComponentTransfer",
1067
+ "feComposite",
1068
+ "feConvolveMatrix",
1069
+ "feDiffuseLighting",
1070
+ "feDisplacementMap",
1071
+ "feDropShadow",
1072
+ "feFlood",
1073
+ "feFuncA",
1074
+ "feFuncB",
1075
+ "feFuncG",
1076
+ "feFuncR",
1077
+ "feGaussianBlur",
1078
+ "feImage",
1079
+ "feMerge",
1080
+ "feMergeNode",
1081
+ "feMorphology",
1082
+ "feOffset",
1083
+ "feSpecularLighting",
1084
+ "feTile",
1085
+ "feTurbulence",
1086
+ "animate",
1087
+ "animateMotion",
1088
+ "animateTransform",
1089
+ "mpath",
1090
+ "set"
1091
+ ]);
1092
+ var TRANSITION_PHASES = /* @__PURE__ */ new Set(["enterstart", "enterend", "leavestart", "leaveend"]);
1034
1093
  function pascalToKebab(tag) {
1035
1094
  return tag.replace(/([a-z0-9])([A-Z])/g, "$1-$2").replace(/([A-Z]+)([A-Z][a-z])/g, "$1-$2").toLowerCase();
1036
1095
  }
@@ -1200,6 +1259,9 @@ function compileFragment(gen, nodes, scope, name, param = "", isHost = false) {
1200
1259
  case "class":
1201
1260
  sink.push(`${gen.H("bindClass")}(${n}, ${q(attr.name)}, () => ${rewrite(attr.expr, sc).code});`);
1202
1261
  break;
1262
+ case "style":
1263
+ sink.push(`${gen.H("bindStyleProp")}(${n}, ${q(attr.name)}, () => ${rewrite(attr.expr, sc).code});`);
1264
+ break;
1203
1265
  case "show":
1204
1266
  sink.push(`${gen.H("bindShow")}(${n}, () => ${rewrite(attr.expr, sc).code});`);
1205
1267
  break;
@@ -1210,6 +1272,10 @@ function compileFragment(gen, nodes, scope, name, param = "", isHost = false) {
1210
1272
  break;
1211
1273
  }
1212
1274
  case "event": {
1275
+ if (TRANSITION_PHASES.has(attr.name)) {
1276
+ sink.push(`${gen.H("transitionEvent")}(${n}, ${q(attr.name)}, ${rewrite(attr.expr, sc).code});`);
1277
+ break;
1278
+ }
1213
1279
  const handler = wrapHandler(attr, sc);
1214
1280
  const opts = eventOpts(attr.modifiers);
1215
1281
  sink.push(`${gen.H("listen")}(${n}, ${q(attr.name)}, ${handler}${opts ? `, ${opts}` : ""});`);
@@ -1221,7 +1287,7 @@ function compileFragment(gen, nodes, scope, name, param = "", isHost = false) {
1221
1287
  case "use": {
1222
1288
  const action = rewrite(attr.name, sc).code;
1223
1289
  sink.push(
1224
- attr.expr !== void 0 ? `${gen.H("applyAction")}(${n}, ${action}, ${rewrite(attr.expr, sc).code});` : `${gen.H("applyAction")}(${n}, ${action});`
1290
+ attr.expr !== void 0 ? `${gen.H("applyAction")}(${n}, ${action}, () => ${rewrite(attr.expr, sc).code});` : `${gen.H("applyAction")}(${n}, ${action});`
1225
1291
  );
1226
1292
  break;
1227
1293
  }
@@ -1404,8 +1470,10 @@ function compileFragment(gen, nodes, scope, name, param = "", isHost = false) {
1404
1470
  }
1405
1471
  if (singleRoot) emitElement(sole, [], scope, isHost);
1406
1472
  else emitChildren(top, [], scope, isHost);
1473
+ const topEls = top.filter((n) => n.type === "element");
1474
+ const svgRoot = topEls.length > 0 && SVG_TAGS.has(topEls[0].tag);
1407
1475
  const ctor = singleRoot ? gen.H("clone") : gen.H("cloneFragment");
1408
- const tplVar = gen.tpl(html);
1476
+ const tplVar = gen.tpl(html, svgRoot);
1409
1477
  const body = [
1410
1478
  `const _r = ${ctor}(${tplVar});`,
1411
1479
  ...nodeDecls,
@@ -3334,8 +3402,21 @@ weave check: ${errors} error${errors === 1 ? "" : "s"}`);
3334
3402
  console.log(`weave routes \u2192 ${written}`);
3335
3403
  return;
3336
3404
  }
3405
+ if (cmd === "mcp") {
3406
+ try {
3407
+ const mcp = await import("@weave-framework/mcp");
3408
+ await mcp.runStdioServer();
3409
+ } catch (e) {
3410
+ console.error(
3411
+ `weave mcp: could not start the MCP server \u2014 is @weave-framework/mcp installed?
3412
+ ${e?.message ?? String(e)}`
3413
+ );
3414
+ process.exit(1);
3415
+ }
3416
+ return;
3417
+ }
3337
3418
  console.error(
3338
- "usage: weave <build|dev|check|routes> [entry|paths\u2026] [--config file] [--out dir] [--serve dir] [--port n] [--no-minify] [--eager]"
3419
+ "usage: weave <build|dev|check|routes|mcp> [entry|paths\u2026] [--config file] [--out dir] [--serve dir] [--port n] [--no-minify] [--eager]"
3339
3420
  );
3340
3421
  process.exit(1);
3341
3422
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weave-framework/cli",
3
- "version": "0.2.107",
3
+ "version": "0.2.162",
4
4
  "description": "Weave CLI — `weave build`, `weave dev` (watch + live-reload), `weave check`, `weave routes`.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -31,7 +31,8 @@
31
31
  },
32
32
  "dependencies": {
33
33
  "esbuild": "^0.25.0",
34
- "typescript": "^5.7.0"
34
+ "typescript": "^5.7.0",
35
+ "@weave-framework/mcp": "0.2.162"
35
36
  },
36
37
  "optionalDependencies": {
37
38
  "sass": "^1.0.0"