@fastkit/plugboy 0.1.9 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-QOYXOOSN.mjs → chunk-DMR7ZFGP.mjs} +42 -39
- package/dist/chunk-DMR7ZFGP.mjs.map +1 -0
- package/dist/cli.mjs +2 -2
- package/dist/cli.mjs.map +1 -1
- package/dist/{combine-rules-25G6HBTY.mjs → combine-rules-2FWRSWQP.mjs} +1 -1
- package/dist/combine-rules-2FWRSWQP.mjs.map +1 -0
- package/dist/dependencies/inquirer.mjs +1 -1
- package/dist/dependencies/inquirer.mjs.map +1 -1
- package/dist/{optimize-layer-EUG2USFC.mjs → optimize-layer-YPXEP6I3.mjs} +5 -7
- package/dist/optimize-layer-YPXEP6I3.mjs.map +1 -0
- package/dist/{optimize-media-VB73IGHI.mjs → optimize-media-7XHMOJTD.mjs} +4 -6
- package/dist/optimize-media-7XHMOJTD.mjs.map +1 -0
- package/dist/plugboy.d.ts +2 -2
- package/dist/plugboy.mjs +1 -1
- package/package.json +1 -1
- package/dist/chunk-QOYXOOSN.mjs.map +0 -1
- package/dist/combine-rules-25G6HBTY.mjs.map +0 -1
- package/dist/optimize-layer-EUG2USFC.mjs.map +0 -1
- package/dist/optimize-media-VB73IGHI.mjs.map +0 -1
|
@@ -211,14 +211,14 @@ async function findConfig(fileNameOrSettings, dir = process.cwd(), currentDepth
|
|
|
211
211
|
try {
|
|
212
212
|
const _path = path.join(dir, fileName2);
|
|
213
213
|
const code = await fs.promises.readFile(_path, "utf-8");
|
|
214
|
-
const
|
|
214
|
+
const _result = {
|
|
215
215
|
fileName: fileName2,
|
|
216
216
|
dir,
|
|
217
217
|
path: _path,
|
|
218
218
|
code
|
|
219
219
|
};
|
|
220
|
-
if (!test || test(
|
|
221
|
-
return
|
|
220
|
+
if (!test || test(_result)) {
|
|
221
|
+
return _result;
|
|
222
222
|
}
|
|
223
223
|
} catch (err) {
|
|
224
224
|
if (!isFileNotFoundException(err)) {
|
|
@@ -232,8 +232,8 @@ async function findConfig(fileNameOrSettings, dir = process.cwd(), currentDepth
|
|
|
232
232
|
}
|
|
233
233
|
return result;
|
|
234
234
|
}
|
|
235
|
-
function _rmrf(
|
|
236
|
-
return fs.promises.rm(
|
|
235
|
+
function _rmrf(_path) {
|
|
236
|
+
return fs.promises.rm(_path, {
|
|
237
237
|
recursive: true,
|
|
238
238
|
force: true
|
|
239
239
|
}).catch((err) => {
|
|
@@ -243,7 +243,7 @@ function _rmrf(path10) {
|
|
|
243
243
|
});
|
|
244
244
|
}
|
|
245
245
|
async function rmrf(...paths) {
|
|
246
|
-
await Promise.all(paths.map((
|
|
246
|
+
await Promise.all(paths.map((_path) => _rmrf(_path)));
|
|
247
247
|
}
|
|
248
248
|
function copyDirSync(srcDir, destDir) {
|
|
249
249
|
if (!fs.existsSync(srcDir))
|
|
@@ -505,15 +505,13 @@ var Path = class _Path {
|
|
|
505
505
|
return new _Path(path3.resolve(this.value, ...paths));
|
|
506
506
|
}
|
|
507
507
|
_join(...paths) {
|
|
508
|
-
const _paths = paths.filter((
|
|
508
|
+
const _paths = paths.filter((_path) => !!_path);
|
|
509
509
|
return _paths.length ? path3.join(this.value, ..._paths) : this.value;
|
|
510
510
|
}
|
|
511
511
|
async readdir(...paths) {
|
|
512
512
|
const dir = this._join(...paths);
|
|
513
513
|
const files = await fs2.promises.readdir(dir);
|
|
514
|
-
return files.map((file) =>
|
|
515
|
-
return new _Path(path3.join(dir, file));
|
|
516
|
-
});
|
|
514
|
+
return files.map((file) => new _Path(path3.join(dir, file)));
|
|
517
515
|
}
|
|
518
516
|
readFile(pathAppend, defaults) {
|
|
519
517
|
return new Promise((resolve, reject) => {
|
|
@@ -601,6 +599,7 @@ async function findWorkspacePackages(dir) {
|
|
|
601
599
|
import { build } from "tsup";
|
|
602
600
|
import fs4 from "node:fs/promises";
|
|
603
601
|
import path6 from "node:path";
|
|
602
|
+
import { glob as glob2 } from "glob";
|
|
604
603
|
|
|
605
604
|
// src/workspace/dts.ts
|
|
606
605
|
import { execa } from "execa";
|
|
@@ -621,7 +620,6 @@ async function emitDTS(opts = {}) {
|
|
|
621
620
|
}
|
|
622
621
|
|
|
623
622
|
// src/workspace/builder.ts
|
|
624
|
-
import { glob as glob2 } from "glob";
|
|
625
623
|
var SHEBANG_MATCH_RE = /^(#!.+?)\n/;
|
|
626
624
|
function safeRemoveCSSMap(cssFilePath) {
|
|
627
625
|
const mapFilePath = `${cssFilePath}.map`;
|
|
@@ -634,13 +632,13 @@ async function getPostcss(options) {
|
|
|
634
632
|
const { layer, media, combineRules, cssnano } = options;
|
|
635
633
|
const [postcss, _layer, _media, _combineRules, _cssnano] = await Promise.all([
|
|
636
634
|
import("postcss").then((mod) => mod.default),
|
|
637
|
-
layer && import("./optimize-layer-
|
|
635
|
+
layer && import("./optimize-layer-YPXEP6I3.mjs").then(
|
|
638
636
|
(mod) => mod.OptimizeLayer(layer)
|
|
639
637
|
),
|
|
640
|
-
media && import("./optimize-media-
|
|
638
|
+
media && import("./optimize-media-7XHMOJTD.mjs").then(
|
|
641
639
|
(mod) => mod.OptimizeMedia(media)
|
|
642
640
|
),
|
|
643
|
-
combineRules && import("./combine-rules-
|
|
641
|
+
combineRules && import("./combine-rules-2FWRSWQP.mjs").then(
|
|
644
642
|
(mod) => mod.CombineRules(combineRules)
|
|
645
643
|
),
|
|
646
644
|
cssnano && import("cssnano").then((mod) => mod.default(cssnano))
|
|
@@ -733,7 +731,9 @@ function __plugboyPublicDir(...paths) {
|
|
|
733
731
|
}
|
|
734
732
|
`.trim();
|
|
735
733
|
const banner = { ..._tsupOptions.banner };
|
|
736
|
-
banner.js = `${banner.js ? banner.js
|
|
734
|
+
banner.js = `${banner.js ? `${banner.js}
|
|
735
|
+
|
|
736
|
+
` : ""}${PLUGBOY_VAR_ENVS_BANNER}
|
|
737
737
|
|
|
738
738
|
${ENV_FN_INJECTS}`;
|
|
739
739
|
_tsupOptions.banner = banner;
|
|
@@ -776,12 +776,11 @@ export * from '${location}';`;
|
|
|
776
776
|
const srcFromDir = path6.dirname(from);
|
|
777
777
|
const dtsDir = path6.dirname(dtsPath);
|
|
778
778
|
await Promise.all(
|
|
779
|
-
[srcFromDir, dtsDir].map((dir) => {
|
|
780
|
-
return fs4.mkdir(dir, { recursive: true });
|
|
781
|
-
})
|
|
779
|
+
[srcFromDir, dtsDir].map((dir) => fs4.mkdir(dir, { recursive: true }))
|
|
782
780
|
);
|
|
783
781
|
await Promise.all([
|
|
784
|
-
fs4.writeFile(from, `${shebang ? shebang
|
|
782
|
+
fs4.writeFile(from, `${shebang ? `${shebang}
|
|
783
|
+
` : ""}${code}`),
|
|
785
784
|
fs4.writeFile(dtsPath, dtsCode)
|
|
786
785
|
]);
|
|
787
786
|
}
|
|
@@ -800,9 +799,11 @@ export * from '${location}';`;
|
|
|
800
799
|
links.map((link) => {
|
|
801
800
|
if (link.type === "js") {
|
|
802
801
|
return this._stubLinkJS(link.from, link.to);
|
|
803
|
-
}
|
|
802
|
+
}
|
|
803
|
+
if (link.type === "css") {
|
|
804
804
|
return this._stubLinkCSS(link.from);
|
|
805
805
|
}
|
|
806
|
+
throw new Error(`non supported type`);
|
|
806
807
|
})
|
|
807
808
|
);
|
|
808
809
|
await fs4.writeFile(
|
|
@@ -946,8 +947,8 @@ ${dts}`;
|
|
|
946
947
|
...options.esbuildPlugins,
|
|
947
948
|
{
|
|
948
949
|
name: "output-collection",
|
|
949
|
-
setup(
|
|
950
|
-
|
|
950
|
+
setup(_build) {
|
|
951
|
+
_build.onEnd((result) => {
|
|
951
952
|
const { outputFiles } = result;
|
|
952
953
|
if (!outputFiles)
|
|
953
954
|
return;
|
|
@@ -1086,12 +1087,12 @@ async function getProject(searchDir, allowMissing, skipLoadConfig) {
|
|
|
1086
1087
|
(workspace) => dir.join(workspace, PACKAGE_JSON_FILENAME).value
|
|
1087
1088
|
);
|
|
1088
1089
|
const workspaceHits = await glob3(workspacesPattern);
|
|
1089
|
-
for (const
|
|
1090
|
-
const
|
|
1091
|
-
if (!isWorkspacePackageJson(
|
|
1090
|
+
for (const _hit of workspaceHits) {
|
|
1091
|
+
const _json = JSON.parse(await fs5.readFile(_hit, "utf-8"));
|
|
1092
|
+
if (!isWorkspacePackageJson(_json)) {
|
|
1092
1093
|
continue;
|
|
1093
1094
|
}
|
|
1094
|
-
resolvedWorkspaces.push(path7.dirname(
|
|
1095
|
+
resolvedWorkspaces.push(path7.dirname(_hit));
|
|
1095
1096
|
}
|
|
1096
1097
|
resolvedWorkspaces.sort((a, b) => {
|
|
1097
1098
|
if (a < b)
|
|
@@ -1262,8 +1263,8 @@ var PlugboyWorkspace = class {
|
|
|
1262
1263
|
if (typeof _at !== "object")
|
|
1263
1264
|
return;
|
|
1264
1265
|
const isMainExport = id === ".";
|
|
1265
|
-
const
|
|
1266
|
-
typesVersions[
|
|
1266
|
+
const trimmedId = isMainExport ? id : id.replace(/^\.\//, "");
|
|
1267
|
+
typesVersions[trimmedId] = [_at.types];
|
|
1267
1268
|
if (isMainExport) {
|
|
1268
1269
|
main = _at.import.default;
|
|
1269
1270
|
mainTypes = _at.types;
|
|
@@ -1362,7 +1363,10 @@ var PlugboyWorkspace = class {
|
|
|
1362
1363
|
if (!esbuildPlugins)
|
|
1363
1364
|
continue;
|
|
1364
1365
|
for (const chunk of esbuildPlugins) {
|
|
1365
|
-
const esbuildPlugin =
|
|
1366
|
+
const esbuildPlugin = (
|
|
1367
|
+
// eslint-disable-next-line no-await-in-loop
|
|
1368
|
+
typeof chunk === "function" ? await chunk(this) : await chunk
|
|
1369
|
+
);
|
|
1366
1370
|
if (esbuildPlugin) {
|
|
1367
1371
|
results.push(esbuildPlugin);
|
|
1368
1372
|
}
|
|
@@ -1498,12 +1502,10 @@ async function generateWorkspace(workspaceName, cwd = process.cwd()) {
|
|
|
1498
1502
|
type: "checkbox",
|
|
1499
1503
|
message: "Select the dependent packages, if any, to be used in the package",
|
|
1500
1504
|
name: "deps",
|
|
1501
|
-
choices: Object.keys(config.peerDependencies).map((dep) => {
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
};
|
|
1506
|
-
})
|
|
1505
|
+
choices: Object.keys(config.peerDependencies).map((dep) => ({
|
|
1506
|
+
name: dep,
|
|
1507
|
+
value: dep
|
|
1508
|
+
}))
|
|
1507
1509
|
});
|
|
1508
1510
|
if (!deps.length)
|
|
1509
1511
|
return;
|
|
@@ -1562,7 +1564,7 @@ async function generateWorkspace(workspaceName, cwd = process.cwd()) {
|
|
|
1562
1564
|
default: true
|
|
1563
1565
|
});
|
|
1564
1566
|
if (!confirmation) {
|
|
1565
|
-
console.log("
|
|
1567
|
+
console.log("Skipped.");
|
|
1566
1568
|
process.exit(1);
|
|
1567
1569
|
}
|
|
1568
1570
|
await fs7.mkdir(workspaceDir);
|
|
@@ -1587,7 +1589,7 @@ async function generateWorkspace(workspaceName, cwd = process.cwd()) {
|
|
|
1587
1589
|
JSON.stringify(tsconfig, null, 2)
|
|
1588
1590
|
);
|
|
1589
1591
|
}
|
|
1590
|
-
const configFileCode = `
|
|
1592
|
+
const configFileCode = `${`
|
|
1591
1593
|
import { defineWorkspaceConfig } from '@fastkit/plugboy';
|
|
1592
1594
|
|
|
1593
1595
|
export default defineWorkspaceConfig({
|
|
@@ -1595,7 +1597,8 @@ export default defineWorkspaceConfig({
|
|
|
1595
1597
|
'.': './src/index.ts',
|
|
1596
1598
|
},
|
|
1597
1599
|
});
|
|
1598
|
-
`.trim()
|
|
1600
|
+
`.trim()}
|
|
1601
|
+
`;
|
|
1599
1602
|
await fs7.writeFile(
|
|
1600
1603
|
path9.join(workspaceDir, `${WORKSPACE_CONFIG_BASENAME}.ts`),
|
|
1601
1604
|
configFileCode
|
|
@@ -1656,4 +1659,4 @@ export {
|
|
|
1656
1659
|
getWorkspace,
|
|
1657
1660
|
generateWorkspace
|
|
1658
1661
|
};
|
|
1659
|
-
//# sourceMappingURL=chunk-
|
|
1662
|
+
//# sourceMappingURL=chunk-DMR7ZFGP.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types/hook.ts","../src/types/dts.ts","../src/types/css.ts","../src/types/workspace.ts","../src/types/project.ts","../src/utils/general.ts","../src/utils/file.ts","../src/utils/expose.ts","../src/utils/project.ts","../src/constants.ts","../src/utils/plugin.ts","../src/utils/workspace.ts","../src/utils/hook.ts","../src/path.ts","../src/package.ts","../src/workspace/builder.ts","../src/workspace/dts.ts","../src/project/project.ts","../src/workspace/workspace.ts","../src/workspace/generate.ts"],"sourcesContent":["import type { OutputFile } from 'esbuild';\nimport type { Listable } from '../utils';\nimport { WorkspaceSetupContext, WorkspacePackageJson } from './workspace';\nimport type { PlugboyWorkspace, Builder } from '../workspace';\n\n/** plugboy hook definition */\nexport interface HookTypes {\n /**\n * Hooks during workspace setup\n * @remarks Called just before the workspace instance is created\n * @param ctx - {@link WorkspaceSetupContext Workspace setup context object}\n */\n setupWorkspace: (ctx: WorkspaceSetupContext) => any;\n /**\n * Hooks after workspace generation\n * @param workspace - {@link PlugboyWorkspace workspace instance}\n */\n createWorkspace: (workspace: PlugboyWorkspace) => any;\n /**\n * Hooks when correcting package.json\n * @param json - package.json just before it was modified and saved by the plugboy\n * @param workspace - {@link PlugboyWorkspace workspace instance}\n */\n preparePackageJSON: (\n json: WorkspacePackageJson,\n workspace: PlugboyWorkspace,\n ) => any;\n /**\n * Hooks when successful build\n * @param builder - Builder\n * @param outputFiles - List of output files\n *\n * @note\n * The text information contained in outputFiles may have already been rewritten by plugboy and output as files.\n * If you wish to perform text replacement, etc., be sure to do so on the read file.\n *\n * @see {@link OutputFile}\n */\n onSuccess: (builder: Builder, outputFiles: OutputFile[]) => any;\n}\n\nexport function createHooksDefaults(): ResolvedHooks {\n return {\n setupWorkspace: [],\n createWorkspace: [],\n preparePackageJSON: [],\n onSuccess: [],\n };\n}\n\nexport type HookName = keyof HookTypes;\n\n/**\n * plugboy user hook definition\n * @see {@link HookTypes}\n */\nexport type UserHooks = {\n [Name in HookName]?: Listable<HookTypes[Name]>;\n};\n\n/**\n * Pre-setup hook definitions\n * @see {@link HookTypes}\n */\nexport type ResolvedHooks = {\n [Name in HookName]: HookTypes[Name][];\n};\n\nexport type HookArgs<Name extends HookName> = Parameters<HookTypes[Name]>;\n\nexport type UnPromisify<T> = T extends Promise<infer U> ? U : T;\n\nexport type HookReturnType<Name extends HookName> = UnPromisify<\n ReturnType<HookTypes[Name]>\n>;\n\n/**\n * Map of hook methods that can be initialized and called\n * @see {@link HookTypes}\n */\nexport type BuildedHooks = {\n [Name in HookName]: (\n ...args: HookArgs<Name>\n ) => Promise<HookReturnType<Name>>;\n};\n","import type { Builder } from '../workspace';\n\n/**\n * Type preservation target in d.ts file\n */\nexport interface DTSPreserveTypeTarget {\n /** Type name */\n typeName: string;\n /**\n * String to be restored or regular expression to match\n */\n from: string | RegExp;\n}\n\n/**\n * Type preservation target in d.ts file (normalized)\n *\n * @see {@link DTSPreserveTypeTarget}\n */\nexport interface NormalizedDTSPreserveTypeTarget\n extends Omit<DTSPreserveTypeTarget, 'from'> {\n /** Regular expression to match the string to be restored */\n from: RegExp;\n}\n\nexport function normalizeDTSPreserveTypeTarget(\n target: DTSPreserveTypeTarget,\n): NormalizedDTSPreserveTypeTarget {\n const { from, typeName } = target;\n return {\n from: typeof from === 'string' ? new RegExp(`${from}`, 'g') : from,\n typeName,\n };\n}\n\n/**\n * Type preservation setting for d.ts files\n *\n * @remarks This setting is for restoring type information inlined by the TypeScript compiler to the original type name by string substitution.\n */\nexport interface DTSPreserveTypeSettings {\n /** Name of the package to which the type to be restored belongs */\n pkg?: string;\n /** List of preservation targets */\n targets: DTSPreserveTypeTarget[];\n}\n\n/**\n * Type preservation setting for d.ts files (normalized)\n *\n * @see {@link DTSPreserveTypeSettings}\n */\nexport interface NormalizedDTSPreserveTypeSettings\n extends Omit<DTSPreserveTypeSettings, 'targets'> {\n /** List of normalized type preservation targets */\n targets: NormalizedDTSPreserveTypeTarget[];\n}\n\nexport function normalizeDTSPreserveTypeSettings(\n settings: DTSPreserveTypeSettings,\n): NormalizedDTSPreserveTypeSettings {\n return {\n ...settings,\n targets: settings.targets.map(normalizeDTSPreserveTypeTarget),\n };\n}\n\n/**\n * Function to normalize d.ts strings\n * @param dts - Bundled d.ts strings\n * @param builder - Builder\n */\nexport type DTSNormalizer = (\n dts: string,\n builder: Builder,\n) => string | undefined | void | Promise<string | undefined | void>;\n\n/**\n * d.ts output setting\n */\nexport interface DTSSettings {\n /**\n * Inline output without bundling d.ts\n *\n * @default false\n */\n inline?: boolean;\n\n /**\n * list of type preservation settings\n *\n * @remarks This setting is for restoring type information inlined by the TypeScript compiler to the original type name by string substitution.\n *\n * @see {@link DTSPreserveTypeSettings}\n */\n preserveType?: DTSPreserveTypeSettings[];\n\n /**\n * list of function to normalize d.ts strings\n */\n normalizers?: DTSNormalizer[];\n}\n\n/**\n * d.ts output setting (normalized)\n *\n * @see {@link DTSSettings}\n */\nexport interface NormalizedDTSSettings {\n /**\n * Inline output without bundling d.ts\n */\n inline: boolean;\n\n /**\n * list of type preservation settings\n */\n preserveType: NormalizedDTSPreserveTypeSettings[];\n\n /**\n * list of function to normalize d.ts strings\n */\n normalizers: DTSNormalizer[];\n}\n\nexport function normalizeDTSSettings(\n settings: DTSSettings,\n): NormalizedDTSSettings {\n const {\n inline = false,\n preserveType = [],\n normalizers = [],\n } = settings || {};\n return {\n inline,\n preserveType: preserveType.map(normalizeDTSPreserveTypeSettings),\n normalizers,\n };\n}\n\nexport function mergeDTSSettingsList(\n ...settingsList: (DTSSettings | undefined)[]\n): NormalizedDTSSettings {\n const merged: DTSSettings = {};\n settingsList.forEach((settings) => {\n if (!settings) return;\n const { inline, preserveType, normalizers } = settings;\n if (inline !== undefined) merged.inline = inline;\n if (preserveType) {\n merged.preserveType = merged.preserveType || [];\n merged.preserveType.push(...preserveType);\n }\n if (normalizers) {\n merged.normalizers = merged.normalizers || [];\n merged.normalizers.push(...normalizers);\n }\n });\n return normalizeDTSSettings(merged);\n}\n","import type { Options } from 'cssnano';\nimport {\n OptimizeLayerOptions,\n OptimizeMediaOptions,\n CombineRulesOptions,\n} from '../postcss';\n\n/**\n * CSS optimization options\n */\nexport interface OptimizeCSSOptions {\n /**\n * Layer optimization options\n *\n * Disable the operation with `false`.\n *\n * @default true\n */\n layer?: OptimizeLayerOptions | boolean;\n /**\n * Media Query Optimization Options\n *\n * Disable the operation with `false`.\n *\n * @default true\n */\n media?: OptimizeMediaOptions | boolean;\n /**\n * Combine rules Options\n *\n * If unset, no optimization is performed\n */\n combineRules?: CombineRulesOptions;\n /**\n * Options for [cssnano](https://cssnano.co/)\n *\n * Disable the operation with `false`.\n *\n * @default { preset: ['default', { normalizeWhitespace: false }] }\n */\n cssnano?: Options | boolean;\n}\n\nexport interface ResolvedOptimizeCSSOptions {\n layer?: OptimizeLayerOptions;\n media?: OptimizeMediaOptions;\n combineRules?: CombineRulesOptions;\n cssnano?: Options;\n}\n\nexport function resolveOptimizeCSSOptions(options: OptimizeCSSOptions) {\n const resolved: ResolvedOptimizeCSSOptions = {};\n const { layer = true, media = true, combineRules, cssnano = true } = options;\n if (layer !== false) {\n resolved.layer = layer === true ? {} : layer;\n }\n if (media !== false) {\n resolved.media = media === true ? {} : media;\n }\n if (combineRules) {\n resolved.combineRules = combineRules;\n }\n if (cssnano !== false) {\n resolved.cssnano =\n cssnano === true\n ? { preset: ['default', { normalizeWhitespace: false }] }\n : cssnano;\n }\n return resolved;\n}\n","import type { Options as TSUpOptions } from 'tsup';\nimport type { Path } from '../path';\nimport { RequiredPackageJSON, MarkRequired } from './_utils';\nimport type { PlugboyProject } from '../project';\nimport type { UserPluginOption, Plugin } from './plugin';\nimport type { UserHooks, BuildedHooks } from './hook';\nimport { DTSSettings, NormalizedDTSSettings } from './dts';\nimport { OptimizeCSSOptions } from './css';\n\nexport const WORKSPACE_REQUIRED_FIELDS = ['name', 'version'] as const;\n\ntype WorkspaceRequiredField = (typeof WORKSPACE_REQUIRED_FIELDS)[number];\n\n/**\n * Entry setting object\n */\nexport interface RawWorkspaceEntryObject {\n /**\n * Entry file path\n * @remarks It must be relative to the root directory of the workspace.\n */\n src: string;\n /**\n * Set to true if the entry outputs css at the same time\n * @remarks By doing this, the exports field in package.json will be set automatically.\n */\n css?: boolean;\n}\n\n/**\n * Entry setting object\n */\nexport type WorkspaceEntry = MarkRequired<\n RawWorkspaceEntryObject,\n 'src' | 'css'\n>;\n\nexport type RawWorkspaceEntry = string | RawWorkspaceEntryObject;\n\n/**\n * Configuration of all entries in the workspace (normalized)\n *\n * @see {@link RawWorkspaceEntries}\n */\nexport type WorkspaceEntries = Record<string, WorkspaceEntry>;\n\n/**\n * Configuration of all entries in the workspace\n *\n * @remarks The configuration must be `{ [id]: [Entry setting: }`. `\".\" ` is treated as a special ID and is the target of the main export.\n */\nexport type RawWorkspaceEntries = Record<string, RawWorkspaceEntry>;\n\nexport const TSUP_SYNC_OPTIONS = [\n 'define',\n 'noExternal',\n 'external',\n 'replaceNodeEnv',\n 'skipNodeModulesBundle',\n] as const;\n\ntype TSUpSyncOption = (typeof TSUP_SYNC_OPTIONS)[number];\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\ninterface TSUpSyncOptions extends Pick<TSUpOptions, TSUpSyncOption> {}\n\n/**\n * Workspace User Configuration\n */\nexport interface UserWorkspaceConfig extends TSUpSyncOptions {\n /**\n * Ignore project settings\n *\n * @remarks Normally, when processing a workspace, plugboy looks for and merges the settings of the entire project at the same time, but this action can be canceled.\n */\n ignoreProjectConfig?: boolean;\n /**\n * Configuration of all entries in the workspace\n *\n * @see {@link RawWorkspaceEntries}\n */\n entries?: RawWorkspaceEntries;\n /**\n * Hook Setting\n * @see {@link UserHooks}\n */\n hooks?: UserHooks;\n /**\n * Plug-in List\n * @see {@link UserPluginOption}\n */\n plugins?: UserPluginOption[];\n /**\n * d.ts output setting\n * @see {@link DTSSettings}\n */\n dts?: DTSSettings;\n /**\n * CSS optimization options\n *\n * Disable the operation with `false`.\n *\n * @default true\n *\n * @see {@link OptimizeCSSOptions}\n */\n optimizeCSS?: OptimizeCSSOptions | boolean;\n}\n\n/**\n * Workspace Configuration\n */\nexport interface ResolvedWorkspaceConfig\n extends Required<\n Omit<\n UserWorkspaceConfig,\n 'entries' | 'hooks' | 'plugins' | 'dts' | 'optimizeCSS' | TSUpSyncOption\n >\n >,\n TSUpSyncOptions {\n /**\n * Configuration of all entries in the workspace\n *\n * @see {@link WorkspaceEntries}\n */\n entries: WorkspaceEntries;\n /**\n * Hook Setting\n * @see {@link UserHooks}\n */\n hooks?: UserHooks;\n /**\n * Plug-in List\n * @see {@link UserPluginOption}\n */\n plugins: Plugin[];\n /**\n * d.ts output setting\n * @see {@link DTSSettings}\n */\n dts?: DTSSettings;\n /**\n * CSS optimization options\n *\n * Disable the operation with `false`.\n *\n * @see {@link OptimizeCSSOptions}\n */\n optimizeCSS: OptimizeCSSOptions | false;\n}\n\nexport type WorkspacePackageJson = RequiredPackageJSON<WorkspaceRequiredField>;\n\n/**\n * Workspace Directory Settings\n */\nexport interface WorkspaceDirs {\n /** Path instance of the source directory */\n src: Path;\n /** Path instance of the distribution directory */\n dist: Path;\n}\n\n/**\n * Workspace Meta Information\n *\n * @remarks This will be set to a value uniquely extended by the plugin\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface WorkspaceMeta {}\n\n/**\n * Workspace setup context object\n * @remarks Objects that are configured when the workspace is set up. Customization can be done before the workspace instance is created by a plug-in or other process.\n */\nexport interface WorkspaceSetupContext {\n /** Workspace directory path instance */\n dir: Path;\n /** package.json */\n json: WorkspacePackageJson;\n /**\n * Workspace Configuration\n * @see {@link ResolvedWorkspaceConfig}\n */\n config: ResolvedWorkspaceConfig;\n /** Plugboy Project */\n project: PlugboyProject | null;\n /** Workspace Directory Settings */\n dirs: WorkspaceDirs;\n /**\n * All package names on which the workspace depends\n */\n dependencies: string[];\n /**\n * Names of all in-project packages on which the workspace depends\n */\n projectDependencies: string[];\n /**\n * Workspace Meta Information\n * @see {@link WorkspaceMeta}\n */\n meta: WorkspaceMeta;\n /**\n * プラグインリスト\n * @see {@link Plugin}\n */\n plugins: Plugin[];\n /**\n * Map of hook methods that can be initialized and called\n * @see {@link BuildedHooks}\n */\n hooks: BuildedHooks;\n /**\n * d.ts output setting\n * @see {@link NormalizedDTSSettings}\n */\n dts: NormalizedDTSSettings;\n /**\n * CSS optimization options\n *\n * Disable the operation with `false`.\n *\n * @see {@link OptimizeCSSOptions}\n */\n optimizeCSS: OptimizeCSSOptions | false;\n}\n","import type { CompilerOptions } from 'typescript';\nimport { RequiredPackageJSON } from './_utils';\nimport { WorkspacePackageJson } from './workspace';\nimport { UserPluginOption, Plugin } from './plugin';\nimport type { Path } from '../path';\nimport { UserHooks } from './hook';\nimport { DTSSettings } from './dts';\nimport { OptimizeCSSOptions } from './css';\n\nexport const PROJECT_REQUIRED_FIELDS = ['name'] as const;\n\ntype ProjectRequiredField = (typeof PROJECT_REQUIRED_FIELDS)[number];\n\nexport type TSConfigJSON = {\n compilerOptions?: CompilerOptions;\n} & Record<string, any>;\n\n/**\n * Template for package.json script in workspace\n */\nexport interface ProjectScriptsTemplate {\n /** Template Name */\n name: string;\n /** Script Map */\n scripts: Record<string, string>;\n}\n\n/**\n * Project User Configuration\n */\nexport interface UserProjectConfig {\n /**\n * Directory where the workspace is located\n * @remarks Used to create a new workspace with the `plugboy gen` CLI command.\n * @default packages\n */\n workspacesDir?: string;\n /**\n * Workspace script templates, or a list of them\n * @remarks Used to create a new workspace with the `plugboy gen` CLI command.\n */\n scripts?: Record<string, string> | ProjectScriptsTemplate[];\n /**\n * Workspace tsconfig template\n * @remarks Used to create a new workspace with the `plugboy gen` CLI command.\n */\n tsconfig?: TSConfigJSON;\n /**\n * Workspace README template\n * @remarks Used to create a new workspace with the `plugboy gen` CLI command.\n */\n readme?: (json: WorkspacePackageJson) => string;\n /**\n * Fixes the version of all peer dependencies in the project\n */\n peerDependencies?: Record<string, string>;\n /**\n * Hook Setting\n * @see {@link UserHooks}\n */\n hooks?: UserHooks;\n /**\n * Plug-in List\n * @see {@link UserPluginOption}\n */\n plugins?: UserPluginOption[];\n /**\n * d.ts output setting\n * @see {@link DTSSettings}\n */\n dts?: DTSSettings;\n /**\n * CSS optimization options\n *\n * Disable the operation with `false`.\n *\n * @default true\n *\n * @see {@link OptimizeCSSOptions}\n */\n optimizeCSS?: OptimizeCSSOptions | boolean;\n}\n\n/**\n * Project Configuration\n */\n\nexport interface ResolvedProjectConfig\n extends Required<\n Omit<\n UserProjectConfig,\n 'scripts' | 'tsconfig' | 'hooks' | 'plugins' | 'dts' | 'optimizeCSS'\n >\n > {\n /**\n * Workspace script templates list\n * @remarks Used to create a new workspace with the `plugboy gen` CLI command.\n */\n scripts: ProjectScriptsTemplate[];\n /**\n * Workspace tsconfig template\n * @remarks Used to create a new workspace with the `plugboy gen` CLI command.\n */\n tsconfig?: TSConfigJSON;\n /**\n * Hook Setting\n * @see {@link UserHooks}\n */\n hooks?: UserHooks;\n /**\n * Plug-in List\n * @see {@link UserPluginOption}\n */\n plugins: Plugin[];\n /**\n * d.ts output setting\n * @see {@link DTSSettings}\n */\n dts?: DTSSettings;\n /**\n * CSS optimization options\n *\n * Disable the operation with `false`.\n *\n * @see {@link OptimizeCSSOptions}\n */\n optimizeCSS: OptimizeCSSOptions | false;\n}\n\nexport type ProjectPackageJson = RequiredPackageJSON<ProjectRequiredField>;\n\n/**\n * Project setup context object\n * @remarks Objects that are configured when the project is set up.\n */\nexport interface ProjectSetupContext {\n /** Project directory path instance */\n dir: Path;\n /** package.json */\n json: ProjectPackageJson;\n /** Project Configuration */\n config: ResolvedProjectConfig;\n /**\n * List of directory names of workspaces located in the project\n * @remarks Note that it is the directory name, not the package name.\n */\n resolvedWorkspaces: string[];\n}\n","/* eslint-disable no-await-in-loop */\nexport function isPromise<T = any>(obj: any): obj is Promise<T> {\n return (\n !!obj &&\n (typeof obj === 'object' || typeof obj === 'function') &&\n typeof obj.then === 'function'\n );\n}\n\nexport type Listable<T> =\n | T\n | false\n | null\n | undefined\n | Listable<T>[]\n | Promise<T | false | null | undefined | Listable<T>[]>;\n\nexport async function resolveListable<T>(raw: Listable<T>): Promise<T[]> {\n const result: T[] = [];\n const list = Array.isArray(raw) ? raw : [raw];\n for (let row of list) {\n if (isPromise(row)) {\n row = await row;\n }\n if (!row) continue;\n if (Array.isArray(row)) {\n result.push(...(await resolveListable(row)));\n continue;\n }\n result.push(row);\n }\n return result;\n}\n","/* eslint-disable no-await-in-loop */\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport function getFilename(importMetaURL: string) {\n return fileURLToPath(importMetaURL);\n}\n\nexport function getDirname(importMetaURL: string) {\n return path.dirname(getFilename(importMetaURL));\n}\n\nconst FILE_NOT_FOUND_EXCEPTION_CODES = ['ENOTDIR', 'ENOENT'] as const;\n\nexport function isFileNotFoundException(\n source: unknown,\n): source is NodeJS.ErrnoException {\n return (\n !!source &&\n typeof source === 'object' &&\n FILE_NOT_FOUND_EXCEPTION_CODES.includes(\n (source as NodeJS.ErrnoException).code as any,\n )\n );\n}\n\nexport async function pathExists(\n target: string,\n type?: 'file' | 'dir',\n): Promise<boolean> {\n try {\n const stats = await fs.promises.stat(target);\n if (!type) return true;\n return type === 'file' ? stats.isFile() : stats.isDirectory();\n } catch (err) {\n if (isFileNotFoundException(err)) return false;\n throw err;\n }\n}\n\ntype FileMatcherFn = (\n file: fs.Dirent,\n dir: string,\n) => boolean | Promise<boolean>;\n\ntype FileMatcher = string | RegExp | FileMatcherFn;\n\nfunction normalizeFileMatcher(matcher: FileMatcher): FileMatcherFn {\n if (typeof matcher === 'function') {\n return matcher;\n }\n if (typeof matcher === 'string') {\n return (file) => file.name.includes(matcher);\n }\n return (file) => matcher.test(file.name);\n}\n\nexport async function findFile(\n dir: string,\n matcher: FileMatcher,\n recursive = true,\n): Promise<string | undefined> {\n const files = await fs.promises.readdir(dir, { withFileTypes: true });\n const _matcher = normalizeFileMatcher(matcher);\n\n const dirs: fs.Dirent[] | undefined = recursive ? [] : undefined;\n\n for (const file of files) {\n if (dirs && file.isDirectory()) {\n dirs.push(file);\n continue;\n }\n if (await _matcher(file, dir)) {\n return path.join(dir, file.name);\n }\n }\n\n if (dirs) {\n for (const subDir of dirs) {\n const hit = await findFile(\n path.join(dir, subDir.name),\n _matcher,\n recursive,\n );\n if (hit) return hit;\n }\n }\n}\n\nexport interface FindConfigResult {\n dir: string;\n fileName: string;\n path: string;\n code: string;\n}\n\ninterface FindConfigSettings<AllowMissing extends boolean | undefined> {\n fileName: string | string[];\n allowMissing?: AllowMissing;\n test?: (result: FindConfigResult) => boolean;\n /**\n * Trace up to how many directories above\n * @default 10\n */\n depth?: number;\n}\n\nconst FIND_CONFIG_OR_RE = /\\(.+?\\)/g;\n\nfunction parseFindConfigFileName(source: string): string[] {\n const matches = source.match(FIND_CONFIG_OR_RE);\n if (!matches) return [source];\n return matches\n .map((matched) => {\n const parts = matched.slice(1, matched.length - 1).split('|');\n return parts\n .map((part) => {\n const chunk = source.replace(matched, part);\n return parseFindConfigFileName(chunk);\n })\n .flat();\n })\n .flat();\n}\n\nfunction parseRawFindConfigFileName(source: string | string[]): string[] {\n return Array.isArray(source)\n ? source.map(parseFindConfigFileName).flat()\n : parseFindConfigFileName(source);\n}\n\nexport async function findConfig<\n AllowMissing extends boolean | undefined = false,\n>(\n fileNameOrSettings: string | string[] | FindConfigSettings<AllowMissing>,\n dir = process.cwd(),\n currentDepth = 0,\n): Promise<\n AllowMissing extends true ? FindConfigResult | null : FindConfigResult\n> {\n const settings: FindConfigSettings<AllowMissing> =\n typeof fileNameOrSettings === 'object' && !Array.isArray(fileNameOrSettings)\n ? fileNameOrSettings\n : { fileName: fileNameOrSettings };\n\n const { fileName, test, depth = 10, allowMissing } = settings;\n const fileNames = parseRawFindConfigFileName(fileName);\n if (depth && currentDepth === depth) {\n if (allowMissing) return null as any;\n throw new Error(\n `Failed to retrieve the \"${fileName}\" file because the maximum depth was reached.`,\n );\n }\n\n const next = (err?: unknown) => {\n const nextDir = path.dirname(dir);\n if (nextDir !== dir) {\n return findConfig(settings, nextDir, currentDepth + 1);\n }\n if (allowMissing) return null as any;\n throw err || new Error(`missing config \"${fileName}\"`);\n };\n\n const result = await (async () => {\n // eslint-disable-next-line no-shadow\n for (const fileName of fileNames) {\n try {\n const _path = path.join(dir, fileName);\n const code = await fs.promises.readFile(_path, 'utf-8');\n const _result: FindConfigResult = {\n fileName,\n dir,\n path: _path,\n code,\n };\n if (!test || test(_result)) {\n return _result;\n }\n } catch (err) {\n if (!isFileNotFoundException(err)) {\n throw err;\n }\n }\n }\n })();\n\n if (!result) {\n return next();\n }\n\n return result;\n}\n\nfunction _rmrf(_path: string): Promise<void> {\n return fs.promises\n .rm(_path, {\n recursive: true,\n force: true,\n })\n .catch((err) => {\n if (isFileNotFoundException(err)) return;\n throw err;\n });\n}\n\nexport async function rmrf(...paths: string[]): Promise<void> {\n await Promise.all(paths.map((_path) => _rmrf(_path)));\n}\n\nexport function copyDirSync(srcDir: string, destDir: string): void {\n if (!fs.existsSync(srcDir)) return;\n\n fs.mkdirSync(destDir, { recursive: true });\n for (const file of fs.readdirSync(srcDir)) {\n const srcFile = path.resolve(srcDir, file);\n if (srcFile === destDir) {\n continue;\n }\n const destFile = path.resolve(destDir, file);\n const stat = fs.statSync(srcFile);\n if (stat.isDirectory()) {\n copyDirSync(srcFile, destFile);\n } else {\n fs.copyFileSync(srcFile, destFile);\n }\n }\n}\n","import path from 'node:path';\nimport { glob } from 'glob';\nimport { RawWorkspaceEntryObject } from '../types';\n\nexport interface ExposeEntriesSettings {\n dir: string;\n /**\n * Path prefix at distribution\n */\n prefix?: string;\n}\n\nexport type RawExposeEntriesSettings = string | ExposeEntriesSettings;\n\nexport function resolveRawExposeEntriesSettings(\n rawSettings: RawExposeEntriesSettings,\n): ExposeEntriesSettings {\n return typeof rawSettings === 'string' ? { dir: rawSettings } : rawSettings;\n}\n\nconst TRIM_PATH_RE = /(^\\.?\\/|\\/$)/g;\nconst TRIM_EXT_RE = /\\.ts$/;\n\nexport async function exposeEntries(rawSettings: RawExposeEntriesSettings) {\n const { dir: _dir, prefix: _prefix } =\n resolveRawExposeEntriesSettings(rawSettings);\n const dir = path.resolve(_dir);\n const prefix = _prefix ? _prefix.replace(TRIM_PATH_RE, '') : '';\n const pattern = path.join(dir, '**/*.ts');\n const files = await glob(pattern);\n const entries: Record<string, RawWorkspaceEntryObject> = {};\n for (const file of files) {\n const id = (prefix + file.replace(dir, ''))\n .replace(TRIM_EXT_RE, '')\n .replace(TRIM_PATH_RE, '');\n entries[id] = {\n src: file,\n };\n }\n return entries;\n}\n","import { PackageJson } from 'pkg-types';\nimport { bundleRequire } from 'bundle-require';\nimport {\n ProjectPackageJson,\n PROJECT_REQUIRED_FIELDS,\n UserProjectConfig,\n ResolvedProjectConfig,\n} from '../types';\nimport {\n PROJECT_CONFIG_BASENAME,\n SEARCH_BUNDLE_EXTENSIONS_MATCH,\n} from '../constants';\nimport { findConfig } from './file';\nimport { resolveUserPluginOptions } from './plugin';\n\nexport function isProjectPackageJson(\n json: PackageJson,\n): json is ProjectPackageJson {\n return (\n !!json.private && PROJECT_REQUIRED_FIELDS.every((filed) => !!json[filed])\n );\n}\n\nexport async function resolveUserProjectConfig(\n userConfig: UserProjectConfig,\n): Promise<ResolvedProjectConfig> {\n const {\n workspacesDir = 'packages',\n scripts = [],\n peerDependencies = {},\n tsconfig,\n readme = (json) => `# ${json.name}\\n`,\n plugins,\n optimizeCSS = true,\n } = userConfig;\n return {\n workspacesDir,\n scripts: Array.isArray(scripts) ? scripts : [{ name: '', scripts }],\n peerDependencies,\n tsconfig,\n readme,\n plugins: await resolveUserPluginOptions(plugins),\n optimizeCSS: optimizeCSS === true ? {} : optimizeCSS,\n };\n}\n\nexport function defineProjectConfig<Config extends UserProjectConfig>(\n config: Config,\n): Promise<ResolvedProjectConfig> {\n return resolveUserProjectConfig(config);\n}\n\nexport async function loadProjectConfig(\n searchDir?: string,\n depth?: number,\n): Promise<ResolvedProjectConfig> {\n const hit = await findConfig(\n {\n fileName: `${PROJECT_CONFIG_BASENAME}.${SEARCH_BUNDLE_EXTENSIONS_MATCH}`,\n depth,\n allowMissing: true,\n },\n searchDir,\n );\n\n const userConfig = hit\n ? (\n await bundleRequire<{\n default: UserProjectConfig | Promise<UserProjectConfig>;\n }>({\n filepath: hit.path,\n })\n ).mod.default\n : ({} as UserProjectConfig);\n\n return resolveUserProjectConfig(await userConfig);\n}\n","export const PROJECT_CONFIG_BASENAME = 'plugboy.project';\n\nexport const WORKSPACE_CONFIG_BASENAME = 'plugboy.workspace';\n\nexport const PACKAGE_JSON_FILENAME = 'package.json';\n\nexport const WORKSPACE_SPEC_PREFIX = 'workspace:';\n\nexport const SEARCH_BUNDLE_EXTENSIONS_MATCH = '(ts|mjs|js|json)';\n","import { UserPluginOption, Plugin } from '../types';\nimport { resolveListable } from './general';\nimport { loadProjectConfig } from './project';\n\nexport async function resolveUserPluginOptions(\n pluginOptions: UserPluginOption[] | undefined,\n): Promise<Plugin[]> {\n if (!pluginOptions) return [];\n return resolveListable(pluginOptions);\n}\n\nexport function definePlugin<T extends Plugin>(options: T): T {\n return options;\n}\n\nexport async function extractProjectPlugins(\n searchDir?: string,\n): Promise<Plugin[]> {\n const config = await loadProjectConfig(searchDir);\n return config ? config.plugins : [];\n}\n\nexport async function findProjectPlugin<T extends Plugin = Plugin>(\n pluginName: string,\n searchDir?: string,\n): Promise<T | undefined> {\n const plugins = await extractProjectPlugins(searchDir);\n return plugins.find((plugin) => plugin.name === pluginName) as T | undefined;\n}\n","import { PackageJson } from 'pkg-types';\nimport { bundleRequire } from 'bundle-require';\nimport {\n WorkspacePackageJson,\n WORKSPACE_REQUIRED_FIELDS,\n UserWorkspaceConfig,\n ResolvedWorkspaceConfig,\n RawWorkspaceEntryObject,\n RawWorkspaceEntry,\n WorkspaceEntry,\n RawWorkspaceEntries,\n WorkspaceEntries,\n} from '../types';\nimport { findConfig } from './file';\nimport {\n WORKSPACE_CONFIG_BASENAME,\n SEARCH_BUNDLE_EXTENSIONS_MATCH,\n} from '../constants';\nimport { resolveUserPluginOptions } from './plugin';\n\nexport function isWorkspacePackageJson(\n json: PackageJson,\n): json is WorkspacePackageJson {\n return (\n !json.private && WORKSPACE_REQUIRED_FIELDS.every((filed) => !!json[filed])\n );\n}\n\nexport function resolveRawWorkspaceEntry(\n entry: RawWorkspaceEntry,\n): WorkspaceEntry {\n const { src, css }: RawWorkspaceEntryObject =\n typeof entry === 'string' ? { src: entry } : entry;\n return {\n src,\n css: css || src.endsWith('.css') || src.endsWith('.scss'),\n };\n}\n\nexport function resolveRawWorkspaceEntries(\n entries: RawWorkspaceEntries | undefined,\n): WorkspaceEntries {\n if (!entries) return {};\n return Object.fromEntries(\n Object.entries(entries).map(([name, raw]) => [\n name,\n resolveRawWorkspaceEntry(raw),\n ]),\n );\n}\n\nexport async function resolveUserWorkspaceConfig(\n userConfig: UserWorkspaceConfig,\n): Promise<ResolvedWorkspaceConfig> {\n const {\n ignoreProjectConfig = false,\n entries,\n plugins,\n optimizeCSS = true,\n } = userConfig;\n return {\n ...userConfig,\n ignoreProjectConfig,\n entries: resolveRawWorkspaceEntries(entries),\n plugins: await resolveUserPluginOptions(plugins),\n optimizeCSS: optimizeCSS === true ? {} : optimizeCSS,\n };\n}\n\nexport function defineWorkspaceConfig<Config extends UserWorkspaceConfig>(\n config: Config,\n): Promise<ResolvedWorkspaceConfig> {\n return resolveUserWorkspaceConfig(config);\n}\n\nexport async function loadWorkspaceConfig(\n searchDir?: string,\n depth?: number,\n): Promise<ResolvedWorkspaceConfig> {\n const hit = await findConfig(\n {\n fileName: `${WORKSPACE_CONFIG_BASENAME}.${SEARCH_BUNDLE_EXTENSIONS_MATCH}`,\n depth,\n allowMissing: true,\n },\n searchDir,\n );\n\n const userConfig = hit\n ? (\n await bundleRequire<{\n default: UserWorkspaceConfig | Promise<UserWorkspaceConfig>;\n }>({\n filepath: hit.path,\n })\n ).mod.default\n : ({} as UserWorkspaceConfig);\n\n return resolveUserWorkspaceConfig(await userConfig);\n}\n","/* eslint-disable no-await-in-loop */\nimport {\n UserHooks,\n ResolvedHooks,\n BuildedHooks,\n createHooksDefaults,\n} from '../types';\nimport { resolveListable } from './general';\n\nexport async function resolveUserHooks(\n ...userHooks: (UserHooks | undefined | null | false)[]\n): Promise<ResolvedHooks> {\n const hooks = createHooksDefaults();\n if (!userHooks) return hooks;\n for (const userHook of userHooks) {\n if (!userHook) continue;\n for (const [hookName, _hooks] of Object.entries(userHook)) {\n if (hooks) {\n (hooks as any)[hookName].push(...(await resolveListable(_hooks)));\n }\n }\n }\n return hooks;\n}\n\nexport function buildHooks(resolvedHooks: ResolvedHooks): BuildedHooks {\n const hooks: any = {};\n Object.entries(resolvedHooks).forEach(([hookName, fns]) => {\n hooks[hookName] = async (...args: any[]): Promise<any> => {\n const results: any[] = [];\n for (const fn of fns) {\n results.push(await (fn as any)(...args));\n }\n return results;\n };\n });\n return hooks;\n}\n","import path from 'node:path';\nimport fs from 'node:fs';\nimport { isFileNotFoundException } from './utils';\n\nexport class Path {\n private _value: string;\n\n private _stats?: fs.Stats;\n\n get value() {\n return this._value;\n }\n\n set value(value) {\n const _value = path.resolve(value);\n if (_value === this._value) return;\n this._value = path.resolve(value);\n delete this._stats;\n }\n\n get dirname() {\n return path.dirname(this.value);\n }\n\n get basename() {\n return path.basename(this.value);\n }\n\n get extname() {\n return path.extname(this.value);\n }\n\n get stats() {\n let { _stats } = this;\n if (!_stats) {\n _stats = fs.statSync(this.value);\n this._stats = _stats;\n }\n return _stats;\n }\n\n get isDirectory() {\n return this.stats.isDirectory;\n }\n\n get isFile() {\n return this.stats.isFile;\n }\n\n constructor(value: string) {\n this._value = path.resolve(value);\n }\n\n toString() {\n return this.value;\n }\n\n valueOf() {\n return this.value;\n }\n\n toJSON() {\n return this.value;\n }\n\n relative(to: string) {\n return new Path(path.relative(this.value, to));\n }\n\n join(...paths: string[]) {\n return new Path(path.join(this.value, ...paths));\n }\n\n resolve(...paths: string[]) {\n return new Path(path.resolve(this.value, ...paths));\n }\n\n private _join(...paths: (string | undefined)[]) {\n const _paths = paths.filter((_path): _path is string => !!_path);\n return _paths.length ? path.join(this.value, ..._paths) : this.value;\n }\n\n async readdir(...paths: string[]): Promise<Path[]> {\n const dir = this._join(...paths);\n const files = await fs.promises.readdir(dir);\n return files.map((file) => new Path(path.join(dir, file)));\n }\n\n readFile<D = undefined>(\n pathAppend?: string,\n defaults?: D,\n ): Promise<D extends undefined ? string : string | D> {\n return new Promise<any>((resolve, reject) => {\n fs.readFile(this._join(pathAppend), 'utf-8', (err, data) => {\n if (err) {\n if (defaults !== undefined && isFileNotFoundException(err)) {\n return resolve(defaults);\n }\n return reject(err);\n }\n resolve(data);\n });\n });\n }\n\n async readJSON<T = any, D = undefined>(\n pathAppend?: string,\n defaults?: D,\n ): Promise<D extends undefined ? T : T | D> {\n try {\n const file = await this.readFile(pathAppend);\n return JSON.parse(file);\n } catch (err) {\n if (defaults === undefined) {\n throw err;\n }\n return defaults as any;\n }\n }\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { ProjectPackageJson, WorkspacePackageJson } from './types';\nimport {\n findConfig,\n isProjectPackageJson,\n isWorkspacePackageJson,\n} from './utils';\nimport { PACKAGE_JSON_FILENAME } from './constants';\nimport { Path } from './path';\n\nexport interface GetProjectPackageJsonResult {\n dir: Path;\n json: ProjectPackageJson;\n}\n\nexport async function getProjectPackageJson<\n AllowMissing extends boolean | undefined = false,\n>(\n searchDir?: string,\n allowMissing?: AllowMissing,\n): Promise<\n AllowMissing extends true\n ? GetProjectPackageJsonResult | null\n : GetProjectPackageJsonResult\n> {\n const hit = await findConfig(\n {\n fileName: PACKAGE_JSON_FILENAME,\n allowMissing,\n test: (result) => isProjectPackageJson(JSON.parse(result.code)),\n },\n searchDir,\n );\n if (!hit) {\n if (allowMissing) return null as any;\n throw new Error('missing project package.');\n }\n return {\n dir: new Path(hit.dir),\n json: JSON.parse(hit.code),\n } as any;\n}\n\nexport interface GetWorkspacePackageJsonResult {\n dir: Path;\n json: WorkspacePackageJson;\n}\n\nexport async function getWorkspacePackageJson<\n AllowMissing extends boolean | undefined = false,\n>(\n searchDir?: string,\n allowMissing?: AllowMissing,\n): Promise<\n AllowMissing extends true\n ? GetWorkspacePackageJsonResult | null\n : GetWorkspacePackageJsonResult\n> {\n const hit = await findConfig(\n {\n fileName: PACKAGE_JSON_FILENAME,\n allowMissing,\n test: (result) => isWorkspacePackageJson(JSON.parse(result.code)),\n },\n searchDir,\n );\n if (!hit) {\n if (allowMissing) return null as any;\n throw new Error('missing workspace package.');\n }\n return {\n dir: new Path(hit.dir),\n json: JSON.parse(hit.code),\n } as any;\n}\n\nexport async function findWorkspacePackages(\n dir: string,\n): Promise<GetWorkspacePackageJsonResult[]> {\n const results: GetWorkspacePackageJsonResult[] = [];\n const searchDir = path.resolve(dir);\n const dirs = await fs.readdir(searchDir);\n const pkgs = await Promise.all(\n dirs.map((dirName) =>\n getWorkspacePackageJson(path.join(searchDir, dirName), true),\n ),\n );\n pkgs.forEach((pkg) => {\n pkg && results.push(pkg);\n });\n return results;\n}\n","/* eslint-disable no-await-in-loop */\nimport { Options, build } from 'tsup';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { OutputFile, Plugin } from 'esbuild';\nimport { glob } from 'glob';\nimport type { Processor, AcceptedPlugin as PostcssPlugin } from 'postcss';\nimport type { PlugboyWorkspace, WorkspaceObjectExport } from './workspace';\nimport {\n TSUP_SYNC_OPTIONS,\n NormalizedDTSPreserveTypeSettings,\n ResolvedOptimizeCSSOptions,\n} from '../types';\nimport { copyDirSync, rmrf } from '../utils';\nimport { emitDTS } from './dts';\n\nconst SHEBANG_MATCH_RE = /^(#!.+?)\\n/;\ntype EnvVarName = '__PLUGBOY_DEV__' | '__PLUGBOY_STUB__';\ntype EnvFnName =\n | '__plugboyWorkspaceDir'\n | '__plugboySrcDir'\n | '__plugboyPublicDir';\n\ninterface ResolvedOptions extends Options {\n esbuildPlugins: Plugin[];\n}\n\nfunction safeRemoveCSSMap(cssFilePath: string) {\n const mapFilePath = `${cssFilePath}.map`;\n return fs.rm(mapFilePath, { force: true });\n}\n\nconst SOURCE_MAPPING_URL_COMMENT_RE = /\\/\\*# sourceMappingURL=.+? \\*\\//g;\nconst allLayerDefRe = /(^|\\n)@layer\\s+([a-zA-Z\\d\\-_$. ,]+);/g;\nconst layerDefTrimRe = /((^|\\n)@layer\\s+|;)/g;\n\nasync function getPostcss(\n options: ResolvedOptimizeCSSOptions,\n): Promise<Processor> {\n const { layer, media, combineRules, cssnano } = options;\n const [postcss, _layer, _media, _combineRules, _cssnano] = await Promise.all([\n import('postcss').then((mod) => mod.default),\n layer &&\n import('../postcss/plugins/optimize-layer').then((mod) =>\n mod.OptimizeLayer(layer),\n ),\n media &&\n import('../postcss/plugins/optimize-media').then((mod) =>\n mod.OptimizeMedia(media),\n ),\n combineRules &&\n import('../postcss/plugins/combine-rules').then((mod) =>\n mod.CombineRules(combineRules),\n ),\n cssnano && import('cssnano').then((mod) => mod.default(cssnano)),\n ]);\n const plugins: PostcssPlugin[] = [];\n _layer && plugins.push(_layer);\n _media && plugins.push(_media);\n _combineRules && plugins.push(_combineRules);\n _cssnano && plugins.push(_cssnano);\n\n return postcss(plugins);\n}\n\nexport class Builder {\n readonly workspace: PlugboyWorkspace;\n\n private _tsupOptions?: ResolvedOptions;\n\n private _postcssCache?: Processor;\n\n get entry() {\n return this.workspace.entry;\n }\n\n get dts() {\n return this.workspace.dts;\n }\n\n constructor(workspace: PlugboyWorkspace) {\n this.workspace = workspace;\n }\n\n async tsupOptions(overrides?: { watch?: boolean }): Promise<ResolvedOptions> {\n let { _tsupOptions } = this;\n if (_tsupOptions) return _tsupOptions;\n\n const { entry, dts } = this;\n\n const esbuildPlugins = await this.workspace.getESBuildPlugins();\n\n _tsupOptions = {\n publicDir: true,\n format: ['esm'],\n dts: dts.inline\n ? false\n : {\n resolve: ['@fastkit/plugboy'],\n },\n treeshake: true,\n esbuildPlugins,\n entry,\n splitting: true,\n outExtension: ({ format }) => ({\n js: `.mjs`,\n }),\n sourcemap: true,\n clean: true,\n ...overrides,\n };\n\n for (const opt of TSUP_SYNC_OPTIONS) {\n _tsupOptions[opt] = this.workspace.config[opt] as any;\n }\n\n const PLUGBOY_VAR_ENVS: Record<EnvVarName, string> = {\n __PLUGBOY_DEV__: 'false',\n __PLUGBOY_STUB__: 'false',\n };\n\n const DEFINE_VAR_INJECTS = Object.fromEntries(\n Object.keys(PLUGBOY_VAR_ENVS).map((envName) => [envName, `$$${envName}`]),\n );\n\n _tsupOptions.define = {\n ..._tsupOptions.define,\n ...DEFINE_VAR_INJECTS,\n };\n\n const PLUGBOY_VAR_ENVS_BANNER = [\n ...Object.entries(PLUGBOY_VAR_ENVS).map(\n ([envName, variable]) =>\n `const $$${envName} = /* @PLUGBOY:${envName}:start */${variable}/* @PLUGBOY:${envName}:end */;`,\n ),\n `const $$__PLUGBOY_RELATIVE_PATH_FOR_WORKSPACE__ = '@@__PLUGBOY_RELATIVE_PATH_FOR_WORKSPACE__';`,\n ].join('\\n');\n\n const ENV_FN_INJECTS = `\nimport __plugboy_path from 'node:path';\nimport { fileURLToPath as __plugboy_fileURLToPath } from 'node:url';\n\nfunction __plugboyFilename() {\n return __plugboy_fileURLToPath(import.meta.url);\n}\n\nfunction __plugboyDirname() {\n return __plugboy_path.dirname(__plugboyFilename());\n}\n\nfunction __plugboyWorkspaceDir(...paths) {\n return __plugboy_path.join(__plugboy_path.resolve(__plugboyDirname(), $$__PLUGBOY_RELATIVE_PATH_FOR_WORKSPACE__), ...paths);\n}\n\nfunction __plugboySrcDir(...paths) {\n return __plugboy_path.join(__plugboyWorkspaceDir(), 'src', ...paths);\n}\n\nfunction __plugboyPublicDir(...paths) {\n return __plugboy_path.join(__plugboyWorkspaceDir(), 'dist', ...paths);\n}\n `.trim();\n\n const banner: NonNullable<Options['banner']> = { ..._tsupOptions.banner };\n banner.js = `${\n banner.js ? `${banner.js}\\n\\n` : ''\n }${PLUGBOY_VAR_ENVS_BANNER}\\n\\n${ENV_FN_INJECTS}`;\n\n _tsupOptions.banner = banner;\n\n _tsupOptions.external = _tsupOptions.external || [];\n _tsupOptions.external.push(\n /^(@fastkit\\/)?plugboy/,\n ...this.workspace.dependencies,\n );\n\n this._tsupOptions = _tsupOptions;\n\n return _tsupOptions;\n }\n\n private async _stubLinkJS(from: string, to: string) {\n const fromParsed = path.parse(from);\n const fromDir = fromParsed.dir;\n const toParsed = path.parse(to);\n const toRelativeDir = path.relative(fromDir, toParsed.dir);\n const location = path.join(toRelativeDir, toParsed.base);\n const source = await fs.readFile(to, 'utf-8');\n const shebang = source.match(SHEBANG_MATCH_RE)?.[1];\n const STUB_FN_ERROR = `() => { throw new Error('Path resolution methods cannot be executed in stub mode.') }`;\n const PLUGBOY_ENVS: Record<EnvVarName | EnvFnName, string> = {\n __PLUGBOY_DEV__: 'true',\n __PLUGBOY_STUB__: 'true',\n __plugboyWorkspaceDir: STUB_FN_ERROR,\n __plugboySrcDir: STUB_FN_ERROR,\n __plugboyPublicDir: STUB_FN_ERROR,\n // __plugboyWorkspaceDir: `(...paths) => path.join('${this.workspace.dir.value}', ...paths)`,\n // __plugboySrcDir: `(...paths) => path.join(__plugboySrcDir(), 'src', ...paths)`,\n // __plugboyPublicDir: `(...paths) => path.join(__plugboySrcDir(), 'dist', ...paths)`,\n };\n const ENV_INJECTS = Object.entries(PLUGBOY_ENVS)\n .map(([envName, variable]) => `globalThis.${envName} = ${variable};`)\n .join('\\n');\n const disableChecks = '/* eslint-disable */\\n// @ts-nocheck\\n';\n const code = `${disableChecks}${ENV_INJECTS}\\nexport * from '${location}';`;\n const dtsPath = path.join(fromDir, `${fromParsed.name}.d.ts`);\n const dtsCode = `${disableChecks}export * from '${location.replace(\n /\\.ts$/,\n '',\n )}';`;\n const srcFromDir = path.dirname(from);\n const dtsDir = path.dirname(dtsPath);\n await Promise.all(\n [srcFromDir, dtsDir].map((dir) => fs.mkdir(dir, { recursive: true })),\n );\n await Promise.all([\n fs.writeFile(from, `${shebang ? `${shebang}\\n` : ''}${code}`),\n fs.writeFile(dtsPath, dtsCode),\n ]);\n }\n\n private async _stubLinkCSS(from: string) {\n const code = `/* noop */`;\n await fs.writeFile(from, code);\n }\n\n async copyPublicDir() {\n const publicDir = this.workspace.dir.join('public').value;\n await copyDirSync(publicDir, this.workspace.dirs.dist.value);\n }\n\n async stub() {\n const links = this.workspace.getStubLinks();\n await this.copyPublicDir();\n await Promise.all(\n links.map((link) => {\n if (link.type === 'js') {\n return this._stubLinkJS(link.from, link.to);\n }\n if (link.type === 'css') {\n return this._stubLinkCSS(link.from);\n }\n throw new Error(`non supported type`);\n }),\n );\n await fs.writeFile(\n this.workspace.dirs.dist.join('.stub').value,\n '',\n 'utf-8',\n );\n }\n\n normalizeDTSBySettings(\n dts: string,\n settings: NormalizedDTSPreserveTypeSettings,\n ): string | undefined {\n const { targets, pkg } = settings;\n const myPackageName = this.workspace.json.name;\n const packageIsOwn = myPackageName === pkg;\n const pkgImports = (() => {\n if (!pkg || packageIsOwn) return;\n\n const importRe = new RegExp(`import {([^\\\\{\\\\}]+)} from '${pkg}'`);\n const importMatched = dts.match(importRe);\n const imports = importMatched && importMatched[1];\n if (!imports) return;\n\n return {\n pkg,\n importRe,\n imports,\n };\n })();\n\n const hitTypeNames: string[] = [];\n targets.forEach(({ from, typeName }) => {\n const matched = dts.match(from);\n if (matched) {\n hitTypeNames.push(typeName);\n dts = dts.replace(from, typeName);\n }\n });\n\n if (!hitTypeNames.length) return;\n\n if (pkgImports) {\n // eslint-disable-next-line no-shadow\n const { pkg, imports, importRe } = pkgImports;\n const mods = imports\n .trim()\n .split(',')\n .map((row) => {\n row = row.split(' as ')[0].trim();\n return row;\n });\n const appends: string[] = [];\n hitTypeNames.forEach((typeName) => {\n const re = new RegExp(`(^|\\n)import { ${typeName} } from '${pkg}'`);\n if (!re.test(dts) && !mods.includes(typeName)) {\n appends.push(typeName);\n }\n });\n if (appends.length) {\n dts = dts.replace(\n importRe,\n `import { $1, ${appends.join(', ')} } from '${pkg}'`,\n );\n }\n } else if (pkg && !packageIsOwn) {\n const mods: string[] = [];\n hitTypeNames.forEach((typeName) => {\n if (!dts.includes(`export declare type ${typeName} = `)) {\n mods.push(typeName);\n }\n });\n if (mods.length) {\n dts = `import { ${mods.join(', ')} } from '${pkg}';\\n${dts}`;\n }\n }\n return dts;\n }\n\n async normalizeDTSFile(filePath: string) {\n const dts = await fs.readFile(filePath, 'utf-8');\n const { preserveType, normalizers } = this.dts;\n let normalized = dts;\n let processed = false;\n for (const settings of preserveType) {\n const _normalized = this.normalizeDTSBySettings(normalized, settings);\n if (_normalized) {\n processed = true;\n normalized = _normalized;\n }\n }\n for (const normalizer of normalizers) {\n const _normalized = await normalizer(normalized, this);\n if (_normalized && normalized !== _normalized) {\n processed = true;\n normalized = _normalized;\n }\n }\n if (!processed) {\n return;\n }\n await fs.writeFile(filePath, normalized, 'utf-8');\n }\n\n async normalizeDTSFiles(dtsFiles: string[] = this.workspace.dtsFiles) {\n const { preserveType } = this.dts;\n if (!preserveType.length || !dtsFiles.length) return;\n\n await Promise.all(\n dtsFiles.map((filePath) => this.normalizeDTSFile(filePath)),\n );\n }\n\n async emitInlineDTS() {\n const { dir, dirs, exports } = this.workspace;\n const cwd = dir.value;\n const outDir = dirs.dist.join('.dts-generate').value;\n const dtsSrcDir = path.join(outDir, 'src');\n const dtsDest = dirs.dist.join('.dts').value;\n\n await emitDTS({\n cwd,\n outDir,\n });\n\n await fs.rename(dtsSrcDir, dtsDest);\n await rmrf(outDir);\n\n const objectExports: WorkspaceObjectExport[] = [];\n\n exports.forEach(({ at }) => {\n typeof at === 'object' && objectExports.push(at);\n });\n\n await Promise.all(\n objectExports.map(async (at) => {\n const typesDir = path.dirname(at.types);\n const dtsDestDir = path.dirname(at.dtsDest);\n const relativeDir = path.relative(typesDir, dtsDestDir);\n const relativePath = path.join(\n relativeDir,\n path.basename(at.dtsDest).replace(/\\.d\\.ts$/, ''),\n );\n const code = `export * from './${relativePath}';`;\n await fs.writeFile(at.types, code, 'utf-8');\n }),\n );\n\n const dtsFiles = await glob(path.join(dtsDest, '**/*.d.ts'));\n await this.normalizeDTSFiles(dtsFiles);\n }\n\n async build() {\n const _outputFiles: OutputFile[] = [];\n const options = await this.tsupOptions();\n await build({\n ...options,\n esbuildPlugins: [\n ...options.esbuildPlugins,\n {\n name: 'output-collection',\n setup(_build) {\n _build.onEnd((result) => {\n const { outputFiles } = result;\n if (!outputFiles) return;\n _outputFiles.push(...outputFiles);\n });\n },\n },\n ],\n onSuccess: async () => {\n const emptyNativeNodeModuleRe = /(^|\\n)import 'node:.+?';?/g;\n await Promise.all(\n _outputFiles.map(async ({ path: filePath }) => {\n if (filePath.endsWith('.css')) {\n await this._handleCSSOutput(filePath);\n return;\n }\n if (!filePath.endsWith('.mjs')) return;\n const code = await fs.readFile(filePath, 'utf-8');\n const replaced = code.replace(emptyNativeNodeModuleRe, '');\n if (code === replaced) return;\n\n await fs.writeFile(filePath, replaced.trimStart(), 'utf-8');\n }),\n );\n\n await this.workspace.hooks.onSuccess(this, _outputFiles);\n },\n });\n\n if (this.dts.inline) {\n await this.emitInlineDTS();\n } else {\n await this.normalizeDTSFiles();\n }\n }\n\n async optimizeCSS(cssFilePath: string) {\n const options = this.workspace.optimizeCSSOptions;\n if (!options) return Promise.resolve();\n\n let postcss = this._postcssCache;\n if (!postcss) {\n postcss = await getPostcss(options);\n this._postcssCache = postcss;\n }\n\n function prepare(css: string): string {\n const layerDefs = (() => {\n const matched = css.match(allLayerDefRe);\n if (!matched) return '';\n const layerNames: string[] = [];\n matched.forEach((row) => {\n const trimmed = row.replace(layerDefTrimRe, '');\n const chunks = trimmed.split(',');\n chunks.forEach((chunk) => layerNames.push(chunk.trim()));\n });\n const uniqued = Array.from(new Set(layerNames));\n const def = `@layer ${uniqued.join(', ')};\\n`;\n return def;\n })();\n return (\n layerDefs +\n css\n .replace(allLayerDefRe, '')\n .replace(SOURCE_MAPPING_URL_COMMENT_RE, '')\n );\n }\n\n const css = prepare(await fs.readFile(cssFilePath, 'utf-8'));\n\n const result = await postcss.process(css, { from: cssFilePath });\n await fs.writeFile(cssFilePath, result.css);\n }\n\n private async _handleCSSOutput(cssFilePath: string) {\n await Promise.all([\n this.optimizeCSS(cssFilePath),\n safeRemoveCSSMap(cssFilePath),\n ]);\n }\n}\n","import { execa } from 'execa';\nimport path from 'node:path';\n\nexport interface EmitDTSOptions {\n cwd?: string;\n outDir?: string;\n}\n\nexport async function emitDTS(opts: EmitDTSOptions = {}) {\n const { cwd = process.cwd(), outDir = path.join(cwd, 'dist/dts') } = opts;\n await execa(\n 'tsc',\n [\n '--declaration true',\n '--skipLibCheck',\n '--noEmit false',\n '--emitDeclarationOnly',\n `--outDir ${outDir}`,\n ],\n { cwd, shell: true, stdio: 'inherit' },\n );\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport glob from 'glob';\nimport { Path } from '../path';\nimport {\n ProjectSetupContext,\n ProjectPackageJson,\n ResolvedProjectConfig,\n UserHooks,\n} from '../types';\nimport { getProjectPackageJson } from '../package';\nimport {\n isWorkspacePackageJson,\n loadProjectConfig,\n resolveUserProjectConfig,\n} from '../utils';\nimport { PACKAGE_JSON_FILENAME } from '../constants';\n\n/**\n * Plugboy Project\n *\n * @remarks This instance is only created if the project consists of a mono-repo.\n */\nexport class PlugboyProject {\n /** Path instance of the project directory */\n readonly dir: Path;\n\n /** package.json */\n readonly json: ProjectPackageJson;\n\n /**\n * Project Configuration\n * @see {@link ResolvedProjectConfig}\n */\n readonly config: ResolvedProjectConfig;\n\n /** Names of all packages on which the project depends */\n readonly dependencies: string[];\n\n /** Directory names of all workspaces owned by the project */\n readonly resolvedWorkspaces: string[];\n\n /**\n * Name of the project's package.json\n */\n get name() {\n return this.json.name;\n }\n\n /**\n * Plug-in List\n * @see {@link ResolvedProjectConfig.plugins}\n */\n get plugins() {\n return this.config.plugins;\n }\n\n /**\n * List of all user hook settings\n * @see {@link UserHooks}\n */\n get hooks(): UserHooks[] {\n const { hooks: _hooks, plugins } = this.config;\n const pluginHooks = plugins.map((plugin) => plugin.hooks);\n return [_hooks, ...pluginHooks].filter((hook): hook is UserHooks => !!hook);\n }\n\n constructor(ctx: ProjectSetupContext) {\n const { dir, json, config, resolvedWorkspaces } = ctx;\n\n this.dir = dir;\n this.json = json;\n this.config = config;\n\n const allDeps = {\n ...json.dependencies,\n ...json.devDependencies,\n };\n\n this.dependencies = Object.keys(allDeps);\n this.resolvedWorkspaces = resolvedWorkspaces;\n }\n}\n\nexport async function getProject<\n AllowMissing extends boolean | undefined = false,\n>(\n searchDir?: string,\n allowMissing?: AllowMissing,\n skipLoadConfig?: boolean,\n): Promise<AllowMissing extends true ? PlugboyProject | null : PlugboyProject> {\n const hit = await getProjectPackageJson(searchDir, allowMissing);\n if (!hit) {\n return null as any;\n }\n const { dir, json } = hit;\n const resolvedWorkspaces: string[] = [];\n const { workspaces = [] } = json;\n const workspacesPattern = workspaces.map(\n (workspace) => dir.join(workspace, PACKAGE_JSON_FILENAME).value,\n );\n const workspaceHits = await glob(workspacesPattern);\n for (const _hit of workspaceHits) {\n // eslint-disable-next-line no-await-in-loop\n const _json = JSON.parse(await fs.readFile(_hit, 'utf-8'));\n if (!isWorkspacePackageJson(_json)) {\n continue;\n }\n resolvedWorkspaces.push(path.dirname(_hit));\n }\n resolvedWorkspaces.sort((a, b) => {\n if (a < b) return -1;\n if (a > b) return 1;\n return 0;\n });\n\n const config = skipLoadConfig\n ? await resolveUserProjectConfig({})\n : await loadProjectConfig(dir.value, 0);\n\n const ctx: ProjectSetupContext = {\n dir,\n json,\n config,\n resolvedWorkspaces,\n };\n\n return new PlugboyProject(ctx);\n}\n","import sortPackageJson from 'sort-package-json';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport {\n rmrf,\n loadWorkspaceConfig,\n resolveUserHooks,\n buildHooks,\n} from '../utils';\nimport {\n ProjectPackageJson,\n WorkspacePackageJson,\n ResolvedWorkspaceConfig,\n WorkspaceDirs,\n WorkspaceSetupContext,\n WorkspaceMeta,\n Plugin,\n UserHooks,\n BuildedHooks,\n ESBuildPlugin,\n mergeDTSSettingsList,\n NormalizedDTSSettings,\n ResolvedOptimizeCSSOptions,\n resolveOptimizeCSSOptions,\n} from '../types';\nimport { Path } from '../path';\nimport { WORKSPACE_SPEC_PREFIX, PACKAGE_JSON_FILENAME } from '../constants';\nimport { PlugboyProject, getProject } from '../project';\nimport { Builder } from './builder';\nimport { getWorkspacePackageJson } from '../package';\n\nexport type WorkspaceStubLink =\n | {\n type: 'js';\n from: string;\n to: string;\n }\n | {\n type: 'css';\n from: string;\n };\n\nexport type WorkspaceStubLinkType = WorkspaceStubLink['type'];\n\nexport interface WorkspaceObjectExport {\n src: string;\n types: string;\n dtsDest: string;\n import: {\n default: string;\n };\n}\n\nfunction extractWorkspaceObjectExport(at: string | WorkspaceObjectExport) {\n if (typeof at === 'string') return at;\n const { types, import: _import } = at;\n return {\n types,\n import: _import,\n };\n}\n\nexport interface WorkspaceExport {\n id: string;\n at: string | WorkspaceObjectExport;\n stubLink?: WorkspaceStubLink;\n}\n\nexport const WORKSPACE_PACKAGE_SYNC_FIELDS = [\n 'repository',\n 'author',\n 'publishConfig',\n 'license',\n] as const;\n\nexport function syncWorkspacePackageFields(\n projectJSON: ProjectPackageJson,\n workspaceJSON: WorkspacePackageJson,\n) {\n for (const field of WORKSPACE_PACKAGE_SYNC_FIELDS) {\n const value = projectJSON[field];\n if (value && !workspaceJSON[field]) {\n workspaceJSON[field] = value;\n }\n }\n}\n\nconst BUILD_TARGET_SRC_MATCH_RE = /\\.(tsx?|s?css)$/;\n\nexport class PlugboyWorkspace {\n readonly name: string;\n\n readonly dir: Path;\n\n readonly config: ResolvedWorkspaceConfig;\n\n readonly project: PlugboyProject | null;\n\n readonly dirs: WorkspaceDirs;\n\n readonly dependencies: string[];\n\n readonly projectDependencies: string[];\n\n readonly meta: WorkspaceMeta;\n\n readonly entry: Record<string, string>;\n\n readonly exports: WorkspaceExport[];\n\n readonly builder: Builder;\n\n readonly plugins: Plugin[];\n\n readonly hooks: BuildedHooks;\n\n readonly dtsFiles: string[] = [];\n\n readonly dts: NormalizedDTSSettings;\n\n readonly optimizeCSSOptions: ResolvedOptimizeCSSOptions | false;\n\n private _json: WorkspacePackageJson;\n\n get json() {\n return this._json;\n }\n\n constructor(ctx: WorkspaceSetupContext) {\n const {\n dir,\n json,\n config,\n project,\n dirs,\n dependencies,\n projectDependencies,\n meta,\n plugins,\n hooks,\n dts,\n optimizeCSS,\n } = ctx;\n\n this.name = dir.basename;\n this.dir = dir;\n this._json = json;\n this.project = project;\n this.dirs = dirs;\n this.dependencies = dependencies;\n this.projectDependencies = projectDependencies;\n this.meta = meta;\n this.config = config;\n this.plugins = plugins;\n this.hooks = hooks;\n this.dts = dts;\n this.optimizeCSSOptions = optimizeCSS\n ? resolveOptimizeCSSOptions(optimizeCSS)\n : false;\n\n const entry: Record<string, string> = {};\n const exports: WorkspaceExport[] = [\n {\n id: `./${PACKAGE_JSON_FILENAME}`,\n at: `./${PACKAGE_JSON_FILENAME}`,\n },\n ];\n\n Object.entries(config.entries).forEach(([id, { src, css }]) => {\n if (!BUILD_TARGET_SRC_MATCH_RE.test(src)) return;\n\n const isMainEntry = id === '.';\n const normalizedId = isMainEntry ? this.name : id;\n const exportId = id.startsWith('.') ? id : `./${id}`;\n const srcIsCSS = src.endsWith('.css') || src.endsWith('.scss');\n const ext = srcIsCSS ? 'css' : 'mjs';\n const dest = `./dist/${normalizedId}.${ext}`;\n const destFullPath = dir.join(dest).value;\n\n entry[normalizedId] = src;\n\n if (css) {\n const cssDest = `./dist/${normalizedId}.css`;\n exports.push({\n id: `./${normalizedId}.css`,\n at: cssDest,\n stubLink: {\n type: 'css',\n from: cssDest,\n },\n });\n\n if (srcIsCSS) return;\n }\n\n const types = `./dist/${normalizedId}.d.ts`;\n const dtsDest = `./dist/${src\n .replace(/^\\.\\/src/, '.dts')\n .replace(/\\.ts$/, '.d.ts')}`;\n\n this.dtsFiles.push(dir.join(types).value);\n exports.push({\n id: exportId,\n at: {\n src,\n types,\n dtsDest,\n import: {\n default: dest,\n },\n },\n stubLink: {\n from: destFullPath,\n to: path.isAbsolute(src) ? src : dir.join(src).value,\n type: 'js',\n },\n });\n });\n\n this.entry = entry;\n this.exports = exports;\n this.builder = new Builder(this);\n }\n\n clean(withDepsAndCache?: boolean) {\n const { dir, dirs } = this;\n const paths: string[] = [dirs.dist.value];\n if (withDepsAndCache) {\n paths.push(dir.join('node_modules').value, dir.join('.turbo').value);\n }\n return rmrf(...paths);\n }\n\n async preparePackageJSON() {\n const { exports, json, project } = this;\n const _exports: Record<string, any> = {};\n const typesVersions: Record<string, any> = {};\n let main: string | undefined;\n let mainTypes: string | undefined;\n\n exports.forEach(({ id, at }) => {\n const _at = extractWorkspaceObjectExport(at);\n _exports[id] = _at;\n if (typeof _at !== 'object') return;\n const isMainExport = id === '.';\n const trimmedId = isMainExport ? id : id.replace(/^\\.\\//, '');\n typesVersions[trimmedId] = [_at.types];\n\n if (isMainExport) {\n main = _at.import.default;\n mainTypes = _at.types;\n }\n });\n\n _exports['./*'] = './dist/*';\n\n const cloned: typeof json = JSON.parse(JSON.stringify(json));\n cloned.exports = _exports;\n cloned.typesVersions = {\n '*': typesVersions,\n };\n if (main) cloned.main = main;\n if (mainTypes) cloned.types = mainTypes;\n\n const projectPeerDependencies = project?.config.peerDependencies;\n (['dependencies', 'devDependencies', 'peerDependencies'] as const).forEach(\n (prop) => {\n const deps = cloned[prop];\n if (!deps) return;\n Object.keys(deps).forEach((dep) => {\n const version = deps[dep];\n if (version.startsWith('workspace:')) {\n deps[dep] = 'workspace:*';\n } else if (projectPeerDependencies && projectPeerDependencies[dep]) {\n deps[dep] = projectPeerDependencies[dep];\n }\n });\n },\n );\n\n cloned.files = cloned.files || [];\n if (!cloned.files.some((file) => /(\\.\\/)?dist\\/?/.test(file))) {\n cloned.files.unshift('dist');\n }\n\n if (project) {\n syncWorkspacePackageFields(project.json, cloned);\n }\n\n cloned.type = cloned.type || 'module';\n\n await this.hooks.preparePackageJSON(json, this);\n\n const sorted = sortPackageJson(cloned);\n const fromStr = JSON.stringify(cloned, null, 2);\n const toStr = JSON.stringify(sorted, null, 2);\n if (fromStr !== toStr || process) {\n await fs.writeFile(this.dir.join(PACKAGE_JSON_FILENAME).value, toStr);\n this._json = sorted;\n }\n return sorted;\n }\n\n getStubLinks(): WorkspaceStubLink[] {\n const links: WorkspaceStubLink[] = [];\n this.exports.forEach(({ stubLink }) => {\n stubLink && links.push(stubLink);\n });\n return links;\n }\n\n async stub() {\n await this.clean();\n await fs.mkdir(this.dirs.dist.value);\n return this.builder.stub();\n }\n\n async getESBuildPlugins(): Promise<ESBuildPlugin[]> {\n const results: ESBuildPlugin[] = [];\n results.push({\n name: 'plugboy-workspace-env',\n setup: (build) => {\n const isJS = /\\.m?js$/;\n const RELATIVE_PATH_FOR_WORKSPACE =\n '@@__PLUGBOY_RELATIVE_PATH_FOR_WORKSPACE__';\n const encoder = new TextEncoder();\n\n build.onEnd(({ outputFiles, errors, warnings }) => {\n const result = { errors, warnings };\n if (!outputFiles || !outputFiles.length || errors.length)\n return result;\n\n for (const file of outputFiles) {\n const { path: filePath, text } = file;\n if (\n !isJS.test(filePath) ||\n !text.includes(RELATIVE_PATH_FOR_WORKSPACE)\n ) {\n continue;\n }\n const relativePath = path.relative(\n path.dirname(filePath),\n this.dir.value,\n );\n const content = text.replace(\n RELATIVE_PATH_FOR_WORKSPACE,\n relativePath,\n );\n file.contents = encoder.encode(content);\n }\n\n return result;\n });\n },\n });\n const { plugins } = this;\n for (const plugin of plugins) {\n const { esbuildPlugins } = plugin;\n if (!esbuildPlugins) continue;\n for (const chunk of esbuildPlugins) {\n const esbuildPlugin =\n // eslint-disable-next-line no-await-in-loop\n typeof chunk === 'function' ? await chunk(this) : await chunk;\n if (esbuildPlugin) {\n results.push(esbuildPlugin);\n }\n }\n }\n return results;\n }\n\n async build() {\n await this.clean();\n return this.builder.build();\n }\n}\n\nexport async function getWorkspace<\n AllowMissing extends boolean | undefined = false,\n>(\n searchDir?: string,\n allowMissing?: AllowMissing,\n): Promise<\n AllowMissing extends true ? PlugboyWorkspace | null : PlugboyWorkspace\n> {\n const hit = await getWorkspacePackageJson(searchDir, allowMissing);\n if (!hit) {\n return null as any;\n }\n const { dir, json } = hit;\n const config = await loadWorkspaceConfig(dir.value, 0);\n\n const project = await getProject(dir.value, true, config.ignoreProjectConfig);\n\n const dirs: WorkspaceDirs = {\n src: dir.join('src'),\n dist: dir.join('dist'),\n };\n\n const { dependencies, peerDependencies, optionalDependencies } = json;\n const allDeps = {\n ...dependencies,\n ...peerDependencies,\n ...optionalDependencies,\n };\n\n const _dependencies = Object.keys(allDeps);\n\n const projectDependencies = Object.entries(allDeps)\n .filter(([dep, spec]) => spec.startsWith(WORKSPACE_SPEC_PREFIX))\n .map(([dep]) => dep);\n\n const meta: WorkspaceMeta = {};\n\n const packagePlugins = project?.plugins || [];\n const packageHooks = project?.hooks || [];\n const plugins: Plugin[] = [...packagePlugins, ...config.plugins];\n const _hooks: UserHooks[] = [...packageHooks];\n if (config.hooks) {\n _hooks.push(config.hooks);\n }\n const resolvedHooks = await resolveUserHooks(..._hooks);\n const hooks = buildHooks(resolvedHooks);\n\n const dts = mergeDTSSettingsList(project?.config.dts, config.dts);\n\n let { optimizeCSS } = config;\n if (optimizeCSS !== false && project && project.config.optimizeCSS) {\n optimizeCSS = {\n ...project.config.optimizeCSS,\n ...optimizeCSS,\n };\n }\n\n const ctx: WorkspaceSetupContext = {\n dir,\n json,\n config,\n project,\n dirs,\n dependencies: _dependencies,\n projectDependencies,\n meta,\n plugins,\n hooks,\n dts,\n optimizeCSS,\n };\n\n await hooks.setupWorkspace(ctx);\n\n const workspace = new PlugboyWorkspace(ctx);\n\n await hooks.createWorkspace(workspace);\n\n return workspace;\n}\n","/* eslint-disable no-await-in-loop */\n/* eslint-disable no-console */\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport sortPackageJson from 'sort-package-json';\nimport inquirer from 'inquirer';\nimport { getProject } from '../project';\nimport { getWorkspace, syncWorkspacePackageFields } from '../workspace';\nimport { WorkspacePackageJson, ProjectScriptsTemplate } from '../types';\nimport { WORKSPACE_CONFIG_BASENAME } from '../constants';\n\nexport async function generateWorkspace(\n workspaceName?: string,\n cwd = process.cwd(),\n) {\n const project = await getProject(cwd);\n const { config } = project;\n\n // ====================\n // workspace name\n // ====================\n while (!workspaceName) {\n const { value } = await inquirer.prompt({\n type: 'input',\n name: 'value',\n message: 'Enter a workspace name',\n });\n\n if (value) {\n workspaceName = value;\n }\n }\n\n // ====================\n // description\n // ====================\n const { description } = await inquirer.prompt({\n type: 'input',\n name: 'description',\n default: workspaceName,\n message: 'Please enter a description of your package',\n });\n\n // ====================\n // version\n // ====================\n let version: string | undefined;\n while (!version) {\n const { value } = await inquirer.prompt({\n type: 'input',\n name: 'value',\n default: '0.0.0',\n message: 'Please enter the initial version',\n });\n\n if (value) {\n version = value;\n }\n }\n\n // ====================\n // keywords\n // ====================\n const { rawKeywords } = await inquirer.prompt({\n type: 'input',\n name: 'rawKeywords',\n message: 'Enter as many keywords, if any, as needed, separated by commas',\n });\n\n const keywords = (rawKeywords as string)\n .split(',')\n .map((word) => word.trim())\n .filter((word) => word.length);\n\n // ====================\n // scripts\n // ====================\n const scriptsTemplates = config.scripts;\n let scriptsTemplate: ProjectScriptsTemplate | undefined;\n if (scriptsTemplates && scriptsTemplates.length) {\n const { value } = await inquirer.prompt({\n type: 'rawlist',\n message: 'Select a scripts template',\n name: 'value',\n choices: [\n { name: 'None', value: '' },\n ...scriptsTemplates.map((tpl) => ({\n name: tpl.name,\n value: tpl.name,\n })),\n ],\n });\n scriptsTemplate = scriptsTemplates.find((tpl) => tpl.name === value);\n }\n const scripts = scriptsTemplate?.scripts || {};\n\n // ====================\n // peerDependencies\n // ====================\n const peerDependencies = await (async () => {\n const { deps } = await inquirer.prompt<{ deps: string[] }>({\n type: 'checkbox',\n message:\n 'Select the dependent packages, if any, to be used in the package',\n name: 'deps',\n choices: Object.keys(config.peerDependencies).map((dep) => ({\n name: dep,\n value: dep,\n })),\n });\n if (!deps.length) return;\n return Object.fromEntries(\n deps.map((dep) => [dep, config.peerDependencies[dep]]),\n );\n })();\n\n // ====================\n // dependencies\n // ====================\n const dependencies = await (async () => {\n const { deps } = await inquirer.prompt<{ deps: string[] }>({\n type: 'checkbox',\n message: 'Select the internal package to be used, if any.',\n name: 'deps',\n choices: project.resolvedWorkspaces.map((workspace) => {\n const name = path.basename(workspace);\n return {\n name,\n value: name,\n };\n }),\n });\n if (!deps.length) return;\n return Object.fromEntries(\n deps.map((dep) => [`@${project.name}/${dep}`, 'workspace:*']),\n );\n })();\n\n // ====================\n // Generate source files?\n // ====================\n const { withGenSource } = await inquirer.prompt<{ withGenSource: boolean }>({\n type: 'confirm',\n name: 'withGenSource',\n message: 'Generate source files?',\n default: true,\n });\n\n // ====================\n // final confirmation\n // ====================\n const _json: WorkspacePackageJson = {\n name: `@${project.name}/${workspaceName}`,\n type: 'module',\n description,\n version,\n keywords,\n scripts,\n peerDependencies,\n dependencies,\n };\n\n syncWorkspacePackageFields(project.json, _json);\n\n const json = sortPackageJson(_json);\n\n const workspaceDir = path.join(config.workspacesDir, workspaceName);\n\n console.log('');\n console.log('========================================');\n console.log(`Directory: ${workspaceDir}`);\n console.log(`Generate source: ${withGenSource ? 'Yes' : 'No'}`);\n console.log(json);\n console.log('========================================');\n\n const { confirmation } = await inquirer.prompt<{ confirmation: boolean }>({\n type: 'confirm',\n name: 'confirmation',\n message: 'Is this OK?',\n default: true,\n });\n\n if (!confirmation) {\n console.log('Skipped.');\n process.exit(1);\n }\n\n // 1. Create directory\n await fs.mkdir(workspaceDir);\n\n // 2. Write package.json\n await fs.writeFile(\n path.join(workspaceDir, 'package.json'),\n JSON.stringify(json, null, 2),\n );\n\n // 3. Write README.md\n await fs.writeFile(path.join(workspaceDir, 'README.md'), config.readme(json));\n\n // 3. Generate source\n if (withGenSource) {\n const srcDir = path.join(workspaceDir, 'src');\n await fs.mkdir(srcDir);\n\n const indexCode = `export * from './${workspaceName}';\\n`;\n const modCode = `export const PACKAGE_NAME = './${workspaceName}';\\n`;\n\n await fs.writeFile(path.join(srcDir, 'index.ts'), indexCode);\n await fs.writeFile(path.join(srcDir, `${workspaceName}.ts`), modCode);\n\n const { tsconfig } = config;\n if (tsconfig) {\n await fs.writeFile(\n path.join(workspaceDir, 'tsconfig.json'),\n JSON.stringify(tsconfig, null, 2),\n );\n }\n\n const configFileCode = `${`\nimport { defineWorkspaceConfig } from '@fastkit/plugboy';\n\nexport default defineWorkspaceConfig({\n entries: {\n '.': './src/index.ts',\n },\n});\n `.trim()}\\n`;\n await fs.writeFile(\n path.join(workspaceDir, `${WORKSPACE_CONFIG_BASENAME}.ts`),\n configFileCode,\n );\n\n const workspace = await getWorkspace(workspaceDir);\n await workspace.preparePackageJSON();\n }\n}\n"],"mappings":"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","names":["fileName","path","bundleRequire","bundleRequire","path","fs","path","fs","fs","path","path","fs","fs","path","glob","path","fs","path","pkg","glob","css","fs","path","glob","glob","fs","path","fs","path","path","fs","build","path","fs","sortPackageJson","path","sortPackageJson","fs"]}
|
package/dist/cli.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
generateWorkspace,
|
|
3
3
|
getWorkspace
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-DMR7ZFGP.mjs";
|
|
5
5
|
|
|
6
6
|
// src/cli.ts
|
|
7
7
|
import { cac } from "cac";
|
|
@@ -9,7 +9,7 @@ import { cac } from "cac";
|
|
|
9
9
|
// package.json
|
|
10
10
|
var package_default = {
|
|
11
11
|
name: "@fastkit/plugboy",
|
|
12
|
-
version: "0.1.
|
|
12
|
+
version: "0.1.10",
|
|
13
13
|
description: "",
|
|
14
14
|
keywords: [],
|
|
15
15
|
repository: {
|
package/dist/cli.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../package.json"],"sourcesContent":["import { cac } from 'cac';\nimport { getWorkspace, generateWorkspace } from './workspace';\nimport pkg from '../package.json';\n\nexport async function main() {\n const cli = cac('plugboy');\n cli.version(pkg.version);\n\n cli\n .command('json', 'Apply workspace settings in package.json.')\n .action(async (files, options) => {\n const workspace = await getWorkspace();\n await workspace.preparePackageJSON();\n });\n\n cli\n .command('stub', 'Link workspace distributions and source directories.')\n .action(async (files, options) => {\n const workspace = await getWorkspace();\n await workspace.preparePackageJSON();\n await workspace.stub();\n });\n\n cli\n .command(\n 'build',\n 'Guess all entries in the workspace and bundle the source code.',\n )\n .action(async (files, options) => {\n const workspace = await getWorkspace();\n await workspace.preparePackageJSON();\n await workspace.build();\n });\n\n cli\n .command('clean', 'Deletes the distribution directory of the workspace.')\n .action(async (files, options) => {\n const workspace = await getWorkspace();\n await workspace.preparePackageJSON();\n await workspace.clean();\n });\n\n cli\n .command(\n 'generate [workspaceName]',\n 'Generate a workspace for your project.',\n )\n .alias('gen')\n .action(async (workspaceName: string | undefined, options) => {\n await generateWorkspace(workspaceName);\n });\n\n cli.help();\n cli.parse();\n}\n\nmain();\n","{\n \"name\": \"@fastkit/plugboy\",\n \"version\": \"0.1.
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../package.json"],"sourcesContent":["import { cac } from 'cac';\nimport { getWorkspace, generateWorkspace } from './workspace';\nimport pkg from '../package.json';\n\nexport async function main() {\n const cli = cac('plugboy');\n cli.version(pkg.version);\n\n cli\n .command('json', 'Apply workspace settings in package.json.')\n .action(async (files, options) => {\n const workspace = await getWorkspace();\n await workspace.preparePackageJSON();\n });\n\n cli\n .command('stub', 'Link workspace distributions and source directories.')\n .action(async (files, options) => {\n const workspace = await getWorkspace();\n await workspace.preparePackageJSON();\n await workspace.stub();\n });\n\n cli\n .command(\n 'build',\n 'Guess all entries in the workspace and bundle the source code.',\n )\n .action(async (files, options) => {\n const workspace = await getWorkspace();\n await workspace.preparePackageJSON();\n await workspace.build();\n });\n\n cli\n .command('clean', 'Deletes the distribution directory of the workspace.')\n .action(async (files, options) => {\n const workspace = await getWorkspace();\n await workspace.preparePackageJSON();\n await workspace.clean();\n });\n\n cli\n .command(\n 'generate [workspaceName]',\n 'Generate a workspace for your project.',\n )\n .alias('gen')\n .action(async (workspaceName: string | undefined, options) => {\n await generateWorkspace(workspaceName);\n });\n\n cli.help();\n cli.parse();\n}\n\nmain();\n","{\n \"name\": \"@fastkit/plugboy\",\n \"version\": \"0.1.10\",\n \"description\": \"\",\n \"keywords\": [],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/dadajam4/fastkit.git\"\n },\n \"license\": \"MIT\",\n \"author\": \"dadajam4\",\n \"type\": \"module\",\n \"exports\": {\n \"./package.json\": \"./package.json\",\n \"./dependencies/bundle-require\": {\n \"import\": \"./dist/dependencies/bundle-require.mjs\"\n },\n \"./dependencies/cac\": {\n \"import\": \"./dist/dependencies/cac\"\n },\n \"./dependencies/esbuild\": {\n \"import\": \"./dist/dependencies/esbuild\"\n },\n \"./dependencies/glob\": {\n \"import\": \"./dist/dependencies/glob\"\n },\n \"./dependencies/inquirer\": {\n \"import\": \"./dist/dependencies/inquirer\"\n },\n \"./dependencies/pkg-types\": {\n \"import\": \"./dist/dependencies/pkg-types\"\n },\n \"./dependencies/sort-package-json\": {\n \"import\": \"./dist/dependencies/sort-package-json\"\n },\n \"./dependencies/tsup\": {\n \"import\": \"./dist/dependencies/tsup\"\n },\n \"./cli\": {\n \"import\": \"./dist/cli.mjs\"\n },\n \".\": {\n \"import\": \"./dist/plugboy.mjs\"\n }\n },\n \"main\": \"./dist/plugboy.mjs\",\n \"types\": \"./dist/plugboy.d.ts\",\n \"typesVersions\": {\n \"*\": {\n \".\": [\n \"./dist/plugboy.d.ts\"\n ],\n \"cli\": [\n \"./dist/cli.d.ts\"\n ],\n \"dependencies/*\": [\n \"./dist/dependencies/*.d.ts\"\n ]\n }\n },\n \"bin\": {\n \"plugboy\": \"./cli.mjs\"\n },\n \"files\": [\n \"env.d.ts\",\n \"cli.mjs\",\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"clean\": \"rm -rf .turbo && rm -rf node_modules && rm -rf dist\",\n \"eslint\": \"eslint . --ext ts,tsx,js,vue,html,yaml\",\n \"eslint:fix\": \"eslint . --ext ts,tsx,js,vue,html,yaml --fix\",\n \"lint\": \"pnpm run eslint\",\n \"format\": \"pnpm run eslint:fix\",\n \"typecheck\": \"tsc --noEmit --skipLibCheck\",\n \"test\": \"vitest run\"\n },\n \"dependencies\": {\n \"bundle-require\": \"^4.0.1\",\n \"cac\": \"^6.7.14\",\n \"cssnano\": \"^6.0.1\",\n \"esbuild\": \"^0.18.20\",\n \"execa\": \"^7.2.0\",\n \"glob\": \"^9.3.5\",\n \"inquirer\": \"^9.2.10\",\n \"pkg-types\": \"^1.0.3\",\n \"sort-package-json\": \"^2.5.1\",\n \"tsup\": \"^7.2.0\"\n },\n \"devDependencies\": {\n \"@types/inquirer\": \"^9.0.3\"\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/postcss/plugins/combine-rules.ts"],"sourcesContent":["import postcss, { Plugin, Root, Container, Rule } from 'postcss';\n\nexport type RuleFilter = string | RegExp;\n\nexport type RuleSpecFn = (rule: Rule) => boolean;\n\nexport type RuleSpec = RuleFilter[] | RuleSpecFn;\n\nexport interface CombineRulesOptions {\n rules: RuleSpec;\n}\n\nfunction buildFilterFn(spec: RuleSpec): RuleSpecFn {\n return (rule) => {\n if (typeof spec === 'function') return spec(rule);\n const { selector } = rule;\n return spec.some((target) => {\n if (typeof target === 'string') return selector === target;\n return target.test(selector);\n });\n };\n}\n\nexport function combineContainerRules(\n container: Container,\n filter: RuleSpecFn,\n) {\n const { nodes } = container;\n if (!nodes) return;\n\n const rules: Rule[] = (nodes as Rule[]).filter(filter);\n const combinedRules: { selector: string; rules: Rule[]; container: Rule }[] =\n [];\n rules.forEach((rule) => {\n const { selector } = rule;\n let combinedRule = combinedRules.find((c) => c.selector === selector);\n if (!combinedRule) {\n combinedRule = {\n selector,\n rules: [],\n container: rule,\n };\n combinedRules.push(combinedRule);\n }\n combinedRule.rules.push(rule);\n });\n\n combinedRules.forEach((combinedRule) => {\n combinedRule.rules.forEach((rule, index) => {\n if (index === 0) return;\n // eslint-disable-next-line no-shadow\n const { nodes } = rule;\n if (!nodes) return;\n nodes.forEach((node) => {\n combinedRule.container.append(node.clone());\n });\n rule.remove();\n });\n });\n}\n\nexport function combineRules(\n css: string | { toString(): string } | Root,\n opts: CombineRulesOptions,\n): Root {\n const root = css instanceof Root ? css : postcss.parse(css);\n const filter = buildFilterFn(opts.rules);\n combineContainerRules(root, filter);\n root.walkAtRules((atRule) => {\n combineContainerRules(atRule, filter);\n });\n return root;\n}\n\nconst PLUGIN_NAME = 'combine-rules';\n\nexport function CombineRules(opts: CombineRulesOptions): Plugin {\n return {\n postcssPlugin: PLUGIN_NAME,\n Once(root) {\n combineRules(root, opts);\n },\n };\n}\n\nCombineRules.postcss = true;\n\nexport default CombineRules;\n"],"mappings":";AAAA,OAAO,WAAmB,YAA6B;AAYvD,SAAS,cAAc,MAA4B;AACjD,SAAO,CAAC,SAAS;AACf,QAAI,OAAO,SAAS;AAAY,aAAO,KAAK,IAAI;AAChD,UAAM,EAAE,SAAS,IAAI;AACrB,WAAO,KAAK,KAAK,CAAC,WAAW;AAC3B,UAAI,OAAO,WAAW;AAAU,eAAO,aAAa;AACpD,aAAO,OAAO,KAAK,QAAQ;AAAA,IAC7B,CAAC;AAAA,EACH;AACF;AAEO,SAAS,sBACd,WACA,QACA;AACA,QAAM,EAAE,MAAM,IAAI;AAClB,MAAI,CAAC;AAAO;AAEZ,QAAM,QAAiB,MAAiB,OAAO,MAAM;AACrD,QAAM,gBACJ,CAAC;AACH,QAAM,QAAQ,CAAC,SAAS;AACtB,UAAM,EAAE,SAAS,IAAI;AACrB,QAAI,eAAe,cAAc,KAAK,CAAC,MAAM,EAAE,aAAa,QAAQ;AACpE,QAAI,CAAC,cAAc;AACjB,qBAAe;AAAA,QACb;AAAA,QACA,OAAO,CAAC;AAAA,QACR,WAAW;AAAA,MACb;AACA,oBAAc,KAAK,YAAY;AAAA,IACjC;AACA,iBAAa,MAAM,KAAK,IAAI;AAAA,EAC9B,CAAC;AAED,gBAAc,QAAQ,CAAC,iBAAiB;AACtC,iBAAa,MAAM,QAAQ,CAAC,MAAM,UAAU;AAC1C,UAAI,UAAU;AAAG;AAEjB,YAAM,EAAE,OAAAA,OAAM,IAAI;AAClB,UAAI,CAACA;AAAO;AACZ,MAAAA,OAAM,QAAQ,CAAC,SAAS;AACtB,qBAAa,UAAU,OAAO,KAAK,MAAM,CAAC;AAAA,MAC5C,CAAC;AACD,WAAK,OAAO;AAAA,IACd,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,aACd,KACA,MACM;AACN,QAAM,OAAO,eAAe,OAAO,MAAM,QAAQ,MAAM,GAAG;AAC1D,QAAM,SAAS,cAAc,KAAK,KAAK;AACvC,wBAAsB,MAAM,MAAM;AAClC,OAAK,YAAY,CAAC,WAAW;AAC3B,0BAAsB,QAAQ,MAAM;AAAA,EACtC,CAAC;AACD,SAAO;AACT;AAEA,IAAM,cAAc;AAEb,SAAS,aAAa,MAAmC;AAC9D,SAAO;AAAA,IACL,eAAe;AAAA,IACf,KAAK,MAAM;AACT,mBAAa,MAAM,IAAI;AAAA,IACzB;AAAA,EACF;AACF;AAEA,aAAa,UAAU;AAEvB,IAAO,wBAAQ;","names":["nodes"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/dependencies/inquirer.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../src/dependencies/inquirer.ts"],"sourcesContent":["import inquirer from 'inquirer';\n\nexport * from 'inquirer';\n\nexport default inquirer;\n"],"mappings":";AAAA,OAAO,cAAc;AAErB,cAAc;AAEd,IAAO,mBAAQ;","names":[]}
|
|
@@ -6,11 +6,9 @@ function resolveFilter(spec, defaults) {
|
|
|
6
6
|
if (typeof spec === "function")
|
|
7
7
|
return spec;
|
|
8
8
|
const conditions = Array.isArray(spec) ? spec : [spec];
|
|
9
|
-
return (layerName) =>
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
});
|
|
13
|
-
};
|
|
9
|
+
return (layerName) => conditions.some(
|
|
10
|
+
(condition) => typeof condition === "string" ? layerName.includes(condition) : condition.test(layerName)
|
|
11
|
+
);
|
|
14
12
|
}
|
|
15
13
|
function optimizeLayer(css, opts = {}) {
|
|
16
14
|
const root = css instanceof Root ? css : postcss.parse(css);
|
|
@@ -19,7 +17,7 @@ function optimizeLayer(css, opts = {}) {
|
|
|
19
17
|
const exclude = resolveFilter(opts.exclude, false);
|
|
20
18
|
const getLayer = (layerRule) => {
|
|
21
19
|
const name = layerRule.params;
|
|
22
|
-
const layer = layers.find((
|
|
20
|
+
const layer = layers.find((_layer) => _layer.name === name);
|
|
23
21
|
if (layer)
|
|
24
22
|
return {
|
|
25
23
|
layer,
|
|
@@ -64,4 +62,4 @@ export {
|
|
|
64
62
|
optimize_layer_default as default,
|
|
65
63
|
optimizeLayer
|
|
66
64
|
};
|
|
67
|
-
//# sourceMappingURL=optimize-layer-
|
|
65
|
+
//# sourceMappingURL=optimize-layer-YPXEP6I3.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/postcss/plugins/optimize-layer.ts"],"sourcesContent":["import postcss, { AtRule, Plugin, Root } from 'postcss';\n\ntype Filter = (layerName: string, rule: AtRule) => boolean;\n\ntype FilterSpec = string | RegExp | (string | RegExp)[] | Filter;\n\nexport interface OptimizeLayerOptions {\n include?: FilterSpec;\n exclude?: FilterSpec;\n}\n\nfunction resolveFilter(\n spec: FilterSpec | undefined,\n defaults: boolean,\n): Filter {\n if (!spec) return () => defaults;\n if (typeof spec === 'function') return spec;\n const conditions = Array.isArray(spec) ? spec : [spec];\n return (layerName) =>\n conditions.some((condition) =>\n typeof condition === 'string'\n ? layerName.includes(condition)\n : condition.test(layerName),\n );\n}\n\ninterface Layer {\n name: string;\n rule: AtRule;\n}\n\nexport function optimizeLayer(\n css: string | { toString(): string } | Root,\n opts: OptimizeLayerOptions = {},\n): Root {\n const root = css instanceof Root ? css : postcss.parse(css);\n const layers: Layer[] = [];\n const include = resolveFilter(opts.include, true);\n const exclude = resolveFilter(opts.exclude, false);\n\n const getLayer = (\n layerRule: AtRule,\n ): {\n layer: Layer;\n atFirst: boolean;\n } => {\n const name = layerRule.params;\n const layer = layers.find((_layer) => _layer.name === name);\n if (layer)\n return {\n layer,\n atFirst: false,\n };\n\n const created: Layer = { name, rule: layerRule };\n layers.push(created);\n return {\n layer: created,\n atFirst: true,\n };\n };\n\n root.walkAtRules('layer', (layerRule) => {\n if (layerRule.parent?.type !== 'root') return;\n const { params, nodes } = layerRule;\n if (!nodes || !include(params, layerRule) || exclude(params, layerRule))\n return;\n\n const { layer, atFirst } = getLayer(layerRule);\n\n if (atFirst) return;\n\n layerRule.nodes.forEach((node) => {\n layer.rule.append(node.clone());\n });\n\n layerRule.remove();\n });\n\n return root;\n}\n\nconst PLUGIN_NAME = 'optimize-layer';\n\nexport function OptimizeLayer(opts?: OptimizeLayerOptions): Plugin {\n return {\n postcssPlugin: PLUGIN_NAME,\n Once(root) {\n optimizeLayer(root, opts);\n },\n };\n}\n\nOptimizeLayer.postcss = true;\n\nexport default OptimizeLayer;\n"],"mappings":";AAAA,OAAO,WAA2B,YAAY;AAW9C,SAAS,cACP,MACA,UACQ;AACR,MAAI,CAAC;AAAM,WAAO,MAAM;AACxB,MAAI,OAAO,SAAS;AAAY,WAAO;AACvC,QAAM,aAAa,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AACrD,SAAO,CAAC,cACN,WAAW;AAAA,IAAK,CAAC,cACf,OAAO,cAAc,WACjB,UAAU,SAAS,SAAS,IAC5B,UAAU,KAAK,SAAS;AAAA,EAC9B;AACJ;AAOO,SAAS,cACd,KACA,OAA6B,CAAC,GACxB;AACN,QAAM,OAAO,eAAe,OAAO,MAAM,QAAQ,MAAM,GAAG;AAC1D,QAAM,SAAkB,CAAC;AACzB,QAAM,UAAU,cAAc,KAAK,SAAS,IAAI;AAChD,QAAM,UAAU,cAAc,KAAK,SAAS,KAAK;AAEjD,QAAM,WAAW,CACf,cAIG;AACH,UAAM,OAAO,UAAU;AACvB,UAAM,QAAQ,OAAO,KAAK,CAAC,WAAW,OAAO,SAAS,IAAI;AAC1D,QAAI;AACF,aAAO;AAAA,QACL;AAAA,QACA,SAAS;AAAA,MACX;AAEF,UAAM,UAAiB,EAAE,MAAM,MAAM,UAAU;AAC/C,WAAO,KAAK,OAAO;AACnB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,SAAS;AAAA,IACX;AAAA,EACF;AAEA,OAAK,YAAY,SAAS,CAAC,cAAc;AACvC,QAAI,UAAU,QAAQ,SAAS;AAAQ;AACvC,UAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,QAAI,CAAC,SAAS,CAAC,QAAQ,QAAQ,SAAS,KAAK,QAAQ,QAAQ,SAAS;AACpE;AAEF,UAAM,EAAE,OAAO,QAAQ,IAAI,SAAS,SAAS;AAE7C,QAAI;AAAS;AAEb,cAAU,MAAM,QAAQ,CAAC,SAAS;AAChC,YAAM,KAAK,OAAO,KAAK,MAAM,CAAC;AAAA,IAChC,CAAC;AAED,cAAU,OAAO;AAAA,EACnB,CAAC;AAED,SAAO;AACT;AAEA,IAAM,cAAc;AAEb,SAAS,cAAc,MAAqC;AACjE,SAAO;AAAA,IACL,eAAe;AAAA,IACf,KAAK,MAAM;AACT,oBAAc,MAAM,IAAI;AAAA,IAC1B;AAAA,EACF;AACF;AAEA,cAAc,UAAU;AAExB,IAAO,yBAAQ;","names":[]}
|
|
@@ -9,11 +9,9 @@ function resolveFilter(spec, defaults) {
|
|
|
9
9
|
if (typeof spec === "function")
|
|
10
10
|
return spec;
|
|
11
11
|
const conditions = Array.isArray(spec) ? spec : [spec];
|
|
12
|
-
return (layerName) =>
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
});
|
|
16
|
-
};
|
|
12
|
+
return (layerName) => conditions.some(
|
|
13
|
+
(condition) => typeof condition === "string" ? layerName.includes(condition) : condition.test(layerName)
|
|
14
|
+
);
|
|
17
15
|
}
|
|
18
16
|
function parseMedia(mediaRule) {
|
|
19
17
|
const { params, parent } = mediaRule;
|
|
@@ -102,4 +100,4 @@ export {
|
|
|
102
100
|
optimize_media_default as default,
|
|
103
101
|
optimizeMedia
|
|
104
102
|
};
|
|
105
|
-
//# sourceMappingURL=optimize-media-
|
|
103
|
+
//# sourceMappingURL=optimize-media-7XHMOJTD.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/postcss/plugins/optimize-media.ts"],"sourcesContent":["import postcss, {\n AtRule,\n Plugin,\n Root,\n Container,\n ChildNode,\n Comment,\n} from 'postcss';\n\ninterface Media {\n query: string;\n rule: AtRule;\n container: Container;\n}\n\ntype Filter = (query: string, media: Media) => boolean;\n\ntype FilterSpec = string | RegExp | (string | RegExp)[] | Filter;\n\nfunction resolveFilter(\n spec: FilterSpec | undefined,\n defaults: boolean,\n): Filter {\n if (!spec) return () => defaults;\n if (typeof spec === 'function') return spec;\n const conditions = Array.isArray(spec) ? spec : [spec];\n return (layerName) =>\n conditions.some((condition) =>\n typeof condition === 'string'\n ? layerName.includes(condition)\n : condition.test(layerName),\n );\n}\n\ntype SortMedia = (a: Media, b: Media) => number;\n\nexport interface OptimizeMediaOptions {\n include?: FilterSpec;\n exclude?: FilterSpec;\n sort?: SortMedia;\n}\n\nfunction parseMedia(mediaRule: AtRule): Media {\n const { params, parent } = mediaRule;\n if (!parent) {\n throw mediaRule.error('@media rules require a parent container.');\n }\n return {\n query: params,\n rule: mediaRule,\n container: parent,\n };\n}\n\nfunction isSourceMapAnnotation(node: ChildNode | undefined): node is Comment {\n if (!node) return false;\n if (node.type !== 'comment') return false;\n return node.text.toLowerCase().startsWith('# sourcemappingurl=');\n}\n\nfunction getSourceMapAnnotation(container: Container): ChildNode | undefined {\n const maybeAnnotation = container.last;\n if (isSourceMapAnnotation(maybeAnnotation)) {\n return maybeAnnotation;\n }\n}\n\nexport function optimizeMedia(\n css: string | { toString(): string } | Root,\n opts: OptimizeMediaOptions = {},\n): Root {\n const root = css instanceof Root ? css : postcss.parse(css);\n const include = resolveFilter(opts.include, true);\n const exclude = resolveFilter(opts.exclude, false);\n\n const sourceMap = getSourceMapAnnotation(root);\n\n const containerMap = new Map<Container, Media[]>();\n\n root.walkAtRules('media', (mediaRule) => {\n const media = parseMedia(mediaRule);\n if (\n !mediaRule.nodes ||\n !include(media.query, media) ||\n exclude(media.query, media)\n )\n return;\n\n let bucket = containerMap.get(media.container);\n if (!bucket) {\n bucket = [];\n containerMap.set(media.container, bucket);\n }\n bucket.push(media);\n });\n\n containerMap.forEach((bucket, container) => {\n if (opts.sort) {\n bucket.sort(opts.sort);\n }\n\n const combinedRules: {\n query: string;\n medias: Media[];\n }[] = [];\n\n bucket.forEach((media) => {\n let rule = combinedRules.find((r) => r.query === media.query);\n if (!rule) {\n rule = { query: media.query, medias: [] };\n combinedRules.push(rule);\n }\n rule.medias.push(media);\n });\n\n combinedRules.forEach((rule) => {\n const nodes = rule.medias\n .map((media) => media.rule.nodes.map((node) => node.clone()))\n .flat();\n const newAtRule = new AtRule({\n name: 'media',\n params: rule.query,\n nodes,\n });\n rule.medias.forEach((media) => media.rule.remove());\n container.append(newAtRule);\n });\n });\n\n containerMap.clear();\n\n if (sourceMap) {\n root.append(sourceMap);\n }\n\n return root;\n}\n\nconst PLUGIN_NAME = 'optimize-media';\n\nexport function OptimizeMedia(opts?: OptimizeMediaOptions): Plugin {\n return {\n postcssPlugin: PLUGIN_NAME,\n Once(root) {\n optimizeMedia(root, opts);\n },\n };\n}\n\nOptimizeMedia.postcss = true;\n\nexport default OptimizeMedia;\n"],"mappings":"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","names":[]}
|
package/dist/plugboy.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Options } from 'tsup';
|
|
2
|
+
import { Plugin as Plugin$1, OutputFile } from 'esbuild';
|
|
2
3
|
import fs from 'node:fs';
|
|
3
4
|
import { PackageJson } from 'pkg-types';
|
|
4
|
-
import { Plugin as Plugin$1, OutputFile } from 'esbuild';
|
|
5
|
-
import { AtRule, Container, Rule } from 'postcss';
|
|
6
5
|
import { Options as Options$1 } from 'cssnano';
|
|
6
|
+
import { AtRule, Container, Rule } from 'postcss';
|
|
7
7
|
import { CompilerOptions } from 'typescript';
|
|
8
8
|
|
|
9
9
|
type ESBuildPluginType = NonNullable<Options['esbuildPlugins']>[number];
|
package/dist/plugboy.mjs
CHANGED
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/hook.ts","../src/types/dts.ts","../src/types/css.ts","../src/types/workspace.ts","../src/types/project.ts","../src/utils/general.ts","../src/utils/file.ts","../src/utils/expose.ts","../src/utils/project.ts","../src/constants.ts","../src/utils/plugin.ts","../src/utils/workspace.ts","../src/utils/hook.ts","../src/path.ts","../src/package.ts","../src/workspace/builder.ts","../src/workspace/dts.ts","../src/project/project.ts","../src/workspace/workspace.ts","../src/workspace/generate.ts"],"sourcesContent":["import type { Listable } from '../utils';\nimport { WorkspaceSetupContext, WorkspacePackageJson } from './workspace';\nimport type { PlugboyWorkspace, Builder } from '../workspace';\nimport type { OutputFile } from 'esbuild';\n\n/** plugboy hook definition */\nexport interface HookTypes {\n /**\n * Hooks during workspace setup\n * @remarks Called just before the workspace instance is created\n * @param ctx - {@link WorkspaceSetupContext Workspace setup context object}\n */\n setupWorkspace: (ctx: WorkspaceSetupContext) => any;\n /**\n * Hooks after workspace generation\n * @param workspace - {@link PlugboyWorkspace workspace instance}\n */\n createWorkspace: (workspace: PlugboyWorkspace) => any;\n /**\n * Hooks when correcting package.json\n * @param json - package.json just before it was modified and saved by the plugboy\n * @param workspace - {@link PlugboyWorkspace workspace instance}\n */\n preparePackageJSON: (\n json: WorkspacePackageJson,\n workspace: PlugboyWorkspace,\n ) => any;\n /**\n * Hooks when successful build\n * @param builder - Builder\n * @param outputFiles - List of output files\n *\n * @note\n * The text information contained in outputFiles may have already been rewritten by plugboy and output as files.\n * If you wish to perform text replacement, etc., be sure to do so on the read file.\n *\n * @see {@link OutputFile}\n */\n onSuccess: (builder: Builder, outputFiles: OutputFile[]) => any;\n}\n\nexport function createHooksDefaults(): ResolvedHooks {\n return {\n setupWorkspace: [],\n createWorkspace: [],\n preparePackageJSON: [],\n onSuccess: [],\n };\n}\n\nexport type HookName = keyof HookTypes;\n\n/**\n * plugboy user hook definition\n * @see {@link HookTypes}\n */\nexport type UserHooks = {\n [Name in HookName]?: Listable<HookTypes[Name]>;\n};\n\n/**\n * Pre-setup hook definitions\n * @see {@link HookTypes}\n */\nexport type ResolvedHooks = {\n [Name in HookName]: HookTypes[Name][];\n};\n\nexport type HookArgs<Name extends HookName> = Parameters<HookTypes[Name]>;\n\nexport type UnPromisify<T> = T extends Promise<infer U> ? U : T;\n\nexport type HookReturnType<Name extends HookName> = UnPromisify<\n ReturnType<HookTypes[Name]>\n>;\n\n/**\n * Map of hook methods that can be initialized and called\n * @see {@link HookTypes}\n */\nexport type BuildedHooks = {\n [Name in HookName]: (\n ...args: HookArgs<Name>\n ) => Promise<HookReturnType<Name>>;\n};\n","import type { Builder } from '../workspace';\n\n/**\n * Type preservation target in d.ts file\n */\nexport interface DTSPreserveTypeTarget {\n /** Type name */\n typeName: string;\n /**\n * String to be restored or regular expression to match\n */\n from: string | RegExp;\n}\n\n/**\n * Type preservation target in d.ts file (normalized)\n *\n * @see {@link DTSPreserveTypeTarget}\n */\nexport interface NormalizedDTSPreserveTypeTarget\n extends Omit<DTSPreserveTypeTarget, 'from'> {\n /** Regular expression to match the string to be restored */\n from: RegExp;\n}\n\nexport function normalizeDTSPreserveTypeTarget(\n target: DTSPreserveTypeTarget,\n): NormalizedDTSPreserveTypeTarget {\n const { from, typeName } = target;\n return {\n from: typeof from === 'string' ? new RegExp(`${from}`, 'g') : from,\n typeName,\n };\n}\n\n/**\n * Type preservation setting for d.ts files\n *\n * @remarks This setting is for restoring type information inlined by the TypeScript compiler to the original type name by string substitution.\n */\nexport interface DTSPreserveTypeSettings {\n /** Name of the package to which the type to be restored belongs */\n pkg?: string;\n /** List of preservation targets */\n targets: DTSPreserveTypeTarget[];\n}\n\n/**\n * Type preservation setting for d.ts files (normalized)\n *\n * @see {@link DTSPreserveTypeSettings}\n */\nexport interface NormalizedDTSPreserveTypeSettings\n extends Omit<DTSPreserveTypeSettings, 'targets'> {\n /** List of normalized type preservation targets */\n targets: NormalizedDTSPreserveTypeTarget[];\n}\n\nexport function normalizeDTSPreserveTypeSettings(\n settings: DTSPreserveTypeSettings,\n): NormalizedDTSPreserveTypeSettings {\n return {\n ...settings,\n targets: settings.targets.map(normalizeDTSPreserveTypeTarget),\n };\n}\n\n/**\n * Function to normalize d.ts strings\n * @param dts - Bundled d.ts strings\n * @param builder - Builder\n */\nexport type DTSNormalizer = (\n dts: string,\n builder: Builder,\n) => string | undefined | void | Promise<string | undefined | void>;\n\n/**\n * d.ts output setting\n */\nexport interface DTSSettings {\n /**\n * Inline output without bundling d.ts\n *\n * @default false\n */\n inline?: boolean;\n\n /**\n * list of type preservation settings\n *\n * @remarks This setting is for restoring type information inlined by the TypeScript compiler to the original type name by string substitution.\n *\n * @see {@link DTSPreserveTypeSettings}\n */\n preserveType?: DTSPreserveTypeSettings[];\n\n /**\n * list of function to normalize d.ts strings\n */\n normalizers?: DTSNormalizer[];\n}\n\n/**\n * d.ts output setting (normalized)\n *\n * @see {@link DTSSettings}\n */\nexport interface NormalizedDTSSettings {\n /**\n * Inline output without bundling d.ts\n */\n inline: boolean;\n\n /**\n * list of type preservation settings\n */\n preserveType: NormalizedDTSPreserveTypeSettings[];\n\n /**\n * list of function to normalize d.ts strings\n */\n normalizers: DTSNormalizer[];\n}\n\nexport function normalizeDTSSettings(\n settings: DTSSettings,\n): NormalizedDTSSettings {\n const {\n inline = false,\n preserveType = [],\n normalizers = [],\n } = settings || {};\n return {\n inline,\n preserveType: preserveType.map(normalizeDTSPreserveTypeSettings),\n normalizers,\n };\n}\n\nexport function mergeDTSSettingsList(\n ...settingsList: (DTSSettings | undefined)[]\n): NormalizedDTSSettings {\n const merged: DTSSettings = {};\n settingsList.forEach((settings) => {\n if (!settings) return;\n const { inline, preserveType, normalizers } = settings;\n if (inline !== undefined) merged.inline = inline;\n if (preserveType) {\n merged.preserveType = merged.preserveType || [];\n merged.preserveType.push(...preserveType);\n }\n if (normalizers) {\n merged.normalizers = merged.normalizers || [];\n merged.normalizers.push(...normalizers);\n }\n });\n return normalizeDTSSettings(merged);\n}\n","import {\n OptimizeLayerOptions,\n OptimizeMediaOptions,\n CombineRulesOptions,\n} from '../postcss';\nimport type { Options } from 'cssnano';\n\n/**\n * CSS optimization options\n */\nexport interface OptimizeCSSOptions {\n /**\n * Layer optimization options\n *\n * Disable the operation with `false`.\n *\n * @default true\n */\n layer?: OptimizeLayerOptions | boolean;\n /**\n * Media Query Optimization Options\n *\n * Disable the operation with `false`.\n *\n * @default true\n */\n media?: OptimizeMediaOptions | boolean;\n /**\n * Combine rules Options\n *\n * If unset, no optimization is performed\n */\n combineRules?: CombineRulesOptions;\n /**\n * Options for [cssnano](https://cssnano.co/)\n *\n * Disable the operation with `false`.\n *\n * @default { preset: ['default', { normalizeWhitespace: false }] }\n */\n cssnano?: Options | boolean;\n}\n\nexport interface ResolvedOptimizeCSSOptions {\n layer?: OptimizeLayerOptions;\n media?: OptimizeMediaOptions;\n combineRules?: CombineRulesOptions;\n cssnano?: Options;\n}\n\nexport function resolveOptimizeCSSOptions(options: OptimizeCSSOptions) {\n const resolved: ResolvedOptimizeCSSOptions = {};\n const { layer = true, media = true, combineRules, cssnano = true } = options;\n if (layer !== false) {\n resolved.layer = layer === true ? {} : layer;\n }\n if (media !== false) {\n resolved.media = media === true ? {} : media;\n }\n if (combineRules) {\n resolved.combineRules = combineRules;\n }\n if (cssnano !== false) {\n resolved.cssnano =\n cssnano === true\n ? { preset: ['default', { normalizeWhitespace: false }] }\n : cssnano;\n }\n return resolved;\n}\n","import type { Path } from '../path';\nimport { RequiredPackageJSON, MarkRequired } from './_utils';\nimport type { PlugboyProject } from '../project';\nimport type { UserPluginOption, Plugin } from './plugin';\nimport type { UserHooks, BuildedHooks } from './hook';\nimport { Options as TSUpOptions } from 'tsup';\nimport { DTSSettings, NormalizedDTSSettings } from './dts';\nimport { OptimizeCSSOptions } from './css';\n\nexport const WORKSPACE_REQUIRED_FIELDS = ['name', 'version'] as const;\n\ntype WorkspaceRequiredField = (typeof WORKSPACE_REQUIRED_FIELDS)[number];\n\n/**\n * Entry setting object\n */\nexport interface RawWorkspaceEntryObject {\n /**\n * Entry file path\n * @remarks It must be relative to the root directory of the workspace.\n */\n src: string;\n /**\n * Set to true if the entry outputs css at the same time\n * @remarks By doing this, the exports field in package.json will be set automatically.\n */\n css?: boolean;\n}\n\n/**\n * Entry setting object\n */\nexport type WorkspaceEntry = MarkRequired<\n RawWorkspaceEntryObject,\n 'src' | 'css'\n>;\n\nexport type RawWorkspaceEntry = string | RawWorkspaceEntryObject;\n\n/**\n * Configuration of all entries in the workspace (normalized)\n *\n * @see {@link RawWorkspaceEntries}\n */\nexport type WorkspaceEntries = Record<string, WorkspaceEntry>;\n\n/**\n * Configuration of all entries in the workspace\n *\n * @remarks The configuration must be `{ [id]: [Entry setting: }`. `\".\" ` is treated as a special ID and is the target of the main export.\n */\nexport type RawWorkspaceEntries = Record<string, RawWorkspaceEntry>;\n\nexport const TSUP_SYNC_OPTIONS = [\n 'define',\n 'noExternal',\n 'external',\n 'replaceNodeEnv',\n 'skipNodeModulesBundle',\n] as const;\n\ntype TSUpSyncOption = (typeof TSUP_SYNC_OPTIONS)[number];\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\ninterface TSUpSyncOptions extends Pick<TSUpOptions, TSUpSyncOption> {}\n\n/**\n * Workspace User Configuration\n */\nexport interface UserWorkspaceConfig extends TSUpSyncOptions {\n /**\n * Ignore project settings\n *\n * @remarks Normally, when processing a workspace, plugboy looks for and merges the settings of the entire project at the same time, but this action can be canceled.\n */\n ignoreProjectConfig?: boolean;\n /**\n * Configuration of all entries in the workspace\n *\n * @see {@link RawWorkspaceEntries}\n */\n entries?: RawWorkspaceEntries;\n /**\n * Hook Setting\n * @see {@link UserHooks}\n */\n hooks?: UserHooks;\n /**\n * Plug-in List\n * @see {@link UserPluginOption}\n */\n plugins?: UserPluginOption[];\n /**\n * d.ts output setting\n * @see {@link DTSSettings}\n */\n dts?: DTSSettings;\n /**\n * CSS optimization options\n *\n * Disable the operation with `false`.\n *\n * @default true\n *\n * @see {@link OptimizeCSSOptions}\n */\n optimizeCSS?: OptimizeCSSOptions | boolean;\n}\n\n/**\n * Workspace Configuration\n */\nexport interface ResolvedWorkspaceConfig\n extends Required<\n Omit<\n UserWorkspaceConfig,\n 'entries' | 'hooks' | 'plugins' | 'dts' | 'optimizeCSS' | TSUpSyncOption\n >\n >,\n TSUpSyncOptions {\n /**\n * Configuration of all entries in the workspace\n *\n * @see {@link WorkspaceEntries}\n */\n entries: WorkspaceEntries;\n /**\n * Hook Setting\n * @see {@link UserHooks}\n */\n hooks?: UserHooks;\n /**\n * Plug-in List\n * @see {@link UserPluginOption}\n */\n plugins: Plugin[];\n /**\n * d.ts output setting\n * @see {@link DTSSettings}\n */\n dts?: DTSSettings;\n /**\n * CSS optimization options\n *\n * Disable the operation with `false`.\n *\n * @see {@link OptimizeCSSOptions}\n */\n optimizeCSS: OptimizeCSSOptions | false;\n}\n\nexport type WorkspacePackageJson = RequiredPackageJSON<WorkspaceRequiredField>;\n\n/**\n * Workspace Directory Settings\n */\nexport interface WorkspaceDirs {\n /** Path instance of the source directory */\n src: Path;\n /** Path instance of the distribution directory */\n dist: Path;\n}\n\n/**\n * Workspace Meta Information\n *\n * @remarks This will be set to a value uniquely extended by the plugin\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface WorkspaceMeta {}\n\n/**\n * Workspace setup context object\n * @remarks Objects that are configured when the workspace is set up. Customization can be done before the workspace instance is created by a plug-in or other process.\n */\nexport interface WorkspaceSetupContext {\n /** Workspace directory path instance */\n dir: Path;\n /** package.json */\n json: WorkspacePackageJson;\n /**\n * Workspace Configuration\n * @see {@link ResolvedWorkspaceConfig}\n */\n config: ResolvedWorkspaceConfig;\n /** Plugboy Project */\n project: PlugboyProject | null;\n /** Workspace Directory Settings */\n dirs: WorkspaceDirs;\n /**\n * All package names on which the workspace depends\n */\n dependencies: string[];\n /**\n * Names of all in-project packages on which the workspace depends\n */\n projectDependencies: string[];\n /**\n * Workspace Meta Information\n * @see {@link WorkspaceMeta}\n */\n meta: WorkspaceMeta;\n /**\n * プラグインリスト\n * @see {@link Plugin}\n */\n plugins: Plugin[];\n /**\n * Map of hook methods that can be initialized and called\n * @see {@link BuildedHooks}\n */\n hooks: BuildedHooks;\n /**\n * d.ts output setting\n * @see {@link NormalizedDTSSettings}\n */\n dts: NormalizedDTSSettings;\n /**\n * CSS optimization options\n *\n * Disable the operation with `false`.\n *\n * @see {@link OptimizeCSSOptions}\n */\n optimizeCSS: OptimizeCSSOptions | false;\n}\n","import { RequiredPackageJSON } from './_utils';\nimport type { CompilerOptions } from 'typescript';\nimport { WorkspacePackageJson } from './workspace';\nimport { UserPluginOption, Plugin } from './plugin';\nimport type { Path } from '../path';\nimport { UserHooks } from './hook';\nimport { DTSSettings } from './dts';\nimport { OptimizeCSSOptions } from './css';\n\nexport const PROJECT_REQUIRED_FIELDS = ['name'] as const;\n\ntype ProjectRequiredField = (typeof PROJECT_REQUIRED_FIELDS)[number];\n\nexport type TSConfigJSON = {\n compilerOptions?: CompilerOptions;\n} & Record<string, any>;\n\n/**\n * Template for package.json script in workspace\n */\nexport interface ProjectScriptsTemplate {\n /** Template Name */\n name: string;\n /** Script Map */\n scripts: Record<string, string>;\n}\n\n/**\n * Project User Configuration\n */\nexport interface UserProjectConfig {\n /**\n * Directory where the workspace is located\n * @remarks Used to create a new workspace with the `plugboy gen` CLI command.\n * @default packages\n */\n workspacesDir?: string;\n /**\n * Workspace script templates, or a list of them\n * @remarks Used to create a new workspace with the `plugboy gen` CLI command.\n */\n scripts?: Record<string, string> | ProjectScriptsTemplate[];\n /**\n * Workspace tsconfig template\n * @remarks Used to create a new workspace with the `plugboy gen` CLI command.\n */\n tsconfig?: TSConfigJSON;\n /**\n * Workspace README template\n * @remarks Used to create a new workspace with the `plugboy gen` CLI command.\n */\n readme?: (json: WorkspacePackageJson) => string;\n /**\n * Fixes the version of all peer dependencies in the project\n */\n peerDependencies?: Record<string, string>;\n /**\n * Hook Setting\n * @see {@link UserHooks}\n */\n hooks?: UserHooks;\n /**\n * Plug-in List\n * @see {@link UserPluginOption}\n */\n plugins?: UserPluginOption[];\n /**\n * d.ts output setting\n * @see {@link DTSSettings}\n */\n dts?: DTSSettings;\n /**\n * CSS optimization options\n *\n * Disable the operation with `false`.\n *\n * @default true\n *\n * @see {@link OptimizeCSSOptions}\n */\n optimizeCSS?: OptimizeCSSOptions | boolean;\n}\n\n/**\n * Project Configuration\n */\n\nexport interface ResolvedProjectConfig\n extends Required<\n Omit<\n UserProjectConfig,\n 'scripts' | 'tsconfig' | 'hooks' | 'plugins' | 'dts' | 'optimizeCSS'\n >\n > {\n /**\n * Workspace script templates list\n * @remarks Used to create a new workspace with the `plugboy gen` CLI command.\n */\n scripts: ProjectScriptsTemplate[];\n /**\n * Workspace tsconfig template\n * @remarks Used to create a new workspace with the `plugboy gen` CLI command.\n */\n tsconfig?: TSConfigJSON;\n /**\n * Hook Setting\n * @see {@link UserHooks}\n */\n hooks?: UserHooks;\n /**\n * Plug-in List\n * @see {@link UserPluginOption}\n */\n plugins: Plugin[];\n /**\n * d.ts output setting\n * @see {@link DTSSettings}\n */\n dts?: DTSSettings;\n /**\n * CSS optimization options\n *\n * Disable the operation with `false`.\n *\n * @see {@link OptimizeCSSOptions}\n */\n optimizeCSS: OptimizeCSSOptions | false;\n}\n\nexport type ProjectPackageJson = RequiredPackageJSON<ProjectRequiredField>;\n\n/**\n * Project setup context object\n * @remarks Objects that are configured when the project is set up.\n */\nexport interface ProjectSetupContext {\n /** Project directory path instance */\n dir: Path;\n /** package.json */\n json: ProjectPackageJson;\n /** Project Configuration */\n config: ResolvedProjectConfig;\n /**\n * List of directory names of workspaces located in the project\n * @remarks Note that it is the directory name, not the package name.\n */\n resolvedWorkspaces: string[];\n}\n","export function isPromise<T = any>(obj: any): obj is Promise<T> {\n return (\n !!obj &&\n (typeof obj === 'object' || typeof obj === 'function') &&\n typeof obj.then === 'function'\n );\n}\n\nexport type Listable<T> =\n | T\n | false\n | null\n | undefined\n | Listable<T>[]\n | Promise<T | false | null | undefined | Listable<T>[]>;\n\nexport async function resolveListable<T>(raw: Listable<T>): Promise<T[]> {\n const result: T[] = [];\n const list = Array.isArray(raw) ? raw : [raw];\n for (let row of list) {\n if (isPromise(row)) {\n row = await row;\n }\n if (!row) continue;\n if (Array.isArray(row)) {\n result.push(...(await resolveListable(row)));\n continue;\n }\n result.push(row);\n }\n return result;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport function getFilename(importMetaURL: string) {\n return fileURLToPath(importMetaURL);\n}\n\nexport function getDirname(importMetaURL: string) {\n return path.dirname(getFilename(importMetaURL));\n}\n\nconst FILE_NOT_FOUND_EXCEPTION_CODES = ['ENOTDIR', 'ENOENT'] as const;\n\nexport function isFileNotFoundException(\n source: unknown,\n): source is NodeJS.ErrnoException {\n return (\n !!source &&\n typeof source === 'object' &&\n FILE_NOT_FOUND_EXCEPTION_CODES.includes(\n (source as NodeJS.ErrnoException).code as any,\n )\n );\n}\n\nexport async function pathExists(\n target: string,\n type?: 'file' | 'dir',\n): Promise<boolean> {\n try {\n const stats = await fs.promises.stat(target);\n if (!type) return true;\n return type === 'file' ? stats.isFile() : stats.isDirectory();\n } catch (err) {\n if (isFileNotFoundException(err)) return false;\n throw err;\n }\n}\n\ntype FileMatcherFn = (\n file: fs.Dirent,\n dir: string,\n) => boolean | Promise<boolean>;\n\ntype FileMatcher = string | RegExp | FileMatcherFn;\n\nfunction normalizeFileMatcher(matcher: FileMatcher): FileMatcherFn {\n if (typeof matcher === 'function') {\n return matcher;\n }\n if (typeof matcher === 'string') {\n return (file) => file.name.includes(matcher);\n }\n return (file) => matcher.test(file.name);\n}\n\nexport async function findFile(\n dir: string,\n matcher: FileMatcher,\n recursive = true,\n): Promise<string | undefined> {\n const files = await fs.promises.readdir(dir, { withFileTypes: true });\n const _matcher = normalizeFileMatcher(matcher);\n\n const dirs: fs.Dirent[] | undefined = recursive ? [] : undefined;\n\n for (const file of files) {\n if (dirs && file.isDirectory()) {\n dirs.push(file);\n continue;\n }\n if (await _matcher(file, dir)) {\n return path.join(dir, file.name);\n }\n }\n\n if (dirs) {\n for (const subDir of dirs) {\n const hit = await findFile(\n path.join(dir, subDir.name),\n _matcher,\n recursive,\n );\n if (hit) return hit;\n }\n }\n}\n\nexport interface FindConfigResult {\n dir: string;\n fileName: string;\n path: string;\n code: string;\n}\n\ninterface FindConfigSettings<AllowMissing extends boolean | undefined> {\n fileName: string | string[];\n allowMissing?: AllowMissing;\n test?: (result: FindConfigResult) => boolean;\n /**\n * Trace up to how many directories above\n * @default 10\n */\n depth?: number;\n}\n\nconst FIND_CONFIG_OR_RE = /\\(.+?\\)/g;\n\nfunction parseFindConfigFileName(source: string): string[] {\n const matches = source.match(FIND_CONFIG_OR_RE);\n if (!matches) return [source];\n return matches\n .map((matched) => {\n const parts = matched.slice(1, matched.length - 1).split('|');\n return parts\n .map((part) => {\n const chunk = source.replace(matched, part);\n return parseFindConfigFileName(chunk);\n })\n .flat();\n })\n .flat();\n}\n\nfunction parseRawFindConfigFileName(source: string | string[]): string[] {\n return Array.isArray(source)\n ? source.map(parseFindConfigFileName).flat()\n : parseFindConfigFileName(source);\n}\n\nexport async function findConfig<\n AllowMissing extends boolean | undefined = false,\n>(\n fileNameOrSettings: string | string[] | FindConfigSettings<AllowMissing>,\n dir = process.cwd(),\n currentDepth = 0,\n): Promise<\n AllowMissing extends true ? FindConfigResult | null : FindConfigResult\n> {\n const settings: FindConfigSettings<AllowMissing> =\n typeof fileNameOrSettings === 'object' && !Array.isArray(fileNameOrSettings)\n ? fileNameOrSettings\n : { fileName: fileNameOrSettings };\n\n const { fileName, test, depth = 10, allowMissing } = settings;\n const fileNames = parseRawFindConfigFileName(fileName);\n if (depth && currentDepth === depth) {\n if (allowMissing) return null as any;\n throw new Error(\n `Failed to retrieve the \"${fileName}\" file because the maximum depth was reached.`,\n );\n }\n\n const next = (err?: unknown) => {\n const nextDir = path.dirname(dir);\n if (nextDir !== dir) {\n return findConfig(settings, nextDir, currentDepth + 1);\n }\n if (allowMissing) return null as any;\n throw err || new Error(`missing config \"${fileName}\"`);\n };\n\n const result = await (async () => {\n for (const fileName of fileNames) {\n try {\n const _path = path.join(dir, fileName);\n const code = await fs.promises.readFile(_path, 'utf-8');\n const result: FindConfigResult = {\n fileName,\n dir,\n path: _path,\n code,\n };\n if (!test || test(result)) {\n return result;\n }\n } catch (err) {\n if (!isFileNotFoundException(err)) {\n throw err;\n }\n }\n }\n })();\n\n if (!result) {\n return next();\n }\n\n return result;\n}\n\nfunction _rmrf(path: string): Promise<void> {\n return fs.promises\n .rm(path, {\n recursive: true,\n force: true,\n })\n .catch((err) => {\n if (isFileNotFoundException(err)) return;\n throw err;\n });\n}\n\nexport async function rmrf(...paths: string[]): Promise<void> {\n await Promise.all(paths.map((path) => _rmrf(path)));\n}\n\nexport function copyDirSync(srcDir: string, destDir: string): void {\n if (!fs.existsSync(srcDir)) return;\n\n fs.mkdirSync(destDir, { recursive: true });\n for (const file of fs.readdirSync(srcDir)) {\n const srcFile = path.resolve(srcDir, file);\n if (srcFile === destDir) {\n continue;\n }\n const destFile = path.resolve(destDir, file);\n const stat = fs.statSync(srcFile);\n if (stat.isDirectory()) {\n copyDirSync(srcFile, destFile);\n } else {\n fs.copyFileSync(srcFile, destFile);\n }\n }\n}\n","import path from 'node:path';\nimport { glob } from 'glob';\nimport { RawWorkspaceEntryObject } from '../types';\n\nexport interface ExposeEntriesSettings {\n dir: string;\n /**\n * Path prefix at distribution\n */\n prefix?: string;\n}\n\nexport type RawExposeEntriesSettings = string | ExposeEntriesSettings;\n\nexport function resolveRawExposeEntriesSettings(\n rawSettings: RawExposeEntriesSettings,\n): ExposeEntriesSettings {\n return typeof rawSettings === 'string' ? { dir: rawSettings } : rawSettings;\n}\n\nconst TRIM_PATH_RE = /(^\\.?\\/|\\/$)/g;\nconst TRIM_EXT_RE = /\\.ts$/;\n\nexport async function exposeEntries(rawSettings: RawExposeEntriesSettings) {\n const { dir: _dir, prefix: _prefix } =\n resolveRawExposeEntriesSettings(rawSettings);\n const dir = path.resolve(_dir);\n const prefix = _prefix ? _prefix.replace(TRIM_PATH_RE, '') : '';\n const pattern = path.join(dir, '**/*.ts');\n const files = await glob(pattern);\n const entries: Record<string, RawWorkspaceEntryObject> = {};\n for (const file of files) {\n const id = (prefix + file.replace(dir, ''))\n .replace(TRIM_EXT_RE, '')\n .replace(TRIM_PATH_RE, '');\n entries[id] = {\n src: file,\n };\n }\n return entries;\n}\n","import { PackageJson } from 'pkg-types';\nimport { bundleRequire } from 'bundle-require';\nimport {\n ProjectPackageJson,\n PROJECT_REQUIRED_FIELDS,\n UserProjectConfig,\n ResolvedProjectConfig,\n} from '../types';\nimport {\n PROJECT_CONFIG_BASENAME,\n SEARCH_BUNDLE_EXTENSIONS_MATCH,\n} from '../constants';\nimport { findConfig } from './file';\nimport { resolveUserPluginOptions } from './plugin';\n\nexport function isProjectPackageJson(\n json: PackageJson,\n): json is ProjectPackageJson {\n return (\n !!json.private && PROJECT_REQUIRED_FIELDS.every((filed) => !!json[filed])\n );\n}\n\nexport async function resolveUserProjectConfig(\n userConfig: UserProjectConfig,\n): Promise<ResolvedProjectConfig> {\n const {\n workspacesDir = 'packages',\n scripts = [],\n peerDependencies = {},\n tsconfig,\n readme = (json) => `# ${json.name}\\n`,\n plugins,\n optimizeCSS = true,\n } = userConfig;\n return {\n workspacesDir,\n scripts: Array.isArray(scripts) ? scripts : [{ name: '', scripts }],\n peerDependencies,\n tsconfig,\n readme,\n plugins: await resolveUserPluginOptions(plugins),\n optimizeCSS: optimizeCSS === true ? {} : optimizeCSS,\n };\n}\n\nexport function defineProjectConfig<Config extends UserProjectConfig>(\n config: Config,\n): Promise<ResolvedProjectConfig> {\n return resolveUserProjectConfig(config);\n}\n\nexport async function loadProjectConfig(\n searchDir?: string,\n depth?: number,\n): Promise<ResolvedProjectConfig> {\n const hit = await findConfig(\n {\n fileName: `${PROJECT_CONFIG_BASENAME}.${SEARCH_BUNDLE_EXTENSIONS_MATCH}`,\n depth,\n allowMissing: true,\n },\n searchDir,\n );\n\n const userConfig = hit\n ? (\n await bundleRequire<{\n default: UserProjectConfig | Promise<UserProjectConfig>;\n }>({\n filepath: hit.path,\n })\n ).mod.default\n : ({} as UserProjectConfig);\n\n return resolveUserProjectConfig(await userConfig);\n}\n","export const PROJECT_CONFIG_BASENAME = 'plugboy.project';\n\nexport const WORKSPACE_CONFIG_BASENAME = 'plugboy.workspace';\n\nexport const PACKAGE_JSON_FILENAME = 'package.json';\n\nexport const WORKSPACE_SPEC_PREFIX = 'workspace:';\n\nexport const SEARCH_BUNDLE_EXTENSIONS_MATCH = '(ts|mjs|js|json)';\n","import { UserPluginOption, Plugin } from '../types';\nimport { resolveListable } from './general';\nimport { loadProjectConfig } from './project';\n\nexport async function resolveUserPluginOptions(\n pluginOptions: UserPluginOption[] | undefined,\n): Promise<Plugin[]> {\n if (!pluginOptions) return [];\n return resolveListable(pluginOptions);\n}\n\nexport function definePlugin<T extends Plugin>(options: T): T {\n return options;\n}\n\nexport async function extractProjectPlugins(\n searchDir?: string,\n): Promise<Plugin[]> {\n const config = await loadProjectConfig(searchDir);\n return config ? config.plugins : [];\n}\n\nexport async function findProjectPlugin<T extends Plugin = Plugin>(\n pluginName: string,\n searchDir?: string,\n): Promise<T | undefined> {\n const plugins = await extractProjectPlugins(searchDir);\n return plugins.find((plugin) => plugin.name === pluginName) as T | undefined;\n}\n","import { PackageJson } from 'pkg-types';\nimport { bundleRequire } from 'bundle-require';\nimport {\n WorkspacePackageJson,\n WORKSPACE_REQUIRED_FIELDS,\n UserWorkspaceConfig,\n ResolvedWorkspaceConfig,\n RawWorkspaceEntryObject,\n RawWorkspaceEntry,\n WorkspaceEntry,\n RawWorkspaceEntries,\n WorkspaceEntries,\n} from '../types';\nimport { findConfig } from './file';\nimport {\n WORKSPACE_CONFIG_BASENAME,\n SEARCH_BUNDLE_EXTENSIONS_MATCH,\n} from '../constants';\nimport { resolveUserPluginOptions } from './plugin';\n\nexport function isWorkspacePackageJson(\n json: PackageJson,\n): json is WorkspacePackageJson {\n return (\n !json.private && WORKSPACE_REQUIRED_FIELDS.every((filed) => !!json[filed])\n );\n}\n\nexport function resolveRawWorkspaceEntry(\n entry: RawWorkspaceEntry,\n): WorkspaceEntry {\n const { src, css }: RawWorkspaceEntryObject =\n typeof entry === 'string' ? { src: entry } : entry;\n return {\n src,\n css: css || src.endsWith('.css') || src.endsWith('.scss'),\n };\n}\n\nexport function resolveRawWorkspaceEntries(\n entries: RawWorkspaceEntries | undefined,\n): WorkspaceEntries {\n if (!entries) return {};\n return Object.fromEntries(\n Object.entries(entries).map(([name, raw]) => [\n name,\n resolveRawWorkspaceEntry(raw),\n ]),\n );\n}\n\nexport async function resolveUserWorkspaceConfig(\n userConfig: UserWorkspaceConfig,\n): Promise<ResolvedWorkspaceConfig> {\n const {\n ignoreProjectConfig = false,\n entries,\n plugins,\n optimizeCSS = true,\n } = userConfig;\n return {\n ...userConfig,\n ignoreProjectConfig,\n entries: resolveRawWorkspaceEntries(entries),\n plugins: await resolveUserPluginOptions(plugins),\n optimizeCSS: optimizeCSS === true ? {} : optimizeCSS,\n };\n}\n\nexport function defineWorkspaceConfig<Config extends UserWorkspaceConfig>(\n config: Config,\n): Promise<ResolvedWorkspaceConfig> {\n return resolveUserWorkspaceConfig(config);\n}\n\nexport async function loadWorkspaceConfig(\n searchDir?: string,\n depth?: number,\n): Promise<ResolvedWorkspaceConfig> {\n const hit = await findConfig(\n {\n fileName: `${WORKSPACE_CONFIG_BASENAME}.${SEARCH_BUNDLE_EXTENSIONS_MATCH}`,\n depth,\n allowMissing: true,\n },\n searchDir,\n );\n\n const userConfig = hit\n ? (\n await bundleRequire<{\n default: UserWorkspaceConfig | Promise<UserWorkspaceConfig>;\n }>({\n filepath: hit.path,\n })\n ).mod.default\n : ({} as UserWorkspaceConfig);\n\n return resolveUserWorkspaceConfig(await userConfig);\n}\n","import {\n UserHooks,\n ResolvedHooks,\n BuildedHooks,\n createHooksDefaults,\n} from '../types';\nimport { resolveListable } from './general';\n\nexport async function resolveUserHooks(\n ...userHooks: (UserHooks | undefined | null | false)[]\n): Promise<ResolvedHooks> {\n const hooks = createHooksDefaults();\n if (!userHooks) return hooks;\n for (const userHook of userHooks) {\n if (!userHook) continue;\n for (const [hookName, _hooks] of Object.entries(userHook)) {\n if (hooks) {\n (hooks as any)[hookName].push(...(await resolveListable(_hooks)));\n }\n }\n }\n return hooks;\n}\n\nexport function buildHooks(resolvedHooks: ResolvedHooks): BuildedHooks {\n const hooks: any = {};\n Object.entries(resolvedHooks).forEach(([hookName, fns]) => {\n hooks[hookName] = async (...args: any[]): Promise<any> => {\n const results: any[] = [];\n for (const fn of fns) {\n results.push(await (fn as any)(...args));\n }\n return results;\n };\n });\n return hooks;\n}\n","import path from 'node:path';\nimport fs from 'node:fs';\nimport { isFileNotFoundException } from './utils';\n\nexport class Path {\n private _value: string;\n private _stats?: fs.Stats;\n\n get value() {\n return this._value;\n }\n\n set value(value) {\n const _value = path.resolve(value);\n if (_value === this._value) return;\n this._value = path.resolve(value);\n delete this._stats;\n }\n\n get dirname() {\n return path.dirname(this.value);\n }\n\n get basename() {\n return path.basename(this.value);\n }\n\n get extname() {\n return path.extname(this.value);\n }\n\n get stats() {\n let { _stats } = this;\n if (!_stats) {\n _stats = fs.statSync(this.value);\n this._stats = _stats;\n }\n return _stats;\n }\n\n get isDirectory() {\n return this.stats.isDirectory;\n }\n\n get isFile() {\n return this.stats.isFile;\n }\n\n constructor(value: string) {\n this._value = path.resolve(value);\n }\n\n toString() {\n return this.value;\n }\n\n valueOf() {\n return this.value;\n }\n\n toJSON() {\n return this.value;\n }\n\n relative(to: string) {\n return new Path(path.relative(this.value, to));\n }\n\n join(...paths: string[]) {\n return new Path(path.join(this.value, ...paths));\n }\n\n resolve(...paths: string[]) {\n return new Path(path.resolve(this.value, ...paths));\n }\n\n private _join(...paths: (string | undefined)[]) {\n const _paths = paths.filter((path): path is string => !!path);\n return _paths.length ? path.join(this.value, ..._paths) : this.value;\n }\n\n async readdir(...paths: string[]): Promise<Path[]> {\n const dir = this._join(...paths);\n const files = await fs.promises.readdir(dir);\n return files.map((file) => {\n return new Path(path.join(dir, file));\n });\n }\n\n readFile<D = undefined>(\n pathAppend?: string,\n defaults?: D,\n ): Promise<D extends undefined ? string : string | D> {\n return new Promise<any>((resolve, reject) => {\n fs.readFile(this._join(pathAppend), 'utf-8', (err, data) => {\n if (err) {\n if (defaults !== undefined && isFileNotFoundException(err)) {\n return resolve(defaults);\n }\n return reject(err);\n }\n resolve(data);\n });\n });\n }\n\n async readJSON<T = any, D = undefined>(\n pathAppend?: string,\n defaults?: D,\n ): Promise<D extends undefined ? T : T | D> {\n try {\n const file = await this.readFile(pathAppend);\n return JSON.parse(file);\n } catch (err) {\n if (defaults === undefined) {\n throw err;\n }\n return defaults as any;\n }\n }\n}\n","import { ProjectPackageJson, WorkspacePackageJson } from './types';\nimport {\n findConfig,\n isProjectPackageJson,\n isWorkspacePackageJson,\n} from './utils';\nimport { PACKAGE_JSON_FILENAME } from './constants';\nimport { Path } from './path';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport interface GetProjectPackageJsonResult {\n dir: Path;\n json: ProjectPackageJson;\n}\n\nexport async function getProjectPackageJson<\n AllowMissing extends boolean | undefined = false,\n>(\n searchDir?: string,\n allowMissing?: AllowMissing,\n): Promise<\n AllowMissing extends true\n ? GetProjectPackageJsonResult | null\n : GetProjectPackageJsonResult\n> {\n const hit = await findConfig(\n {\n fileName: PACKAGE_JSON_FILENAME,\n allowMissing,\n test: (result) => isProjectPackageJson(JSON.parse(result.code)),\n },\n searchDir,\n );\n if (!hit) {\n if (allowMissing) return null as any;\n throw new Error('missing project package.');\n }\n return {\n dir: new Path(hit.dir),\n json: JSON.parse(hit.code),\n } as any;\n}\n\nexport interface GetWorkspacePackageJsonResult {\n dir: Path;\n json: WorkspacePackageJson;\n}\n\nexport async function getWorkspacePackageJson<\n AllowMissing extends boolean | undefined = false,\n>(\n searchDir?: string,\n allowMissing?: AllowMissing,\n): Promise<\n AllowMissing extends true\n ? GetWorkspacePackageJsonResult | null\n : GetWorkspacePackageJsonResult\n> {\n const hit = await findConfig(\n {\n fileName: PACKAGE_JSON_FILENAME,\n allowMissing,\n test: (result) => isWorkspacePackageJson(JSON.parse(result.code)),\n },\n searchDir,\n );\n if (!hit) {\n if (allowMissing) return null as any;\n throw new Error('missing workspace package.');\n }\n return {\n dir: new Path(hit.dir),\n json: JSON.parse(hit.code),\n } as any;\n}\n\nexport async function findWorkspacePackages(\n dir: string,\n): Promise<GetWorkspacePackageJsonResult[]> {\n const results: GetWorkspacePackageJsonResult[] = [];\n const searchDir = path.resolve(dir);\n const dirs = await fs.readdir(searchDir);\n const pkgs = await Promise.all(\n dirs.map((dirName) =>\n getWorkspacePackageJson(path.join(searchDir, dirName), true),\n ),\n );\n pkgs.forEach((pkg) => {\n pkg && results.push(pkg);\n });\n return results;\n}\n","import { Options, build } from 'tsup';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { PlugboyWorkspace, WorkspaceObjectExport } from './workspace';\nimport {\n TSUP_SYNC_OPTIONS,\n NormalizedDTSPreserveTypeSettings,\n ResolvedOptimizeCSSOptions,\n} from '../types';\nimport type { OutputFile, Plugin } from 'esbuild';\nimport { copyDirSync, rmrf } from '../utils';\nimport { emitDTS } from './dts';\nimport { glob } from 'glob';\nimport type { Processor, AcceptedPlugin as PostcssPlugin } from 'postcss';\n\nconst SHEBANG_MATCH_RE = /^(#!.+?)\\n/;\ntype EnvVarName = '__PLUGBOY_DEV__' | '__PLUGBOY_STUB__';\ntype EnvFnName =\n | '__plugboyWorkspaceDir'\n | '__plugboySrcDir'\n | '__plugboyPublicDir';\n\ninterface ResolvedOptions extends Options {\n esbuildPlugins: Plugin[];\n}\n\nfunction safeRemoveCSSMap(cssFilePath: string) {\n const mapFilePath = `${cssFilePath}.map`;\n return fs.rm(mapFilePath, { force: true });\n}\n\nconst SOURCE_MAPPING_URL_COMMENT_RE = /\\/\\*# sourceMappingURL=.+? \\*\\//g;\nconst allLayerDefRe = /(^|\\n)@layer\\s+([a-zA-Z\\d\\-_$. ,]+);/g;\nconst layerDefTrimRe = /((^|\\n)@layer\\s+|;)/g;\n\nasync function getPostcss(\n options: ResolvedOptimizeCSSOptions,\n): Promise<Processor> {\n const { layer, media, combineRules, cssnano } = options;\n const [postcss, _layer, _media, _combineRules, _cssnano] = await Promise.all([\n import('postcss').then((mod) => mod.default),\n layer &&\n import('../postcss/plugins/optimize-layer').then((mod) =>\n mod.OptimizeLayer(layer),\n ),\n media &&\n import('../postcss/plugins/optimize-media').then((mod) =>\n mod.OptimizeMedia(media),\n ),\n combineRules &&\n import('../postcss/plugins/combine-rules').then((mod) =>\n mod.CombineRules(combineRules),\n ),\n cssnano && import('cssnano').then((mod) => mod.default(cssnano)),\n ]);\n const plugins: PostcssPlugin[] = [];\n _layer && plugins.push(_layer);\n _media && plugins.push(_media);\n _combineRules && plugins.push(_combineRules);\n _cssnano && plugins.push(_cssnano);\n\n return postcss(plugins);\n}\n\nexport class Builder {\n readonly workspace: PlugboyWorkspace;\n private _tsupOptions?: ResolvedOptions;\n private _postcssCache?: Processor;\n\n get entry() {\n return this.workspace.entry;\n }\n\n get dts() {\n return this.workspace.dts;\n }\n\n constructor(workspace: PlugboyWorkspace) {\n this.workspace = workspace;\n }\n\n async tsupOptions(overrides?: { watch?: boolean }): Promise<ResolvedOptions> {\n let { _tsupOptions } = this;\n if (_tsupOptions) return _tsupOptions;\n\n const { entry, dts } = this;\n\n const esbuildPlugins = await this.workspace.getESBuildPlugins();\n\n _tsupOptions = {\n publicDir: true,\n format: ['esm'],\n dts: dts.inline\n ? false\n : {\n resolve: ['@fastkit/plugboy'],\n },\n treeshake: true,\n esbuildPlugins,\n entry,\n splitting: true,\n outExtension: ({ format }) => ({\n js: `.mjs`,\n }),\n sourcemap: true,\n clean: true,\n ...overrides,\n };\n\n for (const opt of TSUP_SYNC_OPTIONS) {\n _tsupOptions[opt] = this.workspace.config[opt] as any;\n }\n\n const PLUGBOY_VAR_ENVS: Record<EnvVarName, string> = {\n __PLUGBOY_DEV__: 'false',\n __PLUGBOY_STUB__: 'false',\n };\n\n const DEFINE_VAR_INJECTS = Object.fromEntries(\n Object.keys(PLUGBOY_VAR_ENVS).map((envName) => [envName, `$$${envName}`]),\n );\n\n _tsupOptions.define = {\n ..._tsupOptions.define,\n ...DEFINE_VAR_INJECTS,\n };\n\n const PLUGBOY_VAR_ENVS_BANNER = [\n ...Object.entries(PLUGBOY_VAR_ENVS).map(\n ([envName, variable]) =>\n `const $$${envName} = /* @PLUGBOY:${envName}:start */${variable}/* @PLUGBOY:${envName}:end */;`,\n ),\n `const $$__PLUGBOY_RELATIVE_PATH_FOR_WORKSPACE__ = '@@__PLUGBOY_RELATIVE_PATH_FOR_WORKSPACE__';`,\n ].join('\\n');\n\n const ENV_FN_INJECTS = `\nimport __plugboy_path from 'node:path';\nimport { fileURLToPath as __plugboy_fileURLToPath } from 'node:url';\n\nfunction __plugboyFilename() {\n return __plugboy_fileURLToPath(import.meta.url);\n}\n\nfunction __plugboyDirname() {\n return __plugboy_path.dirname(__plugboyFilename());\n}\n\nfunction __plugboyWorkspaceDir(...paths) {\n return __plugboy_path.join(__plugboy_path.resolve(__plugboyDirname(), $$__PLUGBOY_RELATIVE_PATH_FOR_WORKSPACE__), ...paths);\n}\n\nfunction __plugboySrcDir(...paths) {\n return __plugboy_path.join(__plugboyWorkspaceDir(), 'src', ...paths);\n}\n\nfunction __plugboyPublicDir(...paths) {\n return __plugboy_path.join(__plugboyWorkspaceDir(), 'dist', ...paths);\n}\n `.trim();\n\n const banner: NonNullable<Options['banner']> = { ..._tsupOptions.banner };\n banner.js = `${\n banner.js ? banner.js + '\\n\\n' : ''\n }${PLUGBOY_VAR_ENVS_BANNER}\\n\\n${ENV_FN_INJECTS}`;\n\n _tsupOptions.banner = banner;\n\n _tsupOptions.external = _tsupOptions.external || [];\n _tsupOptions.external.push(\n /^(@fastkit\\/)?plugboy/,\n ...this.workspace.dependencies,\n );\n\n this._tsupOptions = _tsupOptions;\n\n return _tsupOptions;\n }\n\n private async _stubLinkJS(from: string, to: string) {\n const fromParsed = path.parse(from);\n const fromDir = fromParsed.dir;\n const toParsed = path.parse(to);\n const toRelativeDir = path.relative(fromDir, toParsed.dir);\n const location = path.join(toRelativeDir, toParsed.base);\n const source = await fs.readFile(to, 'utf-8');\n const shebang = source.match(SHEBANG_MATCH_RE)?.[1];\n const STUB_FN_ERROR = `() => { throw new Error('Path resolution methods cannot be executed in stub mode.') }`;\n const PLUGBOY_ENVS: Record<EnvVarName | EnvFnName, string> = {\n __PLUGBOY_DEV__: 'true',\n __PLUGBOY_STUB__: 'true',\n __plugboyWorkspaceDir: STUB_FN_ERROR,\n __plugboySrcDir: STUB_FN_ERROR,\n __plugboyPublicDir: STUB_FN_ERROR,\n // __plugboyWorkspaceDir: `(...paths) => path.join('${this.workspace.dir.value}', ...paths)`,\n // __plugboySrcDir: `(...paths) => path.join(__plugboySrcDir(), 'src', ...paths)`,\n // __plugboyPublicDir: `(...paths) => path.join(__plugboySrcDir(), 'dist', ...paths)`,\n };\n const ENV_INJECTS = Object.entries(PLUGBOY_ENVS)\n .map(([envName, variable]) => `globalThis.${envName} = ${variable};`)\n .join('\\n');\n const disableChecks = '/* eslint-disable */\\n// @ts-nocheck\\n';\n const code = `${disableChecks}${ENV_INJECTS}\\nexport * from '${location}';`;\n const dtsPath = path.join(fromDir, `${fromParsed.name}.d.ts`);\n const dtsCode = `${disableChecks}export * from '${location.replace(\n /\\.ts$/,\n '',\n )}';`;\n const srcFromDir = path.dirname(from);\n const dtsDir = path.dirname(dtsPath);\n await Promise.all(\n [srcFromDir, dtsDir].map((dir) => {\n return fs.mkdir(dir, { recursive: true });\n }),\n );\n await Promise.all([\n fs.writeFile(from, `${shebang ? shebang + '\\n' : ''}${code}`),\n fs.writeFile(dtsPath, dtsCode),\n ]);\n }\n\n private async _stubLinkCSS(from: string) {\n const code = `/* noop */`;\n await fs.writeFile(from, code);\n }\n\n async copyPublicDir() {\n const publicDir = this.workspace.dir.join('public').value;\n await copyDirSync(publicDir, this.workspace.dirs.dist.value);\n }\n\n async stub() {\n const links = this.workspace.getStubLinks();\n await this.copyPublicDir();\n await Promise.all(\n links.map((link) => {\n if (link.type === 'js') {\n return this._stubLinkJS(link.from, link.to);\n } else if (link.type === 'css') {\n return this._stubLinkCSS(link.from);\n }\n }),\n );\n await fs.writeFile(\n this.workspace.dirs.dist.join('.stub').value,\n '',\n 'utf-8',\n );\n }\n\n normalizeDTSBySettings(\n dts: string,\n settings: NormalizedDTSPreserveTypeSettings,\n ): string | undefined {\n const { targets, pkg } = settings;\n const myPackageName = this.workspace.json.name;\n const packageIsOwn = myPackageName === pkg;\n const pkgImports = (() => {\n if (!pkg || packageIsOwn) return;\n\n const importRe = new RegExp(`import {([^\\\\{\\\\}]+)} from '${pkg}'`);\n const importMatched = dts.match(importRe);\n const imports = importMatched && importMatched[1];\n if (!imports) return;\n\n return {\n pkg,\n importRe,\n imports,\n };\n })();\n\n const hitTypeNames: string[] = [];\n targets.forEach(({ from, typeName }) => {\n const matched = dts.match(from);\n if (matched) {\n hitTypeNames.push(typeName);\n dts = dts.replace(from, typeName);\n }\n });\n\n if (!hitTypeNames.length) return;\n\n if (pkgImports) {\n const { pkg, imports, importRe } = pkgImports;\n const mods = imports\n .trim()\n .split(',')\n .map((row) => {\n row = row.split(' as ')[0].trim();\n return row;\n });\n const appends: string[] = [];\n hitTypeNames.forEach((typeName) => {\n const re = new RegExp(`(^|\\n)import { ${typeName} } from '${pkg}'`);\n if (!re.test(dts) && !mods.includes(typeName)) {\n appends.push(typeName);\n }\n });\n if (appends.length) {\n dts = dts.replace(\n importRe,\n `import { $1, ${appends.join(', ')} } from '${pkg}'`,\n );\n }\n } else if (pkg && !packageIsOwn) {\n const mods: string[] = [];\n hitTypeNames.forEach((typeName) => {\n if (!dts.includes(`export declare type ${typeName} = `)) {\n mods.push(typeName);\n }\n });\n if (mods.length) {\n dts = `import { ${mods.join(', ')} } from '${pkg}';\\n${dts}`;\n }\n }\n return dts;\n }\n\n async normalizeDTSFile(filePath: string) {\n const dts = await fs.readFile(filePath, 'utf-8');\n const { preserveType, normalizers } = this.dts;\n let normalized = dts;\n let processed = false;\n for (const settings of preserveType) {\n const _normalized = this.normalizeDTSBySettings(normalized, settings);\n if (_normalized) {\n processed = true;\n normalized = _normalized;\n }\n }\n for (const normalizer of normalizers) {\n const _normalized = await normalizer(normalized, this);\n if (_normalized && normalized !== _normalized) {\n processed = true;\n normalized = _normalized;\n }\n }\n if (!processed) {\n return;\n }\n await fs.writeFile(filePath, normalized, 'utf-8');\n }\n\n async normalizeDTSFiles(dtsFiles: string[] = this.workspace.dtsFiles) {\n const { preserveType } = this.dts;\n if (!preserveType.length || !dtsFiles.length) return;\n\n await Promise.all(\n dtsFiles.map((filePath) => this.normalizeDTSFile(filePath)),\n );\n }\n\n async emitInlineDTS() {\n const { dir, dirs, exports } = this.workspace;\n const cwd = dir.value;\n const outDir = dirs.dist.join('.dts-generate').value;\n const dtsSrcDir = path.join(outDir, 'src');\n const dtsDest = dirs.dist.join('.dts').value;\n\n await emitDTS({\n cwd,\n outDir,\n });\n\n await fs.rename(dtsSrcDir, dtsDest);\n await rmrf(outDir);\n\n const objectExports: WorkspaceObjectExport[] = [];\n\n exports.forEach(({ at }) => {\n typeof at === 'object' && objectExports.push(at);\n });\n\n await Promise.all(\n objectExports.map(async (at) => {\n const typesDir = path.dirname(at.types);\n const dtsDestDir = path.dirname(at.dtsDest);\n const relativeDir = path.relative(typesDir, dtsDestDir);\n const relativePath = path.join(\n relativeDir,\n path.basename(at.dtsDest).replace(/\\.d\\.ts$/, ''),\n );\n const code = `export * from './${relativePath}';`;\n await fs.writeFile(at.types, code, 'utf-8');\n }),\n );\n\n const dtsFiles = await glob(path.join(dtsDest, '**/*.d.ts'));\n await this.normalizeDTSFiles(dtsFiles);\n }\n\n async build() {\n const _outputFiles: OutputFile[] = [];\n const options = await this.tsupOptions();\n await build({\n ...options,\n esbuildPlugins: [\n ...options.esbuildPlugins,\n {\n name: 'output-collection',\n setup(build) {\n build.onEnd((result) => {\n const { outputFiles } = result;\n if (!outputFiles) return;\n _outputFiles.push(...outputFiles);\n });\n },\n },\n ],\n onSuccess: async () => {\n const emptyNativeNodeModuleRe = /(^|\\n)import 'node:.+?';?/g;\n await Promise.all(\n _outputFiles.map(async ({ path: filePath }) => {\n if (filePath.endsWith('.css')) {\n await this._handleCSSOutput(filePath);\n return;\n }\n if (!filePath.endsWith('.mjs')) return;\n const code = await fs.readFile(filePath, 'utf-8');\n const replaced = code.replace(emptyNativeNodeModuleRe, '');\n if (code === replaced) return;\n\n await fs.writeFile(filePath, replaced.trimStart(), 'utf-8');\n }),\n );\n\n await this.workspace.hooks.onSuccess(this, _outputFiles);\n },\n });\n\n if (this.dts.inline) {\n await this.emitInlineDTS();\n } else {\n await this.normalizeDTSFiles();\n }\n }\n\n async optimizeCSS(cssFilePath: string) {\n const options = this.workspace.optimizeCSSOptions;\n if (!options) return Promise.resolve();\n\n let postcss = this._postcssCache;\n if (!postcss) {\n postcss = await getPostcss(options);\n this._postcssCache = postcss;\n }\n\n function prepare(css: string): string {\n const layerDefs = (() => {\n const matched = css.match(allLayerDefRe);\n if (!matched) return '';\n const layerNames: string[] = [];\n matched.forEach((row) => {\n const trimmed = row.replace(layerDefTrimRe, '');\n const chunks = trimmed.split(',');\n chunks.forEach((chunk) => layerNames.push(chunk.trim()));\n });\n const uniqued = Array.from(new Set(layerNames));\n const def = `@layer ${uniqued.join(', ')};\\n`;\n return def;\n })();\n return (\n layerDefs +\n css\n .replace(allLayerDefRe, '')\n .replace(SOURCE_MAPPING_URL_COMMENT_RE, '')\n );\n }\n\n const css = prepare(await fs.readFile(cssFilePath, 'utf-8'));\n\n const result = await postcss.process(css, { from: cssFilePath });\n await fs.writeFile(cssFilePath, result.css);\n }\n\n private async _handleCSSOutput(cssFilePath: string) {\n await Promise.all([\n this.optimizeCSS(cssFilePath),\n safeRemoveCSSMap(cssFilePath),\n ]);\n }\n}\n","import { execa } from 'execa';\nimport path from 'node:path';\n\nexport interface EmitDTSOptions {\n cwd?: string;\n outDir?: string;\n}\n\nexport async function emitDTS(opts: EmitDTSOptions = {}) {\n const { cwd = process.cwd(), outDir = path.join(cwd, 'dist/dts') } = opts;\n await execa(\n 'tsc',\n [\n '--declaration true',\n '--skipLibCheck',\n '--noEmit false',\n '--emitDeclarationOnly',\n `--outDir ${outDir}`,\n ],\n { cwd, shell: true, stdio: 'inherit' },\n );\n}\n","import {\n ProjectSetupContext,\n ProjectPackageJson,\n ResolvedProjectConfig,\n UserHooks,\n} from '../types';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { Path } from '../path';\nimport glob from 'glob';\nimport { getProjectPackageJson } from '../package';\nimport {\n isWorkspacePackageJson,\n loadProjectConfig,\n resolveUserProjectConfig,\n} from '../utils';\nimport { PACKAGE_JSON_FILENAME } from '../constants';\n\n/**\n * Plugboy Project\n *\n * @remarks This instance is only created if the project consists of a mono-repo.\n */\nexport class PlugboyProject {\n /** Path instance of the project directory */\n readonly dir: Path;\n /** package.json */\n readonly json: ProjectPackageJson;\n /**\n * Project Configuration\n * @see {@link ResolvedProjectConfig}\n */\n readonly config: ResolvedProjectConfig;\n /** Names of all packages on which the project depends */\n readonly dependencies: string[];\n /** Directory names of all workspaces owned by the project */\n readonly resolvedWorkspaces: string[];\n\n /**\n * Name of the project's package.json\n */\n get name() {\n return this.json.name;\n }\n\n /**\n * Plug-in List\n * @see {@link ResolvedProjectConfig.plugins}\n */\n get plugins() {\n return this.config.plugins;\n }\n\n /**\n * List of all user hook settings\n * @see {@link UserHooks}\n */\n get hooks(): UserHooks[] {\n const { hooks: _hooks, plugins } = this.config;\n const pluginHooks = plugins.map((plugin) => plugin.hooks);\n return [_hooks, ...pluginHooks].filter((hook): hook is UserHooks => !!hook);\n }\n\n constructor(ctx: ProjectSetupContext) {\n const { dir, json, config, resolvedWorkspaces } = ctx;\n\n this.dir = dir;\n this.json = json;\n this.config = config;\n\n const allDeps = {\n ...json.dependencies,\n ...json.devDependencies,\n };\n\n this.dependencies = Object.keys(allDeps);\n this.resolvedWorkspaces = resolvedWorkspaces;\n }\n}\n\nexport async function getProject<\n AllowMissing extends boolean | undefined = false,\n>(\n searchDir?: string,\n allowMissing?: AllowMissing,\n skipLoadConfig?: boolean,\n): Promise<AllowMissing extends true ? PlugboyProject | null : PlugboyProject> {\n const hit = await getProjectPackageJson(searchDir, allowMissing);\n if (!hit) {\n return null as any;\n }\n const { dir, json } = hit;\n const resolvedWorkspaces: string[] = [];\n const { workspaces = [] } = json;\n const workspacesPattern = workspaces.map(\n (workspace) => dir.join(workspace, PACKAGE_JSON_FILENAME).value,\n );\n const workspaceHits = await glob(workspacesPattern);\n for (const hit of workspaceHits) {\n const json = JSON.parse(await fs.readFile(hit, 'utf-8'));\n if (!isWorkspacePackageJson(json)) {\n continue;\n }\n resolvedWorkspaces.push(path.dirname(hit));\n }\n resolvedWorkspaces.sort((a, b) => {\n if (a < b) return -1;\n if (a > b) return 1;\n return 0;\n });\n\n const config = skipLoadConfig\n ? await resolveUserProjectConfig({})\n : await loadProjectConfig(dir.value, 0);\n\n const ctx: ProjectSetupContext = {\n dir,\n json,\n config,\n resolvedWorkspaces,\n };\n\n return new PlugboyProject(ctx);\n}\n","import {\n rmrf,\n loadWorkspaceConfig,\n resolveUserHooks,\n buildHooks,\n} from '../utils';\nimport {\n ProjectPackageJson,\n WorkspacePackageJson,\n ResolvedWorkspaceConfig,\n WorkspaceDirs,\n WorkspaceSetupContext,\n WorkspaceMeta,\n Plugin,\n UserHooks,\n BuildedHooks,\n ESBuildPlugin,\n mergeDTSSettingsList,\n NormalizedDTSSettings,\n ResolvedOptimizeCSSOptions,\n resolveOptimizeCSSOptions,\n} from '../types';\nimport { Path } from '../path';\nimport { WORKSPACE_SPEC_PREFIX } from '../constants';\nimport { PlugboyProject, getProject } from '../project';\nimport sortPackageJson from 'sort-package-json';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { Builder } from './builder';\nimport { getWorkspacePackageJson } from '../package';\nimport { PACKAGE_JSON_FILENAME } from '../constants';\n\nexport type WorkspaceStubLink =\n | {\n type: 'js';\n from: string;\n to: string;\n }\n | {\n type: 'css';\n from: string;\n };\n\nexport type WorkspaceStubLinkType = WorkspaceStubLink['type'];\n\nexport interface WorkspaceObjectExport {\n src: string;\n types: string;\n dtsDest: string;\n import: {\n default: string;\n };\n}\n\nfunction extractWorkspaceObjectExport(at: string | WorkspaceObjectExport) {\n if (typeof at === 'string') return at;\n const { types, import: _import } = at;\n return {\n types,\n import: _import,\n };\n}\n\nexport interface WorkspaceExport {\n id: string;\n at: string | WorkspaceObjectExport;\n stubLink?: WorkspaceStubLink;\n}\n\nexport const WORKSPACE_PACKAGE_SYNC_FIELDS = [\n 'repository',\n 'author',\n 'publishConfig',\n 'license',\n] as const;\n\nexport function syncWorkspacePackageFields(\n projectJSON: ProjectPackageJson,\n workspaceJSON: WorkspacePackageJson,\n) {\n for (const field of WORKSPACE_PACKAGE_SYNC_FIELDS) {\n const value = projectJSON[field];\n if (value && !workspaceJSON[field]) {\n workspaceJSON[field] = value;\n }\n }\n}\n\nconst BUILD_TARGET_SRC_MATCH_RE = /\\.(tsx?|s?css)$/;\n\nexport class PlugboyWorkspace {\n readonly name: string;\n readonly dir: Path;\n readonly config: ResolvedWorkspaceConfig;\n readonly project: PlugboyProject | null;\n readonly dirs: WorkspaceDirs;\n readonly dependencies: string[];\n readonly projectDependencies: string[];\n readonly meta: WorkspaceMeta;\n readonly entry: Record<string, string>;\n readonly exports: WorkspaceExport[];\n readonly builder: Builder;\n readonly plugins: Plugin[];\n readonly hooks: BuildedHooks;\n readonly dtsFiles: string[] = [];\n readonly dts: NormalizedDTSSettings;\n readonly optimizeCSSOptions: ResolvedOptimizeCSSOptions | false;\n private _json: WorkspacePackageJson;\n\n get json() {\n return this._json;\n }\n\n constructor(ctx: WorkspaceSetupContext) {\n const {\n dir,\n json,\n config,\n project,\n dirs,\n dependencies,\n projectDependencies,\n meta,\n plugins,\n hooks,\n dts,\n optimizeCSS,\n } = ctx;\n\n this.name = dir.basename;\n this.dir = dir;\n this._json = json;\n this.project = project;\n this.dirs = dirs;\n this.dependencies = dependencies;\n this.projectDependencies = projectDependencies;\n this.meta = meta;\n this.config = config;\n this.plugins = plugins;\n this.hooks = hooks;\n this.dts = dts;\n this.optimizeCSSOptions = optimizeCSS\n ? resolveOptimizeCSSOptions(optimizeCSS)\n : false;\n\n const entry: Record<string, string> = {};\n const exports: WorkspaceExport[] = [\n {\n id: `./${PACKAGE_JSON_FILENAME}`,\n at: `./${PACKAGE_JSON_FILENAME}`,\n },\n ];\n\n Object.entries(config.entries).forEach(([id, { src, css }]) => {\n if (!BUILD_TARGET_SRC_MATCH_RE.test(src)) return;\n\n const isMainEntry = id === '.';\n const normalizedId = isMainEntry ? this.name : id;\n const exportId = id.startsWith('.') ? id : `./${id}`;\n const srcIsCSS = src.endsWith('.css') || src.endsWith('.scss');\n const ext = srcIsCSS ? 'css' : 'mjs';\n const dest = `./dist/${normalizedId}.${ext}`;\n const destFullPath = dir.join(dest).value;\n\n entry[normalizedId] = src;\n\n if (css) {\n const cssDest = `./dist/${normalizedId}.css`;\n exports.push({\n id: `./${normalizedId}.css`,\n at: cssDest,\n stubLink: {\n type: 'css',\n from: cssDest,\n },\n });\n\n if (srcIsCSS) return;\n }\n\n const types = `./dist/${normalizedId}.d.ts`;\n const dtsDest = `./dist/${src\n .replace(/^\\.\\/src/, '.dts')\n .replace(/\\.ts$/, '.d.ts')}`;\n\n this.dtsFiles.push(dir.join(types).value);\n exports.push({\n id: exportId,\n at: {\n src,\n types,\n dtsDest,\n import: {\n default: dest,\n },\n },\n stubLink: {\n from: destFullPath,\n to: path.isAbsolute(src) ? src : dir.join(src).value,\n type: 'js',\n },\n });\n });\n\n this.entry = entry;\n this.exports = exports;\n this.builder = new Builder(this);\n }\n\n clean(withDepsAndCache?: boolean) {\n const { dir, dirs } = this;\n const paths: string[] = [dirs.dist.value];\n if (withDepsAndCache) {\n paths.push(dir.join('node_modules').value, dir.join('.turbo').value);\n }\n return rmrf(...paths);\n }\n\n async preparePackageJSON() {\n const { exports, json, project } = this;\n const _exports: Record<string, any> = {};\n const typesVersions: Record<string, any> = {};\n let main: string | undefined;\n let mainTypes: string | undefined;\n\n exports.forEach(({ id, at }) => {\n const _at = extractWorkspaceObjectExport(at);\n _exports[id] = _at;\n if (typeof _at !== 'object') return;\n const isMainExport = id === '.';\n const trimedId = isMainExport ? id : id.replace(/^\\.\\//, '');\n typesVersions[trimedId] = [_at.types];\n\n if (isMainExport) {\n main = _at.import.default;\n mainTypes = _at.types;\n }\n });\n\n _exports['./*'] = './dist/*';\n\n const cloned: typeof json = JSON.parse(JSON.stringify(json));\n cloned.exports = _exports;\n cloned.typesVersions = {\n '*': typesVersions,\n };\n if (main) cloned.main = main;\n if (mainTypes) cloned.types = mainTypes;\n\n const projectPeerDependencies = project?.config.peerDependencies;\n (['dependencies', 'devDependencies', 'peerDependencies'] as const).forEach(\n (prop) => {\n const deps = cloned[prop];\n if (!deps) return;\n Object.keys(deps).forEach((dep) => {\n const version = deps[dep];\n if (version.startsWith('workspace:')) {\n deps[dep] = 'workspace:*';\n } else if (projectPeerDependencies && projectPeerDependencies[dep]) {\n deps[dep] = projectPeerDependencies[dep];\n }\n });\n },\n );\n\n cloned.files = cloned.files || [];\n if (!cloned.files.some((file) => /(\\.\\/)?dist\\/?/.test(file))) {\n cloned.files.unshift('dist');\n }\n\n if (project) {\n syncWorkspacePackageFields(project.json, cloned);\n }\n\n cloned.type = cloned.type || 'module';\n\n await this.hooks.preparePackageJSON(json, this);\n\n const sorted = sortPackageJson(cloned);\n const fromStr = JSON.stringify(cloned, null, 2);\n const toStr = JSON.stringify(sorted, null, 2);\n if (fromStr !== toStr || process) {\n await fs.writeFile(this.dir.join(PACKAGE_JSON_FILENAME).value, toStr);\n this._json = sorted;\n }\n return sorted;\n }\n\n getStubLinks(): WorkspaceStubLink[] {\n const links: WorkspaceStubLink[] = [];\n this.exports.forEach(({ stubLink }) => {\n stubLink && links.push(stubLink);\n });\n return links;\n }\n\n async stub() {\n await this.clean();\n await fs.mkdir(this.dirs.dist.value);\n return this.builder.stub();\n }\n\n async getESBuildPlugins(): Promise<ESBuildPlugin[]> {\n const results: ESBuildPlugin[] = [];\n results.push({\n name: 'plugboy-workspace-env',\n setup: (build) => {\n const isJS = /\\.m?js$/;\n const RELATIVE_PATH_FOR_WORKSPACE =\n '@@__PLUGBOY_RELATIVE_PATH_FOR_WORKSPACE__';\n const encoder = new TextEncoder();\n\n build.onEnd(({ outputFiles, errors, warnings }) => {\n const result = { errors, warnings };\n if (!outputFiles || !outputFiles.length || errors.length)\n return result;\n\n for (const file of outputFiles) {\n const { path: filePath, text } = file;\n if (\n !isJS.test(filePath) ||\n !text.includes(RELATIVE_PATH_FOR_WORKSPACE)\n ) {\n continue;\n }\n const relativePath = path.relative(\n path.dirname(filePath),\n this.dir.value,\n );\n const content = text.replace(\n RELATIVE_PATH_FOR_WORKSPACE,\n relativePath,\n );\n file.contents = encoder.encode(content);\n }\n\n return result;\n });\n },\n });\n const { plugins } = this;\n for (const plugin of plugins) {\n const { esbuildPlugins } = plugin;\n if (!esbuildPlugins) continue;\n for (const chunk of esbuildPlugins) {\n const esbuildPlugin =\n typeof chunk === 'function' ? await chunk(this) : await chunk;\n if (esbuildPlugin) {\n results.push(esbuildPlugin);\n }\n }\n }\n return results;\n }\n\n async build() {\n await this.clean();\n return this.builder.build();\n }\n}\n\nexport async function getWorkspace<\n AllowMissing extends boolean | undefined = false,\n>(\n searchDir?: string,\n allowMissing?: AllowMissing,\n): Promise<\n AllowMissing extends true ? PlugboyWorkspace | null : PlugboyWorkspace\n> {\n const hit = await getWorkspacePackageJson(searchDir, allowMissing);\n if (!hit) {\n return null as any;\n }\n const { dir, json } = hit;\n const config = await loadWorkspaceConfig(dir.value, 0);\n\n const project = await getProject(dir.value, true, config.ignoreProjectConfig);\n\n const dirs: WorkspaceDirs = {\n src: dir.join('src'),\n dist: dir.join('dist'),\n };\n\n const { dependencies, peerDependencies, optionalDependencies } = json;\n const allDeps = {\n ...dependencies,\n ...peerDependencies,\n ...optionalDependencies,\n };\n\n const _dependencies = Object.keys(allDeps);\n\n const projectDependencies = Object.entries(allDeps)\n .filter(([dep, spec]) => spec.startsWith(WORKSPACE_SPEC_PREFIX))\n .map(([dep]) => dep);\n\n const meta: WorkspaceMeta = {};\n\n const packagePlugins = project?.plugins || [];\n const packageHooks = project?.hooks || [];\n const plugins: Plugin[] = [...packagePlugins, ...config.plugins];\n const _hooks: UserHooks[] = [...packageHooks];\n if (config.hooks) {\n _hooks.push(config.hooks);\n }\n const resolvedHooks = await resolveUserHooks(..._hooks);\n const hooks = buildHooks(resolvedHooks);\n\n const dts = mergeDTSSettingsList(project?.config.dts, config.dts);\n\n let { optimizeCSS } = config;\n if (optimizeCSS !== false && project && project.config.optimizeCSS) {\n optimizeCSS = {\n ...project.config.optimizeCSS,\n ...optimizeCSS,\n };\n }\n\n const ctx: WorkspaceSetupContext = {\n dir,\n json,\n config,\n project,\n dirs,\n dependencies: _dependencies,\n projectDependencies,\n meta,\n plugins,\n hooks,\n dts,\n optimizeCSS,\n };\n\n await hooks.setupWorkspace(ctx);\n\n const workspace = new PlugboyWorkspace(ctx);\n\n await hooks.createWorkspace(workspace);\n\n return workspace;\n}\n","/* eslint-disable no-console */\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { getProject } from '../project';\nimport { getWorkspace, syncWorkspacePackageFields } from '../workspace';\nimport { WorkspacePackageJson, ProjectScriptsTemplate } from '../types';\nimport sortPackageJson from 'sort-package-json';\nimport { WORKSPACE_CONFIG_BASENAME } from '../constants';\n\nimport inquirer from 'inquirer';\n\nexport async function generateWorkspace(\n workspaceName?: string,\n cwd = process.cwd(),\n) {\n const project = await getProject(cwd);\n const { config } = project;\n\n // ====================\n // workspace name\n // ====================\n while (!workspaceName) {\n const { value } = await inquirer.prompt({\n type: 'input',\n name: 'value',\n message: 'Enter a workspace name',\n });\n\n if (value) {\n workspaceName = value;\n }\n }\n\n // ====================\n // description\n // ====================\n const { description } = await inquirer.prompt({\n type: 'input',\n name: 'description',\n default: workspaceName,\n message: 'Please enter a description of your package',\n });\n\n // ====================\n // version\n // ====================\n let version: string | undefined;\n while (!version) {\n const { value } = await inquirer.prompt({\n type: 'input',\n name: 'value',\n default: '0.0.0',\n message: 'Please enter the initial version',\n });\n\n if (value) {\n version = value;\n }\n }\n\n // ====================\n // keywords\n // ====================\n const { rawKeywords } = await inquirer.prompt({\n type: 'input',\n name: 'rawKeywords',\n message: 'Enter as many keywords, if any, as needed, separated by commas',\n });\n\n const keywords = (rawKeywords as string)\n .split(',')\n .map((word) => word.trim())\n .filter((word) => word.length);\n\n // ====================\n // scripts\n // ====================\n const scriptsTemplates = config.scripts;\n let scriptsTemplate: ProjectScriptsTemplate | undefined;\n if (scriptsTemplates && scriptsTemplates.length) {\n const { value } = await inquirer.prompt({\n type: 'rawlist',\n message: 'Select a scripts template',\n name: 'value',\n choices: [\n { name: 'None', value: '' },\n ...scriptsTemplates.map((tpl) => ({\n name: tpl.name,\n value: tpl.name,\n })),\n ],\n });\n scriptsTemplate = scriptsTemplates.find((tpl) => tpl.name === value);\n }\n const scripts = scriptsTemplate?.scripts || {};\n\n // ====================\n // peerDependencies\n // ====================\n const peerDependencies = await (async () => {\n const { deps } = await inquirer.prompt<{ deps: string[] }>({\n type: 'checkbox',\n message:\n 'Select the dependent packages, if any, to be used in the package',\n name: 'deps',\n choices: Object.keys(config.peerDependencies).map((dep) => {\n return {\n name: dep,\n value: dep,\n };\n }),\n });\n if (!deps.length) return;\n return Object.fromEntries(\n deps.map((dep) => [dep, config.peerDependencies[dep]]),\n );\n })();\n\n // ====================\n // dependencies\n // ====================\n const dependencies = await (async () => {\n const { deps } = await inquirer.prompt<{ deps: string[] }>({\n type: 'checkbox',\n message: 'Select the internal package to be used, if any.',\n name: 'deps',\n choices: project.resolvedWorkspaces.map((workspace) => {\n const name = path.basename(workspace);\n return {\n name,\n value: name,\n };\n }),\n });\n if (!deps.length) return;\n return Object.fromEntries(\n deps.map((dep) => [`@${project.name}/${dep}`, 'workspace:*']),\n );\n })();\n\n // ====================\n // Generate source files?\n // ====================\n const { withGenSource } = await inquirer.prompt<{ withGenSource: boolean }>({\n type: 'confirm',\n name: 'withGenSource',\n message: 'Generate source files?',\n default: true,\n });\n\n // ====================\n // final confirmation\n // ====================\n const _json: WorkspacePackageJson = {\n name: `@${project.name}/${workspaceName}`,\n type: 'module',\n description,\n version,\n keywords,\n scripts,\n peerDependencies,\n dependencies,\n };\n\n syncWorkspacePackageFields(project.json, _json);\n\n const json = sortPackageJson(_json);\n\n const workspaceDir = path.join(config.workspacesDir, workspaceName);\n\n console.log('');\n console.log('========================================');\n console.log(`Directory: ${workspaceDir}`);\n console.log(`Generate source: ${withGenSource ? 'Yes' : 'No'}`);\n console.log(json);\n console.log('========================================');\n\n const { confirmation } = await inquirer.prompt<{ confirmation: boolean }>({\n type: 'confirm',\n name: 'confirmation',\n message: 'Is this OK?',\n default: true,\n });\n\n if (!confirmation) {\n console.log('Skiped.');\n process.exit(1);\n }\n\n // 1. Create directory\n await fs.mkdir(workspaceDir);\n\n // 2. Write package.json\n await fs.writeFile(\n path.join(workspaceDir, 'package.json'),\n JSON.stringify(json, null, 2),\n );\n\n // 3. Write README.md\n await fs.writeFile(path.join(workspaceDir, 'README.md'), config.readme(json));\n\n // 3. Generate source\n if (withGenSource) {\n const srcDir = path.join(workspaceDir, 'src');\n await fs.mkdir(srcDir);\n\n const indexCode = `export * from './${workspaceName}';\\n`;\n const modCode = `export const PACKAGE_NAME = './${workspaceName}';\\n`;\n\n await fs.writeFile(path.join(srcDir, 'index.ts'), indexCode);\n await fs.writeFile(path.join(srcDir, `${workspaceName}.ts`), modCode);\n\n const { tsconfig } = config;\n if (tsconfig) {\n await fs.writeFile(\n path.join(workspaceDir, 'tsconfig.json'),\n JSON.stringify(tsconfig, null, 2),\n );\n }\n\n const configFileCode =\n `\nimport { defineWorkspaceConfig } from '@fastkit/plugboy';\n\nexport default defineWorkspaceConfig({\n entries: {\n '.': './src/index.ts',\n },\n});\n `.trim() + '\\n';\n await fs.writeFile(\n path.join(workspaceDir, `${WORKSPACE_CONFIG_BASENAME}.ts`),\n configFileCode,\n );\n\n const workspace = await getWorkspace(workspaceDir);\n await workspace.preparePackageJSON();\n }\n}\n"],"mappings":"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","names":["fileName","result","path","path","bundleRequire","bundleRequire","path","fs","path","fs","fs","path","fs","path","path","glob","fs","path","pkg","build","css","fs","path","glob","glob","hit","json","fs","path","fs","path","path","fs","build","path","fs","sortPackageJson","path","sortPackageJson","fs"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/postcss/plugins/combine-rules.ts"],"sourcesContent":["import postcss, { Plugin, Root, Container, Rule } from 'postcss';\n\nexport type RuleFilter = string | RegExp;\n\nexport type RuleSpecFn = (rule: Rule) => boolean;\n\nexport type RuleSpec = RuleFilter[] | RuleSpecFn;\n\nexport interface CombineRulesOptions {\n rules: RuleSpec;\n}\n\nfunction buildFilterFn(spec: RuleSpec): RuleSpecFn {\n return (rule) => {\n if (typeof spec === 'function') return spec(rule);\n const { selector } = rule;\n return spec.some((target) => {\n if (typeof target === 'string') return selector === target;\n return target.test(selector);\n });\n };\n}\n\nexport function combineContainerRules(\n container: Container,\n filter: RuleSpecFn,\n) {\n const { nodes } = container;\n if (!nodes) return;\n\n const rules: Rule[] = (nodes as Rule[]).filter(filter);\n const combinedRules: { selector: string; rules: Rule[]; container: Rule }[] =\n [];\n rules.forEach((rule) => {\n const { selector } = rule;\n let combinedRule = combinedRules.find((c) => c.selector === selector);\n if (!combinedRule) {\n combinedRule = {\n selector,\n rules: [],\n container: rule,\n };\n combinedRules.push(combinedRule);\n }\n combinedRule.rules.push(rule);\n });\n\n combinedRules.forEach((combinedRule) => {\n combinedRule.rules.forEach((rule, index) => {\n if (index === 0) return;\n const { nodes } = rule;\n if (!nodes) return;\n nodes.forEach((node) => {\n combinedRule.container.append(node.clone());\n });\n rule.remove();\n });\n });\n}\n\nexport function combineRules(\n css: string | { toString(): string } | Root,\n opts: CombineRulesOptions,\n): Root {\n const root = css instanceof Root ? css : postcss.parse(css);\n const filter = buildFilterFn(opts.rules);\n combineContainerRules(root, filter);\n root.walkAtRules((atRule) => {\n combineContainerRules(atRule, filter);\n });\n return root;\n}\n\nconst PLUGIN_NAME = 'combine-rules';\n\nexport function CombineRules(opts: CombineRulesOptions): Plugin {\n return {\n postcssPlugin: PLUGIN_NAME,\n Once(root) {\n combineRules(root, opts);\n },\n };\n}\n\nCombineRules.postcss = true;\n\nexport default CombineRules;\n"],"mappings":";AAAA,OAAO,WAAmB,YAA6B;AAYvD,SAAS,cAAc,MAA4B;AACjD,SAAO,CAAC,SAAS;AACf,QAAI,OAAO,SAAS;AAAY,aAAO,KAAK,IAAI;AAChD,UAAM,EAAE,SAAS,IAAI;AACrB,WAAO,KAAK,KAAK,CAAC,WAAW;AAC3B,UAAI,OAAO,WAAW;AAAU,eAAO,aAAa;AACpD,aAAO,OAAO,KAAK,QAAQ;AAAA,IAC7B,CAAC;AAAA,EACH;AACF;AAEO,SAAS,sBACd,WACA,QACA;AACA,QAAM,EAAE,MAAM,IAAI;AAClB,MAAI,CAAC;AAAO;AAEZ,QAAM,QAAiB,MAAiB,OAAO,MAAM;AACrD,QAAM,gBACJ,CAAC;AACH,QAAM,QAAQ,CAAC,SAAS;AACtB,UAAM,EAAE,SAAS,IAAI;AACrB,QAAI,eAAe,cAAc,KAAK,CAAC,MAAM,EAAE,aAAa,QAAQ;AACpE,QAAI,CAAC,cAAc;AACjB,qBAAe;AAAA,QACb;AAAA,QACA,OAAO,CAAC;AAAA,QACR,WAAW;AAAA,MACb;AACA,oBAAc,KAAK,YAAY;AAAA,IACjC;AACA,iBAAa,MAAM,KAAK,IAAI;AAAA,EAC9B,CAAC;AAED,gBAAc,QAAQ,CAAC,iBAAiB;AACtC,iBAAa,MAAM,QAAQ,CAAC,MAAM,UAAU;AAC1C,UAAI,UAAU;AAAG;AACjB,YAAM,EAAE,OAAAA,OAAM,IAAI;AAClB,UAAI,CAACA;AAAO;AACZ,MAAAA,OAAM,QAAQ,CAAC,SAAS;AACtB,qBAAa,UAAU,OAAO,KAAK,MAAM,CAAC;AAAA,MAC5C,CAAC;AACD,WAAK,OAAO;AAAA,IACd,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,aACd,KACA,MACM;AACN,QAAM,OAAO,eAAe,OAAO,MAAM,QAAQ,MAAM,GAAG;AAC1D,QAAM,SAAS,cAAc,KAAK,KAAK;AACvC,wBAAsB,MAAM,MAAM;AAClC,OAAK,YAAY,CAAC,WAAW;AAC3B,0BAAsB,QAAQ,MAAM;AAAA,EACtC,CAAC;AACD,SAAO;AACT;AAEA,IAAM,cAAc;AAEb,SAAS,aAAa,MAAmC;AAC9D,SAAO;AAAA,IACL,eAAe;AAAA,IACf,KAAK,MAAM;AACT,mBAAa,MAAM,IAAI;AAAA,IACzB;AAAA,EACF;AACF;AAEA,aAAa,UAAU;AAEvB,IAAO,wBAAQ;","names":["nodes"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/postcss/plugins/optimize-layer.ts"],"sourcesContent":["import postcss, { AtRule, Plugin, Root } from 'postcss';\n\ntype Filter = (layerName: string, rule: AtRule) => boolean;\n\ntype FilterSpec = string | RegExp | (string | RegExp)[] | Filter;\n\nexport interface OptimizeLayerOptions {\n include?: FilterSpec;\n exclude?: FilterSpec;\n}\n\nfunction resolveFilter(\n spec: FilterSpec | undefined,\n defaults: boolean,\n): Filter {\n if (!spec) return () => defaults;\n if (typeof spec === 'function') return spec;\n const conditions = Array.isArray(spec) ? spec : [spec];\n return (layerName) => {\n return conditions.some((condition) => {\n return typeof condition === 'string'\n ? layerName.includes(condition)\n : condition.test(layerName);\n });\n };\n}\n\ninterface Layer {\n name: string;\n rule: AtRule;\n}\n\nexport function optimizeLayer(\n css: string | { toString(): string } | Root,\n opts: OptimizeLayerOptions = {},\n): Root {\n const root = css instanceof Root ? css : postcss.parse(css);\n const layers: Layer[] = [];\n const include = resolveFilter(opts.include, true);\n const exclude = resolveFilter(opts.exclude, false);\n\n const getLayer = (\n layerRule: AtRule,\n ): {\n layer: Layer;\n atFirst: boolean;\n } => {\n const name = layerRule.params;\n const layer = layers.find((layer) => layer.name === name);\n if (layer)\n return {\n layer,\n atFirst: false,\n };\n\n const created: Layer = { name, rule: layerRule };\n layers.push(created);\n return {\n layer: created,\n atFirst: true,\n };\n };\n\n root.walkAtRules('layer', (layerRule) => {\n if (layerRule.parent?.type !== 'root') return;\n const { params, nodes } = layerRule;\n if (!nodes || !include(params, layerRule) || exclude(params, layerRule))\n return;\n\n const { layer, atFirst } = getLayer(layerRule);\n\n if (atFirst) return;\n\n layerRule.nodes.forEach((node) => {\n layer.rule.append(node.clone());\n });\n\n layerRule.remove();\n });\n\n return root;\n}\n\nconst PLUGIN_NAME = 'optimize-layer';\n\nexport function OptimizeLayer(opts?: OptimizeLayerOptions): Plugin {\n return {\n postcssPlugin: PLUGIN_NAME,\n Once(root) {\n optimizeLayer(root, opts);\n },\n };\n}\n\nOptimizeLayer.postcss = true;\n\nexport default OptimizeLayer;\n"],"mappings":";AAAA,OAAO,WAA2B,YAAY;AAW9C,SAAS,cACP,MACA,UACQ;AACR,MAAI,CAAC;AAAM,WAAO,MAAM;AACxB,MAAI,OAAO,SAAS;AAAY,WAAO;AACvC,QAAM,aAAa,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AACrD,SAAO,CAAC,cAAc;AACpB,WAAO,WAAW,KAAK,CAAC,cAAc;AACpC,aAAO,OAAO,cAAc,WACxB,UAAU,SAAS,SAAS,IAC5B,UAAU,KAAK,SAAS;AAAA,IAC9B,CAAC;AAAA,EACH;AACF;AAOO,SAAS,cACd,KACA,OAA6B,CAAC,GACxB;AACN,QAAM,OAAO,eAAe,OAAO,MAAM,QAAQ,MAAM,GAAG;AAC1D,QAAM,SAAkB,CAAC;AACzB,QAAM,UAAU,cAAc,KAAK,SAAS,IAAI;AAChD,QAAM,UAAU,cAAc,KAAK,SAAS,KAAK;AAEjD,QAAM,WAAW,CACf,cAIG;AACH,UAAM,OAAO,UAAU;AACvB,UAAM,QAAQ,OAAO,KAAK,CAACA,WAAUA,OAAM,SAAS,IAAI;AACxD,QAAI;AACF,aAAO;AAAA,QACL;AAAA,QACA,SAAS;AAAA,MACX;AAEF,UAAM,UAAiB,EAAE,MAAM,MAAM,UAAU;AAC/C,WAAO,KAAK,OAAO;AACnB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,SAAS;AAAA,IACX;AAAA,EACF;AAEA,OAAK,YAAY,SAAS,CAAC,cAAc;AACvC,QAAI,UAAU,QAAQ,SAAS;AAAQ;AACvC,UAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,QAAI,CAAC,SAAS,CAAC,QAAQ,QAAQ,SAAS,KAAK,QAAQ,QAAQ,SAAS;AACpE;AAEF,UAAM,EAAE,OAAO,QAAQ,IAAI,SAAS,SAAS;AAE7C,QAAI;AAAS;AAEb,cAAU,MAAM,QAAQ,CAAC,SAAS;AAChC,YAAM,KAAK,OAAO,KAAK,MAAM,CAAC;AAAA,IAChC,CAAC;AAED,cAAU,OAAO;AAAA,EACnB,CAAC;AAED,SAAO;AACT;AAEA,IAAM,cAAc;AAEb,SAAS,cAAc,MAAqC;AACjE,SAAO;AAAA,IACL,eAAe;AAAA,IACf,KAAK,MAAM;AACT,oBAAc,MAAM,IAAI;AAAA,IAC1B;AAAA,EACF;AACF;AAEA,cAAc,UAAU;AAExB,IAAO,yBAAQ;","names":["layer"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/postcss/plugins/optimize-media.ts"],"sourcesContent":["import postcss, {\n AtRule,\n Plugin,\n Root,\n Container,\n ChildNode,\n Comment,\n} from 'postcss';\n\ninterface Media {\n query: string;\n rule: AtRule;\n container: Container;\n}\n\ntype Filter = (query: string, media: Media) => boolean;\n\ntype FilterSpec = string | RegExp | (string | RegExp)[] | Filter;\n\nfunction resolveFilter(\n spec: FilterSpec | undefined,\n defaults: boolean,\n): Filter {\n if (!spec) return () => defaults;\n if (typeof spec === 'function') return spec;\n const conditions = Array.isArray(spec) ? spec : [spec];\n return (layerName) => {\n return conditions.some((condition) => {\n return typeof condition === 'string'\n ? layerName.includes(condition)\n : condition.test(layerName);\n });\n };\n}\n\ntype SortMedia = (a: Media, b: Media) => number;\n\nexport interface OptimizeMediaOptions {\n include?: FilterSpec;\n exclude?: FilterSpec;\n sort?: SortMedia;\n}\n\n// const MEDIA_WIDTH_MATCH_RE = /\\((min|max)-width:(\\d+)px\\)/;\n\n// const MEDIA_RANGE_TYPES = ['min', 'max', 'minmax'] as const;\n\n// type MediaRangeType = typeof MEDIA_RANGE_TYPES[number];\n\n// function getMediaRangeType(range: { min?: number; max?: number }): MediaRangeType {\n// const { min, max } = range;\n// const hasMin = min != null;\n// const hasMax = max != null;\n\n// if (!hasMin && !hasMax) throw new Error('missing amount');\n// if (hasMin && hasMax) return 'minmax';\n// if (hasMin) return 'min';\n// return 'max';\n// }\n\n// function getMediaRangeTypeAndScore(range: { min?: number; max?: number }): {\n// type: MediaRangeType;\n// score: number;\n// } {\n// const type = getMediaRangeType(range);\n// return {\n// type,\n// score: MEDIA_RANGE_TYPES.indexOf(type),\n// }\n// }\n\n// function parseMediaRange(query: string): MediaWidthRange {\n// let min: number | undefined;\n// let max: number | undefined;\n// const chunks = query.split(' and ').map((chunk) => chunk.replace(/\\s/g, ''));\n// chunks.forEach((chunk) => {\n// const widthMatch = chunk.match(MEDIA_WIDTH_MATCH_RE);\n// if (!widthMatch) return;\n// const type = widthMatch[1] as 'min' | 'max';\n// const amount = Number(widthMatch[2]);\n// if (type === 'min') {\n// min = amount;\n// } else if (type === 'max') {\n// max = amount;\n// }\n// });\n// return { min, max };\n// }\n\nfunction parseMedia(mediaRule: AtRule): Media {\n const { params, parent } = mediaRule;\n if (!parent) {\n throw mediaRule.error('@media rules require a parent container.');\n }\n return {\n query: params,\n rule: mediaRule,\n container: parent,\n };\n}\n\nfunction isSourceMapAnnotation(node: ChildNode | undefined): node is Comment {\n if (!node) return false;\n if (node.type !== 'comment') return false;\n return node.text.toLowerCase().startsWith('# sourcemappingurl=');\n}\n\nfunction getSourceMapAnnotation(container: Container): ChildNode | undefined {\n const maybeAnnotation = container.last;\n if (isSourceMapAnnotation(maybeAnnotation)) {\n return maybeAnnotation;\n }\n}\n\nexport function optimizeMedia(\n css: string | { toString(): string } | Root,\n opts: OptimizeMediaOptions = {},\n): Root {\n const root = css instanceof Root ? css : postcss.parse(css);\n const include = resolveFilter(opts.include, true);\n const exclude = resolveFilter(opts.exclude, false);\n\n const sourceMap = getSourceMapAnnotation(root);\n\n const containerMap = new Map<Container, Media[]>();\n\n root.walkAtRules('media', (mediaRule) => {\n const media = parseMedia(mediaRule);\n if (\n !mediaRule.nodes ||\n !include(media.query, media) ||\n exclude(media.query, media)\n )\n return;\n\n let bucket = containerMap.get(media.container);\n if (!bucket) {\n bucket = [];\n containerMap.set(media.container, bucket);\n }\n bucket.push(media);\n });\n\n containerMap.forEach((bucket, container) => {\n if (opts.sort) {\n bucket.sort(opts.sort);\n }\n\n const combinedRules: {\n query: string;\n medias: Media[];\n }[] = [];\n\n bucket.forEach((media) => {\n let rule = combinedRules.find((r) => r.query === media.query);\n if (!rule) {\n rule = { query: media.query, medias: [] };\n combinedRules.push(rule);\n }\n rule.medias.push(media);\n });\n\n combinedRules.forEach((rule) => {\n const nodes = rule.medias\n .map((media) => media.rule.nodes.map((node) => node.clone()))\n .flat();\n const newAtRule = new AtRule({\n name: 'media',\n params: rule.query,\n nodes,\n });\n rule.medias.forEach((media) => media.rule.remove());\n container.append(newAtRule);\n });\n });\n\n containerMap.clear();\n\n if (sourceMap) {\n root.append(sourceMap);\n }\n\n return root;\n}\n\nconst PLUGIN_NAME = 'optimize-media';\n\nexport function OptimizeMedia(opts?: OptimizeMediaOptions): Plugin {\n return {\n postcssPlugin: PLUGIN_NAME,\n Once(root) {\n optimizeMedia(root, opts);\n },\n };\n}\n\nOptimizeMedia.postcss = true;\n\nexport default OptimizeMedia;\n"],"mappings":"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","names":[]}
|