trueicon 0.1.0
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 +334 -0
- package/dist/cache/downloader.d.ts +18 -0
- package/dist/cache/downloader.js +131 -0
- package/dist/cache/downloader.js.map +1 -0
- package/dist/config/ensureIndex.d.ts +16 -0
- package/dist/config/ensureIndex.js +41 -0
- package/dist/config/ensureIndex.js.map +1 -0
- package/dist/config/loadConfig.d.ts +12 -0
- package/dist/config/loadConfig.js +71 -0
- package/dist/config/loadConfig.js.map +1 -0
- package/dist/config/versions.d.ts +16 -0
- package/dist/config/versions.js +31 -0
- package/dist/config/versions.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/buildIndex.d.ts +27 -0
- package/dist/indexer/buildIndex.js +83 -0
- package/dist/indexer/buildIndex.js.map +1 -0
- package/dist/indexer/types.d.ts +35 -0
- package/dist/indexer/types.js +2 -0
- package/dist/indexer/types.js.map +1 -0
- package/dist/providers/adapter.d.ts +20 -0
- package/dist/providers/adapter.js +10 -0
- package/dist/providers/adapter.js.map +1 -0
- package/dist/providers/adapters/heroicons.d.ts +4 -0
- package/dist/providers/adapters/heroicons.js +73 -0
- package/dist/providers/adapters/heroicons.js.map +1 -0
- package/dist/providers/adapters/index.d.ts +2 -0
- package/dist/providers/adapters/index.js +10 -0
- package/dist/providers/adapters/index.js.map +1 -0
- package/dist/providers/adapters/lucide.d.ts +2 -0
- package/dist/providers/adapters/lucide.js +57 -0
- package/dist/providers/adapters/lucide.js.map +1 -0
- package/dist/providers/adapters/react-icons.d.ts +3 -0
- package/dist/providers/adapters/react-icons.js +66 -0
- package/dist/providers/adapters/react-icons.js.map +1 -0
- package/dist/providers/jsLiteral.d.ts +20 -0
- package/dist/providers/jsLiteral.js +137 -0
- package/dist/providers/jsLiteral.js.map +1 -0
- package/dist/providers/registry.d.ts +9 -0
- package/dist/providers/registry.js +23 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/svg.d.ts +9 -0
- package/dist/providers/svg.js +97 -0
- package/dist/providers/svg.js.map +1 -0
- package/dist/search/search.d.ts +26 -0
- package/dist/search/search.js +45 -0
- package/dist/search/search.js.map +1 -0
- package/dist/server.d.ts +4 -0
- package/dist/server.js +17 -0
- package/dist/server.js.map +1 -0
- package/dist/synonyms/loadSynonyms.d.ts +5 -0
- package/dist/synonyms/loadSynonyms.js +20 -0
- package/dist/synonyms/loadSynonyms.js.map +1 -0
- package/dist/synonyms/synonyms.json +80 -0
- package/dist/tools/context.d.ts +26 -0
- package/dist/tools/context.js +43 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/getIcon.d.ts +16 -0
- package/dist/tools/getIcon.js +50 -0
- package/dist/tools/getIcon.js.map +1 -0
- package/dist/tools/listProviders.d.ts +20 -0
- package/dist/tools/listProviders.js +22 -0
- package/dist/tools/listProviders.js.map +1 -0
- package/dist/tools/ping.d.ts +2 -0
- package/dist/tools/ping.js +12 -0
- package/dist/tools/ping.js.map +1 -0
- package/dist/tools/searchIcons.d.ts +31 -0
- package/dist/tools/searchIcons.js +97 -0
- package/dist/tools/searchIcons.js.map +1 -0
- package/package.json +38 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ensureIndex } from "../config/ensureIndex.js";
|
|
3
|
+
import { CONFIG_FILE, loadProjectConfig } from "../config/loadConfig.js";
|
|
4
|
+
import { getProvider } from "../providers/registry.js";
|
|
5
|
+
import { loadIndex } from "../search/search.js";
|
|
6
|
+
import { jsonToolResult, resolveContext, resolveVersion, usageSnippet } from "./context.js";
|
|
7
|
+
function findRecord(records, name) {
|
|
8
|
+
const exact = records.find((r) => r.name === name || r.importName === name);
|
|
9
|
+
if (exact)
|
|
10
|
+
return exact;
|
|
11
|
+
const lower = name.toLowerCase();
|
|
12
|
+
return records.find((r) => r.name.toLowerCase() === lower || r.importName.toLowerCase() === lower);
|
|
13
|
+
}
|
|
14
|
+
/** Looks up one icon by name or import name and returns its full record plus an import snippet. */
|
|
15
|
+
export async function getIconTool(input, ctx) {
|
|
16
|
+
const name = input.name?.trim() ?? "";
|
|
17
|
+
if (!name)
|
|
18
|
+
throw new Error("name must be a non-empty string");
|
|
19
|
+
const provider = getProvider(input.provider);
|
|
20
|
+
if (!provider)
|
|
21
|
+
throw new Error(`Unknown provider "${input.provider}"`);
|
|
22
|
+
const version = input.version ?? resolveVersion(ctx.projectDir, loadProjectConfig(ctx.projectDir), provider.package)?.version;
|
|
23
|
+
if (version === undefined) {
|
|
24
|
+
throw new Error(`Could not determine the ${provider.package} version: pass "version", pin it in ${CONFIG_FILE}, ` +
|
|
25
|
+
`or add ${provider.package} to package.json`);
|
|
26
|
+
}
|
|
27
|
+
const { cacheDir } = await ensureIndex({
|
|
28
|
+
cacheRoot: ctx.cacheRoot,
|
|
29
|
+
providerId: provider.id,
|
|
30
|
+
packageName: provider.package,
|
|
31
|
+
version,
|
|
32
|
+
synonyms: ctx.synonyms,
|
|
33
|
+
});
|
|
34
|
+
const { records } = await loadIndex(cacheDir);
|
|
35
|
+
const record = findRecord(records, name);
|
|
36
|
+
if (!record)
|
|
37
|
+
throw new Error(`Icon "${name}" not found in ${provider.id} (${provider.package}@${version})`);
|
|
38
|
+
return { ...record, usage: usageSnippet(record) };
|
|
39
|
+
}
|
|
40
|
+
export function registerGetIconTool(server) {
|
|
41
|
+
server.registerTool("get_icon", {
|
|
42
|
+
description: "Get the full record and exact import statement for an icon whose name is already known, e.g. Trash2 from lucide.",
|
|
43
|
+
inputSchema: {
|
|
44
|
+
name: z.string().min(1).describe('Icon name or import name, e.g. "trash-2" or "Trash2"'),
|
|
45
|
+
provider: z.string().min(1).describe('Provider id or npm package, e.g. "lucide" or "lucide-react"'),
|
|
46
|
+
version: z.string().optional().describe("Package version or range; defaults to the project's version"),
|
|
47
|
+
},
|
|
48
|
+
}, (input) => jsonToolResult(() => getIconTool(input, resolveContext())));
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=getIcon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getIcon.js","sourceRoot":"","sources":["../../src/tools/getIcon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { type ToolContext, type VersionSource } from "./context.js";
|
|
3
|
+
export interface ConfiguredProvider {
|
|
4
|
+
/** Registry id, or null when the package is not a supported provider. */
|
|
5
|
+
id: string | null;
|
|
6
|
+
package: string;
|
|
7
|
+
version: string | null;
|
|
8
|
+
source: VersionSource | null;
|
|
9
|
+
}
|
|
10
|
+
export interface ListProvidersOutput {
|
|
11
|
+
configured: ConfiguredProvider[];
|
|
12
|
+
registry: {
|
|
13
|
+
id: string;
|
|
14
|
+
package: string;
|
|
15
|
+
description: string;
|
|
16
|
+
}[];
|
|
17
|
+
}
|
|
18
|
+
/** Lists the providers configured in .iconmcp.json (with resolved versions) and every supported provider. */
|
|
19
|
+
export declare function listProvidersTool(ctx: ToolContext): ListProvidersOutput;
|
|
20
|
+
export declare function registerListProvidersTool(server: McpServer): void;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { loadProjectConfig } from "../config/loadConfig.js";
|
|
2
|
+
import { getProvider, PROVIDERS } from "../providers/registry.js";
|
|
3
|
+
import { jsonToolResult, resolveContext, resolveVersion } from "./context.js";
|
|
4
|
+
/** Lists the providers configured in .iconmcp.json (with resolved versions) and every supported provider. */
|
|
5
|
+
export function listProvidersTool(ctx) {
|
|
6
|
+
const config = loadProjectConfig(ctx.projectDir);
|
|
7
|
+
const configured = config.providers.map(({ package: pkg }) => {
|
|
8
|
+
const resolved = resolveVersion(ctx.projectDir, config, pkg);
|
|
9
|
+
return {
|
|
10
|
+
id: getProvider(pkg)?.id ?? null,
|
|
11
|
+
package: pkg,
|
|
12
|
+
version: resolved?.version ?? null,
|
|
13
|
+
source: resolved?.source ?? null,
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
const registry = PROVIDERS.map(({ id, package: pkg, description }) => ({ id, package: pkg, description }));
|
|
17
|
+
return { configured, registry };
|
|
18
|
+
}
|
|
19
|
+
export function registerListProvidersTool(server) {
|
|
20
|
+
server.registerTool("list_providers", { description: "List the icon providers configured for this project and all providers trueicon supports." }, () => jsonToolResult(() => listProvidersTool(resolveContext())));
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=listProviders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listProviders.js","sourceRoot":"","sources":["../../src/tools/listProviders.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAwC,MAAM,cAAc,CAAC;AAepH,6GAA6G;AAC7G,MAAM,UAAU,iBAAiB,CAAC,GAAgB;IAChD,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,EAAsB,EAAE;QAC/E,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QAC7D,OAAO;YACL,EAAE,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,IAAI;YAChC,OAAO,EAAE,GAAG;YACZ,OAAO,EAAE,QAAQ,EAAE,OAAO,IAAI,IAAI;YAClC,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,IAAI;SACjC,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;IAC3G,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,MAAiB;IACzD,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB,EAAE,WAAW,EAAE,0FAA0F,EAAE,EAC3G,GAAG,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,cAAc,EAAE,CAAC,CAAC,CAChE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Health-check tool.
|
|
2
|
+
export function registerPingTool(server) {
|
|
3
|
+
server.registerTool("ping", { description: "Health check" }, async () => ({
|
|
4
|
+
content: [
|
|
5
|
+
{
|
|
6
|
+
type: "text",
|
|
7
|
+
text: JSON.stringify({ status: "ok", server: "trueicon" }),
|
|
8
|
+
},
|
|
9
|
+
],
|
|
10
|
+
}));
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=ping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ping.js","sourceRoot":"","sources":["../../src/tools/ping.ts"],"names":[],"mappings":"AAEA,qBAAqB;AACrB,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,MAAM,CAAC,YAAY,CACjB,MAAM,EACN,EAAE,WAAW,EAAE,cAAc,EAAE,EAC/B,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;aAC3D;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { type ToolContext } from "./context.js";
|
|
3
|
+
export declare const DEFAULT_LIMIT = 10;
|
|
4
|
+
export declare const MAX_LIMIT = 50;
|
|
5
|
+
export interface SearchIconsInput {
|
|
6
|
+
query: string;
|
|
7
|
+
/** Provider id or npm package name; defaults to every configured provider. */
|
|
8
|
+
provider?: string;
|
|
9
|
+
version?: string;
|
|
10
|
+
style?: string;
|
|
11
|
+
set?: string;
|
|
12
|
+
limit?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface SearchIconsHit {
|
|
15
|
+
name: string;
|
|
16
|
+
importName: string;
|
|
17
|
+
importPath: string;
|
|
18
|
+
package: string;
|
|
19
|
+
version: string;
|
|
20
|
+
style?: string;
|
|
21
|
+
set?: string;
|
|
22
|
+
usage: string;
|
|
23
|
+
score: number;
|
|
24
|
+
}
|
|
25
|
+
export interface SearchIconsOutput {
|
|
26
|
+
results: SearchIconsHit[];
|
|
27
|
+
warnings?: string[];
|
|
28
|
+
}
|
|
29
|
+
/** Searches the indexes of the requested (or all configured) providers and merges the ranked hits. */
|
|
30
|
+
export declare function searchIconsTool(input: SearchIconsInput, ctx: ToolContext): Promise<SearchIconsOutput>;
|
|
31
|
+
export declare function registerSearchIconsTool(server: McpServer): void;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ensureIndex } from "../config/ensureIndex.js";
|
|
3
|
+
import { CONFIG_FILE, loadProjectConfig } from "../config/loadConfig.js";
|
|
4
|
+
import { getProvider } from "../providers/registry.js";
|
|
5
|
+
import { loadIndex, searchIcons } from "../search/search.js";
|
|
6
|
+
import { errorMessage, jsonToolResult, resolveContext, resolveVersion, usageSnippet } from "./context.js";
|
|
7
|
+
export const DEFAULT_LIMIT = 10;
|
|
8
|
+
export const MAX_LIMIT = 50;
|
|
9
|
+
function clampLimit(limit) {
|
|
10
|
+
if (limit === undefined || !Number.isFinite(limit))
|
|
11
|
+
return DEFAULT_LIMIT;
|
|
12
|
+
return Math.min(MAX_LIMIT, Math.max(1, Math.floor(limit)));
|
|
13
|
+
}
|
|
14
|
+
function toHit({ record, score }) {
|
|
15
|
+
return {
|
|
16
|
+
name: record.name,
|
|
17
|
+
importName: record.importName,
|
|
18
|
+
importPath: record.importPath,
|
|
19
|
+
package: record.package,
|
|
20
|
+
version: record.version,
|
|
21
|
+
style: record.style,
|
|
22
|
+
set: record.set,
|
|
23
|
+
usage: usageSnippet(record),
|
|
24
|
+
score,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/** Searches the indexes of the requested (or all configured) providers and merges the ranked hits. */
|
|
28
|
+
export async function searchIconsTool(input, ctx) {
|
|
29
|
+
const query = input.query?.trim() ?? "";
|
|
30
|
+
if (!query)
|
|
31
|
+
throw new Error("query must be a non-empty string");
|
|
32
|
+
const config = loadProjectConfig(ctx.projectDir);
|
|
33
|
+
const warnings = [];
|
|
34
|
+
let candidates;
|
|
35
|
+
if (input.provider !== undefined) {
|
|
36
|
+
const provider = getProvider(input.provider);
|
|
37
|
+
if (!provider)
|
|
38
|
+
throw new Error(`Unknown provider "${input.provider}"`);
|
|
39
|
+
candidates = [provider];
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
if (config.providers.length === 0) {
|
|
43
|
+
throw new Error(`No icon providers configured. Create ${CONFIG_FILE} in ${ctx.projectDir} with a "providers" array, ` +
|
|
44
|
+
`e.g. {"providers":[{"package":"lucide-react"}]}, or pass "provider".`);
|
|
45
|
+
}
|
|
46
|
+
candidates = [];
|
|
47
|
+
for (const { package: pkg } of config.providers) {
|
|
48
|
+
const provider = getProvider(pkg);
|
|
49
|
+
if (provider)
|
|
50
|
+
candidates.push(provider);
|
|
51
|
+
else
|
|
52
|
+
warnings.push(`Skipping ${pkg}: not a supported icon provider`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const hits = [];
|
|
56
|
+
for (const provider of candidates) {
|
|
57
|
+
const version = input.version ?? resolveVersion(ctx.projectDir, config, provider.package)?.version;
|
|
58
|
+
if (version === undefined) {
|
|
59
|
+
warnings.push(`Skipping ${provider.id}: could not determine the ${provider.package} version ` +
|
|
60
|
+
`(pin it in ${CONFIG_FILE} or add it to package.json)`);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
const { cacheDir } = await ensureIndex({
|
|
65
|
+
cacheRoot: ctx.cacheRoot,
|
|
66
|
+
providerId: provider.id,
|
|
67
|
+
packageName: provider.package,
|
|
68
|
+
version,
|
|
69
|
+
synonyms: ctx.synonyms,
|
|
70
|
+
});
|
|
71
|
+
const { records } = await loadIndex(cacheDir);
|
|
72
|
+
hits.push(...searchIcons(records, query, { provider: provider.id, style: input.style, set: input.set }));
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
// One broken provider should not hide results from the others.
|
|
76
|
+
if (candidates.length === 1)
|
|
77
|
+
throw error;
|
|
78
|
+
warnings.push(`Skipping ${provider.id}@${version}: ${errorMessage(error)}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const results = hits.sort((a, b) => a.score - b.score).slice(0, clampLimit(input.limit)).map(toHit);
|
|
82
|
+
return warnings.length > 0 ? { results, warnings } : { results };
|
|
83
|
+
}
|
|
84
|
+
export function registerSearchIconsTool(server) {
|
|
85
|
+
server.registerTool("search_icons", {
|
|
86
|
+
description: "Search icons in the icon packages installed in the project. Returns ranked matches with ready-to-paste import statements.",
|
|
87
|
+
inputSchema: {
|
|
88
|
+
query: z.string().min(1).describe('What the icon should depict, e.g. "trash can"'),
|
|
89
|
+
provider: z.string().optional().describe('Provider id or npm package, e.g. "lucide" or "lucide-react"'),
|
|
90
|
+
version: z.string().optional().describe("Package version or range; defaults to the project's version"),
|
|
91
|
+
style: z.string().optional().describe('Style filter, e.g. "outline" or "solid"'),
|
|
92
|
+
set: z.string().optional().describe('Icon set filter (react-icons), e.g. "fa6"'),
|
|
93
|
+
limit: z.number().int().optional().describe(`Maximum results (1-${MAX_LIMIT}, default ${DEFAULT_LIMIT})`),
|
|
94
|
+
},
|
|
95
|
+
}, (input) => jsonToolResult(() => searchIconsTool(input, resolveContext())));
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=searchIcons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searchIcons.js","sourceRoot":"","sources":["../../src/tools/searchIcons.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "trueicon",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server that lets AI coding assistants search the icon packages actually installed in your project.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "manikumarkv",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"bin": {
|
|
9
|
+
"trueicon": "dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist"
|
|
13
|
+
],
|
|
14
|
+
"engines": {
|
|
15
|
+
"node": ">=20"
|
|
16
|
+
},
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc",
|
|
19
|
+
"typecheck": "tsc --noEmit",
|
|
20
|
+
"test": "vitest run",
|
|
21
|
+
"lint": "eslint",
|
|
22
|
+
"prepublishOnly": "npm run build"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@modelcontextprotocol/sdk": "^1.30.1",
|
|
26
|
+
"fuse.js": "^7.5.0",
|
|
27
|
+
"tar": "^7.5.22",
|
|
28
|
+
"zod": "^4.6.5"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@eslint/js": "^10.0.1",
|
|
32
|
+
"@types/node": "^22.0.0",
|
|
33
|
+
"eslint": "^10.11.0",
|
|
34
|
+
"typescript": "^6.0.3",
|
|
35
|
+
"typescript-eslint": "^8.70.1",
|
|
36
|
+
"vitest": "^5.0.1"
|
|
37
|
+
}
|
|
38
|
+
}
|