@reliverse/dler 2.0.25 → 2.0.27

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.
@@ -65,20 +65,26 @@ const resolvePackageInfo = async (packagePath, isRoot = false) => {
65
65
  const getWorkspacePackages = async (cwd, useCwd = false) => {
66
66
  const monorepoRoot = await findMonorepoRoot(cwd, useCwd);
67
67
  if (!monorepoRoot) {
68
+ const currentDir = cwd || process.cwd();
69
+ const pkgInfo = await resolvePackageInfo(currentDir, true);
70
+ if (pkgInfo) {
71
+ return [pkgInfo];
72
+ }
68
73
  throw new Error(
69
- "\u274C No monorepo found. Ensure package.json has 'workspaces' field."
74
+ "\u274C No monorepo or valid package found. Ensure package.json has 'workspaces' field or contains a valid 'name' field."
70
75
  );
71
76
  }
72
77
  const rootPkg = await readPackageJSON(monorepoRoot);
73
78
  if (!rootPkg) {
74
79
  throw new Error("\u274C Could not read root package.json");
75
80
  }
81
+ const rootPkgInfo = await resolvePackageInfo(monorepoRoot, true);
82
+ const packages = rootPkgInfo ? [rootPkgInfo] : [];
83
+ const seenPaths = /* @__PURE__ */ new Set([monorepoRoot]);
76
84
  const patterns = getWorkspacePatterns(rootPkg);
77
85
  if (!patterns.length) {
78
- throw new Error("\u274C No workspace patterns found in package.json");
86
+ return packages;
79
87
  }
80
- const packages = [];
81
- const seenPaths = /* @__PURE__ */ new Set();
82
88
  for (const pattern of patterns) {
83
89
  if (pattern.includes("*")) {
84
90
  const glob = new Bun.Glob(pattern);
@@ -594,8 +600,8 @@ export const runCleanOnAllPackages = async (ignore, cwd, options = {}) => {
594
600
  (sum, r) => sum + r.files.reduce((s, f) => s + f.size, 0),
595
601
  0
596
602
  ) + lockFilesResult.deletedSize;
597
- const deletedFiles = results.reduce((sum, r) => sum + r.deletedCount, 0) + lockFilesResult.deletedCount;
598
- const deletedSize = results.reduce((sum, r) => sum + r.deletedSize, 0) + lockFilesResult.deletedSize;
603
+ const deletedFiles = totalFiles;
604
+ const deletedSize = totalSize;
599
605
  const allErrors = results.flatMap((r) => r.errors);
600
606
  const summary = {
601
607
  totalPackages: packages.length,
@@ -68,7 +68,12 @@ const getWorkspacePackages = async (monorepoRoot) => {
68
68
  }
69
69
  }
70
70
  }
71
- return packages;
71
+ const filteredPackages = packages.filter((pkg) => {
72
+ const normalizedPkgPath = resolve(pkg.path);
73
+ const normalizedRootPath = resolve(monorepoRoot);
74
+ return normalizedPkgPath !== normalizedRootPath;
75
+ });
76
+ return filteredPackages;
72
77
  };
73
78
  const resolvePackageInfo = async (packagePath) => {
74
79
  try {
@@ -14,6 +14,7 @@ export declare class MonorepoAnalyzer {
14
14
  analyze(): Promise<MonorepoAnalysisResult>;
15
15
  private findMonorepoRoot;
16
16
  private discoverPackages;
17
+ private discoverSinglePackage;
17
18
  private resolvePackageInfo;
18
19
  private buildDependencyGraph;
19
20
  private calculateLevels;
@@ -26,14 +26,25 @@ export class MonorepoAnalyzer {
26
26
  }
27
27
  const monorepoRoot = await this.findMonorepoRoot(cwd);
28
28
  if (!monorepoRoot) {
29
- throw new Error(
30
- 'No monorepo found. Ensure package.json has "workspaces" field.'
31
- );
32
- }
33
- if (verbose) {
34
- logger.info(` Monorepo root: ${monorepoRoot}`);
29
+ const currentDir = cwd || process.cwd();
30
+ const singlePkg = await this.discoverSinglePackage(currentDir);
31
+ if (singlePkg) {
32
+ this.packages = [singlePkg];
33
+ if (verbose) {
34
+ logger.info(` Single package root: ${currentDir}`);
35
+ logger.info(" Found 1 package");
36
+ }
37
+ } else {
38
+ throw new Error(
39
+ 'No monorepo or valid package found. Ensure package.json has "workspaces" field or contains a valid "name" field.'
40
+ );
41
+ }
42
+ } else {
43
+ if (verbose) {
44
+ logger.info(` Monorepo root: ${monorepoRoot}`);
45
+ }
46
+ this.packages = await this.discoverPackages(monorepoRoot);
35
47
  }
36
- this.packages = await this.discoverPackages(monorepoRoot);
37
48
  if (verbose) {
38
49
  logger.info(` Found ${this.packages.length} packages`);
39
50
  }
@@ -98,11 +109,38 @@ export class MonorepoAnalyzer {
98
109
  }
99
110
  }
100
111
  }
112
+ const filteredPackages = packages.filter((pkg) => {
113
+ const normalizedPkgPath = resolve(pkg.path);
114
+ const normalizedRootPath = resolve(monorepoRoot);
115
+ return normalizedPkgPath !== normalizedRootPath;
116
+ });
101
117
  if (this.options.ignore) {
102
118
  const ignoreFilter = createIgnoreFilter(this.options.ignore);
103
- return ignoreFilter(packages);
119
+ return ignoreFilter(filteredPackages);
120
+ }
121
+ return filteredPackages;
122
+ }
123
+ async discoverSinglePackage(packagePath) {
124
+ try {
125
+ const pkg = await readPackageJSON(packagePath);
126
+ if (!pkg || !pkg.name) return null;
127
+ const dependencies = [
128
+ ...Object.keys(pkg.dependencies ?? {}),
129
+ ...this.options.includeDevDependencies ? Object.keys(pkg.devDependencies ?? {}) : [],
130
+ ...Object.keys(pkg.peerDependencies ?? {})
131
+ ];
132
+ return {
133
+ name: pkg.name,
134
+ path: packagePath,
135
+ dependencies,
136
+ dependents: [],
137
+ // Will be filled later
138
+ buildTime: 0,
139
+ size: 0
140
+ };
141
+ } catch {
142
+ return null;
104
143
  }
105
- return packages;
106
144
  }
107
145
  async resolvePackageInfo(packagePath) {
108
146
  const pkgJsonPath = join(packagePath, "package.json");
@@ -123,14 +123,18 @@ const publishCmdArgs = defineCmdArgs({
123
123
  });
124
124
  const publishCmdCfg = defineCmdCfg({
125
125
  name: "publish",
126
- description: "Publish workspace packages to npm registry using Bun's native publish command. Automatically handles version bumping, package.json modification, and dist folder validation. Supports dler.ts configuration for per-package settings.",
126
+ description: "Publish workspace packages or single package to npm registry using Bun's native publish command. Automatically handles version bumping, package.json modification, and dist folder validation. Supports both monorepo and single-repo projects. Supports dler.ts configuration for per-package settings.",
127
127
  examples: [
128
128
  "dler publish",
129
+ "",
130
+ "# Monorepo examples:",
129
131
  'dler publish --ignore "@reliverse/*"',
130
132
  'dler publish --ignore "@reliverse/dler-colors" --ignore "@reliverse/dler-v1"',
131
133
  'dler publish --ignore "@reliverse/dler-colors @reliverse/dler-v1"',
132
134
  "dler publish --cwd /path/to/monorepo",
133
135
  "dler publish --cwd /path/to/monorepo --ignore @reliverse/*",
136
+ "",
137
+ "# Single-repo examples:",
134
138
  "dler publish --bump patch",
135
139
  "dler publish --bump minor --tag next",
136
140
  "dler publish --bump major --access public",
@@ -59,8 +59,19 @@ const getWorkspacePackages = async (cwd) => {
59
59
  const startTime = Date.now();
60
60
  const monorepoRoot = await findMonorepoRoot(cwd);
61
61
  if (!monorepoRoot) {
62
+ const currentDir = cwd || process.cwd();
63
+ const pkgInfo = await resolvePackageInfo(currentDir);
64
+ if (pkgInfo) {
65
+ return {
66
+ packages: [pkgInfo],
67
+ monorepoRoot: currentDir,
68
+ discoveryTime: Date.now() - startTime,
69
+ cacheHits: 0,
70
+ cacheMisses: 1
71
+ };
72
+ }
62
73
  throw new Error(
63
- "\u274C No monorepo found. Ensure package.json has 'workspaces' field."
74
+ "\u274C No monorepo or valid package found. Ensure package.json has 'workspaces' field or contains a valid 'name' field."
64
75
  );
65
76
  }
66
77
  const rootPkg = await readPackageJSON(monorepoRoot);
@@ -99,14 +110,19 @@ const getWorkspacePackages = async (cwd) => {
99
110
  { concurrency: DISCOVERY_CONCURRENCY }
100
111
  );
101
112
  const packages = packageResults.filter((result) => result.pkgInfo !== null).map((result) => result.pkgInfo);
113
+ const filteredPackages = packages.filter((pkg) => {
114
+ const normalizedPkgPath = resolve(pkg.path);
115
+ const normalizedRootPath = resolve(monorepoRoot);
116
+ return normalizedPkgPath !== normalizedRootPath;
117
+ });
102
118
  const discoveryTime = Date.now() - startTime;
103
119
  return {
104
- packages,
120
+ packages: filteredPackages,
105
121
  monorepoRoot,
106
122
  discoveryTime,
107
123
  cacheHits: 0,
108
124
  // Will be updated by cache layer
109
- cacheMisses: packages.length
125
+ cacheMisses: filteredPackages.length
110
126
  };
111
127
  };
112
128
  const filterPackages = (packages, ignore) => {
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.0.25",
5
+ "version": "2.0.27",
6
6
  "private": false,
7
7
  "type": "module",
8
8
  "bin": {
@@ -13,16 +13,16 @@
13
13
  "semver": "^7.7.3",
14
14
  "lookpath": "^1.2.3",
15
15
  "clipboardy": "^5.0.0",
16
- "@reliverse/dler-publish": "2.0.25",
17
- "@reliverse/dler-bump": "2.0.25",
18
- "@reliverse/dler-build": "2.0.25",
19
- "@reliverse/dler-logger": "2.0.25",
20
- "@reliverse/dler-matcher": "2.0.25",
21
- "@reliverse/dler-launcher": "2.0.25",
22
- "@reliverse/dler-prompt": "2.0.25",
23
- "@reliverse/dler-helpers": "2.0.25",
24
- "@reliverse/dler-pkg-tsc": "2.0.25",
25
- "@reliverse/dler-mapper": "2.0.25"
16
+ "@reliverse/dler-publish": "2.0.27",
17
+ "@reliverse/dler-bump": "2.0.27",
18
+ "@reliverse/dler-build": "2.0.27",
19
+ "@reliverse/dler-logger": "2.0.27",
20
+ "@reliverse/dler-matcher": "2.0.27",
21
+ "@reliverse/dler-launcher": "2.0.27",
22
+ "@reliverse/dler-prompt": "2.0.27",
23
+ "@reliverse/dler-helpers": "2.0.27",
24
+ "@reliverse/dler-pkg-tsc": "2.0.27",
25
+ "@reliverse/dler-mapper": "2.0.27"
26
26
  },
27
27
  "keywords": [
28
28
  "dler",