@fluixi/compiler 1.0.0-alpha.100

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 (303) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +131 -0
  3. package/dist/analyze/expr-shape.cjs +62 -0
  4. package/dist/analyze/expr-shape.d.cts +14 -0
  5. package/dist/analyze/expr-shape.d.ts +15 -0
  6. package/dist/analyze/expr-shape.d.ts.map +1 -0
  7. package/dist/analyze/expr-shape.js +37 -0
  8. package/dist/analyze/expr-shape.mjs +41 -0
  9. package/dist/analyze/intrinsics.cjs +112 -0
  10. package/dist/analyze/intrinsics.d.cts +80 -0
  11. package/dist/analyze/intrinsics.d.ts +81 -0
  12. package/dist/analyze/intrinsics.d.ts.map +1 -0
  13. package/dist/analyze/intrinsics.js +126 -0
  14. package/dist/analyze/intrinsics.mjs +91 -0
  15. package/dist/analyze/paren.cjs +134 -0
  16. package/dist/analyze/paren.d.cts +23 -0
  17. package/dist/analyze/paren.d.ts +24 -0
  18. package/dist/analyze/paren.d.ts.map +1 -0
  19. package/dist/analyze/paren.js +168 -0
  20. package/dist/analyze/paren.mjs +113 -0
  21. package/dist/analyze/props-destructure.cjs +226 -0
  22. package/dist/analyze/props-destructure.d.cts +83 -0
  23. package/dist/analyze/props-destructure.d.ts +84 -0
  24. package/dist/analyze/props-destructure.d.ts.map +1 -0
  25. package/dist/analyze/props-destructure.js +272 -0
  26. package/dist/analyze/props-destructure.mjs +205 -0
  27. package/dist/analyze/reactive-bindings.cjs +210 -0
  28. package/dist/analyze/reactive-bindings.d.cts +42 -0
  29. package/dist/analyze/reactive-bindings.d.ts +43 -0
  30. package/dist/analyze/reactive-bindings.d.ts.map +1 -0
  31. package/dist/analyze/reactive-bindings.js +191 -0
  32. package/dist/analyze/reactive-bindings.mjs +187 -0
  33. package/dist/analyze/reactive-expr.cjs +38 -0
  34. package/dist/analyze/reactive-expr.d.cts +38 -0
  35. package/dist/analyze/reactive-expr.d.ts +39 -0
  36. package/dist/analyze/reactive-expr.d.ts.map +1 -0
  37. package/dist/analyze/reactive-expr.js +31 -0
  38. package/dist/analyze/reactive-expr.mjs +17 -0
  39. package/dist/analyze/static-graph.cjs +831 -0
  40. package/dist/analyze/static-graph.d.cts +102 -0
  41. package/dist/analyze/static-graph.d.ts +103 -0
  42. package/dist/analyze/static-graph.d.ts.map +1 -0
  43. package/dist/analyze/static-graph.js +871 -0
  44. package/dist/analyze/static-graph.mjs +813 -0
  45. package/dist/babel-I6BUWUCU.mjs +636 -0
  46. package/dist/chunk-3AICWNF7.mjs +92 -0
  47. package/dist/chunk-6CWJWGE2.mjs +2170 -0
  48. package/dist/chunk-C3XPDB4Y.mjs +16 -0
  49. package/dist/chunk-GX5XV6Z7.mjs +190 -0
  50. package/dist/chunk-HXEXPWJ2.mjs +999 -0
  51. package/dist/chunk-NU3W67UZ.mjs +584 -0
  52. package/dist/chunk-SKAVY75W.mjs +11 -0
  53. package/dist/codegen/backend.cjs +18 -0
  54. package/dist/codegen/backend.d.cts +35 -0
  55. package/dist/codegen/backend.d.ts +36 -0
  56. package/dist/codegen/backend.d.ts.map +1 -0
  57. package/dist/codegen/backend.js +1 -0
  58. package/dist/codegen/backend.mjs +0 -0
  59. package/dist/codegen/backends/imperative.cjs +577 -0
  60. package/dist/codegen/backends/imperative.d.cts +11 -0
  61. package/dist/codegen/backends/imperative.d.ts +12 -0
  62. package/dist/codegen/backends/imperative.d.ts.map +1 -0
  63. package/dist/codegen/backends/imperative.js +362 -0
  64. package/dist/codegen/backends/imperative.mjs +554 -0
  65. package/dist/codegen/contract.cjs +52 -0
  66. package/dist/codegen/contract.d.cts +24 -0
  67. package/dist/codegen/contract.d.ts +25 -0
  68. package/dist/codegen/contract.d.ts.map +1 -0
  69. package/dist/codegen/contract.js +30 -0
  70. package/dist/codegen/contract.mjs +31 -0
  71. package/dist/codegen/partial-template.cjs +176 -0
  72. package/dist/codegen/partial-template.d.cts +61 -0
  73. package/dist/codegen/partial-template.d.ts +62 -0
  74. package/dist/codegen/partial-template.d.ts.map +1 -0
  75. package/dist/codegen/partial-template.js +0 -0
  76. package/dist/codegen/partial-template.mjs +153 -0
  77. package/dist/codegen/serialize-static.cjs +125 -0
  78. package/dist/codegen/serialize-static.d.cts +38 -0
  79. package/dist/codegen/serialize-static.d.ts +39 -0
  80. package/dist/codegen/serialize-static.d.ts.map +1 -0
  81. package/dist/codegen/serialize-static.js +165 -0
  82. package/dist/codegen/serialize-static.mjs +104 -0
  83. package/dist/frontend/babel/build-ir-lit.cjs +1933 -0
  84. package/dist/frontend/babel/build-ir-lit.d.cts +26 -0
  85. package/dist/frontend/babel/build-ir-lit.d.ts +27 -0
  86. package/dist/frontend/babel/build-ir-lit.d.ts.map +1 -0
  87. package/dist/frontend/babel/build-ir-lit.js +13 -0
  88. package/dist/frontend/babel/build-ir-lit.mjs +1902 -0
  89. package/dist/frontend/babel/build-ir.cjs +1948 -0
  90. package/dist/frontend/babel/build-ir.d.cts +35 -0
  91. package/dist/frontend/babel/build-ir.d.ts +36 -0
  92. package/dist/frontend/babel/build-ir.d.ts.map +1 -0
  93. package/dist/frontend/babel/build-ir.js +124 -0
  94. package/dist/frontend/babel/build-ir.mjs +1919 -0
  95. package/dist/frontend/babel/index.cjs +2610 -0
  96. package/dist/frontend/babel/index.d.cts +33 -0
  97. package/dist/frontend/babel/index.d.ts +34 -0
  98. package/dist/frontend/babel/index.d.ts.map +1 -0
  99. package/dist/frontend/babel/index.js +65 -0
  100. package/dist/frontend/babel/index.mjs +2580 -0
  101. package/dist/frontend/babel/lower-template.cjs +1931 -0
  102. package/dist/frontend/babel/lower-template.d.cts +23 -0
  103. package/dist/frontend/babel/lower-template.d.ts +24 -0
  104. package/dist/frontend/babel/lower-template.d.ts.map +1 -0
  105. package/dist/frontend/babel/lower-template.js +64 -0
  106. package/dist/frontend/babel/lower-template.mjs +1902 -0
  107. package/dist/frontend/babel/plugin.cjs +2556 -0
  108. package/dist/frontend/babel/plugin.d.cts +95 -0
  109. package/dist/frontend/babel/plugin.d.ts +96 -0
  110. package/dist/frontend/babel/plugin.d.ts.map +1 -0
  111. package/dist/frontend/babel/plugin.js +523 -0
  112. package/dist/frontend/babel/plugin.mjs +2527 -0
  113. package/dist/frontend/babel/server-functions.cjs +110 -0
  114. package/dist/frontend/babel/server-functions.d.cts +10 -0
  115. package/dist/frontend/babel/server-functions.d.ts +11 -0
  116. package/dist/frontend/babel/server-functions.d.ts.map +1 -0
  117. package/dist/frontend/babel/server-functions.js +81 -0
  118. package/dist/frontend/babel/server-functions.mjs +89 -0
  119. package/dist/frontend/babel/types.cjs +18 -0
  120. package/dist/frontend/babel/types.d.cts +33 -0
  121. package/dist/frontend/babel/types.d.ts +34 -0
  122. package/dist/frontend/babel/types.d.ts.map +1 -0
  123. package/dist/frontend/babel/types.js +1 -0
  124. package/dist/frontend/babel/types.mjs +0 -0
  125. package/dist/frontend/types.cjs +18 -0
  126. package/dist/frontend/types.d.cts +25 -0
  127. package/dist/frontend/types.d.ts +26 -0
  128. package/dist/frontend/types.d.ts.map +1 -0
  129. package/dist/frontend/types.js +1 -0
  130. package/dist/frontend/types.mjs +0 -0
  131. package/dist/frontend/vocabulary.cjs +98 -0
  132. package/dist/frontend/vocabulary.d.cts +79 -0
  133. package/dist/frontend/vocabulary.d.ts +80 -0
  134. package/dist/frontend/vocabulary.d.ts.map +1 -0
  135. package/dist/frontend/vocabulary.js +124 -0
  136. package/dist/frontend/vocabulary.mjs +77 -0
  137. package/dist/index.cjs +1957 -0
  138. package/dist/index.d.cts +27 -0
  139. package/dist/index.d.ts +28 -0
  140. package/dist/index.d.ts.map +1 -0
  141. package/dist/index.js +38 -0
  142. package/dist/index.mjs +1949 -0
  143. package/dist/integrations.cjs +5705 -0
  144. package/dist/integrations.d.cts +215 -0
  145. package/dist/integrations.d.ts +216 -0
  146. package/dist/integrations.d.ts.map +1 -0
  147. package/dist/integrations.js +566 -0
  148. package/dist/integrations.mjs +810 -0
  149. package/dist/ir/nodes.cjs +18 -0
  150. package/dist/ir/nodes.d.cts +168 -0
  151. package/dist/ir/nodes.d.ts +169 -0
  152. package/dist/ir/nodes.d.ts.map +1 -0
  153. package/dist/ir/nodes.js +1 -0
  154. package/dist/ir/nodes.mjs +0 -0
  155. package/dist/lower/compile-template.cjs +1670 -0
  156. package/dist/lower/compile-template.d.cts +82 -0
  157. package/dist/lower/compile-template.d.ts +83 -0
  158. package/dist/lower/compile-template.d.ts.map +1 -0
  159. package/dist/lower/compile-template.js +79 -0
  160. package/dist/lower/compile-template.mjs +1662 -0
  161. package/dist/lower/entities.cjs +288 -0
  162. package/dist/lower/entities.d.cts +1 -0
  163. package/dist/lower/entities.d.ts +2 -0
  164. package/dist/lower/entities.d.ts.map +1 -0
  165. package/dist/lower/entities.js +54 -0
  166. package/dist/lower/entities.mjs +267 -0
  167. package/dist/lower/jsx.cjs +1101 -0
  168. package/dist/lower/jsx.d.cts +33 -0
  169. package/dist/lower/jsx.d.ts +34 -0
  170. package/dist/lower/jsx.d.ts.map +1 -0
  171. package/dist/lower/jsx.js +414 -0
  172. package/dist/lower/jsx.mjs +1078 -0
  173. package/dist/lower/template.cjs +1354 -0
  174. package/dist/lower/template.d.cts +53 -0
  175. package/dist/lower/template.d.ts +54 -0
  176. package/dist/lower/template.d.ts.map +1 -0
  177. package/dist/lower/template.js +542 -0
  178. package/dist/lower/template.mjs +1335 -0
  179. package/dist/lower/text.cjs +42 -0
  180. package/dist/lower/text.d.cts +10 -0
  181. package/dist/lower/text.d.ts +11 -0
  182. package/dist/lower/text.d.ts.map +1 -0
  183. package/dist/lower/text.js +31 -0
  184. package/dist/lower/text.mjs +21 -0
  185. package/dist/optimize/analyze-static.cjs +112 -0
  186. package/dist/optimize/analyze-static.d.cts +39 -0
  187. package/dist/optimize/analyze-static.d.ts +40 -0
  188. package/dist/optimize/analyze-static.d.ts.map +1 -0
  189. package/dist/optimize/analyze-static.js +131 -0
  190. package/dist/optimize/analyze-static.mjs +91 -0
  191. package/dist/optimize/collapse-strategies.cjs +90 -0
  192. package/dist/optimize/collapse-strategies.d.cts +30 -0
  193. package/dist/optimize/collapse-strategies.d.ts +31 -0
  194. package/dist/optimize/collapse-strategies.d.ts.map +1 -0
  195. package/dist/optimize/collapse-strategies.js +33 -0
  196. package/dist/optimize/collapse-strategies.mjs +67 -0
  197. package/dist/options.cjs +33 -0
  198. package/dist/options.d.cts +39 -0
  199. package/dist/options.d.ts +40 -0
  200. package/dist/options.d.ts.map +1 -0
  201. package/dist/options.js +8 -0
  202. package/dist/options.mjs +12 -0
  203. package/dist/resolve/builtins.cjs +73 -0
  204. package/dist/resolve/builtins.d.cts +68 -0
  205. package/dist/resolve/builtins.d.ts +69 -0
  206. package/dist/resolve/builtins.d.ts.map +1 -0
  207. package/dist/resolve/builtins.js +64 -0
  208. package/dist/resolve/builtins.mjs +53 -0
  209. package/dist/resolve/component-globals.cjs +272 -0
  210. package/dist/resolve/component-globals.d.cts +88 -0
  211. package/dist/resolve/component-globals.d.ts +89 -0
  212. package/dist/resolve/component-globals.d.ts.map +1 -0
  213. package/dist/resolve/component-globals.js +160 -0
  214. package/dist/resolve/component-globals.mjs +249 -0
  215. package/dist/resolve/component-resolver.cjs +80 -0
  216. package/dist/resolve/component-resolver.d.cts +68 -0
  217. package/dist/resolve/component-resolver.d.ts +69 -0
  218. package/dist/resolve/component-resolver.d.ts.map +1 -0
  219. package/dist/resolve/component-resolver.js +95 -0
  220. package/dist/resolve/component-resolver.mjs +59 -0
  221. package/dist/resolve/load-directive.cjs +93 -0
  222. package/dist/resolve/load-directive.d.cts +53 -0
  223. package/dist/resolve/load-directive.d.ts +54 -0
  224. package/dist/resolve/load-directive.d.ts.map +1 -0
  225. package/dist/resolve/load-directive.js +93 -0
  226. package/dist/resolve/load-directive.mjs +72 -0
  227. package/dist/resolve/resolve-ir.cjs +108 -0
  228. package/dist/resolve/resolve-ir.d.cts +53 -0
  229. package/dist/resolve/resolve-ir.d.ts +54 -0
  230. package/dist/resolve/resolve-ir.d.ts.map +1 -0
  231. package/dist/resolve/resolve-ir.js +58 -0
  232. package/dist/resolve/resolve-ir.mjs +85 -0
  233. package/dist/resolve/write-globals.cjs +383 -0
  234. package/dist/resolve/write-globals.d.cts +36 -0
  235. package/dist/resolve/write-globals.d.ts +37 -0
  236. package/dist/resolve/write-globals.d.ts.map +1 -0
  237. package/dist/resolve/write-globals.js +169 -0
  238. package/dist/resolve/write-globals.mjs +362 -0
  239. package/dist/server-fns-VZLHMQTC.mjs +79 -0
  240. package/dist/server-functions-UAZKOLZW.mjs +82 -0
  241. package/dist/transform/bindings.cjs +71 -0
  242. package/dist/transform/bindings.d.cts +16 -0
  243. package/dist/transform/bindings.d.ts +17 -0
  244. package/dist/transform/bindings.d.ts.map +1 -0
  245. package/dist/transform/bindings.js +69 -0
  246. package/dist/transform/bindings.mjs +50 -0
  247. package/dist/transform/index.cjs +3837 -0
  248. package/dist/transform/index.d.cts +15 -0
  249. package/dist/transform/index.d.ts +16 -0
  250. package/dist/transform/index.d.ts.map +1 -0
  251. package/dist/transform/index.js +12 -0
  252. package/dist/transform/index.mjs +4882 -0
  253. package/dist/transform/intrinsics.cjs +261 -0
  254. package/dist/transform/intrinsics.d.cts +33 -0
  255. package/dist/transform/intrinsics.d.ts +34 -0
  256. package/dist/transform/intrinsics.d.ts.map +1 -0
  257. package/dist/transform/intrinsics.js +120 -0
  258. package/dist/transform/intrinsics.mjs +238 -0
  259. package/dist/transform/props.cjs +441 -0
  260. package/dist/transform/props.d.cts +45 -0
  261. package/dist/transform/props.d.ts +46 -0
  262. package/dist/transform/props.d.ts.map +1 -0
  263. package/dist/transform/props.js +221 -0
  264. package/dist/transform/props.mjs +1487 -0
  265. package/dist/transform/server-fn-id.cjs +35 -0
  266. package/dist/transform/server-fn-id.d.cts +9 -0
  267. package/dist/transform/server-fn-id.d.ts +10 -0
  268. package/dist/transform/server-fn-id.d.ts.map +1 -0
  269. package/dist/transform/server-fn-id.js +18 -0
  270. package/dist/transform/server-fn-id.mjs +14 -0
  271. package/dist/transform/server-fns.cjs +114 -0
  272. package/dist/transform/server-fns.d.cts +12 -0
  273. package/dist/transform/server-fns.d.ts +13 -0
  274. package/dist/transform/server-fns.d.ts.map +1 -0
  275. package/dist/transform/server-fns.js +94 -0
  276. package/dist/transform/server-fns.mjs +1160 -0
  277. package/dist/transform/source-locations.cjs +393 -0
  278. package/dist/transform/source-locations.d.cts +48 -0
  279. package/dist/transform/source-locations.d.ts +49 -0
  280. package/dist/transform/source-locations.d.ts.map +1 -0
  281. package/dist/transform/source-locations.js +303 -0
  282. package/dist/transform/source-locations.mjs +370 -0
  283. package/dist/transform/styles.cjs +606 -0
  284. package/dist/transform/styles.d.cts +237 -0
  285. package/dist/transform/styles.d.ts +238 -0
  286. package/dist/transform/styles.d.ts.map +1 -0
  287. package/dist/transform/styles.js +743 -0
  288. package/dist/transform/styles.mjs +671 -0
  289. package/dist/transform/templates.cjs +3806 -0
  290. package/dist/transform/templates.d.cts +82 -0
  291. package/dist/transform/templates.d.ts +83 -0
  292. package/dist/transform/templates.d.ts.map +1 -0
  293. package/dist/transform/templates.js +613 -0
  294. package/dist/transform/templates.mjs +4852 -0
  295. package/dist/transform-3W45L3EA.mjs +951 -0
  296. package/dist/tsconfig.lib.tsbuildinfo +1 -0
  297. package/dist/vite-styles.cjs +223 -0
  298. package/dist/vite-styles.d.cts +68 -0
  299. package/dist/vite-styles.d.ts +69 -0
  300. package/dist/vite-styles.d.ts.map +1 -0
  301. package/dist/vite-styles.js +241 -0
  302. package/dist/vite-styles.mjs +214 -0
  303. package/package.json +141 -0
@@ -0,0 +1,85 @@
1
+ // src/resolve/builtins.ts
2
+ var DOM_CONTROL_FLOW = [
3
+ "Show",
4
+ "For",
5
+ "Index",
6
+ "Switch",
7
+ "Match",
8
+ "Portal",
9
+ "Dynamic",
10
+ "ErrorBoundary"
11
+ ];
12
+ var CORE_CONTROL_FLOW = ["Suspense", "SuspenseList", "Await"];
13
+ var ROUTER_COMPONENTS = ["Router", "Outlet", "Redirect", "Link"];
14
+ var BUILTIN_COMPONENTS = [
15
+ ...DOM_CONTROL_FLOW,
16
+ ...CORE_CONTROL_FLOW,
17
+ ...ROUTER_COMPONENTS
18
+ ];
19
+ var RESERVED_COMPONENTS = /* @__PURE__ */ new Set([
20
+ ...DOM_CONTROL_FLOW,
21
+ ...CORE_CONTROL_FLOW
22
+ ]);
23
+ function builtinComponentMap(modules = {}) {
24
+ const {
25
+ controlFlowModule = "@fluixi/dom",
26
+ coreModule = "@fluixi/core",
27
+ routerModule = "@fluixi/core/router"
28
+ } = modules;
29
+ const map = {};
30
+ for (const name of DOM_CONTROL_FLOW) map[name] = controlFlowModule;
31
+ for (const name of CORE_CONTROL_FLOW) map[name] = coreModule;
32
+ for (const name of ROUTER_COMPONENTS) map[name] = routerModule;
33
+ return map;
34
+ }
35
+
36
+ // src/resolve/load-directive.ts
37
+ var EAGER = { kind: "eager" };
38
+
39
+ // src/resolve/resolve-ir.ts
40
+ function resolveComponentSources(root, options = {}) {
41
+ const { resolver, isBound, modules, strategyFor } = options;
42
+ const builtins = builtinComponentMap(modules);
43
+ const resolved = /* @__PURE__ */ new Map();
44
+ const unresolved = /* @__PURE__ */ new Set();
45
+ const annotate = (node) => {
46
+ const { name } = node;
47
+ if (!name || name.includes(".")) return;
48
+ if (isBound?.(name)) return;
49
+ const source = sourceFor(name);
50
+ if (!source) {
51
+ unresolved.add(name);
52
+ return;
53
+ }
54
+ const loading = source.origin === "builtin" && RESERVED_COMPONENTS.has(name) ? EAGER : strategyFor?.(node) ?? EAGER;
55
+ node.source = { ...source, loading };
56
+ resolved.set(name, node.source);
57
+ };
58
+ const sourceFor = (name) => {
59
+ if (RESERVED_COMPONENTS.has(name)) {
60
+ return { module: builtins[name], export: name, origin: "builtin" };
61
+ }
62
+ const rule = resolver?.resolve(name);
63
+ if (rule) return { module: rule.module, export: rule.export, origin: "rule" };
64
+ if (ROUTER_COMPONENTS.includes(name)) {
65
+ return { module: builtins[name], export: name, origin: "builtin" };
66
+ }
67
+ return void 0;
68
+ };
69
+ walk(root, (node) => {
70
+ if (node.kind === "component") annotate(node);
71
+ });
72
+ return { resolved, unresolved: [...unresolved] };
73
+ }
74
+ function walk(root, visit) {
75
+ const nodes = Array.isArray(root) ? root : [root];
76
+ for (const node of nodes) {
77
+ visit(node);
78
+ const children = node.children;
79
+ if (children) walk(children, visit);
80
+ }
81
+ }
82
+ export {
83
+ resolveComponentSources,
84
+ walk
85
+ };
@@ -0,0 +1,383 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/resolve/write-globals.ts
21
+ var write_globals_exports = {};
22
+ __export(write_globals_exports, {
23
+ DEFAULT_GLOBALS_PATH: () => DEFAULT_GLOBALS_PATH,
24
+ patternCandidates: () => patternCandidates,
25
+ writeComponentGlobals: () => writeComponentGlobals
26
+ });
27
+ module.exports = __toCommonJS(write_globals_exports);
28
+ var import_node_fs = require("node:fs");
29
+ var import_node_path = require("node:path");
30
+
31
+ // src/resolve/component-resolver.ts
32
+ var isMapRule = (rule) => "components" in rule;
33
+ function substitute(template, match) {
34
+ return template.replace(/\$(\d+)/g, (whole, index) => {
35
+ const group = match[Number(index)];
36
+ return group ?? whole;
37
+ });
38
+ }
39
+ function normalise(name, entry) {
40
+ return typeof entry === "string" ? { module: entry, export: name } : entry;
41
+ }
42
+ function createComponentResolver(rules = []) {
43
+ const exact = /* @__PURE__ */ new Map();
44
+ const conflicts = [];
45
+ const patterns = [];
46
+ for (const rule of rules) {
47
+ if (!isMapRule(rule)) {
48
+ patterns.push(rule);
49
+ continue;
50
+ }
51
+ for (const [name, entry] of Object.entries(rule.components)) {
52
+ const resolved = normalise(name, entry);
53
+ const existing = exact.get(name);
54
+ if (existing && existing.module !== resolved.module) {
55
+ const conflict = conflicts.find((c) => c.name === name);
56
+ if (conflict) conflict.modules.push(resolved.module);
57
+ else conflicts.push({ name, modules: [existing.module, resolved.module] });
58
+ continue;
59
+ }
60
+ exact.set(name, resolved);
61
+ }
62
+ }
63
+ const cache = /* @__PURE__ */ new Map();
64
+ const resolve = (name) => {
65
+ if (cache.has(name)) return cache.get(name);
66
+ let result = exact.get(name);
67
+ if (!result) {
68
+ for (const rule of patterns) {
69
+ const match = name.match(new RegExp(rule.match.source, rule.match.flags.replace("g", "")));
70
+ if (!match) continue;
71
+ result = {
72
+ module: substitute(rule.module, match),
73
+ export: rule.export ? substitute(rule.export, match) : name
74
+ };
75
+ break;
76
+ }
77
+ }
78
+ cache.set(name, result);
79
+ return result;
80
+ };
81
+ return {
82
+ resolve,
83
+ names: () => [...exact.keys()],
84
+ conflicts: () => conflicts
85
+ };
86
+ }
87
+
88
+ // src/resolve/builtins.ts
89
+ var DOM_CONTROL_FLOW = [
90
+ "Show",
91
+ "For",
92
+ "Index",
93
+ "Switch",
94
+ "Match",
95
+ "Portal",
96
+ "Dynamic",
97
+ "ErrorBoundary"
98
+ ];
99
+ var CORE_CONTROL_FLOW = ["Suspense", "SuspenseList", "Await"];
100
+ var ROUTER_COMPONENTS = ["Router", "Outlet", "Redirect", "Link"];
101
+ var BUILTIN_COMPONENTS = [
102
+ ...DOM_CONTROL_FLOW,
103
+ ...CORE_CONTROL_FLOW,
104
+ ...ROUTER_COMPONENTS
105
+ ];
106
+ var RESERVED_COMPONENTS = /* @__PURE__ */ new Set([
107
+ ...DOM_CONTROL_FLOW,
108
+ ...CORE_CONTROL_FLOW
109
+ ]);
110
+ function builtinComponentMap(modules = {}) {
111
+ const {
112
+ controlFlowModule = "@fluixi/dom",
113
+ coreModule = "@fluixi/core",
114
+ routerModule = "@fluixi/core/router"
115
+ } = modules;
116
+ const map = {};
117
+ for (const name of DOM_CONTROL_FLOW) map[name] = controlFlowModule;
118
+ for (const name of CORE_CONTROL_FLOW) map[name] = coreModule;
119
+ for (const name of ROUTER_COMPONENTS) map[name] = routerModule;
120
+ return map;
121
+ }
122
+
123
+ // src/analyze/intrinsics.ts
124
+ var REACTIVE_MODULE = "@fluixi/reactive/signal";
125
+ var INTRINSICS = {
126
+ $signal: { export: "signal", module: REACTIVE_MODULE, returns: "signal-handle" },
127
+ $memo: { export: "memo", module: REACTIVE_MODULE, returns: "memo-handle" },
128
+ $effect: { export: "effect", module: REACTIVE_MODULE, returns: "effect" },
129
+ $store: { export: "store", module: "@fluixi/reactive/store", returns: "store-handle" },
130
+ $resource: { export: "resource", module: REACTIVE_MODULE, returns: "resource-handle" },
131
+ $cachedResource: { export: "cachedResource", module: "@fluixi/reactive/cached-resource", returns: "resource-handle" },
132
+ // No short runtime form for these yet, so the intrinsic stands for the `create*`
133
+ // name. Still worth having: no import to write, and when a shorter form is
134
+ // designed, the change is this line rather than a compiler pass.
135
+ $selector: { export: "createSelector", module: REACTIVE_MODULE, returns: "memo-accessor" },
136
+ $deferred: { export: "createDeferred", module: REACTIVE_MODULE, returns: "memo-accessor" },
137
+ // Not value constructors, but the compiler has to know them: they change what a read
138
+ // does. `untrack` suppresses dependency collection, which is exactly the kind of thing
139
+ // dependency analysis must not guess at.
140
+ $untrack: { export: "untrack", module: REACTIVE_MODULE, returns: "plain" },
141
+ $untrackStore: { export: "untrackStore", module: "@fluixi/reactive/store", returns: "plain" },
142
+ // Scopes, scheduling and lifecycle: no value to classify, but the same authoring promise,
143
+ // no import to write. `$cleanup` registers a callback on the current owner (`onCleanup`).
144
+ $batch: { export: "batch", module: REACTIVE_MODULE, returns: "plain" },
145
+ $cleanup: { export: "onCleanup", module: REACTIVE_MODULE, returns: "plain" },
146
+ $root: { export: "root", module: REACTIVE_MODULE, returns: "plain" },
147
+ $context: { export: "context", module: REACTIVE_MODULE, returns: "plain" },
148
+ $renderEffect: { export: "renderEffect", module: REACTIVE_MODULE, returns: "effect" },
149
+ $computed: { export: "computed", module: REACTIVE_MODULE, returns: "effect" },
150
+ // Storage for where the code runs, and a signal kept in it. `$persisted` is a signal
151
+ // handle as far as reads go: the same accessor with `set` on it.
152
+ $storage: { export: "useStorage", module: "@fluixi/core/storage", returns: "plain" },
153
+ $asyncStorage: { export: "useAsyncStorage", module: "@fluixi/core/storage", returns: "plain" },
154
+ $persisted: { export: "persisted", module: "@fluixi/core/storage", returns: "signal-handle" },
155
+ // An environment variable, public or server-only; the browser build refuses a secret.
156
+ $env: { export: "env", module: "@fluixi/start/env", returns: "plain" }
157
+ };
158
+ var TAG_INTRINSICS = {
159
+ $html: { export: "html", module: "@fluixi/core" },
160
+ $svg: { export: "svg", module: "@fluixi/core" },
161
+ $css: { export: "css", module: "@fluixi/core" }
162
+ };
163
+ var INTRINSIC_CALL = new RegExp(`\\$(?:${Object.keys(INTRINSICS).map((n) => n.slice(1)).join("|")})\\s*\\(`);
164
+
165
+ // src/resolve/component-globals.ts
166
+ var DOM_GLOBALS = /* @__PURE__ */ new Set([
167
+ "Text",
168
+ "Image",
169
+ "Option",
170
+ "Audio",
171
+ "Comment",
172
+ "Range",
173
+ "Selection",
174
+ "Notification",
175
+ "Event",
176
+ "Document",
177
+ "Element",
178
+ "Node",
179
+ "Screen",
180
+ "Window",
181
+ "Location",
182
+ "History",
183
+ "Storage",
184
+ "Response",
185
+ "Request",
186
+ "Headers"
187
+ ]);
188
+ function packageOf(specifier) {
189
+ if (specifier.startsWith(".") || specifier.startsWith("/")) return void 0;
190
+ if (/^[~@]\//.test(specifier)) return void 0;
191
+ const parts = specifier.split("/");
192
+ return specifier.startsWith("@") ? parts.slice(0, 2).join("/") : parts[0];
193
+ }
194
+ function namespaceAlias(module2) {
195
+ return `_${module2.replace(/[^A-Za-z0-9]/g, "_")}`;
196
+ }
197
+ function componentGlobals(rules, options = {}) {
198
+ const {
199
+ available: availableList,
200
+ builtins = true,
201
+ intrinsics = true,
202
+ generator = "@fluixi/compiler",
203
+ specifier = (module2) => module2,
204
+ candidates = []
205
+ } = options;
206
+ const all = [...rules];
207
+ if (builtins) {
208
+ all.push({ components: builtinComponentMap() });
209
+ }
210
+ const resolver = createComponentResolver(all);
211
+ const available = availableList ? new Set(availableList) : void 0;
212
+ const declared = [];
213
+ const shadowedByDom = [];
214
+ const unavailable = [];
215
+ const resolved = /* @__PURE__ */ new Map();
216
+ const names = /* @__PURE__ */ new Set([...resolver.names(), ...[...candidates].filter((n) => /^[A-Za-z_$][\w$]*$/.test(n))]);
217
+ for (const name of [...names].sort()) {
218
+ const target = resolver.resolve(name);
219
+ if (!target) continue;
220
+ const pkg = packageOf(target.module);
221
+ if (DOM_GLOBALS.has(name)) shadowedByDom.push(name);
222
+ else if (available && pkg && !available.has(pkg)) unavailable.push(name);
223
+ else {
224
+ declared.push(name);
225
+ resolved.set(name, target);
226
+ }
227
+ }
228
+ const usableIntrinsics = intrinsics ? Object.entries({ ...INTRINSICS, ...TAG_INTRINSICS }).filter(([, i]) => {
229
+ const pkg = packageOf(i.module);
230
+ return !available || !pkg || available.has(pkg);
231
+ }) : [];
232
+ const intrinsicModules = [...new Set(usableIntrinsics.map(([, i]) => i.module))];
233
+ const modules = [
234
+ .../* @__PURE__ */ new Set([...declared.map((name) => resolved.get(name).module), ...intrinsicModules])
235
+ ].sort();
236
+ const imports = modules.map(
237
+ (m) => `import * as ${namespaceAlias(m)} from '${specifier(m)}';`
238
+ );
239
+ const lines = declared.map((name) => {
240
+ const target = resolved.get(name);
241
+ const ns = namespaceAlias(target.module);
242
+ return target.export === "default" ? ` const ${name}: typeof ${ns}.default;` : ` export import ${name} = ${ns}.${target.export};`;
243
+ });
244
+ const note = shadowedByDom.length > 0 ? `//
245
+ // Import these explicitly: lib.dom already declares the name, so an ambient
246
+ // declaration cannot win:
247
+ ` + shadowedByDom.map((n) => {
248
+ const module2 = resolver.resolve(n)?.module;
249
+ return `// import { ${n} } from '${module2 ? specifier(module2) : ""}';
250
+ `;
251
+ }).join("") : "";
252
+ const intrinsicLines = usableIntrinsics.map(
253
+ ([name, intrinsic]) => ` const ${name}: typeof ${namespaceAlias(intrinsic.module)}.${intrinsic.export};`
254
+ );
255
+ const patternRules = rules.filter((rule) => "match" in rule).length;
256
+ const patternNote = patternRules === 0 ? "" : options.candidates ? `//
257
+ // ${patternRules} pattern rule${patternRules === 1 ? "" : "s"}: declared for the files the module path
258
+ // points at. A name with no such file still resolves at build time; declare it by hand.
259
+ ` : `//
260
+ // ${patternRules} pattern rule${patternRules === 1 ? "" : "s"} cannot be declared:
261
+ // a pattern matches unboundedly many names, so there is no list to emit. Those
262
+ // tags still resolve at build time; declare them by hand if the editor needs them.
263
+ `;
264
+ const source = `// GENERATED by ${generator}, do not edit.
265
+ //
266
+ // The components \`resolve\` supplies without an import. This describes what the
267
+ // compiler already does; it does not enable it.
268
+ ` + note + patternNote + (imports.length > 0 ? `
269
+ ${imports.join("\n")}
270
+ ` : "\n") + `
271
+ declare global {
272
+ ${[...lines, ...intrinsicLines].join("\n")}
273
+ }
274
+ `;
275
+ return { source, declared, shadowedByDom, unavailable, patternRules };
276
+ }
277
+
278
+ // src/resolve/write-globals.ts
279
+ var GENERATED_MARKER = "GENERATED by @fluixi/compiler";
280
+ var DEFAULT_GLOBALS_PATH = "fluixi.d.ts";
281
+ function coveredByInclude(root, target) {
282
+ let config;
283
+ try {
284
+ const raw = (0, import_node_fs.readFileSync)((0, import_node_path.resolve)(root, "tsconfig.json"), "utf8");
285
+ config = JSON.parse(raw.replace(/^\s*\/\/.*$/gm, ""));
286
+ } catch {
287
+ return void 0;
288
+ }
289
+ if (config.extends !== void 0) return void 0;
290
+ if (!Array.isArray(config.include)) return true;
291
+ const relative2 = relativePosix(root, target);
292
+ return config.include.some((entry) => {
293
+ if (typeof entry !== "string") return false;
294
+ const pattern = entry.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*\*\//g, "(?:.*/)?").replace(/\*/g, "[^/]*");
295
+ return new RegExp(`^${pattern}(?:/.*)?$`).test(relative2);
296
+ });
297
+ }
298
+ function relativePosix(from, to) {
299
+ return (0, import_node_path.relative)(from, to).split(import_node_path.sep).join("/");
300
+ }
301
+ function forTypeScript(module2, outDir, root) {
302
+ if (!module2.startsWith("/")) return module2;
303
+ const absolute = (0, import_node_path.resolve)(root, module2.slice(1));
304
+ let rel = (0, import_node_path.relative)(outDir, absolute).split(import_node_path.sep).join("/");
305
+ if (!rel.startsWith(".")) rel = `./${rel}`;
306
+ return rel.replace(/\.(tsx|ts|jsx|mts|cts)$/, ".js");
307
+ }
308
+ function projectDependencies(root) {
309
+ try {
310
+ const manifest = JSON.parse((0, import_node_fs.readFileSync)((0, import_node_path.resolve)(root, "package.json"), "utf8"));
311
+ return [
312
+ ...Object.keys(manifest.dependencies ?? {}),
313
+ ...Object.keys(manifest.devDependencies ?? {}),
314
+ ...Object.keys(manifest.peerDependencies ?? {})
315
+ ];
316
+ } catch {
317
+ return void 0;
318
+ }
319
+ }
320
+ function patternCandidates(rules, root) {
321
+ const out = [];
322
+ for (const rule of rules) {
323
+ if (!("match" in rule) || !rule.module.startsWith("/")) continue;
324
+ const dir = (0, import_node_path.dirname)(rule.module);
325
+ const file = (0, import_node_path.basename)(rule.module);
326
+ const group = file.match(/\$\d+/);
327
+ if (dir.includes("$") || !group || file.indexOf("$", group.index + 1) !== -1) continue;
328
+ const before = file.slice(0, group.index);
329
+ const after = file.slice(group.index + group[0].length);
330
+ let entries;
331
+ try {
332
+ entries = (0, import_node_fs.readdirSync)((0, import_node_path.resolve)(root, dir.slice(1)));
333
+ } catch {
334
+ continue;
335
+ }
336
+ for (const entry of entries) {
337
+ if (entry.length > before.length + after.length && entry.startsWith(before) && entry.endsWith(after)) {
338
+ out.push(entry.slice(before.length, entry.length - after.length));
339
+ }
340
+ }
341
+ }
342
+ return out;
343
+ }
344
+ function writeComponentGlobals(options, root) {
345
+ if (options.globals === false) return { status: "skipped", reason: "disabled" };
346
+ const rules = options.resolve ?? [];
347
+ const target = (0, import_node_path.resolve)(root, options.globals ?? DEFAULT_GLOBALS_PATH);
348
+ let existing;
349
+ try {
350
+ existing = (0, import_node_fs.readFileSync)(target, "utf8");
351
+ } catch {
352
+ existing = void 0;
353
+ }
354
+ if (existing !== void 0 && !existing.includes(GENERATED_MARKER)) {
355
+ return { status: "skipped", reason: "foreign-file", path: target };
356
+ }
357
+ const { source, declared } = componentGlobals(rules, {
358
+ available: projectDependencies(root),
359
+ candidates: patternCandidates(rules, root),
360
+ specifier: (module2) => forTypeScript(module2, (0, import_node_path.dirname)(target), root)
361
+ });
362
+ if (existing === source) {
363
+ return {
364
+ status: "unchanged",
365
+ path: target,
366
+ declared: declared.length,
367
+ warning: warnIfUnreachable(root, target)
368
+ };
369
+ }
370
+ (0, import_node_fs.mkdirSync)((0, import_node_path.dirname)(target), { recursive: true });
371
+ (0, import_node_fs.writeFileSync)(target, source);
372
+ return {
373
+ status: "written",
374
+ path: target,
375
+ declared: declared.length,
376
+ warning: warnIfUnreachable(root, target)
377
+ };
378
+ }
379
+ function warnIfUnreachable(root, target) {
380
+ if (coveredByInclude(root, target) !== false) return void 0;
381
+ const relative2 = relativePosix(root, target);
382
+ return `[fluixi] ${relative2} is not covered by "include" in tsconfig.json, so TypeScript will ignore it and every resolved component stays "Cannot find name". Add "${relative2}" to "include".`;
383
+ }
@@ -0,0 +1,36 @@
1
+ import type { ComponentResolverRule } from './component-resolver.cjs';
2
+ export declare const DEFAULT_GLOBALS_PATH = "fluixi.d.ts";
3
+ export interface WriteGlobalsOptions {
4
+ resolve?: readonly ComponentResolverRule[];
5
+ globals?: string | false;
6
+ }
7
+ export type WriteGlobalsOutcome = ({
8
+ status: 'written';
9
+ path: string;
10
+ declared: number;
11
+ } | {
12
+ status: 'unchanged';
13
+ path: string;
14
+ declared: number;
15
+ } | {
16
+ status: 'skipped';
17
+ reason: 'disabled' | 'foreign-file';
18
+ path?: string;
19
+ }) & {
20
+ /**
21
+ * Set when the file was written somewhere TypeScript will not read it.
22
+ *
23
+ * Worth surfacing because the symptom is indistinguishable from the generator never
24
+ * having run: every resolved tag is still `Cannot find name`, and the file sitting
25
+ * right there makes it look like it should have worked.
26
+ */
27
+ warning?: string;
28
+ };
29
+ /**
30
+ * Names from the files a pattern rule points at: `/src/components/$1.tsx` lists
31
+ * `src/components` and offers each `X` for `X.tsx`. Only a project path with the group in
32
+ * the file name; the resolver still decides whether a name matches.
33
+ */
34
+ export declare function patternCandidates(rules: readonly ComponentResolverRule[], root: string): string[];
35
+ /** Generate and write the declarations for `root`, returning what was done. */
36
+ export declare function writeComponentGlobals(options: WriteGlobalsOptions, root: string): WriteGlobalsOutcome;
@@ -0,0 +1,37 @@
1
+ import type { ComponentResolverRule } from './component-resolver.js';
2
+ export declare const DEFAULT_GLOBALS_PATH = "fluixi.d.ts";
3
+ export interface WriteGlobalsOptions {
4
+ resolve?: readonly ComponentResolverRule[];
5
+ globals?: string | false;
6
+ }
7
+ export type WriteGlobalsOutcome = ({
8
+ status: 'written';
9
+ path: string;
10
+ declared: number;
11
+ } | {
12
+ status: 'unchanged';
13
+ path: string;
14
+ declared: number;
15
+ } | {
16
+ status: 'skipped';
17
+ reason: 'disabled' | 'foreign-file';
18
+ path?: string;
19
+ }) & {
20
+ /**
21
+ * Set when the file was written somewhere TypeScript will not read it.
22
+ *
23
+ * Worth surfacing because the symptom is indistinguishable from the generator never
24
+ * having run: every resolved tag is still `Cannot find name`, and the file sitting
25
+ * right there makes it look like it should have worked.
26
+ */
27
+ warning?: string;
28
+ };
29
+ /**
30
+ * Names from the files a pattern rule points at: `/src/components/$1.tsx` lists
31
+ * `src/components` and offers each `X` for `X.tsx`. Only a project path with the group in
32
+ * the file name; the resolver still decides whether a name matches.
33
+ */
34
+ export declare function patternCandidates(rules: readonly ComponentResolverRule[], root: string): string[];
35
+ /** Generate and write the declarations for `root`, returning what was done. */
36
+ export declare function writeComponentGlobals(options: WriteGlobalsOptions, root: string): WriteGlobalsOutcome;
37
+ //# sourceMappingURL=write-globals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-globals.d.ts","sourceRoot":"","sources":["../../src/resolve/write-globals.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAKrE,eAAO,MAAM,oBAAoB,gBAAgB,CAAC;AAElD,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC3C,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CAC1B;AAED,MAAM,MAAM,mBAAmB,GAAG,CAC9B;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,UAAU,GAAG,cAAc,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAC5E,GAAG;IACF;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AA2EF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,qBAAqB,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAuBjG;AAED,+EAA+E;AAC/E,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,mBAAmB,EAC5B,IAAI,EAAE,MAAM,GACX,mBAAmB,CAyCrB"}