diff --git a/config/vitest/alias.ts b/config/vitest/alias.ts index 351143a2b8..595403b83e 100644 --- a/config/vitest/alias.ts +++ b/config/vitest/alias.ts @@ -12,11 +12,49 @@ export default { ...packages.reduce((aliases, packageRoot) => { const signifier = relative(path(), packageRoot) aliases[signifier] = join(packageRoot, `src`) - aliases[join(signifier, `*`)] = join(packageRoot, `src`, `*`) return aliases }, {}), + '@roots/blade-loader': path(`sources/@roots/blade-loader/src/plugin.ts`), + '@roots/browserslist-config': path(`sources/@roots/browserslist-config`), + '@roots/bud': path(`sources/@roots/bud/src`), + '@roots/bud-api': path(`sources/@roots/bud-api/src`), + '@roots/bud-babel': path(`sources/@roots/bud-babel/src`), + '@roots/bud-build': path(`sources/@roots/bud-build/src`), '@roots/bud-cache': path(`sources/@roots/bud-cache/src`), + '@roots/bud-client': path(`sources/@roots/bud-client/src`), + '@roots/bud-compiler': path(`sources/@roots/bud-compiler/src`), + '@roots/bud-compress': path(`sources/@roots/bud-compress/src`), + '@roots/bud-criticalcss': path(`sources/@roots/bud-criticalcss/src`), + '@roots/bud-dashboard': path(`sources/@roots/bud-dashboard/src`), + '@roots/bud-emotion': path(`sources/@roots/bud-emotion/src`), + '@roots/bud-entrypoints': path(`sources/@roots/bud-entrypoints/src`), + '@roots/bud-esbuild': path(`sources/@roots/bud-esbuild/src`), + '@roots/bud-eslint': path(`sources/@roots/bud-eslint/src`), + '@roots/bud-extensions': path(`sources/@roots/bud-extensions/src`), + '@roots/bud-framework': path(`sources/@roots/bud-framework/src`), + '@roots/bud-hooks': path(`sources/@roots/bud-hooks/src`), + '@roots/bud-imagemin': path(`sources/@roots/bud-imagemin/src`), + '@roots/bud-mdx': path(`sources/@roots/bud-mdx/src`), + '@roots/bud-minify': path(`sources/@roots/bud-minify/src`), + '@roots/bud-postcss': path(`sources/@roots/bud-postcss/src`), + '@roots/bud-preset-recommend': path(`sources/@roots/bud-preset-recommend/src`), + '@roots/bud-preset-wordpress': path(`sources/@roots/bud-preset-wordpress/src`), + '@roots/bud-prettier': path(`sources/@roots/bud-prettier/src`), + '@roots/bud-purgecss': path(`sources/@roots/bud-purgecss/src`), + '@roots/bud-react': path(`sources/@roots/bud-react/src`), + '@roots/bud-sass': path(`sources/@roots/bud-sass/src`), + '@roots/bud-server': path(`sources/@roots/bud-server/src`), + '@roots/bud-solid': path(`sources/@roots/bud-solid/src`), + '@roots/bud-stylelint': path(`sources/@roots/bud-stylelint/src`), + '@roots/bud-support': path(`sources/@roots/bud-support/src`), + '@roots/bud-swc': path(`sources/@roots/bud-swc/src`), + '@roots/bud-tailwindcss': path(`sources/@roots/bud-tailwindcss/src`), + '@roots/bud-tailwindcss-theme-json': path(`sources/@roots/bud-tailwindcss-theme-json/src`), + '@roots/bud-typescript': path(`sources/@roots/bud-typescript/src`), + '@roots/bud-vue': path(`sources/@roots/bud-vue/src`), + '@roots/bud-wordpress-dependencies': path(`sources/@roots/bud-wordpress-dependencies/src`), '@roots/filesystem/src/vendor/sdk': path( `sources/@roots/filesystem/vendor/sdk`, ), + '@roots/sage': path(`sources/@roots/sage/src`), } diff --git a/sources/@roots/blade-loader/package.json b/sources/@roots/blade-loader/package.json index 98d01d0ce1..d25a6a2419 100644 --- a/sources/@roots/blade-loader/package.json +++ b/sources/@roots/blade-loader/package.json @@ -39,22 +39,10 @@ ], "type": "module", "exports": { - ".": { - "import": "./lib/plugin.js", - "default": "./lib/plugin.js" - }, - "./plugin": { - "import": "./lib/plugin.js", - "default": "./lib/plugin.js" - }, - "./module-loader": { - "require": "./lib/module-loader.cjs", - "default": "./lib/module-loader.cjs" - }, - "./asset-loader": { - "require": "./lib/asset-loader.cjs", - "default": "./lib/asset-loader.cjs" - } + ".": "./lib/plugin.js", + "./plugin": "./lib/plugin.js", + "./module-loader": "./lib/module-loader.cjs", + "./asset-loader": "./lib/asset-loader.cjs" }, "types": "./lib/plugin.d.ts", "main": "./lib/plugin.js", diff --git a/sources/@roots/blade-loader/tsconfig.json b/sources/@roots/blade-loader/tsconfig.json index d1f37ca59d..6cd153e014 100644 --- a/sources/@roots/blade-loader/tsconfig.json +++ b/sources/@roots/blade-loader/tsconfig.json @@ -3,14 +3,8 @@ "compilerOptions": { "rootDir": "./src", "outDir": "./lib", - "paths": { - "@roots/blade-loader": ["./src/plugin.ts"], - "@roots/blade-loader/asset-loader": ["./src/asset-loader.cts"], - "@roots/blade-loader/module-loader": ["./src/module-loader.cts"], - "@roots/blade-loader/plugin": ["./src/plugin.ts"] - }, + "strict": true, "verbatimModuleSyntax": false }, "include": ["./src"], - "exclude": ["./lib", "./node_modules", "**/*.test.ts"] } diff --git a/sources/@roots/bud-api/package.json b/sources/@roots/bud-api/package.json index ef7220b1cd..c0be207159 100644 --- a/sources/@roots/bud-api/package.json +++ b/sources/@roots/bud-api/package.json @@ -49,36 +49,140 @@ "type": "module", "exports": { ".": "./lib/index.js", - "./api": "./lib/api/index.js", "./methods": "./lib/methods/index.js", - "./methods/*": "./lib/methods/*/index.js" + "./methods/alias": "./lib/methods/alias/index.js", + "./methods/assets": "./lib/methods/assets/index.js", + "./methods/bundle": "./lib/methods/bundle/index.js", + "./methods/compilePaths": "./lib/methods/compilePaths/index.js", + "./methods/config": "./lib/methods/config/index.js", + "./methods/copyDir": "./lib/methods/copyDir/index.js", + "./methods/copyFile": "./lib/methods/copyFile/index.js", + "./methods/define": "./lib/methods/define/index.js", + "./methods/devtool": "./lib/methods/devtool/index.js", + "./methods/entry": "./lib/methods/entry/index.js", + "./methods/experiments": "./lib/methods/experiments/index.js", + "./methods/externals": "./lib/methods/externals/index.js", + "./methods/hash": "./lib/methods/hash/index.js", + "./methods/html": "./lib/methods/html/index.js", + "./methods/minimize": "./lib/methods/minimize/index.js", + "./methods/persist": "./lib/methods/persist/index.js", + "./methods/provide": "./lib/methods/provide/index.js", + "./methods/proxy": "./lib/methods/proxy/index.js", + "./methods/runtime": "./lib/methods/runtime/index.js", + "./methods/serve": "./lib/methods/serve/index.js", + "./methods/setProxyUrl": "./lib/methods/setProxyUrl/index.js", + "./methods/setPublicProxyUrl": "./lib/methods/setPublicProxyUrl/index.js", + "./methods/setPublicUrl": "./lib/methods/setPublicUrl/index.js", + "./methods/setUrl": "./lib/methods/setUrl/index.js", + "./methods/splitChunks": "./lib/methods/splitChunks/index.js", + "./methods/use": "./lib/methods/use/index.js", + "./methods/watch": "./lib/methods/watch/index.js", + "./service": "./lib/service/index.js" }, "typesVersions": { "*": { ".": [ "./lib/index.d.ts" ], - "api": [ - "./lib/api/index.d.ts" - ], "methods": [ "./lib/methods/index.d.ts" ], - "methods/*": [ - "./lib/methods/*/index.d.ts" + "methods/alias": [ + "./lib/methods/alias/index.d.ts" + ], + "methods/assets": [ + "./lib/methods/assets/index.d.ts" + ], + "methods/bundle": [ + "./lib/methods/bundle/index.d.ts" + ], + "methods/compilePaths": [ + "./lib/methods/compilePaths/index.d.ts" + ], + "methods/config": [ + "./lib/methods/config/index.d.ts" + ], + "methods/copyDir": [ + "./lib/methods/copyDir/index.d.ts" + ], + "methods/copyFile": [ + "./lib/methods/copyFile/index.d.ts" + ], + "methods/define": [ + "./lib/methods/define/index.d.ts" + ], + "methods/devtool": [ + "./lib/methods/devtool/index.d.ts" + ], + "methods/entry": [ + "./lib/methods/entry/index.d.ts" + ], + "methods/experiments": [ + "./lib/methods/experiments/index.d.ts" + ], + "methods/externals": [ + "./lib/methods/externals/index.d.ts" + ], + "methods/hash": [ + "./lib/methods/hash/index.d.ts" + ], + "methods/html": [ + "./lib/methods/html/index.d.ts" + ], + "methods/minimize": [ + "./lib/methods/minimize/index.d.ts" + ], + "methods/persist": [ + "./lib/methods/persist/index.d.ts" + ], + "methods/provide": [ + "./lib/methods/provide/index.d.ts" + ], + "methods/proxy": [ + "./lib/methods/proxy/index.d.ts" + ], + "methods/runtime": [ + "./lib/methods/runtime/index.d.ts" + ], + "methods/serve": [ + "./lib/methods/serve/index.d.ts" + ], + "methods/setProxyUrl": [ + "./lib/methods/setProxyUrl/index.d.ts" + ], + "methods/setPublicProxyUrl": [ + "./lib/methods/setPublicProxyUrl/index.d.ts" + ], + "methods/setPublicUrl": [ + "./lib/methods/setPublicUrl/index.d.ts" + ], + "methods/setUrl": [ + "./lib/methods/setUrl/index.d.ts" + ], + "methods/splitChunks": [ + "./lib/methods/splitChunks/index.d.ts" + ], + "methods/use": [ + "./lib/methods/use/index.d.ts" + ], + "methods/watch": [ + "./lib/methods/watch/index.d.ts" + ], + "service": [ + "./lib/service/index.d.ts" ] } }, "types": "./lib/index.d.ts", "module": "./lib/index.js", "devDependencies": { - "@roots/bud-minify": "workspace:*", "@skypack/package-check": "0.2.2", "@types/node": "18.16.19" }, "dependencies": { "@roots/bud-extensions": "workspace:*", "@roots/bud-framework": "workspace:*", + "@roots/bud-minify": "workspace:*", "@roots/bud-support": "workspace:*", "@roots/container": "workspace:*", "chalk": "5.3.0", diff --git a/sources/@roots/bud-api/src/index.ts b/sources/@roots/bud-api/src/index.ts index fed354b978..7c4c7aca63 100644 --- a/sources/@roots/bud-api/src/index.ts +++ b/sources/@roots/bud-api/src/index.ts @@ -8,34 +8,35 @@ * @see https://github.com/roots/bud */ -import type {Api as Service} from './api/service.js' -import type * as Alias from './methods/alias/index.js' -import type * as Assets from './methods/assets/index.js' -import type * as Bundle from './methods/bundle/index.js' -import type * as CompilePaths from './methods/compilePaths/index.js' -import type * as Config from './methods/config/index.js' -import type * as CopyDir from './methods/copyDir/index.js' -import type * as CopyFile from './methods/copyFile/index.js' -import type * as Define from './methods/define/index.js' -import type * as Devtool from './methods/devtool/index.js' -import type * as Entry from './methods/entry/index.js' -import type * as Experiments from './methods/experiments/index.js' -import type * as Externals from './methods/externals/index.js' -import type * as Hash from './methods/hash/index.js' -import type * as Html from './methods/html/index.js' -import type * as Minimize from './methods/minimize/index.js' -import type * as Persist from './methods/persist/index.js' -import type * as Provide from './methods/provide/index.js' -import type * as Proxy from './methods/proxy/index.js' -import type * as Runtime from './methods/runtime/index.js' -import type * as Serve from './methods/serve/index.js' -import type * as SetProxyUrl from './methods/setProxyUrl/index.js' -import type * as SetPublicProxyUrl from './methods/setPublicProxyUrl/index.js' -import type * as SetPublicUrl from './methods/setPublicUrl/index.js' -import type * as SetUrl from './methods/setUrl/index.js' -import type * as SplitChunks from './methods/splitChunks/index.js' -import type * as Use from './methods/use/index.js' -import type * as Watch from './methods/watch/index.js' +import type * as Alias from '@roots/bud-api/methods/alias' +import type * as Assets from '@roots/bud-api/methods/assets' +import type * as Bundle from '@roots/bud-api/methods/bundle' +import type * as CompilePaths from '@roots/bud-api/methods/compilePaths' +import type * as Config from '@roots/bud-api/methods/config' +import type * as CopyDir from '@roots/bud-api/methods/copyDir' +import type * as CopyFile from '@roots/bud-api/methods/copyFile' +import type * as Define from '@roots/bud-api/methods/define' +import type * as Devtool from '@roots/bud-api/methods/devtool' +import type * as Entry from '@roots/bud-api/methods/entry' +import type * as Experiments from '@roots/bud-api/methods/experiments' +import type * as Externals from '@roots/bud-api/methods/externals' +import type * as Hash from '@roots/bud-api/methods/hash' +import type * as Html from '@roots/bud-api/methods/html' +import type * as Minimize from '@roots/bud-api/methods/minimize' +import type * as Persist from '@roots/bud-api/methods/persist' +import type * as Provide from '@roots/bud-api/methods/provide' +import type * as Proxy from '@roots/bud-api/methods/proxy' +import type * as Runtime from '@roots/bud-api/methods/runtime' +import type * as Serve from '@roots/bud-api/methods/serve' +import type * as SetProxyUrl from '@roots/bud-api/methods/setProxyUrl' +import type * as SetPublicProxyUrl from '@roots/bud-api/methods/setPublicProxyUrl' +import type * as SetPublicUrl from '@roots/bud-api/methods/setPublicUrl' +import type * as SetUrl from '@roots/bud-api/methods/setUrl' +import type * as SplitChunks from '@roots/bud-api/methods/splitChunks' +import type * as Use from '@roots/bud-api/methods/use' +import type * as Watch from '@roots/bud-api/methods/watch' + +import {default as Service} from '@roots/bud-api/service' declare module '@roots/bud-framework' { interface Bud { @@ -171,6 +172,11 @@ declare module '@roots/bud-framework' { */ html(...params: Html.Parameters): Bud + /** + * @roots/bud-minify + */ + minify: import('@roots/bud-minify').default + /** * ## bud.minimize * @@ -298,6 +304,11 @@ declare module '@roots/bud-framework' { } type Api = Service + + interface Services { + api: Service + extensions: import('@roots/bud-extensions').default + } } -export {Api as default} from './api/service.js' +export {Service as default} diff --git a/sources/@roots/bud-api/src/methods/assets/index.ts b/sources/@roots/bud-api/src/methods/assets/index.ts index 7cd5071cf9..d530d03b4e 100644 --- a/sources/@roots/bud-api/src/methods/assets/index.ts +++ b/sources/@roots/bud-api/src/methods/assets/index.ts @@ -43,7 +43,7 @@ export const assets: assets = async function assets( app.extensions .get(`@roots/bud-extensions/copy-webpack-plugin`) - .set(`patterns`, (patterns = []) => [ + ?.set(`patterns`, (patterns = []) => [ ...patterns, ...arrayedRequest.map(valueMapper), ]) diff --git a/sources/@roots/bud-api/src/api/service.ts b/sources/@roots/bud-api/src/service/index.ts similarity index 87% rename from sources/@roots/bud-api/src/api/service.ts rename to sources/@roots/bud-api/src/service/index.ts index d467376600..7c60da7cb4 100644 --- a/sources/@roots/bud-api/src/api/service.ts +++ b/sources/@roots/bud-api/src/service/index.ts @@ -8,7 +8,7 @@ import * as methods from '../methods/index.js' /** * Bud.API {@link ServiceContainer} */ -export class Api extends ServiceContainer implements BudApi { +class Api extends ServiceContainer implements BudApi { /** * {@link BudApi.label} */ @@ -23,3 +23,5 @@ export class Api extends ServiceContainer implements BudApi { ) } } + +export {Api as default} diff --git a/sources/@roots/bud-api/src/methods/assets/index.test.ts b/sources/@roots/bud-api/test/assets.test.ts similarity index 98% rename from sources/@roots/bud-api/src/methods/assets/index.test.ts rename to sources/@roots/bud-api/test/assets.test.ts index f74a92531b..b3c18ac188 100644 --- a/sources/@roots/bud-api/src/methods/assets/index.test.ts +++ b/sources/@roots/bud-api/test/assets.test.ts @@ -1,9 +1,9 @@ -import {factory} from '@repo/test-kit' +import {type Bud, factory} from '@repo/test-kit' import {assets} from '@roots/bud-api/methods/assets' import {beforeEach, describe, expect, it} from 'vitest' describe(`bud.assets`, () => { - let bud + let bud: Bud let assetsFn: typeof assets beforeEach(async () => { diff --git a/sources/@roots/bud-api/tsconfig.json b/sources/@roots/bud-api/tsconfig.json index 5da020c1a0..befaa04eee 100644 --- a/sources/@roots/bud-api/tsconfig.json +++ b/sources/@roots/bud-api/tsconfig.json @@ -1,13 +1,18 @@ { "extends": "../../../config/tsconfig.json", "compilerOptions": { - "strict": true, - "rootDir": "./src", "outDir": "./lib", + "paths": { + "@roots/bud-api": ["./src/index.ts"], + "@roots/bud-api/methods": ["./src/methods/index.ts"], + "@roots/bud-api/methods/*": ["./src/methods/*/index.ts"], + "@roots/bud-api/service": ["./src/service/index.ts"], + }, + "rootDir": "./src", + "strict": true, "types": ["node", "@roots/bud-framework", "@roots/bud-extensions", "@roots/bud-minify"] }, - "include": ["./src/**/*.ts"], - "exclude": ["./src/**/*.test.ts"], + "include": ["./src"], "references": [ {"path": "../bud-build/tsconfig.json"}, {"path": "../bud-extensions/tsconfig.json"}, diff --git a/sources/@roots/bud-babel/package.json b/sources/@roots/bud-babel/package.json index 9e96625f21..1cb8ce9481 100644 --- a/sources/@roots/bud-babel/package.json +++ b/sources/@roots/bud-babel/package.json @@ -48,22 +48,16 @@ ], "type": "module", "exports": { - ".": { - "import": "./lib/index.js", - "default": "./lib/index.js" - }, - "./types": { - "import": "./lib/types.js", - "default": "./lib/types.js" - } + ".": "./lib/index.js", + "./extension": "./lib/extension.js" }, "typesVersions": { "*": { ".": [ "./lib/index.d.ts" ], - "types": [ - "./lib/types.d.ts" + "extension": [ + "./lib/extension.d.ts" ] } }, diff --git a/sources/@roots/bud-babel/src/extension.ts b/sources/@roots/bud-babel/src/extension.ts index 04ffb543db..38c765d835 100644 --- a/sources/@roots/bud-babel/src/extension.ts +++ b/sources/@roots/bud-babel/src/extension.ts @@ -1,3 +1,4 @@ +import type {LoaderOptions, Registry} from '@roots/bud-babel' import type {Bud} from '@roots/bud-framework' import {Extension} from '@roots/bud-framework/extension' @@ -6,20 +7,18 @@ import { expose, label, } from '@roots/bud-framework/extension/decorators' -import {InputError} from '@roots/bud-support/errors' +import { InputError } from '@roots/bud-support/errors' import isString from '@roots/bud-support/lodash/isString' import isUndefined from '@roots/bud-support/lodash/isUndefined' -import type {LoaderOptions, Registry} from './types.js' - /** * Babel configuration */ @label(`@roots/bud-babel`) @expose(`babel`) -export default class BabelExtension extends Extension { +class BabelExtension extends Extension { /** - * Babel configuration options (if overridden by project config file) + * Babel configuration options (sourced from babelrc) */ public declare configFileOptions: Record | undefined @@ -175,41 +174,20 @@ export default class BabelExtension extends Extension { */ @bind public setPlugin( - name: [any, any] | string, - plugin?: [any, any] | string, + name: [any, any?] | string, + plugin?: [any, any?] | string, ): this { - if (this.configFile) { - this.logger.warn( - `Babel configuration is being overridden by project configuration file.\n`, - `bud.babel.setPlugin will not work as expected\n`, - `tried to set`, - name, - `to`, - plugin, - ) - } - - if (!plugin && Array.isArray(name)) { - this.plugins[name[0]] = name - return this - } - - if (!plugin && !Array.isArray(name)) { - this.plugins[name] = [name] + if (!plugin) { + this.plugins[name[0]] = Array.isArray(name) ? name : [name] return this } if (Array.isArray(name)) { - throw new InputError( - `When defined without options the babel plugin name must be a string.`, - { - docs: new URL(`https://bud.js.org/extensions/bud-babel`), - thrownBy: `bud.babel.setPlugin`, - }, - ) + throw new InputError(`Invalid plugin name`) } this.plugins[name] = Array.isArray(plugin) ? plugin : [plugin] + return this } @@ -223,20 +201,15 @@ export default class BabelExtension extends Extension { } /** - * Set babel presets + * Set babel plugins */ @bind - public setPlugins(plugins: {[key: string]: [any, any] | string}): this { + public setPlugins(plugins: {[key: string]: [any, any?] | string}): this { this.plugins = Object.entries(plugins).reduce( - (plugins, [name, plugin]) => { - if (Array.isArray(plugin)) { - plugins[name] = plugin - return plugins - } - - plugins[name] = [plugin] - return plugins - }, + (plugins, [name, plugin]) => ({ + ...plugins, + [name]: Array.isArray(plugin) ? plugin : [plugin], + }), {}, ) @@ -247,13 +220,21 @@ export default class BabelExtension extends Extension { * Set a babel preset */ @bind - public setPreset(name: string, preset?: [string, any] | string): this { + public setPreset( + name: [any, any?] | string, + preset?: [any, any?] | string, + ): this { if (!preset) { - this.presets[name] = [name] + this.presets[name[0]] = Array.isArray(name) ? name : [name] return this } + if (Array.isArray(name)) { + throw new InputError(`Invalid preset name`) + } + this.presets[name] = Array.isArray(preset) ? preset : [preset] + return this } @@ -274,15 +255,10 @@ export default class BabelExtension extends Extension { [key: string]: [string, any] | string }): this { this.presets = Object.entries(presets).reduce( - (presets, [name, preset]) => { - if (Array.isArray(preset)) { - presets[name] = preset - return presets - } - - presets[name] = [preset] - return presets - }, + (presets, [name, preset]) => ({ + ...presets, + [name]: Array.isArray(preset) ? preset : [preset], + }), {}, ) @@ -309,3 +285,5 @@ export default class BabelExtension extends Extension { return this } } + +export {BabelExtension as default} diff --git a/sources/@roots/bud-babel/src/index.ts b/sources/@roots/bud-babel/src/index.ts index 1ef896a93b..6889b20168 100644 --- a/sources/@roots/bud-babel/src/index.ts +++ b/sources/@roots/bud-babel/src/index.ts @@ -8,7 +8,95 @@ * @see https://github.com/roots/bud */ -import BabelExtension from './extension.js' -import './types.js' +import type {PublicExtensionApi} from '@roots/bud-framework/extension' + +import {default as BabelExtension} from '@roots/bud-babel/extension' + +interface LoaderOptions { + cacheCompression?: boolean + cacheDirectory?: boolean | string + cacheIdentifier?: string + configFile?: boolean + customize?: string + env?: Record + plugins?: Array<[string, any?]> + presets?: Array<[string, any?]> + root?: string + targets?: any +} + +interface BabelPublicApi + extends PublicExtensionApi { + plugins: BabelExtension[`plugins`] + presets: BabelExtension[`presets`] + setPlugin: BabelExtension[`setPlugin`] + setPluginOptions: BabelExtension[`setPluginOptions`] + setPlugins: BabelExtension[`setPlugins`] + setPreset: BabelExtension[`setPreset`] + setPresetOptions: BabelExtension[`setPresetOptions`] + setPresets: BabelExtension[`setPresets`] + unsetPlugin: BabelExtension[`unsetPlugin`] + unsetPreset: BabelExtension[`unsetPreset`] +} + +/** + * Babel plugin value + * + * @see https://babeljs.io/docs/en/plugins + */ +type Plugin = CallableFunction | NormalizedPlugin | string + +/** + * Babel transpiler options + */ +type Options = { + config?: boolean | string + plugins?: Plugin[] +} + +/** + * Normalized babel plugin + * + * @remarks + * Expressed as a tuple of `[name, options]` + */ +type NormalizedPlugin = [any, Record] + +/** + * Registrable plugin value + * + * @see https://babeljs.io/docs/en/plugins#using-a-plugin + */ +type Registrable = NormalizedPlugin | string + +/** + * Plugins and presets registry interface + */ +interface Registry { + [key: string]: [string, any?] +} + +declare module '@roots/bud-framework' { + interface Bud { + /** + * Babel configuration + */ + babel: BabelPublicApi + } + + interface Modules { + '@roots/bud-babel': BabelExtension + } + + interface Loaders { + babel: any + } + + interface Items { + babel: any + } +} + export default BabelExtension +export type {BabelPublicApi, LoaderOptions, NormalizedPlugin, Options, Plugin, Registrable, Registry} diff --git a/sources/@roots/bud-babel/src/types.ts b/sources/@roots/bud-babel/src/types.ts deleted file mode 100644 index c0429a72a4..0000000000 --- a/sources/@roots/bud-babel/src/types.ts +++ /dev/null @@ -1,90 +0,0 @@ -import type {PublicExtensionApi} from '@roots/bud-framework/extension' - -import '@roots/bud' - -import type BabelExtension from './extension.js' - -export interface LoaderOptions { - cacheCompression?: boolean - cacheDirectory?: boolean | string - cacheIdentifier?: string - configFile?: boolean - customize?: string - env?: Record - plugins?: Array<[string, any?]> - presets?: Array<[string, any?]> - root?: string - targets?: any -} - -export interface BabelPublicApi - extends PublicExtensionApi { - plugins: BabelExtension[`plugins`] - presets: BabelExtension[`presets`] - setPlugin: BabelExtension[`setPlugin`] - setPluginOptions: BabelExtension[`setPluginOptions`] - setPlugins: BabelExtension[`setPlugins`] - setPreset: BabelExtension[`setPreset`] - setPresetOptions: BabelExtension[`setPresetOptions`] - setPresets: BabelExtension[`setPresets`] - unsetPlugin: BabelExtension[`unsetPlugin`] - unsetPreset: BabelExtension[`unsetPreset`] -} - -/** - * Babel plugin value - * - * @see https://babeljs.io/docs/en/plugins - */ -export type Plugin = CallableFunction | NormalizedPlugin | string - -/** - * Babel transpiler options - */ -export type Options = { - config?: boolean | string - plugins?: Plugin[] -} - -/** - * Normalized babel plugin - * - * @remarks - * Expressed as a tuple of `[name, options]` - */ -export type NormalizedPlugin = [any, Record] - -/** - * Registrable plugin value - * - * @see https://babeljs.io/docs/en/plugins#using-a-plugin - */ -export type Registrable = NormalizedPlugin | string - -/** - * Plugins and presets registry interface - */ -export interface Registry { - [key: string]: [string, any?] -} - -declare module '@roots/bud-framework' { - interface Bud { - /** - * Babel configuration - */ - babel: BabelPublicApi - } - - interface Modules { - '@roots/bud-babel': BabelExtension - } - - interface Loaders { - babel: any - } - - interface Items { - babel: any - } -} diff --git a/sources/@roots/bud-babel/test/extension.test.ts b/sources/@roots/bud-babel/test/extension.test.ts index c74647d9a4..066505c904 100644 --- a/sources/@roots/bud-babel/test/extension.test.ts +++ b/sources/@roots/bud-babel/test/extension.test.ts @@ -1,8 +1,7 @@ import {Bud, factory} from '@repo/test-kit' +import BabelExtension from '@roots/bud-babel' import {beforeEach, describe, expect, it} from 'vitest' -import BabelExtension from '../src/index' - describe(`@roots/bud-babel`, () => { let bud: Bud let BabelInstance: BabelExtension @@ -20,31 +19,31 @@ describe(`@roots/bud-babel`, () => { expect(BabelInstance.register).toBeDefined() }) - it(`config class shoudl have setPlugins`, async () => { + it(`should have setPlugins method`, async () => { expect(BabelInstance.setPlugins).toBeInstanceOf(Function) }) - it(`config class shoudl have setPresets`, async () => { + it(`should have setPresets method`, async () => { expect(BabelInstance.setPresets).toBeInstanceOf(Function) }) - it(`config class shoudl have setPlugin`, async () => { + it(`should have setPlugin method`, async () => { expect(BabelInstance.setPlugin).toBeInstanceOf(Function) }) - it(`config class shoudl have setPreset`, async () => { + it(`should have setPreset method`, async () => { expect(BabelInstance.setPreset).toBeInstanceOf(Function) }) - it(`config class shoudl have setPluginOptions`, async () => { + it(`should have setPluginOptions method`, async () => { expect(BabelInstance.setPluginOptions).toBeInstanceOf(Function) }) - it(`config class shoudl have setPluginOptions`, async () => { + it(`should have setPluginOptions method`, async () => { expect(BabelInstance.setPresetOptions).toBeInstanceOf(Function) }) - it(`bud.babel.setPresets should behave as expected`, async () => { + it(`should setPresets`, async () => { BabelInstance.presets = {} const value: Record = { diff --git a/sources/@roots/bud-babel/tsconfig.json b/sources/@roots/bud-babel/tsconfig.json index 1374746e13..788ee8ec20 100644 --- a/sources/@roots/bud-babel/tsconfig.json +++ b/sources/@roots/bud-babel/tsconfig.json @@ -3,10 +3,10 @@ "compilerOptions": { "rootDir": "./src", "outDir": "./lib", - "types": ["@roots/bud-framework", "@roots/bud-build"] + "types": ["@roots/bud-framework", "@roots/bud-build"], + "strict": true, }, "include": ["src"], - "exclude": ["lib", "node_modules", "**/*.test.ts"], "references": [ {"path": "../bud-framework/tsconfig.json"}, {"path": "../bud-api/tsconfig.json"}, diff --git a/sources/@roots/bud-build/package.json b/sources/@roots/bud-build/package.json index 48b99742e8..8c7874d41d 100644 --- a/sources/@roots/bud-build/package.json +++ b/sources/@roots/bud-build/package.json @@ -51,38 +51,118 @@ "exports": { ".": "./lib/index.js", "./config": "./lib/config/index.js", - "./handlers": "./lib/handlers/index.js", + "./helpers/isMjs": "./lib/helpers/isMjs.js", + "./helpers/registrable": "./lib/helpers/registrable.js", + "./helpers/script-extension": "./lib/helpers/script-extension.js", "./item": "./lib/item/index.js", + "./items": "./lib/items/index.js", "./loader": "./lib/loader/index.js", + "./loaders": "./lib/loaders/index.js", + "./registry": "./lib/registry/index.js", "./rule": "./lib/rule/index.js", - "./service": "./lib/service.js", - "./types": "./lib/types.js" + "./rules": "./lib/rules/index.js", + "./rules/css": "./lib/rules/css.js", + "./rules/css.module": "./lib/rules/css.module.js", + "./rules/csv": "./lib/rules/csv.js", + "./rules/font": "./lib/rules/font.js", + "./rules/font.inline": "./lib/rules/font.inline.js", + "./rules/html": "./lib/rules/html.js", + "./rules/image": "./lib/rules/image.js", + "./rules/image.inline": "./lib/rules/image.inline.js", + "./rules/js": "./lib/rules/js.js", + "./rules/json": "./lib/rules/json.js", + "./rules/svg": "./lib/rules/svg.js", + "./rules/svg.inline": "./lib/rules/svg.inline.js", + "./rules/toml": "./lib/rules/toml.js", + "./rules/webp": "./lib/rules/webp.js", + "./rules/yml": "./lib/rules/yml.js", + "./service": "./lib/service/index.js" }, "typesVersions": { "*": { - "*": [ + ".": [ "./lib/types.js" ], "config": [ "./lib/config/index.d.ts" ], - "handlers": [ - "./lib/handlers/index.d.ts" + "helpers/isMjs": [ + "./lib/helpers/isMjs.d.ts" + ], + "helpers/registrable": [ + "./lib/helpers/registrable.d.ts" + ], + "helpers/script-extension": [ + "./lib/helpers/script-extension.d.ts" ], "item": [ "./lib/item/index.d.ts" ], + "items": [ + "./lib/items/index.d.ts" + ], "loader": [ "./lib/loader/index.d.ts" ], + "loaders": [ + "./lib/loaders/index.d.ts" + ], + "registry": [ + "./lib/registry/index.d.ts" + ], "rule": [ "./lib/rule/index.d.ts" ], - "service": [ - "./lib/service.d.ts" + "rules": [ + "./lib/rules/index.d.ts" + ], + "rules/css": [ + "./lib/rules/css.d.ts" + ], + "rules/css.module": [ + "./lib/rules/css.module.d.ts" + ], + "rules/csv": [ + "./lib/rules/csv.d.ts" + ], + "rules/font": [ + "./lib/rules/font.d.ts" + ], + "rules/font.inline": [ + "./lib/rules/font.inline.d.ts" ], - "types": [ - "./lib/types.d.ts" + "rules/html": [ + "./lib/rules/html.d.ts" + ], + "rules/image": [ + "./lib/rules/image.d.ts" + ], + "rules/image.inline": [ + "./lib/rules/image.inline.d.ts" + ], + "rules/js": [ + "./lib/rules/js.d.ts" + ], + "rules/json": [ + "./lib/rules/json.d.ts" + ], + "rules/svg": [ + "./lib/rules/svg.d.ts" + ], + "rules/svg.inline": [ + "./lib/rules/svg.inline.d.ts" + ], + "rules/toml": [ + "./lib/rules/toml.d.ts" + ], + "rules/webp": [ + "./lib/rules/webp.d.ts" + ], + "rules/yml": [ + "./lib/rules/yml.d.ts" + ], + "service": [ + "./lib/service/index.d.ts" ] } }, diff --git a/sources/@roots/bud-build/src/config/bail.ts b/sources/@roots/bud-build/src/config/bail.ts index 34dadc4d70..45e69d18a0 100644 --- a/sources/@roots/bud-build/src/config/bail.ts +++ b/sources/@roots/bud-build/src/config/bail.ts @@ -1,4 +1,4 @@ -import type {Factory} from './index.js' +import type {Factory} from '@roots/bud-build/config' export const bail: Factory<'bail'> = async ({hooks, isProduction}) => hooks.filter(`build.bail`, isProduction) diff --git a/sources/@roots/bud-build/src/config/cache.ts b/sources/@roots/bud-build/src/config/cache.ts index ef54a95014..8dcab0a125 100644 --- a/sources/@roots/bud-build/src/config/cache.ts +++ b/sources/@roots/bud-build/src/config/cache.ts @@ -1,4 +1,4 @@ -import type {Factory} from './index.js' +import type {Factory} from '@roots/bud-build/config' export const cache: Factory<`cache`> = async ({cache, hooks}) => hooks.filter(`build.cache`, cache.configuration) diff --git a/sources/@roots/bud-build/src/config/context.ts b/sources/@roots/bud-build/src/config/context.ts index f39287b14d..346c847872 100644 --- a/sources/@roots/bud-build/src/config/context.ts +++ b/sources/@roots/bud-build/src/config/context.ts @@ -1,3 +1,3 @@ -import type {Factory} from './index.js' +import type {Factory} from '@roots/bud-build/config' export const context: Factory<`context`> = async ({path}) => path(`@src`) diff --git a/sources/@roots/bud-build/src/config/dependencies.ts b/sources/@roots/bud-build/src/config/dependencies.ts index 333f955034..3f35c69278 100644 --- a/sources/@roots/bud-build/src/config/dependencies.ts +++ b/sources/@roots/bud-build/src/config/dependencies.ts @@ -1,6 +1,6 @@ import isUndefined from '@roots/bud-support/lodash/isUndefined' -import type {Factory} from './index.js' +import type {Factory} from '@roots/bud-build/config' export const dependencies: Factory<`dependencies`> = async ({ hooks, diff --git a/sources/@roots/bud-build/src/config/devtool.ts b/sources/@roots/bud-build/src/config/devtool.ts index 3b25fccc20..462f6b188a 100644 --- a/sources/@roots/bud-build/src/config/devtool.ts +++ b/sources/@roots/bud-build/src/config/devtool.ts @@ -1,4 +1,4 @@ -import type {Factory} from './index.js' +import type {Factory} from '@roots/bud-build/config' export const devtool: Factory<`devtool`> = async ({hooks}) => hooks.filter(`build.devtool`, false) diff --git a/sources/@roots/bud-build/src/config/entry.ts b/sources/@roots/bud-build/src/config/entry.ts index c93e8355ef..15358309d4 100644 --- a/sources/@roots/bud-build/src/config/entry.ts +++ b/sources/@roots/bud-build/src/config/entry.ts @@ -1,4 +1,4 @@ -import type {Factory} from './index.js' +import type {Factory} from '@roots/bud-build/config' export const entry: Factory<`entry`> = async ({hooks}) => hooks.filter(`build.entry`, {main: {import: [`index`]}}) diff --git a/sources/@roots/bud-build/src/config/experiments.ts b/sources/@roots/bud-build/src/config/experiments.ts index 23db1d3e6a..f7558548c8 100644 --- a/sources/@roots/bud-build/src/config/experiments.ts +++ b/sources/@roots/bud-build/src/config/experiments.ts @@ -1,4 +1,4 @@ -import type {Factory} from './index.js' +import type {Factory} from '@roots/bud-build/config' export const experiments: Factory<`experiments`> = async ({ hooks, diff --git a/sources/@roots/bud-build/src/config/externals.ts b/sources/@roots/bud-build/src/config/externals.ts index 946d79f93e..acfac96e7d 100644 --- a/sources/@roots/bud-build/src/config/externals.ts +++ b/sources/@roots/bud-build/src/config/externals.ts @@ -1,4 +1,4 @@ -import type {Factory} from './index.js' +import type {Factory} from '@roots/bud-build/config' export const externals: Factory<`externals`> = async app => app.hooks.filter(`build.externals`, undefined) diff --git a/sources/@roots/bud-build/src/config/externalsType.ts b/sources/@roots/bud-build/src/config/externalsType.ts index 54fceef50c..309f05f867 100644 --- a/sources/@roots/bud-build/src/config/externalsType.ts +++ b/sources/@roots/bud-build/src/config/externalsType.ts @@ -1,4 +1,4 @@ -import type {Factory} from './index.js' +import type {Factory} from '@roots/bud-build/config' export const externalsType: Factory<`externalsType`> = async app => undefined diff --git a/sources/@roots/bud-build/src/config/index.ts b/sources/@roots/bud-build/src/config/index.ts index 1f3decd2b3..0f37e8cf01 100644 --- a/sources/@roots/bud-build/src/config/index.ts +++ b/sources/@roots/bud-build/src/config/index.ts @@ -1,63 +1,33 @@ import type {Bud} from '@roots/bud-framework' import type {Configuration} from '@roots/bud-framework/config' -import {bail} from './bail.js' -import {cache} from './cache.js' -import {context} from './context.js' -import {dependencies} from './dependencies.js' -import {devtool} from './devtool.js' -import {entry} from './entry.js' -import {experiments} from './experiments.js' -import {externals} from './externals.js' -import {externalsType} from './externalsType.js' -import {infrastructureLogging} from './infrastructureLogging.js' -import {loader} from './loader.js' -import {mode} from './mode.js' -import {module} from './module.js' -import {name} from './name.js' -import {node} from './node.js' -import {optimization} from './optimization.js' -import {output} from './output/index.js' -import {parallelism} from './parallelism.js' -import {performance} from './performance.js' -import {plugins} from './plugins.js' -import {profile} from './profile.js' -import {recordsPath} from './recordsPath.js' -import {resolve} from './resolve.js' -import {resolveLoader} from './resolveLoader.js' -import {snapshot} from './snapshot.js' -import {stats} from './stats.js' -import {target} from './target.js' - -export { - bail, - cache, - context, - dependencies, - devtool, - entry, - experiments, - externals, - externalsType, - infrastructureLogging, - loader, - mode, - module, - name, - node, - optimization, - output, - parallelism, - performance, - plugins, - profile, - recordsPath, - resolve, - resolveLoader, - snapshot, - stats, - target, -} +export {bail} from './bail.js' +export {cache} from './cache.js' +export {context} from './context.js' +export {dependencies} from './dependencies.js' +export {devtool} from './devtool.js' +export {entry} from './entry.js' +export {experiments} from './experiments.js' +export {externals} from './externals.js' +export {externalsType} from './externalsType.js' +export {infrastructureLogging} from './infrastructureLogging.js' +export {loader} from './loader.js' +export {mode} from './mode.js' +export {module} from './module.js' +export {name} from './name.js' +export {node} from './node.js' +export {optimization} from './optimization.js' +export {output} from './output/index.js' +export {parallelism} from './parallelism.js' +export {performance} from './performance.js' +export {plugins} from './plugins.js' +export {profile} from './profile.js' +export {recordsPath} from './recordsPath.js' +export {resolve} from './resolve.js' +export {resolveLoader} from './resolveLoader.js' +export {snapshot} from './snapshot.js' +export {stats} from './stats.js' +export {target} from './target.js' export interface Factory< Key extends keyof Config, diff --git a/sources/@roots/bud-build/src/config/infrastructureLogging.ts b/sources/@roots/bud-build/src/config/infrastructureLogging.ts index 204aca29d6..7f6916859d 100644 --- a/sources/@roots/bud-build/src/config/infrastructureLogging.ts +++ b/sources/@roots/bud-build/src/config/infrastructureLogging.ts @@ -1,6 +1,6 @@ import logger from '@roots/bud-support/logger' -import type {Factory} from './index.js' +import type {Factory} from '@roots/bud-build/config' export const infrastructureLogging: Factory< `infrastructureLogging` diff --git a/sources/@roots/bud-build/src/config/loader.ts b/sources/@roots/bud-build/src/config/loader.ts index 27ff5af1b6..58c7617eb9 100644 --- a/sources/@roots/bud-build/src/config/loader.ts +++ b/sources/@roots/bud-build/src/config/loader.ts @@ -1,4 +1,4 @@ -import type {Factory} from './index.js' +import type {Factory} from '@roots/bud-build/config' export const loader: Factory<`loader`> = async app => app.hooks.filter(`build.loader`) diff --git a/sources/@roots/bud-build/src/config/mode.ts b/sources/@roots/bud-build/src/config/mode.ts index 51b710ed84..706fa19e56 100644 --- a/sources/@roots/bud-build/src/config/mode.ts +++ b/sources/@roots/bud-build/src/config/mode.ts @@ -1,4 +1,4 @@ -import type {Factory} from './index.js' +import type {Factory} from '@roots/bud-build/config' export const mode: Factory<`mode`> = async bud => bud.hooks.filter(`build.mode`, bud.mode) diff --git a/sources/@roots/bud-build/src/config/module.ts b/sources/@roots/bud-build/src/config/module.ts index 827cf149cf..b142100dd6 100644 --- a/sources/@roots/bud-build/src/config/module.ts +++ b/sources/@roots/bud-build/src/config/module.ts @@ -1,6 +1,6 @@ import type {Bud} from '@roots/bud-framework' -import type {Factory} from './index.js' +import type {Factory} from '@roots/bud-build/config' interface Props { filter: Bud[`hooks`][`filter`] diff --git a/sources/@roots/bud-build/src/config/name.ts b/sources/@roots/bud-build/src/config/name.ts index 479576b3c0..b309ab39c4 100644 --- a/sources/@roots/bud-build/src/config/name.ts +++ b/sources/@roots/bud-build/src/config/name.ts @@ -1,4 +1,4 @@ -import type {Factory} from './index.js' +import type {Factory} from '@roots/bud-build/config' export const name: Factory<`name`> = async ({hooks, label}) => hooks.filter(`build.name`, label) diff --git a/sources/@roots/bud-build/src/config/node.ts b/sources/@roots/bud-build/src/config/node.ts index 55f433246b..0cfc501c76 100644 --- a/sources/@roots/bud-build/src/config/node.ts +++ b/sources/@roots/bud-build/src/config/node.ts @@ -1,4 +1,4 @@ -import type {Factory} from './index.js' +import type {Factory} from '@roots/bud-build/config' export const node: Factory<`node`> = async ({hooks}) => hooks.filter(`build.node`, false) diff --git a/sources/@roots/bud-build/src/config/optimization.ts b/sources/@roots/bud-build/src/config/optimization.ts index 10b0d4b56b..36fba016b0 100644 --- a/sources/@roots/bud-build/src/config/optimization.ts +++ b/sources/@roots/bud-build/src/config/optimization.ts @@ -1,4 +1,4 @@ -import type {Factory} from './index.js' +import type {Factory} from '@roots/bud-build/config' export const optimization: Factory<`optimization`> = async ({ hooks: {filter}, diff --git a/sources/@roots/bud-build/src/config/output/filename.ts b/sources/@roots/bud-build/src/config/output/filename.ts index 5b7f1bc435..4ec55160fb 100644 --- a/sources/@roots/bud-build/src/config/output/filename.ts +++ b/sources/@roots/bud-build/src/config/output/filename.ts @@ -1,6 +1,6 @@ import type {Bud} from '@roots/bud-framework' -import {scriptExtension} from '../../helpers/scriptExtension.js' +import scriptExtension from '@roots/bud-build/helpers/script-extension' interface Props { filter: Bud['hooks'][`filter`] diff --git a/sources/@roots/bud-build/src/config/output/index.ts b/sources/@roots/bud-build/src/config/output/index.ts index dcd2bafab1..7a976e3c3b 100644 --- a/sources/@roots/bud-build/src/config/output/index.ts +++ b/sources/@roots/bud-build/src/config/output/index.ts @@ -1,4 +1,4 @@ -import type {Factory} from '../index.js' +import type {Factory} from '@roots/bud-build/config' import {assetModuleFilename} from './assetModuleFilename.js' import {filename} from './filename.js' diff --git a/sources/@roots/bud-build/src/config/parallelism.ts b/sources/@roots/bud-build/src/config/parallelism.ts index b4184f1866..72f27e4cf8 100644 --- a/sources/@roots/bud-build/src/config/parallelism.ts +++ b/sources/@roots/bud-build/src/config/parallelism.ts @@ -1,6 +1,6 @@ import {cpus} from 'node:os' -import type {Factory} from './index.js' +import type {Factory} from '@roots/bud-build/config' export const parallelism: Factory<`parallelism`> = async ({ build, diff --git a/sources/@roots/bud-build/src/config/performance.ts b/sources/@roots/bud-build/src/config/performance.ts index 804cc35e47..57d7bbc247 100644 --- a/sources/@roots/bud-build/src/config/performance.ts +++ b/sources/@roots/bud-build/src/config/performance.ts @@ -1,4 +1,4 @@ -import type {Factory} from './index.js' +import type {Factory} from '@roots/bud-build/config' export const performance: Factory<`performance`> = async ({hooks}) => hooks.filter(`build.performance`, false) diff --git a/sources/@roots/bud-build/src/config/plugins.ts b/sources/@roots/bud-build/src/config/plugins.ts index 951814b2f3..72f4f65c59 100644 --- a/sources/@roots/bud-build/src/config/plugins.ts +++ b/sources/@roots/bud-build/src/config/plugins.ts @@ -1,4 +1,4 @@ -import type {Factory} from './index.js' +import type {Factory} from '@roots/bud-build/config' export const plugins: Factory<`plugins`> = async app => { const plugins = await app.extensions.make() diff --git a/sources/@roots/bud-build/src/config/profile.ts b/sources/@roots/bud-build/src/config/profile.ts index 9dfb5dce61..aca49f42c9 100644 --- a/sources/@roots/bud-build/src/config/profile.ts +++ b/sources/@roots/bud-build/src/config/profile.ts @@ -1,4 +1,4 @@ -import type {Factory} from './index.js' +import type {Factory} from '@roots/bud-build/config' export const profile: Factory<`profile`> = async bud => bud.hooks.filter(`build.profile`, bud.context.debug) diff --git a/sources/@roots/bud-build/src/config/recordsPath.ts b/sources/@roots/bud-build/src/config/recordsPath.ts index baaa81c70e..af6cb7a0b3 100644 --- a/sources/@roots/bud-build/src/config/recordsPath.ts +++ b/sources/@roots/bud-build/src/config/recordsPath.ts @@ -1,4 +1,4 @@ -import type {Factory} from './index.js' +import type {Factory} from '@roots/bud-build/config' export const recordsPath: Factory<`recordsPath`> = async bud => bud.hooks.filter( diff --git a/sources/@roots/bud-build/src/config/resolve.ts b/sources/@roots/bud-build/src/config/resolve.ts index 2156295ed9..aa9453ef15 100644 --- a/sources/@roots/bud-build/src/config/resolve.ts +++ b/sources/@roots/bud-build/src/config/resolve.ts @@ -1,6 +1,6 @@ import isString from '@roots/bud-support/lodash/isString' -import type {Factory} from './index.js' +import type {Factory} from '@roots/bud-build/config' export const resolve: Factory<`resolve`> = async bud => { return await bud.hooks.filterAsync(`build.resolve`, { diff --git a/sources/@roots/bud-build/src/config/resolveLoader.ts b/sources/@roots/bud-build/src/config/resolveLoader.ts index b4e505bb52..2160a779c3 100644 --- a/sources/@roots/bud-build/src/config/resolveLoader.ts +++ b/sources/@roots/bud-build/src/config/resolveLoader.ts @@ -1,4 +1,4 @@ -import type {Factory} from './index.js' +import type {Factory} from '@roots/bud-build/config' export const resolveLoader: Factory<`resolveLoader`> = async ({ hooks, diff --git a/sources/@roots/bud-build/src/config/snapshot.ts b/sources/@roots/bud-build/src/config/snapshot.ts index ccbc3a6ffc..a6012b9ded 100644 --- a/sources/@roots/bud-build/src/config/snapshot.ts +++ b/sources/@roots/bud-build/src/config/snapshot.ts @@ -1,4 +1,4 @@ -import type {Factory} from './index.js' +import type {Factory} from '@roots/bud-build/config' export const snapshot: Factory<`snapshot`> = async ({env, hooks, path}) => hooks.filter(`build.snapshot`, { diff --git a/sources/@roots/bud-build/src/config/stats.ts b/sources/@roots/bud-build/src/config/stats.ts index 50b7d8235d..0ca0a09124 100644 --- a/sources/@roots/bud-build/src/config/stats.ts +++ b/sources/@roots/bud-build/src/config/stats.ts @@ -1,4 +1,4 @@ -import type {Factory} from './index.js' +import type {Factory} from '@roots/bud-build/config' export const stats: Factory<`stats`> = async app => app.hooks.filter(`build.stats`, {preset: `none`}) diff --git a/sources/@roots/bud-build/src/config/target.ts b/sources/@roots/bud-build/src/config/target.ts index 83a080a1cf..9d8578d8f6 100644 --- a/sources/@roots/bud-build/src/config/target.ts +++ b/sources/@roots/bud-build/src/config/target.ts @@ -1,4 +1,4 @@ -import type {Factory} from './index.js' +import type {Factory} from '@roots/bud-build/config' export const target: Factory<`target`> = async ({context, hooks, root}) => hooks.filter( diff --git a/sources/@roots/bud-build/src/handlers/index.ts b/sources/@roots/bud-build/src/handlers/index.ts deleted file mode 100644 index d27f32312d..0000000000 --- a/sources/@roots/bud-build/src/handlers/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -import type {Bud} from '@roots/bud-framework' - -import type {Rule} from '../rule/index.js' - -import * as items from './items/items.js' -import * as loaders from './loaders/loaders.js' -import {register} from './register.js' -import {rules} from './rules/index.js' - -export interface Props { - filter: Bud[`hooks`][`filter`] - isProduction: Bud[`isProduction`] - makeItem: Bud[`build`][`makeItem`] - makeLoader: Bud[`build`][`makeLoader`] - makeRule: Bud[`build`][`makeRule`] - path: Bud[`path`] - resolve: Bud[`module`][`resolve`] -} - -export interface Factory { - (props: Props): Promise -} - -export {items, loaders, register, rules} diff --git a/sources/@roots/bud-build/src/handlers/rules/css.module.ts b/sources/@roots/bud-build/src/handlers/rules/css.module.ts deleted file mode 100644 index 3ae72066b8..0000000000 --- a/sources/@roots/bud-build/src/handlers/rules/css.module.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type {Factory} from '../index.js' - -export const cssModule: Factory = async ({filter, makeRule, path}) => - makeRule() - .setTest(filter(`pattern.cssModule`)) - .setInclude([() => path(`@src`)]) - .setUse([`precss`, `cssModule`]) diff --git a/sources/@roots/bud-build/src/handlers/rules/css.ts b/sources/@roots/bud-build/src/handlers/rules/css.ts deleted file mode 100644 index d83bc126c6..0000000000 --- a/sources/@roots/bud-build/src/handlers/rules/css.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type {Factory} from '../index.js' - -export const css: Factory = async ({filter, makeRule}) => - makeRule() - .setTest(filter(`pattern.css`)) - .setInclude([({path}) => path(`@src`)]) - .setUse([`precss`, `css`]) diff --git a/sources/@roots/bud-build/src/handlers/rules/csv.ts b/sources/@roots/bud-build/src/handlers/rules/csv.ts deleted file mode 100644 index 5241ac3793..0000000000 --- a/sources/@roots/bud-build/src/handlers/rules/csv.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type {Factory} from '../index.js' - -export const csv: Factory = async ({filter, makeRule, path}) => - makeRule() - .setInclude([path()]) - .setTest(() => filter(`pattern.csv`)) - .setUse([`csv`]) diff --git a/sources/@roots/bud-build/src/handlers/rules/font.inline.ts b/sources/@roots/bud-build/src/handlers/rules/font.inline.ts deleted file mode 100644 index 1c36fccef3..0000000000 --- a/sources/@roots/bud-build/src/handlers/rules/font.inline.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type {Factory} from '../index.js' - -export const inlineFont: Factory = async ({filter, makeRule, path}) => - makeRule() - .setTest(filter(`pattern.font`)) - .setInclude([() => path(`@src`)]) - .setResourceQuery(/inline/) - .setType(`asset/inline`) diff --git a/sources/@roots/bud-build/src/handlers/rules/font.ts b/sources/@roots/bud-build/src/handlers/rules/font.ts deleted file mode 100644 index 4ea203d51b..0000000000 --- a/sources/@roots/bud-build/src/handlers/rules/font.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type {Factory} from '../index.js' - -export const font: Factory = async ({filter, makeRule, path}) => - makeRule() - .setType(`asset`) - .setTest(filter(`pattern.font`)) - .setInclude([() => path(`@src`)]) diff --git a/sources/@roots/bud-build/src/handlers/rules/html.ts b/sources/@roots/bud-build/src/handlers/rules/html.ts deleted file mode 100644 index 2f9d51be04..0000000000 --- a/sources/@roots/bud-build/src/handlers/rules/html.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type {Factory} from '../index.js' - -export const html: Factory = async ({filter, makeRule, path}) => - makeRule() - .setInclude([() => path()]) - .setTest(filter(`pattern.html`)) - .setUse([`html`]) diff --git a/sources/@roots/bud-build/src/handlers/rules/image.inline.ts b/sources/@roots/bud-build/src/handlers/rules/image.inline.ts deleted file mode 100644 index 3346da875e..0000000000 --- a/sources/@roots/bud-build/src/handlers/rules/image.inline.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type {Factory} from '../index.js' - -export const inlineImage: Factory = async ({filter, makeRule, path}) => - makeRule() - .setTest(filter(`pattern.image`)) - .setInclude([() => path(`@src`)]) - .setType(`asset/inline`) - .setResourceQuery(/inline/) diff --git a/sources/@roots/bud-build/src/handlers/rules/index.ts b/sources/@roots/bud-build/src/handlers/rules/index.ts deleted file mode 100644 index c6fa3a706d..0000000000 --- a/sources/@roots/bud-build/src/handlers/rules/index.ts +++ /dev/null @@ -1,33 +0,0 @@ -import {css} from './css.js' -import {cssModule} from './css.module.js' -import {csv} from './csv.js' -import {inlineFont} from './font.inline.js' -import {font} from './font.js' -import {html} from './html.js' -import {inlineImage} from './image.inline.js' -import {image} from './image.js' -import {js} from './js.js' -import {json} from './json.js' -import {inlineSvg} from './svg.inline.js' -import {svg} from './svg.js' -import {toml} from './toml.js' -import {webp} from './webp.js' -import {yml} from './yml.js' - -export const rules = { - css, - cssModule, - csv, - font, - html, - image, - inlineFont, - inlineImage, - inlineSvg, - js, - json, - svg, - toml, - webp, - yml, -} diff --git a/sources/@roots/bud-build/src/handlers/rules/svg.ts b/sources/@roots/bud-build/src/handlers/rules/svg.ts deleted file mode 100644 index b6d09c035d..0000000000 --- a/sources/@roots/bud-build/src/handlers/rules/svg.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type {Factory} from '../index.js' - -export const svg: Factory = async ({filter, makeRule, path}) => - makeRule() - .setTest(filter(`pattern.svg`)) - .setInclude([() => path(`@src`)]) - .setType(`asset/resource`) diff --git a/sources/@roots/bud-build/src/handlers/rules/webp.ts b/sources/@roots/bud-build/src/handlers/rules/webp.ts deleted file mode 100644 index 04c04ca469..0000000000 --- a/sources/@roots/bud-build/src/handlers/rules/webp.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type {Factory} from '../index.js' - -export const webp: Factory = async ({filter, makeRule, path}) => - makeRule() - .setTest(filter(`pattern.webp`)) - .setInclude([() => path(`@src`)]) - .setType(`asset/resource`) diff --git a/sources/@roots/bud-build/src/handlers/rules/yml.ts b/sources/@roots/bud-build/src/handlers/rules/yml.ts deleted file mode 100644 index 2f34af9534..0000000000 --- a/sources/@roots/bud-build/src/handlers/rules/yml.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type {Factory} from '../index.js' - -export const yml: Factory = async ({filter, makeRule, path}) => - makeRule() - .setTest(() => filter(`pattern.yml`)) - .setInclude([() => path()]) - .setUse([`yml`]) diff --git a/sources/@roots/bud-build/src/helpers/isMjs.ts b/sources/@roots/bud-build/src/helpers/isMjs.ts index 2df10f362e..24859e581a 100644 --- a/sources/@roots/bud-build/src/helpers/isMjs.ts +++ b/sources/@roots/bud-build/src/helpers/isMjs.ts @@ -1,4 +1,6 @@ import type {Bud} from '@roots/bud-framework' -export const isMjs = (filter: Bud[`hooks`][`filter`]) => +const isMjs = (filter: Bud[`hooks`][`filter`]) => filter(`build.experiments`)?.outputModule === true + +export {isMjs as default} diff --git a/sources/@roots/bud-build/src/shared/base.ts b/sources/@roots/bud-build/src/helpers/registrable.ts similarity index 91% rename from sources/@roots/bud-build/src/shared/base.ts rename to sources/@roots/bud-build/src/helpers/registrable.ts index 738fe5a0e5..7b2a67fb52 100644 --- a/sources/@roots/bud-build/src/shared/base.ts +++ b/sources/@roots/bud-build/src/helpers/registrable.ts @@ -4,7 +4,7 @@ import type {Base as BuildBase} from '@roots/bud-framework/services/build' import {bind} from '@roots/bud-support/decorators/bind' import isFunction from '@roots/bud-support/lodash/isFunction' -export default class Base implements BuildBase { +class Registrable implements BuildBase { /** * Constructor */ @@ -34,3 +34,5 @@ export default class Base implements BuildBase { return isFunction(input) ? input : () => input } } + +export {Registrable as default} diff --git a/sources/@roots/bud-build/src/helpers/scriptExtension.ts b/sources/@roots/bud-build/src/helpers/script-extension.ts similarity index 63% rename from sources/@roots/bud-build/src/helpers/scriptExtension.ts rename to sources/@roots/bud-build/src/helpers/script-extension.ts index 26a4159edf..4de79435c7 100644 --- a/sources/@roots/bud-build/src/helpers/scriptExtension.ts +++ b/sources/@roots/bud-build/src/helpers/script-extension.ts @@ -1,11 +1,13 @@ import type {Bud} from '@roots/bud-framework' -import {isMjs} from './isMjs.js' +import isMjs from '@roots/bud-build/helpers/isMjs' -export const scriptExtension = ( +const scriptExtension = ( filter: Bud[`hooks`][`filter`], mjs: `.${string}` = `.mjs`, js: `.${string}` = `.js`, ): `.${string}` => { return isMjs(filter) ? mjs : js } + +export {scriptExtension as default} diff --git a/sources/@roots/bud-build/src/index.ts b/sources/@roots/bud-build/src/index.ts index e3b0c5e2ab..48b4d6595f 100644 --- a/sources/@roots/bud-build/src/index.ts +++ b/sources/@roots/bud-build/src/index.ts @@ -8,12 +8,61 @@ * @see https://github.com/roots/bud */ -import {Item} from '@roots/bud-build/item' -import {Loader} from '@roots/bud-build/loader' -import {Rule} from '@roots/bud-build/rule' -import {Build} from '@roots/bud-build/service' -import '@roots/bud-build/types' +import {default as Item} from '@roots/bud-build/item' +import {default as Loader} from '@roots/bud-build/loader' +import {default as Rule} from '@roots/bud-build/rule' +import {default as Build} from '@roots/bud-build/service' -export default Build +declare module '@roots/bud-framework' { + interface Services { + build: Build + } -export {Item, Loader, Rule} + interface Loaders { + css: Loader + csv: Loader + file: Loader + html: Loader + md: Loader + minicss: Loader + raw: Loader + style: Loader + url: Loader + yml: Loader + } + + interface Items { + css: Item + cssModule: Item + csv: Item + file: Item + font: Item + html: Item + image: Item + md: Item + minicss: Item + precss: Item + raw: Item + style: Item + yml: Item + } + + interface Rules { + css: Rule + cssModule: Rule + csv: Rule + font: Rule + html: Rule + image: Rule + inlineFont: Rule + inlineImage: Rule + inlineSvg: Rule + js: Rule + json: Rule + svg: Rule + toml: Rule + yml: Rule + } +} + +export {Build as default, Item, Loader, Rule} diff --git a/sources/@roots/bud-build/src/item/index.ts b/sources/@roots/bud-build/src/item/index.ts index 69a9d7cee7..529e4d8e12 100644 --- a/sources/@roots/bud-build/src/item/index.ts +++ b/sources/@roots/bud-build/src/item/index.ts @@ -1,20 +1,19 @@ import type {Bud, Loaders} from '@roots/bud-framework' import type * as Build from '@roots/bud-framework/services/build' -import {basename} from 'path' +import {basename} from 'node:path' +import Registrable from '@roots/bud-build/helpers/registrable' +import Loader from '@roots/bud-build/loader' import {bind} from '@roots/bud-support/decorators/bind' import isString from '@roots/bud-support/lodash/isString' -import {Loader} from '../loader/index.js' -import Base from '../shared/base.js' - export type ConstructorOptions = Build.Item.ConstructorOptions /** * Item class */ -class Item extends Base implements Build.Item { +class Item extends Registrable implements Build.Item { /** * Identifier */ @@ -153,4 +152,4 @@ class Item extends Base implements Build.Item { } } -export {Item} +export {Item as default} diff --git a/sources/@roots/bud-build/src/handlers/items/items.ts b/sources/@roots/bud-build/src/items/index.ts similarity index 97% rename from sources/@roots/bud-build/src/handlers/items/items.ts rename to sources/@roots/bud-build/src/items/index.ts index 28aa808bcf..034db9baf0 100644 --- a/sources/@roots/bud-build/src/handlers/items/items.ts +++ b/sources/@roots/bud-build/src/items/index.ts @@ -1,9 +1,8 @@ +import type {Factory} from '@roots/bud-build/registry' import type {Item} from '@roots/bud-framework/services/build' import isBoolean from '@roots/bud-support/lodash/isBoolean' -import type {Factory} from '../index.js' - /** * CSS loader */ diff --git a/sources/@roots/bud-build/src/loader/index.ts b/sources/@roots/bud-build/src/loader/index.ts index 223ce42c0c..2d05886e00 100644 --- a/sources/@roots/bud-build/src/loader/index.ts +++ b/sources/@roots/bud-build/src/loader/index.ts @@ -1,15 +1,16 @@ import type {Bud} from '@roots/bud-framework' -import Base from '../shared/base.js' +import Registrable from '@roots/bud-build/helpers/registrable' /** * Bud Loader */ -class Loader extends Base { +class Loader extends Registrable { /** * Factory returning the loader path */ public src: string + /** * Class constructor * @@ -17,12 +18,12 @@ class Loader extends Base { */ public constructor( public override _app: () => Bud, - src: string, + src?: string, definition?: string, ) { super(_app) this._app = _app - this.src = definition ?? src + this.src = definition ?? src ?? `` } public getSrc(): string { @@ -35,4 +36,4 @@ class Loader extends Base { } } -export {Loader} +export {Loader as default} diff --git a/sources/@roots/bud-build/src/handlers/loaders/loaders.ts b/sources/@roots/bud-build/src/loaders/index.ts similarity index 96% rename from sources/@roots/bud-build/src/handlers/loaders/loaders.ts rename to sources/@roots/bud-build/src/loaders/index.ts index b7b19fd7fe..169645b296 100644 --- a/sources/@roots/bud-build/src/handlers/loaders/loaders.ts +++ b/sources/@roots/bud-build/src/loaders/index.ts @@ -1,9 +1,8 @@ +import type {Factory} from '@roots/bud-build/registry' import type {Loader} from '@roots/bud-framework/services/build' import * as MiniCss from '@roots/bud-support/mini-css-extract-plugin' -import type {Factory} from '../index.js' - export const css: Factory = async ({makeLoader, resolve}) => makeLoader( await resolve(`@roots/bud-support/css-loader`, import.meta.url), diff --git a/sources/@roots/bud-build/src/handlers/register.ts b/sources/@roots/bud-build/src/registry/index.ts similarity index 61% rename from sources/@roots/bud-build/src/handlers/register.ts rename to sources/@roots/bud-build/src/registry/index.ts index a2ac8dec09..eddacb16ec 100644 --- a/sources/@roots/bud-build/src/handlers/register.ts +++ b/sources/@roots/bud-build/src/registry/index.ts @@ -1,28 +1,28 @@ +import type Rule from '@roots/bud-build/rule' import type {Bud} from '@roots/bud-framework' -import type {Factory} from './index.js' +import * as items from '@roots/bud-build/items' +import * as loaders from '@roots/bud-build/loaders' +import * as rules from '@roots/bud-build/rules' -import * as items from './items/items.js' -import * as loaders from './loaders/loaders.js' -import {rules} from './rules/index.js' +interface Props { + filter: Bud[`hooks`][`filter`] + isProduction: Bud[`isProduction`] + makeItem: Bud[`build`][`makeItem`] + makeLoader: Bud[`build`][`makeLoader`] + makeRule: Bud[`build`][`makeRule`] + path: Bud[`path`] + resolve: Bud[`module`][`resolve`] +} -/** - * Registry factory curry function - */ -export interface makeRegister { - ( - props: Partial, - setRule: F, - ): ([key, factory]: [ - K, - Factory, - ]) => void +interface Factory { + (props: Props): Promise } /** * Register built-in {@link loaders}, {@link items} and {@link rules} */ -export async function register(bud: Bud) { +async function register(bud: Bud) { await Promise.all([ ...Object.entries(loaders).map(makeRegister(bud, bud.build.setLoader)), ...Object.entries(items).map(makeRegister(bud, bud.build.setItem)), @@ -38,7 +38,23 @@ export async function register(bud: Bud) { Object.entries(rules).map(makeRegister(bud, bud.build.setRule)) } -export const makeRegister: makeRegister = +/** + * Registry factory curry function + */ +interface makeRegister { + ( + props: Partial, + setRule: F, + ): ([key, factory]: [ + K, + Factory, + ]) => void +} + +/** + * Registry factory + */ +const makeRegister: makeRegister = ({build, hooks, isProduction, module: {resolve}, path}, setRule) => async ([key, factory]) => setRule( @@ -53,3 +69,7 @@ export const makeRegister: makeRegister = resolve, }), ) + + +export {items, loaders, makeRegister, register, rules} +export type {Factory, Props} diff --git a/sources/@roots/bud-build/src/rule/index.ts b/sources/@roots/bud-build/src/rule/index.ts index 72596e48da..4918d362fd 100644 --- a/sources/@roots/bud-build/src/rule/index.ts +++ b/sources/@roots/bud-build/src/rule/index.ts @@ -7,16 +7,15 @@ import type { Parser, } from '@roots/bud-framework/services/build/rule' +import Registrable from '@roots/bud-build/helpers/registrable' import {bind} from '@roots/bud-support/decorators/bind' import isFunction from '@roots/bud-support/lodash/isFunction' import isString from '@roots/bud-support/lodash/isString' -import Base from '../shared/base.js' - /** * RuleSetRule */ -class Rule extends Base implements Interface { +class Rule extends Registrable implements Interface { /** * RuleSetRule exclude */ @@ -280,5 +279,5 @@ class Rule extends Base implements Interface { } } -export {Rule} +export {Rule as default} export type {Interface, Options, Output, Parser} diff --git a/sources/@roots/bud-build/src/rules/css.module.ts b/sources/@roots/bud-build/src/rules/css.module.ts new file mode 100644 index 0000000000..a44bc8adb6 --- /dev/null +++ b/sources/@roots/bud-build/src/rules/css.module.ts @@ -0,0 +1,9 @@ +import type {Factory} from '@roots/bud-build/registry' + +const cssModule: Factory = async ({filter, makeRule, path}) => + makeRule() + .setTest(filter(`pattern.cssModule`)) + .setInclude([() => path(`@src`)]) + .setUse([`precss`, `cssModule`]) + +export {cssModule as default} diff --git a/sources/@roots/bud-build/src/rules/css.ts b/sources/@roots/bud-build/src/rules/css.ts new file mode 100644 index 0000000000..5eb4a82a80 --- /dev/null +++ b/sources/@roots/bud-build/src/rules/css.ts @@ -0,0 +1,9 @@ +import type {Factory} from '@roots/bud-build/registry' + +const css: Factory = async ({filter, makeRule}) => + makeRule() + .setTest(filter(`pattern.css`)) + .setInclude([({path}) => path(`@src`)]) + .setUse([`precss`, `css`]) + +export {css as default} diff --git a/sources/@roots/bud-build/src/rules/csv.ts b/sources/@roots/bud-build/src/rules/csv.ts new file mode 100644 index 0000000000..386f94d4af --- /dev/null +++ b/sources/@roots/bud-build/src/rules/csv.ts @@ -0,0 +1,9 @@ +import type {Factory} from '@roots/bud-build/registry' + +const csv: Factory = async ({filter, makeRule, path}) => + makeRule() + .setInclude([path()]) + .setTest(() => filter(`pattern.csv`)) + .setUse([`csv`]) + +export {csv as default} diff --git a/sources/@roots/bud-build/src/rules/font.inline.ts b/sources/@roots/bud-build/src/rules/font.inline.ts new file mode 100644 index 0000000000..7bebbec4ef --- /dev/null +++ b/sources/@roots/bud-build/src/rules/font.inline.ts @@ -0,0 +1,10 @@ +import type {Factory} from '@roots/bud-build/registry' + +const inlineFont: Factory = async ({filter, makeRule, path}) => + makeRule() + .setTest(filter(`pattern.font`)) + .setInclude([() => path(`@src`)]) + .setResourceQuery(/inline/) + .setType(`asset/inline`) + +export {inlineFont as default} diff --git a/sources/@roots/bud-build/src/rules/font.ts b/sources/@roots/bud-build/src/rules/font.ts new file mode 100644 index 0000000000..98ce896990 --- /dev/null +++ b/sources/@roots/bud-build/src/rules/font.ts @@ -0,0 +1,9 @@ +import type {Factory} from '@roots/bud-build/registry' + +const font: Factory = async ({filter, makeRule, path}) => + makeRule() + .setType(`asset`) + .setTest(filter(`pattern.font`)) + .setInclude([() => path(`@src`)]) + +export {font as default} diff --git a/sources/@roots/bud-build/src/rules/html.ts b/sources/@roots/bud-build/src/rules/html.ts new file mode 100644 index 0000000000..fabacafd94 --- /dev/null +++ b/sources/@roots/bud-build/src/rules/html.ts @@ -0,0 +1,9 @@ +import type {Factory} from '@roots/bud-build/registry' + +const html: Factory = async ({filter, makeRule, path}) => + makeRule() + .setInclude([() => path()]) + .setTest(filter(`pattern.html`)) + .setUse([`html`]) + +export {html as default} diff --git a/sources/@roots/bud-build/src/rules/image.inline.ts b/sources/@roots/bud-build/src/rules/image.inline.ts new file mode 100644 index 0000000000..0d0b1cc5b8 --- /dev/null +++ b/sources/@roots/bud-build/src/rules/image.inline.ts @@ -0,0 +1,10 @@ +import type {Factory} from '@roots/bud-build/registry' + +const inlineImage: Factory = async ({filter, makeRule, path}) => + makeRule() + .setTest(filter(`pattern.image`)) + .setInclude([() => path(`@src`)]) + .setType(`asset/inline`) + .setResourceQuery(/inline/) + +export {inlineImage as default} diff --git a/sources/@roots/bud-build/src/handlers/rules/image.ts b/sources/@roots/bud-build/src/rules/image.ts similarity index 59% rename from sources/@roots/bud-build/src/handlers/rules/image.ts rename to sources/@roots/bud-build/src/rules/image.ts index 1ad2cdf0bb..b4e871c6c9 100644 --- a/sources/@roots/bud-build/src/handlers/rules/image.ts +++ b/sources/@roots/bud-build/src/rules/image.ts @@ -1,6 +1,6 @@ -import type {Factory} from '../index.js' +import type {Factory} from '@roots/bud-build/registry' -export const image: Factory = async ({filter, makeRule, path}) => +const image: Factory = async ({filter, makeRule, path}) => makeRule() .setTest(filter(`pattern.image`)) .setInclude([() => path(`@src`)]) @@ -8,3 +8,5 @@ export const image: Factory = async ({filter, makeRule, path}) => .setGenerator({ filename: `[path][name].[contenthash][ext][query]`, }) + +export {image as default} diff --git a/sources/@roots/bud-build/src/rules/index.ts b/sources/@roots/bud-build/src/rules/index.ts new file mode 100644 index 0000000000..1f7e740a6b --- /dev/null +++ b/sources/@roots/bud-build/src/rules/index.ts @@ -0,0 +1,15 @@ +export {default as css} from '@roots/bud-build/rules/css' +export {default as cssModule} from '@roots/bud-build/rules/css.module' +export {default as csv} from '@roots/bud-build/rules/csv' +export {default as font} from '@roots/bud-build/rules/font' +export {default as inlineFont} from '@roots/bud-build/rules/font.inline' +export {default as html} from '@roots/bud-build/rules/html' +export {default as image} from '@roots/bud-build/rules/image' +export {default as inlineImage} from '@roots/bud-build/rules/image.inline' +export {default as js} from '@roots/bud-build/rules/js' +export {default as json} from '@roots/bud-build/rules/json' +export {default as svg} from '@roots/bud-build/rules/svg' +export {default as inlineSvg} from '@roots/bud-build/rules/svg.inline' +export {default as toml} from '@roots/bud-build/rules/toml' +export {default as webp} from '@roots/bud-build/rules/webp' +export {default as yml} from '@roots/bud-build/rules/yml' diff --git a/sources/@roots/bud-build/src/handlers/rules/js.ts b/sources/@roots/bud-build/src/rules/js.ts similarity index 51% rename from sources/@roots/bud-build/src/handlers/rules/js.ts rename to sources/@roots/bud-build/src/rules/js.ts index 53820d890c..65980c7c25 100644 --- a/sources/@roots/bud-build/src/handlers/rules/js.ts +++ b/sources/@roots/bud-build/src/rules/js.ts @@ -1,9 +1,11 @@ -import type {Factory} from '../index.js' +import type {Factory} from '@roots/bud-build/registry' -export const js: Factory = async ({filter, makeRule, path}) => +const js: Factory = async ({filter, makeRule, path}) => makeRule() .setTest(filter(`pattern.js`)) .setInclude([() => path(`@src`)]) .setResolve({ fullySpecified: false, }) + +export {js as default} diff --git a/sources/@roots/bud-build/src/handlers/rules/json.ts b/sources/@roots/bud-build/src/rules/json.ts similarity index 59% rename from sources/@roots/bud-build/src/handlers/rules/json.ts rename to sources/@roots/bud-build/src/rules/json.ts index e330f569e9..4e2696c62a 100644 --- a/sources/@roots/bud-build/src/handlers/rules/json.ts +++ b/sources/@roots/bud-build/src/rules/json.ts @@ -1,8 +1,8 @@ -import json5 from '@roots/bud-support/json5' +import type {Factory} from '@roots/bud-build/registry' -import type {Factory} from '../index.js' +import json5 from '@roots/bud-support/json5' -export const json: Factory = async ({filter, makeRule, path}) => +const json: Factory = async ({filter, makeRule, path}) => makeRule() .setType(`json`) .setInclude([() => path()]) @@ -10,3 +10,5 @@ export const json: Factory = async ({filter, makeRule, path}) => .setParser({ parse: json5.parse, }) + +export {json as default} diff --git a/sources/@roots/bud-build/src/handlers/rules/svg.inline.ts b/sources/@roots/bud-build/src/rules/svg.inline.ts similarity index 52% rename from sources/@roots/bud-build/src/handlers/rules/svg.inline.ts rename to sources/@roots/bud-build/src/rules/svg.inline.ts index 4aecdf2f7e..6a589d3a9f 100644 --- a/sources/@roots/bud-build/src/handlers/rules/svg.inline.ts +++ b/sources/@roots/bud-build/src/rules/svg.inline.ts @@ -1,8 +1,8 @@ -import dataUri from '@roots/bud-support/mini-svg-data-uri' +import type {Factory} from '@roots/bud-build/registry' -import type {Factory} from '../index.js' +import dataUri from '@roots/bud-support/mini-svg-data-uri' -export const inlineSvg: Factory = async ({filter, makeRule, path}) => +const inlineSvg: Factory = async ({filter, makeRule, path}) => makeRule() .setTest(filter(`pattern.svg`)) .setInclude([() => path(`@src`)]) @@ -10,4 +10,6 @@ export const inlineSvg: Factory = async ({filter, makeRule, path}) => .setGenerator({dataUrl}) .setType(`asset/inline`) -export const dataUrl = (data: Buffer) => dataUri(data.toString()) +const dataUrl = (data: Buffer) => dataUri(data.toString()) + +export {dataUrl, inlineSvg as default} diff --git a/sources/@roots/bud-build/src/rules/svg.ts b/sources/@roots/bud-build/src/rules/svg.ts new file mode 100644 index 0000000000..e7757e8ca3 --- /dev/null +++ b/sources/@roots/bud-build/src/rules/svg.ts @@ -0,0 +1,9 @@ +import type {Factory} from '@roots/bud-build/registry' + +const svg: Factory = async ({filter, makeRule, path}) => + makeRule() + .setTest(filter(`pattern.svg`)) + .setInclude([() => path(`@src`)]) + .setType(`asset/resource`) + +export {svg as default} diff --git a/sources/@roots/bud-build/src/handlers/rules/toml.ts b/sources/@roots/bud-build/src/rules/toml.ts similarity index 61% rename from sources/@roots/bud-build/src/handlers/rules/toml.ts rename to sources/@roots/bud-build/src/rules/toml.ts index afc7d2929a..6116a0fd15 100644 --- a/sources/@roots/bud-build/src/handlers/rules/toml.ts +++ b/sources/@roots/bud-build/src/rules/toml.ts @@ -1,8 +1,8 @@ -import tomlParser from '@roots/bud-support/toml' +import type {Factory} from '@roots/bud-build/registry' -import type {Factory} from '../index.js' +import tomlParser from '@roots/bud-support/toml' -export const toml: Factory = async ({filter, makeRule, path}) => +const toml: Factory = async ({filter, makeRule, path}) => makeRule() .setType(`json`) .setInclude([() => path()]) @@ -10,3 +10,5 @@ export const toml: Factory = async ({filter, makeRule, path}) => .setParser({ parse: tomlParser.parse, }) + +export {toml as default} diff --git a/sources/@roots/bud-build/src/rules/webp.ts b/sources/@roots/bud-build/src/rules/webp.ts new file mode 100644 index 0000000000..c36c851a35 --- /dev/null +++ b/sources/@roots/bud-build/src/rules/webp.ts @@ -0,0 +1,9 @@ +import type {Factory} from '@roots/bud-build/registry' + +const webp: Factory = async ({filter, makeRule, path}) => + makeRule() + .setTest(filter(`pattern.webp`)) + .setInclude([() => path(`@src`)]) + .setType(`asset/resource`) + +export {webp as default} diff --git a/sources/@roots/bud-build/src/rules/yml.ts b/sources/@roots/bud-build/src/rules/yml.ts new file mode 100644 index 0000000000..41d0421306 --- /dev/null +++ b/sources/@roots/bud-build/src/rules/yml.ts @@ -0,0 +1,9 @@ +import type {Factory} from '@roots/bud-build/registry' + +const yml: Factory = async ({filter, makeRule, path}) => + makeRule() + .setTest(() => filter(`pattern.yml`)) + .setInclude([() => path()]) + .setUse([`yml`]) + +export {yml as default} diff --git a/sources/@roots/bud-build/src/service.ts b/sources/@roots/bud-build/src/service/index.ts similarity index 84% rename from sources/@roots/bud-build/src/service.ts rename to sources/@roots/bud-build/src/service/index.ts index 9e0e6b2e07..f233b9dfe4 100644 --- a/sources/@roots/bud-build/src/service.ts +++ b/sources/@roots/bud-build/src/service/index.ts @@ -1,13 +1,12 @@ import type {Records} from '@roots/bud-build/config' -import type {Options as RuleOptions} from '@roots/bud-build/rule' import type {Bud, Build as BudBuild} from '@roots/bud-framework' import type {Items, Loaders, Rules} from '@roots/bud-framework' import type {Configuration} from '@roots/bud-framework/config' -import {register} from '@roots/bud-build/handlers' -import {Item} from '@roots/bud-build/item' -import {Loader} from '@roots/bud-build/loader' -import {Rule} from '@roots/bud-build/rule' +import Item from '@roots/bud-build/item' +import Loader from '@roots/bud-build/loader' +import {register} from '@roots/bud-build/registry' +import Rule, {type Options as RuleOptions} from '@roots/bud-build/rule' import {Service} from '@roots/bud-framework/service' import {bind} from '@roots/bud-support/decorators/bind' import isFunction from '@roots/bud-support/lodash/isFunction' @@ -16,7 +15,7 @@ import isUndefined from '@roots/bud-support/lodash/isUndefined' /** * {@link BudBuild} */ -export class Build extends Service implements BudBuild { +class Build extends Service implements BudBuild { /** * {@link BudBuild.config} */ @@ -93,7 +92,7 @@ export class Build extends Service implements BudBuild { this.logger.log(`bud.build.make called`) await this.app.hooks.fire(`build.before`, this.app) - await import(`./config/index.js`).then( + await import(`@roots/bud-build/config`).then( async (records: Records) => await Promise.all( Object.entries(records).map(async ([prop, factory]) => { @@ -147,11 +146,11 @@ export class Build extends Service implements BudBuild { @bind public setItem( ident: K, - options?: ((item: Items[K]) => Items[K]) | Items[K]['options'], + definition?: ((item: Items[K]) => Items[K]) | Items[K], ): this { - const maybeOptionsCallback = isUndefined(options) + const maybeOptionsCallback = isUndefined(definition) ? {ident, loader: ident} - : options + : definition const item = isFunction(maybeOptionsCallback) ? maybeOptionsCallback(this.makeItem()) @@ -189,15 +188,20 @@ export class Build extends Service implements BudBuild { @bind public setRule( name: K, - input?: Rule | RuleOptions, + definition?: Rule | RuleOptions, ): this { - this.rules[name] = - input instanceof Rule - ? input - : isFunction(input) - ? input(this.makeRule()) - : this.makeRule(input as any) + const rule = + definition instanceof Rule + ? definition + : isFunction(definition) + ? definition(this.makeRule()) + : this.makeRule(definition as any) + + this.rules[name] = rule + this.logger.info(`set rule`, rule) return this } } + +export {Build as default} diff --git a/sources/@roots/bud-build/src/types.ts b/sources/@roots/bud-build/src/types.ts deleted file mode 100644 index 83b36e3cf5..0000000000 --- a/sources/@roots/bud-build/src/types.ts +++ /dev/null @@ -1,56 +0,0 @@ -import type {Item} from '@roots/bud-build/item' -import type {Loader} from '@roots/bud-build/loader' -import type {Rule} from '@roots/bud-build/rule' -import type {Build} from '@roots/bud-build/service' - -declare module '@roots/bud-framework' { - interface Services { - build: Build - } - - interface Loaders { - css: Loader - csv: Loader - file: Loader - html: Loader - md: Loader - minicss: Loader - raw: Loader - style: Loader - url: Loader - yml: Loader - } - - interface Items { - css: Item - cssModule: Item - csv: Item - file: Item - font: Item - html: Item - image: Item - md: Item - minicss: Item - precss: Item - raw: Item - style: Item - yml: Item - } - - interface Rules { - css: Rule - cssModule: Rule - csv: Rule - font: Rule - html: Rule - image: Rule - inlineFont: Rule - inlineImage: Rule - inlineSvg: Rule - js: Rule - json: Rule - svg: Rule - toml: Rule - yml: Rule - } -} diff --git a/sources/@roots/bud-build/src/config/index.test.ts b/sources/@roots/bud-build/test/config.test.ts similarity index 95% rename from sources/@roots/bud-build/src/config/index.test.ts rename to sources/@roots/bud-build/test/config.test.ts index 36ff2167e7..974694cc41 100644 --- a/sources/@roots/bud-build/src/config/index.test.ts +++ b/sources/@roots/bud-build/test/config.test.ts @@ -1,8 +1,7 @@ -import {Bud, factory} from '@repo/test-kit' +import {type Bud, factory} from '@repo/test-kit' +import Build from '@roots/bud-build' import {beforeEach, describe, expect, it} from 'vitest' -import {Build} from '../service.js' - describe(`bud.build.config`, function () { let bud: Bud let build: Build @@ -10,7 +9,7 @@ describe(`bud.build.config`, function () { beforeEach(async () => { bud = await factory({cache: `filesystem`}) build = new Build(() => bud) - await build.register(bud) + await build.register?.(bud) await build.make() }) @@ -105,7 +104,7 @@ describe(`bud.build.config`, function () { it(`should have expected plugins`, async () => { const plugins = build.config.plugins - ?.map(plugin => plugin.constructor.name) + ?.map(plugin => plugin?.constructor.name) .sort() expect(plugins).toContain(`CleanWebpackPlugin`) diff --git a/sources/@roots/bud-build/src/handlers/rules/csv.test.ts b/sources/@roots/bud-build/test/csv.test.ts similarity index 92% rename from sources/@roots/bud-build/src/handlers/rules/csv.test.ts rename to sources/@roots/bud-build/test/csv.test.ts index 62b77d6558..bd199cb2dc 100644 --- a/sources/@roots/bud-build/src/handlers/rules/csv.test.ts +++ b/sources/@roots/bud-build/test/csv.test.ts @@ -1,8 +1,7 @@ import {factory} from '@repo/test-kit' +import {default as csv} from '@roots/bud-build/rules/csv' import {describe, expect, it} from 'vitest' -import {csv} from './csv.js' - describe(`csv loader`, () => { it(`should return a rule`, async () => { const bud = await factory() diff --git a/sources/@roots/bud-build/src/rule/index.test.ts b/sources/@roots/bud-build/test/rule.test.ts similarity index 94% rename from sources/@roots/bud-build/src/rule/index.test.ts rename to sources/@roots/bud-build/test/rule.test.ts index 67765884ad..9dc66e464a 100644 --- a/sources/@roots/bud-build/src/rule/index.test.ts +++ b/sources/@roots/bud-build/test/rule.test.ts @@ -1,10 +1,9 @@ -import {factory} from '@repo/test-kit' +import {type Bud, factory} from '@repo/test-kit' +import Rule from '@roots/bud-build/rule' import {beforeAll, describe, expect, it} from 'vitest' -import {Rule} from './index.js' - describe(`Build Rule`, function () { - let bud + let bud: Bud beforeAll(async () => { bud = await factory() diff --git a/sources/@roots/bud-build/src/handlers/rules/svg.inline.test.ts b/sources/@roots/bud-build/test/svg.inline.test.ts similarity index 91% rename from sources/@roots/bud-build/src/handlers/rules/svg.inline.test.ts rename to sources/@roots/bud-build/test/svg.inline.test.ts index 9b882d32ad..fdf4dd8413 100644 --- a/sources/@roots/bud-build/src/handlers/rules/svg.inline.test.ts +++ b/sources/@roots/bud-build/test/svg.inline.test.ts @@ -1,7 +1,6 @@ +import {dataUrl, default as inlineSvg} from '@roots/bud-build/rules/svg.inline' import {describe, expect, it} from 'vitest' -import {dataUrl, inlineSvg} from './svg.inline.js' - describe(`svg-inline`, () => { it(`should return a rule`, async () => { const bud = await import(`@repo/test-kit`).then( diff --git a/sources/@roots/bud-build/src/handlers/rules/toml.test.ts b/sources/@roots/bud-build/test/toml.test.ts similarity index 82% rename from sources/@roots/bud-build/src/handlers/rules/toml.test.ts rename to sources/@roots/bud-build/test/toml.test.ts index c975be745b..222e2d895a 100644 --- a/sources/@roots/bud-build/src/handlers/rules/toml.test.ts +++ b/sources/@roots/bud-build/test/toml.test.ts @@ -1,10 +1,9 @@ -import {factory} from '@repo/test-kit' +import {type Bud, factory} from '@repo/test-kit' +import toml from '@roots/bud-build/rules/toml' import {describe, expect, it} from 'vitest' -import {toml} from './toml' - describe(`toml loader`, () => { - let bud + let bud: Bud it(`should return a rule`, async () => { bud = await factory() diff --git a/sources/@roots/bud-build/tsconfig.json b/sources/@roots/bud-build/tsconfig.json index fd5274aac7..5f9897b647 100644 --- a/sources/@roots/bud-build/tsconfig.json +++ b/sources/@roots/bud-build/tsconfig.json @@ -3,13 +3,11 @@ "compilerOptions": { "rootDir": "./src", "outDir": "./lib", - "types": ["node", "@roots/bud-framework", "@roots/bud-hooks"] + "types": ["node", "@roots/bud-framework", "@roots/bud-hooks"], }, "include": ["./src"], - "exclude": ["**/*.test.ts"], "references": [ {"path": "./../bud-framework/tsconfig.json"}, {"path": "./../bud-hooks/tsconfig.json"}, - {"path": "./../bud-support/tsconfig.json"} ] } diff --git a/sources/@roots/bud-compiler/package.json b/sources/@roots/bud-compiler/package.json index fe66094321..8956c2b529 100644 --- a/sources/@roots/bud-compiler/package.json +++ b/sources/@roots/bud-compiler/package.json @@ -49,12 +49,16 @@ ], "type": "module", "exports": { - ".": "./lib/index.js" + ".": "./lib/index.js", + "./service": "./lib/service/index.js" }, "typesVersions": { "*": { ".": [ "./lib/index.d.ts" + ], + "service": [ + "./lib/service/index.d.ts" ] } }, diff --git a/sources/@roots/bud-compiler/src/index.ts b/sources/@roots/bud-compiler/src/index.ts index 149e783d72..fc827493f6 100644 --- a/sources/@roots/bud-compiler/src/index.ts +++ b/sources/@roots/bud-compiler/src/index.ts @@ -8,7 +8,7 @@ * @see https://github.com/roots/bud */ -import {Compiler} from './service.js' +import {default as Compiler} from '@roots/bud-compiler/service' declare module '@roots/bud-framework' { interface Services { diff --git a/sources/@roots/bud-compiler/src/service.tsx b/sources/@roots/bud-compiler/src/service/index.tsx similarity index 99% rename from sources/@roots/bud-compiler/src/service.tsx rename to sources/@roots/bud-compiler/src/service/index.tsx index 9a7bf714f5..9c482a6434 100644 --- a/sources/@roots/bud-compiler/src/service.tsx +++ b/sources/@roots/bud-compiler/src/service/index.tsx @@ -30,7 +30,7 @@ import stripAnsi from '@roots/bud-support/strip-ansi' /** * {@link BudCompiler} implementation */ -export class Compiler extends Service implements BudCompiler { +class Compiler extends Service implements BudCompiler { /** * {@link BudCompiler.compilationStats} */ @@ -309,3 +309,5 @@ const statsOptions = { }, name: true, } + +export {Compiler as default} diff --git a/sources/@roots/bud-compiler/test/compiler.test.ts b/sources/@roots/bud-compiler/test/compiler.test.ts index 6e415d896f..8af9edc0c2 100644 --- a/sources/@roots/bud-compiler/test/compiler.test.ts +++ b/sources/@roots/bud-compiler/test/compiler.test.ts @@ -1,10 +1,8 @@ -import {path} from '@repo/constants' import {Bud, factory} from '@repo/test-kit' +import Compiler from '@roots/bud-compiler' import webpack from '@roots/bud-support/webpack' import {beforeAll, describe, expect, it, vi} from 'vitest' -import Compiler from '../src/index.js' - describe(`@roots/bud-compiler`, function () { let bud: Bud let compiler: Compiler diff --git a/sources/@roots/bud-compiler/tsconfig.json b/sources/@roots/bud-compiler/tsconfig.json index d0668b1c92..d5be130f62 100644 --- a/sources/@roots/bud-compiler/tsconfig.json +++ b/sources/@roots/bud-compiler/tsconfig.json @@ -3,6 +3,10 @@ "compilerOptions": { "rootDir": "src", "outDir": "lib", + "paths": { + "@roots/bud-compiler": ["./src/index.ts"], + "@roots/bud-compiler/service": ["./src/service/index.tsx"] + }, "strict": true, }, "include": [ diff --git a/sources/@roots/bud-extensions/package.json b/sources/@roots/bud-extensions/package.json index d31f870f3b..e646c68275 100644 --- a/sources/@roots/bud-extensions/package.json +++ b/sources/@roots/bud-extensions/package.json @@ -51,7 +51,7 @@ "type": "module", "exports": { ".": "./lib/index.js", - "./service": "./lib/service.js", + "./service": "./lib/service/index.js", "./cdn": "./lib/cdn/index.js", "./clean-webpack-plugin": "./lib/clean-webpack-plugin/index.js", "./copy-webpack-plugin": "./lib/copy-webpack-plugin/index.js", @@ -78,7 +78,7 @@ "./lib/index.d.ts" ], "service": [ - "./lib/service.d.ts" + "./lib/service/index.d.ts" ], "cdn": [ "./lib/cdn/index.d.ts" diff --git a/sources/@roots/bud-extensions/src/index.ts b/sources/@roots/bud-extensions/src/index.ts index 0b07dbd351..ce9b035b52 100644 --- a/sources/@roots/bud-extensions/src/index.ts +++ b/sources/@roots/bud-extensions/src/index.ts @@ -24,7 +24,7 @@ import type BudWebpackLifecyclePlugin from '@roots/bud-extensions/webpack-lifecy import type WebpackManifestPlugin from '@roots/bud-extensions/webpack-manifest-plugin' import type WebpackProvidePlugin from '@roots/bud-extensions/webpack-provide-plugin' -import {Extensions} from '@roots/bud-extensions/service' +import {default as Service} from '@roots/bud-extensions/service' declare module '@roots/bud-framework' { interface Bud { @@ -53,8 +53,8 @@ declare module '@roots/bud-framework' { } interface Services { - extensions: Extensions + extensions: Service } } -export default Extensions +export {Service as default} diff --git a/sources/@roots/bud-extensions/src/service.ts b/sources/@roots/bud-extensions/src/service/index.ts similarity index 99% rename from sources/@roots/bud-extensions/src/service.ts rename to sources/@roots/bud-extensions/src/service/index.ts index 66b9aba477..e22234c8af 100644 --- a/sources/@roots/bud-extensions/src/service.ts +++ b/sources/@roots/bud-extensions/src/service/index.ts @@ -20,7 +20,7 @@ import Container from '@roots/container' /** * Extensions Service */ -export class Extensions extends Service implements BudExtensions { +class Extensions extends Service implements BudExtensions { /** * {@link Service.label} */ @@ -485,3 +485,5 @@ export class Extensions extends Service implements BudExtensions { return this } } + +export {Extensions as default} diff --git a/sources/@roots/bud-extensions/test/service/index.test.ts b/sources/@roots/bud-extensions/test/service/index.test.ts index 589931391e..97438cc374 100644 --- a/sources/@roots/bud-extensions/test/service/index.test.ts +++ b/sources/@roots/bud-extensions/test/service/index.test.ts @@ -1,9 +1,9 @@ -import {Bud, factory} from '@repo/test-kit' import type {Modules} from '@roots/bud-framework' import type {ApplyPlugin} from '@roots/bud-framework/extension' -import {beforeEach, describe, expect, it, vi} from 'vitest' -import {Extensions} from '@roots/bud-extensions/service' +import {Bud, factory} from '@repo/test-kit' +import Extensions from '@roots/bud-extensions/service' +import {beforeEach, describe, expect, it, vi} from 'vitest' describe(`@roots/bud-extensions`, () => { let bud: Bud @@ -26,11 +26,11 @@ describe(`@roots/bud-extensions`, () => { const mockWebpackPlugin: ApplyPlugin = {apply: vi.fn()} const mockModule: any = { - label: `mock_extension`, - register: vi.fn(async () => null), boot: vi.fn(async () => null), - options: options, + label: `mock_extension`, make: vi.fn(async () => mockWebpackPlugin), + options: options, + register: vi.fn(async () => null), when: vi.fn(async () => true), } diff --git a/sources/@roots/bud-extensions/tsconfig.json b/sources/@roots/bud-extensions/tsconfig.json index 434d46fdc4..61f58c7f99 100644 --- a/sources/@roots/bud-extensions/tsconfig.json +++ b/sources/@roots/bud-extensions/tsconfig.json @@ -5,7 +5,7 @@ "outDir": "./lib", "paths": { "@roots/bud-extensions": ["./src/index.ts"], - "@roots/bud-extensions/service": ["./src/service.ts"], + "@roots/bud-extensions/service": ["./src/service/index.ts"], "@roots/bud-extensions/*": ["./src/*/index.ts"] }, "types": ["node", "@roots/bud-framework", "@roots/bud-minify"] diff --git a/sources/@roots/bud-framework/src/services/build/rule.ts b/sources/@roots/bud-framework/src/services/build/rule.ts index e8d484c51b..f46d8acb00 100644 --- a/sources/@roots/bud-framework/src/services/build/rule.ts +++ b/sources/@roots/bud-framework/src/services/build/rule.ts @@ -14,21 +14,13 @@ export interface Parser extends Record {} */ export interface Options { exclude?: Array<((app: Bud) => RegExp | string) | RegExp | string> - generator?: ((app: Bud) => Output[`generator`]) | Output[`generator`] - include?: Array<((app: Bud) => RegExp | string) | RegExp | string> - parser?: ((app: Bud) => Output[`parser`]) | Output[`parser`] - resolve?: ((app: Bud) => Output[`resolve`]) | Output[`resolve`] - resourceQuery?: Output[`resourceQuery`] - test?: ((app: Bud) => Output[`test`]) | Output[`test`] - type?: ((app: Bud) => Output[`type`]) | Output[`type`] - use?: Array<`${keyof Items & string}` | Item | undefined> } diff --git a/sources/@roots/bud-mdx/package.json b/sources/@roots/bud-mdx/package.json index a6e0e86a51..639af46dbe 100644 --- a/sources/@roots/bud-mdx/package.json +++ b/sources/@roots/bud-mdx/package.json @@ -49,19 +49,25 @@ ], "type": "module", "exports": { - ".": { - "import": "./lib/index.js", - "default": "./lib/index.js" - }, - "./types": { - "import": "./lib/types.js", - "default": "./lib/types.js" + ".": "./lib/index.js", + "./extension": "./lib/extension.js" + }, + "typesVersions": { + "*": { + ".": [ + "lib/index.d.ts" + ], + "extension": [ + "lib/extension.d.ts" + ] } }, "types": "./lib/index.d.ts", "module": "./lib/index.js", "devDependencies": { - "@roots/bud-build": "workspace:*", + "@roots/bud-esbuild": "workspace:*", + "@roots/bud-swc": "workspace:*", + "@roots/bud-typescript": "workspace:*", "@skypack/package-check": "0.2.2", "@types/node": "18.16.19", "@types/react": "18.2.15", @@ -72,7 +78,7 @@ "dependencies": { "@mdx-js/loader": "2.3.0", "@roots/bud": "workspace:*", - "@roots/bud-babel": "workspace:*", + "@roots/bud-build": "workspace:*", "@roots/bud-framework": "workspace:*", "@roots/bud-react": "workspace:*", "tslib": "2.6.0", diff --git a/sources/@roots/bud-mdx/src/extension.ts b/sources/@roots/bud-mdx/src/extension.ts index b7cc5620e2..4cc360999a 100644 --- a/sources/@roots/bud-mdx/src/extension.ts +++ b/sources/@roots/bud-mdx/src/extension.ts @@ -27,7 +27,7 @@ interface Options { rehypePlugins: {}, remarkPlugins: {}, }) -export class BudMDX extends Extension { +class BudMDX extends Extension { /** * Get rehype plugins */ @@ -78,7 +78,7 @@ export class BudMDX extends Extension { const loader = await this.resolve(`@mdx-js/loader`, import.meta.url) if (!loader) return this.logger.error(`MDX loader not found`) - hooks.on(`build.resolve.extensions`, ext => ext.add(`.md`).add(`.mdx`)) + hooks.on(`build.resolve.extensions`, (ext = new Set()) => ext.add(`.md`).add(`.mdx`)) hooks.on(`build.resolveLoader.alias`, (aliases = {}) => ({ ...aliases, [`@mdx-js/loader`]: loader, @@ -97,3 +97,5 @@ export class BudMDX extends Extension { }) } } + +export {BudMDX as default} diff --git a/sources/@roots/bud-mdx/src/index.ts b/sources/@roots/bud-mdx/src/index.ts index 3856b4d3fe..ea55c23cbd 100644 --- a/sources/@roots/bud-mdx/src/index.ts +++ b/sources/@roots/bud-mdx/src/index.ts @@ -2,13 +2,46 @@ // Licensed under the MIT license. /** - * Adds MDX support to Bud - + * @roots/bud-mdx * @see https://bud.js.org * @see https://github.com/roots/bud */ -import {BudMDX} from './extension.js' -import './types.js' +import type Item from '@roots/bud-build/item' +import type Loader from '@roots/bud-build/loader' +import type Rule from '@roots/bud-build/rule' + +import {default as BudMDX} from '@roots/bud-mdx/extension' + +declare module '@roots/bud-framework' { + interface Bud { + mdx: { + get: BudMDX[`get`] + getOptions: BudMDX[`getOptions`] + set: BudMDX[`set`] + setOptions: BudMDX[`setOptions`] + } + } + + interface Loaders { + mdx: Loader + } + + interface Items { + mdx: Item + } + + interface Rules { + mdx: Rule + } + + interface Patterns { + mdx: RegExp + } + + interface Modules { + '@roots/bud-mdx': Bud[`mdx`] + } +} export default BudMDX diff --git a/sources/@roots/bud-mdx/src/types.ts b/sources/@roots/bud-mdx/src/types.ts deleted file mode 100644 index cd9d848bf0..0000000000 --- a/sources/@roots/bud-mdx/src/types.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* eslint-disable n/no-unpublished-import */ - -/// -/// -/// -/// -/// - -import type {Item} from '@roots/bud-build/item' -import type {Loader} from '@roots/bud-build/loader' -import type {Rule} from '@roots/bud-build/rule' - -import type {BudMDX} from './extension.js' - -declare module '@roots/bud-framework' { - interface Bud { - mdx: { - get: BudMDX[`get`] - getOptions: BudMDX[`getOptions`] - set: BudMDX[`set`] - setOptions: BudMDX[`setOptions`] - } - } - - interface Loaders { - mdx: Loader - } - - interface Items { - mdx: Item - } - - interface Rules { - mdx: Rule - } - - interface Patterns { - mdx: RegExp - } - - interface Modules { - '@roots/bud-mdx': Bud[`mdx`] - } -} diff --git a/sources/@roots/bud-mdx/src/extension.test.ts b/sources/@roots/bud-mdx/test/extension.test.ts similarity index 77% rename from sources/@roots/bud-mdx/src/extension.test.ts rename to sources/@roots/bud-mdx/test/extension.test.ts index bdfac4dee0..6757c35c3e 100644 --- a/sources/@roots/bud-mdx/src/extension.test.ts +++ b/sources/@roots/bud-mdx/test/extension.test.ts @@ -1,7 +1,6 @@ +import {default as BudMDX} from '@roots/bud-mdx' import {describe, expect, it} from 'vitest' -import {BudMDX} from './extension.js' - describe(`@roots/bud-mdx`, () => { it(`should be constructable`, () => { expect(BudMDX).toBeInstanceOf(Function) diff --git a/sources/@roots/bud-mdx/tsconfig.json b/sources/@roots/bud-mdx/tsconfig.json index 15df7a8302..bd79fc753a 100644 --- a/sources/@roots/bud-mdx/tsconfig.json +++ b/sources/@roots/bud-mdx/tsconfig.json @@ -3,15 +3,17 @@ "compilerOptions": { "rootDir": "src", "outDir": "lib", + "strict": true, "types": [ "@roots/bud-framework", - "@roots/bud-build", "@roots/bud-babel", - "@roots/bud-react" + "@roots/bud-build", + "@roots/bud-esbuild", + "@roots/bud-swc", + "@roots/bud-typescript" ] }, "include": ["src"], - "exclude": ["./lib", "./node_modules", "**/*.test.ts", "**/*.test.tsx"], "references": [ {"path": "./../bud-babel/tsconfig.json"}, {"path": "./../bud-build/tsconfig.json"}, diff --git a/sources/@roots/bud-minify/package.json b/sources/@roots/bud-minify/package.json index 5c24164f74..b7fec8013c 100644 --- a/sources/@roots/bud-minify/package.json +++ b/sources/@roots/bud-minify/package.json @@ -30,23 +30,23 @@ "type": "module", "exports": { ".": "./lib/index.js", + "./extension": "./lib/extension/index.js", "./minify-css": "./lib/minify-css/index.js", - "./minify-js": "./lib/minify-js/index.js", - "./types": "./lib/types.js" + "./minify-js": "./lib/minify-js/index.js" }, "typesVersions": { "*": { ".": [ "./lib/index.d.ts" ], + "extension": [ + "./lib/extension/index.d.ts" + ], "minify-js": [ "./lib/minify-js/index.d.ts" ], "minify-css": [ "./lib/minify-css/index.d.ts" - ], - "types": [ - "./lib/types.d.ts" ] } }, diff --git a/sources/@roots/bud-minify/src/extension.ts b/sources/@roots/bud-minify/src/extension/index.ts similarity index 96% rename from sources/@roots/bud-minify/src/extension.ts rename to sources/@roots/bud-minify/src/extension/index.ts index b675d69707..e2e70698a8 100644 --- a/sources/@roots/bud-minify/src/extension.ts +++ b/sources/@roots/bud-minify/src/extension/index.ts @@ -59,5 +59,4 @@ class BudMinimize extends Extension { } } -export default BudMinimize -export type {BudMinimize} +export {BudMinimize as default, type BudMinimize} diff --git a/sources/@roots/bud-minify/src/index.ts b/sources/@roots/bud-minify/src/index.ts index 4afa97d4a3..b119634f60 100644 --- a/sources/@roots/bud-minify/src/index.ts +++ b/sources/@roots/bud-minify/src/index.ts @@ -8,8 +8,36 @@ * @see https://github.com/roots/bud */ -import BudMinimize from './extension.js' -import './types.js' +import type { + BudMinimizeCSS, + BudMinimizeCSSPublicInterface, +} from '@roots/bud-minify/minify-css' +import type { + BudMinimizeJS, + BudMinimizeJSPublicInterface, +} from '@roots/bud-minify/minify-js' -export default BudMinimize -export type {BudMinimize} +import BudMinimize from '@roots/bud-minify/extension' + +declare module '@roots/bud-framework' { + interface Bud { + minify: BudMinimize + + /** + * @deprecated Use {@link bud.minify} instead. + */ + minimizeCss: BudMinimizeCSSPublicInterface + /** + * @deprecated Use {@link bud.minify} instead. + */ + terser: BudMinimizeJSPublicInterface + } + + interface Modules { + '@roots/bud-minify': BudMinimize + '@roots/bud-minify/minify-css': BudMinimizeCSS + '@roots/bud-minify/minify-js': BudMinimizeJS + } +} + +export {BudMinimize as default} diff --git a/sources/@roots/bud-minify/src/types.ts b/sources/@roots/bud-minify/src/types.ts deleted file mode 100644 index 9af7286c18..0000000000 --- a/sources/@roots/bud-minify/src/types.ts +++ /dev/null @@ -1,30 +0,0 @@ -import type {BudMinimize} from '@roots/bud-minify' -import type { - BudMinimizeCSS, - BudMinimizeCSSPublicInterface, -} from '@roots/bud-minify/minify-css' -import type { - BudMinimizeJS, - BudMinimizeJSPublicInterface, -} from '@roots/bud-minify/minify-js' - -declare module '@roots/bud-framework' { - interface Bud { - minify: BudMinimize - - /** - * @deprecated Use {@link bud.minify} instead. - */ - minimizeCss: BudMinimizeCSSPublicInterface - /** - * @deprecated Use {@link bud.minify} instead. - */ - terser: BudMinimizeJSPublicInterface - } - - interface Modules { - '@roots/bud-minify': BudMinimize - '@roots/bud-minify/minify-css': BudMinimizeCSS - '@roots/bud-minify/minify-js': BudMinimizeJS - } -} diff --git a/sources/@roots/bud-minify/test/extension.test.ts b/sources/@roots/bud-minify/test/extension.test.ts index fb2a0323b5..66ffa104c7 100644 --- a/sources/@roots/bud-minify/test/extension.test.ts +++ b/sources/@roots/bud-minify/test/extension.test.ts @@ -2,7 +2,6 @@ import {type Bud, factory} from '@repo/test-kit' import BudMinimize from '@roots/bud-minify' import BudMinimizeCss from '@roots/bud-minify/minify-css' import BudMinimizeJs from '@roots/bud-minify/minify-js' -import '@roots/bud-minify/types' import {beforeAll, describe, expect, it} from 'vitest' describe(`@roots/bud-minify`, () => { @@ -20,11 +19,11 @@ describe(`@roots/bud-minify`, () => { }) it(`should expose minify.js`, async () => { - expect(instance.js).toBeInstanceOf(BudMinimizeJs) + expect(instance.js.label).toBe(`@roots/bud-minify/minify-js`) }) it(`should expose minify.css`, async () => { - expect(instance.css).toBeInstanceOf(BudMinimizeCss) + expect(instance.css.label).toBe(`@roots/bud-minify/minify-css`) }) it(`should set terserOptions.format.comments to false when minify.js.dropComments is called`, async () => { diff --git a/sources/@roots/bud-minify/tsconfig.json b/sources/@roots/bud-minify/tsconfig.json index ae5dc1380d..2f8003264c 100644 --- a/sources/@roots/bud-minify/tsconfig.json +++ b/sources/@roots/bud-minify/tsconfig.json @@ -8,7 +8,7 @@ "@roots/bud-minify/minify-css": ["./src/minify-css/index.ts"], "@roots/bud-minify/minify-js": ["./src/minify-js/index.ts"] }, - "types": ["node", "@roots/bud-framework"] + "strict": true }, "include": ["./src"], "references": [ diff --git a/sources/@roots/bud-postcss/package.json b/sources/@roots/bud-postcss/package.json index f685d1ce59..d8043af051 100644 --- a/sources/@roots/bud-postcss/package.json +++ b/sources/@roots/bud-postcss/package.json @@ -50,7 +50,7 @@ "type": "module", "exports": { ".": "./lib/index.js", - "./extension": "./lib/extension.js" + "./extension": "./lib/extension/index.js" }, "typesVersions": { "*": { @@ -58,7 +58,7 @@ "./lib/index.d.ts" ], "extension": [ - "./lib/extension.d.ts" + "./lib/extension/index.d.ts" ] } }, diff --git a/sources/@roots/bud-postcss/src/extension.ts b/sources/@roots/bud-postcss/src/extension/index.ts similarity index 98% rename from sources/@roots/bud-postcss/src/extension.ts rename to sources/@roots/bud-postcss/src/extension/index.ts index 5339e43673..64f0bf0fb7 100644 --- a/sources/@roots/bud-postcss/src/extension.ts +++ b/sources/@roots/bud-postcss/src/extension/index.ts @@ -266,4 +266,4 @@ class BudPostCss extends BudPostCssOptionsApi { } } -export {BudPostCss, type BudPostCssPublicInterface} +export {BudPostCss as default, type BudPostCssPublicInterface} diff --git a/sources/@roots/bud-postcss/src/options.ts b/sources/@roots/bud-postcss/src/extension/options.ts similarity index 100% rename from sources/@roots/bud-postcss/src/options.ts rename to sources/@roots/bud-postcss/src/extension/options.ts diff --git a/sources/@roots/bud-postcss/src/index.ts b/sources/@roots/bud-postcss/src/index.ts index 1d96232e58..0178ee0d3b 100644 --- a/sources/@roots/bud-postcss/src/index.ts +++ b/sources/@roots/bud-postcss/src/index.ts @@ -8,11 +8,11 @@ * @see https://github.com/roots/bud */ -import type {Item} from '@roots/bud-build/item' -import type {Loader} from '@roots/bud-build/loader' +import type Item from '@roots/bud-build/item' +import type Loader from '@roots/bud-build/loader' import { - BudPostCss, + default as BudPostCss, type BudPostCssPublicInterface, } from '@roots/bud-postcss/extension' diff --git a/sources/@roots/bud-postcss/tsconfig.json b/sources/@roots/bud-postcss/tsconfig.json index 6d7a13b2fd..86f9db4505 100644 --- a/sources/@roots/bud-postcss/tsconfig.json +++ b/sources/@roots/bud-postcss/tsconfig.json @@ -3,6 +3,10 @@ "compilerOptions": { "rootDir": "src", "outDir": "lib", + "paths": { + "@roots/bud-postcss": ["./src/index.ts"], + "@roots/bud-postcss/*": ["./src/*/index.ts"], + }, "strict": true, "types": ["node", "@roots/bud-framework", "@roots/bud-api", "@roots/bud-build"] }, diff --git a/sources/@roots/bud/package.json b/sources/@roots/bud/package.json index 97d65ecbd9..468441d846 100644 --- a/sources/@roots/bud/package.json +++ b/sources/@roots/bud/package.json @@ -67,7 +67,6 @@ "./context/*": "./lib/context/*.js", "./factory": "./lib/factory.js", "./instance": "./lib/instance.js", - "./services/*": "./lib/services/*.js", "./config/jsconfig.json": "./config/jsconfig.json", "./config/tsconfig.json": "./config/tsconfig.json" }, @@ -108,9 +107,6 @@ ], "instance": [ "./lib/instance.d.ts" - ], - "services/*": [ - "./lib/services/*.d.ts" ] } }, diff --git a/sources/@roots/sage/test/acorn/extension.test.ts b/sources/@roots/sage/test/acorn/extension.test.ts index bf48486131..b8e819c34d 100644 --- a/sources/@roots/sage/test/acorn/extension.test.ts +++ b/sources/@roots/sage/test/acorn/extension.test.ts @@ -1,8 +1,7 @@ import {Bud, factory} from '@repo/test-kit' +import Acorn from '@roots/sage/acorn' import {beforeEach, describe, expect, it, vi} from 'vitest' -import Acorn from '../../src/acorn/index.js' - describe(`@roots/sage/acorn`, async () => { let bud: Bud let acorn: Acorn diff --git a/sources/@roots/sage/test/blade-loader/extension.test.ts b/sources/@roots/sage/test/blade-loader/extension.test.ts index 7972e76668..8d3f73577b 100644 --- a/sources/@roots/sage/test/blade-loader/extension.test.ts +++ b/sources/@roots/sage/test/blade-loader/extension.test.ts @@ -1,5 +1,5 @@ +import BladeLoaderExtension from '@roots/sage/blade-loader' import {describe, expect, it} from 'vitest' -import {BladeLoaderExtension} from '../../src/blade-loader/extension.js' describe(`@roots/sage/blade-loader`, () => { it(`should be constructable`, () => { diff --git a/sources/@roots/sage/test/client/index.test.ts b/sources/@roots/sage/test/client/index.test.ts index c98d478b9f..6cdfd2b1ab 100644 --- a/sources/@roots/sage/test/client/index.test.ts +++ b/sources/@roots/sage/test/client/index.test.ts @@ -1,9 +1,8 @@ +import * as client from '@roots/sage/client' +import domReady from '@roots/sage/client/dom-ready' +import lazy from '@roots/sage/client/lazy' import {describe, expect, it} from 'vitest' -import domReady from '../../src/client/dom-ready.js' -import * as client from '../../src/client/index.js' -import lazy from '../../src/client/lazy.js' - describe(`@roots/sage`, () => { it(`@roots/sage/client`, () => { expect(client).toMatchSnapshot() diff --git a/sources/@roots/sage/test/sage/extension.test.ts b/sources/@roots/sage/test/sage/extension.test.ts index 6ebe41c84e..2866fff8fe 100644 --- a/sources/@roots/sage/test/sage/extension.test.ts +++ b/sources/@roots/sage/test/sage/extension.test.ts @@ -1,10 +1,9 @@ import {dirname} from 'node:path' import {fileURLToPath} from 'node:url' -import {beforeEach, describe, expect, it, vi} from 'vitest' import {Bud, factory} from '@repo/test-kit' - -import Sage from '../../src' +import Sage from '@roots/sage' +import {beforeEach, describe, expect, it, vi} from 'vitest' describe(`@roots/sage`, async () => { let bud: Bud @@ -42,12 +41,12 @@ describe(`@roots/sage`, async () => { await sage.register(bud) expect(setPathSpy).toHaveBeenCalledWith({ - '@src': `resources`, + '@dist': `public`, '@fonts': `@src/fonts`, '@images': `@src/images`, '@scripts': `@src/scripts`, + '@src': `resources`, '@styles': `@src/styles`, - '@dist': `public`, '@views': `@src/views`, }) diff --git a/yarn.lock b/yarn.lock index 40c007f4a8..fb00d82b2b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8083,10 +8083,12 @@ __metadata: dependencies: "@mdx-js/loader": 2.3.0 "@roots/bud": "workspace:*" - "@roots/bud-babel": "workspace:*" "@roots/bud-build": "workspace:*" + "@roots/bud-esbuild": "workspace:*" "@roots/bud-framework": "workspace:*" "@roots/bud-react": "workspace:*" + "@roots/bud-swc": "workspace:*" + "@roots/bud-typescript": "workspace:*" "@skypack/package-check": 0.2.2 "@types/node": 18.16.19 "@types/react": 18.2.15