@lofcz/depset 0.1.1
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/LICENSE +21 -0
- package/README.md +92 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +340 -0
- package/dist/index.js.map +1 -0
- package/package.json +63 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) Ziad Beyens, Felix Feng
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
|
13
|
+
all copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
21
|
+
THE SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# depset
|
|
2
|
+
|
|
3
|
+
A command-line tool to synchronize package dependencies in your `package.json` to their latest versions, a specific target version, or versions matching a pattern.
|
|
4
|
+
|
|
5
|
+
## Invocation
|
|
6
|
+
|
|
7
|
+
Run `depset` using your preferred package manager:
|
|
8
|
+
|
|
9
|
+
- **npx:**
|
|
10
|
+
```bash
|
|
11
|
+
npx depset@latest [args...]
|
|
12
|
+
```
|
|
13
|
+
- **pnpm:**
|
|
14
|
+
```bash
|
|
15
|
+
pnpm dlx depset@latest [args...]
|
|
16
|
+
```
|
|
17
|
+
- **yarn:**
|
|
18
|
+
```bash
|
|
19
|
+
yarn dlx depset@latest [args...]
|
|
20
|
+
```
|
|
21
|
+
- **bun:**
|
|
22
|
+
```bash
|
|
23
|
+
bunx depset@latest [args...]
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Usage
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
depset [package-specifier] [target-version] [options]
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Arguments
|
|
33
|
+
|
|
34
|
+
- **`[package-specifier]`** (Optional)\
|
|
35
|
+
The package name or pattern to target. If omitted (and `--yes` is not used), you will be prompted.
|
|
36
|
+
|
|
37
|
+
- **Exact Name:** e.g., `lodash`, `@babel/core`
|
|
38
|
+
- **Scope:** e.g., `@myorg` (targets packages like `@myorg/component-a`, `@myorg/utils`)
|
|
39
|
+
- **Prefix:** e.g., `eslint-*` (targets packages like `eslint-plugin-react`, `eslint-config-next`)
|
|
40
|
+
|
|
41
|
+
- **`[target-version]`** (Optional)\
|
|
42
|
+
The maximum version to synchronize to (e.g., "1", "1.2", "1.2.3"). If omitted (and neither `--latest` nor `--yes` are used), you will be prompted. If `--latest` is used, this is ignored.
|
|
43
|
+
|
|
44
|
+
## Options
|
|
45
|
+
|
|
46
|
+
```txt
|
|
47
|
+
Usage: depset [options] [package-specifier] [target-version]
|
|
48
|
+
|
|
49
|
+
Synchronize package dependencies to their latest or a specific version.
|
|
50
|
+
|
|
51
|
+
Arguments:
|
|
52
|
+
package-specifier Package name or pattern (e.g., "@scope/foo*", "my-package", "@myorg").
|
|
53
|
+
Prompts if not provided (unless -y is used).
|
|
54
|
+
target-version Target version (e.g., "1.2.3"). Prompts if not provided (unless -L or -y is used).
|
|
55
|
+
Defaults to latest if left blank in prompt or if -L is used.
|
|
56
|
+
|
|
57
|
+
Options:
|
|
58
|
+
-L, --latest Use the latest version, skip version prompt. (default: false)
|
|
59
|
+
-i, --install Automatically run install after updating package.json. (default: false)
|
|
60
|
+
-y, --yes Skip all confirmation prompts. (default: false)
|
|
61
|
+
-c, --cwd <path> Set the current working directory. (default: current directory)
|
|
62
|
+
-s, --silent Silence all output except for errors. (default: false)
|
|
63
|
+
-v, --version Display the version number.
|
|
64
|
+
-h, --help Display help for command.
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Examples
|
|
68
|
+
|
|
69
|
+
1. **Sync `lodash` to its latest version (prompts for version if not specified with `--latest`):**
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
npx depset@latest lodash
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
2. **Sync all packages in the `@babel` scope to their absolute latest versions, and install, skipping all prompts:**
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
npx depset@latest @babel --latest --install --yes
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
3. **Sync packages starting with `eslint-` up to version `8.50.0`:**
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
npx depset@latest "eslint-*" 8.50.0
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
_(You will be prompted to confirm changes and installation unless `-y` is used)_
|
|
88
|
+
|
|
89
|
+
4. **Run interactively, prompting for all inputs:**
|
|
90
|
+
```bash
|
|
91
|
+
npx depset@latest
|
|
92
|
+
```
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { exec, execSync } from "node:child_process";
|
|
3
|
+
import fs from "node:fs/promises";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { promisify } from "node:util";
|
|
6
|
+
import { Command } from "commander";
|
|
7
|
+
import prompts from "prompts";
|
|
8
|
+
import { ZodError, z } from "zod";
|
|
9
|
+
import { detect } from "@antfu/ni";
|
|
10
|
+
import { cyan, green, red, yellow } from "kleur/colors";
|
|
11
|
+
import ora from "ora";
|
|
12
|
+
|
|
13
|
+
//#region package.json
|
|
14
|
+
var version = "0.1.1";
|
|
15
|
+
|
|
16
|
+
//#endregion
|
|
17
|
+
//#region src/utils/get-package-manager.ts
|
|
18
|
+
async function getPackageManager(targetDir, { programmatic = true, withFallback = true } = {}) {
|
|
19
|
+
const detected = await detect({
|
|
20
|
+
cwd: targetDir,
|
|
21
|
+
programmatic
|
|
22
|
+
});
|
|
23
|
+
if (detected) {
|
|
24
|
+
if (detected.startsWith("yarn")) return "yarn";
|
|
25
|
+
if (detected.startsWith("pnpm")) return "pnpm";
|
|
26
|
+
if (detected === "bun") return "bun";
|
|
27
|
+
if (detected === "npm") return "npm";
|
|
28
|
+
}
|
|
29
|
+
if (withFallback) {
|
|
30
|
+
const userAgent = process.env.npm_config_user_agent || "";
|
|
31
|
+
if (userAgent.startsWith("yarn")) return "yarn";
|
|
32
|
+
if (userAgent.startsWith("pnpm")) return "pnpm";
|
|
33
|
+
if (userAgent.startsWith("bun")) return "bun";
|
|
34
|
+
}
|
|
35
|
+
return "npm";
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
//#endregion
|
|
39
|
+
//#region src/utils/logger.ts
|
|
40
|
+
const highlighter = {
|
|
41
|
+
error: red,
|
|
42
|
+
info: cyan,
|
|
43
|
+
success: green,
|
|
44
|
+
warn: yellow
|
|
45
|
+
};
|
|
46
|
+
const logger = {
|
|
47
|
+
break() {
|
|
48
|
+
console.log("");
|
|
49
|
+
},
|
|
50
|
+
error(...args) {
|
|
51
|
+
console.log(highlighter.error(args.join(" ")));
|
|
52
|
+
},
|
|
53
|
+
info(...args) {
|
|
54
|
+
console.log(highlighter.info(args.join(" ")));
|
|
55
|
+
},
|
|
56
|
+
log(...args) {
|
|
57
|
+
console.log(args.join(" "));
|
|
58
|
+
},
|
|
59
|
+
success(...args) {
|
|
60
|
+
console.log(highlighter.success(args.join(" ")));
|
|
61
|
+
},
|
|
62
|
+
warn(...args) {
|
|
63
|
+
console.log(highlighter.warn(args.join(" ")));
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
//#endregion
|
|
68
|
+
//#region src/utils/handle-error.ts
|
|
69
|
+
function handleError(error) {
|
|
70
|
+
logger.error("Something went wrong. Please check the error below for more details.");
|
|
71
|
+
if (typeof error === "string") logger.error(error);
|
|
72
|
+
else if (error instanceof ZodError) {
|
|
73
|
+
logger.error("Validation failed:");
|
|
74
|
+
for (const [key, value] of Object.entries(error.flatten().fieldErrors)) logger.error(`- ${highlighter.info(key)}: ${value.join(", ")}`);
|
|
75
|
+
} else if (error instanceof Error) logger.error(error.message);
|
|
76
|
+
logger.break();
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
//#endregion
|
|
81
|
+
//#region src/utils/spinner.ts
|
|
82
|
+
function spinner(text, options) {
|
|
83
|
+
return ora({
|
|
84
|
+
isSilent: options?.silent,
|
|
85
|
+
text
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
//#endregion
|
|
90
|
+
//#region src/index.ts
|
|
91
|
+
process.on("SIGINT", () => process.exit(0));
|
|
92
|
+
process.on("SIGTERM", () => process.exit(0));
|
|
93
|
+
const execPromise = promisify(exec);
|
|
94
|
+
const VERSION_PREFIX_REGEX = /^\D*/;
|
|
95
|
+
const DepSyncOptionsSchema = z.object({
|
|
96
|
+
packageSpecifier: z.string().min(1, "Package specifier is required."),
|
|
97
|
+
targetVersion: z.string().optional(),
|
|
98
|
+
install: z.boolean().default(false),
|
|
99
|
+
yes: z.boolean().default(false),
|
|
100
|
+
cwd: z.string().default(process.cwd()),
|
|
101
|
+
silent: z.boolean().default(false),
|
|
102
|
+
latest: z.boolean().optional()
|
|
103
|
+
});
|
|
104
|
+
async function getPackageJson(cwd, options) {
|
|
105
|
+
const targetPath = path.join(cwd, "./package.json");
|
|
106
|
+
const sp = spinner(`Reading package.json from ${targetPath}`, { silent: options.silent })?.start();
|
|
107
|
+
try {
|
|
108
|
+
const fileContent = await fs.readFile(targetPath, "utf8");
|
|
109
|
+
sp?.succeed("Successfully read package.json");
|
|
110
|
+
return JSON.parse(fileContent);
|
|
111
|
+
} catch (error) {
|
|
112
|
+
sp?.fail(`Error reading package.json at ${targetPath}`);
|
|
113
|
+
handleError(error);
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async function fetchPackageVersion(pkg, targetVersionString) {
|
|
118
|
+
try {
|
|
119
|
+
const { stdout } = await execPromise(`npm view ${targetVersionString ? `${pkg}@"<=${targetVersionString}"` : pkg} version --json`);
|
|
120
|
+
const versions = JSON.parse(stdout);
|
|
121
|
+
const latestMatchingVersion = Array.isArray(versions) ? versions.at(-1) : versions;
|
|
122
|
+
if (latestMatchingVersion) return latestMatchingVersion.trim();
|
|
123
|
+
return null;
|
|
124
|
+
} catch (error) {
|
|
125
|
+
logger.error(error.message);
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async function fetchPackageVersions(packagesToFetch, currentPackageJson, options) {
|
|
130
|
+
const specifierDisplay = options.packageSpecifier ? ` matching "${options.packageSpecifier}"` : "";
|
|
131
|
+
const fetchingMessage = options.targetVersion ? `Fetching latest package versions${specifierDisplay} (up to ${options.targetVersion})` : `Fetching latest package versions${specifierDisplay}`;
|
|
132
|
+
logger.info(fetchingMessage);
|
|
133
|
+
const sp = spinner("Fetching package versions in parallel...", { silent: options.silent })?.start();
|
|
134
|
+
const versionPromises = packagesToFetch.map(async (pkg) => {
|
|
135
|
+
const version$1 = await fetchPackageVersion(pkg, options.targetVersion);
|
|
136
|
+
if (version$1) return [pkg, {
|
|
137
|
+
currentVersion: currentPackageJson.dependencies?.[pkg]?.replace(VERSION_PREFIX_REGEX, "") || currentPackageJson.devDependencies?.[pkg]?.replace(VERSION_PREFIX_REGEX, "") || "Not installed",
|
|
138
|
+
version: version$1
|
|
139
|
+
}];
|
|
140
|
+
return null;
|
|
141
|
+
});
|
|
142
|
+
const results = await Promise.all(versionPromises);
|
|
143
|
+
const versionMap = new Map(results.filter(Boolean));
|
|
144
|
+
sp?.succeed("Finished fetching package versions.");
|
|
145
|
+
return versionMap;
|
|
146
|
+
}
|
|
147
|
+
async function preparePackageUpdates(currentPackageJson, versionMap) {
|
|
148
|
+
const updatedPackages = [];
|
|
149
|
+
const newPackageJson = JSON.parse(JSON.stringify(currentPackageJson));
|
|
150
|
+
for (const [name, versions] of Array.from(versionMap.entries())) {
|
|
151
|
+
let changed = false;
|
|
152
|
+
if (newPackageJson.dependencies?.[name] && newPackageJson.dependencies[name].replace(VERSION_PREFIX_REGEX, "") !== versions.version) {
|
|
153
|
+
newPackageJson.dependencies[name] = versions.version;
|
|
154
|
+
changed = true;
|
|
155
|
+
}
|
|
156
|
+
if (newPackageJson.devDependencies?.[name] && newPackageJson.devDependencies[name].replace(VERSION_PREFIX_REGEX, "") !== versions.version) {
|
|
157
|
+
newPackageJson.devDependencies[name] = versions.version;
|
|
158
|
+
changed = true;
|
|
159
|
+
}
|
|
160
|
+
if (changed) updatedPackages.push({
|
|
161
|
+
name,
|
|
162
|
+
currentVersion: versions.currentVersion,
|
|
163
|
+
newVersion: versions.version
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
return {
|
|
167
|
+
updatedPackages,
|
|
168
|
+
newPackageJsonString: JSON.stringify(newPackageJson, null, 2)
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
async function runSync(options) {
|
|
172
|
+
let mainSpinner = spinner("Starting dependency synchronization...", { silent: options.silent })?.start();
|
|
173
|
+
let packageFilterFn;
|
|
174
|
+
let matchDescription;
|
|
175
|
+
if (options.packageSpecifier.endsWith("*")) {
|
|
176
|
+
const prefix = options.packageSpecifier.slice(0, -1);
|
|
177
|
+
packageFilterFn = (pkgName) => pkgName.startsWith(prefix);
|
|
178
|
+
matchDescription = `packages starting with "${prefix}"`;
|
|
179
|
+
} else if (options.packageSpecifier.startsWith("@") && !options.packageSpecifier.includes("/")) {
|
|
180
|
+
const scopeAsExact = options.packageSpecifier;
|
|
181
|
+
const scopeAsPrefix = `${options.packageSpecifier}/`;
|
|
182
|
+
packageFilterFn = (pkgName) => pkgName.startsWith(scopeAsPrefix) || pkgName === scopeAsExact;
|
|
183
|
+
matchDescription = `packages in scope "${options.packageSpecifier}"`;
|
|
184
|
+
} else {
|
|
185
|
+
packageFilterFn = (pkgName) => pkgName === options.packageSpecifier;
|
|
186
|
+
matchDescription = `package "${options.packageSpecifier}"`;
|
|
187
|
+
}
|
|
188
|
+
logger.info(`\nSynchronizing ${matchDescription}`);
|
|
189
|
+
if (options.targetVersion) logger.info(`Targeting version: ${options.targetVersion}`);
|
|
190
|
+
logger.info(`Working directory: ${options.cwd}`);
|
|
191
|
+
if (!options.yes) {
|
|
192
|
+
mainSpinner.stop();
|
|
193
|
+
mainSpinner.clear();
|
|
194
|
+
mainSpinner = spinner("Processing packages...", { silent: options.silent })?.start();
|
|
195
|
+
}
|
|
196
|
+
const currentPackageJson = await getPackageJson(options.cwd, options);
|
|
197
|
+
if (!currentPackageJson) return;
|
|
198
|
+
const allDependencies = {
|
|
199
|
+
...currentPackageJson.dependencies || {},
|
|
200
|
+
...currentPackageJson.devDependencies || {}
|
|
201
|
+
};
|
|
202
|
+
const packagesToFetch = Object.keys(allDependencies).filter(packageFilterFn);
|
|
203
|
+
if (packagesToFetch.length === 0) {
|
|
204
|
+
mainSpinner.warn(`No packages found in dependencies for ${matchDescription}.`);
|
|
205
|
+
if (options.packageSpecifier && !options.packageSpecifier.endsWith("*") && !options.packageSpecifier.includes("/")) logger.info(`Did you mean '${options.packageSpecifier}/*' or an exact package name like '${options.packageSpecifier}/some-package'?`);
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
logger.info(`Found ${packagesToFetch.length} package${packagesToFetch.length === 1 ? "" : "s"} to check: ${packagesToFetch.join(", ")}`);
|
|
209
|
+
const versionMap = await fetchPackageVersions(packagesToFetch, currentPackageJson, options);
|
|
210
|
+
if (versionMap.size === 0 && packagesToFetch.length > 0) {
|
|
211
|
+
mainSpinner.warn("Could not fetch versions for any of the targeted packages.");
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
if (versionMap.size === 0 && packagesToFetch.length === 0) {
|
|
215
|
+
mainSpinner.info("No packages matched the specifier.");
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
const { updatedPackages, newPackageJsonString } = await preparePackageUpdates(currentPackageJson, versionMap);
|
|
219
|
+
mainSpinner.succeed("Package analysis complete.");
|
|
220
|
+
if (updatedPackages.length > 0) {
|
|
221
|
+
logger.info("The following packages will be updated:");
|
|
222
|
+
updatedPackages.forEach(({ name, currentVersion, newVersion }) => {
|
|
223
|
+
logger.log(` ${name}: ${currentVersion} -> ${newVersion}`);
|
|
224
|
+
});
|
|
225
|
+
logger.break();
|
|
226
|
+
let proceed = options.yes;
|
|
227
|
+
if (!options.yes) {
|
|
228
|
+
const { confirmUpdate } = await prompts({
|
|
229
|
+
type: "confirm",
|
|
230
|
+
name: "confirmUpdate",
|
|
231
|
+
message: "Apply these changes to package.json?",
|
|
232
|
+
initial: true
|
|
233
|
+
});
|
|
234
|
+
proceed = confirmUpdate;
|
|
235
|
+
}
|
|
236
|
+
if (proceed) {
|
|
237
|
+
const writeSpinner = spinner("Updating package.json...", { silent: options.silent })?.start();
|
|
238
|
+
try {
|
|
239
|
+
await fs.writeFile(path.join(options.cwd, "./package.json"), newPackageJsonString);
|
|
240
|
+
writeSpinner?.succeed("package.json updated successfully.");
|
|
241
|
+
} catch (error) {
|
|
242
|
+
writeSpinner?.fail("Error writing to package.json.");
|
|
243
|
+
handleError(error);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
let shouldRunInstall = false;
|
|
247
|
+
if (options.install) shouldRunInstall = true;
|
|
248
|
+
else if (options.yes) shouldRunInstall = true;
|
|
249
|
+
else {
|
|
250
|
+
const { confirmInstall } = await prompts({
|
|
251
|
+
type: "confirm",
|
|
252
|
+
name: "confirmInstall",
|
|
253
|
+
message: "Run package manager install command to apply these changes?",
|
|
254
|
+
initial: true
|
|
255
|
+
});
|
|
256
|
+
shouldRunInstall = confirmInstall;
|
|
257
|
+
}
|
|
258
|
+
if (shouldRunInstall) {
|
|
259
|
+
const installCommand = `${await getPackageManager(options.cwd)} install`;
|
|
260
|
+
const installSpinner = spinner(`Running \`${installCommand}\`...`, { silent: options.silent })?.start();
|
|
261
|
+
try {
|
|
262
|
+
execSync(installCommand, {
|
|
263
|
+
cwd: options.cwd,
|
|
264
|
+
stdio: options.silent ? "pipe" : "inherit"
|
|
265
|
+
});
|
|
266
|
+
installSpinner?.succeed(`Successfully ran \`${installCommand}\``);
|
|
267
|
+
} catch (error) {
|
|
268
|
+
installSpinner?.fail(`Error running \`${installCommand}\``);
|
|
269
|
+
handleError(error);
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
} else if (updatedPackages.length > 0 && !options.install && options.yes) logger.info("Skipping package installation as --install was not provided with --yes.");
|
|
273
|
+
else if (updatedPackages.length > 0 && !shouldRunInstall) logger.info("Skipping package installation.");
|
|
274
|
+
} else logger.info("Changes to package.json were not applied by user.");
|
|
275
|
+
} else logger.success("All specified packages are already up to date.");
|
|
276
|
+
logger.break();
|
|
277
|
+
}
|
|
278
|
+
async function main() {
|
|
279
|
+
const program = new Command();
|
|
280
|
+
program.name("depset").description("Synchronize package dependencies to their latest or a specific version.").version(version || "0.1.0", "-v, --version", "display the version number").argument("[package-specifier]", "Package name or pattern (e.g., \"@scope/foo*\", \"my-package\", \"@myorg\")").argument("[target-version]", "Target version (e.g., \"1.2.3\") - defaults to latest if omitted").option("-i, --install", "Automatically run install after updating package.json", false).option("-y, --yes", "Skip all confirmation prompts", false).option("-c, --cwd <path>", "Set the current working directory", process.cwd()).option("-s, --silent", "Silence all output except for errors", false).option("-L, --latest", "Use the latest version, skip version prompt", false).action(async (packageSpecifierArg, targetVersionArg, cliOpts) => {
|
|
281
|
+
try {
|
|
282
|
+
let pkgSpec = packageSpecifierArg;
|
|
283
|
+
let targetVer = targetVersionArg;
|
|
284
|
+
if (!pkgSpec && !cliOpts.yes) {
|
|
285
|
+
const response = await prompts({
|
|
286
|
+
type: "text",
|
|
287
|
+
name: "packageSpecifier",
|
|
288
|
+
message: "Enter the package name or pattern to synchronize:",
|
|
289
|
+
validate: (value) => value && value.trim().length > 0 ? true : "Package specifier cannot be empty."
|
|
290
|
+
});
|
|
291
|
+
if (!response.packageSpecifier) {
|
|
292
|
+
logger.warn("Package specifier is required. Exiting.");
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
pkgSpec = response.packageSpecifier;
|
|
296
|
+
} else if (!pkgSpec && cliOpts.yes) {
|
|
297
|
+
logger.error("Error: package-specifier is required.");
|
|
298
|
+
process.exit(1);
|
|
299
|
+
}
|
|
300
|
+
if (!targetVer && !cliOpts.yes && !cliOpts.latest) targetVer = (await prompts({
|
|
301
|
+
type: "text",
|
|
302
|
+
name: "targetVersion",
|
|
303
|
+
message: "Enter the target version (e.g., \"1.2.3\", or leave blank for latest):"
|
|
304
|
+
})).targetVersion || void 0;
|
|
305
|
+
else if (cliOpts.latest) targetVer = void 0;
|
|
306
|
+
const rawOptions = {
|
|
307
|
+
packageSpecifier: pkgSpec,
|
|
308
|
+
targetVersion: targetVer,
|
|
309
|
+
install: cliOpts.install,
|
|
310
|
+
yes: cliOpts.yes,
|
|
311
|
+
cwd: cliOpts.cwd,
|
|
312
|
+
silent: cliOpts.silent,
|
|
313
|
+
latest: cliOpts.latest
|
|
314
|
+
};
|
|
315
|
+
const options = DepSyncOptionsSchema.parse(rawOptions);
|
|
316
|
+
if (options.silent) {
|
|
317
|
+
logger.info = () => {};
|
|
318
|
+
logger.success = () => {};
|
|
319
|
+
logger.warn = () => {};
|
|
320
|
+
logger.log = () => {};
|
|
321
|
+
logger.break = () => {};
|
|
322
|
+
}
|
|
323
|
+
await runSync(options);
|
|
324
|
+
} catch (error) {
|
|
325
|
+
const originalLogger = { ...logger };
|
|
326
|
+
if (cliOpts.silent) {
|
|
327
|
+
logger.error = console.error;
|
|
328
|
+
logger.break = () => console.log("");
|
|
329
|
+
}
|
|
330
|
+
handleError(error);
|
|
331
|
+
if (cliOpts.silent) Object.assign(logger, originalLogger);
|
|
332
|
+
}
|
|
333
|
+
});
|
|
334
|
+
await program.parseAsync(process.argv);
|
|
335
|
+
}
|
|
336
|
+
main();
|
|
337
|
+
|
|
338
|
+
//#endregion
|
|
339
|
+
export { };
|
|
340
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["createSpinner","error: any","version","updatedPackages: Array<{\n name: string;\n currentVersion: string;\n newVersion: string;\n }>","packageFilterFn: (pkgName: string) => boolean","matchDescription: string","packageJson.version"],"sources":["../package.json","../src/utils/get-package-manager.ts","../src/utils/logger.ts","../src/utils/handle-error.ts","../src/utils/spinner.ts","../src/index.ts"],"sourcesContent":["{\n \"name\": \"@lofcz/depset\",\n \"version\": \"0.1.1\",\n \"description\": \"Synchronize dependencies in package.json\",\n \"keywords\": [\n \"dependencies\",\n \"package.json\",\n \"sync\",\n \"upgrade\",\n \"version\",\n \"yarn\",\n \"pnpm\",\n \"npm\",\n \"bun\"\n ],\n \"homepage\": \"https://github.com/udecode/plate/packages/udecode/depset/README.md\",\n \"bugs\": {\n \"url\": \"https://github.com/udecode/plate/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/lofcz/plate.git\",\n \"directory\": \"packages/udecode/depset\"\n },\n \"license\": \"MIT\",\n \"sideEffects\": false,\n \"type\": \"module\",\n \"exports\": {\n \".\": \"./dist/index.js\",\n \"./package.json\": \"./package.json\"\n },\n \"bin\": \"./dist/index.js\",\n \"files\": [\n \"dist/**/*\"\n ],\n \"scripts\": {\n \"build\": \"tsdown --log-level warn\",\n \"build:watch\": \"tsdown --watch\",\n \"lint\": \"plate-pkg p:lint\",\n \"lint:fix\": \"plate-pkg p:lint:fix\",\n \"clean\": \"plate-pkg p:clean\",\n \"start\": \"node dist/index.js\",\n \"typecheck\": \"plate-pkg p:typecheck\"\n },\n \"dependencies\": {\n \"@antfu/ni\": \"24.3.0\",\n \"commander\": \"14.0.0\",\n \"kleur\": \"4.1.5\",\n \"ora\": \"8.2.0\",\n \"prompts\": \"2.4.2\",\n \"zod\": \"3.25.61\"\n },\n \"devDependencies\": {\n \"@plate/scripts\": \"workspace:*\",\n \"@types/prompts\": \"2.4.9\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\"\n}\n","import { detect } from '@antfu/ni';\n\nexport type PackageManager = 'bun' | 'npm' | 'pnpm' | 'yarn';\n\nexport async function getPackageManager(\n targetDir: string,\n {\n programmatic = true, // ni specific\n withFallback = true,\n }: { programmatic?: boolean; withFallback?: boolean } = {}\n): Promise<PackageManager> {\n const detected = await detect({ cwd: targetDir, programmatic });\n\n if (detected) {\n if (detected.startsWith('yarn')) return 'yarn'; // Catches yarn and yarn@berry\n if (detected.startsWith('pnpm')) return 'pnpm'; // Catches pnpm and pnpm@version\n if (detected === 'bun') return 'bun';\n if (detected === 'npm') return 'npm';\n }\n\n if (withFallback) {\n // Fallback to user agent if not detected.\n const userAgent = process.env.npm_config_user_agent || '';\n\n if (userAgent.startsWith('yarn')) {\n return 'yarn';\n }\n if (userAgent.startsWith('pnpm')) {\n return 'pnpm';\n }\n if (userAgent.startsWith('bun')) {\n return 'bun';\n }\n }\n\n return 'npm'; // Default or if no fallback matched\n}\n","import { cyan, green, red, yellow } from 'kleur/colors';\n\nexport const highlighter = {\n error: red,\n info: cyan,\n success: green,\n warn: yellow,\n};\n\nexport const logger = {\n break() {\n console.log('');\n },\n error(...args: unknown[]) {\n console.log(highlighter.error(args.join(' ')));\n },\n info(...args: unknown[]) {\n console.log(highlighter.info(args.join(' ')));\n },\n log(...args: unknown[]) {\n console.log(args.join(' '));\n },\n success(...args: unknown[]) {\n console.log(highlighter.success(args.join(' ')));\n },\n warn(...args: unknown[]) {\n console.log(highlighter.warn(args.join(' ')));\n },\n};\n","import { ZodError } from 'zod';\n\nimport { highlighter, logger } from './logger';\n\nexport function handleError(error: unknown): void {\n logger.error(\n 'Something went wrong. Please check the error below for more details.'\n );\n\n if (typeof error === 'string') {\n logger.error(error);\n } else if (error instanceof ZodError) {\n logger.error('Validation failed:');\n for (const [key, value] of Object.entries(error.flatten().fieldErrors)) {\n logger.error(\n `- ${highlighter.info(key)}: ${(value as string[]).join(', ')}`\n );\n }\n } else if (error instanceof Error) {\n logger.error(error.message);\n }\n\n logger.break();\n process.exit(1);\n}\n","import ora, { type Options } from 'ora';\n\nexport function spinner(\n text: Options['text'],\n options?: {\n silent?: boolean;\n }\n) {\n return ora({\n isSilent: options?.silent,\n text,\n });\n}\n","#!/usr/bin/env node\n\nimport { exec, execSync } from 'node:child_process';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\nimport { Command } from 'commander';\nimport prompts from 'prompts';\nimport { z } from 'zod';\nimport packageJson from '../package.json';\nimport { getPackageManager } from './utils/get-package-manager';\nimport { handleError } from './utils/handle-error';\nimport { logger } from './utils/logger';\nimport { spinner as createSpinner } from './utils/spinner';\n\nprocess.on('SIGINT', () => process.exit(0));\nprocess.on('SIGTERM', () => process.exit(0));\n\nconst execPromise = promisify(exec);\nconst VERSION_PREFIX_REGEX = /^\\D*/;\n\nconst DepSyncOptionsSchema = z.object({\n packageSpecifier: z.string().min(1, 'Package specifier is required.'),\n targetVersion: z.string().optional(),\n install: z.boolean().default(false),\n yes: z.boolean().default(false),\n cwd: z.string().default(process.cwd()),\n silent: z.boolean().default(false), // Added for global silent control\n latest: z.boolean().optional(), // Added for --latest flag\n});\n\ntype DepSyncOptions = z.infer<typeof DepSyncOptionsSchema>;\n\nasync function getPackageJson(\n cwd: string,\n options: Pick<DepSyncOptions, 'silent'>\n): Promise<any> {\n const targetPath = path.join(cwd, './package.json');\n const sp = createSpinner(`Reading package.json from ${targetPath}`, {\n silent: options.silent,\n })?.start();\n try {\n const fileContent = await fs.readFile(targetPath, 'utf8');\n sp?.succeed('Successfully read package.json');\n return JSON.parse(fileContent);\n } catch (error) {\n sp?.fail(`Error reading package.json at ${targetPath}`);\n handleError(error); // handleError will exit\n return null; // Should not be reached\n }\n}\n\nasync function fetchPackageVersion(\n pkg: string,\n targetVersionString: string | undefined\n): Promise<string | null> {\n try {\n const versionSpecifier = targetVersionString\n ? `${pkg}@\"<=${targetVersionString}\"`\n : pkg;\n const { stdout } = await execPromise(\n `npm view ${versionSpecifier} version --json`\n );\n const versions = JSON.parse(stdout);\n const latestMatchingVersion = Array.isArray(versions)\n ? versions.at(-1)\n : versions;\n\n if (latestMatchingVersion) {\n return latestMatchingVersion.trim();\n }\n return null;\n } catch (error: any) {\n logger.error(error.message);\n return null;\n }\n}\n\nasync function fetchPackageVersions(\n packagesToFetch: string[],\n currentPackageJson: any,\n options: DepSyncOptions\n): Promise<Map<string, { currentVersion: string; version: string }>> {\n const specifierDisplay = options.packageSpecifier\n ? ` matching \"${options.packageSpecifier}\"`\n : '';\n const fetchingMessage = options.targetVersion\n ? `Fetching latest package versions${specifierDisplay} (up to ${options.targetVersion})`\n : `Fetching latest package versions${specifierDisplay}`;\n logger.info(fetchingMessage);\n\n const sp = createSpinner('Fetching package versions in parallel...', {\n silent: options.silent,\n })?.start();\n\n const versionPromises = packagesToFetch.map(async (pkg) => {\n const version = await fetchPackageVersion(pkg, options.targetVersion);\n if (version) {\n const currentVersion =\n currentPackageJson.dependencies?.[pkg]?.replace(\n VERSION_PREFIX_REGEX,\n ''\n ) ||\n currentPackageJson.devDependencies?.[pkg]?.replace(\n VERSION_PREFIX_REGEX,\n ''\n ) ||\n 'Not installed';\n return [pkg, { currentVersion, version }];\n }\n return null;\n });\n\n const results = await Promise.all(versionPromises);\n const versionMap = new Map<\n string,\n { currentVersion: string; version: string }\n >(results.filter(Boolean) as any);\n sp?.succeed('Finished fetching package versions.');\n return versionMap;\n}\n\nasync function preparePackageUpdates(\n currentPackageJson: any,\n versionMap: Map<string, { currentVersion: string; version: string }>\n): Promise<{\n updatedPackages: Array<{\n name: string;\n currentVersion: string;\n newVersion: string;\n }>;\n newPackageJsonString: string;\n}> {\n const updatedPackages: Array<{\n name: string;\n currentVersion: string;\n newVersion: string;\n }> = [];\n const newPackageJson = JSON.parse(JSON.stringify(currentPackageJson)); // Deep clone\n\n for (const [name, versions] of Array.from(versionMap.entries())) {\n let changed = false;\n if (\n newPackageJson.dependencies?.[name] &&\n newPackageJson.dependencies[name].replace(VERSION_PREFIX_REGEX, '') !==\n versions.version\n ) {\n newPackageJson.dependencies[name] = versions.version; // Or keep prefix if present: `^${versions.version}`\n changed = true;\n }\n if (\n newPackageJson.devDependencies?.[name] &&\n newPackageJson.devDependencies[name].replace(VERSION_PREFIX_REGEX, '') !==\n versions.version\n ) {\n newPackageJson.devDependencies[name] = versions.version;\n changed = true;\n }\n\n if (changed) {\n updatedPackages.push({\n name,\n currentVersion: versions.currentVersion,\n newVersion: versions.version,\n });\n }\n }\n return {\n updatedPackages,\n newPackageJsonString: JSON.stringify(newPackageJson, null, 2),\n };\n}\n\nasync function runSync(options: DepSyncOptions) {\n let mainSpinner = createSpinner('Starting dependency synchronization...', {\n silent: options.silent,\n })?.start();\n\n let packageFilterFn: (pkgName: string) => boolean;\n let matchDescription: string;\n\n if (options.packageSpecifier.endsWith('*')) {\n const prefix = options.packageSpecifier.slice(0, -1);\n packageFilterFn = (pkgName) => pkgName.startsWith(prefix);\n matchDescription = `packages starting with \"${prefix}\"`;\n } else if (\n options.packageSpecifier.startsWith('@') &&\n !options.packageSpecifier.includes('/')\n ) {\n const scopeAsExact = options.packageSpecifier;\n const scopeAsPrefix = `${options.packageSpecifier}/`;\n packageFilterFn = (pkgName) =>\n pkgName.startsWith(scopeAsPrefix) || pkgName === scopeAsExact;\n matchDescription = `packages in scope \"${options.packageSpecifier}\"`;\n } else {\n packageFilterFn = (pkgName) => pkgName === options.packageSpecifier;\n matchDescription = `package \"${options.packageSpecifier}\"`;\n }\n\n logger.info(`\\nSynchronizing ${matchDescription}`);\n if (options.targetVersion) {\n logger.info(`Targeting version: ${options.targetVersion}`);\n }\n logger.info(`Working directory: ${options.cwd}`);\n\n if (!options.yes) {\n mainSpinner.stop();\n mainSpinner.clear();\n mainSpinner = createSpinner('Processing packages...', {\n silent: options.silent,\n })?.start();\n }\n\n const currentPackageJson = await getPackageJson(options.cwd, options);\n if (!currentPackageJson) return; // Error handled in getPackageJson\n\n const allDependencies = {\n ...(currentPackageJson.dependencies || {}),\n ...(currentPackageJson.devDependencies || {}),\n };\n\n const packagesToFetch = Object.keys(allDependencies).filter(packageFilterFn);\n\n if (packagesToFetch.length === 0) {\n mainSpinner.warn(\n `No packages found in dependencies for ${matchDescription}.`\n );\n if (\n options.packageSpecifier &&\n !options.packageSpecifier.endsWith('*') &&\n !options.packageSpecifier.includes('/')\n ) {\n logger.info(\n `Did you mean '${options.packageSpecifier}/*' or an exact package name like '${options.packageSpecifier}/some-package'?`\n );\n }\n return;\n }\n logger.info(\n `Found ${packagesToFetch.length} package${packagesToFetch.length === 1 ? '' : 's'} to check: ${packagesToFetch.join(', ')}`\n );\n\n const versionMap = await fetchPackageVersions(\n packagesToFetch,\n currentPackageJson,\n options\n );\n\n if (versionMap.size === 0 && packagesToFetch.length > 0) {\n mainSpinner.warn(\n 'Could not fetch versions for any of the targeted packages.'\n );\n return;\n }\n if (versionMap.size === 0 && packagesToFetch.length === 0) {\n // This case is already handled by the packagesToFetch.length === 0 check above, but good for clarity\n mainSpinner.info('No packages matched the specifier.');\n return;\n }\n\n const { updatedPackages, newPackageJsonString } = await preparePackageUpdates(\n currentPackageJson,\n versionMap\n );\n mainSpinner.succeed('Package analysis complete.');\n\n if (updatedPackages.length > 0) {\n logger.info('The following packages will be updated:');\n updatedPackages.forEach(({ name, currentVersion, newVersion }) => {\n logger.log(` ${name}: ${currentVersion} -> ${newVersion}`);\n });\n logger.break();\n\n let proceed = options.yes;\n if (!options.yes) {\n const { confirmUpdate } = await prompts({\n type: 'confirm',\n name: 'confirmUpdate',\n message: 'Apply these changes to package.json?',\n initial: true,\n });\n proceed = confirmUpdate;\n }\n\n if (proceed) {\n const writeSpinner = createSpinner('Updating package.json...', {\n silent: options.silent,\n })?.start();\n try {\n await fs.writeFile(\n path.join(options.cwd, './package.json'),\n newPackageJsonString\n );\n writeSpinner?.succeed('package.json updated successfully.');\n } catch (error) {\n writeSpinner?.fail('Error writing to package.json.');\n handleError(error);\n return;\n }\n\n // Decide whether to run install\n let shouldRunInstall = false;\n if (options.install) {\n // --install flag IS present\n shouldRunInstall = true;\n } else if (options.yes) {\n // --install flag IS NOT present, but --yes IS present\n shouldRunInstall = true;\n } else {\n // --install is NOT present, --yes is NOT present\n const { confirmInstall } = await prompts({\n type: 'confirm',\n name: 'confirmInstall',\n message:\n 'Run package manager install command to apply these changes?',\n initial: true,\n });\n shouldRunInstall = confirmInstall;\n }\n\n if (shouldRunInstall) {\n const pm = await getPackageManager(options.cwd);\n const installCommand = `${pm} install`;\n const installSpinner = createSpinner(\n `Running \\`${installCommand}\\`...`,\n { silent: options.silent }\n )?.start();\n try {\n execSync(installCommand, {\n cwd: options.cwd,\n stdio: options.silent ? 'pipe' : 'inherit',\n });\n installSpinner?.succeed(`Successfully ran \\`${installCommand}\\``);\n } catch (error) {\n installSpinner?.fail(`Error running \\`${installCommand}\\``);\n handleError(error); // Will exit\n return;\n }\n } else if (\n updatedPackages.length > 0 &&\n !options.install &&\n options.yes\n ) {\n logger.info(\n 'Skipping package installation as --install was not provided with --yes.'\n );\n } else if (updatedPackages.length > 0 && !shouldRunInstall) {\n logger.info('Skipping package installation.');\n }\n } else {\n logger.info('Changes to package.json were not applied by user.');\n }\n } else {\n logger.success('All specified packages are already up to date.');\n // Removed redundant logging here as installation prompting is handled above or not applicable\n }\n logger.break();\n}\n\nasync function main() {\n const program = new Command();\n program\n .name('depset')\n .description(\n 'Synchronize package dependencies to their latest or a specific version.'\n )\n .version(\n packageJson.version || '0.1.0',\n '-v, --version',\n 'display the version number'\n )\n .argument(\n '[package-specifier]',\n 'Package name or pattern (e.g., \"@scope/foo*\", \"my-package\", \"@myorg\")'\n )\n .argument(\n '[target-version]',\n 'Target version (e.g., \"1.2.3\") - defaults to latest if omitted'\n )\n .option(\n '-i, --install',\n 'Automatically run install after updating package.json',\n false\n )\n .option('-y, --yes', 'Skip all confirmation prompts', false)\n .option(\n '-c, --cwd <path>',\n 'Set the current working directory',\n process.cwd()\n )\n .option('-s, --silent', 'Silence all output except for errors', false)\n .option(\n '-L, --latest',\n 'Use the latest version, skip version prompt',\n false\n ) // Added --latest option\n .action(async (packageSpecifierArg, targetVersionArg, cliOpts) => {\n try {\n let pkgSpec = packageSpecifierArg;\n let targetVer = targetVersionArg;\n\n if (!pkgSpec && !cliOpts.yes) {\n const response = await prompts({\n type: 'text',\n name: 'packageSpecifier',\n message: 'Enter the package name or pattern to synchronize:',\n validate: (value) =>\n value && value.trim().length > 0\n ? true\n : 'Package specifier cannot be empty.',\n });\n if (!response.packageSpecifier) {\n logger.warn('Package specifier is required. Exiting.');\n return;\n }\n pkgSpec = response.packageSpecifier;\n } else if (!pkgSpec && cliOpts.yes) {\n logger.error('Error: package-specifier is required.');\n process.exit(1);\n }\n\n if (!targetVer && !cliOpts.yes && !cliOpts.latest) {\n // Skip if --latest is used\n const versionResponse = await prompts({\n type: 'text',\n name: 'targetVersion',\n message:\n 'Enter the target version (e.g., \"1.2.3\", or leave blank for latest):',\n });\n targetVer = versionResponse.targetVersion || undefined;\n } else if (cliOpts.latest) {\n targetVer = undefined; // Ensure targetVer is undefined if --latest is used\n }\n\n // Merge CLI options with defaults from schema for parsing\n const rawOptions = {\n packageSpecifier: pkgSpec,\n targetVersion: targetVer,\n install: cliOpts.install,\n yes: cliOpts.yes,\n cwd: cliOpts.cwd,\n silent: cliOpts.silent,\n latest: cliOpts.latest, // Added latest to rawOptions\n };\n const options = DepSyncOptionsSchema.parse(rawOptions);\n if (options.silent) {\n // Suppress non-error console logs if silent is true\n logger.info = () => {};\n logger.success = () => {};\n logger.warn = () => {};\n logger.log = () => {};\n logger.break = () => {};\n }\n await runSync(options);\n } catch (error) {\n // Ensure logger still works for handleError even if silenced\n const originalLogger = { ...logger };\n if (cliOpts.silent) {\n logger.error = console.error; // Fallback for errors\n logger.break = () => console.log('');\n }\n handleError(error);\n // Restore logger if it was modified\n if (cliOpts.silent) {\n Object.assign(logger, originalLogger);\n }\n }\n });\n\n await program.parseAsync(process.argv);\n}\n\nmain();\n"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lofcz/depset",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Synchronize dependencies in package.json",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"dependencies",
|
|
7
|
+
"package.json",
|
|
8
|
+
"sync",
|
|
9
|
+
"upgrade",
|
|
10
|
+
"version",
|
|
11
|
+
"yarn",
|
|
12
|
+
"pnpm",
|
|
13
|
+
"npm",
|
|
14
|
+
"bun"
|
|
15
|
+
],
|
|
16
|
+
"homepage": "https://github.com/udecode/plate/packages/udecode/depset/README.md",
|
|
17
|
+
"bugs": {
|
|
18
|
+
"url": "https://github.com/udecode/plate/issues"
|
|
19
|
+
},
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "https://github.com/lofcz/plate.git",
|
|
23
|
+
"directory": "packages/udecode/depset"
|
|
24
|
+
},
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"sideEffects": false,
|
|
27
|
+
"type": "module",
|
|
28
|
+
"exports": {
|
|
29
|
+
".": "./dist/index.js",
|
|
30
|
+
"./package.json": "./package.json"
|
|
31
|
+
},
|
|
32
|
+
"bin": "./dist/index.js",
|
|
33
|
+
"files": [
|
|
34
|
+
"dist/**/*"
|
|
35
|
+
],
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@antfu/ni": "24.3.0",
|
|
38
|
+
"commander": "14.0.0",
|
|
39
|
+
"kleur": "4.1.5",
|
|
40
|
+
"ora": "8.2.0",
|
|
41
|
+
"prompts": "2.4.2",
|
|
42
|
+
"zod": "3.25.61"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@types/prompts": "2.4.9",
|
|
46
|
+
"@plate/scripts": "1.0.0"
|
|
47
|
+
},
|
|
48
|
+
"publishConfig": {
|
|
49
|
+
"access": "public"
|
|
50
|
+
},
|
|
51
|
+
"main": "./dist/index.js",
|
|
52
|
+
"module": "./dist/index.js",
|
|
53
|
+
"types": "./dist/index.d.ts",
|
|
54
|
+
"scripts": {
|
|
55
|
+
"build": "tsdown --log-level warn",
|
|
56
|
+
"build:watch": "tsdown --watch",
|
|
57
|
+
"lint": "plate-pkg p:lint",
|
|
58
|
+
"lint:fix": "plate-pkg p:lint:fix",
|
|
59
|
+
"clean": "plate-pkg p:clean",
|
|
60
|
+
"start": "node dist/index.js",
|
|
61
|
+
"typecheck": "plate-pkg p:typecheck"
|
|
62
|
+
}
|
|
63
|
+
}
|