@reliverse/dler 2.1.16 → 2.1.18

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.
@@ -14,6 +14,9 @@ export default defineCommand({
14
14
  "dler clean --presets db,frontend --dry-run",
15
15
  "dler clean --presets deps --deleteLockFiles",
16
16
  "dler clean --subdirs --presets build-tools",
17
+ 'dler clean --filter "@reliverse/dler-prompt,@reliverse/dler-build"',
18
+ 'dler clean --filter "@reliverse/dler-*"',
19
+ "dler clean --filter cli,packages/build",
17
20
  "dler clean --ignore '@reliverse/*'",
18
21
  "dler clean --presets frontend --verbose",
19
22
  "dler clean --presets all --dry-run --verbose",
@@ -35,6 +38,11 @@ export default defineCommand({
35
38
  "dler clean --custom 'build/,coverage/' # Clean build and coverage directories",
36
39
  "dler clean --presets build --custom '*.log' # Combine presets and custom patterns",
37
40
  "",
41
+ "# Filter Examples:",
42
+ 'dler clean --filter "@reliverse/dler-*" --presets build # Clean build artifacts in matching packages',
43
+ "dler clean --filter cli,packages/build --presets all # Clean all artifacts in specific packages",
44
+ 'dler clean --filter "@reliverse/dler-prompt" --custom "*.log" # Clean log files in specific package',
45
+ "",
38
46
  "# Monorepo Examples:",
39
47
  "dler clean # Clean dist/ in all packages",
40
48
  "dler clean --presets frontend # Clean frontend artifacts in all packages",
@@ -57,6 +65,14 @@ export default defineCommand({
57
65
  ]
58
66
  },
59
67
  args: defineArgs({
68
+ filter: {
69
+ type: "string",
70
+ description: "Package(s) to include (supports wildcards and comma-separated values like '@reliverse/dler-prompt,@reliverse/dler-build'). Takes precedence over --ignore when both are provided."
71
+ },
72
+ ignore: {
73
+ type: "string",
74
+ description: "Package(s) to ignore (supports wildcards like @reliverse/*)"
75
+ },
60
76
  presets: {
61
77
  type: "string",
62
78
  description: "Comma-separated presets to clean: build,db,cms,frontend,docs,email,build-tools,deps,all"
@@ -65,10 +81,6 @@ export default defineCommand({
65
81
  type: "string",
66
82
  description: "Comma-separated custom patterns to clean (e.g., 'dist/,*.log,node_modules/')"
67
83
  },
68
- ignore: {
69
- type: "string",
70
- description: "Package(s) to ignore (supports wildcards like @reliverse/*)"
71
- },
72
84
  cwd: {
73
85
  type: "string",
74
86
  description: "Working directory (monorepo root)"
@@ -1,6 +1,7 @@
1
1
  export interface CleanOptions {
2
2
  presets?: string;
3
3
  custom?: string;
4
+ filter?: string | string[];
4
5
  ignore?: string | string[];
5
6
  cwd?: string;
6
7
  subdirs?: boolean;
@@ -10,7 +10,7 @@ export interface BenchmarkRunnerOptions {
10
10
  verbose?: boolean;
11
11
  }
12
12
  export declare class BenchmarkRunner {
13
- private options;
13
+ readonly options: BenchmarkRunnerOptions;
14
14
  constructor(options: BenchmarkRunnerOptions);
15
15
  run(): Promise<BenchmarkResult>;
16
16
  private runWarmup;
@@ -3,7 +3,7 @@ export declare class PerfCache {
3
3
  private options;
4
4
  private cacheDir;
5
5
  constructor(options: CacheOptions);
6
- private ensureCacheDir;
6
+ ensureCacheDir(): void;
7
7
  private generateHash;
8
8
  private getCachePath;
9
9
  private isExpired;
@@ -10,9 +10,10 @@ export class PerfCache {
10
10
  this.ensureCacheDir();
11
11
  }
12
12
  ensureCacheDir() {
13
- if (!existsSync(this.cacheDir)) {
14
- mkdirSync(this.cacheDir, { recursive: true });
13
+ if (existsSync(this.cacheDir)) {
14
+ return;
15
15
  }
16
+ mkdirSync(this.cacheDir, { recursive: true });
16
17
  }
17
18
  generateHash(report) {
18
19
  const content = JSON.stringify({
@@ -7,6 +7,7 @@ export default defineCommand({
7
7
  description: "Run TypeScript type checking on all workspace packages",
8
8
  examples: [
9
9
  "dler tsc",
10
+ 'dler tsc --filter "@reliverse/dler-prompt,@reliverse/dler-build"',
10
11
  'dler tsc --ignore "@reliverse/*"',
11
12
  'dler tsc --ignore "@reliverse/dler-colors" --ignore "@reliverse/dler-v1"',
12
13
  'dler tsc --ignore "@reliverse/dler-colors @reliverse/dler-v1"',
@@ -29,6 +30,11 @@ export default defineCommand({
29
30
  ]
30
31
  },
31
32
  args: defineArgs({
33
+ filter: {
34
+ type: "string",
35
+ description: "Package(s) to include (supports wildcards and comma-separated values like '@reliverse/dler-prompt,@reliverse/dler-build'). Takes precedence over --ignore when both are provided.",
36
+ positional: true
37
+ },
32
38
  ignore: {
33
39
  type: "string",
34
40
  description: "Package(s) to ignore (supports wildcards like @reliverse/*)"
@@ -81,6 +87,7 @@ export default defineCommand({
81
87
  process.exit(1);
82
88
  }
83
89
  const results = await runTscOnAllPackages(args.ignore, args.cwd, {
90
+ filter: args.filter,
84
91
  concurrency: args.concurrency,
85
92
  stopOnError: args.stopOnError,
86
93
  verbose: args.verbose,
@@ -36,6 +36,7 @@ interface TscOptions {
36
36
  autoConcurrency?: boolean;
37
37
  skipUnchanged?: boolean;
38
38
  buildMode?: boolean;
39
+ filter?: string | string[];
39
40
  }
40
41
  export declare const runTscOnAllPackages: (ignore?: string | string[], cwd?: string, options?: TscOptions) => Promise<TscSummary>;
41
42
  export {};
@@ -4,7 +4,11 @@ import { join, relative, resolve } from "node:path";
4
4
  import { writeErrorLines } from "@reliverse/dler-helpers";
5
5
  import { logger } from "@reliverse/dler-logger";
6
6
  import pMap from "@reliverse/dler-mapper";
7
- import { createIgnoreFilter, normalizePatterns } from "@reliverse/dler-matcher";
7
+ import {
8
+ createIgnoreFilter,
9
+ createIncludeFilter,
10
+ normalizePatterns
11
+ } from "@reliverse/dler-matcher";
8
12
  import {
9
13
  getWorkspacePatterns,
10
14
  hasWorkspaces,
@@ -125,7 +129,11 @@ const getWorkspacePackages = async (cwd) => {
125
129
  cacheMisses: filteredPackages.length
126
130
  };
127
131
  };
128
- const filterPackages = (packages, ignore) => {
132
+ const filterPackages = (packages, ignore, filter) => {
133
+ if (filter) {
134
+ const includeFilter = createIncludeFilter(filter);
135
+ return includeFilter(packages);
136
+ }
129
137
  const alwaysIgnored = ["@reliverse/dler-v1"];
130
138
  const combinedIgnore = ignore ? Array.isArray(ignore) ? [...alwaysIgnored, ...ignore] : [...alwaysIgnored, ignore] : alwaysIgnored;
131
139
  const ignoreFilter = createIgnoreFilter(combinedIgnore);
@@ -556,14 +564,19 @@ export const runTscOnAllPackages = async (ignore, cwd, options = {}) => {
556
564
  }
557
565
  logger.info("");
558
566
  }
559
- const packages = filterPackages(allPackages, ignore);
560
- const ignoredCount = allPackages.length - packages.length;
561
- if (ignoredCount > 0) {
567
+ const packages = filterPackages(allPackages, ignore, options.filter);
568
+ const filteredCount = allPackages.length - packages.length;
569
+ if (options.filter) {
570
+ const patterns = normalizePatterns(options.filter);
571
+ logger.info(
572
+ ` Filtering to ${packages.length} packages matching: ${patterns.join(", ")}`
573
+ );
574
+ } else if (filteredCount > 0) {
562
575
  const alwaysIgnored = ["@reliverse/dler-v1"];
563
576
  const combinedIgnore = ignore ? Array.isArray(ignore) ? [...alwaysIgnored, ...ignore] : [...alwaysIgnored, ignore] : alwaysIgnored;
564
577
  const patterns = normalizePatterns(combinedIgnore);
565
578
  logger.info(
566
- ` Ignoring ${ignoredCount} packages matching: ${patterns.join(", ")}`
579
+ ` Ignoring ${filteredCount} packages matching: ${patterns.join(", ")}`
567
580
  );
568
581
  }
569
582
  let concurrency = options.concurrency ?? DEFAULT_CONCURRENCY;
@@ -19,6 +19,10 @@ export default defineCommand({
19
19
  "dler update",
20
20
  "dler update --install",
21
21
  "dler update --dryRun",
22
+ 'dler update --filter "@reliverse/dler-prompt,@reliverse/dler-build"',
23
+ 'dler update --filter "@reliverse/dler-*"',
24
+ "dler update --filter cli,packages/build",
25
+ 'dler update --ignore "@reliverse/*"',
22
26
  "dler update --name @types/* --name react*",
23
27
  'dler update --ignore "eslint-*" --ignore "@babel/*"',
24
28
  "dler update --no-allowMajor",
@@ -26,7 +30,8 @@ export default defineCommand({
26
30
  "dler update --ignoreFields peerDependencies",
27
31
  "dler update --dryRun --install",
28
32
  "dler update --name react --name react-dom --install",
29
- "dler update --ignore @types/* --allowMajor"
33
+ "dler update --ignore @types/* --allowMajor",
34
+ 'dler update --filter "@reliverse/dler-*" --name react --install'
30
35
  ]
31
36
  },
32
37
  args: defineArgs({
@@ -40,13 +45,17 @@ export default defineCommand({
40
45
  description: msgs.args.cwd,
41
46
  default: getCurrentWorkingDirectory()
42
47
  },
43
- name: {
48
+ filter: {
44
49
  type: "string",
45
- description: "Specific dependencies to update, supports glob patterns (e.g. '@types/*', 'react*'). Can be specified multiple times or comma-separated."
50
+ description: "Package(s) to include (supports wildcards and comma-separated values like '@reliverse/dler-prompt,@reliverse/dler-build'). Takes precedence over --ignore when both are provided."
46
51
  },
47
52
  ignore: {
48
53
  type: "string",
49
- description: "Dependencies to exclude from updates, supports glob patterns (e.g. 'eslint-*', '@types/*')"
54
+ description: "Package(s) to ignore (supports wildcards like @reliverse/*)"
55
+ },
56
+ name: {
57
+ type: "string",
58
+ description: "Specific dependencies to update, supports glob patterns (e.g. '@types/*', 'react*'). Can be specified multiple times or comma-separated."
50
59
  },
51
60
  dryRun: {
52
61
  type: "boolean",
@@ -83,7 +92,7 @@ export default defineCommand({
83
92
  const showDetails = Boolean(details);
84
93
  const fieldsToIgnore = Array.isArray(ignoreFields) ? ignoreFields : [];
85
94
  await validatePackageJson();
86
- const { packageJsonFiles, fileDepsMap } = await prepareAllUpdateCandidates();
95
+ const { packageJsonFiles, fileDepsMap } = await prepareAllUpdateCandidates(args.filter, args.ignore, args.cwd);
87
96
  if (packageJsonFiles.length === 0) {
88
97
  logger.log("No package.json files found");
89
98
  return;
@@ -2,8 +2,9 @@ import { type UpdateResult } from "./utils.js";
2
2
  interface UpdateArgs {
3
3
  ci?: boolean;
4
4
  cwd?: string;
5
+ filter?: string | string[];
5
6
  name?: string[];
6
- ignore?: string[];
7
+ ignore?: string | string[];
7
8
  dryRun?: boolean;
8
9
  install?: boolean;
9
10
  allowMajor?: boolean;
@@ -11,7 +12,7 @@ interface UpdateArgs {
11
12
  ignoreFields?: string[];
12
13
  }
13
14
  export declare function validatePackageJson(): Promise<string>;
14
- export declare function prepareAllUpdateCandidates(): Promise<{
15
+ export declare function prepareAllUpdateCandidates(filter?: string | string[], ignore?: string | string[], cwd?: string): Promise<{
15
16
  packageJsonFiles: string[];
16
17
  fileDepsMap: Map<string, Record<string, any>>;
17
18
  }>;
@@ -1,8 +1,17 @@
1
1
  import { logger } from "@reliverse/dler-logger";
2
2
  import pMap from "@reliverse/dler-mapper";
3
+ import {
4
+ createIncludeFilter,
5
+ normalizePatterns
6
+ } from "@reliverse/dler-matcher";
7
+ import {
8
+ getWorkspacePatterns,
9
+ hasWorkspaces,
10
+ readPackageJSON
11
+ } from "@reliverse/dler-pkg-tsc";
3
12
  import { Glob } from "bun";
4
13
  import fs from "fs/promises";
5
- import path from "path";
14
+ import path, { relative, resolve } from "path";
6
15
  import {
7
16
  applyVersionUpdate,
8
17
  checkPackageUpdate,
@@ -20,17 +29,128 @@ export async function validatePackageJson() {
20
29
  }
21
30
  return packageJsonPath;
22
31
  }
23
- export async function prepareAllUpdateCandidates() {
24
- const glob = new Glob("**/package.json");
25
- const packageJsonFiles = [];
26
- for await (const file of glob.scan({
27
- cwd: process.cwd(),
28
- onlyFiles: true
29
- })) {
30
- const fullPath = path.resolve(process.cwd(), file);
31
- if (!file.includes("node_modules") && !file.includes("dist") && !file.includes("build") && !file.includes(".git") && !file.includes("coverage") && !file.includes(".next") && !file.includes("out") && !file.includes("target") && !file.includes(".turbo")) {
32
- packageJsonFiles.push(fullPath);
32
+ const matchesPattern = (pkg, pattern, monorepoRoot) => {
33
+ const normalizedPattern = pattern.trim();
34
+ const nameFilter = createIncludeFilter(normalizedPattern);
35
+ if (nameFilter([pkg]).length > 0) {
36
+ return true;
37
+ }
38
+ let relativePath;
39
+ if (monorepoRoot) {
40
+ relativePath = relative(monorepoRoot, pkg.path).replace(/\\/g, "/");
41
+ } else {
42
+ relativePath = relative(resolve(pkg.path, ".."), pkg.path).replace(
43
+ /\\/g,
44
+ "/"
45
+ );
46
+ }
47
+ if (relativePath === normalizedPattern || relativePath.endsWith(normalizedPattern)) {
48
+ return true;
49
+ }
50
+ const pathFilter = createIncludeFilter(normalizedPattern);
51
+ if (pathFilter([{ name: relativePath, path: pkg.path }]).length > 0) {
52
+ return true;
53
+ }
54
+ return false;
55
+ };
56
+ const filterPackagesByPatterns = (packages, patterns, monorepoRoot) => {
57
+ const patternArray = Array.isArray(patterns) ? patterns : [patterns];
58
+ const normalizedPatterns = patternArray.flatMap(
59
+ (p) => typeof p === "string" ? p.split(",").map((s) => s.trim()) : [p]
60
+ );
61
+ return packages.filter(
62
+ (pkg) => normalizedPatterns.some(
63
+ (pattern) => matchesPattern(pkg, pattern, monorepoRoot)
64
+ )
65
+ );
66
+ };
67
+ export async function prepareAllUpdateCandidates(filter, ignore, cwd) {
68
+ const workingDir = cwd ? path.resolve(cwd) : process.cwd();
69
+ let packageJsonFiles = [];
70
+ let isMonorepo = false;
71
+ let monorepoRoot = null;
72
+ try {
73
+ const rootPkg = await readPackageJSON(workingDir);
74
+ if (rootPkg && hasWorkspaces(rootPkg)) {
75
+ isMonorepo = true;
76
+ monorepoRoot = workingDir;
77
+ const patterns = getWorkspacePatterns(rootPkg);
78
+ for (const pattern of patterns) {
79
+ const glob = new Glob(path.join(pattern, "package.json"));
80
+ for await (const file of glob.scan({
81
+ cwd: workingDir,
82
+ onlyFiles: true
83
+ })) {
84
+ packageJsonFiles.push(path.resolve(workingDir, file));
85
+ }
86
+ }
87
+ if (filter || ignore) {
88
+ const packageInfos = [];
89
+ for (const pkgPath of packageJsonFiles) {
90
+ try {
91
+ const pkg = await readPackageJSON(path.dirname(pkgPath));
92
+ if (pkg?.name) {
93
+ packageInfos.push({
94
+ name: pkg.name,
95
+ path: path.dirname(pkgPath)
96
+ });
97
+ }
98
+ } catch {
99
+ }
100
+ }
101
+ if (filter) {
102
+ const filtered = filterPackagesByPatterns(
103
+ packageInfos,
104
+ filter,
105
+ monorepoRoot || void 0
106
+ );
107
+ packageJsonFiles = filtered.map(
108
+ (info) => path.join(info.path, "package.json")
109
+ );
110
+ if (filtered.length > 0) {
111
+ const patterns2 = normalizePatterns(filter);
112
+ logger.debug(
113
+ ` Filtering to ${filtered.length} packages matching: ${patterns2.join(", ")}`
114
+ );
115
+ }
116
+ } else if (ignore) {
117
+ const filtered = packageInfos.filter((pkg) => {
118
+ const ignorePatterns = Array.isArray(ignore) ? ignore : [ignore];
119
+ const normalizedIgnorePatterns = ignorePatterns.flatMap(
120
+ (p) => typeof p === "string" ? p.split(",").map((s) => s.trim()) : [p]
121
+ );
122
+ return !normalizedIgnorePatterns.some(
123
+ (pattern) => matchesPattern(pkg, pattern, monorepoRoot || void 0)
124
+ );
125
+ });
126
+ packageJsonFiles = filtered.map(
127
+ (info) => path.join(info.path, "package.json")
128
+ );
129
+ const ignoredCount = packageInfos.length - filtered.length;
130
+ if (ignoredCount > 0) {
131
+ const patterns2 = normalizePatterns(ignore);
132
+ logger.debug(
133
+ ` Ignoring ${ignoredCount} packages matching: ${patterns2.join(", ")}`
134
+ );
135
+ }
136
+ }
137
+ }
138
+ }
139
+ } catch {
140
+ }
141
+ if (!isMonorepo) {
142
+ const glob = new Glob("**/package.json");
143
+ const allFiles = [];
144
+ for await (const file of glob.scan({
145
+ cwd: workingDir,
146
+ onlyFiles: true
147
+ })) {
148
+ const fullPath = path.resolve(workingDir, file);
149
+ if (!file.includes("node_modules") && !file.includes("dist") && !file.includes("build") && !file.includes(".git") && !file.includes("coverage") && !file.includes(".next") && !file.includes("out") && !file.includes("target") && !file.includes(".turbo")) {
150
+ allFiles.push(fullPath);
151
+ }
33
152
  }
153
+ packageJsonFiles = allFiles;
34
154
  }
35
155
  if (packageJsonFiles.length === 0) {
36
156
  logger.warn("No package.json files found");
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@reliverse/dler",
3
3
  "description": "@reliverse/dler is a framework which helps TypeScript and JavaScript developers create their libraries and CLI tools. It provides ready-to-use primitives, so you don't have to write them from scratch.",
4
4
  "author": "reliverse",
5
- "version": "2.1.16",
5
+ "version": "2.1.18",
6
6
  "private": false,
7
7
  "type": "module",
8
8
  "bin": {