@roots/bud-build 6.6.5 → 6.6.6

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 (322) hide show
  1. package/README.md +28 -19
  2. package/docs/exports.md +13 -0
  3. package/docs/rules.md +32 -0
  4. package/lib/config/bail.d.ts +2 -2
  5. package/lib/config/bail.d.ts.map +1 -1
  6. package/lib/config/bail.js +1 -1
  7. package/lib/config/bail.js.map +1 -1
  8. package/lib/config/cache.d.ts +2 -2
  9. package/lib/config/cache.d.ts.map +1 -1
  10. package/lib/config/cache.js +1 -1
  11. package/lib/config/cache.js.map +1 -1
  12. package/lib/config/context.d.ts +2 -2
  13. package/lib/config/context.d.ts.map +1 -1
  14. package/lib/config/context.js +1 -1
  15. package/lib/config/context.js.map +1 -1
  16. package/lib/config/dependencies.d.ts +3 -0
  17. package/lib/config/dependencies.d.ts.map +1 -0
  18. package/lib/config/dependencies.js +5 -0
  19. package/lib/config/dependencies.js.map +1 -0
  20. package/lib/config/devtool.d.ts +2 -2
  21. package/lib/config/devtool.d.ts.map +1 -1
  22. package/lib/config/devtool.js +1 -1
  23. package/lib/config/devtool.js.map +1 -1
  24. package/lib/config/entry.d.ts +3 -0
  25. package/lib/config/entry.d.ts.map +1 -0
  26. package/lib/config/entry.js +2 -0
  27. package/lib/config/entry.js.map +1 -0
  28. package/lib/config/experiments.d.ts +2 -2
  29. package/lib/config/experiments.d.ts.map +1 -1
  30. package/lib/config/experiments.js +1 -1
  31. package/lib/config/experiments.js.map +1 -1
  32. package/lib/config/externals.d.ts +3 -0
  33. package/lib/config/externals.d.ts.map +1 -0
  34. package/lib/config/externals.js +2 -0
  35. package/lib/config/externals.js.map +1 -0
  36. package/lib/config/externalsType.d.ts +3 -0
  37. package/lib/config/externalsType.d.ts.map +1 -0
  38. package/lib/config/externalsType.js +2 -0
  39. package/lib/config/externalsType.js.map +1 -0
  40. package/lib/config/index.d.ts +35 -0
  41. package/lib/config/index.d.ts.map +1 -0
  42. package/lib/config/index.js +27 -0
  43. package/lib/config/index.js.map +1 -0
  44. package/lib/config/infrastructureLogging.d.ts +2 -2
  45. package/lib/config/infrastructureLogging.d.ts.map +1 -1
  46. package/lib/config/infrastructureLogging.js +12 -3
  47. package/lib/config/infrastructureLogging.js.map +1 -1
  48. package/lib/config/loader.d.ts +3 -0
  49. package/lib/config/loader.d.ts.map +1 -0
  50. package/lib/config/loader.js +2 -0
  51. package/lib/config/loader.js.map +1 -0
  52. package/lib/config/mode.d.ts +3 -0
  53. package/lib/config/mode.d.ts.map +1 -0
  54. package/lib/config/mode.js +2 -0
  55. package/lib/config/mode.js.map +1 -0
  56. package/lib/config/module.d.ts +2 -6
  57. package/lib/config/module.d.ts.map +1 -1
  58. package/lib/config/module.js +20 -18
  59. package/lib/config/module.js.map +1 -1
  60. package/lib/config/name.d.ts +3 -0
  61. package/lib/config/name.d.ts.map +1 -0
  62. package/lib/config/name.js +2 -0
  63. package/lib/config/name.js.map +1 -0
  64. package/lib/config/node.d.ts +3 -0
  65. package/lib/config/node.d.ts.map +1 -0
  66. package/lib/config/node.js +2 -0
  67. package/lib/config/node.js.map +1 -0
  68. package/lib/config/optimization.d.ts +2 -2
  69. package/lib/config/optimization.d.ts.map +1 -1
  70. package/lib/config/optimization.js +8 -7
  71. package/lib/config/optimization.js.map +1 -1
  72. package/lib/config/output/assetModuleFilename.d.ts +8 -0
  73. package/lib/config/output/assetModuleFilename.d.ts.map +1 -0
  74. package/lib/config/output/assetModuleFilename.js +2 -0
  75. package/lib/config/output/assetModuleFilename.js.map +1 -0
  76. package/lib/config/output/chunkFilename.d.ts +8 -0
  77. package/lib/config/output/chunkFilename.d.ts.map +1 -0
  78. package/lib/config/output/chunkFilename.js +4 -0
  79. package/lib/config/output/chunkFilename.js.map +1 -0
  80. package/lib/config/output/filename.d.ts +8 -0
  81. package/lib/config/output/filename.d.ts.map +1 -0
  82. package/lib/config/output/filename.js +4 -0
  83. package/lib/config/output/filename.js.map +1 -0
  84. package/lib/config/output/index.d.ts +3 -0
  85. package/lib/config/output/index.d.ts.map +1 -0
  86. package/lib/config/output/index.js +18 -0
  87. package/lib/config/output/index.js.map +1 -0
  88. package/lib/config/parallelism.d.ts +3 -0
  89. package/lib/config/parallelism.d.ts.map +1 -0
  90. package/lib/config/parallelism.js +3 -0
  91. package/lib/config/parallelism.js.map +1 -0
  92. package/lib/config/performance.d.ts +3 -0
  93. package/lib/config/performance.d.ts.map +1 -0
  94. package/lib/config/performance.js +2 -0
  95. package/lib/config/performance.js.map +1 -0
  96. package/lib/config/plugins.d.ts +3 -0
  97. package/lib/config/plugins.d.ts.map +1 -0
  98. package/lib/config/plugins.js +2 -0
  99. package/lib/config/plugins.js.map +1 -0
  100. package/lib/config/profile.d.ts +3 -0
  101. package/lib/config/profile.d.ts.map +1 -0
  102. package/lib/config/profile.js +2 -0
  103. package/lib/config/profile.js.map +1 -0
  104. package/lib/config/recordsPath.d.ts +3 -0
  105. package/lib/config/recordsPath.d.ts.map +1 -0
  106. package/lib/config/recordsPath.js +2 -0
  107. package/lib/config/recordsPath.js.map +1 -0
  108. package/lib/config/resolve.d.ts +2 -3
  109. package/lib/config/resolve.d.ts.map +1 -1
  110. package/lib/config/resolve.js +16 -9
  111. package/lib/config/resolve.js.map +1 -1
  112. package/lib/config/stats.d.ts +3 -0
  113. package/lib/config/stats.d.ts.map +1 -0
  114. package/lib/config/stats.js +17 -0
  115. package/lib/config/stats.js.map +1 -0
  116. package/lib/config/target.d.ts +3 -0
  117. package/lib/config/target.d.ts.map +1 -0
  118. package/lib/config/target.js +4 -0
  119. package/lib/config/target.js.map +1 -0
  120. package/lib/handlers/index.d.ts +19 -0
  121. package/lib/handlers/index.d.ts.map +1 -0
  122. package/lib/handlers/index.js +6 -0
  123. package/lib/handlers/index.js.map +1 -0
  124. package/lib/handlers/items/items.d.ts +69 -0
  125. package/lib/handlers/items/items.d.ts.map +1 -0
  126. package/lib/handlers/items/items.js +93 -0
  127. package/lib/handlers/items/items.js.map +1 -0
  128. package/lib/handlers/loaders/loaders.d.ts +12 -0
  129. package/lib/handlers/loaders/loaders.d.ts.map +1 -0
  130. package/lib/handlers/loaders/loaders.js +11 -0
  131. package/lib/handlers/loaders/loaders.js.map +1 -0
  132. package/lib/handlers/register.d.ts +18 -0
  133. package/lib/handlers/register.d.ts.map +1 -0
  134. package/lib/handlers/register.js +28 -0
  135. package/lib/handlers/register.js.map +1 -0
  136. package/lib/handlers/rules/css.d.ts +3 -0
  137. package/lib/handlers/rules/css.d.ts.map +1 -0
  138. package/lib/handlers/rules/css.js +5 -0
  139. package/lib/handlers/rules/css.js.map +1 -0
  140. package/lib/handlers/rules/css.module.d.ts +3 -0
  141. package/lib/handlers/rules/css.module.d.ts.map +1 -0
  142. package/lib/handlers/rules/css.module.js +5 -0
  143. package/lib/handlers/rules/css.module.js.map +1 -0
  144. package/lib/handlers/rules/csv.d.ts +2 -8
  145. package/lib/handlers/rules/csv.d.ts.map +1 -1
  146. package/lib/handlers/rules/csv.js +3 -9
  147. package/lib/handlers/rules/csv.js.map +1 -1
  148. package/lib/handlers/rules/font.d.ts +3 -0
  149. package/lib/handlers/rules/font.d.ts.map +1 -0
  150. package/lib/handlers/rules/font.inline.d.ts +3 -0
  151. package/lib/handlers/rules/font.inline.d.ts.map +1 -0
  152. package/lib/handlers/rules/font.inline.js +6 -0
  153. package/lib/handlers/rules/font.inline.js.map +1 -0
  154. package/lib/handlers/rules/font.js +5 -0
  155. package/lib/handlers/rules/font.js.map +1 -0
  156. package/lib/handlers/rules/html.d.ts +3 -0
  157. package/lib/handlers/rules/html.d.ts.map +1 -0
  158. package/lib/handlers/rules/html.js +5 -0
  159. package/lib/handlers/rules/html.js.map +1 -0
  160. package/lib/handlers/rules/image.d.ts +3 -0
  161. package/lib/handlers/rules/image.d.ts.map +1 -0
  162. package/lib/handlers/rules/image.inline.d.ts +3 -0
  163. package/lib/handlers/rules/image.inline.d.ts.map +1 -0
  164. package/lib/handlers/rules/image.inline.js +6 -0
  165. package/lib/handlers/rules/image.inline.js.map +1 -0
  166. package/lib/handlers/rules/image.js +5 -0
  167. package/lib/handlers/rules/image.js.map +1 -0
  168. package/lib/handlers/rules/index.d.ts +19 -0
  169. package/lib/handlers/rules/index.d.ts.map +1 -0
  170. package/lib/handlers/rules/index.js +35 -0
  171. package/lib/handlers/rules/index.js.map +1 -0
  172. package/lib/handlers/rules/js.d.ts +3 -0
  173. package/lib/handlers/rules/js.d.ts.map +1 -0
  174. package/lib/handlers/rules/js.js +5 -0
  175. package/lib/handlers/rules/js.js.map +1 -0
  176. package/lib/handlers/rules/json.d.ts +3 -0
  177. package/lib/handlers/rules/json.d.ts.map +1 -0
  178. package/lib/handlers/rules/json.js +7 -0
  179. package/lib/handlers/rules/json.js.map +1 -0
  180. package/lib/handlers/rules/svg.d.ts +3 -0
  181. package/lib/handlers/rules/svg.d.ts.map +1 -0
  182. package/lib/handlers/rules/svg.inline.d.ts +3 -0
  183. package/lib/handlers/rules/svg.inline.d.ts.map +1 -0
  184. package/lib/handlers/rules/svg.inline.js +6 -0
  185. package/lib/handlers/rules/svg.inline.js.map +1 -0
  186. package/lib/handlers/rules/svg.js +5 -0
  187. package/lib/handlers/rules/svg.js.map +1 -0
  188. package/lib/handlers/rules/toml.d.ts +2 -8
  189. package/lib/handlers/rules/toml.d.ts.map +1 -1
  190. package/lib/handlers/rules/toml.js +3 -9
  191. package/lib/handlers/rules/toml.js.map +1 -1
  192. package/lib/handlers/rules/webp.d.ts +3 -0
  193. package/lib/handlers/rules/webp.d.ts.map +1 -0
  194. package/lib/handlers/rules/webp.js +5 -0
  195. package/lib/handlers/rules/webp.js.map +1 -0
  196. package/lib/handlers/rules/xml.d.ts +2 -8
  197. package/lib/handlers/rules/xml.d.ts.map +1 -1
  198. package/lib/handlers/rules/xml.js +3 -9
  199. package/lib/handlers/rules/xml.js.map +1 -1
  200. package/lib/handlers/rules/yml.d.ts +3 -0
  201. package/lib/handlers/rules/yml.d.ts.map +1 -0
  202. package/lib/handlers/rules/yml.js +5 -0
  203. package/lib/handlers/rules/yml.js.map +1 -0
  204. package/lib/helpers/isMjs.d.ts +3 -0
  205. package/lib/helpers/isMjs.d.ts.map +1 -0
  206. package/lib/helpers/isMjs.js +2 -0
  207. package/lib/helpers/isMjs.js.map +1 -0
  208. package/lib/helpers/scriptExtension.d.ts +3 -0
  209. package/lib/helpers/scriptExtension.d.ts.map +1 -0
  210. package/lib/helpers/scriptExtension.js +5 -0
  211. package/lib/helpers/scriptExtension.js.map +1 -0
  212. package/lib/index.d.ts +1 -1
  213. package/lib/index.d.ts.map +1 -1
  214. package/lib/index.js +1 -1
  215. package/lib/index.js.map +1 -1
  216. package/lib/item/index.d.ts +2 -2
  217. package/lib/item/index.d.ts.map +1 -1
  218. package/lib/item/index.js +6 -3
  219. package/lib/item/index.js.map +1 -1
  220. package/lib/loader/index.d.ts +2 -1
  221. package/lib/loader/index.d.ts.map +1 -1
  222. package/lib/loader/index.js +2 -1
  223. package/lib/loader/index.js.map +1 -1
  224. package/lib/rule/index.d.ts +30 -21
  225. package/lib/rule/index.d.ts.map +1 -1
  226. package/lib/rule/index.js +64 -37
  227. package/lib/rule/index.js.map +1 -1
  228. package/lib/service.d.ts +9 -12
  229. package/lib/service.d.ts.map +1 -1
  230. package/lib/service.js +28 -59
  231. package/lib/service.js.map +1 -1
  232. package/lib/shared/base.d.ts +1 -1
  233. package/lib/shared/base.d.ts.map +1 -1
  234. package/lib/shared/base.js +4 -2
  235. package/lib/shared/base.js.map +1 -1
  236. package/lib/types.d.ts +8 -2
  237. package/lib/types.d.ts.map +1 -1
  238. package/package.json +35 -37
  239. package/src/config/bail.ts +4 -0
  240. package/src/config/cache.ts +4 -0
  241. package/src/config/context.ts +3 -0
  242. package/src/config/dependencies.ts +11 -0
  243. package/src/config/devtool.ts +4 -0
  244. package/src/config/entry.ts +4 -0
  245. package/src/config/experiments.ts +4 -0
  246. package/src/config/externals.ts +4 -0
  247. package/src/config/externalsType.ts +3 -0
  248. package/src/config/index.test.ts +129 -0
  249. package/src/config/index.ts +67 -0
  250. package/src/config/infrastructureLogging.ts +21 -0
  251. package/src/config/loader.ts +4 -0
  252. package/src/config/mode.ts +4 -0
  253. package/src/config/module.ts +43 -0
  254. package/src/config/name.ts +4 -0
  255. package/src/config/node.ts +4 -0
  256. package/src/config/optimization.ts +19 -0
  257. package/src/config/output/assetModuleFilename.ts +9 -0
  258. package/src/config/output/chunkFilename.ts +18 -0
  259. package/src/config/output/filename.ts +19 -0
  260. package/src/config/output/index.ts +27 -0
  261. package/src/config/parallelism.ts +6 -0
  262. package/src/config/performance.ts +4 -0
  263. package/src/config/plugins.ts +4 -0
  264. package/src/config/profile.ts +4 -0
  265. package/src/config/recordsPath.ts +7 -0
  266. package/src/config/resolve.ts +33 -0
  267. package/src/config/stats.ts +22 -0
  268. package/src/config/target.ts +9 -0
  269. package/src/handlers/index.ts +22 -0
  270. package/src/handlers/items/items.ts +117 -0
  271. package/src/handlers/loaders/loaders.ts +31 -0
  272. package/src/handlers/register.ts +51 -0
  273. package/src/handlers/rules/css.module.ts +7 -0
  274. package/src/handlers/rules/css.ts +7 -0
  275. package/src/handlers/rules/csv.test.ts +25 -0
  276. package/src/handlers/rules/csv.ts +7 -0
  277. package/src/handlers/rules/font.inline.ts +8 -0
  278. package/src/handlers/rules/font.ts +7 -0
  279. package/src/handlers/rules/html.ts +7 -0
  280. package/src/handlers/rules/image.inline.ts +8 -0
  281. package/src/handlers/rules/image.ts +7 -0
  282. package/src/handlers/rules/index.ts +35 -0
  283. package/src/handlers/rules/js.ts +7 -0
  284. package/src/handlers/rules/json.ts +10 -0
  285. package/src/handlers/rules/svg.inline.ts +8 -0
  286. package/src/handlers/rules/svg.ts +7 -0
  287. package/src/handlers/rules/toml.test.ts +22 -0
  288. package/src/handlers/rules/toml.ts +10 -0
  289. package/src/handlers/rules/webp.ts +7 -0
  290. package/src/handlers/rules/xml.test.ts +24 -0
  291. package/src/handlers/rules/xml.ts +7 -0
  292. package/src/handlers/rules/yml.ts +7 -0
  293. package/src/helpers/isMjs.ts +4 -0
  294. package/src/helpers/scriptExtension.ts +11 -0
  295. package/src/index.ts +17 -0
  296. package/src/item/index.ts +181 -0
  297. package/src/loader/index.ts +40 -0
  298. package/src/rule/index.test.ts +88 -0
  299. package/src/rule/index.ts +311 -0
  300. package/src/service.ts +245 -0
  301. package/src/shared/base.ts +37 -0
  302. package/src/types.ts +57 -0
  303. package/lib/config/builder.d.ts +0 -31
  304. package/lib/config/builder.d.ts.map +0 -1
  305. package/lib/config/builder.js +0 -32
  306. package/lib/config/builder.js.map +0 -1
  307. package/lib/config/output.d.ts +0 -4
  308. package/lib/config/output.d.ts.map +0 -1
  309. package/lib/config/output.js +0 -13
  310. package/lib/config/output.js.map +0 -1
  311. package/lib/handlers/items.d.ts +0 -69
  312. package/lib/handlers/items.d.ts.map +0 -1
  313. package/lib/handlers/items.js +0 -99
  314. package/lib/handlers/items.js.map +0 -1
  315. package/lib/handlers/loaders.d.ts +0 -57
  316. package/lib/handlers/loaders.d.ts.map +0 -1
  317. package/lib/handlers/loaders.js +0 -82
  318. package/lib/handlers/loaders.js.map +0 -1
  319. package/lib/handlers/rules/rules.d.ts +0 -63
  320. package/lib/handlers/rules/rules.d.ts.map +0 -1
  321. package/lib/handlers/rules/rules.js +0 -124
  322. package/lib/handlers/rules/rules.js.map +0 -1
@@ -0,0 +1,22 @@
1
+ import type {Factory} from './index.js'
2
+
3
+ export const stats: Factory<`stats`> = async app =>
4
+ app.hooks.filter(
5
+ `build.stats`,
6
+ app.isProduction
7
+ ? {
8
+ all: false,
9
+ assets: true,
10
+ children: false,
11
+ entrypoints: true,
12
+ errors: true,
13
+ errorsCount: true,
14
+ hash: true,
15
+ outputPath: true,
16
+ modules: true,
17
+ timings: true,
18
+ warnings: true,
19
+ warningsCount: true,
20
+ }
21
+ : {preset: `none`},
22
+ )
@@ -0,0 +1,9 @@
1
+ import type {Factory} from './index.js'
2
+
3
+ export const target: Factory<`target`> = async ({context, hooks, root}) =>
4
+ hooks.filter(
5
+ `build.target`,
6
+ context.manifest?.browserslist
7
+ ? `browserslist:${root.path(`package.json`)}`
8
+ : `web`,
9
+ )
@@ -0,0 +1,22 @@
1
+ import type {Bud} from '@roots/bud-framework'
2
+
3
+ import type {Rule} from '../rule/index.js'
4
+ import * as items from './items/items.js'
5
+ import * as loaders from './loaders/loaders.js'
6
+ import {register} from './register.js'
7
+ import {rules} from './rules/index.js'
8
+
9
+ export interface Props {
10
+ filter: Bud[`hooks`][`filter`]
11
+ makeItem: Bud[`build`][`makeItem`]
12
+ makeLoader: Bud[`build`][`makeLoader`]
13
+ makeRule: Bud[`build`][`makeRule`]
14
+ isProduction: Bud[`isProduction`]
15
+ path: Bud[`path`]
16
+ }
17
+
18
+ export interface Factory<T = Rule> {
19
+ (props: Props): T
20
+ }
21
+
22
+ export {items, loaders, register, rules}
@@ -0,0 +1,117 @@
1
+ import type {Item} from '@roots/bud-framework/services/build'
2
+ import {isBoolean} from '@roots/bud-support/lodash-es'
3
+
4
+ import type {Factory} from '../index.js'
5
+
6
+ /**
7
+ * CSS loader
8
+ *
9
+ * @public
10
+ */
11
+ export const css: Factory<Item> = ({makeItem}) =>
12
+ makeItem()
13
+ .setIdent(`css`)
14
+ .setLoader(`css`)
15
+ .setOptions(({build: {rules}, hooks: {filter}}) => ({
16
+ importLoaders: rules.css.getUse().length - 2,
17
+ modules: false,
18
+ sourceMap: isBoolean(filter(`build.devtool`, false))
19
+ ? filter(`build.devtool`, false)
20
+ : true,
21
+ }))
22
+
23
+ /**
24
+ * CSS module loader
25
+ *
26
+ * @public
27
+ */
28
+ export const cssModule: Factory<Item> = ({makeItem}) =>
29
+ makeItem()
30
+ .setIdent(`cssModule`)
31
+ .setLoader(`css`)
32
+ .setOptions(({build: {rules}, hooks: {filter}}) => ({
33
+ esModule: true,
34
+ importLoaders: rules.cssModule.getUse().length - 2,
35
+ localIdentName: `[name]__[local]___[hash:base64:5]`,
36
+ modules: true,
37
+ sourceMap: isBoolean(filter(`build.devtool`, false))
38
+ ? filter(`build.devtool`, false)
39
+ : true,
40
+ }))
41
+
42
+ /**
43
+ * CSV loader
44
+ *
45
+ * @public
46
+ */
47
+ export const csv: Factory<Item> = ({makeItem}) =>
48
+ makeItem().setLoader(`csv`).setIdent(`csv`)
49
+
50
+ /**
51
+ * HTML loader
52
+ *
53
+ * @public
54
+ */
55
+ export const html: Factory<Item> = ({makeItem}) =>
56
+ makeItem().setLoader(`html`).setIdent(`html`)
57
+
58
+ /**
59
+ * Style loader
60
+ *
61
+ * @public
62
+ */
63
+ export const style: Factory<Item> = ({makeItem}) =>
64
+ makeItem().setLoader(`style`).setIdent(`style`)
65
+
66
+ /**
67
+ * Markdown loader
68
+ *
69
+ * @public
70
+ */
71
+ export const md: Factory<Item> = ({makeItem}) =>
72
+ makeItem().setIdent(`md`).setLoader(`md`)
73
+
74
+ /**
75
+ * MiniCss loader
76
+ *
77
+ * @public
78
+ */
79
+ export const minicss: Factory<Item> = ({makeItem}) =>
80
+ makeItem()
81
+ .setLoader(`minicss`)
82
+ .setIdent(`minicss`)
83
+ .setOptions(app => ({
84
+ publicPath: app.hooks.filter(`build.output.publicPath`),
85
+ }))
86
+
87
+ /**
88
+ * Raw loader
89
+ *
90
+ * @public
91
+ */
92
+ export const raw: Factory<Item> = ({makeItem}) =>
93
+ makeItem().setLoader(`raw`).setIdent(`raw`)
94
+
95
+ /**
96
+ * File loader
97
+ *
98
+ * @public
99
+ */
100
+ export const file: Factory<Item> = ({makeItem}) =>
101
+ makeItem().setLoader(`file`).setIdent(`file`)
102
+
103
+ /**
104
+ * Xml loader
105
+ *
106
+ * @public
107
+ */
108
+ export const xml: Factory<Item> = ({makeItem}) =>
109
+ makeItem().setLoader(`xml`).setIdent(`xml`)
110
+
111
+ /**
112
+ * Yml loader
113
+ *
114
+ * @public
115
+ */
116
+ export const yml: Factory<Item> = ({makeItem}) =>
117
+ makeItem().setLoader(`yml`).setIdent(`yml`)
@@ -0,0 +1,31 @@
1
+ import type {Loader} from '@roots/bud-framework/services/build'
2
+ import MiniCssExtractPlugin from 'mini-css-extract-plugin'
3
+
4
+ import type {Factory} from '../index.js'
5
+
6
+ export const css: Factory<Loader> = ({makeLoader}) =>
7
+ makeLoader(`css-loader`)
8
+
9
+ export const csv: Factory<Loader> = ({makeLoader}) =>
10
+ makeLoader(`csv-loader`)
11
+
12
+ export const file: Factory<Loader> = ({makeLoader}) =>
13
+ makeLoader(`file-loader`)
14
+
15
+ export const html: Factory<Loader> = ({makeLoader}) =>
16
+ makeLoader(`html-loader`)
17
+
18
+ export const remark: Factory<Loader> = ({makeLoader}) =>
19
+ makeLoader(`remark-loader`)
20
+
21
+ export const minicss: Factory<Loader> = ({makeLoader}) =>
22
+ makeLoader(MiniCssExtractPlugin.loader)
23
+
24
+ export const style: Factory<Loader> = ({makeLoader}) =>
25
+ makeLoader(`style-loader`)
26
+
27
+ export const xml: Factory<Loader> = ({makeLoader}) =>
28
+ makeLoader(`xml-loader`)
29
+
30
+ export const yml: Factory<Loader> = ({makeLoader}) =>
31
+ makeLoader(`yml-loader`)
@@ -0,0 +1,51 @@
1
+ import type {Bud} from '@roots/bud-framework'
2
+
3
+ import type {Factory} from './index.js'
4
+ import * as items from './items/items.js'
5
+ import * as loaders from './loaders/loaders.js'
6
+ import {rules} from './rules/index.js'
7
+
8
+ /**
9
+ * Registry factory curry function
10
+ *
11
+ * @public
12
+ */
13
+ export interface makeRegister {
14
+ <T, F extends CallableFunction>(props: Partial<Bud>, setRule: F): <
15
+ K extends keyof T & string,
16
+ >([key, factory]: [K, Factory<T[K]>]) => void
17
+ }
18
+
19
+ /**
20
+ * Register built-in {@link loaders}, {@link items} and {@link rules}
21
+ *
22
+ * @public
23
+ */
24
+ export async function register(bud: Bud) {
25
+ Object.entries(loaders).map(makeRegister(bud, bud.build.setLoader))
26
+ Object.entries(items).map(makeRegister(bud, bud.build.setItem))
27
+
28
+ // this is a bit of a hack
29
+ // that sets the base stylesheet loader
30
+ // to minicss in production and style-loader in development
31
+ bud.build.items.precss = bud.isProduction
32
+ ? bud.build.items.minicss
33
+ : bud.build.items.style
34
+
35
+ Object.entries(rules).map(makeRegister(bud, bud.build.setRule))
36
+ }
37
+
38
+ export const makeRegister: makeRegister =
39
+ ({build, hooks, isProduction, path}, setRule) =>
40
+ ([key, factory]) =>
41
+ setRule(
42
+ key,
43
+ factory({
44
+ filter: hooks.filter,
45
+ makeItem: build.makeItem,
46
+ makeLoader: build.makeLoader,
47
+ makeRule: build.makeRule,
48
+ isProduction,
49
+ path,
50
+ }),
51
+ )
@@ -0,0 +1,7 @@
1
+ import type {Factory} from '../index.js'
2
+
3
+ export const cssModule: Factory = ({filter, makeRule, path}) =>
4
+ makeRule()
5
+ .setTest(filter(`pattern.cssModule`))
6
+ .setInclude([() => path(`@src`)])
7
+ .setUse([`precss`, `cssModule`])
@@ -0,0 +1,7 @@
1
+ import type {Factory} from '../index.js'
2
+
3
+ export const css: Factory = ({filter, makeRule, path}) =>
4
+ makeRule()
5
+ .setTest(filter(`pattern.css`))
6
+ .setInclude([() => path(`@src`)])
7
+ .setUse([`precss`, `css`])
@@ -0,0 +1,25 @@
1
+ import {factory} from '@repo/test-kit/bud'
2
+ import {describe, expect, it} from 'vitest'
3
+
4
+ import {csv} from './csv.js'
5
+
6
+ describe(`csv loader`, () => {
7
+ it(`should return a rule`, async () => {
8
+ const bud = await factory()
9
+
10
+ const result = csv({
11
+ filter: bud.hooks.filter,
12
+ makeItem: bud.build.makeItem,
13
+ makeLoader: bud.build.makeLoader,
14
+ makeRule: bud.build.makeRule,
15
+ isProduction: bud.isProduction,
16
+ path: bud.path,
17
+ })
18
+
19
+ const webpackOutput = result.toWebpack()
20
+
21
+ expect(webpackOutput.use?.[0]).toEqual(
22
+ expect.objectContaining({ident: `csv`, loader: `csv-loader`}),
23
+ )
24
+ })
25
+ })
@@ -0,0 +1,7 @@
1
+ import type {Factory} from '../index.js'
2
+
3
+ export const csv: Factory = ({makeRule, path, filter}) =>
4
+ makeRule()
5
+ .setInclude([path()])
6
+ .setTest(() => filter(`pattern.csv`))
7
+ .setUse([`csv`])
@@ -0,0 +1,8 @@
1
+ import type {Factory} from '../index.js'
2
+
3
+ export const inlineFont: Factory = ({filter, makeRule, path}) =>
4
+ makeRule()
5
+ .setTest(filter(`pattern.font`))
6
+ .setInclude([() => path(`@src`)])
7
+ .setResourceQuery(/inline/)
8
+ .setType(`asset/inline`)
@@ -0,0 +1,7 @@
1
+ import type {Factory} from '../index.js'
2
+
3
+ export const font: Factory = ({filter, makeRule, path}) =>
4
+ makeRule()
5
+ .setType(`asset`)
6
+ .setTest(filter(`pattern.font`))
7
+ .setInclude([() => path(`@src`)])
@@ -0,0 +1,7 @@
1
+ import type {Factory} from '../index.js'
2
+
3
+ export const html: Factory = ({filter, makeRule, path}) =>
4
+ makeRule()
5
+ .setInclude([() => path()])
6
+ .setTest(filter(`pattern.html`))
7
+ .setUse([`html`])
@@ -0,0 +1,8 @@
1
+ import type {Factory} from '../index.js'
2
+
3
+ export const inlineImage: Factory = ({filter, makeRule, path}) =>
4
+ makeRule()
5
+ .setTest(filter(`pattern.image`))
6
+ .setInclude([() => path(`@src`)])
7
+ .setType(`asset/inline`)
8
+ .setResourceQuery(/inline/)
@@ -0,0 +1,7 @@
1
+ import type {Factory} from '../index.js'
2
+
3
+ export const image: Factory = ({filter, makeRule, path}) =>
4
+ makeRule()
5
+ .setTest(filter(`pattern.image`))
6
+ .setInclude([() => path(`@src`)])
7
+ .setType(`asset/resource`)
@@ -0,0 +1,35 @@
1
+ import {css} from './css.js'
2
+ import {cssModule} from './css.module.js'
3
+ import {csv} from './csv.js'
4
+ import {inlineFont} from './font.inline.js'
5
+ import {font} from './font.js'
6
+ import {html} from './html.js'
7
+ import {inlineImage} from './image.inline.js'
8
+ import {image} from './image.js'
9
+ import {js} from './js.js'
10
+ import {json} from './json.js'
11
+ import {inlineSvg} from './svg.inline.js'
12
+ import {svg} from './svg.js'
13
+ import {toml} from './toml.js'
14
+ import {webp} from './webp.js'
15
+ import {xml} from './xml.js'
16
+ import {yml} from './yml.js'
17
+
18
+ export const rules = {
19
+ js,
20
+ css,
21
+ cssModule,
22
+ inlineSvg,
23
+ inlineImage,
24
+ inlineFont,
25
+ svg,
26
+ webp,
27
+ image,
28
+ font,
29
+ json,
30
+ html,
31
+ yml,
32
+ toml,
33
+ xml,
34
+ csv,
35
+ }
@@ -0,0 +1,7 @@
1
+ import type {Factory} from '../index.js'
2
+
3
+ export const js: Factory = ({filter, makeRule, path}) =>
4
+ makeRule()
5
+ .setTest(filter(`pattern.js`))
6
+ .setInclude([() => path(`@src`)])
7
+ .setUse([])
@@ -0,0 +1,10 @@
1
+ import * as json5Parser from 'json5'
2
+
3
+ import type {Factory} from '../index.js'
4
+
5
+ export const json: Factory = ({filter, makeRule, path}) =>
6
+ makeRule()
7
+ .setType(`json`)
8
+ .setInclude([() => path()])
9
+ .setTest(filter(`pattern.json`))
10
+ .setParser({parse: json5Parser.parse})
@@ -0,0 +1,8 @@
1
+ import type {Factory} from '../index.js'
2
+
3
+ export const inlineSvg: Factory = ({filter, makeRule, path}) =>
4
+ makeRule()
5
+ .setTest(filter(`pattern.svg`))
6
+ .setInclude([() => path(`@src`)])
7
+ .setResourceQuery(/inline/)
8
+ .setType(`asset/inline`)
@@ -0,0 +1,7 @@
1
+ import type {Factory} from '../index.js'
2
+
3
+ export const svg: Factory = ({filter, makeRule, path}) =>
4
+ makeRule()
5
+ .setTest(filter(`pattern.svg`))
6
+ .setInclude([() => path(`@src`)])
7
+ .setType(`asset/resource`)
@@ -0,0 +1,22 @@
1
+ import {factory} from '@repo/test-kit/bud'
2
+ import {describe, expect, it} from 'vitest'
3
+
4
+ import {toml} from './toml'
5
+
6
+ describe(`toml loader`, () => {
7
+ let bud
8
+
9
+ it(`should return a rule`, async () => {
10
+ bud = await factory()
11
+ const result = toml({
12
+ filter: bud.hooks.filter,
13
+ makeItem: bud.build.makeItem,
14
+ makeLoader: bud.build.makeLoader,
15
+ makeRule: bud.build.makeRule,
16
+ isProduction: bud.isProduction,
17
+ path: bud.path,
18
+ })
19
+ const webpackOutput = result.toWebpack()
20
+ expect(webpackOutput.type).toEqual(`json`)
21
+ })
22
+ })
@@ -0,0 +1,10 @@
1
+ import * as tomlParser from 'toml'
2
+
3
+ import type {Factory} from '../index.js'
4
+
5
+ export const toml: Factory = ({filter, makeRule, path}) =>
6
+ makeRule()
7
+ .setType(`json`)
8
+ .setInclude([() => path()])
9
+ .setTest(() => filter(`pattern.toml`))
10
+ .setParser({parse: tomlParser.parse})
@@ -0,0 +1,7 @@
1
+ import type {Factory} from '../index.js'
2
+
3
+ export const webp: Factory = ({filter, makeRule, path}) =>
4
+ makeRule()
5
+ .setTest(filter(`pattern.webp`))
6
+ .setInclude([() => path(`@src`)])
7
+ .setType(`asset/resource`)
@@ -0,0 +1,24 @@
1
+ import {describe, expect, it} from 'vitest'
2
+
3
+ import {xml} from './xml'
4
+
5
+ describe(`xml loader`, () => {
6
+ it(`should return a rule`, async () => {
7
+ const bud = await import(`@repo/test-kit/bud`).then(
8
+ async ({factory}) => await factory(),
9
+ )
10
+ const result = xml({
11
+ filter: bud.hooks.filter,
12
+ makeItem: bud.build.makeItem,
13
+ makeLoader: bud.build.makeLoader,
14
+ makeRule: bud.build.makeRule,
15
+ isProduction: bud.isProduction,
16
+ path: bud.path,
17
+ })
18
+
19
+ const webpackOutput = result.toWebpack()
20
+ expect(webpackOutput.use?.[0]).toEqual(
21
+ expect.objectContaining({ident: `xml`, loader: `xml-loader`}),
22
+ )
23
+ })
24
+ })
@@ -0,0 +1,7 @@
1
+ import type {Factory} from '../index.js'
2
+
3
+ export const xml: Factory = ({filter, makeRule, path}) =>
4
+ makeRule()
5
+ .setInclude([() => path()])
6
+ .setTest(() => filter(`pattern.xml`))
7
+ .setUse([`xml`])
@@ -0,0 +1,7 @@
1
+ import type {Factory} from '../index.js'
2
+
3
+ export const yml: Factory = ({filter, makeRule, path}) =>
4
+ makeRule()
5
+ .setInclude([() => path()])
6
+ .setTest(filter(`pattern.yml`))
7
+ .setUse([`yml`])
@@ -0,0 +1,4 @@
1
+ import type {Bud} from '@roots/bud-framework'
2
+
3
+ export const isMjs = (filter: Bud[`hooks`][`filter`]) =>
4
+ filter(`build.experiments`)?.outputModule === true
@@ -0,0 +1,11 @@
1
+ import type {Bud} from '@roots/bud-framework'
2
+
3
+ import {isMjs} from './isMjs.js'
4
+
5
+ export const scriptExtension = (
6
+ filter: Bud[`hooks`][`filter`],
7
+ mjs: `.${string}` = `.mjs`,
8
+ js: `.${string}` = `.js`,
9
+ ): `.${string}` => {
10
+ return isMjs(filter) ? mjs : js
11
+ }
package/src/index.ts ADDED
@@ -0,0 +1,17 @@
1
+ // Copyright © Roots Software Foundation LLC
2
+ // Licensed under the MIT license.
3
+
4
+ /**
5
+ * Configuration builder
6
+ *
7
+ * @see https://bud.js.org
8
+ * @see https://github.com/roots/bud
9
+ *
10
+ * @packageDocumentation
11
+ */
12
+
13
+ import './types.js'
14
+
15
+ import {Build} from './service.js'
16
+
17
+ export default Build