balm-core 5.2.0 → 6.0.0-alpha.0

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 (299) hide show
  1. package/dist/index.cjs +2191 -0
  2. package/dist/index.cjs.map +1 -0
  3. package/dist/index.d.cts +559 -0
  4. package/dist/index.d.ts +559 -0
  5. package/dist/index.js +2098 -0
  6. package/dist/index.js.map +1 -0
  7. package/package.json +48 -123
  8. package/src/balm.ts +103 -0
  9. package/src/bundler/esbuild.ts +47 -0
  10. package/src/bundler/index.ts +3 -0
  11. package/src/bundler/rollup.ts +39 -0
  12. package/src/bundler/webpack.ts +82 -0
  13. package/src/config/constants.ts +12 -0
  14. package/src/config/defaults.ts +209 -0
  15. package/src/config/index.ts +112 -0
  16. package/src/hooks/index.ts +192 -0
  17. package/src/index.ts +16 -0
  18. package/src/pipeline/file.ts +69 -0
  19. package/src/pipeline/index.ts +10 -0
  20. package/src/pipeline/pipeline.ts +132 -0
  21. package/src/pipeline/transforms/cache.ts +96 -0
  22. package/src/pipeline/transforms/htmlmin.ts +18 -0
  23. package/src/pipeline/transforms/less.ts +75 -0
  24. package/src/pipeline/transforms/postcss.ts +43 -0
  25. package/src/pipeline/transforms/rename.ts +37 -0
  26. package/src/pipeline/transforms/replace.ts +30 -0
  27. package/src/pipeline/transforms/sass.ts +106 -0
  28. package/src/pipeline/transforms/terser.ts +20 -0
  29. package/src/runner/dag.ts +77 -0
  30. package/src/runner/task.ts +38 -0
  31. package/src/shims.d.ts +5 -0
  32. package/src/tasks/cache.ts +58 -0
  33. package/src/tasks/clean.ts +21 -0
  34. package/src/tasks/copy.ts +36 -0
  35. package/src/tasks/ftp.ts +90 -0
  36. package/src/tasks/html.ts +78 -0
  37. package/src/tasks/index.ts +13 -0
  38. package/src/tasks/publish.ts +71 -0
  39. package/src/tasks/pwa.ts +49 -0
  40. package/src/tasks/remove.ts +24 -0
  41. package/src/tasks/replace.ts +34 -0
  42. package/src/tasks/script.ts +28 -0
  43. package/src/tasks/server.ts +89 -0
  44. package/src/tasks/style.ts +57 -0
  45. package/src/tasks/zip.ts +65 -0
  46. package/src/types/index.ts +200 -0
  47. package/src/utilities/file.ts +120 -0
  48. package/src/utilities/logger.ts +63 -0
  49. package/src/utilities/utils.ts +46 -0
  50. package/src/utilities/workspace.ts +38 -0
  51. package/src/watcher/index.ts +100 -0
  52. package/tsconfig.json +8 -0
  53. package/tsup.config.ts +12 -0
  54. package/README.md +0 -196
  55. package/index.d.ts +0 -360
  56. package/lib/balm.js +0 -49
  57. package/lib/bootstrap/check_config.js +0 -43
  58. package/lib/bootstrap/index.js +0 -87
  59. package/lib/bundler/esbuild/build.js +0 -26
  60. package/lib/bundler/esbuild/index.js +0 -7
  61. package/lib/bundler/esbuild/options.js +0 -7
  62. package/lib/bundler/esbuild/transform.js +0 -36
  63. package/lib/bundler/rollup/build.js +0 -52
  64. package/lib/bundler/rollup/entry.js +0 -28
  65. package/lib/bundler/rollup/index.js +0 -20
  66. package/lib/bundler/rollup/output.js +0 -20
  67. package/lib/bundler/rollup/plugins.js +0 -31
  68. package/lib/bundler/webpack/config/common.js +0 -135
  69. package/lib/bundler/webpack/config/dev.js +0 -12
  70. package/lib/bundler/webpack/config/env.js +0 -67
  71. package/lib/bundler/webpack/config/index.js +0 -6
  72. package/lib/bundler/webpack/config/prod.js +0 -39
  73. package/lib/bundler/webpack/config/regex.js +0 -10
  74. package/lib/bundler/webpack/entry.js +0 -65
  75. package/lib/bundler/webpack/index.js +0 -32
  76. package/lib/bundler/webpack/loaders.js +0 -50
  77. package/lib/bundler/webpack/output.js +0 -41
  78. package/lib/bundler/webpack/rules/asset.js +0 -33
  79. package/lib/bundler/webpack/rules/babel.js +0 -19
  80. package/lib/bundler/webpack/rules/css.js +0 -109
  81. package/lib/bundler/webpack/rules/html.js +0 -15
  82. package/lib/bundler/webpack/rules/index.js +0 -10
  83. package/lib/config/assets.js +0 -30
  84. package/lib/config/constants.js +0 -14
  85. package/lib/config/env.js +0 -35
  86. package/lib/config/extras.js +0 -6
  87. package/lib/config/ftp.js +0 -6
  88. package/lib/config/globals.js +0 -43
  89. package/lib/config/html.js +0 -22
  90. package/lib/config/images.js +0 -4
  91. package/lib/config/index.js +0 -63
  92. package/lib/config/logs.js +0 -11
  93. package/lib/config/paths.js +0 -46
  94. package/lib/config/pwa.js +0 -24
  95. package/lib/config/roots.js +0 -9
  96. package/lib/config/scripts.js +0 -162
  97. package/lib/config/server.js +0 -84
  98. package/lib/config/spinner.js +0 -9
  99. package/lib/config/styles.js +0 -67
  100. package/lib/hello.js +0 -19
  101. package/lib/hooks/index.js +0 -94
  102. package/lib/hooks/maker.js +0 -59
  103. package/lib/index.js +0 -5
  104. package/lib/middlewares/history.js +0 -6
  105. package/lib/middlewares/index.js +0 -11
  106. package/lib/middlewares/proxy.js +0 -28
  107. package/lib/middlewares/webpack.js +0 -26
  108. package/lib/plugins/htmlmin.js +0 -39
  109. package/lib/plugins/imagemin.js +0 -95
  110. package/lib/plugins/index.js +0 -27
  111. package/lib/plugins/jsmin.js +0 -37
  112. package/lib/plugins/less.js +0 -97
  113. package/lib/plugins/plumber.js +0 -87
  114. package/lib/plugins/postcss-plugins.js +0 -13
  115. package/lib/plugins/postcss.js +0 -117
  116. package/lib/plugins/rename.js +0 -51
  117. package/lib/plugins/replace.js +0 -91
  118. package/lib/plugins/sass-legacy.js +0 -131
  119. package/lib/plugins/sass.js +0 -134
  120. package/lib/plugins/sftp.js +0 -288
  121. package/lib/tasks/default.js +0 -46
  122. package/lib/tasks/foundation/balm.js +0 -72
  123. package/lib/tasks/foundation/balm_style.js +0 -65
  124. package/lib/tasks/foundation/index.js +0 -10
  125. package/lib/tasks/index.js +0 -48
  126. package/lib/tasks/private/build.js +0 -18
  127. package/lib/tasks/private/cache.js +0 -31
  128. package/lib/tasks/private/clean.js +0 -69
  129. package/lib/tasks/private/end.js +0 -24
  130. package/lib/tasks/private/extra.js +0 -35
  131. package/lib/tasks/private/font.js +0 -15
  132. package/lib/tasks/private/image.js +0 -37
  133. package/lib/tasks/private/index.js +0 -34
  134. package/lib/tasks/private/lint.js +0 -20
  135. package/lib/tasks/private/media.js +0 -15
  136. package/lib/tasks/private/modernizr.js +0 -59
  137. package/lib/tasks/private/pwa-cache.js +0 -32
  138. package/lib/tasks/private/script.js +0 -9
  139. package/lib/tasks/private/sprite.js +0 -105
  140. package/lib/tasks/private/start.js +0 -16
  141. package/lib/tasks/private/style.js +0 -9
  142. package/lib/tasks/private/workbox-sw.js +0 -15
  143. package/lib/tasks/public/copy.js +0 -16
  144. package/lib/tasks/public/esbuild.js +0 -18
  145. package/lib/tasks/public/ftp.js +0 -39
  146. package/lib/tasks/public/html.js +0 -65
  147. package/lib/tasks/public/index.js +0 -38
  148. package/lib/tasks/public/jsmin.js +0 -23
  149. package/lib/tasks/public/less.js +0 -21
  150. package/lib/tasks/public/postcss.js +0 -16
  151. package/lib/tasks/public/publish.js +0 -51
  152. package/lib/tasks/public/pwa.js +0 -84
  153. package/lib/tasks/public/remove.js +0 -46
  154. package/lib/tasks/public/replace.js +0 -26
  155. package/lib/tasks/public/rollup.js +0 -17
  156. package/lib/tasks/public/sass.js +0 -27
  157. package/lib/tasks/public/server.js +0 -130
  158. package/lib/tasks/public/url.js +0 -35
  159. package/lib/tasks/public/version.js +0 -23
  160. package/lib/tasks/public/webpack.js +0 -39
  161. package/lib/tasks/public/zip.js +0 -19
  162. package/lib/utilities/address.js +0 -55
  163. package/lib/utilities/cache-core.js +0 -66
  164. package/lib/utilities/color.js +0 -27
  165. package/lib/utilities/compiling.js +0 -24
  166. package/lib/utilities/detect-port.js +0 -100
  167. package/lib/utilities/escape-string-regexp.js +0 -10
  168. package/lib/utilities/file.js +0 -70
  169. package/lib/utilities/index.js +0 -8
  170. package/lib/utilities/loading.js +0 -37
  171. package/lib/utilities/logger.js +0 -99
  172. package/lib/utilities/merge-stream.js +0 -38
  173. package/lib/utilities/namespace.js +0 -11
  174. package/lib/utilities/public-url.js +0 -37
  175. package/lib/utilities/replacestream.js +0 -106
  176. package/lib/utilities/typeof.js +0 -5
  177. package/lib/utilities/utils.js +0 -43
  178. package/tslib/balm.js +0 -44
  179. package/tslib/bootstrap/check_config.js +0 -36
  180. package/tslib/bootstrap/index.js +0 -82
  181. package/tslib/bundler/esbuild/build.js +0 -30
  182. package/tslib/bundler/esbuild/index.js +0 -11
  183. package/tslib/bundler/esbuild/options.js +0 -7
  184. package/tslib/bundler/esbuild/transform.js +0 -38
  185. package/tslib/bundler/rollup/build.js +0 -17
  186. package/tslib/bundler/rollup/entry.js +0 -24
  187. package/tslib/bundler/rollup/index.js +0 -21
  188. package/tslib/bundler/rollup/output.js +0 -23
  189. package/tslib/bundler/rollup/plugins.js +0 -27
  190. package/tslib/bundler/webpack/config/common.js +0 -130
  191. package/tslib/bundler/webpack/config/dev.js +0 -14
  192. package/tslib/bundler/webpack/config/env.js +0 -44
  193. package/tslib/bundler/webpack/config/index.js +0 -8
  194. package/tslib/bundler/webpack/config/prod.js +0 -43
  195. package/tslib/bundler/webpack/config/regex.js +0 -10
  196. package/tslib/bundler/webpack/entry.js +0 -68
  197. package/tslib/bundler/webpack/index.js +0 -30
  198. package/tslib/bundler/webpack/loaders.js +0 -51
  199. package/tslib/bundler/webpack/output.js +0 -41
  200. package/tslib/bundler/webpack/rules/asset.js +0 -33
  201. package/tslib/bundler/webpack/rules/babel.js +0 -16
  202. package/tslib/bundler/webpack/rules/css.js +0 -95
  203. package/tslib/bundler/webpack/rules/html.js +0 -15
  204. package/tslib/bundler/webpack/rules/index.js +0 -10
  205. package/tslib/config/assets.js +0 -24
  206. package/tslib/config/constants.js +0 -14
  207. package/tslib/config/env.js +0 -43
  208. package/tslib/config/extras.js +0 -6
  209. package/tslib/config/ftp.js +0 -6
  210. package/tslib/config/globals.js +0 -47
  211. package/tslib/config/html.js +0 -17
  212. package/tslib/config/images.js +0 -4
  213. package/tslib/config/index.js +0 -56
  214. package/tslib/config/logs.js +0 -6
  215. package/tslib/config/paths.js +0 -30
  216. package/tslib/config/pwa.js +0 -18
  217. package/tslib/config/roots.js +0 -8
  218. package/tslib/config/scripts.js +0 -93
  219. package/tslib/config/server.js +0 -33
  220. package/tslib/config/spinner.js +0 -10
  221. package/tslib/config/styles.js +0 -37
  222. package/tslib/hello.js +0 -19
  223. package/tslib/hooks/index.js +0 -75
  224. package/tslib/hooks/maker.js +0 -66
  225. package/tslib/index.js +0 -5
  226. package/tslib/middlewares/history.js +0 -12
  227. package/tslib/middlewares/index.js +0 -18
  228. package/tslib/middlewares/proxy.js +0 -27
  229. package/tslib/middlewares/webpack.js +0 -29
  230. package/tslib/plugins/htmlmin.js +0 -38
  231. package/tslib/plugins/imagemin.js +0 -97
  232. package/tslib/plugins/index.js +0 -27
  233. package/tslib/plugins/jsmin.js +0 -39
  234. package/tslib/plugins/less.js +0 -90
  235. package/tslib/plugins/plumber.js +0 -81
  236. package/tslib/plugins/postcss-plugins.js +0 -24
  237. package/tslib/plugins/postcss.js +0 -111
  238. package/tslib/plugins/rename.js +0 -51
  239. package/tslib/plugins/replace.js +0 -72
  240. package/tslib/plugins/sass-legacy.js +0 -95
  241. package/tslib/plugins/sass.js +0 -109
  242. package/tslib/plugins/sftp.js +0 -258
  243. package/tslib/tasks/default.js +0 -59
  244. package/tslib/tasks/foundation/balm.js +0 -75
  245. package/tslib/tasks/foundation/balm_style.js +0 -68
  246. package/tslib/tasks/foundation/index.js +0 -10
  247. package/tslib/tasks/index.js +0 -43
  248. package/tslib/tasks/private/build.js +0 -15
  249. package/tslib/tasks/private/cache.js +0 -48
  250. package/tslib/tasks/private/clean.js +0 -82
  251. package/tslib/tasks/private/end.js +0 -21
  252. package/tslib/tasks/private/extra.js +0 -34
  253. package/tslib/tasks/private/font.js +0 -12
  254. package/tslib/tasks/private/image.js +0 -42
  255. package/tslib/tasks/private/index.js +0 -34
  256. package/tslib/tasks/private/lint.js +0 -17
  257. package/tslib/tasks/private/media.js +0 -12
  258. package/tslib/tasks/private/modernizr.js +0 -54
  259. package/tslib/tasks/private/pwa-cache.js +0 -32
  260. package/tslib/tasks/private/script.js +0 -9
  261. package/tslib/tasks/private/sprite.js +0 -93
  262. package/tslib/tasks/private/start.js +0 -13
  263. package/tslib/tasks/private/style.js +0 -12
  264. package/tslib/tasks/private/workbox-sw.js +0 -15
  265. package/tslib/tasks/public/copy.js +0 -18
  266. package/tslib/tasks/public/esbuild.js +0 -18
  267. package/tslib/tasks/public/ftp.js +0 -39
  268. package/tslib/tasks/public/html.js +0 -75
  269. package/tslib/tasks/public/index.js +0 -38
  270. package/tslib/tasks/public/jsmin.js +0 -24
  271. package/tslib/tasks/public/less.js +0 -21
  272. package/tslib/tasks/public/postcss.js +0 -16
  273. package/tslib/tasks/public/publish.js +0 -50
  274. package/tslib/tasks/public/pwa.js +0 -87
  275. package/tslib/tasks/public/remove.js +0 -44
  276. package/tslib/tasks/public/replace.js +0 -27
  277. package/tslib/tasks/public/rollup.js +0 -17
  278. package/tslib/tasks/public/sass.js +0 -27
  279. package/tslib/tasks/public/server.js +0 -129
  280. package/tslib/tasks/public/url.js +0 -35
  281. package/tslib/tasks/public/version.js +0 -27
  282. package/tslib/tasks/public/webpack.js +0 -41
  283. package/tslib/tasks/public/zip.js +0 -19
  284. package/tslib/utilities/address.js +0 -48
  285. package/tslib/utilities/cache-core.js +0 -57
  286. package/tslib/utilities/color.js +0 -33
  287. package/tslib/utilities/compiling.js +0 -16
  288. package/tslib/utilities/detect-port.js +0 -91
  289. package/tslib/utilities/escape-string-regexp.js +0 -7
  290. package/tslib/utilities/file.js +0 -78
  291. package/tslib/utilities/index.js +0 -8
  292. package/tslib/utilities/loading.js +0 -25
  293. package/tslib/utilities/logger.js +0 -92
  294. package/tslib/utilities/merge-stream.js +0 -34
  295. package/tslib/utilities/namespace.js +0 -12
  296. package/tslib/utilities/public-url.js +0 -31
  297. package/tslib/utilities/replacestream.js +0 -112
  298. package/tslib/utilities/typeof.js +0 -8
  299. package/tslib/utilities/utils.js +0 -38
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/index.ts","../src/config/index.ts","../src/config/defaults.ts","../src/utilities/utils.ts","../src/config/constants.ts","../src/utilities/workspace.ts","../src/utilities/logger.ts","../src/runner/dag.ts","../src/tasks/clean.ts","../src/runner/task.ts","../src/utilities/file.ts","../src/tasks/style.ts","../src/pipeline/pipeline.ts","../src/pipeline/file.ts","../src/pipeline/transforms/sass.ts","../src/pipeline/transforms/less.ts","../src/pipeline/transforms/postcss.ts","../src/bundler/webpack.ts","../src/bundler/rollup.ts","../src/bundler/esbuild.ts","../src/tasks/script.ts","../src/tasks/html.ts","../src/pipeline/transforms/htmlmin.ts","../src/pipeline/transforms/replace.ts","../src/tasks/copy.ts","../src/pipeline/transforms/rename.ts","../src/tasks/remove.ts","../src/tasks/replace.ts","../src/tasks/cache.ts","../src/pipeline/transforms/cache.ts","../src/tasks/publish.ts","../src/tasks/pwa.ts","../src/tasks/zip.ts","../src/tasks/ftp.ts","../src/tasks/server.ts","../src/watcher/index.ts","../src/hooks/index.ts","../src/balm.ts","../src/pipeline/transforms/terser.ts","../src/index.ts"],"sourcesContent":["export type LooseObject = Record<string, any>;\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\nexport type BalmEntry = string | string[] | Record<string, string | string[]>;\n\nexport interface BalmRoots {\n source: string;\n tmp: string;\n target: string;\n}\n\nexport interface BalmPathMap {\n base: string;\n html: string;\n css: string;\n js: string;\n img: string;\n font: string;\n media: string;\n}\n\nexport interface BalmPaths {\n source: BalmPathMap;\n tmp: Omit<BalmPathMap, 'html'>;\n target: Omit<BalmPathMap, 'html'>;\n}\n\nexport interface BalmStyles {\n extname: string;\n minify: boolean;\n atImportPaths: string[];\n alias: Record<string, string>;\n options: Record<string, any>;\n sassOptions: Record<string, any>;\n lessOptions: Record<string, any>;\n postcssLoaderOptions: Record<string, any>;\n postcssPlugins: any[];\n sprites: string[];\n spriteOptions: Record<string, any>;\n}\n\nexport enum BundlerType {\n webpack = 'webpack',\n rollup = 'rollup',\n esbuild = 'esbuild'\n}\n\nexport interface BalmScripts {\n bundler: BundlerType | 'webpack' | 'rollup' | 'esbuild';\n minify: boolean;\n minifyOptions: Record<string, any>;\n entry: BalmEntry;\n target: string | string[];\n library: string | Record<string, any>;\n libraryTarget: string;\n externals: string | string[] | Record<string, any> | RegExp | Function;\n injectHtml: boolean;\n htmlName: string;\n alias: Record<string, string>;\n plugins: any[];\n loaders: any[];\n defaultLoaders: {\n html?: boolean;\n css?: boolean;\n js?: boolean;\n url?: boolean;\n };\n options: Record<string, any>;\n esbuildOptions: Record<string, any>;\n rollupOptions: Record<string, any>;\n webpackOptions: Record<string, any>;\n useCache: boolean;\n}\n\nexport interface BalmHtml {\n options: Record<string, any>;\n}\n\nexport interface BalmAssets {\n root: string;\n mainDir: string;\n subDir: string;\n buildDir: string;\n virtualDir: string;\n cache: boolean;\n options: {\n fileNameManifest?: string;\n dontRenameFile?: (string | RegExp)[];\n dontUpdateReference?: (string | RegExp)[];\n hashLength?: number;\n [key: string]: any;\n };\n includes: string[];\n excludes: string[];\n static?: string;\n [key: string]: any;\n}\n\nexport interface BalmServer {\n host: string | null;\n port: number;\n open: boolean | string;\n proxy: boolean | Record<string, any> | Array<Record<string, any>>;\n proxyOptions: boolean | Record<string, any> | Array<Record<string, any>>;\n historyOptions: boolean | Record<string, any>;\n useHMR: boolean;\n options: Record<string, any>;\n}\n\nexport interface BalmPwa {\n enabled: boolean;\n mode: 'generateSW' | 'injectManifest';\n version: string;\n manifest: string;\n swSrcFilename: string;\n swDestFilename: string;\n options: Record<string, any>;\n}\n\nexport interface BalmFtp {\n options: Record<string, any>;\n watchFiles: string[];\n}\n\nexport interface BalmImages {\n plugins: any[];\n}\n\nexport interface BalmEnv {\n isProd: boolean;\n isDev: boolean;\n isTest: boolean;\n inFrontend: boolean;\n inSSR: boolean;\n inDesktopApp: boolean;\n isMP: boolean;\n}\n\nexport interface BalmWorkspaces {\n local: string;\n global: string;\n}\n\nexport type BalmWorkspaceConfig = string | { local?: string; global?: string };\n\nexport interface BalmConfig {\n workspace: string;\n workspaces: BalmWorkspaces;\n alias: Record<string, string>;\n env: BalmEnv;\n inFrontend: boolean;\n useDefaults: boolean;\n roots: BalmRoots;\n paths: BalmPaths;\n styles: BalmStyles;\n scripts: BalmScripts;\n html: BalmHtml;\n assets: BalmAssets;\n server: BalmServer;\n pwa: BalmPwa;\n ftp: BalmFtp;\n images: BalmImages;\n logs: {\n level: number;\n };\n src: BalmPathMap;\n dest: BalmPathMap & { static: string };\n [key: string]: any;\n}\n\nexport type BalmCustomConfig = Omit<DeepPartial<BalmConfig>, 'workspace'> & {\n workspace?: BalmWorkspaceConfig;\n};\n\nexport interface RenameOptions {\n dirname?: string;\n prefix?: string;\n basename?: string;\n suffix?: string;\n extname?: string;\n}\n\nexport interface ReplaceOptions {\n substr: string | RegExp;\n replacement: string | ((substring: string, ...args: any[]) => string);\n}\n\nexport interface TemplateOption {\n input: string;\n output: string;\n renameOptions?: string | Function | RenameOptions;\n}\n\nexport interface TaskContext {\n config: BalmConfig;\n}\n\nexport type TaskFn = (context: TaskContext) => Promise<any> | any;\n","import path from 'node:path';\nimport { BalmConfig, BalmCustomConfig } from '../types/index.js';\nimport { createDefaultConfig } from './defaults.js';\nimport { deepMerge } from '../utilities/utils.js';\nimport { ASSETS_TYPES } from './constants.js';\nimport { setWorkspaces } from '../utilities/workspace.js';\n\nexport function resolveConfig(\n customConfig: BalmCustomConfig = {},\n defaultWorkspace = process.cwd()\n): BalmConfig {\n let localWorkspace = defaultWorkspace;\n let globalWorkspace = path.resolve(defaultWorkspace, '..');\n\n if (customConfig.workspace) {\n if (typeof customConfig.workspace === 'string') {\n localWorkspace = path.resolve(customConfig.workspace);\n globalWorkspace = path.resolve(localWorkspace, '..');\n } else if (typeof customConfig.workspace === 'object') {\n localWorkspace = path.resolve(customConfig.workspace.local || defaultWorkspace);\n globalWorkspace = path.resolve(\n customConfig.workspace.global || path.resolve(localWorkspace, '..')\n );\n }\n }\n\n setWorkspaces(localWorkspace, globalWorkspace);\n\n const defaultConfig = createDefaultConfig(localWorkspace);\n const config = deepMerge(defaultConfig, customConfig) as BalmConfig;\n\n // Set normalized workspace path\n config.workspace = localWorkspace;\n config.workspaces = {\n local: localWorkspace,\n global: globalWorkspace\n };\n\n // Update src quick directories\n config.src = {\n base: path.join(config.workspace, config.roots.source),\n html: path.join(config.workspace, config.roots.source, config.paths.source.html),\n css: path.join(config.workspace, config.roots.source, config.paths.source.css),\n js: path.join(config.workspace, config.roots.source, config.paths.source.js),\n img: path.join(config.workspace, config.roots.source, config.paths.source.img),\n font: path.join(config.workspace, config.roots.source, config.paths.source.font),\n media: path.join(config.workspace, config.roots.source, config.paths.source.media)\n };\n\n // Update dest quick directories\n const targetBase = path.join(\n config.workspace,\n config.env.isProd || !config.inFrontend ? config.roots.target : config.roots.tmp\n );\n\n const isProd = config.env.isProd || !config.inFrontend;\n const pathMap = isProd ? config.paths.target : config.paths.tmp;\n\n const destStatic = path.join(\n targetBase,\n config.assets.virtualDir,\n config.assets.subDir\n );\n\n config.dest = {\n base: targetBase,\n html: targetBase,\n css: path.join(targetBase, pathMap.css),\n js: path.join(targetBase, pathMap.js),\n img: path.join(targetBase, pathMap.img),\n font: path.join(targetBase, pathMap.font),\n media: path.join(targetBase, pathMap.media),\n static: destStatic\n };\n\n // Set assets.static\n config.assets.static = path.join(\n config.assets.root,\n config.assets.mainDir,\n config.assets.subDir\n );\n\n for (const assetType of ASSETS_TYPES) {\n (config.assets as any)[assetType] = path.join(\n config.assets.static,\n (config.paths.target as any)[assetType]\n );\n }\n\n // Set HMR flag\n const hmrEnv =\n config.useDefaults &&\n config.env.isDev &&\n !config.env.inSSR &&\n !config.env.isMP;\n const hmrEnabling = config.scripts.bundler === 'webpack';\n config.server.useHMR = hmrEnv && hmrEnabling;\n\n // Set desktop app\n if (/^electron-.*/.test(config.scripts.target as string)) {\n config.env.inDesktopApp = true;\n }\n\n // Set use cache for webpack\n config.scripts.useCache =\n config.env.isProd && config.assets.cache && config.scripts.injectHtml;\n\n return config;\n}\n\nexport * from './constants.js';\nexport * from './defaults.js';\n","import path from 'node:path';\nimport { BalmConfig, BundlerType } from '../types/index.js';\n\nexport function createDefaultConfig(workspace = process.cwd()): BalmConfig {\n const isProd = process.env.NODE_ENV === 'production';\n const isDev = !isProd;\n const isTest = process.env.NODE_ENV === 'test';\n\n const roots = {\n source: 'src',\n tmp: '.tmp',\n target: 'dist'\n };\n\n const paths = {\n source: {\n base: '',\n html: '',\n css: 'styles',\n js: 'scripts',\n img: 'images',\n font: 'fonts',\n media: 'media'\n },\n tmp: {\n base: '',\n css: 'css',\n js: 'js',\n img: 'img',\n font: 'fonts',\n media: 'media'\n },\n target: {\n base: '',\n css: 'css',\n js: 'js',\n img: 'img',\n font: 'font',\n media: 'media'\n }\n };\n\n const alias: Record<string, string> = {\n '@': path.join(workspace, roots.source)\n };\n\n const styles = {\n extname: 'scss',\n minify: false,\n atImportPaths: [],\n alias: {},\n options: {},\n sassOptions: {},\n lessOptions: {},\n postcssLoaderOptions: {},\n postcssPlugins: [],\n sprites: [],\n spriteOptions: {}\n };\n\n const scripts = {\n bundler: BundlerType.webpack,\n minify: false,\n minifyOptions: {},\n entry: '',\n target: 'web',\n library: '',\n libraryTarget: 'var',\n externals: {},\n injectHtml: false,\n htmlName: 'index.html',\n alias: {},\n plugins: [],\n loaders: [],\n defaultLoaders: {\n html: true,\n css: true,\n js: true,\n url: true\n },\n options: {},\n esbuildOptions: {},\n rollupOptions: {},\n webpackOptions: {},\n useCache: false\n };\n\n const html = {\n options: {\n collapseWhitespace: true,\n minifyCSS: true,\n minifyJS: {\n compress: {\n drop_console: true\n }\n },\n processConditionalComments: true,\n removeComments: true,\n removeEmptyAttributes: true,\n removeScriptTypeAttributes: true,\n removeStyleLinkTypeAttributes: true\n }\n };\n\n const assets = {\n root: 'assets',\n mainDir: 'public',\n subDir: '',\n buildDir: 'build',\n virtualDir: '',\n cache: false,\n options: {\n fileNameManifest: 'rev-manifest.json',\n dontRenameFile: ['.html'],\n dontUpdateReference: []\n },\n includes: [],\n excludes: []\n };\n\n const server = {\n host: null,\n port: 3000,\n open: true,\n proxy: false,\n proxyOptions: false,\n historyOptions: false,\n useHMR: false,\n options: {}\n };\n\n const pwa = {\n enabled: false,\n mode: 'generateSW' as const,\n version: '',\n manifest: 'manifest.json',\n swSrcFilename: 'service-worker.js',\n swDestFilename: 'sw.js',\n options: {}\n };\n\n const ftp = {\n options: {},\n watchFiles: []\n };\n\n const images = {\n plugins: []\n };\n\n const env = {\n isProd,\n isDev,\n isTest,\n inFrontend: true,\n inSSR: false,\n inDesktopApp: false,\n isMP: false\n };\n\n const src = {\n base: path.join(workspace, roots.source),\n html: path.join(workspace, roots.source, paths.source.html),\n css: path.join(workspace, roots.source, paths.source.css),\n js: path.join(workspace, roots.source, paths.source.js),\n img: path.join(workspace, roots.source, paths.source.img),\n font: path.join(workspace, roots.source, paths.source.font),\n media: path.join(workspace, roots.source, paths.source.media)\n };\n\n const targetBase = path.join(workspace, isProd ? roots.target : roots.tmp);\n const dest = {\n base: targetBase,\n html: targetBase,\n css: path.join(targetBase, isProd ? paths.target.css : paths.tmp.css),\n js: path.join(targetBase, isProd ? paths.target.js : paths.tmp.js),\n img: path.join(targetBase, isProd ? paths.target.img : paths.tmp.img),\n font: path.join(targetBase, isProd ? paths.target.font : paths.tmp.font),\n media: path.join(targetBase, isProd ? paths.target.media : paths.tmp.media),\n static: path.join(targetBase, assets.virtualDir, assets.subDir)\n };\n\n return {\n workspace,\n workspaces: {\n local: workspace,\n global: path.resolve(workspace, '..')\n },\n alias,\n env,\n inFrontend: true,\n useDefaults: true,\n roots,\n paths,\n styles,\n scripts,\n html,\n assets,\n server,\n pwa,\n ftp,\n images,\n logs: {\n level: 1\n },\n src,\n dest\n };\n}\n","export function isObject(val: any): val is Record<string, any> {\n return val !== null && typeof val === 'object' && !Array.isArray(val);\n}\n\nexport function isArray(val: any): val is any[] {\n return Array.isArray(val);\n}\n\nexport function isString(val: any): val is string {\n return typeof val === 'string';\n}\n\nexport function isFunction(val: any): val is Function {\n return typeof val === 'function';\n}\n\nexport function isBoolean(val: any): val is boolean {\n return typeof val === 'boolean';\n}\n\nexport function deepMerge<T extends Record<string, any>>(target: T, ...sources: any[]): T {\n if (!sources.length) return target;\n const source = sources.shift();\n\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) Object.assign(target, { [key]: {} });\n deepMerge(target[key], source[key]);\n } else if (isArray(source[key])) {\n (target as any)[key] = [...source[key]];\n } else if (source[key] !== undefined) {\n Object.assign(target, { [key]: source[key] });\n }\n }\n }\n\n return deepMerge(target, ...sources);\n}\n\nexport function toNamespace(name: string | string[], namespace = 'balm'): string | string[] {\n if (isArray(name)) {\n return name.map((item) => `${namespace}:${item}`);\n }\n return `${namespace}:${name}`;\n}\n","export const ASSETS_TYPES = ['css', 'js', 'img', 'font', 'media'];\nexport const PUBLIC_URL = '%PUBLIC_URL%';\nexport const CHUNK = { dir: 'chunk' };\nexport const ASSET = { dir: 'asset' };\n\nexport const ASSET_EXT = {\n styles: ['css', 'scss', 'sass', 'less'],\n scripts: ['js', 'mjs', 'cjs', 'ts', 'mts', 'cts', 'jsx', 'tsx'],\n images: ['png', 'jpg', 'jpeg', 'gif', 'svg', 'webp', 'ico'],\n fonts: ['woff', 'woff2', 'ttf', 'eot', 'otf'],\n media: ['mp4', 'webm', 'ogg', 'mp3', 'wav', 'flac', 'aac']\n};\n","import path from 'node:path';\n\nexport interface WorkspacePaths {\n local: string;\n global: string;\n}\n\nlet currentLocalWorkspace: string = process.cwd();\nlet currentGlobalWorkspace: string = path.resolve(process.cwd(), '..');\n\nexport function setWorkspaces(local?: string, global?: string): void {\n if (local) {\n currentLocalWorkspace = path.resolve(local);\n }\n if (global) {\n currentGlobalWorkspace = path.resolve(global);\n } else if (local && !global) {\n currentGlobalWorkspace = path.resolve(currentLocalWorkspace, '..');\n }\n}\n\nexport function getWorkspaces(): WorkspacePaths {\n return {\n local: currentLocalWorkspace,\n global: currentGlobalWorkspace\n };\n}\n\nexport function localWorkspace(subPath: string = ''): string {\n return subPath ? path.resolve(currentLocalWorkspace, subPath) : currentLocalWorkspace;\n}\n\nexport function globalWorkspace(subPath: string = ''): string {\n return subPath ? path.resolve(currentGlobalWorkspace, subPath) : currentGlobalWorkspace;\n}\n\nexport const localResolve = localWorkspace;\nexport const globalResolve = globalWorkspace;\n","import pc from 'picocolors';\n\nexport enum LogLevel {\n Debug = 0,\n Info = 1,\n Warn = 2,\n Error = 3,\n Silent = 4\n}\n\nclass Logger {\n level: LogLevel = LogLevel.Info;\n\n private formatTag(tag?: string): string {\n return tag ? pc.cyan(`[${tag}]`) : pc.bgBlue(pc.black(' BalmJS '));\n }\n\n private timestamp(): string {\n const d = new Date();\n const pad = (n: number) => n.toString().padStart(2, '0');\n return pc.gray(`[${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}]`);\n }\n\n debug(tag: string, message: any, ...args: any[]): void {\n if (this.level <= LogLevel.Debug) {\n console.log(this.timestamp(), this.formatTag(tag), pc.magenta('※'), message, ...args);\n }\n }\n\n info(tag: string, message: any, ...args: any[]): void {\n if (this.level <= LogLevel.Info) {\n console.log(this.timestamp(), this.formatTag(tag), pc.blue('ℹ'), message, ...args);\n }\n }\n\n success(tag: string, message: any, ...args: any[]): void {\n if (this.level <= LogLevel.Info) {\n console.log(this.timestamp(), this.formatTag(tag), pc.green('✔'), pc.green(message), ...args);\n }\n }\n\n warn(tag: string, message: any, ...args: any[]): void {\n if (this.level <= LogLevel.Warn) {\n console.warn(this.timestamp(), this.formatTag(tag), pc.yellow('⚠'), pc.yellow(message), ...args);\n }\n }\n\n error(tag: string, message: any, ...args: any[]): void {\n if (this.level <= LogLevel.Error) {\n console.error(this.timestamp(), this.formatTag(tag), pc.red('✖'), pc.red(message), ...args);\n }\n }\n\n time(label: string): () => void {\n const start = performance.now();\n return () => {\n const duration = (performance.now() - start).toFixed(2);\n this.info('time', `${label} completed in ${pc.bold(duration + 'ms')}`);\n };\n }\n}\n\nexport const logger = new Logger();\n","import { BaseTask } from './task.js';\nimport { BalmConfig } from '../types/index.js';\nimport { logger } from '../utilities/logger.js';\nimport pc from 'picocolors';\n\nexport class TaskDAG {\n private tasks = new Map<string, BaseTask>();\n\n registerTask(task: BaseTask): void {\n this.tasks.set(task.name, task);\n }\n\n getTask(name: string): BaseTask | undefined {\n return this.tasks.get(name);\n }\n\n hasTask(name: string): boolean {\n return this.tasks.has(name);\n }\n\n clear(): void {\n this.tasks.clear();\n }\n\n /**\n * Run a list of tasks in strict series\n */\n async runSeries(taskNames: string[], config: BalmConfig): Promise<void> {\n for (const name of taskNames) {\n await this.executeTask(name, config);\n }\n }\n\n /**\n * Run a list of tasks in parallel\n */\n async runParallel(taskNames: string[], config: BalmConfig): Promise<void> {\n await Promise.all(taskNames.map((name) => this.executeTask(name, config)));\n }\n\n /**\n * Execute a single task resolving its dependencies first\n */\n async executeTask(\n taskName: string,\n config: BalmConfig,\n executed = new Set<string>()\n ): Promise<void> {\n if (executed.has(taskName)) return;\n\n const task = this.tasks.get(taskName);\n if (!task) {\n logger.warn('task', `Task ${pc.bold(taskName)} not found, skipping.`);\n return;\n }\n\n // Execute dependencies first\n if (task.deps && task.deps.length > 0) {\n for (const dep of task.deps) {\n await this.executeTask(dep, config, executed);\n }\n }\n\n const start = performance.now();\n try {\n await task.run(config);\n executed.add(taskName);\n const duration = (performance.now() - start).toFixed(1);\n if (!task.hidden) {\n logger.info('task', `${pc.cyan(task.name)} finished in ${pc.bold(duration + 'ms')}`);\n }\n } catch (error: any) {\n logger.error('task', `Task ${pc.bold(task.name)} failed: ${error?.message || error}`);\n throw error;\n }\n }\n}\n","import path from 'node:path';\nimport { BaseTask } from '../runner/task.js';\nimport { BalmConfig } from '../types/index.js';\nimport { file } from '../utilities/file.js';\nimport { logger } from '../utilities/logger.js';\n\nexport class CleanTask extends BaseTask {\n constructor() {\n super({ name: 'clean', description: 'Clean output directories' });\n }\n\n async run(config: BalmConfig): Promise<void> {\n const targets = [\n path.join(config.workspace, config.roots.tmp),\n path.join(config.workspace, config.roots.target)\n ];\n\n const deleted = await file.remove(targets);\n logger.info('clean', `Deleted ${deleted.length} directories`);\n }\n}\n","import { BalmConfig } from '../types/index.js';\nimport { logger } from '../utilities/logger.js';\n\nexport interface TaskOptions {\n name: string;\n deps?: string[];\n description?: string;\n hidden?: boolean;\n}\n\nexport abstract class BaseTask {\n name: string;\n deps: string[];\n description?: string;\n hidden: boolean;\n\n constructor(options: TaskOptions) {\n this.name = options.name;\n this.deps = options.deps || [];\n this.description = options.description;\n this.hidden = options.hidden || false;\n }\n\n abstract run(config: BalmConfig): Promise<void> | void;\n}\n\nexport class FunctionTask extends BaseTask {\n private fn: (config: BalmConfig) => Promise<void> | void;\n\n constructor(name: string, fn: (config: BalmConfig) => Promise<void> | void, deps: string[] = []) {\n super({ name, deps });\n this.fn = fn;\n }\n\n async run(config: BalmConfig): Promise<void> {\n await this.fn(config);\n }\n}\n","import fs from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport crypto from 'node:crypto';\nimport fg from 'fast-glob';\n\nexport class FileSystem {\n workspace: string = process.cwd();\n\n resolveApp(...paths: string[]): string {\n return path.resolve(this.workspace, ...paths);\n }\n\n absPath(filePath: string): string {\n return path.isAbsolute(filePath) ? filePath : this.resolveApp(filePath);\n }\n\n absPaths(filePaths: string | string[]): string | string[] {\n if (Array.isArray(filePaths)) {\n return filePaths.map((p) => this.absPath(p));\n }\n return this.absPath(filePaths);\n }\n\n async exists(targetPath: string): Promise<boolean> {\n try {\n await fs.access(this.absPath(targetPath));\n return true;\n } catch {\n return false;\n }\n }\n\n existsSync(targetPath: string): boolean {\n return existsSync(this.absPath(targetPath));\n }\n\n async ensureDir(dirPath: string): Promise<void> {\n await fs.mkdir(this.absPath(dirPath), { recursive: true });\n }\n\n async readFile(filePath: string, encoding: BufferEncoding = 'utf8'): Promise<string> {\n return fs.readFile(this.absPath(filePath), { encoding });\n }\n\n async readBuffer(filePath: string): Promise<Buffer> {\n return fs.readFile(this.absPath(filePath));\n }\n\n async writeFile(filePath: string, data: string | Buffer): Promise<void> {\n const fullPath = this.absPath(filePath);\n await this.ensureDir(path.dirname(fullPath));\n await fs.writeFile(fullPath, data);\n }\n\n async remove(targetPath: string | string[]): Promise<string[]> {\n const targets = Array.isArray(targetPath) ? targetPath : [targetPath];\n const removed: string[] = [];\n\n for (const item of targets) {\n const fullPath = this.absPath(item);\n try {\n const stat = await fs.stat(fullPath);\n if (stat.isDirectory()) {\n await fs.rm(fullPath, { recursive: true, force: true });\n } else {\n await fs.unlink(fullPath);\n }\n removed.push(fullPath);\n } catch {\n // file doesn't exist or already removed\n }\n }\n\n return removed;\n }\n\n async copyFile(src: string, dest: string): Promise<void> {\n const srcPath = this.absPath(src);\n const destPath = this.absPath(dest);\n await this.ensureDir(path.dirname(destPath));\n await fs.copyFile(srcPath, destPath);\n }\n\n async copyDir(srcDir: string, destDir: string): Promise<void> {\n const src = this.absPath(srcDir);\n const dest = this.absPath(destDir);\n await this.ensureDir(dest);\n\n const entries = await fs.readdir(src, { withFileTypes: true });\n for (const entry of entries) {\n const srcItem = path.join(src, entry.name);\n const destItem = path.join(dest, entry.name);\n if (entry.isDirectory()) {\n await this.copyDir(srcItem, destItem);\n } else {\n await this.copyFile(srcItem, destItem);\n }\n }\n }\n\n async matchFiles(\n patterns: string | string[],\n options: fg.Options = {}\n ): Promise<string[]> {\n const defaultOptions: fg.Options = {\n cwd: this.workspace,\n absolute: true,\n dot: true,\n onlyFiles: true\n };\n return fg(patterns, { ...defaultOptions, ...options });\n }\n\n hash(content: string | Buffer, length = 8): string {\n return crypto.createHash('md5').update(content).digest('hex').slice(0, length);\n }\n}\n\nexport const file = new FileSystem();\n","import path from 'node:path';\nimport { BaseTask } from '../runner/task.js';\nimport { BalmConfig } from '../types/index.js';\nimport { Pipeline } from '../pipeline/pipeline.js';\nimport { transformSass } from '../pipeline/transforms/sass.js';\nimport { transformLess } from '../pipeline/transforms/less.js';\nimport { transformPostcss } from '../pipeline/transforms/postcss.js';\n\nexport class StyleTask extends BaseTask {\n constructor() {\n super({ name: 'style', description: 'Compile stylesheets' });\n }\n\n async run(config: BalmConfig): Promise<void> {\n const ext = config.styles.extname;\n const srcPattern = path.join(config.src.css, `**/*.${ext}`);\n const isProd = config.env.isProd;\n\n const pipeline = Pipeline.from([srcPattern, `!${path.join(config.src.css, '**/_*.scss')}`, `!${path.join(config.src.css, '**/_*.less')}`], {\n cwd: config.workspace,\n base: config.src.css\n });\n\n const styleAlias = {\n ...config.alias,\n ...config.styles.alias\n };\n\n if (ext === 'scss' || ext === 'sass') {\n pipeline.pipe(\n transformSass({\n includePaths: [config.src.css, ...config.styles.atImportPaths],\n alias: styleAlias,\n ...config.styles.sassOptions\n })\n );\n } else if (ext === 'less') {\n pipeline.pipe(\n transformLess({\n paths: [config.src.css, ...config.styles.atImportPaths],\n alias: styleAlias,\n ...config.styles.lessOptions\n })\n );\n }\n\n pipeline.pipe(\n transformPostcss({\n plugins: config.styles.postcssPlugins,\n minify: isProd || config.styles.minify,\n ...config.styles.postcssLoaderOptions\n })\n );\n\n await pipeline.dest(config.dest.css);\n }\n}\n","import path from 'node:path';\nimport fg from 'fast-glob';\nimport fs from 'node:fs/promises';\nimport { VirtualFile } from './file.js';\nimport { file as fsUtil } from '../utilities/file.js';\n\nexport type TransformFn = (\n file: VirtualFile\n) => Promise<VirtualFile | VirtualFile[] | null | void> | VirtualFile | VirtualFile[] | null | void;\n\nexport interface PipelineOptions {\n cwd?: string;\n base?: string;\n allowEmpty?: boolean;\n}\n\nexport class Pipeline {\n private cwd: string;\n private base?: string;\n private allowEmpty: boolean;\n private files: VirtualFile[] = [];\n private transforms: TransformFn[] = [];\n\n constructor(options: PipelineOptions = {}) {\n this.cwd = options.cwd || process.cwd();\n this.base = options.base;\n this.allowEmpty = options.allowEmpty ?? true;\n }\n\n static from(\n patterns: string | string[],\n options: PipelineOptions = {}\n ): Pipeline {\n const pipeline = new Pipeline(options);\n return pipeline.src(patterns);\n }\n\n src(patterns: string | string[], options: PipelineOptions = {}): this {\n if (options.cwd) this.cwd = options.cwd;\n if (options.base) this.base = options.base;\n if (options.allowEmpty !== undefined) this.allowEmpty = options.allowEmpty;\n\n this.transforms.push(async () => {\n const matched = await fg(patterns, {\n cwd: this.cwd,\n absolute: true,\n dot: true,\n onlyFiles: true\n });\n\n if (!matched.length && !this.allowEmpty) {\n throw new Error(`File not found with pattern: ${patterns}`);\n }\n\n // Calculate common base if not explicitly provided\n let effectiveBase = this.base;\n if (!effectiveBase) {\n const patternArr = Array.isArray(patterns) ? patterns : [patterns];\n const firstPos = patternArr.find((p) => !p.startsWith('!'));\n if (firstPos) {\n const globIdx = firstPos.indexOf('*');\n if (globIdx !== -1) {\n effectiveBase = path.resolve(this.cwd, firstPos.slice(0, globIdx));\n } else {\n effectiveBase = path.resolve(this.cwd, path.dirname(firstPos));\n }\n } else {\n effectiveBase = this.cwd;\n }\n }\n\n this.files = await Promise.all(\n matched.map(async (filePath) => {\n const buffer = await fs.readFile(filePath);\n return new VirtualFile({\n cwd: this.cwd,\n base: effectiveBase!,\n path: filePath,\n contents: buffer\n });\n })\n );\n });\n\n return this;\n }\n\n pipe(transform: TransformFn): this {\n this.transforms.push(transform);\n return this;\n }\n\n async process(): Promise<VirtualFile[]> {\n let isSrcLoaded = false;\n for (const transform of this.transforms) {\n if (!isSrcLoaded) {\n // Initial src loader\n await transform(null as any);\n isSrcLoaded = true;\n } else {\n if (this.files.length === 0) break;\n const nextFiles: VirtualFile[] = [];\n for (const file of this.files) {\n const result = await transform(file);\n if (result === undefined || result === file) {\n nextFiles.push(file);\n } else if (Array.isArray(result)) {\n nextFiles.push(...result);\n } else if (result !== null) {\n nextFiles.push(result);\n }\n }\n this.files = nextFiles;\n }\n }\n return this.files;\n }\n\n async dest(outDir: string): Promise<string[]> {\n const files = await this.process();\n const writtenPaths: string[] = [];\n const absOutDir = path.isAbsolute(outDir) ? outDir : path.resolve(this.cwd, outDir);\n\n for (const file of files) {\n const targetPath = path.resolve(absOutDir, file.relative);\n await fsUtil.writeFile(targetPath, file.contents);\n writtenPaths.push(targetPath);\n }\n\n return writtenPaths;\n }\n}\n","import path from 'node:path';\n\nexport interface VirtualFileOptions {\n cwd: string;\n base: string;\n path: string;\n contents: Buffer | string;\n}\n\nexport class VirtualFile {\n cwd: string;\n base: string;\n path: string;\n contents: Buffer;\n revPathOriginal?: string;\n\n constructor(options: VirtualFileOptions) {\n this.cwd = options.cwd;\n this.base = options.base;\n this.path = options.path;\n this.contents = typeof options.contents === 'string'\n ? Buffer.from(options.contents)\n : options.contents;\n }\n\n get relative(): string {\n return path.relative(this.base, this.path);\n }\n\n get extname(): string {\n return path.extname(this.path);\n }\n set extname(val: string) {\n const dir = path.dirname(this.path);\n const basename = path.basename(this.path, this.extname);\n this.path = path.join(dir, `${basename}${val.startsWith('.') ? val : `.${val}`}`);\n }\n\n get basename(): string {\n return path.basename(this.path);\n }\n set basename(val: string) {\n const dir = path.dirname(this.path);\n this.path = path.join(dir, val);\n }\n\n get stem(): string {\n return path.basename(this.path, this.extname);\n }\n set stem(val: string) {\n const dir = path.dirname(this.path);\n this.path = path.join(dir, `${val}${this.extname}`);\n }\n\n toString(encoding: BufferEncoding = 'utf8'): string {\n return this.contents.toString(encoding);\n }\n\n clone(): VirtualFile {\n const cloned = new VirtualFile({\n cwd: this.cwd,\n base: this.base,\n path: this.path,\n contents: Buffer.from(this.contents)\n });\n cloned.revPathOriginal = this.revPathOriginal;\n return cloned;\n }\n}\n","import * as sass from 'sass';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport { TransformFn } from '../pipeline.js';\nimport { logger } from '../../utilities/logger.js';\n\nexport interface SassTransformOptions {\n includePaths?: string[];\n alias?: Record<string, string>;\n style?: 'expanded' | 'compressed';\n sourceMap?: boolean;\n [key: string]: any;\n}\n\nfunction resolveFile(baseDir: string, url: string): string | null {\n const possiblePaths = [\n path.resolve(baseDir, url),\n path.resolve(baseDir, `${url}.scss`),\n path.resolve(baseDir, `${url}.sass`),\n path.resolve(baseDir, `${url}.css`),\n path.resolve(baseDir, path.dirname(url), `_${path.basename(url)}.scss`),\n path.resolve(baseDir, path.dirname(url), `_${path.basename(url)}.sass`),\n path.resolve(baseDir, url, '_index.scss'),\n path.resolve(baseDir, url, '_index.sass'),\n path.resolve(baseDir, url, 'index.scss'),\n path.resolve(baseDir, url, 'index.sass')\n ];\n\n for (const p of possiblePaths) {\n try {\n if (fs.existsSync(p) && fs.statSync(p).isFile()) {\n return p;\n }\n } catch {\n // ignore\n }\n }\n return null;\n}\n\nexport function transformSass(options: SassTransformOptions = {}): TransformFn {\n return async (file) => {\n // Only process .scss / .sass files\n if (!/\\.(scss|sass)$/i.test(file.extname)) return file;\n // Skip partials starting with '_'\n if (path.basename(file.path).startsWith('_')) return null;\n\n try {\n const searchDirs = [\n path.dirname(file.path),\n path.resolve(file.cwd, 'node_modules'),\n path.resolve(process.cwd(), 'node_modules'),\n path.resolve(process.cwd(), '..', 'node_modules'),\n ...(options.includePaths || [])\n ];\n\n const customImporter: sass.FileImporter<'async'> = {\n findFileUrl(url) {\n let cleanUrl = url;\n if (cleanUrl.startsWith('~')) {\n cleanUrl = cleanUrl.slice(1);\n }\n\n // 1. Check alias resolution\n if (options.alias) {\n for (const [aliasKey, aliasTarget] of Object.entries(options.alias)) {\n if (cleanUrl === aliasKey) {\n const resolved = resolveFile(path.dirname(aliasTarget), path.basename(aliasTarget));\n if (resolved) return new URL(`file://${resolved}`);\n } else if (cleanUrl.startsWith(`${aliasKey}/`)) {\n const subPath = cleanUrl.slice(aliasKey.length + 1);\n const resolved = resolveFile(aliasTarget, subPath);\n if (resolved) return new URL(`file://${resolved}`);\n }\n }\n }\n\n // 2. Check searchDirs\n for (const dir of searchDirs) {\n const resolved = resolveFile(dir, cleanUrl);\n if (resolved) {\n return new URL(`file://${resolved}`);\n }\n }\n return null;\n }\n };\n\n const result = await sass.compileStringAsync(file.toString(), {\n url: new URL(`file://${file.path}`),\n syntax: file.extname === '.sass' ? 'indented' : 'scss',\n loadPaths: searchDirs,\n importers: [customImporter, new sass.NodePackageImporter()],\n style: options.style || 'expanded',\n sourceMap: options.sourceMap || false\n });\n\n file.contents = Buffer.from(result.css);\n file.extname = '.css';\n return file;\n } catch (err: any) {\n logger.error('sass', `Error compiling ${file.path}: ${err.message}`);\n throw err;\n }\n };\n}\n","import less from 'less';\nimport path from 'node:path';\nimport { TransformFn } from '../pipeline.js';\nimport { logger } from '../../utilities/logger.js';\n\nexport interface LessTransformOptions {\n paths?: string[];\n alias?: Record<string, string>;\n [key: string]: any;\n}\n\nclass AliasFileManager extends less.FileManager {\n private alias: Record<string, string>;\n\n constructor(alias: Record<string, string> = {}) {\n super();\n this.alias = alias;\n }\n\n supports(filename: string): boolean {\n const clean = filename.startsWith('~') ? filename.slice(1) : filename;\n return Object.keys(this.alias).some((k) => clean === k || clean.startsWith(`${k}/`));\n }\n\n loadFile(filename: string, currentDirectory: string, options: any, environment: any): Promise<any> {\n const clean = filename.startsWith('~') ? filename.slice(1) : filename;\n for (const [k, v] of Object.entries(this.alias)) {\n if (clean === k) {\n return super.loadFile(v, currentDirectory, options, environment);\n } else if (clean.startsWith(`${k}/`)) {\n const sub = clean.slice(k.length + 1);\n return super.loadFile(path.join(v, sub), currentDirectory, options, environment);\n }\n }\n return super.loadFile(filename, currentDirectory, options, environment);\n }\n}\n\nexport function transformLess(options: LessTransformOptions = {}): TransformFn {\n return async (file) => {\n if (!/\\.less$/i.test(file.extname)) return file;\n if (path.basename(file.path).startsWith('_')) return null;\n\n try {\n const paths = [\n path.dirname(file.path),\n path.resolve(file.cwd, 'node_modules'),\n ...(options.paths || [])\n ];\n\n const plugins = [...(options.plugins || [])];\n if (options.alias && Object.keys(options.alias).length > 0) {\n plugins.push({\n install: (lessInstance: any, pluginManager: any) => {\n pluginManager.addFileManager(new AliasFileManager(options.alias));\n }\n });\n }\n\n const result = await less.render(file.toString(), {\n filename: file.path,\n paths,\n ...options,\n plugins\n });\n\n file.contents = Buffer.from(result.css);\n file.extname = '.css';\n return file;\n } catch (err: any) {\n logger.error('less', `Error compiling ${file.path}: ${err.message}`);\n throw err;\n }\n };\n}\n","import postcss, { AcceptedPlugin } from 'postcss';\nimport autoprefixer from 'autoprefixer';\nimport postcssPresetEnv from 'postcss-preset-env';\nimport cssnano from 'cssnano';\nimport { TransformFn } from '../pipeline.js';\nimport { logger } from '../../utilities/logger.js';\n\nexport interface PostcssTransformOptions {\n plugins?: AcceptedPlugin[];\n minify?: boolean;\n [key: string]: any;\n}\n\nexport function transformPostcss(options: PostcssTransformOptions = {}): TransformFn {\n const plugins: AcceptedPlugin[] = [\n ...(options.plugins || []),\n autoprefixer(),\n postcssPresetEnv()\n ];\n\n if (options.minify) {\n plugins.push(cssnano({ preset: 'default' }));\n }\n\n const processor = postcss(plugins);\n\n return async (file) => {\n if (!/\\.css$/i.test(file.extname)) return file;\n\n try {\n const result = await processor.process(file.toString(), {\n from: file.path,\n to: file.path\n });\n\n file.contents = Buffer.from(result.css);\n return file;\n } catch (err: any) {\n logger.error('postcss', `Error processing ${file.path}: ${err.message}`);\n throw err;\n }\n };\n}\n","import webpack, { Configuration } from 'webpack';\nimport path from 'node:path';\nimport { BalmConfig } from '../types/index.js';\nimport { logger } from '../utilities/logger.js';\n\nexport async function runWebpack(\n config: BalmConfig,\n customOptions: Configuration = {}\n): Promise<webpack.Stats | undefined> {\n const isProd = config.env.isProd;\n\n let entry = customOptions.entry || config.scripts.entry;\n if (!entry) {\n entry = path.join(config.src.js, 'main.js');\n }\n\n const defaultWebpackConfig: Configuration = {\n mode: isProd ? 'production' : 'development',\n context: config.workspace,\n entry,\n output: {\n path: config.dest.js,\n filename: isProd && config.assets.cache ? '[name].[contenthash:8].js' : '[name].js',\n chunkFilename: isProd && config.assets.cache ? 'chunk/[name].[contenthash:8].js' : 'chunk/[name].js',\n publicPath: config.assets.virtualDir ? `/${config.assets.virtualDir}/` : '/'\n },\n resolve: {\n extensions: ['.wasm', '.mjs', '.js', '.jsx', '.ts', '.tsx', '.json'],\n alias: {\n ...config.alias,\n ...config.scripts.alias\n }\n },\n module: {\n rules: [\n {\n test: /\\.(png|jpe?g|gif|svg|webp)$/i,\n type: 'asset/resource',\n generator: {\n filename: 'img/[name].[hash:8][ext]'\n }\n },\n {\n test: /\\.(woff2?|eot|ttf|otf)$/i,\n type: 'asset/resource',\n generator: {\n filename: 'font/[name].[hash:8][ext]'\n }\n }\n ]\n },\n optimization: {\n minimize: isProd || config.scripts.minify\n },\n devtool: isProd ? false : 'eval-cheap-module-source-map'\n };\n\n const webpackConfig = Object.assign(\n {},\n defaultWebpackConfig,\n config.scripts.webpackOptions,\n customOptions\n );\n\n return new Promise((resolve, reject) => {\n const compiler = webpack(webpackConfig);\n compiler.run((err, stats) => {\n if (err) {\n logger.error('webpack', err.stack || err);\n return reject(err);\n }\n\n if (stats?.hasErrors()) {\n const info = stats.toJson();\n logger.error('webpack', info.errors?.map((e) => e.message).join('\\n'));\n return reject(new Error('Webpack compilation errors'));\n }\n\n resolve(stats);\n });\n });\n}\n","import { rollup, RollupOptions, OutputOptions } from 'rollup';\nimport path from 'node:path';\nimport { BalmConfig } from '../types/index.js';\nimport { logger } from '../utilities/logger.js';\n\nexport async function runRollup(\n config: BalmConfig,\n customInputOptions: RollupOptions = {},\n customOutputOptions: OutputOptions = {}\n): Promise<void> {\n const isProd = config.env.isProd;\n\n let input = customInputOptions.input || config.scripts.entry;\n if (!input) {\n input = path.join(config.src.js, 'main.js');\n }\n\n const inputOptions: RollupOptions = {\n input: input as any,\n ...config.scripts.rollupOptions,\n ...customInputOptions\n };\n\n const outputOptions: OutputOptions = {\n dir: config.dest.js,\n format: 'es',\n sourcemap: !isProd,\n ...customOutputOptions\n };\n\n try {\n const bundle = await rollup(inputOptions);\n await bundle.write(outputOptions);\n await bundle.close();\n } catch (err: any) {\n logger.error('rollup', err.message || err);\n throw err;\n }\n}\n","import * as esbuild from 'esbuild';\nimport path from 'node:path';\nimport { BalmConfig } from '../types/index.js';\nimport { logger } from '../utilities/logger.js';\n\nexport async function runEsbuild(\n config: BalmConfig,\n customOptions: esbuild.BuildOptions = {}\n): Promise<esbuild.BuildResult> {\n const isProd = config.env.isProd;\n\n let entryPoints = customOptions.entryPoints || config.scripts.entry;\n if (!entryPoints) {\n entryPoints = [path.join(config.src.js, 'main.js')];\n }\n\n const defaultOptions: esbuild.BuildOptions = {\n entryPoints: (Array.isArray(entryPoints)\n ? entryPoints\n : typeof entryPoints === 'string'\n ? [entryPoints]\n : entryPoints) as any,\n absWorkingDir: config.workspace,\n bundle: true,\n outdir: config.dest.js,\n alias: {\n ...config.alias,\n ...config.scripts.alias\n },\n minify: isProd || config.scripts.minify,\n sourcemap: !isProd,\n target:\n config.scripts.target && config.scripts.target !== 'web'\n ? (config.scripts.target as string)\n : 'es2020',\n format: 'esm',\n ...config.scripts.esbuildOptions,\n ...customOptions\n };\n\n try {\n return await esbuild.build(defaultOptions);\n } catch (err: any) {\n logger.error('esbuild', err.message || err);\n throw err;\n }\n}\n","import { BaseTask } from '../runner/task.js';\nimport { BalmConfig, BundlerType } from '../types/index.js';\nimport { runWebpack } from '../bundler/webpack.js';\nimport { runRollup } from '../bundler/rollup.js';\nimport { runEsbuild } from '../bundler/esbuild.js';\n\nexport class ScriptTask extends BaseTask {\n constructor() {\n super({ name: 'script', description: 'Bundle JavaScript/TypeScript' });\n }\n\n async run(config: BalmConfig): Promise<void> {\n const bundler = config.scripts.bundler;\n\n switch (bundler) {\n case BundlerType.rollup:\n await runRollup(config);\n break;\n case BundlerType.esbuild:\n await runEsbuild(config);\n break;\n case BundlerType.webpack:\n default:\n await runWebpack(config);\n break;\n }\n }\n}\n","import path from 'node:path';\nimport { BaseTask } from '../runner/task.js';\nimport { BalmConfig } from '../types/index.js';\nimport { Pipeline } from '../pipeline/pipeline.js';\nimport { transformHtmlmin } from '../pipeline/transforms/htmlmin.js';\nimport { transformReplace } from '../pipeline/transforms/replace.js';\nimport { PUBLIC_URL } from '../config/constants.js';\n\nconst LIVE_RELOAD_SCRIPT = `\n<!-- BalmJS Live Reload -->\n<script>\n(() => {\n const protocol = location.protocol === 'https:' ? 'wss:' : 'ws:';\n const ws = new WebSocket(\\`\\${protocol}//\\${location.host}/__balm_ws\\`);\n ws.onmessage = (e) => {\n try {\n const msg = JSON.parse(e.data);\n if (msg.type === 'reload') {\n console.log('[BalmJS] Reloading page...');\n location.reload();\n } else if (msg.type === 'reload-css') {\n console.log('[BalmJS] Reloading CSS...');\n const links = document.querySelectorAll('link[rel=\"stylesheet\"]');\n for (const link of links) {\n const url = new URL(link.href);\n url.searchParams.set('_balm_t', Date.now().toString());\n link.href = url.href;\n }\n }\n } catch {}\n };\n ws.onclose = () => {\n setTimeout(() => location.reload(), 2000);\n };\n})();\n</script>\n`;\n\nexport class HtmlTask extends BaseTask {\n constructor() {\n super({ name: 'html', description: 'Process HTML templates' });\n }\n\n async run(config: BalmConfig): Promise<void> {\n const templateDir = config.scripts.injectHtml\n ? config.src.base\n : config.src.html;\n\n const pattern = path.join(templateDir, '*.html');\n const pipeline = Pipeline.from(pattern, {\n cwd: config.workspace,\n base: templateDir\n });\n\n // Replace %PUBLIC_URL% placeholder\n const publicUrlReplacement = config.assets.virtualDir ? `/${config.assets.virtualDir}` : '';\n pipeline.pipe(transformReplace(new RegExp(PUBLIC_URL, 'g'), publicUrlReplacement));\n\n if (config.env.isProd) {\n pipeline.pipe(transformHtmlmin(config.html.options));\n } else {\n pipeline.pipe(async (file) => {\n if (/\\.html$/i.test(file.extname)) {\n let content = file.toString();\n if (content.includes('</body>')) {\n content = content.replace('</body>', `${LIVE_RELOAD_SCRIPT}\\n</body>`);\n } else {\n content += `\\n${LIVE_RELOAD_SCRIPT}`;\n }\n file.contents = Buffer.from(content);\n }\n return file;\n });\n }\n\n await pipeline.dest(config.dest.html);\n }\n}\n","import { minify } from 'html-minifier-terser';\nimport { TransformFn } from '../pipeline.js';\nimport { logger } from '../../utilities/logger.js';\n\nexport function transformHtmlmin(options: Record<string, any> = {}): TransformFn {\n return async (file) => {\n if (!/\\.html$/i.test(file.extname)) return file;\n\n try {\n const minified = await minify(file.toString(), options);\n file.contents = Buffer.from(minified);\n return file;\n } catch (err: any) {\n logger.error('htmlmin', `Error minifying ${file.path}: ${err.message}`);\n throw err;\n }\n };\n}\n","import { TransformFn } from '../pipeline.js';\nimport { ReplaceOptions } from '../../types/index.js';\n\nexport function transformReplace(\n options: ReplaceOptions | ReplaceOptions[] | string | RegExp,\n replacement?: string | ((substring: string, ...args: any[]) => string)\n): TransformFn {\n let rules: ReplaceOptions[] = [];\n\n if (Array.isArray(options)) {\n rules = options;\n } else if (typeof options === 'object' && 'substr' in options) {\n rules = [options];\n } else if (typeof options === 'string' || options instanceof RegExp) {\n rules = [{ substr: options, replacement: replacement || '' }];\n }\n\n return async (file) => {\n let content = file.toString();\n for (const rule of rules) {\n if (typeof rule.replacement === 'function') {\n content = content.replace(rule.substr, rule.replacement as any);\n } else {\n content = content.replace(rule.substr, rule.replacement);\n }\n }\n file.contents = Buffer.from(content);\n return file;\n };\n}\n","import path from 'node:path';\nimport { BaseTask } from '../runner/task.js';\nimport { BalmConfig, RenameOptions } from '../types/index.js';\nimport { Pipeline } from '../pipeline/pipeline.js';\nimport { transformRename } from '../pipeline/transforms/rename.js';\n\nexport interface CopyTaskOptions {\n input: string | string[];\n output: string;\n rename?: RenameOptions | string | Function;\n}\n\nexport class CopyTask extends BaseTask {\n private options: CopyTaskOptions;\n\n constructor(options: CopyTaskOptions) {\n super({ name: 'copy', description: 'Copy files to destination' });\n this.options = options;\n }\n\n async run(config: BalmConfig): Promise<void> {\n const pipeline = Pipeline.from(this.options.input, {\n cwd: config.workspace\n });\n\n if (this.options.rename) {\n pipeline.pipe(transformRename(this.options.rename));\n }\n\n const outDir = path.isAbsolute(this.options.output)\n ? this.options.output\n : path.join(config.workspace, this.options.output);\n\n await pipeline.dest(outDir);\n }\n}\n","import path from 'node:path';\nimport { TransformFn } from '../pipeline.js';\nimport { RenameOptions } from '../../types/index.js';\n\nexport function transformRename(\n options: string | Function | RenameOptions = {}\n): TransformFn {\n return async (file) => {\n if (typeof options === 'string') {\n file.path = path.resolve(path.dirname(file.path), options);\n return file;\n }\n\n if (typeof options === 'function') {\n const parsed = {\n dirname: path.dirname(file.path),\n basename: file.stem,\n extname: file.extname\n };\n const result = options(parsed);\n if (result) {\n if (result.dirname) file.path = path.join(result.dirname, path.basename(file.path));\n if (result.basename) file.stem = result.basename;\n if (result.extname) file.extname = result.extname;\n }\n return file;\n }\n\n const { dirname, prefix = '', basename, suffix = '', extname } = options;\n const currentDir = dirname ? path.resolve(file.cwd, dirname) : path.dirname(file.path);\n const base = basename !== undefined ? basename : file.stem;\n const ext = extname !== undefined ? extname : file.extname;\n\n file.path = path.join(currentDir, `${prefix}${base}${suffix}${ext.startsWith('.') ? ext : `.${ext}`}`);\n return file;\n };\n}\n","import path from 'node:path';\nimport { BaseTask } from '../runner/task.js';\nimport { BalmConfig } from '../types/index.js';\nimport { file } from '../utilities/file.js';\nimport { logger } from '../utilities/logger.js';\n\nexport class RemoveTask extends BaseTask {\n private target: string | string[];\n\n constructor(target: string | string[]) {\n super({ name: 'remove', description: 'Remove files and directories' });\n this.target = target;\n }\n\n async run(config: BalmConfig): Promise<void> {\n const targets = Array.isArray(this.target) ? this.target : [this.target];\n const resolvedTargets = targets.map((t) =>\n path.isAbsolute(t) ? t : path.join(config.workspace, t)\n );\n\n const deleted = await file.remove(resolvedTargets);\n logger.warn('remove', `Removed: ${deleted.join(', ')}`);\n }\n}\n","import path from 'node:path';\nimport { BaseTask } from '../runner/task.js';\nimport { BalmConfig, ReplaceOptions } from '../types/index.js';\nimport { Pipeline } from '../pipeline/pipeline.js';\nimport { transformReplace } from '../pipeline/transforms/replace.js';\n\nexport interface ReplaceTaskOptions {\n input: string | string[];\n output: string;\n options: ReplaceOptions | ReplaceOptions[];\n}\n\nexport class ReplaceTask extends BaseTask {\n private taskOptions: ReplaceTaskOptions;\n\n constructor(taskOptions: ReplaceTaskOptions) {\n super({ name: 'replace', description: 'Replace content in files' });\n this.taskOptions = taskOptions;\n }\n\n async run(config: BalmConfig): Promise<void> {\n const pipeline = Pipeline.from(this.taskOptions.input, {\n cwd: config.workspace\n });\n\n pipeline.pipe(transformReplace(this.taskOptions.options));\n\n const outDir = path.isAbsolute(this.taskOptions.output)\n ? this.taskOptions.output\n : path.join(config.workspace, this.taskOptions.output);\n\n await pipeline.dest(outDir);\n }\n}\n","import path from 'node:path';\nimport fg from 'fast-glob';\nimport fs from 'node:fs/promises';\nimport { BaseTask } from '../runner/task.js';\nimport { BalmConfig } from '../types/index.js';\nimport { VirtualFile } from '../pipeline/file.js';\nimport { AssetRevisioner } from '../pipeline/transforms/cache.js';\nimport { file as fsUtil } from '../utilities/file.js';\nimport { logger } from '../utilities/logger.js';\n\nexport class CacheTask extends BaseTask {\n constructor() {\n super({ name: 'cache', description: 'Revision assets and generate manifest' });\n }\n\n async run(config: BalmConfig): Promise<void> {\n const destDir = config.dest.base;\n const filesToRev = await fg(['**/*'], {\n cwd: destDir,\n absolute: true,\n onlyFiles: true\n });\n\n if (!filesToRev.length) {\n logger.warn('cache', 'No files found to cache');\n return;\n }\n\n const virtualFiles = await Promise.all(\n filesToRev.map(async (filePath) => {\n const buffer = await fs.readFile(filePath);\n return new VirtualFile({\n cwd: config.workspace,\n base: destDir,\n path: filePath,\n contents: buffer\n });\n })\n );\n\n const revisioner = new AssetRevisioner(config.assets.options);\n const resultFiles = revisioner.process(virtualFiles);\n\n // Remove old files that have been renamed\n for (const vFile of resultFiles) {\n if (vFile.revPathOriginal && vFile.revPathOriginal !== vFile.path) {\n await fsUtil.remove(vFile.revPathOriginal);\n }\n }\n\n // Write new / updated files\n for (const vFile of resultFiles) {\n await fsUtil.writeFile(vFile.path, vFile.contents);\n }\n\n logger.success('cache', 'Asset revisioning and rev-manifest.json completed');\n }\n}\n","import path from 'node:path';\nimport picomatch from 'picomatch';\nimport { VirtualFile } from '../file.js';\nimport { file as fsUtil } from '../../utilities/file.js';\n\nexport interface CacheTransformOptions {\n fileNameManifest?: string;\n dontRenameFile?: (string | RegExp)[];\n dontUpdateReference?: (string | RegExp)[];\n hashLength?: number;\n [key: string]: any;\n}\n\nfunction matchesAny(filePath: string, rules?: (string | RegExp)[]): boolean {\n if (!rules || !rules.length) return false;\n for (const rule of rules) {\n if (typeof rule === 'string') {\n if (filePath.endsWith(rule) || picomatch.isMatch(filePath, rule)) {\n return true;\n }\n } else if (rule instanceof RegExp) {\n if (rule.test(filePath)) return true;\n }\n }\n return false;\n}\n\nexport class AssetRevisioner {\n private options: CacheTransformOptions;\n private manifest: Record<string, string> = {};\n\n constructor(options: CacheTransformOptions = {}) {\n this.options = {\n fileNameManifest: 'rev-manifest.json',\n dontRenameFile: ['.html'],\n dontUpdateReference: [],\n hashLength: 8,\n ...options\n };\n }\n\n process(files: VirtualFile[]): VirtualFile[] {\n const hashLength = this.options.hashLength || 8;\n const outputFiles: VirtualFile[] = [];\n\n // Phase 1: Calculate hashes and renames\n for (const file of files) {\n const origRelative = file.relative;\n file.revPathOriginal = file.path;\n\n const shouldRename = !matchesAny(file.path, this.options.dontRenameFile) &&\n !matchesAny(file.relative, this.options.dontRenameFile);\n\n if (shouldRename) {\n const fileHash = fsUtil.hash(file.contents, hashLength);\n const dir = path.dirname(file.path);\n const newFilename = `${file.stem}.${fileHash}${file.extname}`;\n file.path = path.join(dir, newFilename);\n }\n\n this.manifest[origRelative] = file.relative;\n outputFiles.push(file);\n }\n\n // Phase 2: Rewrite references\n for (const file of outputFiles) {\n const shouldUpdate = !matchesAny(file.path, this.options.dontUpdateReference) &&\n !matchesAny(file.relative, this.options.dontUpdateReference);\n\n if (shouldUpdate && /\\.(html|css|js)$/i.test(file.extname)) {\n let content = file.toString();\n for (const [orig, reved] of Object.entries(this.manifest)) {\n if (orig !== reved) {\n const origBase = path.basename(orig);\n const revedBase = path.basename(reved);\n content = content.replaceAll(origBase, revedBase);\n }\n }\n file.contents = Buffer.from(content);\n }\n }\n\n // Phase 3: Add manifest file\n const manifestName = this.options.fileNameManifest || 'rev-manifest.json';\n const firstBase = files[0]?.base || process.cwd();\n const manifestFile = new VirtualFile({\n cwd: files[0]?.cwd || process.cwd(),\n base: firstBase,\n path: path.join(firstBase, manifestName),\n contents: JSON.stringify(this.manifest, null, 2)\n });\n outputFiles.push(manifestFile);\n\n return outputFiles;\n }\n}\n","import path from 'node:path';\nimport { BaseTask } from '../runner/task.js';\nimport { BalmConfig, TemplateOption, RenameOptions } from '../types/index.js';\nimport { Pipeline } from '../pipeline/pipeline.js';\nimport { transformRename } from '../pipeline/transforms/rename.js';\nimport { logger } from '../utilities/logger.js';\n\nexport interface PublishTaskOptions {\n input?: string | TemplateOption[];\n output?: string;\n renameOptions?: string | Function | RenameOptions;\n}\n\nexport class PublishTask extends BaseTask {\n private options: PublishTaskOptions;\n\n constructor(options: PublishTaskOptions = {}) {\n super({ name: 'publish', description: 'Publish assets or templates' });\n this.options = options;\n }\n\n async run(config: BalmConfig): Promise<void> {\n if (!config.env.isProd) {\n logger.warn('publish', '`mix.publish()` is only supported in production mode');\n return;\n }\n\n const { input, output, renameOptions } = this.options;\n\n if (Array.isArray(input)) {\n for (const item of input) {\n await this.publishItem(config, item.input, item.output, item.renameOptions);\n }\n } else if (typeof input === 'string' && output) {\n await this.publishItem(config, input, output, renameOptions);\n } else {\n // Default: publish all static assets from dest.base to assets.static\n const srcDir = config.dest.base;\n const targetDir = config.assets.static || path.join(config.assets.root, config.assets.mainDir);\n\n const pipeline = Pipeline.from(['**/*'], {\n cwd: srcDir,\n base: srcDir\n });\n\n await pipeline.dest(path.resolve(config.workspace, targetDir));\n }\n }\n\n private async publishItem(\n config: BalmConfig,\n input: string,\n output: string,\n rename?: string | Function | RenameOptions\n ): Promise<void> {\n const srcPath = path.isAbsolute(input) ? input : path.join(config.dest.base, input);\n const destDir = path.isAbsolute(output)\n ? output\n : path.join(config.workspace, config.assets.root, output);\n\n const pipeline = Pipeline.from(srcPath, {\n cwd: config.dest.base\n });\n\n if (rename) {\n pipeline.pipe(transformRename(rename));\n }\n\n await pipeline.dest(destDir);\n }\n}\n","import path from 'node:path';\nimport { generateSW, injectManifest } from 'workbox-build';\nimport { BaseTask } from '../runner/task.js';\nimport { BalmConfig } from '../types/index.js';\nimport { logger } from '../utilities/logger.js';\n\nexport interface PwaTaskOptions {\n mode?: 'generateSW' | 'injectManifest';\n options?: Record<string, any>;\n}\n\nexport class PwaTask extends BaseTask {\n private options: PwaTaskOptions;\n\n constructor(options: PwaTaskOptions = {}) {\n super({ name: 'pwa', description: 'Generate Progressive Web App Service Worker' });\n this.options = options;\n }\n\n async run(config: BalmConfig): Promise<void> {\n const mode = this.options.mode || config.pwa.mode || 'generateSW';\n const globDirectory = config.dest.base;\n const swDest = path.join(globDirectory, config.pwa.swDestFilename);\n const swSrc = path.join(config.src.base, config.pwa.swSrcFilename);\n\n const mergedOptions: any = {\n globDirectory,\n swDest,\n ...config.pwa.options,\n ...this.options.options\n };\n\n if (mode === 'injectManifest') {\n mergedOptions.swSrc = mergedOptions.swSrc || swSrc;\n }\n\n try {\n if (mode === 'generateSW') {\n const { count, size } = await generateSW(mergedOptions);\n logger.info('pwa', `Generated '${swDest}', precaching ${count} files (${size} bytes)`);\n } else {\n const { count, size } = await injectManifest(mergedOptions);\n logger.info('pwa', `Injected manifest into '${swDest}', precaching ${count} files (${size} bytes)`);\n }\n } catch (err: any) {\n logger.warn('pwa', `Service worker generation failed: ${err.message || err}`);\n }\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport archiver from 'archiver';\nimport { BaseTask } from '../runner/task.js';\nimport { BalmConfig } from '../types/index.js';\nimport { file as fsUtil } from '../utilities/file.js';\nimport { logger } from '../utilities/logger.js';\n\nexport interface ZipTaskOptions {\n input?: string | string[];\n output?: string;\n filename?: string;\n}\n\nexport class ZipTask extends BaseTask {\n private options: ZipTaskOptions;\n\n constructor(options: ZipTaskOptions = {}) {\n super({ name: 'zip', description: 'Compress files into archive' });\n this.options = options;\n }\n\n async run(config: BalmConfig): Promise<void> {\n const input = this.options.input || config.dest.base;\n const outputDir = this.options.output\n ? (path.isAbsolute(this.options.output) ? this.options.output : path.join(config.workspace, this.options.output))\n : config.workspace;\n const filename = this.options.filename || 'archive.zip';\n const zipPath = path.join(outputDir, filename);\n\n await fsUtil.ensureDir(outputDir);\n\n return new Promise((resolve, reject) => {\n const outputStream = fs.createWriteStream(zipPath);\n const archive = archiver('zip', { zlib: { level: 9 } });\n\n outputStream.on('close', () => {\n logger.success('zip', `Created ${zipPath} (${archive.pointer()} total bytes)`);\n resolve();\n });\n\n archive.on('error', (err) => {\n logger.error('zip', err.message);\n reject(err);\n });\n\n archive.pipe(outputStream);\n\n const inputs = Array.isArray(input) ? input : [input];\n for (const item of inputs) {\n const fullPath = path.isAbsolute(item) ? item : path.join(config.workspace, item);\n if (fs.existsSync(fullPath)) {\n const stat = fs.statSync(fullPath);\n if (stat.isDirectory()) {\n archive.directory(fullPath, false);\n } else {\n archive.file(fullPath, { name: path.basename(fullPath) });\n }\n }\n }\n\n archive.finalize();\n });\n }\n}\n","import path from 'node:path';\nimport fs from 'node:fs';\nimport { Client } from 'ssh2';\nimport fg from 'fast-glob';\nimport { BaseTask } from '../runner/task.js';\nimport { BalmConfig } from '../types/index.js';\nimport { logger } from '../utilities/logger.js';\n\nexport interface FtpTaskOptions {\n localFiles?: string | string[];\n options?: {\n host?: string;\n port?: number;\n username?: string;\n password?: string;\n privateKey?: string;\n remotePath?: string;\n [key: string]: any;\n };\n}\n\nexport class FtpTask extends BaseTask {\n private ftpOptions: FtpTaskOptions;\n\n constructor(ftpOptions: FtpTaskOptions = {}) {\n super({ name: 'ftp', description: 'Upload files via SFTP' });\n this.ftpOptions = ftpOptions;\n }\n\n async run(config: BalmConfig): Promise<void> {\n const options = {\n port: 22,\n remotePath: '/',\n ...config.ftp.options,\n ...this.ftpOptions.options\n };\n\n if (!options.host) {\n logger.error('ftp', '`host` required for SFTP');\n return;\n }\n\n const localFiles = this.ftpOptions.localFiles || config.dest.base;\n const files = await fg(localFiles, { cwd: config.workspace, absolute: true, onlyFiles: true });\n\n if (!files.length) {\n logger.warn('ftp', 'No files to upload');\n return;\n }\n\n return new Promise((resolve, reject) => {\n const conn = new Client();\n\n conn.on('ready', () => {\n conn.sftp((err, sftp) => {\n if (err) {\n conn.end();\n return reject(err);\n }\n\n let pending = files.length;\n for (const file of files) {\n const rel = path.relative(config.workspace, file);\n const remoteFile = path.posix.join(options.remotePath, rel);\n\n sftp.fastPut(file, remoteFile, (putErr) => {\n if (putErr) {\n logger.error('ftp', `Failed uploading ${file}: ${putErr.message}`);\n } else {\n logger.info('ftp', `Uploaded ${file} -> ${remoteFile}`);\n }\n pending--;\n if (pending === 0) {\n conn.end();\n resolve();\n }\n });\n }\n });\n });\n\n conn.on('error', (connErr) => {\n logger.error('ftp', connErr.message);\n reject(connErr);\n });\n\n conn.connect(options as any);\n });\n }\n}\n","import http from 'node:http';\nimport connect from 'connect';\nimport serveStatic from 'serve-static';\nimport { WebSocketServer, WebSocket } from 'ws';\nimport { createProxyMiddleware } from 'http-proxy-middleware';\nimport { BaseTask } from '../runner/task.js';\nimport { BalmConfig } from '../types/index.js';\nimport { FileWatcher } from '../watcher/index.js';\nimport { logger } from '../utilities/logger.js';\nimport pc from 'picocolors';\n\nexport class ServerTask extends BaseTask {\n private watcher: FileWatcher | null = null;\n private wsServer: WebSocketServer | null = null;\n private clients = new Set<WebSocket>();\n\n constructor() {\n super({ name: 'serve', description: 'Start development server with live reload' });\n }\n\n broadcast(data: { type: 'reload' | 'reload-css'; file?: string }): void {\n const payload = JSON.stringify(data);\n for (const client of this.clients) {\n if (client.readyState === WebSocket.OPEN) {\n client.send(payload);\n }\n }\n }\n\n async run(config: BalmConfig): Promise<void> {\n if (config.env.isProd) {\n logger.warn('server', 'Development server is disabled in production mode');\n return;\n }\n\n const app = connect();\n const port = config.server.port || 3000;\n const host = config.server.host || 'localhost';\n\n // Static assets\n app.use(serveStatic(config.dest.base));\n app.use(serveStatic(config.src.base));\n\n // Proxy middleware\n if (config.server.proxy && typeof config.server.proxy === 'object') {\n const proxyEntries = Array.isArray(config.server.proxy)\n ? config.server.proxy\n : [config.server.proxy];\n\n for (const entry of proxyEntries) {\n if (entry.context && entry.options) {\n app.use(createProxyMiddleware(entry.options));\n }\n }\n }\n\n const server = http.createServer(app);\n\n // WebSocket Live Reload Server\n this.wsServer = new WebSocketServer({ server, path: '/__balm_ws' });\n this.wsServer.on('connection', (socket) => {\n this.clients.add(socket);\n socket.on('close', () => this.clients.delete(socket));\n });\n\n // Start File Watcher\n this.watcher = new FileWatcher(config, (data) => {\n this.broadcast(data);\n });\n this.watcher.start();\n\n return new Promise((resolve) => {\n server.listen(port, host, () => {\n console.log('');\n logger.success('server', pc.bold('BalmJS Dev Server is ready!'));\n console.log(` ${pc.green('➜')} ${pc.bold('Local:')} ${pc.cyan(`http://${host}:${port}/`)}`);\n console.log(` ${pc.green('➜')} ${pc.bold('Network:')} ${pc.cyan(`http://127.0.0.1:${port}/`)}`);\n console.log('');\n\n if (config.env.isTest) {\n this.watcher?.stop();\n this.wsServer?.close();\n server.close();\n resolve();\n }\n });\n });\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { BalmConfig } from '../types/index.js';\nimport { StyleTask } from '../tasks/style.js';\nimport { ScriptTask } from '../tasks/script.js';\nimport { HtmlTask } from '../tasks/html.js';\nimport { logger } from '../utilities/logger.js';\nimport pc from 'picocolors';\n\nexport interface WatcherBroadcast {\n (data: { type: 'reload' | 'reload-css'; file?: string }): void;\n}\n\nexport class FileWatcher {\n private config: BalmConfig;\n private broadcast: WatcherBroadcast;\n private debounceTimer: NodeJS.Timeout | null = null;\n private pendingFiles = new Set<string>();\n private styleTask: StyleTask;\n private scriptTask: ScriptTask;\n private htmlTask: HtmlTask;\n private watcher: fs.FSWatcher | null = null;\n\n constructor(config: BalmConfig, broadcast: WatcherBroadcast) {\n this.config = config;\n this.broadcast = broadcast;\n this.styleTask = new StyleTask();\n this.scriptTask = new ScriptTask();\n this.htmlTask = new HtmlTask();\n }\n\n start(): void {\n const watchDir = this.config.src.base;\n if (!fs.existsSync(watchDir)) return;\n\n logger.info('watch', `Watching for file changes in ${pc.cyan(watchDir)}`);\n\n try {\n this.watcher = fs.watch(watchDir, { recursive: true }, (eventType, filename) => {\n if (!filename) return;\n this.pendingFiles.add(filename);\n\n if (this.debounceTimer) clearTimeout(this.debounceTimer);\n this.debounceTimer = setTimeout(() => {\n this.handleChanges();\n }, 50);\n });\n } catch (err: any) {\n logger.warn('watch', `Native recursive watch failed: ${err.message}`);\n }\n }\n\n private async handleChanges(): Promise<void> {\n const changed = Array.from(this.pendingFiles);\n this.pendingFiles.clear();\n\n const hasStyle = changed.some((f) => /\\.(scss|sass|less|css)$/i.test(f));\n const hasScript = changed.some((f) => /\\.(js|mjs|cjs|ts|jsx|tsx)$/i.test(f));\n const hasHtml = changed.some((f) => /\\.html$/i.test(f));\n\n try {\n if (hasStyle) {\n const start = performance.now();\n await this.styleTask.run(this.config);\n const duration = (performance.now() - start).toFixed(1);\n logger.info('watch', `Recompiled styles in ${pc.bold(duration + 'ms')}`);\n this.broadcast({ type: 'reload-css' });\n }\n\n if (hasScript) {\n const start = performance.now();\n await this.scriptTask.run(this.config);\n const duration = (performance.now() - start).toFixed(1);\n logger.info('watch', `Rebundled scripts in ${pc.bold(duration + 'ms')}`);\n this.broadcast({ type: 'reload' });\n }\n\n if (hasHtml) {\n const start = performance.now();\n await this.htmlTask.run(this.config);\n const duration = (performance.now() - start).toFixed(1);\n logger.info('watch', `Recompiled HTML in ${pc.bold(duration + 'ms')}`);\n this.broadcast({ type: 'reload' });\n }\n\n if (!hasStyle && !hasScript && !hasHtml && changed.length > 0) {\n this.broadcast({ type: 'reload' });\n }\n } catch (err: any) {\n logger.error('watch', `Incremental rebuild failed: ${err?.message || err}`);\n }\n }\n\n stop(): void {\n if (this.watcher) {\n this.watcher.close();\n this.watcher = null;\n }\n }\n}\n","import {\n CopyTask,\n RemoveTask,\n ReplaceTask,\n PublishTask,\n PwaTask,\n ZipTask,\n FtpTask,\n ServerTask\n} from '../tasks/index.js';\nimport { FunctionTask } from '../runner/task.js';\nimport { Pipeline } from '../pipeline/pipeline.js';\nimport { transformSass } from '../pipeline/transforms/sass.js';\nimport { transformLess } from '../pipeline/transforms/less.js';\nimport { transformPostcss } from '../pipeline/transforms/postcss.js';\nimport { runWebpack } from '../bundler/webpack.js';\nimport { runRollup } from '../bundler/rollup.js';\nimport { runEsbuild } from '../bundler/esbuild.js';\nimport { TaskDAG } from '../runner/dag.js';\nimport {\n RenameOptions,\n ReplaceOptions,\n TemplateOption,\n BalmConfig\n} from '../types/index.js';\nimport { logger } from '../utilities/logger.js';\n\nexport class BalmHooks {\n private dag: TaskDAG;\n private recipeIndex = 0;\n\n constructor(dag: TaskDAG) {\n this.dag = dag;\n }\n\n private addRecipeTask(fn: (config: BalmConfig) => Promise<void> | void): void {\n this.recipeIndex++;\n const taskName = `recipe:${this.recipeIndex}`;\n this.dag.registerTask(new FunctionTask(taskName, fn));\n }\n\n copy(\n input: string | string[],\n output: string,\n options: { rename?: RenameOptions | string | Function } = {}\n ): this {\n this.addRecipeTask(async (config) => {\n const task = new CopyTask({ input, output, rename: options.rename });\n await task.run(config);\n });\n return this;\n }\n\n remove(target: string | string[]): this {\n this.addRecipeTask(async (config) => {\n const task = new RemoveTask(target);\n await task.run(config);\n });\n return this;\n }\n\n replace(\n input: string | string[],\n output: string,\n options: ReplaceOptions | ReplaceOptions[]\n ): this {\n this.addRecipeTask(async (config) => {\n const task = new ReplaceTask({ input, output, options });\n await task.run(config);\n });\n return this;\n }\n\n sass(input: string | string[], output: string, options = {}): this {\n this.addRecipeTask(async (config) => {\n const pipeline = Pipeline.from(input, { cwd: config.workspace });\n pipeline.pipe(transformSass(options));\n pipeline.pipe(transformPostcss({ minify: config.env.isProd }));\n await pipeline.dest(output);\n });\n return this;\n }\n\n less(input: string | string[], output: string, options = {}): this {\n this.addRecipeTask(async (config) => {\n const pipeline = Pipeline.from(input, { cwd: config.workspace });\n pipeline.pipe(transformLess(options));\n pipeline.pipe(transformPostcss({ minify: config.env.isProd }));\n await pipeline.dest(output);\n });\n return this;\n }\n\n css(input: string | string[], output: string, options = {}): this {\n this.addRecipeTask(async (config) => {\n const pipeline = Pipeline.from(input, { cwd: config.workspace });\n pipeline.pipe(transformPostcss({ minify: config.env.isProd, ...options }));\n await pipeline.dest(output);\n });\n return this;\n }\n\n webpack(entry?: any, output?: string, customOptions = {}): this {\n this.addRecipeTask(async (config) => {\n await runWebpack(config, {\n ...(entry ? { entry } : {}),\n ...(output ? { output: { path: output } } : {}),\n ...customOptions\n });\n });\n return this;\n }\n\n rollup(input?: any, output?: any, customInputOptions = {}, customOutputOptions = {}): this {\n this.addRecipeTask(async (config) => {\n await runRollup(\n config,\n { ...(input ? { input } : {}), ...customInputOptions },\n { ...(output ? { dir: output } : {}), ...customOutputOptions }\n );\n });\n return this;\n }\n\n esbuild(entryPoints?: any, outdir?: string, customOptions = {}): this {\n this.addRecipeTask(async (config) => {\n await runEsbuild(config, {\n ...(entryPoints ? { entryPoints } : {}),\n ...(outdir ? { outdir } : {}),\n ...customOptions\n });\n });\n return this;\n }\n\n js(input?: any, output?: any, options = {}): this {\n logger.warn('balm api', '`mix.js` is deprecated, please use `mix.webpack`/`mix.rollup`/`mix.esbuild` instead.');\n return this.webpack(input, output, options);\n }\n\n publish(\n input?: string | TemplateOption[],\n output?: string,\n renameOptions?: string | Function | RenameOptions\n ): this {\n this.addRecipeTask(async (config) => {\n const task = new PublishTask({ input, output, renameOptions });\n await task.run(config);\n });\n return this;\n }\n\n generateSW(options = {}): this {\n this.addRecipeTask(async (config) => {\n const task = new PwaTask({ mode: 'generateSW', options });\n await task.run(config);\n });\n return this;\n }\n\n injectManifest(options = {}): this {\n this.addRecipeTask(async (config) => {\n const task = new PwaTask({ mode: 'injectManifest', options });\n await task.run(config);\n });\n return this;\n }\n\n ftp(localFiles?: string | string[], options = {}): this {\n this.addRecipeTask(async (config) => {\n const task = new FtpTask({ localFiles, options });\n await task.run(config);\n });\n return this;\n }\n\n zip(input?: string | string[], output?: string, filename?: string): this {\n this.addRecipeTask(async (config) => {\n const task = new ZipTask({ input, output, filename });\n await task.run(config);\n });\n return this;\n }\n\n serve(): this {\n this.addRecipeTask(async (config) => {\n const task = new ServerTask();\n await task.run(config);\n });\n return this;\n }\n}\n","import { BalmConfig, BalmCustomConfig, BundlerType } from './types/index.js';\nimport { resolveConfig } from './config/index.js';\nimport { TaskDAG } from './runner/dag.js';\nimport { BalmHooks } from './hooks/index.js';\nimport { CleanTask } from './tasks/clean.js';\nimport { StyleTask } from './tasks/style.js';\nimport { ScriptTask } from './tasks/script.js';\nimport { HtmlTask } from './tasks/html.js';\nimport { CacheTask } from './tasks/cache.js';\nimport { PwaTask } from './tasks/pwa.js';\nimport { ServerTask } from './tasks/server.js';\nimport { logger } from './utilities/logger.js';\n\nexport class Balm {\n private _config: BalmConfig;\n private dag = new TaskDAG();\n beforeTask?: () => Promise<void> | void;\n afterTask?: () => Promise<void> | void;\n readonly Bundler = BundlerType;\n\n constructor() {\n this._config = resolveConfig();\n }\n\n get config(): BalmConfig {\n return this._config;\n }\n set config(customConfig: BalmCustomConfig) {\n this._config = resolveConfig(customConfig);\n if (this._config.logs?.level !== undefined) {\n logger.level = this._config.logs.level;\n }\n }\n\n async go(recipe?: (mix: BalmHooks) => void): Promise<void> {\n const endTimer = logger.time('Build');\n const taskSequence: string[] = [];\n\n // Register built-in tasks\n this.dag.registerTask(new CleanTask());\n this.dag.registerTask(new StyleTask());\n this.dag.registerTask(new ScriptTask());\n this.dag.registerTask(new HtmlTask());\n this.dag.registerTask(new CacheTask());\n this.dag.registerTask(new PwaTask());\n this.dag.registerTask(new ServerTask());\n\n // Run recipe hooks\n if (typeof recipe === 'function') {\n const hooks = new BalmHooks(this.dag);\n recipe(hooks);\n }\n\n if (this._config.useDefaults) {\n taskSequence.push('clean', 'style', 'script', 'html');\n\n if (this._config.env.isProd) {\n if (this._config.assets.cache) {\n taskSequence.push('cache');\n }\n if (this._config.pwa.enabled) {\n taskSequence.push('pwa');\n }\n } else {\n taskSequence.push('serve');\n }\n }\n\n try {\n if (this.beforeTask) {\n await this.beforeTask();\n }\n\n // Execute built-in series\n await this.dag.runSeries(taskSequence, this._config);\n\n // Execute recipe tasks\n for (let i = 1; ; i++) {\n const recipeName = `recipe:${i}`;\n if (!this.dag.hasTask(recipeName)) break;\n await this.dag.executeTask(recipeName, this._config);\n }\n\n if (this.afterTask) {\n await this.afterTask();\n }\n\n endTimer();\n } catch (err: any) {\n logger.error('build', `Build failed: ${err?.message || err}`);\n throw err;\n }\n }\n\n reset(): void {\n this.dag.clear();\n this.beforeTask = undefined;\n this.afterTask = undefined;\n this._config = resolveConfig();\n }\n}\n\nexport const balm = new Balm();\n","import { minify, MinifyOptions } from 'terser';\nimport { TransformFn } from '../pipeline.js';\nimport { logger } from '../../utilities/logger.js';\n\nexport function transformTerser(options: MinifyOptions = {}): TransformFn {\n return async (file) => {\n if (!/\\.js$/i.test(file.extname)) return file;\n\n try {\n const result = await minify(file.toString(), options);\n if (result.code) {\n file.contents = Buffer.from(result.code);\n }\n return file;\n } catch (err: any) {\n logger.error('terser', `Error minifying ${file.path}: ${err.message}`);\n throw err;\n }\n };\n}\n","import { balm, Balm } from './balm.js';\n\nexport default balm;\nexport { Balm, balm };\nexport * from './types/index.js';\nexport * from './config/index.js';\nexport * from './runner/task.js';\nexport * from './runner/dag.js';\nexport * from './pipeline/index.js';\nexport * from './bundler/index.js';\nexport * from './tasks/index.js';\nexport * from './hooks/index.js';\nexport * from './utilities/logger.js';\nexport * from './utilities/file.js';\nexport * from './utilities/utils.js';\nexport * from './utilities/workspace.js';\n"],"mappings":"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","names":["BundlerType","path","path","localWorkspace","globalWorkspace","path","LogLevel","pc","path","path","path","path","path","fg","fs","path","fg","path","fs","file","path","fs","path","fs","file","path","path","file","file","path","path","path","path","path","path","path","path","file","file","path","file","path","path","file","path","path","path","path","path","fg","fs","path","file","path","fg","fs","path","path","path","path","fs","path","path","fs","path","fg","fg","file","path","fs","pc","fs","pc","minify","file","minify"]}
package/package.json CHANGED
@@ -1,134 +1,59 @@
1
1
  {
2
2
  "name": "balm-core",
3
- "version": "5.2.0",
4
- "description": "BalmJS compiler core",
5
- "keywords": [
6
- "balm",
7
- "balmjs",
8
- "web",
9
- "app",
10
- "front-end",
11
- "workflow"
12
- ],
13
- "homepage": "https://balm.js.org",
14
- "license": "MIT",
15
- "author": {
16
- "name": "Elf-mousE",
17
- "email": "ifmouz@gmail.com",
18
- "url": "http://elf-mouse.me"
19
- },
20
- "contributors": [
21
- {
22
- "name": "74sharlock",
23
- "email": "sharlock7788@gmail.com"
24
- },
25
- {
26
- "name": "Lenny-Hu",
27
- "email": "a97251292@gmail.com"
28
- }
29
- ],
30
- "files": [
31
- "lib",
32
- "tslib",
33
- "index.d.ts"
34
- ],
3
+ "version": "6.0.0-alpha.0",
35
4
  "type": "module",
36
- "exports": "./lib/index.js",
37
- "types": "index.d.ts",
38
- "repository": {
39
- "type": "git",
40
- "url": "git+https://github.com/balmjs/balm.git",
41
- "directory": "packages/balm-core"
5
+ "description": "Next-generation core build engine for BalmJS",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ }
42
15
  },
43
16
  "dependencies": {
44
- "@rollup/plugin-terser": "^1.0.0",
45
- "ansi-colors": "^4.1.3",
46
- "async": "^3.2.6",
47
- "autoprefixer": "^10.5.0",
48
- "babel-loader": "^10.1.1",
49
- "browser-sync": "^3.0.4",
50
- "connect-history-api-fallback": "^2.0.0",
51
- "css-loader": "^7.1.4",
52
- "css-minimizer-webpack-plugin": "^8.0.0",
53
- "cssnano": "7",
54
- "del": "^8.0.1",
55
- "dotenv": "^17.4.2",
56
- "dotenv-expand": "^13.0.0",
57
- "esbuild": "^0.28.0",
58
- "fancy-log": "^2.0.0",
59
- "gulp-eslint": "^6.0.0",
60
- "gulp-if": "^3.0.0",
61
- "gulp-load-plugins": "^2.0.8",
62
- "gulp-rev-all": "^5.1.0",
63
- "gulp-rev-delete-original": "^0.2.3",
64
- "gulp-size": "^5.0.0",
65
- "gulp-useref": "^5.0.0",
66
- "gulp-zip": "^6.1.0",
67
- "gulp.spritesmith": "^6.13.1",
68
- "html-loader": "^5.1.0",
17
+ "archiver": "^7.0.1",
18
+ "autoprefixer": "^10.4.20",
19
+ "connect": "^3.7.0",
20
+ "cssnano": "^7.0.6",
21
+ "esbuild": "^0.25.0",
22
+ "fast-glob": "^3.3.3",
69
23
  "html-minifier-terser": "^7.2.0",
70
- "html-webpack-plugin": "^5.6.7",
71
- "http-proxy-middleware": "3",
72
- "imagemin": "^9.0.1",
73
- "istextorbinary": "^9.5.0",
74
- "less": "^4.6.4",
75
- "mini-css-extract-plugin": "^2.10.2",
76
- "modernizr": "^3.13.1",
77
- "parents": "^1.0.1",
78
- "plugin-error": "^2.0.1",
79
- "postcss": "^8.5.14",
80
- "postcss-flexbugs-fixes": "^5.0.2",
81
- "postcss-import": "^16.1.1",
82
- "postcss-load-config": "^6.0.1",
83
- "postcss-loader": "^8.2.1",
84
- "postcss-preset-env": "^11.2.1",
85
- "pretty-bytes": "^7.1.0",
86
- "readable-stream": "^4.7.0",
87
- "replace-ext": "^2.0.0",
88
- "rollup": "^4.60.3",
89
- "sass": "^1.99.0",
90
- "sass-loader": "^16.0.8",
91
- "semver": "^7.8.0",
92
- "ssh2": "^1.17.0",
93
- "strip-ansi": "^6.0.1",
94
- "style-loader": "^4.0.0",
95
- "tailwindcss": "^4.3.0",
96
- "terser": "^5.47.1",
97
- "terser-webpack-plugin": "^5.6.0",
98
- "through2": "^5.0.0",
99
- "through2-concurrent": "^2.0.0",
100
- "tslib": "^2.8.1",
101
- "vinyl-sourcemaps-apply": "^0.2.1",
102
- "webpack": "^5.106.2",
103
- "webpack-bundle-analyzer": "^5.3.0",
104
- "webpack-dev-middleware": "^8.0.3",
105
- "webpack-hot-middleware": "^2.26.1",
106
- "webpack-merge": "^6.0.1",
107
- "workbox-build": "^7.4.1"
24
+ "http-proxy-middleware": "^3.0.3",
25
+ "less": "^4.2.2",
26
+ "picocolors": "^1.1.1",
27
+ "picomatch": "^4.0.2",
28
+ "postcss": "^8.5.3",
29
+ "postcss-preset-env": "^10.1.4",
30
+ "rollup": "^4.34.8",
31
+ "sass": "^1.85.0",
32
+ "serve-static": "^1.16.2",
33
+ "ssh2": "^1.16.0",
34
+ "terser": "^5.39.0",
35
+ "webpack": "^5.98.0",
36
+ "workbox-build": "^7.3.0",
37
+ "ws": "^8.18.0"
108
38
  },
109
39
  "devDependencies": {
110
- "@types/async": "3",
111
- "@types/browser-sync": "2",
112
- "@types/express": "5",
113
- "@types/fancy-log": "2",
114
- "@types/html-minifier-terser": "^7.0.2",
115
- "@types/imagemin": "9",
116
- "@types/parents": "1",
117
- "@types/postcss-flexbugs-fixes": "5",
118
- "@types/readable-stream": "4",
119
- "@types/replace-ext": "2",
120
- "@types/semver": "7",
121
- "@types/through2-concurrent": "2",
122
- "@types/webpack-bundle-analyzer": "4",
123
- "@types/webpack-hot-middleware": "2"
124
- },
125
- "optionalDependencies": {
126
- "imagemin-gifsicle": "^7.0.0",
127
- "imagemin-mozjpeg": "^10.0.0",
128
- "imagemin-optipng": "^8.0.0",
129
- "imagemin-svgo": "^12.0.0"
40
+ "@rollup/plugin-commonjs": "^28.0.2",
41
+ "@rollup/plugin-node-resolve": "^16.0.0",
42
+ "@types/archiver": "^6.0.3",
43
+ "@types/connect": "^3.4.38",
44
+ "@types/less": "^3.0.7",
45
+ "@types/picomatch": "^3.0.2",
46
+ "@types/serve-static": "^1.15.7",
47
+ "@types/ssh2": "^1.15.4",
48
+ "@types/ws": "^8.5.14",
49
+ "tsup": "^8.4.0",
50
+ "typescript": "^5.7.3"
130
51
  },
131
52
  "engines": {
132
- "node": "^20.19.0 || >=22.0.0"
53
+ "node": ">=18.18.0"
54
+ },
55
+ "scripts": {
56
+ "build": "tsup",
57
+ "dev": "tsup --watch"
133
58
  }
134
- }
59
+ }
package/src/balm.ts ADDED
@@ -0,0 +1,103 @@
1
+ import { BalmConfig, BalmCustomConfig, BundlerType } from './types/index.js';
2
+ import { resolveConfig } from './config/index.js';
3
+ import { TaskDAG } from './runner/dag.js';
4
+ import { BalmHooks } from './hooks/index.js';
5
+ import { CleanTask } from './tasks/clean.js';
6
+ import { StyleTask } from './tasks/style.js';
7
+ import { ScriptTask } from './tasks/script.js';
8
+ import { HtmlTask } from './tasks/html.js';
9
+ import { CacheTask } from './tasks/cache.js';
10
+ import { PwaTask } from './tasks/pwa.js';
11
+ import { ServerTask } from './tasks/server.js';
12
+ import { logger } from './utilities/logger.js';
13
+
14
+ export class Balm {
15
+ private _config: BalmConfig;
16
+ private dag = new TaskDAG();
17
+ beforeTask?: () => Promise<void> | void;
18
+ afterTask?: () => Promise<void> | void;
19
+ readonly Bundler = BundlerType;
20
+
21
+ constructor() {
22
+ this._config = resolveConfig();
23
+ }
24
+
25
+ get config(): BalmConfig {
26
+ return this._config;
27
+ }
28
+ set config(customConfig: BalmCustomConfig) {
29
+ this._config = resolveConfig(customConfig);
30
+ if (this._config.logs?.level !== undefined) {
31
+ logger.level = this._config.logs.level;
32
+ }
33
+ }
34
+
35
+ async go(recipe?: (mix: BalmHooks) => void): Promise<void> {
36
+ const endTimer = logger.time('Build');
37
+ const taskSequence: string[] = [];
38
+
39
+ // Register built-in tasks
40
+ this.dag.registerTask(new CleanTask());
41
+ this.dag.registerTask(new StyleTask());
42
+ this.dag.registerTask(new ScriptTask());
43
+ this.dag.registerTask(new HtmlTask());
44
+ this.dag.registerTask(new CacheTask());
45
+ this.dag.registerTask(new PwaTask());
46
+ this.dag.registerTask(new ServerTask());
47
+
48
+ // Run recipe hooks
49
+ if (typeof recipe === 'function') {
50
+ const hooks = new BalmHooks(this.dag);
51
+ recipe(hooks);
52
+ }
53
+
54
+ if (this._config.useDefaults) {
55
+ taskSequence.push('clean', 'style', 'script', 'html');
56
+
57
+ if (this._config.env.isProd) {
58
+ if (this._config.assets.cache) {
59
+ taskSequence.push('cache');
60
+ }
61
+ if (this._config.pwa.enabled) {
62
+ taskSequence.push('pwa');
63
+ }
64
+ } else {
65
+ taskSequence.push('serve');
66
+ }
67
+ }
68
+
69
+ try {
70
+ if (this.beforeTask) {
71
+ await this.beforeTask();
72
+ }
73
+
74
+ // Execute built-in series
75
+ await this.dag.runSeries(taskSequence, this._config);
76
+
77
+ // Execute recipe tasks
78
+ for (let i = 1; ; i++) {
79
+ const recipeName = `recipe:${i}`;
80
+ if (!this.dag.hasTask(recipeName)) break;
81
+ await this.dag.executeTask(recipeName, this._config);
82
+ }
83
+
84
+ if (this.afterTask) {
85
+ await this.afterTask();
86
+ }
87
+
88
+ endTimer();
89
+ } catch (err: any) {
90
+ logger.error('build', `Build failed: ${err?.message || err}`);
91
+ throw err;
92
+ }
93
+ }
94
+
95
+ reset(): void {
96
+ this.dag.clear();
97
+ this.beforeTask = undefined;
98
+ this.afterTask = undefined;
99
+ this._config = resolveConfig();
100
+ }
101
+ }
102
+
103
+ export const balm = new Balm();