plgg-bundle 0.0.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 (235) hide show
  1. package/README.md +68 -0
  2. package/bin/appAliasHook.mjs +89 -0
  3. package/bin/hook.mjs +94 -0
  4. package/bin/plgg-bundle.mjs +16 -0
  5. package/dist/Dev/fixtures/devPoc.spec.d.ts +2 -0
  6. package/dist/Dev/fixtures/devPoc.spec.d.ts.map +1 -0
  7. package/dist/Dev/fixtures/devPoc.spec.js +145 -0
  8. package/dist/Dev/fixtures/devPoc.spec.js.map +1 -0
  9. package/dist/Dev/model/Fetch.d.ts +20 -0
  10. package/dist/Dev/model/Fetch.d.ts.map +1 -0
  11. package/dist/Dev/model/Fetch.js +8 -0
  12. package/dist/Dev/model/Fetch.js.map +1 -0
  13. package/dist/Dev/model/ModuleGraph.d.ts +27 -0
  14. package/dist/Dev/model/ModuleGraph.d.ts.map +1 -0
  15. package/dist/Dev/model/ModuleGraph.js +2 -0
  16. package/dist/Dev/model/ModuleGraph.js.map +1 -0
  17. package/dist/Dev/model/Protocol.d.ts +22 -0
  18. package/dist/Dev/model/Protocol.d.ts.map +1 -0
  19. package/dist/Dev/model/Protocol.js +31 -0
  20. package/dist/Dev/model/Protocol.js.map +1 -0
  21. package/dist/Dev/node/devServer.d.ts +21 -0
  22. package/dist/Dev/node/devServer.d.ts.map +1 -0
  23. package/dist/Dev/node/devServer.js +298 -0
  24. package/dist/Dev/node/devServer.js.map +1 -0
  25. package/dist/Dev/node/httpAdapter.d.ts +19 -0
  26. package/dist/Dev/node/httpAdapter.d.ts.map +1 -0
  27. package/dist/Dev/node/httpAdapter.js +76 -0
  28. package/dist/Dev/node/httpAdapter.js.map +1 -0
  29. package/dist/Dev/node/scanGraph.d.ts +21 -0
  30. package/dist/Dev/node/scanGraph.d.ts.map +1 -0
  31. package/dist/Dev/node/scanGraph.js +145 -0
  32. package/dist/Dev/node/scanGraph.js.map +1 -0
  33. package/dist/Dev/node/watch.d.ts +10 -0
  34. package/dist/Dev/node/watch.d.ts.map +1 -0
  35. package/dist/Dev/node/watch.js +44 -0
  36. package/dist/Dev/node/watch.js.map +1 -0
  37. package/dist/Dev/usecase/allowedHost.d.ts +16 -0
  38. package/dist/Dev/usecase/allowedHost.d.ts.map +1 -0
  39. package/dist/Dev/usecase/allowedHost.js +33 -0
  40. package/dist/Dev/usecase/allowedHost.js.map +1 -0
  41. package/dist/Dev/usecase/allowedHost.spec.d.ts +2 -0
  42. package/dist/Dev/usecase/allowedHost.spec.d.ts.map +1 -0
  43. package/dist/Dev/usecase/allowedHost.spec.js +13 -0
  44. package/dist/Dev/usecase/allowedHost.spec.js.map +1 -0
  45. package/dist/Dev/usecase/buildGraph.d.ts +12 -0
  46. package/dist/Dev/usecase/buildGraph.d.ts.map +1 -0
  47. package/dist/Dev/usecase/buildGraph.js +24 -0
  48. package/dist/Dev/usecase/buildGraph.js.map +1 -0
  49. package/dist/Dev/usecase/buildGraph.spec.d.ts +2 -0
  50. package/dist/Dev/usecase/buildGraph.spec.d.ts.map +1 -0
  51. package/dist/Dev/usecase/buildGraph.spec.js +16 -0
  52. package/dist/Dev/usecase/buildGraph.spec.js.map +1 -0
  53. package/dist/Dev/usecase/decorateDevHtml.d.ts +12 -0
  54. package/dist/Dev/usecase/decorateDevHtml.d.ts.map +1 -0
  55. package/dist/Dev/usecase/decorateDevHtml.js +15 -0
  56. package/dist/Dev/usecase/decorateDevHtml.js.map +1 -0
  57. package/dist/Dev/usecase/decorateDevHtml.spec.d.ts +2 -0
  58. package/dist/Dev/usecase/decorateDevHtml.spec.d.ts.map +1 -0
  59. package/dist/Dev/usecase/decorateDevHtml.spec.js +19 -0
  60. package/dist/Dev/usecase/decorateDevHtml.spec.js.map +1 -0
  61. package/dist/Dev/usecase/invalidate.d.ts +17 -0
  62. package/dist/Dev/usecase/invalidate.d.ts.map +1 -0
  63. package/dist/Dev/usecase/invalidate.js +57 -0
  64. package/dist/Dev/usecase/invalidate.js.map +1 -0
  65. package/dist/Dev/usecase/invalidate.spec.d.ts +2 -0
  66. package/dist/Dev/usecase/invalidate.spec.d.ts.map +1 -0
  67. package/dist/Dev/usecase/invalidate.spec.js +64 -0
  68. package/dist/Dev/usecase/invalidate.spec.js.map +1 -0
  69. package/dist/Dev/usecase/parseImports.d.ts +24 -0
  70. package/dist/Dev/usecase/parseImports.d.ts.map +1 -0
  71. package/dist/Dev/usecase/parseImports.js +40 -0
  72. package/dist/Dev/usecase/parseImports.js.map +1 -0
  73. package/dist/Dev/usecase/parseImports.spec.d.ts +2 -0
  74. package/dist/Dev/usecase/parseImports.spec.d.ts.map +1 -0
  75. package/dist/Dev/usecase/parseImports.spec.js +24 -0
  76. package/dist/Dev/usecase/parseImports.spec.js.map +1 -0
  77. package/dist/Dev/usecase/reloadDecision.d.ts +20 -0
  78. package/dist/Dev/usecase/reloadDecision.d.ts.map +1 -0
  79. package/dist/Dev/usecase/reloadDecision.js +52 -0
  80. package/dist/Dev/usecase/reloadDecision.js.map +1 -0
  81. package/dist/Dev/usecase/reloadDecision.spec.d.ts +2 -0
  82. package/dist/Dev/usecase/reloadDecision.spec.d.ts.map +1 -0
  83. package/dist/Dev/usecase/reloadDecision.spec.js +17 -0
  84. package/dist/Dev/usecase/reloadDecision.spec.js.map +1 -0
  85. package/dist/domain/model/BundleConfig.d.ts +136 -0
  86. package/dist/domain/model/BundleConfig.d.ts.map +1 -0
  87. package/dist/domain/model/BundleConfig.js +18 -0
  88. package/dist/domain/model/BundleConfig.js.map +1 -0
  89. package/dist/domain/model/BundleConfig.spec.d.ts +2 -0
  90. package/dist/domain/model/BundleConfig.spec.d.ts.map +1 -0
  91. package/dist/domain/model/BundleConfig.spec.js +8 -0
  92. package/dist/domain/model/BundleConfig.spec.js.map +1 -0
  93. package/dist/domain/usecase/asBundleConfig.d.ts +17 -0
  94. package/dist/domain/usecase/asBundleConfig.d.ts.map +1 -0
  95. package/dist/domain/usecase/asBundleConfig.js +179 -0
  96. package/dist/domain/usecase/asBundleConfig.js.map +1 -0
  97. package/dist/domain/usecase/asBundleConfig.spec.d.ts +2 -0
  98. package/dist/domain/usecase/asBundleConfig.spec.d.ts.map +1 -0
  99. package/dist/domain/usecase/asBundleConfig.spec.js +119 -0
  100. package/dist/domain/usecase/asBundleConfig.spec.js.map +1 -0
  101. package/dist/domain/usecase/build.d.ts +14 -0
  102. package/dist/domain/usecase/build.d.ts.map +1 -0
  103. package/dist/domain/usecase/build.js +177 -0
  104. package/dist/domain/usecase/build.js.map +1 -0
  105. package/dist/domain/usecase/collectModules.d.ts +53 -0
  106. package/dist/domain/usecase/collectModules.d.ts.map +1 -0
  107. package/dist/domain/usecase/collectModules.js +118 -0
  108. package/dist/domain/usecase/collectModules.js.map +1 -0
  109. package/dist/domain/usecase/deriveExternal.d.ts +25 -0
  110. package/dist/domain/usecase/deriveExternal.d.ts.map +1 -0
  111. package/dist/domain/usecase/deriveExternal.js +79 -0
  112. package/dist/domain/usecase/deriveExternal.js.map +1 -0
  113. package/dist/domain/usecase/deriveExternal.spec.d.ts +2 -0
  114. package/dist/domain/usecase/deriveExternal.spec.d.ts.map +1 -0
  115. package/dist/domain/usecase/deriveExternal.spec.js +56 -0
  116. package/dist/domain/usecase/deriveExternal.spec.js.map +1 -0
  117. package/dist/domain/usecase/discoverWorkspace.d.ts +27 -0
  118. package/dist/domain/usecase/discoverWorkspace.d.ts.map +1 -0
  119. package/dist/domain/usecase/discoverWorkspace.js +116 -0
  120. package/dist/domain/usecase/discoverWorkspace.js.map +1 -0
  121. package/dist/domain/usecase/discoverWorkspace.spec.d.ts +2 -0
  122. package/dist/domain/usecase/discoverWorkspace.spec.d.ts.map +1 -0
  123. package/dist/domain/usecase/discoverWorkspace.spec.js +23 -0
  124. package/dist/domain/usecase/discoverWorkspace.spec.js.map +1 -0
  125. package/dist/domain/usecase/emitBundle.d.ts +43 -0
  126. package/dist/domain/usecase/emitBundle.d.ts.map +1 -0
  127. package/dist/domain/usecase/emitBundle.js +157 -0
  128. package/dist/domain/usecase/emitBundle.js.map +1 -0
  129. package/dist/domain/usecase/emitBundle.spec.d.ts +2 -0
  130. package/dist/domain/usecase/emitBundle.spec.d.ts.map +1 -0
  131. package/dist/domain/usecase/emitBundle.spec.js +80 -0
  132. package/dist/domain/usecase/emitBundle.spec.js.map +1 -0
  133. package/dist/domain/usecase/emitDts.d.ts +32 -0
  134. package/dist/domain/usecase/emitDts.d.ts.map +1 -0
  135. package/dist/domain/usecase/emitDts.js +99 -0
  136. package/dist/domain/usecase/emitDts.js.map +1 -0
  137. package/dist/domain/usecase/isExternal.d.ts +12 -0
  138. package/dist/domain/usecase/isExternal.d.ts.map +1 -0
  139. package/dist/domain/usecase/isExternal.js +16 -0
  140. package/dist/domain/usecase/isExternal.js.map +1 -0
  141. package/dist/domain/usecase/isExternal.spec.d.ts +2 -0
  142. package/dist/domain/usecase/isExternal.spec.d.ts.map +1 -0
  143. package/dist/domain/usecase/isExternal.spec.js +16 -0
  144. package/dist/domain/usecase/isExternal.spec.js.map +1 -0
  145. package/dist/domain/usecase/resolveSpecifier.d.ts +35 -0
  146. package/dist/domain/usecase/resolveSpecifier.d.ts.map +1 -0
  147. package/dist/domain/usecase/resolveSpecifier.js +83 -0
  148. package/dist/domain/usecase/resolveSpecifier.js.map +1 -0
  149. package/dist/domain/usecase/resolveSpecifier.spec.d.ts +2 -0
  150. package/dist/domain/usecase/resolveSpecifier.spec.d.ts.map +1 -0
  151. package/dist/domain/usecase/resolveSpecifier.spec.js +44 -0
  152. package/dist/domain/usecase/resolveSpecifier.spec.js.map +1 -0
  153. package/dist/domain/usecase/resolveWorkspaceSpecifier.d.ts +29 -0
  154. package/dist/domain/usecase/resolveWorkspaceSpecifier.d.ts.map +1 -0
  155. package/dist/domain/usecase/resolveWorkspaceSpecifier.js +89 -0
  156. package/dist/domain/usecase/resolveWorkspaceSpecifier.js.map +1 -0
  157. package/dist/domain/usecase/resolveWorkspaceSpecifier.spec.d.ts +2 -0
  158. package/dist/domain/usecase/resolveWorkspaceSpecifier.spec.d.ts.map +1 -0
  159. package/dist/domain/usecase/resolveWorkspaceSpecifier.spec.js +27 -0
  160. package/dist/domain/usecase/resolveWorkspaceSpecifier.spec.js.map +1 -0
  161. package/dist/domain/usecase/rewriteDtsAliases.d.ts +25 -0
  162. package/dist/domain/usecase/rewriteDtsAliases.d.ts.map +1 -0
  163. package/dist/domain/usecase/rewriteDtsAliases.js +71 -0
  164. package/dist/domain/usecase/rewriteDtsAliases.js.map +1 -0
  165. package/dist/domain/usecase/rewriteDtsAliases.spec.d.ts +2 -0
  166. package/dist/domain/usecase/rewriteDtsAliases.spec.d.ts.map +1 -0
  167. package/dist/domain/usecase/rewriteDtsAliases.spec.js +35 -0
  168. package/dist/domain/usecase/rewriteDtsAliases.spec.js.map +1 -0
  169. package/dist/entrypoints/cli.d.ts +2 -0
  170. package/dist/entrypoints/cli.d.ts.map +1 -0
  171. package/dist/entrypoints/cli.js +79 -0
  172. package/dist/entrypoints/cli.js.map +1 -0
  173. package/dist/index.d.ts +21 -0
  174. package/dist/index.d.ts.map +1 -0
  175. package/dist/index.js +28 -0
  176. package/dist/index.js.map +1 -0
  177. package/dist/vendors/runner.d.ts +20 -0
  178. package/dist/vendors/runner.d.ts.map +1 -0
  179. package/dist/vendors/runner.js +60 -0
  180. package/dist/vendors/runner.js.map +1 -0
  181. package/dist/vendors/runner.spec.d.ts +2 -0
  182. package/dist/vendors/runner.spec.d.ts.map +1 -0
  183. package/dist/vendors/runner.spec.js +20 -0
  184. package/dist/vendors/runner.spec.js.map +1 -0
  185. package/dist/vendors/transpiler.d.ts +19 -0
  186. package/dist/vendors/transpiler.d.ts.map +1 -0
  187. package/dist/vendors/transpiler.js +42 -0
  188. package/dist/vendors/transpiler.js.map +1 -0
  189. package/package.json +31 -0
  190. package/src/Dev/fixtures/devPoc.spec.ts +235 -0
  191. package/src/Dev/model/Fetch.ts +31 -0
  192. package/src/Dev/model/ModuleGraph.ts +30 -0
  193. package/src/Dev/model/Protocol.ts +35 -0
  194. package/src/Dev/node/devServer.ts +503 -0
  195. package/src/Dev/node/httpAdapter.ts +162 -0
  196. package/src/Dev/node/scanGraph.ts +203 -0
  197. package/src/Dev/node/watch.ts +54 -0
  198. package/src/Dev/usecase/allowedHost.spec.ts +50 -0
  199. package/src/Dev/usecase/allowedHost.ts +39 -0
  200. package/src/Dev/usecase/buildGraph.spec.ts +30 -0
  201. package/src/Dev/usecase/buildGraph.ts +31 -0
  202. package/src/Dev/usecase/decorateDevHtml.spec.ts +39 -0
  203. package/src/Dev/usecase/decorateDevHtml.ts +21 -0
  204. package/src/Dev/usecase/invalidate.spec.ts +88 -0
  205. package/src/Dev/usecase/invalidate.ts +67 -0
  206. package/src/Dev/usecase/parseImports.spec.ts +58 -0
  207. package/src/Dev/usecase/parseImports.ts +50 -0
  208. package/src/Dev/usecase/reloadDecision.spec.ts +50 -0
  209. package/src/Dev/usecase/reloadDecision.ts +65 -0
  210. package/src/domain/model/BundleConfig.spec.ts +35 -0
  211. package/src/domain/model/BundleConfig.ts +162 -0
  212. package/src/domain/usecase/asBundleConfig.spec.ts +230 -0
  213. package/src/domain/usecase/asBundleConfig.ts +257 -0
  214. package/src/domain/usecase/build.ts +259 -0
  215. package/src/domain/usecase/collectModules.ts +226 -0
  216. package/src/domain/usecase/deriveExternal.spec.ts +125 -0
  217. package/src/domain/usecase/deriveExternal.ts +108 -0
  218. package/src/domain/usecase/discoverWorkspace.spec.ts +63 -0
  219. package/src/domain/usecase/discoverWorkspace.ts +183 -0
  220. package/src/domain/usecase/emitBundle.spec.ts +162 -0
  221. package/src/domain/usecase/emitBundle.ts +215 -0
  222. package/src/domain/usecase/emitDts.ts +156 -0
  223. package/src/domain/usecase/isExternal.spec.ts +53 -0
  224. package/src/domain/usecase/isExternal.ts +20 -0
  225. package/src/domain/usecase/resolveSpecifier.spec.ts +112 -0
  226. package/src/domain/usecase/resolveSpecifier.ts +127 -0
  227. package/src/domain/usecase/resolveWorkspaceSpecifier.spec.ts +79 -0
  228. package/src/domain/usecase/resolveWorkspaceSpecifier.ts +120 -0
  229. package/src/domain/usecase/rewriteDtsAliases.spec.ts +123 -0
  230. package/src/domain/usecase/rewriteDtsAliases.ts +133 -0
  231. package/src/entrypoints/cli.ts +105 -0
  232. package/src/index.ts +28 -0
  233. package/src/vendors/runner.spec.ts +50 -0
  234. package/src/vendors/runner.ts +78 -0
  235. package/src/vendors/transpiler.ts +48 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../src/Dev/node/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAkB,MAAM,SAAS,CAAC;AAEhD,yDAAyD;AACzD,2DAA2D;AAC3D,sDAAsD;AACtD,oDAAoD;AACpD,0DAA0D;AAC1D,+CAA+C;AAE/C,sCAAsC;AACtC,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,KAA4B,EAC5B,QAAoC,EACV,EAAE;IAC5B,wDAAwD;IACxD,oBAAoB;IACpB,IAAI,OAES,CAAC;IACd,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,MAAM,IAAI,GAAG,CAAC,QAAgB,EAAQ,EAAE;QACtC,MAAM,GAAG,QAAQ,CAAC;QAClB,YAAY,CAAC,OAAO,CAAC,CAAC;QACtB,OAAO,GAAG,UAAU,CAAC,GAAS,EAAE;YAC9B,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnB,CAAC,EAAE,WAAW,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC5B,IAAI,CAAC;YACH,OAAO;gBACL,KAAK,CACH,IAAI,EACJ,EAAE,SAAS,EAAE,IAAI,EAAE,EACnB,CAAC,MAAM,EAAE,QAAQ,EAAQ,EAAE;oBACzB,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;wBACtB,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACjB,CAAC;gBACH,CAAC,CACF;aACF,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * The bare host name (any `:port` suffix stripped) of a
3
+ * `Host`-header value. A value with no colon is returned
4
+ * unchanged. `indexOf`/`slice` (not `split(":")[0]`) so
5
+ * there is no unreachable `undefined` case to branch on.
6
+ */
7
+ export declare const hostName: (host: string) => string;
8
+ /**
9
+ * The Host allowlist check (data-last): loopback plus the
10
+ * config-supplied `allowedHosts`. Reproduces the tunnel
11
+ * safety plggpress's dev server gave — the guide adds its
12
+ * `*.qmu.dev` tunnel host so the Cloudflare tunnel is
13
+ * accepted while arbitrary Host headers are refused.
14
+ */
15
+ export declare const isAllowedHost: (allowedHosts: ReadonlyArray<string>) => (host: string) => boolean;
16
+ //# sourceMappingURL=allowedHost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allowedHost.d.ts","sourceRoot":"","sources":["../../../src/Dev/usecase/allowedHost.ts"],"names":[],"mappings":"AAUA;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,GACnB,MAAM,MAAM,KACX,MAKF,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,GACvB,cAAc,aAAa,CAAC,MAAM,CAAC,MACnC,MAAM,MAAM,KAAG,OAIY,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Hosts the dev server always accepts, on top of the
3
+ * config-supplied allowlist. Loopback is implicit so local
4
+ * development needs no configuration.
5
+ */
6
+ const DEFAULT_HOSTS = [
7
+ "localhost",
8
+ "127.0.0.1",
9
+ ];
10
+ /**
11
+ * The bare host name (any `:port` suffix stripped) of a
12
+ * `Host`-header value. A value with no colon is returned
13
+ * unchanged. `indexOf`/`slice` (not `split(":")[0]`) so
14
+ * there is no unreachable `undefined` case to branch on.
15
+ */
16
+ export const hostName = (host) => {
17
+ const colon = host.indexOf(":");
18
+ return colon === -1
19
+ ? host
20
+ : host.slice(0, colon);
21
+ };
22
+ /**
23
+ * The Host allowlist check (data-last): loopback plus the
24
+ * config-supplied `allowedHosts`. Reproduces the tunnel
25
+ * safety plggpress's dev server gave — the guide adds its
26
+ * `*.qmu.dev` tunnel host so the Cloudflare tunnel is
27
+ * accepted while arbitrary Host headers are refused.
28
+ */
29
+ export const isAllowedHost = (allowedHosts) => (host) => [
30
+ ...DEFAULT_HOSTS,
31
+ ...allowedHosts,
32
+ ].includes(hostName(host));
33
+ //# sourceMappingURL=allowedHost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allowedHost.js","sourceRoot":"","sources":["../../../src/Dev/usecase/allowedHost.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,aAAa,GAA0B;IAC3C,WAAW;IACX,WAAW;CACZ,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,IAAY,EACJ,EAAE;IACV,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,OAAO,KAAK,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAC3B,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GACxB,CAAC,YAAmC,EAAE,EAAE,CACxC,CAAC,IAAY,EAAW,EAAE,CACxB;IACE,GAAG,aAAa;IAChB,GAAG,YAAY;CAChB,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=allowedHost.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allowedHost.spec.d.ts","sourceRoot":"","sources":["../../../src/Dev/usecase/allowedHost.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import { test, check, all, toBe, } from "plgg-test";
2
+ import { hostName, isAllowedHost, } from "plgg-bundle/Dev/usecase/allowedHost";
3
+ test("hostName strips a :port suffix", () => all([
4
+ check(hostName("localhost:5181"), toBe("localhost")),
5
+ check(hostName("plgg-guide.qmu.dev"), toBe("plgg-guide.qmu.dev")),
6
+ ]));
7
+ test("isAllowedHost accepts loopback by default", () => all([
8
+ check(isAllowedHost([])("localhost:5181"), toBe(true)),
9
+ check(isAllowedHost([])("127.0.0.1:5181"), toBe(true)),
10
+ ]));
11
+ test("isAllowedHost accepts a config-supplied tunnel host", () => check(isAllowedHost(["plgg-guide.qmu.dev"])("plgg-guide.qmu.dev"), toBe(true)));
12
+ test("isAllowedHost refuses an unlisted host", () => check(isAllowedHost(["plgg-guide.qmu.dev"])("evil.example.com"), toBe(false)));
13
+ //# sourceMappingURL=allowedHost.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allowedHost.spec.js","sourceRoot":"","sources":["../../../src/Dev/usecase/allowedHost.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,KAAK,EACL,GAAG,EACH,IAAI,GACL,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,QAAQ,EACR,aAAa,GACd,MAAM,qCAAqC,CAAC;AAE7C,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE,CAC1C,GAAG,CAAC;IACF,KAAK,CACH,QAAQ,CAAC,gBAAgB,CAAC,EAC1B,IAAI,CAAC,WAAW,CAAC,CAClB;IACD,KAAK,CACH,QAAQ,CAAC,oBAAoB,CAAC,EAC9B,IAAI,CAAC,oBAAoB,CAAC,CAC3B;CACF,CAAC,CAAC,CAAC;AAEN,IAAI,CAAC,2CAA2C,EAAE,GAAG,EAAE,CACrD,GAAG,CAAC;IACF,KAAK,CACH,aAAa,CAAC,EAAE,CAAC,CAAC,gBAAgB,CAAC,EACnC,IAAI,CAAC,IAAI,CAAC,CACX;IACD,KAAK,CACH,aAAa,CAAC,EAAE,CAAC,CAAC,gBAAgB,CAAC,EACnC,IAAI,CAAC,IAAI,CAAC,CACX;CACF,CAAC,CAAC,CAAC;AAEN,IAAI,CAAC,qDAAqD,EAAE,GAAG,EAAE,CAC/D,KAAK,CACH,aAAa,CAAC,CAAC,oBAAoB,CAAC,CAAC,CACnC,oBAAoB,CACrB,EACD,IAAI,CAAC,IAAI,CAAC,CACX,CAAC,CAAC;AAEL,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE,CAClD,KAAK,CACH,aAAa,CAAC,CAAC,oBAAoB,CAAC,CAAC,CACnC,kBAAkB,CACnB,EACD,IAAI,CAAC,KAAK,CAAC,CACZ,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type Edge, type ModuleGraph } from "plgg-bundle/Dev/model/ModuleGraph";
2
+ /**
3
+ * Fold a flat list of resolved import {@link Edge}s into a
4
+ * {@link ModuleGraph} (file → the local files it imports).
5
+ * Pure: the adapter does the effectful scan+resolve and
6
+ * hands the edges here. A file that imports nothing local
7
+ * still appears as a node (empty array) as soon as it is
8
+ * an edge's `from`, so the reload decision can tell "known
9
+ * module" from "unrelated file".
10
+ */
11
+ export declare const buildGraph: (edges: ReadonlyArray<Edge>) => ModuleGraph;
12
+ //# sourceMappingURL=buildGraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildGraph.d.ts","sourceRoot":"","sources":["../../../src/Dev/usecase/buildGraph.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,IAAI,EACT,KAAK,WAAW,EACjB,MAAM,mCAAmC,CAAC;AAE3C;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,GACrB,OAAO,aAAa,CAAC,IAAI,CAAC,KACzB,WAcF,CAAC"}
@@ -0,0 +1,24 @@
1
+ import {} from "plgg-bundle/Dev/model/ModuleGraph";
2
+ /**
3
+ * Fold a flat list of resolved import {@link Edge}s into a
4
+ * {@link ModuleGraph} (file → the local files it imports).
5
+ * Pure: the adapter does the effectful scan+resolve and
6
+ * hands the edges here. A file that imports nothing local
7
+ * still appears as a node (empty array) as soon as it is
8
+ * an edge's `from`, so the reload decision can tell "known
9
+ * module" from "unrelated file".
10
+ */
11
+ export const buildGraph = (edges) => {
12
+ const graph = new Map();
13
+ for (const { from, to } of edges) {
14
+ const existing = graph.get(from);
15
+ if (existing === undefined) {
16
+ graph.set(from, [to]);
17
+ }
18
+ else {
19
+ existing.push(to);
20
+ }
21
+ }
22
+ return graph;
23
+ };
24
+ //# sourceMappingURL=buildGraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildGraph.js","sourceRoot":"","sources":["../../../src/Dev/usecase/buildGraph.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,MAAM,mCAAmC,CAAC;AAE3C;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,KAA0B,EACb,EAAE;IACf,MAAM,KAAK,GAAG,IAAI,GAAG,EAGlB,CAAC;IACJ,KAAK,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,KAAK,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=buildGraph.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildGraph.spec.d.ts","sourceRoot":"","sources":["../../../src/Dev/usecase/buildGraph.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import { test, check, all, toBe, toEqual, } from "plgg-test";
2
+ import { buildGraph } from "plgg-bundle/Dev/usecase/buildGraph";
3
+ test("buildGraph folds edges into a file → imports map", () => {
4
+ const graph = buildGraph([
5
+ { from: "/a.ts", to: "/b.ts" },
6
+ { from: "/a.ts", to: "/c.ts" },
7
+ { from: "/b.ts", to: "/c.ts" },
8
+ ]);
9
+ return all([
10
+ check(graph.size, toBe(2)),
11
+ check(graph.get("/a.ts"), toEqual(["/b.ts", "/c.ts"])),
12
+ check(graph.get("/b.ts"), toEqual(["/c.ts"])),
13
+ ]);
14
+ });
15
+ test("buildGraph yields an empty graph for no edges", () => check(buildGraph([]).size, toBe(0)));
16
+ //# sourceMappingURL=buildGraph.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildGraph.spec.js","sourceRoot":"","sources":["../../../src/Dev/usecase/buildGraph.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,KAAK,EACL,GAAG,EACH,IAAI,EACJ,OAAO,GACR,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAEhE,IAAI,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAC5D,MAAM,KAAK,GAAG,UAAU,CAAC;QACvB,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE;QAC9B,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE;QAC9B,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE;KAC/B,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;QACT,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1B,KAAK,CACH,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAClB,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAC5B;QACD,KAAK,CACH,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAClB,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CACnB;KACF,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+CAA+C,EAAE,GAAG,EAAE,CACzD,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * The DEV-ONLY HTML decoration: string-append the
3
+ * {@link LIVE_RELOAD_SCRIPT} just before `</body>` (or at
4
+ * the very end when the document has none). Pure string
5
+ * surgery on rendered HTML OUTPUT — never inside a typed
6
+ * render tree (which would escape the `<script>`), and
7
+ * never in a production build path. This is the plgg-free
8
+ * toolchain counterpart to plggpress's old
9
+ * `decorateDevHtml`.
10
+ */
11
+ export declare const decorateDevHtml: (html: string) => string;
12
+ //# sourceMappingURL=decorateDevHtml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorateDevHtml.d.ts","sourceRoot":"","sources":["../../../src/Dev/usecase/decorateDevHtml.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,GAC1B,MAAM,MAAM,KACX,MAM4B,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { LIVE_RELOAD_SCRIPT } from "plgg-bundle/Dev/model/Protocol";
2
+ /**
3
+ * The DEV-ONLY HTML decoration: string-append the
4
+ * {@link LIVE_RELOAD_SCRIPT} just before `</body>` (or at
5
+ * the very end when the document has none). Pure string
6
+ * surgery on rendered HTML OUTPUT — never inside a typed
7
+ * render tree (which would escape the `<script>`), and
8
+ * never in a production build path. This is the plgg-free
9
+ * toolchain counterpart to plggpress's old
10
+ * `decorateDevHtml`.
11
+ */
12
+ export const decorateDevHtml = (html) => html.includes("</body>")
13
+ ? html.replace("</body>", `${LIVE_RELOAD_SCRIPT}</body>`)
14
+ : html + LIVE_RELOAD_SCRIPT;
15
+ //# sourceMappingURL=decorateDevHtml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorateDevHtml.js","sourceRoot":"","sources":["../../../src/Dev/usecase/decorateDevHtml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,IAAY,EACJ,EAAE,CACV,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;IACtB,CAAC,CAAC,IAAI,CAAC,OAAO,CACV,SAAS,EACT,GAAG,kBAAkB,SAAS,CAC/B;IACH,CAAC,CAAC,IAAI,GAAG,kBAAkB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=decorateDevHtml.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorateDevHtml.spec.d.ts","sourceRoot":"","sources":["../../../src/Dev/usecase/decorateDevHtml.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ import { test, check, all, toBe, } from "plgg-test";
2
+ import { decorateDevHtml } from "plgg-bundle/Dev/usecase/decorateDevHtml";
3
+ import { LIVE_RELOAD_SCRIPT } from "plgg-bundle/Dev/model/Protocol";
4
+ test("decorateDevHtml injects the reload script before </body>", () => {
5
+ const out = decorateDevHtml("<html><body><h1>hi</h1></body></html>");
6
+ return all([
7
+ check(out.includes(LIVE_RELOAD_SCRIPT), toBe(true)),
8
+ check(out.indexOf(LIVE_RELOAD_SCRIPT) <
9
+ out.indexOf("</body>"), toBe(true)),
10
+ ]);
11
+ });
12
+ test("decorateDevHtml appends to a document with no </body>", () => {
13
+ const out = decorateDevHtml("<h1>bare</h1>");
14
+ return all([
15
+ check(out.startsWith("<h1>bare</h1>"), toBe(true)),
16
+ check(out.endsWith(LIVE_RELOAD_SCRIPT), toBe(true)),
17
+ ]);
18
+ });
19
+ //# sourceMappingURL=decorateDevHtml.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorateDevHtml.spec.js","sourceRoot":"","sources":["../../../src/Dev/usecase/decorateDevHtml.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,KAAK,EACL,GAAG,EACH,IAAI,GACL,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE;IACpE,MAAM,GAAG,GAAG,eAAe,CACzB,uCAAuC,CACxC,CAAC;IACF,OAAO,GAAG,CAAC;QACT,KAAK,CACH,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAChC,IAAI,CAAC,IAAI,CAAC,CACX;QACD,KAAK,CACH,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC;YAC7B,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,EACxB,IAAI,CAAC,IAAI,CAAC,CACX;KACF,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uDAAuD,EAAE,GAAG,EAAE;IACjE,MAAM,GAAG,GAAG,eAAe,CAAC,eAAe,CAAC,CAAC;IAC7C,OAAO,GAAG,CAAC;QACT,KAAK,CACH,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,EAC/B,IAAI,CAAC,IAAI,CAAC,CACX;QACD,KAAK,CACH,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAChC,IAAI,CAAC,IAAI,CAAC,CACX;KACF,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { type ModuleGraph } from "plgg-bundle/Dev/model/ModuleGraph";
2
+ /**
3
+ * The invalidation set for a changed file: the file itself
4
+ * plus every module that transitively imports it (its
5
+ * reverse-reachable closure in the {@link ModuleGraph}).
6
+ * These are exactly the modules a cache-busted re-import
7
+ * must re-evaluate for the edit to take effect — a change
8
+ * to a deep leaf `B` invalidates every `A` that imports it
9
+ * (directly or through a chain).
10
+ *
11
+ * Pure graph walk over reversed edges; cycle-safe via the
12
+ * visited set. This is the "transitive invalidation" the
13
+ * ticket flags as the hard part, isolated here as testable
14
+ * logic (A imports B; invalidate(B) ⊇ {A, B}).
15
+ */
16
+ export declare const transitiveImporters: (graph: ModuleGraph, changed: string) => ReadonlySet<string>;
17
+ //# sourceMappingURL=invalidate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invalidate.d.ts","sourceRoot":"","sources":["../../../src/Dev/usecase/invalidate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAErE;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,mBAAmB,GAC9B,OAAO,WAAW,EAClB,SAAS,MAAM,KACd,WAAW,CAAC,MAAM,CAsBpB,CAAC"}
@@ -0,0 +1,57 @@
1
+ import {} from "plgg-bundle/Dev/model/ModuleGraph";
2
+ /**
3
+ * The invalidation set for a changed file: the file itself
4
+ * plus every module that transitively imports it (its
5
+ * reverse-reachable closure in the {@link ModuleGraph}).
6
+ * These are exactly the modules a cache-busted re-import
7
+ * must re-evaluate for the edit to take effect — a change
8
+ * to a deep leaf `B` invalidates every `A` that imports it
9
+ * (directly or through a chain).
10
+ *
11
+ * Pure graph walk over reversed edges; cycle-safe via the
12
+ * visited set. This is the "transitive invalidation" the
13
+ * ticket flags as the hard part, isolated here as testable
14
+ * logic (A imports B; invalidate(B) ⊇ {A, B}).
15
+ */
16
+ export const transitiveImporters = (graph, changed) => {
17
+ const importers = reverseEdges(graph);
18
+ const seen = new Set([changed]);
19
+ // Breadth-first by layers: `for...of` over each frontier
20
+ // yields a `string` directly (no indexed access, no
21
+ // `.shift()` undefined case), keeping the walk `as`-free.
22
+ let frontier = [changed];
23
+ while (frontier.length > 0) {
24
+ const next = [];
25
+ for (const node of frontier) {
26
+ for (const importer of importers.get(node) ?? []) {
27
+ if (!seen.has(importer)) {
28
+ seen.add(importer);
29
+ next.push(importer);
30
+ }
31
+ }
32
+ }
33
+ frontier = next;
34
+ }
35
+ return seen;
36
+ };
37
+ /**
38
+ * Invert the graph: for each `from → to` forward edge,
39
+ * record `to → from` so a lookup answers "who imports
40
+ * this file". Local helper for {@link transitiveImporters}.
41
+ */
42
+ const reverseEdges = (graph) => {
43
+ const reversed = new Map();
44
+ for (const [from, tos] of graph) {
45
+ for (const to of tos) {
46
+ const existing = reversed.get(to);
47
+ if (existing === undefined) {
48
+ reversed.set(to, [from]);
49
+ }
50
+ else {
51
+ existing.push(from);
52
+ }
53
+ }
54
+ }
55
+ return reversed;
56
+ };
57
+ //# sourceMappingURL=invalidate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invalidate.js","sourceRoot":"","sources":["../../../src/Dev/usecase/invalidate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,MAAM,mCAAmC,CAAC;AAErE;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,KAAkB,EAClB,OAAe,EACM,EAAE;IACvB,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACxC,yDAAyD;IACzD,oDAAoD;IACpD,0DAA0D;IAC1D,IAAI,QAAQ,GAA0B,CAAC,OAAO,CAAC,CAAC;IAChD,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAkB,EAAE,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,GAAG,CAClC,IAAI,CACL,IAAI,EAAE,EAAE,CAAC;gBACR,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACxB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBACnB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;QACD,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,YAAY,GAAG,CACnB,KAAkB,EAC0B,EAAE;IAC9C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAGrB,CAAC;IACJ,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC;QAChC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=invalidate.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invalidate.spec.d.ts","sourceRoot":"","sources":["../../../src/Dev/usecase/invalidate.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,64 @@
1
+ import { test, check, all, toBe, } from "plgg-test";
2
+ import { buildGraph } from "plgg-bundle/Dev/usecase/buildGraph";
3
+ import { transitiveImporters } from "plgg-bundle/Dev/usecase/invalidate";
4
+ /** A imports B; editing B must re-evaluate A (and B). */
5
+ test("transitiveImporters: A imports B ⇒ invalidate(B) = {A, B}", () => {
6
+ const graph = buildGraph([
7
+ { from: "/a.ts", to: "/b.ts" },
8
+ ]);
9
+ const set = transitiveImporters(graph, "/b.ts");
10
+ return all([
11
+ check(set.has("/a.ts"), toBe(true)),
12
+ check(set.has("/b.ts"), toBe(true)),
13
+ check(set.size, toBe(2)),
14
+ ]);
15
+ });
16
+ /** Deep chain A→B→C: editing C invalidates the whole chain. */
17
+ test("transitiveImporters walks a transitive chain A→B→C", () => {
18
+ const graph = buildGraph([
19
+ { from: "/a.ts", to: "/b.ts" },
20
+ { from: "/b.ts", to: "/c.ts" },
21
+ ]);
22
+ const set = transitiveImporters(graph, "/c.ts");
23
+ return all([
24
+ check(set.has("/a.ts"), toBe(true)),
25
+ check(set.has("/b.ts"), toBe(true)),
26
+ check(set.has("/c.ts"), toBe(true)),
27
+ check(set.size, toBe(3)),
28
+ ]);
29
+ });
30
+ /** A leaf's editor invalidates only itself. */
31
+ test("transitiveImporters of a root importer is just itself", () => {
32
+ const graph = buildGraph([
33
+ { from: "/a.ts", to: "/b.ts" },
34
+ ]);
35
+ const set = transitiveImporters(graph, "/a.ts");
36
+ return all([
37
+ check(set.has("/a.ts"), toBe(true)),
38
+ check(set.size, toBe(1)),
39
+ ]);
40
+ });
41
+ /** Two importers of one leaf: editing C invalidates both A and B. */
42
+ test("transitiveImporters collects multiple importers of one file", () => {
43
+ const graph = buildGraph([
44
+ { from: "/a.ts", to: "/c.ts" },
45
+ { from: "/b.ts", to: "/c.ts" },
46
+ ]);
47
+ const set = transitiveImporters(graph, "/c.ts");
48
+ return all([
49
+ check(set.has("/a.ts"), toBe(true)),
50
+ check(set.has("/b.ts"), toBe(true)),
51
+ check(set.has("/c.ts"), toBe(true)),
52
+ check(set.size, toBe(3)),
53
+ ]);
54
+ });
55
+ /** A cycle (A↔B) terminates and includes both. */
56
+ test("transitiveImporters is cycle-safe", () => {
57
+ const graph = buildGraph([
58
+ { from: "/a.ts", to: "/b.ts" },
59
+ { from: "/b.ts", to: "/a.ts" },
60
+ ]);
61
+ const set = transitiveImporters(graph, "/a.ts");
62
+ return check(set.size, toBe(2));
63
+ });
64
+ //# sourceMappingURL=invalidate.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invalidate.spec.js","sourceRoot":"","sources":["../../../src/Dev/usecase/invalidate.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Extract the import specifiers from a TypeScript/ESM
3
+ * source string. Pure string analysis — no fs, no
4
+ * `typescript` AST — matching the three import forms the
5
+ * monorepo actually uses:
6
+ *
7
+ * - static `import ... from "spec"`,
8
+ * - re-export `export ... from "spec"`,
9
+ * - dynamic `import("spec")`.
10
+ *
11
+ * The node adapter feeds each watched file's contents
12
+ * through this to build the local module graph. Returns
13
+ * specifiers in source order (duplicates preserved);
14
+ * resolution + local-only filtering is the adapter's job.
15
+ *
16
+ * This is intentionally a lightweight lexical scan, not a
17
+ * full parser: the specifiers it yields drive only the
18
+ * dev server's *reload decision* (which files are part of
19
+ * the served graph), never the production build, so an
20
+ * exotic un-matched form costs at most one conservative
21
+ * extra reload — never a wrong bundle.
22
+ */
23
+ export declare const parseImports: (source: string) => ReadonlyArray<string>;
24
+ //# sourceMappingURL=parseImports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseImports.d.ts","sourceRoot":"","sources":["../../../src/Dev/usecase/parseImports.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,YAAY,GACvB,QAAQ,MAAM,KACb,aAAa,CAAC,MAAM,CAcpB,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Extract the import specifiers from a TypeScript/ESM
3
+ * source string. Pure string analysis — no fs, no
4
+ * `typescript` AST — matching the three import forms the
5
+ * monorepo actually uses:
6
+ *
7
+ * - static `import ... from "spec"`,
8
+ * - re-export `export ... from "spec"`,
9
+ * - dynamic `import("spec")`.
10
+ *
11
+ * The node adapter feeds each watched file's contents
12
+ * through this to build the local module graph. Returns
13
+ * specifiers in source order (duplicates preserved);
14
+ * resolution + local-only filtering is the adapter's job.
15
+ *
16
+ * This is intentionally a lightweight lexical scan, not a
17
+ * full parser: the specifiers it yields drive only the
18
+ * dev server's *reload decision* (which files are part of
19
+ * the served graph), never the production build, so an
20
+ * exotic un-matched form costs at most one conservative
21
+ * extra reload — never a wrong bundle.
22
+ */
23
+ export const parseImports = (source) =>
24
+ // Each pattern's first capture group is the quoted
25
+ // specifier's inner text. `Array.from(..., mapFn)` +
26
+ // a type-guard `filter` extracts it without an
27
+ // `if`/`??` branch on the (unreachable) `undefined` a
28
+ // capture group would only take if it were optional.
29
+ PATTERNS.flatMap((pattern) => Array.from(source.matchAll(pattern), (m) => m[1]).filter((spec) => spec !== undefined));
30
+ /**
31
+ * The specifier-bearing forms. A `from "…"` clause covers
32
+ * both `import` and `export`; a bare `import("…")` covers
33
+ * dynamic import. `["']` matches either quote style; the
34
+ * inner `[^"']+` is the specifier.
35
+ */
36
+ const PATTERNS = [
37
+ /\bfrom\s*["']([^"']+)["']/g,
38
+ /\bimport\s*\(\s*["']([^"']+)["']\s*\)/g,
39
+ ];
40
+ //# sourceMappingURL=parseImports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseImports.js","sourceRoot":"","sources":["../../../src/Dev/usecase/parseImports.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,MAAc,EACS,EAAE;AACzB,mDAAmD;AACnD,qDAAqD;AACrD,+CAA+C;AAC/C,sDAAsD;AACtD,qDAAqD;AACrD,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAC3B,KAAK,CAAC,IAAI,CACR,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EACxB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CACZ,CAAC,MAAM,CACN,CAAC,IAAI,EAAkB,EAAE,CACvB,IAAI,KAAK,SAAS,CACrB,CACF,CAAC;AAEJ;;;;;GAKG;AACH,MAAM,QAAQ,GAA0B;IACtC,4BAA4B;IAC5B,wCAAwC;CACzC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parseImports.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseImports.spec.d.ts","sourceRoot":"","sources":["../../../src/Dev/usecase/parseImports.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ import { test, check, all, toBe, toEqual, } from "plgg-test";
2
+ import { parseImports } from "plgg-bundle/Dev/usecase/parseImports";
3
+ test("parseImports reads static import + re-export + dynamic forms", () => check(parseImports([
4
+ `import { a } from "./a.ts";`,
5
+ `import b from './b';`,
6
+ `export { c } from "./c.ts";`,
7
+ `const d = await import("./d.ts");`,
8
+ `export * from "./e";`,
9
+ ].join("\n")), toEqual([
10
+ // `from "…"` matches (import/export/re-export) come
11
+ // first, then the dynamic `import("…")` pass.
12
+ "./a.ts",
13
+ "./b",
14
+ "./c.ts",
15
+ "./e",
16
+ "./d.ts",
17
+ ])));
18
+ test("parseImports returns empty for a source with no imports", () => check(parseImports("export const x = 1;\n").length, toBe(0)));
19
+ test("parseImports captures bare package + node specifiers too (adapter filters locality)", () => check(parseImports(`import { x } from "node:fs";\nimport y from "some-pkg";`), toEqual(["node:fs", "some-pkg"])));
20
+ test("parseImports handles single and double quotes", () => all([
21
+ check(parseImports(`import("./x.ts")`), toEqual(["./x.ts"])),
22
+ check(parseImports(`import('./y.ts')`), toEqual(["./y.ts"])),
23
+ ]));
24
+ //# sourceMappingURL=parseImports.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseImports.spec.js","sourceRoot":"","sources":["../../../src/Dev/usecase/parseImports.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,KAAK,EACL,GAAG,EACH,IAAI,EACJ,OAAO,GACR,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAEpE,IAAI,CAAC,8DAA8D,EAAE,GAAG,EAAE,CACxE,KAAK,CACH,YAAY,CACV;IACE,6BAA6B;IAC7B,sBAAsB;IACtB,6BAA6B;IAC7B,mCAAmC;IACnC,sBAAsB;CACvB,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,EACD,OAAO,CAAC;IACN,oDAAoD;IACpD,8CAA8C;IAC9C,QAAQ;IACR,KAAK;IACL,QAAQ;IACR,KAAK;IACL,QAAQ;CACT,CAAC,CACH,CAAC,CAAC;AAEL,IAAI,CAAC,yDAAyD,EAAE,GAAG,EAAE,CACnE,KAAK,CACH,YAAY,CACV,uBAAuB,CACxB,CAAC,MAAM,EACR,IAAI,CAAC,CAAC,CAAC,CACR,CAAC,CAAC;AAEL,IAAI,CAAC,qFAAqF,EAAE,GAAG,EAAE,CAC/F,KAAK,CACH,YAAY,CACV,yDAAyD,CAC1D,EACD,OAAO,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CACjC,CAAC,CAAC;AAEL,IAAI,CAAC,+CAA+C,EAAE,GAAG,EAAE,CACzD,GAAG,CAAC;IACF,KAAK,CACH,YAAY,CAAC,kBAAkB,CAAC,EAChC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CACpB;IACD,KAAK,CACH,YAAY,CAAC,kBAAkB,CAAC,EAChC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CACpB;CACF,CAAC,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type ModuleGraph } from "plgg-bundle/Dev/model/ModuleGraph";
2
+ /**
3
+ * Whether a changed file warrants a hot-reload:
4
+ *
5
+ * - content (non-source-code, e.g. `.md`) → always, since
6
+ * the render re-reads it;
7
+ * - source code that participates in the app's served
8
+ * {@link ModuleGraph} (a graph key it imports from, or a
9
+ * graph value something imports) → yes;
10
+ * - source code the app never imports (a stray scratch
11
+ * `.ts`) → ignored, so the browser only reloads on edits
12
+ * that can change the output.
13
+ *
14
+ * Conservative fallback: an EMPTY graph means the scan
15
+ * could not map the app, so every change reloads rather
16
+ * than silently going stale. Pure decision over the graph —
17
+ * the adapter owns the fs.
18
+ */
19
+ export declare const shouldReload: (graph: ModuleGraph, changed: string) => boolean;
20
+ //# sourceMappingURL=reloadDecision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reloadDecision.d.ts","sourceRoot":"","sources":["../../../src/Dev/usecase/reloadDecision.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAgBrE;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,YAAY,GACvB,OAAO,WAAW,EAClB,SAAS,MAAM,KACd,OAI+B,CAAC"}
@@ -0,0 +1,52 @@
1
+ import {} from "plgg-bundle/Dev/model/ModuleGraph";
2
+ /**
3
+ * Source-code extensions — the files the module graph
4
+ * tracks. A changed file with any OTHER extension is
5
+ * content (Markdown, an asset) whose edit the app re-reads
6
+ * at render time, so it always warrants a reload.
7
+ */
8
+ const SOURCE_EXT = [
9
+ ".ts",
10
+ ".tsx",
11
+ ".mts",
12
+ ".js",
13
+ ".mjs",
14
+ ];
15
+ /**
16
+ * Whether a changed file warrants a hot-reload:
17
+ *
18
+ * - content (non-source-code, e.g. `.md`) → always, since
19
+ * the render re-reads it;
20
+ * - source code that participates in the app's served
21
+ * {@link ModuleGraph} (a graph key it imports from, or a
22
+ * graph value something imports) → yes;
23
+ * - source code the app never imports (a stray scratch
24
+ * `.ts`) → ignored, so the browser only reloads on edits
25
+ * that can change the output.
26
+ *
27
+ * Conservative fallback: an EMPTY graph means the scan
28
+ * could not map the app, so every change reloads rather
29
+ * than silently going stale. Pure decision over the graph —
30
+ * the adapter owns the fs.
31
+ */
32
+ export const shouldReload = (graph, changed) => !isSourceCode(changed) ||
33
+ graph.size === 0 ||
34
+ graph.has(changed) ||
35
+ importsSomewhere(graph, changed);
36
+ /** Whether a path is a tracked source-code file (by extension). */
37
+ const isSourceCode = (changed) => SOURCE_EXT.some((e) => changed.endsWith(e));
38
+ /**
39
+ * Whether any node in the graph imports `changed` (i.e. it
40
+ * appears as an edge target). Local scan over the forward
41
+ * edges — the reverse lookup is only needed once per
42
+ * decision, so it is not memoised.
43
+ */
44
+ const importsSomewhere = (graph, changed) => {
45
+ for (const tos of graph.values()) {
46
+ if (tos.includes(changed)) {
47
+ return true;
48
+ }
49
+ }
50
+ return false;
51
+ };
52
+ //# sourceMappingURL=reloadDecision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reloadDecision.js","sourceRoot":"","sources":["../../../src/Dev/usecase/reloadDecision.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,MAAM,mCAAmC,CAAC;AAErE;;;;;GAKG;AACH,MAAM,UAAU,GAA0B;IACxC,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;CACP,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,KAAkB,EAClB,OAAe,EACN,EAAE,CACX,CAAC,YAAY,CAAC,OAAO,CAAC;IACtB,KAAK,CAAC,IAAI,KAAK,CAAC;IAChB,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;IAClB,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAEnC,mEAAmE;AACnE,MAAM,YAAY,GAAG,CACnB,OAAe,EACN,EAAE,CACX,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAE9C;;;;;GAKG;AACH,MAAM,gBAAgB,GAAG,CACvB,KAAkB,EAClB,OAAe,EACN,EAAE;IACX,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;QACjC,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=reloadDecision.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reloadDecision.spec.d.ts","sourceRoot":"","sources":["../../../src/Dev/usecase/reloadDecision.spec.ts"],"names":[],"mappings":""}