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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=isExternal.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isExternal.spec.d.ts","sourceRoot":"","sources":["../../../src/domain/usecase/isExternal.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import { test, check, all, toBe, } from "plgg-test";
2
+ import { isExternal } from "plgg-bundle/domain/usecase/isExternal";
3
+ test("isExternal handles a string-array external", () => all([
4
+ check(isExternal(["plgg", "node:fs"], "plgg"), toBe(true)),
5
+ check(isExternal(["plgg"], "plgg-server"), toBe(false)),
6
+ check(isExternal([], "anything"), toBe(false)),
7
+ ]));
8
+ test("isExternal handles a RegExp external", () => all([
9
+ check(isExternal(/^node:/, "node:stream"), toBe(true)),
10
+ check(isExternal(/^node:/, "plgg/index"), toBe(false)),
11
+ ]));
12
+ test("isExternal handles a predicate external", () => all([
13
+ check(isExternal((id) => id.startsWith("plgg"), "plgg-server/node"), toBe(true)),
14
+ check(isExternal((id) => id.startsWith("plgg"), "./relative"), toBe(false)),
15
+ ]));
16
+ //# sourceMappingURL=isExternal.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isExternal.spec.js","sourceRoot":"","sources":["../../../src/domain/usecase/isExternal.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,KAAK,EACL,GAAG,EACH,IAAI,GACL,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAEnE,IAAI,CAAC,4CAA4C,EAAE,GAAG,EAAE,CACtD,GAAG,CAAC;IACF,KAAK,CACH,UAAU,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,EACvC,IAAI,CAAC,IAAI,CAAC,CACX;IACD,KAAK,CACH,UAAU,CAAC,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,EACnC,IAAI,CAAC,KAAK,CAAC,CACZ;IACD,KAAK,CACH,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,EAC1B,IAAI,CAAC,KAAK,CAAC,CACZ;CACF,CAAC,CAAC,CAAC;AAEN,IAAI,CAAC,sCAAsC,EAAE,GAAG,EAAE,CAChD,GAAG,CAAC;IACF,KAAK,CACH,UAAU,CAAC,QAAQ,EAAE,aAAa,CAAC,EACnC,IAAI,CAAC,IAAI,CAAC,CACX;IACD,KAAK,CACH,UAAU,CAAC,QAAQ,EAAE,YAAY,CAAC,EAClC,IAAI,CAAC,KAAK,CAAC,CACZ;CACF,CAAC,CAAC,CAAC;AAEN,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE,CACnD,GAAG,CAAC;IACF,KAAK,CACH,UAAU,CACR,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAC7B,kBAAkB,CACnB,EACD,IAAI,CAAC,IAAI,CAAC,CACX;IACD,KAAK,CACH,UAAU,CACR,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAC7B,YAAY,CACb,EACD,IAAI,CAAC,KAAK,CAAC,CACZ;CACF,CAAC,CAAC,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Resolve a bare import specifier to an absolute source
3
+ * file path, given the importing file and the
4
+ * package-self-alias mapping. Pure resolution logic —
5
+ * it only consults the filesystem to pick between
6
+ * `X.ts` and `X/index.ts`, mirroring how the alias +
7
+ * relative imports across the plgg packages resolve
8
+ * under `tsc`.
9
+ *
10
+ * Returns `undefined` when the specifier is external
11
+ * (not the self-alias and not relative) or cannot be
12
+ * found on disk — the caller decides whether that means
13
+ * "external, leave it" or "broken import, fail".
14
+ */
15
+ export declare const resolveSpecifier: (args: {
16
+ specifier: string;
17
+ fromFile: string;
18
+ aliasPrefix: string;
19
+ aliasSrcRoot: string;
20
+ }) => string | undefined;
21
+ /**
22
+ * Whether the specifier is a relative path (`./` or
23
+ * `../`). Exported for the app-mode workspace resolver,
24
+ * which shares this relative-import handling.
25
+ */
26
+ export declare const isRelative: (specifier: string) => boolean;
27
+ /**
28
+ * Given a base path with no extension, pick the
29
+ * existing source file: the path as-is, then `base.ts`,
30
+ * then `base/index.ts`. Exported so the app-mode
31
+ * workspace resolver picks sibling source files the same
32
+ * way.
33
+ */
34
+ export declare const pickExisting: (base: string) => string | undefined;
35
+ //# sourceMappingURL=resolveSpecifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveSpecifier.d.ts","sourceRoot":"","sources":["../../../src/domain/usecase/resolveSpecifier.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,gBAAgB,GAAI,MAAM;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB,KAAG,MAAM,GAAG,SAaZ,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,UAAU,GACrB,WAAW,MAAM,KAChB,OAE0B,CAAC;AA0B9B;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,GACvB,MAAM,MAAM,KACX,MAAM,GAAG,SACmB,CAAC"}
@@ -0,0 +1,83 @@
1
+ import { existsSync, statSync } from "node:fs";
2
+ import { dirname, resolve, join, } from "node:path";
3
+ /**
4
+ * Resolve a bare import specifier to an absolute source
5
+ * file path, given the importing file and the
6
+ * package-self-alias mapping. Pure resolution logic —
7
+ * it only consults the filesystem to pick between
8
+ * `X.ts` and `X/index.ts`, mirroring how the alias +
9
+ * relative imports across the plgg packages resolve
10
+ * under `tsc`.
11
+ *
12
+ * Returns `undefined` when the specifier is external
13
+ * (not the self-alias and not relative) or cannot be
14
+ * found on disk — the caller decides whether that means
15
+ * "external, leave it" or "broken import, fail".
16
+ */
17
+ export const resolveSpecifier = (args) => {
18
+ if (isRelative(args.specifier)) {
19
+ return pickExisting(resolve(dirname(args.fromFile), args.specifier));
20
+ }
21
+ const base = aliasTarget(args);
22
+ return base === undefined
23
+ ? undefined
24
+ : pickExisting(base);
25
+ };
26
+ /**
27
+ * Whether the specifier is a relative path (`./` or
28
+ * `../`). Exported for the app-mode workspace resolver,
29
+ * which shares this relative-import handling.
30
+ */
31
+ export const isRelative = (specifier) => specifier.startsWith("./") ||
32
+ specifier.startsWith("../");
33
+ /**
34
+ * Map a self-alias specifier (`<prefix>` or
35
+ * `<prefix>/sub/path`) to its base path under the
36
+ * source root. A non-alias specifier yields `undefined`
37
+ * (it is external).
38
+ */
39
+ const aliasTarget = (args) => args.specifier === args.aliasPrefix
40
+ ? args.aliasSrcRoot
41
+ : args.specifier.startsWith(`${args.aliasPrefix}/`)
42
+ ? join(args.aliasSrcRoot, args.specifier.slice(args.aliasPrefix.length + 1))
43
+ : undefined;
44
+ /**
45
+ * Given a base path with no extension, pick the
46
+ * existing source file: the path as-is, then `base.ts`,
47
+ * then `base/index.ts`. Exported so the app-mode
48
+ * workspace resolver picks sibling source files the same
49
+ * way.
50
+ */
51
+ export const pickExisting = (base) => candidates(base).find(isFile);
52
+ /**
53
+ * Whether a path exists and is a regular file (not a
54
+ * directory). A bare `plgg/Abstracts` base resolves to
55
+ * the `Abstracts/` directory, which must be skipped in
56
+ * favor of `Abstracts/index.ts`.
57
+ */
58
+ const isFile = (p) => existsSync(p) && statSync(p).isFile();
59
+ /**
60
+ * The ordered candidate file paths for a base path. A
61
+ * `.js`/`.mjs`/`.jsx` specifier is the NodeNext/ESM way
62
+ * to reference a TypeScript sibling (`./X.js` → `X.ts`),
63
+ * so its `.ts`/`.mts`/`.tsx` form is tried first.
64
+ */
65
+ const candidates = (base) => [
66
+ ...tsForJs(base),
67
+ base,
68
+ `${base}.ts`,
69
+ join(base, "index.ts"),
70
+ ];
71
+ /**
72
+ * The TypeScript-source path implied by a JS-extension
73
+ * specifier, or nothing if `base` carries no such
74
+ * extension.
75
+ */
76
+ const tsForJs = (base) => base.endsWith(".js")
77
+ ? [`${base.slice(0, -3)}.ts`]
78
+ : base.endsWith(".mjs")
79
+ ? [`${base.slice(0, -4)}.mts`]
80
+ : base.endsWith(".jsx")
81
+ ? [`${base.slice(0, -4)}.tsx`]
82
+ : [];
83
+ //# sourceMappingURL=resolveSpecifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveSpecifier.js","sourceRoot":"","sources":["../../../src/domain/usecase/resolveSpecifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EACL,OAAO,EACP,OAAO,EACP,IAAI,GACL,MAAM,WAAW,CAAC;AAEnB;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAKhC,EAAsB,EAAE;IACvB,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,OAAO,YAAY,CACjB,OAAO,CACL,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EACtB,IAAI,CAAC,SAAS,CACf,CACF,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,IAAI,KAAK,SAAS;QACvB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,SAAiB,EACR,EAAE,CACX,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC;IAC1B,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAE9B;;;;;GAKG;AACH,MAAM,WAAW,GAAG,CAAC,IAIpB,EAAsB,EAAE,CACvB,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,WAAW;IACjC,CAAC,CAAC,IAAI,CAAC,YAAY;IACnB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CACrB,GAAG,IAAI,CAAC,WAAW,GAAG,CACvB;QACH,CAAC,CAAC,IAAI,CACF,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,SAAS,CAAC,KAAK,CAClB,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAC5B,CACF;QACH,CAAC,CAAC,SAAS,CAAC;AAElB;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,IAAY,EACQ,EAAE,CACtB,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAEhC;;;;;GAKG;AACH,MAAM,MAAM,GAAG,CAAC,CAAS,EAAW,EAAE,CACpC,UAAU,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;AAExC;;;;;GAKG;AACH,MAAM,UAAU,GAAG,CACjB,IAAY,EACW,EAAE,CAAC;IAC1B,GAAG,OAAO,CAAC,IAAI,CAAC;IAChB,IAAI;IACJ,GAAG,IAAI,KAAK;IACZ,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC;CACvB,CAAC;AAEF;;;;GAIG;AACH,MAAM,OAAO,GAAG,CACd,IAAY,EACW,EAAE,CACzB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;IAClB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7B,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QAC9B,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YACrB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;YAC9B,CAAC,CAAC,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=resolveSpecifier.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveSpecifier.spec.d.ts","sourceRoot":"","sources":["../../../src/domain/usecase/resolveSpecifier.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,44 @@
1
+ import { test, check, all, toBe, } from "plgg-test";
2
+ import { join } from "node:path";
3
+ import { resolveSpecifier } from "plgg-bundle/domain/usecase/resolveSpecifier";
4
+ // Resolve against this package's own src tree on disk.
5
+ const srcRoot = join(import.meta.dirname, "..", "..");
6
+ const aliasArgs = {
7
+ aliasPrefix: "plgg-bundle",
8
+ aliasSrcRoot: srcRoot,
9
+ };
10
+ test("resolveSpecifier resolves an alias to a file", () => check(resolveSpecifier({
11
+ specifier: "plgg-bundle/domain/usecase/isExternal",
12
+ fromFile: join(srcRoot, "index.ts"),
13
+ ...aliasArgs,
14
+ }), toBe(join(srcRoot, "domain", "usecase", "isExternal.ts"))));
15
+ test("resolveSpecifier returns undefined for an alias dir with no index", () =>
16
+ // domain/model has no index.ts → unresolvable.
17
+ check(resolveSpecifier({
18
+ specifier: "plgg-bundle/domain/model",
19
+ fromFile: join(srcRoot, "index.ts"),
20
+ ...aliasArgs,
21
+ }), toBe(undefined)));
22
+ test("resolveSpecifier resolves a relative path", () => check(resolveSpecifier({
23
+ specifier: "./isExternal",
24
+ fromFile: join(srcRoot, "domain", "usecase", "collectModules.ts"),
25
+ ...aliasArgs,
26
+ }), toBe(join(srcRoot, "domain", "usecase", "isExternal.ts"))));
27
+ test("resolveSpecifier maps a .js specifier to its .ts source (NodeNext)", () => check(resolveSpecifier({
28
+ specifier: "./isExternal.js",
29
+ fromFile: join(srcRoot, "domain", "usecase", "collectModules.ts"),
30
+ ...aliasArgs,
31
+ }), toBe(join(srcRoot, "domain", "usecase", "isExternal.ts"))));
32
+ test("resolveSpecifier returns undefined for an external specifier", () => all([
33
+ check(resolveSpecifier({
34
+ specifier: "plgg",
35
+ fromFile: join(srcRoot, "index.ts"),
36
+ ...aliasArgs,
37
+ }), toBe(undefined)),
38
+ check(resolveSpecifier({
39
+ specifier: "node:fs",
40
+ fromFile: join(srcRoot, "index.ts"),
41
+ ...aliasArgs,
42
+ }), toBe(undefined)),
43
+ ]));
44
+ //# sourceMappingURL=resolveSpecifier.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveSpecifier.spec.js","sourceRoot":"","sources":["../../../src/domain/usecase/resolveSpecifier.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,KAAK,EACL,GAAG,EACH,IAAI,GACL,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAE/E,uDAAuD;AACvD,MAAM,OAAO,GAAG,IAAI,CAClB,MAAM,CAAC,IAAI,CAAC,OAAO,EACnB,IAAI,EACJ,IAAI,CACL,CAAC;AACF,MAAM,SAAS,GAAG;IAChB,WAAW,EAAE,aAAa;IAC1B,YAAY,EAAE,OAAO;CACtB,CAAC;AAEF,IAAI,CAAC,8CAA8C,EAAE,GAAG,EAAE,CACxD,KAAK,CACH,gBAAgB,CAAC;IACf,SAAS,EACP,uCAAuC;IACzC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;IACnC,GAAG,SAAS;CACb,CAAC,EACF,IAAI,CACF,IAAI,CACF,OAAO,EACP,QAAQ,EACR,SAAS,EACT,eAAe,CAChB,CACF,CACF,CAAC,CAAC;AAEL,IAAI,CAAC,mEAAmE,EAAE,GAAG,EAAE;AAC7E,+CAA+C;AAC/C,KAAK,CACH,gBAAgB,CAAC;IACf,SAAS,EAAE,0BAA0B;IACrC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;IACnC,GAAG,SAAS;CACb,CAAC,EACF,IAAI,CAAC,SAAS,CAAC,CAChB,CAAC,CAAC;AAEL,IAAI,CAAC,2CAA2C,EAAE,GAAG,EAAE,CACrD,KAAK,CACH,gBAAgB,CAAC;IACf,SAAS,EAAE,cAAc;IACzB,QAAQ,EAAE,IAAI,CACZ,OAAO,EACP,QAAQ,EACR,SAAS,EACT,mBAAmB,CACpB;IACD,GAAG,SAAS;CACb,CAAC,EACF,IAAI,CACF,IAAI,CACF,OAAO,EACP,QAAQ,EACR,SAAS,EACT,eAAe,CAChB,CACF,CACF,CAAC,CAAC;AAEL,IAAI,CAAC,oEAAoE,EAAE,GAAG,EAAE,CAC9E,KAAK,CACH,gBAAgB,CAAC;IACf,SAAS,EAAE,iBAAiB;IAC5B,QAAQ,EAAE,IAAI,CACZ,OAAO,EACP,QAAQ,EACR,SAAS,EACT,mBAAmB,CACpB;IACD,GAAG,SAAS;CACb,CAAC,EACF,IAAI,CACF,IAAI,CACF,OAAO,EACP,QAAQ,EACR,SAAS,EACT,eAAe,CAChB,CACF,CACF,CAAC,CAAC;AAEL,IAAI,CAAC,8DAA8D,EAAE,GAAG,EAAE,CACxE,GAAG,CAAC;IACF,KAAK,CACH,gBAAgB,CAAC;QACf,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;QACnC,GAAG,SAAS;KACb,CAAC,EACF,IAAI,CAAC,SAAS,CAAC,CAChB;IACD,KAAK,CACH,gBAAgB,CAAC;QACf,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;QACnC,GAAG,SAAS;KACb,CAAC,EACF,IAAI,CAAC,SAAS,CAAC,CAChB;CACF,CAAC,CAAC,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { type WorkspacePackage } from "plgg-bundle/domain/usecase/discoverWorkspace";
2
+ /**
3
+ * App-mode resolver: resolve an import specifier to an
4
+ * absolute SOURCE file, inlining workspace siblings
5
+ * (`plgg`, `plgg-view/client`, …) by walking their `src`
6
+ * instead of leaving them external. This is the mirror of
7
+ * the library externalization — the leaf app is where
8
+ * bundling deps is correct.
9
+ *
10
+ * Order:
11
+ * 1. relative (`./x`) → resolve against the importer,
12
+ * 2. a workspace package's PUBLIC export subpath
13
+ * (`plgg-view/style`) → reverse its declared
14
+ * `exports` dist path to the entry source (honours the
15
+ * `styleEntry` rename),
16
+ * 3. a workspace package's INTERNAL self-alias path
17
+ * (`plgg-view/Html/x`, and `plgg` → its `src/index`)
18
+ * → `src/<path>`.
19
+ *
20
+ * Returns `undefined` when the specifier is neither
21
+ * relative nor a known workspace package (the caller
22
+ * treats that as external or a hard error).
23
+ */
24
+ export declare const resolveWorkspaceSpecifier: (args: {
25
+ specifier: string;
26
+ fromFile: string;
27
+ packages: ReadonlyArray<WorkspacePackage>;
28
+ }) => string | undefined;
29
+ //# sourceMappingURL=resolveWorkspaceSpecifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveWorkspaceSpecifier.d.ts","sourceRoot":"","sources":["../../../src/domain/usecase/resolveWorkspaceSpecifier.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AAErF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,yBAAyB,GAAI,MAAM;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAC;CAC3C,KAAG,MAAM,GAAG,SAgBZ,CAAC"}
@@ -0,0 +1,89 @@
1
+ import { basename, join } from "node:path";
2
+ import { resolveSpecifier, isRelative, pickExisting, } from "plgg-bundle/domain/usecase/resolveSpecifier";
3
+ import {} from "plgg-bundle/domain/usecase/discoverWorkspace";
4
+ /**
5
+ * App-mode resolver: resolve an import specifier to an
6
+ * absolute SOURCE file, inlining workspace siblings
7
+ * (`plgg`, `plgg-view/client`, …) by walking their `src`
8
+ * instead of leaving them external. This is the mirror of
9
+ * the library externalization — the leaf app is where
10
+ * bundling deps is correct.
11
+ *
12
+ * Order:
13
+ * 1. relative (`./x`) → resolve against the importer,
14
+ * 2. a workspace package's PUBLIC export subpath
15
+ * (`plgg-view/style`) → reverse its declared
16
+ * `exports` dist path to the entry source (honours the
17
+ * `styleEntry` rename),
18
+ * 3. a workspace package's INTERNAL self-alias path
19
+ * (`plgg-view/Html/x`, and `plgg` → its `src/index`)
20
+ * → `src/<path>`.
21
+ *
22
+ * Returns `undefined` when the specifier is neither
23
+ * relative nor a known workspace package (the caller
24
+ * treats that as external or a hard error).
25
+ */
26
+ export const resolveWorkspaceSpecifier = (args) => {
27
+ if (isRelative(args.specifier)) {
28
+ return resolveSpecifier({
29
+ specifier: args.specifier,
30
+ fromFile: args.fromFile,
31
+ aliasPrefix: NO_ALIAS,
32
+ aliasSrcRoot: "",
33
+ });
34
+ }
35
+ const pkg = matchPackage(args.packages, args.specifier);
36
+ return pkg === undefined
37
+ ? undefined
38
+ : resolveInPackage(pkg, args.specifier);
39
+ };
40
+ /**
41
+ * A sentinel alias prefix no specifier equals, so the
42
+ * shared `resolveSpecifier` handles only the relative
43
+ * branch when reused for relative imports.
44
+ */
45
+ const NO_ALIAS = "\0";
46
+ /**
47
+ * The workspace package whose name is the specifier or a
48
+ * leading `name/` segment. The package list is sorted
49
+ * longest-name-first, so the first match is the most
50
+ * specific (`plgg-view` before `plgg`).
51
+ */
52
+ const matchPackage = (packages, specifier) => packages.find((p) => specifier === p.name ||
53
+ specifier.startsWith(`${p.name}/`));
54
+ /**
55
+ * Resolve a specifier already known to belong to `pkg`:
56
+ * a declared export subpath via the exports reversal,
57
+ * else the internal self-alias path.
58
+ */
59
+ const resolveInPackage = (pkg, specifier) => {
60
+ const subpath = specifier === pkg.name
61
+ ? "."
62
+ : `./${specifier.slice(pkg.name.length + 1)}`;
63
+ const dist = pkg.exports.get(subpath);
64
+ return dist === undefined
65
+ ? resolveSpecifier({
66
+ specifier,
67
+ fromFile: pkg.dir,
68
+ aliasPrefix: pkg.name,
69
+ aliasSrcRoot: join(pkg.dir, "src"),
70
+ })
71
+ : pickExisting(join(pkg.dir, "src", srcStem(dist)));
72
+ };
73
+ /**
74
+ * The source stem implied by an export's dist default —
75
+ * `"./dist/styleEntry.es.js"` → `"styleEntry"`. The entry
76
+ * output basename equals the entry name, which equals the
77
+ * source file stem under `src/`, so stripping the dual
78
+ * `.es.js`/`.cjs.js` (or bare `.js`) suffix recovers it.
79
+ *
80
+ * ASSUMES top-level entry stems: `basename` drops any
81
+ * directory, so an export pointing at a NESTED dist path
82
+ * (`./dist/sub/foo.es.js`) would reverse to `src/foo` and
83
+ * lose `sub/`. No package nests an export entry today, so
84
+ * this is correct now; revisit if one ever does.
85
+ */
86
+ const srcStem = (distDefault) => basename(distDefault)
87
+ .replace(/\.(es|cjs)\.js$/, "")
88
+ .replace(/\.js$/, "");
89
+ //# sourceMappingURL=resolveWorkspaceSpecifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveWorkspaceSpecifier.js","sourceRoot":"","sources":["../../../src/domain/usecase/resolveWorkspaceSpecifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,YAAY,GACb,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAyB,MAAM,8CAA8C,CAAC;AAErF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,IAIzC,EAAsB,EAAE;IACvB,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,OAAO,gBAAgB,CAAC;YACtB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW,EAAE,QAAQ;YACrB,YAAY,EAAE,EAAE;SACjB,CAAC,CAAC;IACL,CAAC;IACD,MAAM,GAAG,GAAG,YAAY,CACtB,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,SAAS,CACf,CAAC;IACF,OAAO,GAAG,KAAK,SAAS;QACtB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;AAC5C,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,QAAQ,GAAG,IAAI,CAAC;AAEtB;;;;;GAKG;AACH,MAAM,YAAY,GAAG,CACnB,QAAyC,EACzC,SAAiB,EACa,EAAE,CAChC,QAAQ,CAAC,IAAI,CACX,CAAC,CAAC,EAAE,EAAE,CACJ,SAAS,KAAK,CAAC,CAAC,IAAI;IACpB,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CACrC,CAAC;AAEJ;;;;GAIG;AACH,MAAM,gBAAgB,GAAG,CACvB,GAAqB,EACrB,SAAiB,EACG,EAAE;IACtB,MAAM,OAAO,GACX,SAAS,KAAK,GAAG,CAAC,IAAI;QACpB,CAAC,CAAC,GAAG;QACL,CAAC,CAAC,KAAK,SAAS,CAAC,KAAK,CAClB,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CACpB,EAAE,CAAC;IACV,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACtC,OAAO,IAAI,KAAK,SAAS;QACvB,CAAC,CAAC,gBAAgB,CAAC;YACf,SAAS;YACT,QAAQ,EAAE,GAAG,CAAC,GAAG;YACjB,WAAW,EAAE,GAAG,CAAC,IAAI;YACrB,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;SACnC,CAAC;QACJ,CAAC,CAAC,YAAY,CACV,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CACpC,CAAC;AACR,CAAC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,GAAG,CAAC,WAAmB,EAAU,EAAE,CAC9C,QAAQ,CAAC,WAAW,CAAC;KAClB,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;KAC9B,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=resolveWorkspaceSpecifier.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveWorkspaceSpecifier.spec.d.ts","sourceRoot":"","sources":["../../../src/domain/usecase/resolveWorkspaceSpecifier.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ import { test, check, all, toBe, } from "plgg-test";
2
+ import { join } from "node:path";
3
+ import { discoverWorkspace } from "plgg-bundle/domain/usecase/discoverWorkspace";
4
+ import { resolveWorkspaceSpecifier } from "plgg-bundle/domain/usecase/resolveWorkspaceSpecifier";
5
+ const bundleRoot = join(import.meta.dirname, "..", "..", "..");
6
+ const packagesDir = join(bundleRoot, "..");
7
+ const packages = discoverWorkspace(bundleRoot);
8
+ // Any file standing in for the importer.
9
+ const fromFile = join(packagesDir, "example", "src", "app.ts");
10
+ const resolve = (specifier) => resolveWorkspaceSpecifier({
11
+ specifier,
12
+ fromFile,
13
+ packages,
14
+ });
15
+ const pkgSrc = (name, ...rest) => join(packagesDir, name, "src", ...rest);
16
+ test("resolves a bare workspace package to its src index", () => check(resolve("plgg"), toBe(pkgSrc("plgg", "index.ts"))));
17
+ test("resolves a public export subpath, honouring the styleEntry rename", () => all([
18
+ check(resolve("plgg-view/client"), toBe(pkgSrc("plgg-view", "client.ts"))),
19
+ check(resolve("plgg-view/style"), toBe(pkgSrc("plgg-view", "styleEntry.ts"))),
20
+ ]));
21
+ test("resolves an internal self-alias path (not a declared export)", () => check(resolve("plgg/Atomics/Num"), toBe(pkgSrc("plgg", "Atomics", "Num.ts"))));
22
+ test("resolves a relative import against the importer", () => check(resolve("./Todo.ts"), toBe(join(packagesDir, "example", "src", "Todo.ts"))));
23
+ test("returns undefined for a non-workspace specifier", () => all([
24
+ check(resolve("react"), toBe(undefined)),
25
+ check(resolve("node:fs"), toBe(undefined)),
26
+ ]));
27
+ //# sourceMappingURL=resolveWorkspaceSpecifier.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveWorkspaceSpecifier.spec.js","sourceRoot":"","sources":["../../../src/domain/usecase/resolveWorkspaceSpecifier.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,KAAK,EACL,GAAG,EACH,IAAI,GACL,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,8CAA8C,CAAC;AACjF,OAAO,EAAE,yBAAyB,EAAE,MAAM,sDAAsD,CAAC;AAEjG,MAAM,UAAU,GAAG,IAAI,CACrB,MAAM,CAAC,IAAI,CAAC,OAAO,EACnB,IAAI,EACJ,IAAI,EACJ,IAAI,CACL,CAAC;AACF,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AAC3C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;AAE/C,yCAAyC;AACzC,MAAM,QAAQ,GAAG,IAAI,CACnB,WAAW,EACX,SAAS,EACT,KAAK,EACL,QAAQ,CACT,CAAC;AACF,MAAM,OAAO,GAAG,CAAC,SAAiB,EAAE,EAAE,CACpC,yBAAyB,CAAC;IACxB,SAAS;IACT,QAAQ;IACR,QAAQ;CACT,CAAC,CAAC;AACL,MAAM,MAAM,GAAG,CACb,IAAY,EACZ,GAAG,IAA2B,EAC9B,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;AAE7C,IAAI,CAAC,oDAAoD,EAAE,GAAG,EAAE,CAC9D,KAAK,CACH,OAAO,CAAC,MAAM,CAAC,EACf,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CACjC,CAAC,CAAC;AAEL,IAAI,CAAC,mEAAmE,EAAE,GAAG,EAAE,CAC7E,GAAG,CAAC;IACF,KAAK,CACH,OAAO,CAAC,kBAAkB,CAAC,EAC3B,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CACvC;IACD,KAAK,CACH,OAAO,CAAC,iBAAiB,CAAC,EAC1B,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC,CAC3C;CACF,CAAC,CAAC,CAAC;AAEN,IAAI,CAAC,8DAA8D,EAAE,GAAG,EAAE,CACxE,KAAK,CACH,OAAO,CAAC,kBAAkB,CAAC,EAC3B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAC1C,CAAC,CAAC;AAEL,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE,CAC3D,KAAK,CACH,OAAO,CAAC,WAAW,CAAC,EACpB,IAAI,CACF,IAAI,CACF,WAAW,EACX,SAAS,EACT,KAAK,EACL,SAAS,CACV,CACF,CACF,CAAC,CAAC;AAEL,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE,CAC3D,GAAG,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACxC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;CAC3C,CAAC,CAAC,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Rewrite the package self-alias (`<prefix>/<sub>`) in
3
+ * every emitted `.d.ts` under `distDir` to a path
4
+ * relative to the importing declaration file — the same
5
+ * transform vite-plugin-dts applied. `tsc` leaves
6
+ * `tsconfig` `paths` aliases verbatim in declaration
7
+ * output, so without this pass a consumer (who has no
8
+ * `plgg/*` alias) cannot resolve `from "plgg/Atomics"`.
9
+ *
10
+ * Because `dist` mirrors `src` and the alias maps
11
+ * `<prefix>/*` → `src/*`, `<prefix>/<sub>` from
12
+ * `dist/A/B.d.ts` resolves to `dist/<sub>`, i.e. the
13
+ * relative path from `dist/A` to `dist/<sub>`.
14
+ */
15
+ export declare const rewriteDtsAliases: (distDir: string, aliasPrefix: string) => void;
16
+ /**
17
+ * Rewrite a single declaration file's alias specifiers
18
+ * (pure string transform, exposed for unit testing). The
19
+ * match is ANCHORED to import/export specifier positions
20
+ * — preceded by `from ` or `import(` — so a literal
21
+ * string-type value like `type T = "plgg/x"` in a
22
+ * `.d.ts` is left untouched (gap #7).
23
+ */
24
+ export declare const rewriteDtsContent: (file: string, content: string, distDir: string, aliasPrefix: string) => string;
25
+ //# sourceMappingURL=rewriteDtsAliases.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewriteDtsAliases.d.ts","sourceRoot":"","sources":["../../../src/domain/usecase/rewriteDtsAliases.ts"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,iBAAiB,GAC5B,SAAS,MAAM,EACf,aAAa,MAAM,KAClB,IAYF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,GAC5B,MAAM,MAAM,EACZ,SAAS,MAAM,EACf,SAAS,MAAM,EACf,aAAa,MAAM,KAClB,MAcA,CAAC"}
@@ -0,0 +1,71 @@
1
+ import { readdirSync, statSync, readFileSync, writeFileSync, } from "node:fs";
2
+ import { join, dirname, relative, } from "node:path";
3
+ /**
4
+ * Rewrite the package self-alias (`<prefix>/<sub>`) in
5
+ * every emitted `.d.ts` under `distDir` to a path
6
+ * relative to the importing declaration file — the same
7
+ * transform vite-plugin-dts applied. `tsc` leaves
8
+ * `tsconfig` `paths` aliases verbatim in declaration
9
+ * output, so without this pass a consumer (who has no
10
+ * `plgg/*` alias) cannot resolve `from "plgg/Atomics"`.
11
+ *
12
+ * Because `dist` mirrors `src` and the alias maps
13
+ * `<prefix>/*` → `src/*`, `<prefix>/<sub>` from
14
+ * `dist/A/B.d.ts` resolves to `dist/<sub>`, i.e. the
15
+ * relative path from `dist/A` to `dist/<sub>`.
16
+ */
17
+ export const rewriteDtsAliases = (distDir, aliasPrefix) => {
18
+ // fs walk seam: visit every emitted declaration and
19
+ // relativize its alias imports in place.
20
+ for (const file of dtsFiles(distDir)) {
21
+ const rewritten = rewriteDtsContent(file, readFileSync(file, "utf8"), distDir, aliasPrefix);
22
+ writeFileSync(file, rewritten, "utf8");
23
+ }
24
+ };
25
+ /**
26
+ * Rewrite a single declaration file's alias specifiers
27
+ * (pure string transform, exposed for unit testing). The
28
+ * match is ANCHORED to import/export specifier positions
29
+ * — preceded by `from ` or `import(` — so a literal
30
+ * string-type value like `type T = "plgg/x"` in a
31
+ * `.d.ts` is left untouched (gap #7).
32
+ */
33
+ export const rewriteDtsContent = (file, content, distDir, aliasPrefix) => content.replace(aliasPattern(aliasPrefix), (_match, lead, quote, sub) => `${lead}${quote}${toRelative(file, distDir, sub)}${quote}`);
34
+ /**
35
+ * A specifier-matching regex for `<prefix>/<sub>` only
36
+ * in an import/export specifier position: immediately
37
+ * after `from ` or `import(`. Captures the lead, the
38
+ * quote, and the sub-path. The prefix is escaped so a
39
+ * regex-special character in a package name is literal.
40
+ */
41
+ const aliasPattern = (aliasPrefix) => new RegExp(`(from\\s+|import\\s*\\()(["'])${escapeRegExp(aliasPrefix)}\\/([^"']+)\\2`, "g");
42
+ /**
43
+ * The relative specifier from a declaration file to the
44
+ * aliased sub-module's location in `dist`, POSIX-style
45
+ * and `./`-prefixed when in the same/!-parent dir.
46
+ */
47
+ const toRelative = (file, distDir, sub) => dotted(relative(dirname(file), join(distDir, sub))
48
+ .split("\\")
49
+ .join("/"));
50
+ /**
51
+ * Ensure a relative path is import-specifier shaped:
52
+ * a same-or-child path gets a leading `./`; a `../`
53
+ * path already is.
54
+ */
55
+ const dotted = (rel) => rel.startsWith(".") ? rel : `./${rel}`;
56
+ /**
57
+ * Escape regex metacharacters in a literal string.
58
+ */
59
+ const escapeRegExp = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
60
+ /**
61
+ * All `.d.ts` files under a directory, recursively.
62
+ */
63
+ const dtsFiles = (dir) => readdirSync(dir).flatMap((name) => {
64
+ const p = join(dir, name);
65
+ return statSync(p).isDirectory()
66
+ ? dtsFiles(p)
67
+ : p.endsWith(".d.ts")
68
+ ? [p]
69
+ : [];
70
+ });
71
+ //# sourceMappingURL=rewriteDtsAliases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewriteDtsAliases.js","sourceRoot":"","sources":["../../../src/domain/usecase/rewriteDtsAliases.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,IAAI,EACJ,OAAO,EACP,QAAQ,GACT,MAAM,WAAW,CAAC;AAEnB;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,OAAe,EACf,WAAmB,EACb,EAAE;IACR,oDAAoD;IACpD,yCAAyC;IACzC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,iBAAiB,CACjC,IAAI,EACJ,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EAC1B,OAAO,EACP,WAAW,CACZ,CAAC;QACF,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;AACH,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,IAAY,EACZ,OAAe,EACf,OAAe,EACf,WAAmB,EACX,EAAE,CACV,OAAO,CAAC,OAAO,CACb,YAAY,CAAC,WAAW,CAAC,EACzB,CACE,MAAM,EACN,IAAY,EACZ,KAAa,EACb,GAAW,EACX,EAAE,CACF,GAAG,IAAI,GAAG,KAAK,GAAG,UAAU,CAC1B,IAAI,EACJ,OAAO,EACP,GAAG,CACJ,GAAG,KAAK,EAAE,CACd,CAAC;AAEJ;;;;;;GAMG;AACH,MAAM,YAAY,GAAG,CACnB,WAAmB,EACX,EAAE,CACV,IAAI,MAAM,CACR,iCAAiC,YAAY,CAC3C,WAAW,CACZ,gBAAgB,EACjB,GAAG,CACJ,CAAC;AAEJ;;;;GAIG;AACH,MAAM,UAAU,GAAG,CACjB,IAAY,EACZ,OAAe,EACf,GAAW,EACH,EAAE,CACV,MAAM,CACJ,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;KACxC,KAAK,CAAC,IAAI,CAAC;KACX,IAAI,CAAC,GAAG,CAAC,CACb,CAAC;AAEJ;;;;GAIG;AACH,MAAM,MAAM,GAAG,CAAC,GAAW,EAAU,EAAE,CACrC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;AAEzC;;GAEG;AACH,MAAM,YAAY,GAAG,CAAC,CAAS,EAAU,EAAE,CACzC,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAE3C;;GAEG;AACH,MAAM,QAAQ,GAAG,CACf,GAAW,EACY,EAAE,CACzB,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;IAChC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1B,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;QAC9B,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QACb,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;YACnB,CAAC,CAAC,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,EAAE,CAAC;AACX,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=rewriteDtsAliases.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewriteDtsAliases.spec.d.ts","sourceRoot":"","sources":["../../../src/domain/usecase/rewriteDtsAliases.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ import { test, check, all, toBe, } from "plgg-test";
2
+ import { join } from "node:path";
3
+ import { mkdtempSync, mkdirSync, writeFileSync, readFileSync, } from "node:fs";
4
+ import { tmpdir } from "node:os";
5
+ import { rewriteDtsAliases, rewriteDtsContent, } from "plgg-bundle/domain/usecase/rewriteDtsAliases";
6
+ const distDir = "/pkg/dist";
7
+ // A declaration two levels deep, so a rewrite to a
8
+ // top-level sibling is a `../../` path.
9
+ const file = join(distDir, "Disjunctives", "Result.d.ts");
10
+ test("rewriteDtsContent relativizes an alias in `from` position", () => check(rewriteDtsContent(file, `import { Ok } from "plgg/index";`, distDir, "plgg"), toBe(`import { Ok } from "../index";`)));
11
+ test("rewriteDtsContent relativizes a re-export and an inline import()", () => all([
12
+ check(rewriteDtsContent(join(distDir, "index.d.ts"), `export * from "plgg/Atomics";`, distDir, "plgg"), toBe(`export * from "./Atomics";`)),
13
+ check(rewriteDtsContent(join(distDir, "index.d.ts"), `export type T = import("plgg/Atomics/Num").Num;`, distDir, "plgg"), toBe(`export type T = import("./Atomics/Num").Num;`)),
14
+ ]));
15
+ test("rewriteDtsContent leaves a literal-type string untouched (gap #7)", () =>
16
+ // A string-literal type that merely looks like an
17
+ // alias must NOT be rewritten — it is not an
18
+ // import/export specifier position.
19
+ check(rewriteDtsContent(join(distDir, "index.d.ts"), `export type Tag = "plgg/not-a-module";`, distDir, "plgg"), toBe(`export type Tag = "plgg/not-a-module";`)));
20
+ test("rewriteDtsAliases rewrites aliases across a nested dist tree in place", () => {
21
+ const dist = mkdtempSync(join(tmpdir(), "plgg-dts-"));
22
+ mkdirSync(join(dist, "Sub"));
23
+ writeFileSync(join(dist, "index.d.ts"), `export * from "plgg/Sub/x";`);
24
+ writeFileSync(join(dist, "Sub", "x.d.ts"), `import { Y } from "plgg/index";`);
25
+ // A non-.d.ts sibling must be skipped by the walk.
26
+ writeFileSync(join(dist, "notes.txt"), `plgg/index (not a declaration)`);
27
+ rewriteDtsAliases(dist, "plgg");
28
+ return all([
29
+ check(readFileSync(join(dist, "index.d.ts"), "utf8"), toBe(`export * from "./Sub/x";`)),
30
+ check(readFileSync(join(dist, "Sub", "x.d.ts"), "utf8"), toBe(`import { Y } from "../index";`)),
31
+ // Untouched: not a declaration file.
32
+ check(readFileSync(join(dist, "notes.txt"), "utf8"), toBe(`plgg/index (not a declaration)`)),
33
+ ]);
34
+ });
35
+ //# sourceMappingURL=rewriteDtsAliases.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewriteDtsAliases.spec.js","sourceRoot":"","sources":["../../../src/domain/usecase/rewriteDtsAliases.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,KAAK,EACL,GAAG,EACH,IAAI,GACL,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,WAAW,EACX,SAAS,EACT,aAAa,EACb,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EACL,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,8CAA8C,CAAC;AAEtD,MAAM,OAAO,GAAG,WAAW,CAAC;AAC5B,mDAAmD;AACnD,wCAAwC;AACxC,MAAM,IAAI,GAAG,IAAI,CACf,OAAO,EACP,cAAc,EACd,aAAa,CACd,CAAC;AAEF,IAAI,CAAC,2DAA2D,EAAE,GAAG,EAAE,CACrE,KAAK,CACH,iBAAiB,CACf,IAAI,EACJ,kCAAkC,EAClC,OAAO,EACP,MAAM,CACP,EACD,IAAI,CAAC,gCAAgC,CAAC,CACvC,CAAC,CAAC;AAEL,IAAI,CAAC,kEAAkE,EAAE,GAAG,EAAE,CAC5E,GAAG,CAAC;IACF,KAAK,CACH,iBAAiB,CACf,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,EAC3B,+BAA+B,EAC/B,OAAO,EACP,MAAM,CACP,EACD,IAAI,CAAC,4BAA4B,CAAC,CACnC;IACD,KAAK,CACH,iBAAiB,CACf,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,EAC3B,iDAAiD,EACjD,OAAO,EACP,MAAM,CACP,EACD,IAAI,CACF,8CAA8C,CAC/C,CACF;CACF,CAAC,CAAC,CAAC;AAEN,IAAI,CAAC,mEAAmE,EAAE,GAAG,EAAE;AAC7E,kDAAkD;AAClD,6CAA6C;AAC7C,oCAAoC;AACpC,KAAK,CACH,iBAAiB,CACf,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,EAC3B,wCAAwC,EACxC,OAAO,EACP,MAAM,CACP,EACD,IAAI,CACF,wCAAwC,CACzC,CACF,CAAC,CAAC;AAEL,IAAI,CAAC,uEAAuE,EAAE,GAAG,EAAE;IACjF,MAAM,IAAI,GAAG,WAAW,CACtB,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAC5B,CAAC;IACF,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7B,aAAa,CACX,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,EACxB,6BAA6B,CAC9B,CAAC;IACF,aAAa,CACX,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,EAC3B,iCAAiC,CAClC,CAAC;IACF,mDAAmD;IACnD,aAAa,CACX,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,EACvB,gCAAgC,CACjC,CAAC;IACF,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,GAAG,CAAC;QACT,KAAK,CACH,YAAY,CACV,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,EACxB,MAAM,CACP,EACD,IAAI,CAAC,0BAA0B,CAAC,CACjC;QACD,KAAK,CACH,YAAY,CACV,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,EAC3B,MAAM,CACP,EACD,IAAI,CAAC,+BAA+B,CAAC,CACtC;QACD,qCAAqC;QACrC,KAAK,CACH,YAAY,CACV,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,EACvB,MAAM,CACP,EACD,IAAI,CAAC,gCAAgC,CAAC,CACvC;KACF,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/entrypoints/cli.ts"],"names":[],"mappings":""}
@@ -0,0 +1,79 @@
1
+ import { resolve } from "node:path";
2
+ import { pathToFileURL } from "node:url";
3
+ import { existsSync } from "node:fs";
4
+ import {} from "plgg-bundle/domain/model/BundleConfig";
5
+ import { asBundleConfig } from "plgg-bundle/domain/usecase/asBundleConfig";
6
+ import { build } from "plgg-bundle/domain/usecase/build";
7
+ import { runDevServer } from "plgg-bundle/Dev/node/devServer";
8
+ /**
9
+ * CLI entry with two modes:
10
+ *
11
+ * - `plgg-bundle [config]` — the one-shot build (default):
12
+ * validate the config and emit the bundle.
13
+ * - `plgg-bundle dev [config]` — the dev server: serve the
14
+ * config's dev entry over node:http, watch its source,
15
+ * and hot-reload the browser on a code edit.
16
+ *
17
+ * The shell stays thin and is the single place a thrown
18
+ * error becomes a non-zero exit — the plain-TS counterpart
19
+ * to a `Result` edge. The `dev` server itself runs for the
20
+ * process lifetime (it never resolves).
21
+ */
22
+ const main = async () => process.argv[2] === "dev"
23
+ ? runDev(process.argv[3])
24
+ : runBuild(process.argv[2]);
25
+ /** The one-shot build mode. */
26
+ const runBuild = async (arg) => {
27
+ const config = await loadConfig(arg);
28
+ if (config === null) {
29
+ return;
30
+ }
31
+ const files = build(config);
32
+ process.stdout.write(`plgg-bundle: wrote ${files.length} file(s) to ${config.outDir}\n`);
33
+ };
34
+ /** The dev-server mode. */
35
+ const runDev = async (arg) => {
36
+ const config = await loadConfig(arg);
37
+ if (config === null) {
38
+ return;
39
+ }
40
+ const server = await runDevServer(config);
41
+ process.stdout.write(`plgg-bundle: dev server at ${server.url}\n`);
42
+ };
43
+ /**
44
+ * Resolve, import (Node strips its types), and validate
45
+ * the bundle config, or set a non-zero exit and return
46
+ * null when it is missing. Shared by both modes.
47
+ */
48
+ const loadConfig = async (arg) => {
49
+ const configPath = resolve(process.cwd(), arg ?? "bundle.config.ts");
50
+ if (!existsSync(configPath)) {
51
+ fail(`config not found: ${configPath}`);
52
+ return null;
53
+ }
54
+ const mod = await import(pathToFileURL(configPath).href);
55
+ return asBundleConfig(pickDefault(mod));
56
+ };
57
+ /**
58
+ * Extract a module's `default` export as `unknown`,
59
+ * tolerating a module that is itself the config.
60
+ */
61
+ const pickDefault = (mod) => typeof mod === "object" &&
62
+ mod !== null &&
63
+ "default" in mod
64
+ ? mod.default
65
+ : mod;
66
+ /**
67
+ * Print an error and set a non-zero exit code.
68
+ */
69
+ const fail = (message) => {
70
+ process.stderr.write(`plgg-bundle: ${message}\n`);
71
+ process.exitCode = 1;
72
+ };
73
+ try {
74
+ await main();
75
+ }
76
+ catch (e) {
77
+ fail(e instanceof Error ? e.message : String(e));
78
+ }
79
+ //# sourceMappingURL=cli.js.map