@pie-element/cli 0.1.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 (255) hide show
  1. package/.compatibility/report.json +2491 -0
  2. package/.turbo/turbo-build.log +1 -0
  3. package/CHANGELOG.md +8 -0
  4. package/README.md +240 -0
  5. package/REFACTORING.md +131 -0
  6. package/bin/dev.js +5 -0
  7. package/bin/run.js +5 -0
  8. package/dist/commands/dev/demo/index.d.ts +33 -0
  9. package/dist/commands/dev/demo/index.d.ts.map +1 -0
  10. package/dist/commands/dev/demo/index.js +274 -0
  11. package/dist/commands/dev/demo/index.js.map +1 -0
  12. package/dist/commands/dev/test-bundler.d.ts +18 -0
  13. package/dist/commands/dev/test-bundler.d.ts.map +1 -0
  14. package/dist/commands/dev/test-bundler.js +284 -0
  15. package/dist/commands/dev/test-bundler.js.map +1 -0
  16. package/dist/commands/mathquill/migrate.d.ts +20 -0
  17. package/dist/commands/mathquill/migrate.d.ts.map +1 -0
  18. package/dist/commands/mathquill/migrate.js +240 -0
  19. package/dist/commands/mathquill/migrate.js.map +1 -0
  20. package/dist/commands/mathquill/status.d.ts +20 -0
  21. package/dist/commands/mathquill/status.d.ts.map +1 -0
  22. package/dist/commands/mathquill/status.js +231 -0
  23. package/dist/commands/mathquill/status.js.map +1 -0
  24. package/dist/commands/packages/create-controllers.d.ts +13 -0
  25. package/dist/commands/packages/create-controllers.d.ts.map +1 -0
  26. package/dist/commands/packages/create-controllers.js +103 -0
  27. package/dist/commands/packages/create-controllers.js.map +1 -0
  28. package/dist/commands/packages/create-lib-react.d.ts +17 -0
  29. package/dist/commands/packages/create-lib-react.d.ts.map +1 -0
  30. package/dist/commands/packages/create-lib-react.js +228 -0
  31. package/dist/commands/packages/create-lib-react.js.map +1 -0
  32. package/dist/commands/packages/create-react-elements.d.ts +16 -0
  33. package/dist/commands/packages/create-react-elements.d.ts.map +1 -0
  34. package/dist/commands/packages/create-react-elements.js +259 -0
  35. package/dist/commands/packages/create-react-elements.js.map +1 -0
  36. package/dist/commands/packages/enable-publishing.d.ts +11 -0
  37. package/dist/commands/packages/enable-publishing.d.ts.map +1 -0
  38. package/dist/commands/packages/enable-publishing.js +117 -0
  39. package/dist/commands/packages/enable-publishing.js.map +1 -0
  40. package/dist/commands/packages/init-synced-elements.d.ts +16 -0
  41. package/dist/commands/packages/init-synced-elements.d.ts.map +1 -0
  42. package/dist/commands/packages/init-synced-elements.js +204 -0
  43. package/dist/commands/packages/init-synced-elements.js.map +1 -0
  44. package/dist/commands/upstream/analyze-esm.d.ts +59 -0
  45. package/dist/commands/upstream/analyze-esm.d.ts.map +1 -0
  46. package/dist/commands/upstream/analyze-esm.js +1481 -0
  47. package/dist/commands/upstream/analyze-esm.js.map +1 -0
  48. package/dist/commands/upstream/check.d.ts +15 -0
  49. package/dist/commands/upstream/check.d.ts.map +1 -0
  50. package/dist/commands/upstream/check.js +165 -0
  51. package/dist/commands/upstream/check.js.map +1 -0
  52. package/dist/commands/upstream/deps.d.ts +15 -0
  53. package/dist/commands/upstream/deps.d.ts.map +1 -0
  54. package/dist/commands/upstream/deps.js +174 -0
  55. package/dist/commands/upstream/deps.js.map +1 -0
  56. package/dist/commands/upstream/sync-mathquill.d.ts +12 -0
  57. package/dist/commands/upstream/sync-mathquill.d.ts.map +1 -0
  58. package/dist/commands/upstream/sync-mathquill.js +97 -0
  59. package/dist/commands/upstream/sync-mathquill.js.map +1 -0
  60. package/dist/commands/upstream/sync.d.ts +25 -0
  61. package/dist/commands/upstream/sync.d.ts.map +1 -0
  62. package/dist/commands/upstream/sync.js +552 -0
  63. package/dist/commands/upstream/sync.js.map +1 -0
  64. package/dist/commands/upstream/track.d.ts +15 -0
  65. package/dist/commands/upstream/track.d.ts.map +1 -0
  66. package/dist/commands/upstream/track.js +115 -0
  67. package/dist/commands/upstream/track.js.map +1 -0
  68. package/dist/commands/upstream/update.d.ts +15 -0
  69. package/dist/commands/upstream/update.d.ts.map +1 -0
  70. package/dist/commands/upstream/update.js +98 -0
  71. package/dist/commands/upstream/update.js.map +1 -0
  72. package/dist/commands/verify/controllers.d.ts +12 -0
  73. package/dist/commands/verify/controllers.d.ts.map +1 -0
  74. package/dist/commands/verify/controllers.js +138 -0
  75. package/dist/commands/verify/controllers.js.map +1 -0
  76. package/dist/commands/verify/react-build.d.ts +13 -0
  77. package/dist/commands/verify/react-build.d.ts.map +1 -0
  78. package/dist/commands/verify/react-build.js +135 -0
  79. package/dist/commands/verify/react-build.js.map +1 -0
  80. package/dist/index.d.ts +2 -0
  81. package/dist/index.d.ts.map +1 -0
  82. package/dist/index.js +2 -0
  83. package/dist/index.js.map +1 -0
  84. package/dist/lib/mathquill/extension-generator.d.ts +9 -0
  85. package/dist/lib/mathquill/extension-generator.d.ts.map +1 -0
  86. package/dist/lib/mathquill/extension-generator.js +107 -0
  87. package/dist/lib/mathquill/extension-generator.js.map +1 -0
  88. package/dist/lib/mathquill/khan-extractor.d.ts +16 -0
  89. package/dist/lib/mathquill/khan-extractor.d.ts.map +1 -0
  90. package/dist/lib/mathquill/khan-extractor.js +148 -0
  91. package/dist/lib/mathquill/khan-extractor.js.map +1 -0
  92. package/dist/lib/mathquill/learnosity-extractor.d.ts +15 -0
  93. package/dist/lib/mathquill/learnosity-extractor.d.ts.map +1 -0
  94. package/dist/lib/mathquill/learnosity-extractor.js +170 -0
  95. package/dist/lib/mathquill/learnosity-extractor.js.map +1 -0
  96. package/dist/lib/mathquill/migration-orchestrator.d.ts +77 -0
  97. package/dist/lib/mathquill/migration-orchestrator.d.ts.map +1 -0
  98. package/dist/lib/mathquill/migration-orchestrator.js +391 -0
  99. package/dist/lib/mathquill/migration-orchestrator.js.map +1 -0
  100. package/dist/lib/mathquill/package-updater.d.ts +9 -0
  101. package/dist/lib/mathquill/package-updater.d.ts.map +1 -0
  102. package/dist/lib/mathquill/package-updater.js +103 -0
  103. package/dist/lib/mathquill/package-updater.js.map +1 -0
  104. package/dist/lib/mathquill/pie-extractor.d.ts +14 -0
  105. package/dist/lib/mathquill/pie-extractor.d.ts.map +1 -0
  106. package/dist/lib/mathquill/pie-extractor.js +167 -0
  107. package/dist/lib/mathquill/pie-extractor.js.map +1 -0
  108. package/dist/lib/upstream/repo-utils.d.ts +9 -0
  109. package/dist/lib/upstream/repo-utils.d.ts.map +1 -0
  110. package/dist/lib/upstream/repo-utils.js +10 -0
  111. package/dist/lib/upstream/repo-utils.js.map +1 -0
  112. package/dist/lib/upstream/sync-compatibility.d.ts +29 -0
  113. package/dist/lib/upstream/sync-compatibility.d.ts.map +1 -0
  114. package/dist/lib/upstream/sync-compatibility.js +70 -0
  115. package/dist/lib/upstream/sync-compatibility.js.map +1 -0
  116. package/dist/lib/upstream/sync-constants.d.ts +50 -0
  117. package/dist/lib/upstream/sync-constants.d.ts.map +1 -0
  118. package/dist/lib/upstream/sync-constants.js +66 -0
  119. package/dist/lib/upstream/sync-constants.js.map +1 -0
  120. package/dist/lib/upstream/sync-controllers-strategy.d.ts +18 -0
  121. package/dist/lib/upstream/sync-controllers-strategy.d.ts.map +1 -0
  122. package/dist/lib/upstream/sync-controllers-strategy.js +243 -0
  123. package/dist/lib/upstream/sync-controllers-strategy.js.map +1 -0
  124. package/dist/lib/upstream/sync-demo-metadata.d.ts +15 -0
  125. package/dist/lib/upstream/sync-demo-metadata.d.ts.map +1 -0
  126. package/dist/lib/upstream/sync-demo-metadata.js +165 -0
  127. package/dist/lib/upstream/sync-demo-metadata.js.map +1 -0
  128. package/dist/lib/upstream/sync-dev-exports.d.ts +13 -0
  129. package/dist/lib/upstream/sync-dev-exports.d.ts.map +1 -0
  130. package/dist/lib/upstream/sync-dev-exports.js +115 -0
  131. package/dist/lib/upstream/sync-dev-exports.js.map +1 -0
  132. package/dist/lib/upstream/sync-externals.d.ts +29 -0
  133. package/dist/lib/upstream/sync-externals.d.ts.map +1 -0
  134. package/dist/lib/upstream/sync-externals.js +164 -0
  135. package/dist/lib/upstream/sync-externals.js.map +1 -0
  136. package/dist/lib/upstream/sync-filesystem.d.ts +21 -0
  137. package/dist/lib/upstream/sync-filesystem.d.ts.map +1 -0
  138. package/dist/lib/upstream/sync-filesystem.js +64 -0
  139. package/dist/lib/upstream/sync-filesystem.js.map +1 -0
  140. package/dist/lib/upstream/sync-imports.d.ts +284 -0
  141. package/dist/lib/upstream/sync-imports.d.ts.map +1 -0
  142. package/dist/lib/upstream/sync-imports.js +816 -0
  143. package/dist/lib/upstream/sync-imports.js.map +1 -0
  144. package/dist/lib/upstream/sync-mathquill.d.ts +19 -0
  145. package/dist/lib/upstream/sync-mathquill.d.ts.map +1 -0
  146. package/dist/lib/upstream/sync-mathquill.js +160 -0
  147. package/dist/lib/upstream/sync-mathquill.js.map +1 -0
  148. package/dist/lib/upstream/sync-package-json.d.ts +28 -0
  149. package/dist/lib/upstream/sync-package-json.d.ts.map +1 -0
  150. package/dist/lib/upstream/sync-package-json.js +66 -0
  151. package/dist/lib/upstream/sync-package-json.js.map +1 -0
  152. package/dist/lib/upstream/sync-package-manager.d.ts +50 -0
  153. package/dist/lib/upstream/sync-package-manager.d.ts.map +1 -0
  154. package/dist/lib/upstream/sync-package-manager.js +570 -0
  155. package/dist/lib/upstream/sync-package-manager.js.map +1 -0
  156. package/dist/lib/upstream/sync-pielib-strategy.d.ts +26 -0
  157. package/dist/lib/upstream/sync-pielib-strategy.d.ts.map +1 -0
  158. package/dist/lib/upstream/sync-pielib-strategy.js +345 -0
  159. package/dist/lib/upstream/sync-pielib-strategy.js.map +1 -0
  160. package/dist/lib/upstream/sync-react-strategy.d.ts +54 -0
  161. package/dist/lib/upstream/sync-react-strategy.d.ts.map +1 -0
  162. package/dist/lib/upstream/sync-react-strategy.js +733 -0
  163. package/dist/lib/upstream/sync-react-strategy.js.map +1 -0
  164. package/dist/lib/upstream/sync-strategy.d.ts +49 -0
  165. package/dist/lib/upstream/sync-strategy.d.ts.map +1 -0
  166. package/dist/lib/upstream/sync-strategy.js +2 -0
  167. package/dist/lib/upstream/sync-strategy.js.map +1 -0
  168. package/dist/lib/upstream/sync-summary.d.ts +20 -0
  169. package/dist/lib/upstream/sync-summary.d.ts.map +1 -0
  170. package/dist/lib/upstream/sync-summary.js +157 -0
  171. package/dist/lib/upstream/sync-summary.js.map +1 -0
  172. package/dist/lib/upstream/sync-transforms.d.ts +60 -0
  173. package/dist/lib/upstream/sync-transforms.d.ts.map +1 -0
  174. package/dist/lib/upstream/sync-transforms.js +97 -0
  175. package/dist/lib/upstream/sync-transforms.js.map +1 -0
  176. package/dist/lib/upstream/sync-vite-config.d.ts +13 -0
  177. package/dist/lib/upstream/sync-vite-config.d.ts.map +1 -0
  178. package/dist/lib/upstream/sync-vite-config.js +231 -0
  179. package/dist/lib/upstream/sync-vite-config.js.map +1 -0
  180. package/dist/utils/compatibility.d.ts +129 -0
  181. package/dist/utils/compatibility.d.ts.map +1 -0
  182. package/dist/utils/compatibility.js +44 -0
  183. package/dist/utils/compatibility.js.map +1 -0
  184. package/dist/utils/conversion.d.ts +25 -0
  185. package/dist/utils/conversion.d.ts.map +1 -0
  186. package/dist/utils/conversion.js +123 -0
  187. package/dist/utils/conversion.js.map +1 -0
  188. package/dist/utils/git.d.ts +7 -0
  189. package/dist/utils/git.d.ts.map +1 -0
  190. package/dist/utils/git.js +63 -0
  191. package/dist/utils/git.js.map +1 -0
  192. package/dist/utils/logger.d.ts +29 -0
  193. package/dist/utils/logger.d.ts.map +1 -0
  194. package/dist/utils/logger.js +63 -0
  195. package/dist/utils/logger.js.map +1 -0
  196. package/dist/utils/package-json.d.ts +12 -0
  197. package/dist/utils/package-json.d.ts.map +1 -0
  198. package/dist/utils/package-json.js +29 -0
  199. package/dist/utils/package-json.js.map +1 -0
  200. package/package.json +59 -0
  201. package/packages/cli/bin/dev.js +5 -0
  202. package/packages/cli/bin/run.js +5 -0
  203. package/src/commands/dev/demo/index.ts +313 -0
  204. package/src/commands/dev/test-bundler.ts +345 -0
  205. package/src/commands/mathquill/migrate.ts +269 -0
  206. package/src/commands/mathquill/status.ts +267 -0
  207. package/src/commands/packages/create-controllers.ts +127 -0
  208. package/src/commands/packages/create-lib-react.ts +279 -0
  209. package/src/commands/packages/create-react-elements.ts +306 -0
  210. package/src/commands/packages/enable-publishing.ts +161 -0
  211. package/src/commands/packages/init-synced-elements.ts +259 -0
  212. package/src/commands/upstream/README.md +444 -0
  213. package/src/commands/upstream/analyze-esm.ts +1973 -0
  214. package/src/commands/upstream/check.ts +228 -0
  215. package/src/commands/upstream/deps.ts +222 -0
  216. package/src/commands/upstream/sync-mathquill.ts +108 -0
  217. package/src/commands/upstream/sync.ts +687 -0
  218. package/src/commands/upstream/track.ts +145 -0
  219. package/src/commands/upstream/update.ts +110 -0
  220. package/src/commands/verify/controllers.ts +166 -0
  221. package/src/commands/verify/react-build.ts +171 -0
  222. package/src/index.ts +1 -0
  223. package/src/lib/mathquill/extension-generator.ts +111 -0
  224. package/src/lib/mathquill/khan-extractor.ts +175 -0
  225. package/src/lib/mathquill/learnosity-extractor.ts +198 -0
  226. package/src/lib/mathquill/migration-orchestrator.ts +513 -0
  227. package/src/lib/mathquill/package-updater.ts +120 -0
  228. package/src/lib/mathquill/pie-extractor.ts +194 -0
  229. package/src/lib/upstream/repo-utils.ts +18 -0
  230. package/src/lib/upstream/sync-compatibility.ts +89 -0
  231. package/src/lib/upstream/sync-constants.ts +77 -0
  232. package/src/lib/upstream/sync-controllers-strategy.ts +291 -0
  233. package/src/lib/upstream/sync-demo-metadata.ts +199 -0
  234. package/src/lib/upstream/sync-dev-exports.ts +151 -0
  235. package/src/lib/upstream/sync-externals.ts +159 -0
  236. package/src/lib/upstream/sync-filesystem.ts +87 -0
  237. package/src/lib/upstream/sync-imports.ts +992 -0
  238. package/src/lib/upstream/sync-mathquill.ts +194 -0
  239. package/src/lib/upstream/sync-package-json.ts +86 -0
  240. package/src/lib/upstream/sync-package-manager.ts +694 -0
  241. package/src/lib/upstream/sync-pielib-strategy.ts +441 -0
  242. package/src/lib/upstream/sync-react-strategy.ts +945 -0
  243. package/src/lib/upstream/sync-strategy.ts +61 -0
  244. package/src/lib/upstream/sync-summary.ts +194 -0
  245. package/src/lib/upstream/sync-transforms.ts +154 -0
  246. package/src/lib/upstream/sync-vite-config.ts +243 -0
  247. package/src/types/es-module-lexer.d.ts +4 -0
  248. package/src/utils/compatibility.ts +182 -0
  249. package/src/utils/conversion.ts +153 -0
  250. package/src/utils/git.ts +63 -0
  251. package/src/utils/logger.ts +69 -0
  252. package/src/utils/package-json.ts +43 -0
  253. package/tests/sync-package-manager.test.ts +112 -0
  254. package/tests/transform-assign-props.test.ts +101 -0
  255. package/tsconfig.json +15 -0
@@ -0,0 +1,29 @@
1
+ export declare class Logger {
2
+ private verbose;
3
+ constructor(verbose?: boolean);
4
+ isVerbose(): boolean;
5
+ info(message: string): void;
6
+ debug(message: string): void;
7
+ warn(message: string): void;
8
+ error(message: string): void;
9
+ success(message: string): void;
10
+ section(title: string): void;
11
+ /**
12
+ * Show a progress message (only in verbose mode)
13
+ * In non-verbose mode, use progressStart/progressComplete instead
14
+ */
15
+ progress(message: string): void;
16
+ /**
17
+ * Show start of an operation (always shown)
18
+ */
19
+ progressStart(message: string): void;
20
+ /**
21
+ * Complete a progress operation with success
22
+ */
23
+ progressComplete(details?: string): void;
24
+ /**
25
+ * Complete a progress operation with a count
26
+ */
27
+ progressCompleteWithCount(count: number, label: string): void;
28
+ }
29
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,qBAAa,MAAM;IACL,OAAO,CAAC,OAAO;gBAAP,OAAO,GAAE,OAAe;IAE5C,SAAS,IAAI,OAAO;IAIpB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI5B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9B,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK5B;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM/B;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIpC;;OAEG;IACH,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAQxC;;OAEG;IACH,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;CAG9D"}
@@ -0,0 +1,63 @@
1
+ export class Logger {
2
+ verbose;
3
+ constructor(verbose = false) {
4
+ this.verbose = verbose;
5
+ }
6
+ isVerbose() {
7
+ return this.verbose;
8
+ }
9
+ info(message) {
10
+ console.log(message);
11
+ }
12
+ debug(message) {
13
+ if (this.verbose) {
14
+ console.log(message);
15
+ }
16
+ }
17
+ warn(message) {
18
+ console.warn(`⚠️ ${message}`);
19
+ }
20
+ error(message) {
21
+ console.error(`❌ ${message}`);
22
+ }
23
+ success(message) {
24
+ console.log(`✅ ${message}`);
25
+ }
26
+ section(title) {
27
+ console.log(`\n${title}`);
28
+ console.log('='.repeat(title.length));
29
+ }
30
+ /**
31
+ * Show a progress message (only in verbose mode)
32
+ * In non-verbose mode, use progressStart/progressComplete instead
33
+ */
34
+ progress(message) {
35
+ if (this.verbose) {
36
+ console.log(` ${message}`);
37
+ }
38
+ }
39
+ /**
40
+ * Show start of an operation (always shown)
41
+ */
42
+ progressStart(message) {
43
+ process.stdout.write(message);
44
+ }
45
+ /**
46
+ * Complete a progress operation with success
47
+ */
48
+ progressComplete(details) {
49
+ if (details) {
50
+ console.log(` ✓ ${details}`);
51
+ }
52
+ else {
53
+ console.log(' ✓');
54
+ }
55
+ }
56
+ /**
57
+ * Complete a progress operation with a count
58
+ */
59
+ progressCompleteWithCount(count, label) {
60
+ console.log(` ✓ (${count} ${label})`);
61
+ }
62
+ }
63
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,MAAM;IACG;IAApB,YAAoB,UAAmB,KAAK;QAAxB,YAAO,GAAP,OAAO,CAAiB;IAAG,CAAC;IAEhD,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,IAAI,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,CAAC,KAAa;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACxC,CAAC;IAED;;;OAGG;IACH,QAAQ,CAAC,OAAe;QACtB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,OAAe;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,OAAgB;QAC/B,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,yBAAyB,CAAC,KAAa,EAAE,KAAa;QACpD,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,IAAI,KAAK,GAAG,CAAC,CAAC;IACxC,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ export interface PackageJson {
2
+ name: string;
3
+ version: string;
4
+ private?: boolean;
5
+ dependencies?: Record<string, string>;
6
+ devDependencies?: Record<string, string>;
7
+ [key: string]: unknown;
8
+ }
9
+ export declare function loadPackageJson(path: string): Promise<PackageJson>;
10
+ export declare function writePackageJson(path: string, pkg: PackageJson): Promise<void>;
11
+ export declare function extractDependencies(content: string): string[];
12
+ //# sourceMappingURL=package-json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-json.d.ts","sourceRoot":"","sources":["../../src/utils/package-json.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAGxE;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAGpF;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAqB7D"}
@@ -0,0 +1,29 @@
1
+ import { readFile, writeFile } from 'node:fs/promises';
2
+ export async function loadPackageJson(path) {
3
+ const content = await readFile(path, 'utf-8');
4
+ return JSON.parse(content);
5
+ }
6
+ export async function writePackageJson(path, pkg) {
7
+ const content = `${JSON.stringify(pkg, null, 2)}\n`;
8
+ await writeFile(path, content, 'utf-8');
9
+ }
10
+ export function extractDependencies(content) {
11
+ const deps = new Set();
12
+ // Match import statements
13
+ const importRegex = /import\s+.+\s+from\s+['"]([^'"]+)['"]/g;
14
+ let match = importRegex.exec(content);
15
+ while (match !== null) {
16
+ const dep = match[1];
17
+ // Skip relative imports
18
+ if (!dep.startsWith('.') && !dep.startsWith('/')) {
19
+ // Extract package name (handle scoped packages)
20
+ const pkgName = dep.startsWith('@')
21
+ ? dep.split('/').slice(0, 2).join('/')
22
+ : dep.split('/')[0];
23
+ deps.add(pkgName);
24
+ }
25
+ match = importRegex.exec(content);
26
+ }
27
+ return Array.from(deps).sort();
28
+ }
29
+ //# sourceMappingURL=package-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-json.js","sourceRoot":"","sources":["../../src/utils/package-json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAWvD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY;IAChD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAgB,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,GAAgB;IACnE,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IACpD,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,0BAA0B;IAC1B,MAAM,WAAW,GAAG,wCAAwC,CAAC;IAC7D,IAAI,KAAK,GAA2B,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAE9D,OAAO,KAAK,KAAK,IAAI,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,wBAAwB;QACxB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACjD,gDAAgD;YAChD,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;gBACjC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBACtC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC;QACD,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AACjC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@pie-element/cli",
3
+ "version": "0.1.1",
4
+ "description": "CLI tools for managing PIE Elements NG",
5
+ "type": "module",
6
+ "bin": {
7
+ "pie-cli": "./bin/run.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "exports": {
11
+ ".": "./dist/index.js"
12
+ },
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "dev": "node ./bin/dev.js",
16
+ "lint": "biome check ."
17
+ },
18
+ "dependencies": {
19
+ "@oclif/core": "^4.0.0",
20
+ "@oclif/plugin-help": "^6.2.0",
21
+ "@pie-element/bundler-shared": "workspace:*",
22
+ "es-module-lexer": "^1.7.0",
23
+ "glob": "^13.0.0",
24
+ "open": "^10.0.3",
25
+ "webpack": "^5.104.1"
26
+ },
27
+ "devDependencies": {
28
+ "@types/node": "^25.0.3",
29
+ "bun-types": "^1.3.5",
30
+ "typescript": "^5.9.3"
31
+ },
32
+ "oclif": {
33
+ "bin": "pie-cli",
34
+ "dirname": "pie-cli",
35
+ "commands": "./dist/commands",
36
+ "topicSeparator": ":",
37
+ "topics": {
38
+ "dev": {
39
+ "description": "Development server and tools"
40
+ },
41
+ "upstream": {
42
+ "description": "Manage synchronization with upstream pie-elements repository"
43
+ },
44
+ "packages": {
45
+ "description": "Generate and manage package configurations"
46
+ },
47
+ "verify": {
48
+ "description": "Verify builds and configurations"
49
+ },
50
+ "mathquill": {
51
+ "description": "MathQuill migration and management"
52
+ }
53
+ }
54
+ },
55
+ "engines": {
56
+ "node": ">=20.0.0"
57
+ },
58
+ "license": "MIT"
59
+ }
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { execute } from '@oclif/core';
4
+
5
+ await execute({ development: true, dir: import.meta.url });
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { execute } from '@oclif/core';
4
+
5
+ await execute({ development: false, dir: import.meta.url });
@@ -0,0 +1,313 @@
1
+ import { Command, Flags } from '@oclif/core';
2
+ import { spawn, type ChildProcess } from 'node:child_process';
3
+ import path from 'node:path';
4
+ import { existsSync, readFileSync, rmSync, unlinkSync, writeFileSync } from 'node:fs';
5
+ import { tmpdir } from 'node:os';
6
+
7
+ /**
8
+ * Start unified demo application for all PIE elements.
9
+ *
10
+ * This command starts the apps/element-demo SvelteKit application which provides
11
+ * a unified demo experience for all 27 PIE elements with multiple demo configurations.
12
+ */
13
+ export default class DevDemo extends Command {
14
+ static override description = 'Start unified demo app for all PIE elements (apps/element-demo)';
15
+
16
+ static override examples = [
17
+ '<%= config.bin %> <%= command.id %>',
18
+ '<%= config.bin %> <%= command.id %> --port 5180',
19
+ '<%= config.bin %> <%= command.id %> --open',
20
+ '<%= config.bin %> <%= command.id %> --build',
21
+ ];
22
+
23
+ static override flags = {
24
+ port: Flags.integer({
25
+ char: 'p',
26
+ description: 'Vite dev server port',
27
+ default: 5222,
28
+ }),
29
+ build: Flags.boolean({
30
+ char: 'b',
31
+ description: 'Build all elements before starting',
32
+ default: false,
33
+ }),
34
+ open: Flags.boolean({
35
+ char: 'o',
36
+ description: 'Open browser automatically',
37
+ default: false,
38
+ allowNo: true,
39
+ }),
40
+ };
41
+
42
+ static override args = {};
43
+
44
+ private viteProcess: ChildProcess | null = null;
45
+ private lockFilePath = '';
46
+ private bundlerInstanceDir = '';
47
+
48
+ public async run(): Promise<void> {
49
+ const { flags } = await this.parse(DevDemo);
50
+
51
+ // Find monorepo root - check if we're already at root or need to traverse up
52
+ let monorepoRoot = process.cwd();
53
+ const rootPackageJson = path.join(monorepoRoot, 'package.json');
54
+
55
+ // If package.json doesn't exist at current level, we're in a subdirectory (like tools/cli)
56
+ // Traverse up to find the root
57
+ if (!existsSync(rootPackageJson) || !existsSync(path.join(monorepoRoot, 'apps'))) {
58
+ monorepoRoot = path.resolve(monorepoRoot, '../..');
59
+ }
60
+
61
+ const demoAppPath = path.join(monorepoRoot, 'apps', 'element-demo');
62
+
63
+ this.lockFilePath = this.getLockFilePath(flags.port);
64
+ this.acquireLock(flags.port);
65
+ this.bundlerInstanceDir = this.createBundlerInstanceDir(flags.port);
66
+
67
+ this.log('Starting unified demo app for all PIE elements...');
68
+ this.log('');
69
+ this.log('Bundler mode: local (default)');
70
+ this.log(`Bundler workspace: ${this.bundlerInstanceDir}`);
71
+ this.log('');
72
+
73
+ try {
74
+ // 1. Build all elements if requested
75
+ if (flags.build) {
76
+ this.log('Building all React elements...');
77
+ await this.buildAllElements(monorepoRoot);
78
+ }
79
+
80
+ // 2. Install workspace dependencies (only if building)
81
+ if (flags.build) {
82
+ this.log('Installing workspace dependencies...');
83
+ await this.installDependencies(monorepoRoot);
84
+ this.log('✓ Dependencies installed\n');
85
+ }
86
+
87
+ // 3. Start Vite dev server
88
+ this.log(`Starting Vite dev server on port ${flags.port}...`);
89
+ if (!existsSync(demoAppPath)) {
90
+ this.error(`Demo app not found at ${demoAppPath}`);
91
+ }
92
+ this.viteProcess = await this.startVite(demoAppPath, flags.port, {
93
+ DEMO_BUNDLER_INSTANCE_DIR: this.bundlerInstanceDir,
94
+ });
95
+
96
+ // 4. Open browser
97
+ if (flags.open) {
98
+ await this.sleep(3000); // Wait for Vite to start
99
+ const url = `http://localhost:${flags.port}`;
100
+ this.log(`Opening ${url}...`);
101
+ await this.openBrowser(url);
102
+ }
103
+
104
+ this.log('');
105
+ this.log('✓ Demo app running');
106
+ this.log(` URL: http://localhost:${flags.port}`);
107
+ this.log('');
108
+ if (!flags.build) {
109
+ this.log('ℹ️ Running without rebuild. Use --build to rebuild all elements first.');
110
+ this.log('');
111
+ }
112
+ this.log('📖 The demo app showcases all 27 PIE elements with multiple demos');
113
+ this.log(' Navigate to any element to see available demo configurations');
114
+ this.log('');
115
+ this.log('Press Ctrl+C to stop');
116
+
117
+ // 7. Handle graceful shutdown
118
+ process.on('SIGINT', () => {
119
+ this.log('\nShutting down...');
120
+ this.cleanup();
121
+ process.exit(0);
122
+ });
123
+
124
+ process.on('SIGTERM', () => {
125
+ this.cleanup();
126
+ process.exit(0);
127
+ });
128
+
129
+ // Keep process alive
130
+ await new Promise(() => {});
131
+ } catch (error) {
132
+ this.cleanup();
133
+ throw error;
134
+ }
135
+ }
136
+
137
+ private async buildAllElements(cwd: string): Promise<void> {
138
+ return new Promise((resolve, reject) => {
139
+ const build = spawn(
140
+ 'bun',
141
+ [
142
+ 'run',
143
+ 'turbo',
144
+ 'build',
145
+ '--force',
146
+ '--filter',
147
+ './packages/elements-react/*',
148
+ '--filter',
149
+ './packages/elements-svelte/*',
150
+ ],
151
+ {
152
+ stdio: 'inherit',
153
+ cwd,
154
+ }
155
+ );
156
+
157
+ build.on('close', (code) => {
158
+ if (code === 0) {
159
+ this.log('✓ All elements built\n');
160
+ resolve();
161
+ } else {
162
+ reject(new Error(`Build failed with code ${code}`));
163
+ }
164
+ });
165
+
166
+ build.on('error', reject);
167
+ });
168
+ }
169
+
170
+ private async startVite(
171
+ demoPath: string,
172
+ port: number,
173
+ env: Record<string, string>
174
+ ): Promise<ChildProcess> {
175
+ const proc = spawn('bunx', ['vite', '--port', port.toString(), '--host'], {
176
+ cwd: demoPath,
177
+ stdio: 'inherit',
178
+ env: {
179
+ ...process.env,
180
+ PORT: port.toString(),
181
+ ...env,
182
+ },
183
+ });
184
+
185
+ proc.on('error', (error) => {
186
+ this.error(`Failed to start Vite: ${error.message}`);
187
+ });
188
+
189
+ return proc;
190
+ }
191
+
192
+ private async openBrowser(url: string): Promise<void> {
193
+ try {
194
+ const open = await import('open');
195
+ await open.default(url);
196
+ } catch (error) {
197
+ this.warn(`Could not open browser: ${error}`);
198
+ this.log(`Please open ${url} manually`);
199
+ }
200
+ }
201
+
202
+ private async installDependencies(cwd: string): Promise<void> {
203
+ return new Promise((resolve, reject) => {
204
+ const install = spawn('bun', ['install'], {
205
+ cwd, // Run from monorepo root to resolve all workspaces
206
+ stdio: 'inherit',
207
+ });
208
+
209
+ install.on('close', (code) => {
210
+ if (code === 0) {
211
+ resolve();
212
+ } else {
213
+ reject(new Error(`Dependency installation failed with code ${code}`));
214
+ }
215
+ });
216
+
217
+ install.on('error', reject);
218
+ });
219
+ }
220
+
221
+ private cleanup(): void {
222
+ if (this.viteProcess) {
223
+ try {
224
+ this.viteProcess.kill('SIGTERM');
225
+ } catch (error) {
226
+ // Ignore errors during cleanup
227
+ }
228
+ this.viteProcess = null;
229
+ }
230
+
231
+ if (this.bundlerInstanceDir) {
232
+ try {
233
+ rmSync(this.bundlerInstanceDir, { recursive: true, force: true });
234
+ } catch {
235
+ // Ignore cleanup errors.
236
+ }
237
+ this.bundlerInstanceDir = '';
238
+ }
239
+
240
+ this.releaseLock();
241
+ }
242
+
243
+ private sleep(ms: number): Promise<void> {
244
+ return new Promise((resolve) => setTimeout(resolve, ms));
245
+ }
246
+
247
+ private acquireLock(port: number): void {
248
+ if (existsSync(this.lockFilePath)) {
249
+ try {
250
+ const raw = readFileSync(this.lockFilePath, 'utf-8');
251
+ const lock = JSON.parse(raw);
252
+ if (lock?.pid && this.isProcessRunning(lock.pid)) {
253
+ this.error(
254
+ `A demo server is already running (port: ${lock.port ?? 'unknown'}, pid: ${
255
+ lock.pid
256
+ }). Stop it or use --port to run on a different port.`
257
+ );
258
+ }
259
+ } catch (error) {
260
+ // If the lock is unreadable, remove it and continue.
261
+ }
262
+
263
+ try {
264
+ unlinkSync(this.lockFilePath);
265
+ } catch {
266
+ // Ignore cleanup errors.
267
+ }
268
+ }
269
+
270
+ const lockInfo = {
271
+ pid: process.pid,
272
+ port,
273
+ startedAt: new Date().toISOString(),
274
+ };
275
+ writeFileSync(this.lockFilePath, `${JSON.stringify(lockInfo, null, 2)}\n`);
276
+ }
277
+
278
+ private getLockFilePath(port: number): string {
279
+ return path.join(process.cwd(), `.demo-server.${port}.lock`);
280
+ }
281
+
282
+ private createBundlerInstanceDir(port: number): string {
283
+ // New run => new temp dir, so local cache is fresh after every restart.
284
+ const instanceId = `demo-${port}-${process.pid}-${Date.now()}`;
285
+ return path.join(tmpdir(), 'pie-element-demo-bundler', instanceId);
286
+ }
287
+
288
+ private releaseLock(): void {
289
+ if (!existsSync(this.lockFilePath)) return;
290
+ try {
291
+ const raw = readFileSync(this.lockFilePath, 'utf-8');
292
+ const lock = JSON.parse(raw);
293
+ if (lock?.pid !== process.pid) return;
294
+ } catch {
295
+ // If parsing fails, still attempt to remove stale lock.
296
+ }
297
+
298
+ try {
299
+ unlinkSync(this.lockFilePath);
300
+ } catch {
301
+ // Ignore cleanup errors.
302
+ }
303
+ }
304
+
305
+ private isProcessRunning(pid: number): boolean {
306
+ try {
307
+ process.kill(pid, 0);
308
+ return true;
309
+ } catch {
310
+ return false;
311
+ }
312
+ }
313
+ }