icore 1.0.9 → 1.0.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/argv.d.ts +0 -1
- package/dist/argv.js +0 -1
- package/dist/cli.d.ts +1 -2
- package/dist/cli.js +3 -2
- package/dist/commands.d.ts +33 -6
- package/dist/commands.js +58 -10
- package/dist/index.d.ts +1 -2
- package/dist/index.js +3 -2
- package/dist/options.d.ts +0 -1
- package/dist/options.js +0 -1
- package/package.json +8 -9
package/dist/argv.d.ts
CHANGED
package/dist/argv.js
CHANGED
package/dist/cli.d.ts
CHANGED
|
@@ -9,6 +9,5 @@
|
|
|
9
9
|
* This file must not contain parser, validator, or command runtime logic.
|
|
10
10
|
*/
|
|
11
11
|
export { parseArgv, type ParsedArgv } from './argv';
|
|
12
|
-
export { defineCommand, defineCommandRegistry, isCommandName, resolveCommand, resolveCommandFromArgs, runCommand, runCommandFromRegistry, type CommandDefinition, type CommandInput, type CommandName, type CommandRegistry, type ResolvedCommand } from './commands';
|
|
12
|
+
export { defineCommand, defineCommandRegistry, isCommandName, prepareCommandFromArgs, resolveCommand, resolveCommandFromArgs, runCommand, runPreparedCommand, runCommandFromRegistry, type CommandDefinition, type CommandInput, type CommandName, type CommandRegistry, type PreparedCommand, type PreparedCommandInput, type ResolvedCommand } from './commands';
|
|
13
13
|
export { mergeOptionsSchema, parseOptions, parseOptionsDetailed, type BooleanOption, type InferOptions, type InferProvidedOptions, type MergeOptionsSchemas, type NumberOption, type OptionDefinition, type OptionsSchema, type ParseOptionsResult, type RawOptionValue, type StringOption } from './options';
|
|
14
|
-
//# sourceMappingURL=cli.d.ts.map
|
package/dist/cli.js
CHANGED
|
@@ -10,19 +10,20 @@
|
|
|
10
10
|
* This file must not contain parser, validator, or command runtime logic.
|
|
11
11
|
*/
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
-
exports.parseOptionsDetailed = exports.parseOptions = exports.mergeOptionsSchema = exports.runCommandFromRegistry = exports.runCommand = exports.resolveCommandFromArgs = exports.resolveCommand = exports.isCommandName = exports.defineCommandRegistry = exports.defineCommand = exports.parseArgv = void 0;
|
|
13
|
+
exports.parseOptionsDetailed = exports.parseOptions = exports.mergeOptionsSchema = exports.runCommandFromRegistry = exports.runPreparedCommand = exports.runCommand = exports.resolveCommandFromArgs = exports.resolveCommand = exports.prepareCommandFromArgs = exports.isCommandName = exports.defineCommandRegistry = exports.defineCommand = exports.parseArgv = void 0;
|
|
14
14
|
var argv_1 = require("./argv");
|
|
15
15
|
Object.defineProperty(exports, "parseArgv", { enumerable: true, get: function () { return argv_1.parseArgv; } });
|
|
16
16
|
var commands_1 = require("./commands");
|
|
17
17
|
Object.defineProperty(exports, "defineCommand", { enumerable: true, get: function () { return commands_1.defineCommand; } });
|
|
18
18
|
Object.defineProperty(exports, "defineCommandRegistry", { enumerable: true, get: function () { return commands_1.defineCommandRegistry; } });
|
|
19
19
|
Object.defineProperty(exports, "isCommandName", { enumerable: true, get: function () { return commands_1.isCommandName; } });
|
|
20
|
+
Object.defineProperty(exports, "prepareCommandFromArgs", { enumerable: true, get: function () { return commands_1.prepareCommandFromArgs; } });
|
|
20
21
|
Object.defineProperty(exports, "resolveCommand", { enumerable: true, get: function () { return commands_1.resolveCommand; } });
|
|
21
22
|
Object.defineProperty(exports, "resolveCommandFromArgs", { enumerable: true, get: function () { return commands_1.resolveCommandFromArgs; } });
|
|
22
23
|
Object.defineProperty(exports, "runCommand", { enumerable: true, get: function () { return commands_1.runCommand; } });
|
|
24
|
+
Object.defineProperty(exports, "runPreparedCommand", { enumerable: true, get: function () { return commands_1.runPreparedCommand; } });
|
|
23
25
|
Object.defineProperty(exports, "runCommandFromRegistry", { enumerable: true, get: function () { return commands_1.runCommandFromRegistry; } });
|
|
24
26
|
var options_1 = require("./options");
|
|
25
27
|
Object.defineProperty(exports, "mergeOptionsSchema", { enumerable: true, get: function () { return options_1.mergeOptionsSchema; } });
|
|
26
28
|
Object.defineProperty(exports, "parseOptions", { enumerable: true, get: function () { return options_1.parseOptions; } });
|
|
27
29
|
Object.defineProperty(exports, "parseOptionsDetailed", { enumerable: true, get: function () { return options_1.parseOptionsDetailed; } });
|
|
28
|
-
//# sourceMappingURL=cli.js.map
|
package/dist/commands.d.ts
CHANGED
|
@@ -12,12 +12,18 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import { type InferOptions, type InferProvidedOptions, type OptionsSchema } from './options';
|
|
14
14
|
/**
|
|
15
|
-
* Input
|
|
15
|
+
* Input produced after command path and option validation, before runtime
|
|
16
|
+
* context is attached.
|
|
16
17
|
*/
|
|
17
|
-
export type
|
|
18
|
+
export type PreparedCommandInput<TSchema extends OptionsSchema> = {
|
|
18
19
|
options: InferOptions<TSchema>;
|
|
19
20
|
provided: InferProvidedOptions<TSchema>;
|
|
20
21
|
positionals: string[];
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Input passed to a command handler after command path and option validation.
|
|
25
|
+
*/
|
|
26
|
+
export type CommandInput<TSchema extends OptionsSchema, TContext> = PreparedCommandInput<TSchema> & {
|
|
21
27
|
context: TContext;
|
|
22
28
|
};
|
|
23
29
|
/**
|
|
@@ -27,19 +33,22 @@ export type CommandInput<TSchema extends OptionsSchema, TContext> = {
|
|
|
27
33
|
* application-specific work such as API calls, request building, and output
|
|
28
34
|
* formatting.
|
|
29
35
|
*/
|
|
30
|
-
export type CommandDefinition<TSchema extends OptionsSchema, TContext, TResult, TPath extends readonly [string, ...string[]] = readonly [string, ...string[]]> = {
|
|
36
|
+
export type CommandDefinition<TSchema extends OptionsSchema, TContext, TResult, TPath extends readonly [string, ...string[]] = readonly [string, ...string[]], TMetadata = unknown> = {
|
|
31
37
|
path: TPath;
|
|
32
38
|
options: TSchema;
|
|
39
|
+
metadata?: TMetadata;
|
|
33
40
|
allowExtraPositionals?: boolean;
|
|
41
|
+
prepare?(input: PreparedCommandInput<TSchema>): void | Promise<void>;
|
|
34
42
|
handle(input: CommandInput<TSchema, TContext>): TResult | Promise<TResult>;
|
|
35
43
|
};
|
|
36
|
-
type AnyCommandDefinition = CommandDefinition<OptionsSchema, unknown, unknown>;
|
|
44
|
+
type AnyCommandDefinition = CommandDefinition<OptionsSchema, unknown, unknown, readonly [string, ...string[]], unknown>;
|
|
37
45
|
type CommandPathName<TPath extends readonly string[]> = number extends TPath['length'] ? string : TPath extends readonly [infer THead extends string] ? THead : TPath extends readonly [
|
|
38
46
|
infer THead extends string,
|
|
39
47
|
...infer TRest extends readonly string[]
|
|
40
48
|
] ? `${THead} ${CommandPathName<TRest>}` : never;
|
|
41
49
|
type CommandContext<TCommand extends AnyCommandDefinition> = TCommand extends CommandDefinition<OptionsSchema, infer TContext, unknown> ? TContext : never;
|
|
42
50
|
type CommandResult<TCommand extends AnyCommandDefinition> = TCommand extends CommandDefinition<OptionsSchema, unknown, infer TResult> ? Awaited<TResult> : never;
|
|
51
|
+
type CommandSchema<TCommand extends AnyCommandDefinition> = TCommand extends CommandDefinition<infer TSchema, unknown, unknown> ? TSchema : never;
|
|
43
52
|
/**
|
|
44
53
|
* Infers the public command name from a command path.
|
|
45
54
|
*/
|
|
@@ -60,10 +69,21 @@ export type ResolvedCommand<TCommand extends AnyCommandDefinition> = {
|
|
|
60
69
|
command: TCommand;
|
|
61
70
|
positionals: string[];
|
|
62
71
|
};
|
|
72
|
+
/**
|
|
73
|
+
* Command resolved and validated without runtime context.
|
|
74
|
+
*/
|
|
75
|
+
export type PreparedCommand<TCommand extends AnyCommandDefinition> = {
|
|
76
|
+
name: CommandName<TCommand>;
|
|
77
|
+
path: TCommand['path'];
|
|
78
|
+
command: TCommand;
|
|
79
|
+
options: InferOptions<CommandSchema<TCommand>>;
|
|
80
|
+
provided: InferProvidedOptions<CommandSchema<TCommand>>;
|
|
81
|
+
positionals: string[];
|
|
82
|
+
};
|
|
63
83
|
/**
|
|
64
84
|
* Defines a command while preserving literal option schema types.
|
|
65
85
|
*/
|
|
66
|
-
export declare function defineCommand<const TSchema extends OptionsSchema, const TPath extends readonly [string, ...string[]], TContext = undefined, TResult = unknown>(command: CommandDefinition<TSchema, TContext, TResult, TPath>): CommandDefinition<TSchema, TContext, TResult, TPath>;
|
|
86
|
+
export declare function defineCommand<const TSchema extends OptionsSchema, const TPath extends readonly [string, ...string[]], TContext = undefined, TResult = unknown, TMetadata = unknown>(command: CommandDefinition<TSchema, TContext, TResult, TPath, TMetadata>): CommandDefinition<TSchema, TContext, TResult, TPath, TMetadata>;
|
|
67
87
|
/**
|
|
68
88
|
* Defines a command registry while preserving literal command path types.
|
|
69
89
|
*/
|
|
@@ -80,6 +100,14 @@ export declare function resolveCommand<const TCommands extends readonly AnyComma
|
|
|
80
100
|
* Resolves a command from raw CLI arguments using each command's option schema.
|
|
81
101
|
*/
|
|
82
102
|
export declare function resolveCommandFromArgs<const TCommands extends readonly AnyCommandDefinition[]>(registry: CommandRegistry<TCommands>, args: readonly string[]): ResolvedCommand<TCommands[number]>;
|
|
103
|
+
/**
|
|
104
|
+
* Resolves and validates a command without requiring runtime context.
|
|
105
|
+
*/
|
|
106
|
+
export declare function prepareCommandFromArgs<const TCommands extends readonly AnyCommandDefinition[]>(registry: CommandRegistry<TCommands>, args: readonly string[]): Promise<PreparedCommand<TCommands[number]>>;
|
|
107
|
+
/**
|
|
108
|
+
* Runs a prepared command with caller-provided runtime context.
|
|
109
|
+
*/
|
|
110
|
+
export declare function runPreparedCommand<TCommand extends AnyCommandDefinition>(prepared: PreparedCommand<TCommand>, context: CommandContext<TCommand>): Promise<CommandResult<TCommand>>;
|
|
83
111
|
/**
|
|
84
112
|
* Resolves a command from a registry and runs its handler.
|
|
85
113
|
*/
|
|
@@ -90,4 +118,3 @@ export declare function runCommandFromRegistry<const TCommands extends readonly
|
|
|
90
118
|
*/
|
|
91
119
|
export declare function runCommand<const TSchema extends OptionsSchema, TContext, TResult>(command: CommandDefinition<TSchema, TContext, TResult>, args: readonly string[], context: TContext): Promise<TResult>;
|
|
92
120
|
export {};
|
|
93
|
-
//# sourceMappingURL=commands.d.ts.map
|
package/dist/commands.js
CHANGED
|
@@ -17,6 +17,8 @@ exports.defineCommandRegistry = defineCommandRegistry;
|
|
|
17
17
|
exports.isCommandName = isCommandName;
|
|
18
18
|
exports.resolveCommand = resolveCommand;
|
|
19
19
|
exports.resolveCommandFromArgs = resolveCommandFromArgs;
|
|
20
|
+
exports.prepareCommandFromArgs = prepareCommandFromArgs;
|
|
21
|
+
exports.runPreparedCommand = runPreparedCommand;
|
|
20
22
|
exports.runCommandFromRegistry = runCommandFromRegistry;
|
|
21
23
|
exports.runCommand = runCommand;
|
|
22
24
|
const argv_1 = require("./argv");
|
|
@@ -70,30 +72,77 @@ function resolveCommandFromArgs(registry, args) {
|
|
|
70
72
|
}
|
|
71
73
|
throw new Error(`Unknown command: ${formatCommandPositionals((0, argv_1.parseArgv)(args).positionals)}`);
|
|
72
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* Resolves and validates a command without requiring runtime context.
|
|
77
|
+
*/
|
|
78
|
+
async function prepareCommandFromArgs(registry, args) {
|
|
79
|
+
for (const command of commandsBySpecificity(registry.commands)) {
|
|
80
|
+
const argv = (0, argv_1.parseArgv)(args, command.options);
|
|
81
|
+
const resolved = resolveCommandCandidate(command, argv.positionals);
|
|
82
|
+
if (resolved !== undefined) {
|
|
83
|
+
return prepareResolvedCommand(resolved, argv.options);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
throw new Error(`Unknown command: ${formatCommandPositionals((0, argv_1.parseArgv)(args).positionals)}`);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Runs a prepared command with caller-provided runtime context.
|
|
90
|
+
*/
|
|
91
|
+
async function runPreparedCommand(prepared, context) {
|
|
92
|
+
const result = await prepared.command.handle({
|
|
93
|
+
options: prepared.options,
|
|
94
|
+
provided: prepared.provided,
|
|
95
|
+
positionals: prepared.positionals,
|
|
96
|
+
context
|
|
97
|
+
});
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
73
100
|
/**
|
|
74
101
|
* Resolves a command from a registry and runs its handler.
|
|
75
102
|
*/
|
|
76
103
|
async function runCommandFromRegistry(registry, args, context) {
|
|
77
|
-
const
|
|
78
|
-
return
|
|
104
|
+
const prepared = await prepareCommandFromArgs(registry, args);
|
|
105
|
+
return runPreparedCommand(prepared, context);
|
|
79
106
|
}
|
|
80
107
|
/**
|
|
81
108
|
* Parses arguments, validates command mechanics, and executes a command
|
|
82
109
|
* handler.
|
|
83
110
|
*/
|
|
84
111
|
async function runCommand(command, args, context) {
|
|
112
|
+
const prepared = await prepareCommand(command, args);
|
|
113
|
+
return runPreparedCommand(prepared, context);
|
|
114
|
+
}
|
|
115
|
+
async function prepareCommand(command, args) {
|
|
85
116
|
const argv = (0, argv_1.parseArgv)(args, command.options);
|
|
86
117
|
const extraPositionals = resolveCommandPositionals(command.path, argv.positionals);
|
|
87
|
-
|
|
88
|
-
|
|
118
|
+
const resolved = {
|
|
119
|
+
name: commandPathToName(command.path),
|
|
120
|
+
path: command.path,
|
|
121
|
+
command,
|
|
122
|
+
positionals: extraPositionals
|
|
123
|
+
};
|
|
124
|
+
return prepareResolvedCommand(resolved, argv.options);
|
|
125
|
+
}
|
|
126
|
+
async function prepareResolvedCommand(resolved, rawOptions) {
|
|
127
|
+
const { command } = resolved;
|
|
128
|
+
if (resolved.positionals.length > 0 && command.allowExtraPositionals !== true) {
|
|
129
|
+
throw new Error(`Unexpected positional argument for '${command.path.join(' ')}': ${resolved.positionals[0] ?? ''}`);
|
|
89
130
|
}
|
|
90
|
-
const parsed = (0, options_1.parseOptionsDetailed)(command.options,
|
|
91
|
-
|
|
131
|
+
const parsed = (0, options_1.parseOptionsDetailed)(command.options, rawOptions);
|
|
132
|
+
const input = {
|
|
92
133
|
options: parsed.options,
|
|
93
134
|
provided: parsed.provided,
|
|
94
|
-
positionals:
|
|
95
|
-
|
|
96
|
-
|
|
135
|
+
positionals: resolved.positionals
|
|
136
|
+
};
|
|
137
|
+
await command.prepare?.(input);
|
|
138
|
+
return {
|
|
139
|
+
name: resolved.name,
|
|
140
|
+
path: resolved.path,
|
|
141
|
+
command,
|
|
142
|
+
options: parsed.options,
|
|
143
|
+
provided: parsed.provided,
|
|
144
|
+
positionals: resolved.positionals
|
|
145
|
+
};
|
|
97
146
|
}
|
|
98
147
|
function resolveCommandPositionals(path, positionals) {
|
|
99
148
|
for (let index = 0; index < path.length; index += 1) {
|
|
@@ -141,4 +190,3 @@ function resolveMatchingCommandPositionals(path, positionals) {
|
|
|
141
190
|
function formatCommandPositionals(positionals) {
|
|
142
191
|
return positionals.length === 0 ? '<empty>' : positionals.join(' ');
|
|
143
192
|
}
|
|
144
|
-
//# sourceMappingURL=commands.js.map
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
export { defineCommand, defineCommandRegistry, isCommandName, mergeOptionsSchema, parseArgv, parseOptions, parseOptionsDetailed, resolveCommand, resolveCommandFromArgs, runCommand, runCommandFromRegistry, type BooleanOption, type CommandDefinition, type CommandInput, type CommandName, type CommandRegistry, type InferOptions, type InferProvidedOptions, type MergeOptionsSchemas, type NumberOption, type OptionDefinition, type OptionsSchema, type ParseOptionsResult, type ParsedArgv, type RawOptionValue, type ResolvedCommand, type StringOption } from './cli';
|
|
2
|
-
//# sourceMappingURL=index.d.ts.map
|
|
1
|
+
export { defineCommand, defineCommandRegistry, isCommandName, mergeOptionsSchema, parseArgv, parseOptions, parseOptionsDetailed, prepareCommandFromArgs, resolveCommand, resolveCommandFromArgs, runCommand, runPreparedCommand, runCommandFromRegistry, type BooleanOption, type CommandDefinition, type CommandInput, type CommandName, type CommandRegistry, type InferOptions, type InferProvidedOptions, type MergeOptionsSchemas, type NumberOption, type OptionDefinition, type OptionsSchema, type ParseOptionsResult, type ParsedArgv, type PreparedCommand, type PreparedCommandInput, type RawOptionValue, type ResolvedCommand, type StringOption } from './cli';
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.runCommandFromRegistry = exports.runCommand = exports.resolveCommandFromArgs = exports.resolveCommand = exports.parseOptionsDetailed = exports.parseOptions = exports.parseArgv = exports.mergeOptionsSchema = exports.isCommandName = exports.defineCommandRegistry = exports.defineCommand = void 0;
|
|
3
|
+
exports.runCommandFromRegistry = exports.runPreparedCommand = exports.runCommand = exports.resolveCommandFromArgs = exports.resolveCommand = exports.prepareCommandFromArgs = exports.parseOptionsDetailed = exports.parseOptions = exports.parseArgv = exports.mergeOptionsSchema = exports.isCommandName = exports.defineCommandRegistry = exports.defineCommand = void 0;
|
|
4
4
|
var cli_1 = require("./cli");
|
|
5
5
|
Object.defineProperty(exports, "defineCommand", { enumerable: true, get: function () { return cli_1.defineCommand; } });
|
|
6
6
|
Object.defineProperty(exports, "defineCommandRegistry", { enumerable: true, get: function () { return cli_1.defineCommandRegistry; } });
|
|
@@ -9,8 +9,9 @@ Object.defineProperty(exports, "mergeOptionsSchema", { enumerable: true, get: fu
|
|
|
9
9
|
Object.defineProperty(exports, "parseArgv", { enumerable: true, get: function () { return cli_1.parseArgv; } });
|
|
10
10
|
Object.defineProperty(exports, "parseOptions", { enumerable: true, get: function () { return cli_1.parseOptions; } });
|
|
11
11
|
Object.defineProperty(exports, "parseOptionsDetailed", { enumerable: true, get: function () { return cli_1.parseOptionsDetailed; } });
|
|
12
|
+
Object.defineProperty(exports, "prepareCommandFromArgs", { enumerable: true, get: function () { return cli_1.prepareCommandFromArgs; } });
|
|
12
13
|
Object.defineProperty(exports, "resolveCommand", { enumerable: true, get: function () { return cli_1.resolveCommand; } });
|
|
13
14
|
Object.defineProperty(exports, "resolveCommandFromArgs", { enumerable: true, get: function () { return cli_1.resolveCommandFromArgs; } });
|
|
14
15
|
Object.defineProperty(exports, "runCommand", { enumerable: true, get: function () { return cli_1.runCommand; } });
|
|
16
|
+
Object.defineProperty(exports, "runPreparedCommand", { enumerable: true, get: function () { return cli_1.runPreparedCommand; } });
|
|
15
17
|
Object.defineProperty(exports, "runCommandFromRegistry", { enumerable: true, get: function () { return cli_1.runCommandFromRegistry; } });
|
|
16
|
-
//# sourceMappingURL=index.js.map
|
package/dist/options.d.ts
CHANGED
|
@@ -129,4 +129,3 @@ export declare function parseOptions<const TSchema extends OptionsSchema>(schema
|
|
|
129
129
|
*/
|
|
130
130
|
export declare function parseOptionsDetailed<const TSchema extends OptionsSchema>(schema: TSchema, values: Record<string, RawOptionValue>): ParseOptionsResult<TSchema>;
|
|
131
131
|
export {};
|
|
132
|
-
//# sourceMappingURL=options.d.ts.map
|
package/dist/options.js
CHANGED
package/package.json
CHANGED
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "icore",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.10",
|
|
4
4
|
"description": "Declarative command line interface mechanics for Node.js",
|
|
5
|
-
"author": {
|
|
6
|
-
"name": "Stanislav Potemkin",
|
|
7
|
-
"email": "woodger@ya.ru"
|
|
8
|
-
},
|
|
9
|
-
"license": "MIT",
|
|
10
5
|
"keywords": [
|
|
11
6
|
"command-line",
|
|
12
7
|
"argv",
|
|
@@ -17,9 +12,14 @@
|
|
|
17
12
|
"typed-cli",
|
|
18
13
|
"declarative-cli"
|
|
19
14
|
],
|
|
15
|
+
"author": {
|
|
16
|
+
"name": "Stanislav Potemkin",
|
|
17
|
+
"email": "woodger@ya.ru"
|
|
18
|
+
},
|
|
19
|
+
"license": "MIT",
|
|
20
20
|
"repository": {
|
|
21
21
|
"type": "git",
|
|
22
|
-
"url": "git+
|
|
22
|
+
"url": "git+https://github.com/woodger/icore.git"
|
|
23
23
|
},
|
|
24
24
|
"engines": {
|
|
25
25
|
"node": ">=16.9.0"
|
|
@@ -29,9 +29,8 @@
|
|
|
29
29
|
"scripts": {
|
|
30
30
|
"build": "tsc",
|
|
31
31
|
"test": "node --test dist/*.test.js",
|
|
32
|
-
"lint": "eslint src
|
|
32
|
+
"lint": "eslint src"
|
|
33
33
|
},
|
|
34
|
-
"dependencies": {},
|
|
35
34
|
"devDependencies": {
|
|
36
35
|
"@eslint/js": "^9.39.4",
|
|
37
36
|
"@types/node": "^26.0.1",
|