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,71 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
export const CONFIG_FILE = ".iconmcp.json";
|
|
4
|
+
function isObject(value) {
|
|
5
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
6
|
+
}
|
|
7
|
+
function readJson(path) {
|
|
8
|
+
const text = readFileSync(path, "utf8");
|
|
9
|
+
try {
|
|
10
|
+
return JSON.parse(text);
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
throw new Error(`Invalid JSON in ${path}: ${error instanceof Error ? error.message : String(error)}`, {
|
|
14
|
+
cause: error,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function isMissing(error) {
|
|
19
|
+
return error?.code === "ENOENT";
|
|
20
|
+
}
|
|
21
|
+
/** Reads <projectDir>/.iconmcp.json; a missing file means no configured providers. */
|
|
22
|
+
export function loadProjectConfig(projectDir) {
|
|
23
|
+
const path = join(projectDir, CONFIG_FILE);
|
|
24
|
+
let raw;
|
|
25
|
+
try {
|
|
26
|
+
raw = readJson(path);
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
if (isMissing(error))
|
|
30
|
+
return { providers: [] };
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
if (!isObject(raw) || !Array.isArray(raw.providers)) {
|
|
34
|
+
throw new Error(`Invalid ${path}: expected an object with a "providers" array`);
|
|
35
|
+
}
|
|
36
|
+
const providers = raw.providers.map((entry, i) => {
|
|
37
|
+
if (!isObject(entry) || typeof entry.package !== "string" || entry.package.trim() === "") {
|
|
38
|
+
throw new Error(`Invalid ${path}: providers[${i}].package must be a non-empty string`);
|
|
39
|
+
}
|
|
40
|
+
if (entry.version === undefined)
|
|
41
|
+
return { package: entry.package };
|
|
42
|
+
if (typeof entry.version !== "string" || entry.version.trim() === "") {
|
|
43
|
+
throw new Error(`Invalid ${path}: providers[${i}].version must be a non-empty string when set`);
|
|
44
|
+
}
|
|
45
|
+
return { package: entry.package, version: entry.version };
|
|
46
|
+
});
|
|
47
|
+
return { providers };
|
|
48
|
+
}
|
|
49
|
+
/** Returns the version range declared for packageName in <projectDir>/package.json. */
|
|
50
|
+
export function detectVersion(projectDir, packageName) {
|
|
51
|
+
const path = join(projectDir, "package.json");
|
|
52
|
+
let raw;
|
|
53
|
+
try {
|
|
54
|
+
raw = readJson(path);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
if (isMissing(error))
|
|
58
|
+
throw new Error(`No package.json found at ${path}`, { cause: error });
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
if (!isObject(raw))
|
|
62
|
+
throw new Error(`Invalid ${path}: expected a JSON object`);
|
|
63
|
+
for (const field of ["dependencies", "devDependencies"]) {
|
|
64
|
+
const deps = raw[field];
|
|
65
|
+
const version = isObject(deps) ? deps[packageName] : undefined;
|
|
66
|
+
if (typeof version === "string" && version.trim() !== "")
|
|
67
|
+
return version;
|
|
68
|
+
}
|
|
69
|
+
throw new Error(`${packageName} is not listed in dependencies or devDependencies of ${path}`);
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=loadConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadConfig.js","sourceRoot":"","sources":["../../src/config/loadConfig.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { IndexMeta } from "../indexer/types.js";
|
|
2
|
+
export interface ParsedVersion {
|
|
3
|
+
major: number;
|
|
4
|
+
minor: number;
|
|
5
|
+
patch: number;
|
|
6
|
+
}
|
|
7
|
+
export type IndexAction = "use" | "rebuild" | "missing";
|
|
8
|
+
/**
|
|
9
|
+
* Parses an exact version or an npm range ("^0.460.0", "~5.3.1", ">=1.2.3") into its base
|
|
10
|
+
* x.y.z. Only the first segment of "a || b" or "a - b" ranges is considered.
|
|
11
|
+
*/
|
|
12
|
+
export declare function parseVersion(v: string): ParsedVersion;
|
|
13
|
+
/** Cache key for a package's index: patch releases share one index, e.g. "lucide-react@0.460". */
|
|
14
|
+
export declare function indexKey(packageName: string, version: string): string;
|
|
15
|
+
/** Decides whether a cached index can serve requestedVersion with the current synonyms. */
|
|
16
|
+
export declare function resolveIndexAction(requestedVersion: string, meta: IndexMeta | null, currentSynonymsHash: string): IndexAction;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { INDEX_VERSION } from "../indexer/buildIndex.js";
|
|
2
|
+
const BASE_VERSION = /^v?(\d+)\.(\d+)\.(\d+)(?:[-+.\s]|$)/;
|
|
3
|
+
/**
|
|
4
|
+
* Parses an exact version or an npm range ("^0.460.0", "~5.3.1", ">=1.2.3") into its base
|
|
5
|
+
* x.y.z. Only the first segment of "a || b" or "a - b" ranges is considered.
|
|
6
|
+
*/
|
|
7
|
+
export function parseVersion(v) {
|
|
8
|
+
const first = v.split("||")[0].trim().split(/\s+-\s+/)[0];
|
|
9
|
+
const base = first.replace(/^(?:\^|~|>=|<=|>|<|=)\s*/, "");
|
|
10
|
+
const match = BASE_VERSION.exec(base);
|
|
11
|
+
if (!match)
|
|
12
|
+
throw new Error(`Unparseable version: "${v}"`);
|
|
13
|
+
return { major: Number(match[1]), minor: Number(match[2]), patch: Number(match[3]) };
|
|
14
|
+
}
|
|
15
|
+
/** Cache key for a package's index: patch releases share one index, e.g. "lucide-react@0.460". */
|
|
16
|
+
export function indexKey(packageName, version) {
|
|
17
|
+
const { major, minor } = parseVersion(version);
|
|
18
|
+
return `${packageName}@${major}.${minor}`;
|
|
19
|
+
}
|
|
20
|
+
/** Decides whether a cached index can serve requestedVersion with the current synonyms. */
|
|
21
|
+
export function resolveIndexAction(requestedVersion, meta, currentSynonymsHash) {
|
|
22
|
+
if (meta === null)
|
|
23
|
+
return "missing";
|
|
24
|
+
const requested = parseVersion(requestedVersion);
|
|
25
|
+
const cached = parseVersion(meta.version);
|
|
26
|
+
const sameMinor = cached.major === requested.major && cached.minor === requested.minor;
|
|
27
|
+
return sameMinor && meta.synonymsHash === currentSynonymsHash && meta.indexVersion === INDEX_VERSION
|
|
28
|
+
? "use"
|
|
29
|
+
: "rebuild";
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=versions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versions.js","sourceRoot":"","sources":["../../src/config/versions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAWzD,MAAM,YAAY,GAAG,qCAAqC,CAAC;AAE3D;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAE,CAAC;IAC5D,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,GAAG,CAAC,CAAC;IAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACvF,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,QAAQ,CAAC,WAAmB,EAAE,OAAe;IAC3D,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAC/C,OAAO,GAAG,WAAW,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;AAC5C,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,kBAAkB,CAChC,gBAAwB,EACxB,IAAsB,EACtB,mBAA2B;IAE3B,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACpC,MAAM,SAAS,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,KAAK,CAAC;IACvF,OAAO,SAAS,IAAI,IAAI,CAAC,YAAY,KAAK,mBAAmB,IAAI,IAAI,CAAC,YAAY,KAAK,aAAa;QAClG,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { createServer, SERVER_NAME, SERVER_VERSION } from "./server.js";
|
|
4
|
+
// stdout is the MCP protocol stream: all logging must go to stderr.
|
|
5
|
+
const log = (message) => {
|
|
6
|
+
console.error(`${SERVER_NAME}: ${message}`);
|
|
7
|
+
};
|
|
8
|
+
async function main() {
|
|
9
|
+
const server = createServer();
|
|
10
|
+
const transport = new StdioServerTransport();
|
|
11
|
+
let shuttingDown = false;
|
|
12
|
+
const shutdown = async (signal) => {
|
|
13
|
+
if (shuttingDown)
|
|
14
|
+
return;
|
|
15
|
+
shuttingDown = true;
|
|
16
|
+
log(`received ${signal}, shutting down`);
|
|
17
|
+
try {
|
|
18
|
+
await server.close();
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
log(`error during shutdown: ${String(error)}`);
|
|
22
|
+
}
|
|
23
|
+
process.exit(0);
|
|
24
|
+
};
|
|
25
|
+
process.on("SIGINT", () => void shutdown("SIGINT"));
|
|
26
|
+
process.on("SIGTERM", () => void shutdown("SIGTERM"));
|
|
27
|
+
await server.connect(transport);
|
|
28
|
+
log(`v${SERVER_VERSION} running on stdio`);
|
|
29
|
+
}
|
|
30
|
+
main().catch((error) => {
|
|
31
|
+
log(`fatal error: ${error instanceof Error ? (error.stack ?? error.message) : String(error)}`);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAExE,oEAAoE;AACpE,MAAM,GAAG,GAAG,CAAC,OAAe,EAAQ,EAAE;IACpC,OAAO,CAAC,KAAK,CAAC,GAAG,WAAW,KAAK,OAAO,EAAE,CAAC,CAAC;AAC9C,CAAC,CAAC;AAEF,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAiB,EAAE;QACvD,IAAI,YAAY;YAAE,OAAO;QACzB,YAAY,GAAG,IAAI,CAAC;QACpB,GAAG,CAAC,YAAY,MAAM,iBAAiB,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,0BAA0B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAEtD,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,GAAG,CAAC,IAAI,cAAc,mBAAmB,CAAC,CAAC;AAC7C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,GAAG,CAAC,gBAAgB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC/F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { IconRecord, IndexMeta, Synonyms } from "./types.js";
|
|
2
|
+
export declare const INDEX_FILE = "index.json";
|
|
3
|
+
export declare const META_FILE = "meta.json";
|
|
4
|
+
export declare const INDEX_VERSION = 1;
|
|
5
|
+
export interface BuildIndexOptions {
|
|
6
|
+
providerId: string;
|
|
7
|
+
/** Extracted package directory (e.g. from downloadPackage). */
|
|
8
|
+
packageDir: string;
|
|
9
|
+
/** Exact package version, e.g. "0.460.0". */
|
|
10
|
+
version: string;
|
|
11
|
+
/** Extra search terms per term; keys are matched against lowercased name parts and tags. */
|
|
12
|
+
synonyms?: Synonyms;
|
|
13
|
+
}
|
|
14
|
+
export interface BuiltIndex {
|
|
15
|
+
records: IconRecord[];
|
|
16
|
+
meta: IndexMeta;
|
|
17
|
+
}
|
|
18
|
+
export declare function hashSynonyms(synonyms: Synonyms): string;
|
|
19
|
+
export declare function buildKeywords(name: string, tags: readonly string[], synonyms: Synonyms): string[];
|
|
20
|
+
/** Parses a downloaded package with its provider's adapter and builds the index records. */
|
|
21
|
+
export declare function buildIndex({ providerId, packageDir, version, synonyms, }: BuildIndexOptions): Promise<BuiltIndex>;
|
|
22
|
+
/** Writes index.json and then meta.json (so meta.json marks a complete index) into cacheDir. */
|
|
23
|
+
export declare function writeIndex(cacheDir: string, records: IconRecord[], meta: IndexMeta): Promise<void>;
|
|
24
|
+
/** Builds a package's index and writes it to `<cacheRoot>/<package>@<major.minor>`. */
|
|
25
|
+
export declare function buildIndexFromPackage(packageDir: string, providerId: string, version: string, cacheRoot: string, synonyms?: Synonyms): Promise<BuiltIndex & {
|
|
26
|
+
dir: string;
|
|
27
|
+
}>;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { ADAPTERS } from "../providers/adapters/index.js";
|
|
5
|
+
import { getProvider } from "../providers/registry.js";
|
|
6
|
+
export const INDEX_FILE = "index.json";
|
|
7
|
+
export const META_FILE = "meta.json";
|
|
8
|
+
export const INDEX_VERSION = 1;
|
|
9
|
+
// JSON with object keys sorted, so equal synonym maps hash the same regardless of key order.
|
|
10
|
+
function canonicalJson(synonyms) {
|
|
11
|
+
const sorted = Object.keys(synonyms)
|
|
12
|
+
.sort()
|
|
13
|
+
.map((key) => [key, synonyms[key]]);
|
|
14
|
+
return JSON.stringify(sorted);
|
|
15
|
+
}
|
|
16
|
+
export function hashSynonyms(synonyms) {
|
|
17
|
+
return createHash("sha256").update(canonicalJson(synonyms)).digest("hex");
|
|
18
|
+
}
|
|
19
|
+
export function buildKeywords(name, tags, synonyms) {
|
|
20
|
+
const terms = [...name.split("-"), ...tags].map((t) => t.toLowerCase()).filter(Boolean);
|
|
21
|
+
const expansions = terms.flatMap((t) => (Object.hasOwn(synonyms, t) ? synonyms[t] : []));
|
|
22
|
+
return [...new Set([...terms, ...expansions.map((t) => t.toLowerCase())])];
|
|
23
|
+
}
|
|
24
|
+
function majorMinor(version) {
|
|
25
|
+
const match = /^(\d+)\.(\d+)\.\d+(?:[-+].*)?$/.exec(version);
|
|
26
|
+
if (!match)
|
|
27
|
+
throw new Error(`Expected an exact semver version, got "${version}"`);
|
|
28
|
+
return `${match[1]}.${match[2]}`;
|
|
29
|
+
}
|
|
30
|
+
/** Parses a downloaded package with its provider's adapter and builds the index records. */
|
|
31
|
+
export async function buildIndex({ providerId, packageDir, version, synonyms = {}, }) {
|
|
32
|
+
const provider = getProvider(providerId);
|
|
33
|
+
const adapter = ADAPTERS[providerId];
|
|
34
|
+
if (!provider || provider.id !== providerId || !adapter)
|
|
35
|
+
throw new Error(`Unknown provider: "${providerId}"`);
|
|
36
|
+
const idPrefix = `${provider.package}@${majorMinor(version)}:`;
|
|
37
|
+
const seen = new Set();
|
|
38
|
+
const records = adapter(packageDir).map((icon) => {
|
|
39
|
+
if (seen.has(icon.name))
|
|
40
|
+
throw new Error(`Duplicate icon name "${icon.name}" in ${provider.package}`);
|
|
41
|
+
seen.add(icon.name);
|
|
42
|
+
const tags = icon.tags ?? [];
|
|
43
|
+
return {
|
|
44
|
+
id: idPrefix + icon.name,
|
|
45
|
+
name: icon.name,
|
|
46
|
+
importName: icon.importName,
|
|
47
|
+
importPath: icon.importPath,
|
|
48
|
+
provider: provider.id,
|
|
49
|
+
package: provider.package,
|
|
50
|
+
version,
|
|
51
|
+
style: icon.style,
|
|
52
|
+
set: icon.set,
|
|
53
|
+
categories: icon.categories ?? [],
|
|
54
|
+
tags,
|
|
55
|
+
keywords: buildKeywords(icon.name, tags, synonyms),
|
|
56
|
+
svg: icon.svg,
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
records.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
|
|
60
|
+
const meta = {
|
|
61
|
+
provider: provider.id,
|
|
62
|
+
package: provider.package,
|
|
63
|
+
version,
|
|
64
|
+
indexVersion: INDEX_VERSION,
|
|
65
|
+
synonymsHash: hashSynonyms(synonyms),
|
|
66
|
+
builtAt: new Date().toISOString(),
|
|
67
|
+
};
|
|
68
|
+
return { records, meta };
|
|
69
|
+
}
|
|
70
|
+
/** Writes index.json and then meta.json (so meta.json marks a complete index) into cacheDir. */
|
|
71
|
+
export async function writeIndex(cacheDir, records, meta) {
|
|
72
|
+
await mkdir(cacheDir, { recursive: true });
|
|
73
|
+
await writeFile(join(cacheDir, INDEX_FILE), JSON.stringify(records));
|
|
74
|
+
await writeFile(join(cacheDir, META_FILE), `${JSON.stringify(meta, null, 2)}\n`);
|
|
75
|
+
}
|
|
76
|
+
/** Builds a package's index and writes it to `<cacheRoot>/<package>@<major.minor>`. */
|
|
77
|
+
export async function buildIndexFromPackage(packageDir, providerId, version, cacheRoot, synonyms = {}) {
|
|
78
|
+
const built = await buildIndex({ providerId, packageDir, version, synonyms });
|
|
79
|
+
const dir = join(cacheRoot, `${built.meta.package}@${majorMinor(version)}`);
|
|
80
|
+
await writeIndex(dir, built.records, built.meta);
|
|
81
|
+
return { ...built, dir };
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=buildIndex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildIndex.js","sourceRoot":"","sources":["../../src/indexer/buildIndex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** One icon in a per-version index (index.json). */
|
|
2
|
+
export interface IconRecord {
|
|
3
|
+
/** "<package>@<major.minor>:<name>", e.g. "lucide-react@0.460:trash-2". */
|
|
4
|
+
id: string;
|
|
5
|
+
name: string;
|
|
6
|
+
importName: string;
|
|
7
|
+
importPath: string;
|
|
8
|
+
/** Provider id from the registry, e.g. "lucide". */
|
|
9
|
+
provider: string;
|
|
10
|
+
package: string;
|
|
11
|
+
/** Exact package version, e.g. "0.460.0". */
|
|
12
|
+
version: string;
|
|
13
|
+
style?: string;
|
|
14
|
+
set?: string;
|
|
15
|
+
categories: string[];
|
|
16
|
+
tags: string[];
|
|
17
|
+
/** Deduped search terms: name parts, tags, then synonym expansions. */
|
|
18
|
+
keywords: string[];
|
|
19
|
+
/** Inner SVG markup. */
|
|
20
|
+
svg: string;
|
|
21
|
+
}
|
|
22
|
+
/** Describes how an index was built (meta.json). */
|
|
23
|
+
export interface IndexMeta {
|
|
24
|
+
provider: string;
|
|
25
|
+
package: string;
|
|
26
|
+
/** Exact package version. */
|
|
27
|
+
version: string;
|
|
28
|
+
indexVersion: 1;
|
|
29
|
+
/** sha256 (hex) of the canonicalized synonyms object used for keyword expansion. */
|
|
30
|
+
synonymsHash: string;
|
|
31
|
+
/** ISO timestamp. */
|
|
32
|
+
builtAt: string;
|
|
33
|
+
}
|
|
34
|
+
/** Maps a term to extra search terms, e.g. { trash: ["delete", "bin"] }. */
|
|
35
|
+
export type Synonyms = Record<string, string[]>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/indexer/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One icon as extracted from a package's shipped files, before indexing.
|
|
3
|
+
* `name` must be unique within the package: it becomes part of the index record id.
|
|
4
|
+
*/
|
|
5
|
+
export interface RawIcon {
|
|
6
|
+
/** Kebab-case icon name, unique within the package (e.g. "trash-2", "fa6-beer"). */
|
|
7
|
+
name: string;
|
|
8
|
+
/** Exported component name (e.g. "Trash2", "FaBeer", "TrashIcon"). */
|
|
9
|
+
importName: string;
|
|
10
|
+
/** Module specifier to import the component from (e.g. "react-icons/fa"). */
|
|
11
|
+
importPath: string;
|
|
12
|
+
style?: string;
|
|
13
|
+
set?: string;
|
|
14
|
+
categories?: string[];
|
|
15
|
+
tags?: string[];
|
|
16
|
+
/** Inner SVG markup (the children of the root <svg> element). */
|
|
17
|
+
svg: string;
|
|
18
|
+
}
|
|
19
|
+
export type ParseIcons = (packageDir: string) => RawIcon[];
|
|
20
|
+
export declare function toKebabCase(identifier: string): string;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Converts a PascalCase/camelCase identifier to kebab-case: "ArrowDown01" -> "arrow-down-01",
|
|
2
|
+
// "Fa500Px" -> "fa-500-px", "Grid2x2" -> "grid-2x2", "HTMLTag" -> "html-tag".
|
|
3
|
+
export function toKebabCase(identifier) {
|
|
4
|
+
return identifier
|
|
5
|
+
.replace(/([a-z0-9])([A-Z])/g, "$1-$2")
|
|
6
|
+
.replace(/([A-Z])([A-Z][a-z])/g, "$1-$2")
|
|
7
|
+
.replace(/(?<!\d)([a-zA-Z])(\d)/g, "$1-$2")
|
|
8
|
+
.toLowerCase();
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/providers/adapter.ts"],"names":[],"mappings":"AAqBA,8FAA8F;AAC9F,8EAA8E;AAC9E,MAAM,UAAU,WAAW,CAAC,UAAkB;IAC5C,OAAO,UAAU;SACd,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,sBAAsB,EAAE,OAAO,CAAC;SACxC,OAAO,CAAC,wBAAwB,EAAE,OAAO,CAAC;SAC1C,WAAW,EAAE,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { toKebabCase } from "../adapter.js";
|
|
4
|
+
import { LiteralCursor } from "../jsLiteral.js";
|
|
5
|
+
import { renderSvg, toSvgAttrs } from "../svg.js";
|
|
6
|
+
/*
|
|
7
|
+
* @heroicons/react layout: <size>/<style>/esm/<Name>Icon.js (24/outline, 24/solid, 20/solid,
|
|
8
|
+
* 16/solid), one compiled component per file:
|
|
9
|
+
*
|
|
10
|
+
* return React.createElement("svg", Object.assign({...}, props),
|
|
11
|
+
* title ? React.createElement("title", {id: titleId}, title) : null,
|
|
12
|
+
* React.createElement("path", {strokeLinecap: "round", d: "..."}), ...);
|
|
13
|
+
*
|
|
14
|
+
* The children after the optional <title> are the icon's inner SVG (they may nest, e.g.
|
|
15
|
+
* <g>/<defs>). The same icon exists in every variant, so `name` carries the variant to stay
|
|
16
|
+
* unique: 24/outline/TrashIcon -> "trash-24-outline". The top-level outline/ and solid/ dirs
|
|
17
|
+
* are v1 compatibility stubs and are skipped. Heroicons ships no categories or tags.
|
|
18
|
+
*/
|
|
19
|
+
const TITLE_CHILD = /title \? [^:]*?React\.createElement\("title",[\s\S]*?\) : null/;
|
|
20
|
+
function parseElement(cursor) {
|
|
21
|
+
cursor.expect("React.createElement(");
|
|
22
|
+
const tag = cursor.string();
|
|
23
|
+
cursor.expect(",");
|
|
24
|
+
const attr = toSvgAttrs(cursor.value());
|
|
25
|
+
const child = [];
|
|
26
|
+
while (cursor.eat(","))
|
|
27
|
+
child.push(parseElement(cursor));
|
|
28
|
+
cursor.expect(")");
|
|
29
|
+
return { tag, attr, child };
|
|
30
|
+
}
|
|
31
|
+
export function parseIconFile(src) {
|
|
32
|
+
const title = TITLE_CHILD.exec(src);
|
|
33
|
+
if (!title)
|
|
34
|
+
throw new Error("svg <title> child not found");
|
|
35
|
+
const cursor = new LiteralCursor(src, title.index + title[0].length);
|
|
36
|
+
const nodes = [];
|
|
37
|
+
while (cursor.eat(","))
|
|
38
|
+
nodes.push(parseElement(cursor));
|
|
39
|
+
cursor.expect(")");
|
|
40
|
+
return nodes;
|
|
41
|
+
}
|
|
42
|
+
function subdirs(dir) {
|
|
43
|
+
return readdirSync(dir, { withFileTypes: true })
|
|
44
|
+
.filter((entry) => entry.isDirectory())
|
|
45
|
+
.map((entry) => entry.name)
|
|
46
|
+
.sort();
|
|
47
|
+
}
|
|
48
|
+
export function parseIcons(packageDir) {
|
|
49
|
+
const icons = [];
|
|
50
|
+
for (const size of subdirs(packageDir).filter((d) => /^\d+$/.test(d))) {
|
|
51
|
+
for (const style of subdirs(join(packageDir, size))) {
|
|
52
|
+
const esmDir = join(packageDir, size, style, "esm");
|
|
53
|
+
if (!existsSync(esmDir))
|
|
54
|
+
continue;
|
|
55
|
+
for (const file of readdirSync(esmDir).filter((f) => /^\w+Icon\.js$/.test(f)).sort()) {
|
|
56
|
+
const importName = file.slice(0, -".js".length);
|
|
57
|
+
const nodes = parseIconFile(readFileSync(join(esmDir, file), "utf8"));
|
|
58
|
+
icons.push({
|
|
59
|
+
name: `${toKebabCase(importName.slice(0, -"Icon".length))}-${size}-${style}`,
|
|
60
|
+
importName,
|
|
61
|
+
importPath: `@heroicons/react/${size}/${style}`,
|
|
62
|
+
style,
|
|
63
|
+
set: "heroicons",
|
|
64
|
+
categories: [],
|
|
65
|
+
tags: [],
|
|
66
|
+
svg: renderSvg(nodes),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return icons;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=heroicons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heroicons.js","sourceRoot":"","sources":["../../../src/providers/adapters/heroicons.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { parseIcons as parseHeroicons } from "./heroicons.js";
|
|
2
|
+
import { parseIcons as parseLucide } from "./lucide.js";
|
|
3
|
+
import { parseIcons as parseReactIcons } from "./react-icons.js";
|
|
4
|
+
// Adapter per provider id (see ../registry.ts).
|
|
5
|
+
export const ADAPTERS = {
|
|
6
|
+
"react-icons": parseReactIcons,
|
|
7
|
+
lucide: parseLucide,
|
|
8
|
+
heroicons: parseHeroicons,
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/adapters/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,UAAU,IAAI,WAAW,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,UAAU,IAAI,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEjE,gDAAgD;AAChD,MAAM,CAAC,MAAM,QAAQ,GAAyC;IAC5D,aAAa,EAAE,eAAe;IAC9B,MAAM,EAAE,WAAW;IACnB,SAAS,EAAE,cAAc;CAC1B,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { readdirSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { LiteralCursor } from "../jsLiteral.js";
|
|
4
|
+
import { renderSvg, toSvgAttrs } from "../svg.js";
|
|
5
|
+
/*
|
|
6
|
+
* lucide-react layout: dist/esm/icons/<kebab-name>.js, one ESM module per icon:
|
|
7
|
+
*
|
|
8
|
+
* const Trash2 = createLucideIcon("Trash2", [["path", { d: "...", key: "..." }], ...]);
|
|
9
|
+
*
|
|
10
|
+
* Deprecated alias names ship as re-export modules (`export { default } from './target.js'`);
|
|
11
|
+
* they are not indexed separately but added to the target icon's tags so old names still match.
|
|
12
|
+
* lucide-react ships no categories or tags of its own.
|
|
13
|
+
*/
|
|
14
|
+
const ICONS_DIR = join("dist", "esm", "icons");
|
|
15
|
+
const CREATE_CALL = /createLucideIcon\(\s*/;
|
|
16
|
+
const ALIAS_EXPORT = /export\s*\{\s*default\s*\}\s*from\s*['"]\.\/([\w-]+)\.js['"]/;
|
|
17
|
+
function parseNodes(cursor) {
|
|
18
|
+
const nodes = cursor.array();
|
|
19
|
+
return nodes.map((node) => {
|
|
20
|
+
if (!Array.isArray(node) || typeof node[0] !== "string")
|
|
21
|
+
cursor.fail("expected [tag, attrs]");
|
|
22
|
+
return { tag: node[0], attr: toSvgAttrs(node[1]), child: [] };
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
export function parseIcons(packageDir) {
|
|
26
|
+
const dir = join(packageDir, ICONS_DIR);
|
|
27
|
+
const icons = new Map();
|
|
28
|
+
const aliases = [];
|
|
29
|
+
for (const file of readdirSync(dir).filter((f) => f.endsWith(".js")).sort()) {
|
|
30
|
+
const name = file.slice(0, -".js".length);
|
|
31
|
+
const src = readFileSync(join(dir, file), "utf8");
|
|
32
|
+
const call = CREATE_CALL.exec(src);
|
|
33
|
+
if (!call) {
|
|
34
|
+
const alias = ALIAS_EXPORT.exec(src);
|
|
35
|
+
if (alias)
|
|
36
|
+
aliases.push([name, alias[1]]);
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const cursor = new LiteralCursor(src, call.index + call[0].length);
|
|
40
|
+
const importName = cursor.string();
|
|
41
|
+
cursor.expect(",");
|
|
42
|
+
icons.set(name, {
|
|
43
|
+
name,
|
|
44
|
+
importName,
|
|
45
|
+
importPath: "lucide-react",
|
|
46
|
+
style: "outline",
|
|
47
|
+
set: "lucide",
|
|
48
|
+
categories: [],
|
|
49
|
+
tags: [],
|
|
50
|
+
svg: renderSvg(parseNodes(cursor)),
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
for (const [alias, target] of aliases)
|
|
54
|
+
icons.get(target)?.tags?.push(alias);
|
|
55
|
+
return [...icons.values()];
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=lucide.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lucide.js","sourceRoot":"","sources":["../../../src/providers/adapters/lucide.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { toKebabCase } from "../adapter.js";
|
|
4
|
+
import { LiteralCursor } from "../jsLiteral.js";
|
|
5
|
+
import { renderSvg, toSvgAttrs } from "../svg.js";
|
|
6
|
+
/*
|
|
7
|
+
* react-icons layout: one directory per icon set (fa/, fa6/, md/, ...), each with an
|
|
8
|
+
* index.mjs that defines every icon of the set:
|
|
9
|
+
*
|
|
10
|
+
* export function FaBeer (props) {
|
|
11
|
+
* return GenIcon({"tag":"svg","attr":{"viewBox":"0 0 448 512"},"child":[...]})(props);
|
|
12
|
+
* };
|
|
13
|
+
*
|
|
14
|
+
* The root node is the <svg> itself; its children become the icon's inner SVG.
|
|
15
|
+
* Component names are only unique within a set (fa/FaBell and fa6/FaBell both exist), so
|
|
16
|
+
* `name` is "<set>-<rest>" where <rest> is the component name minus its set prefix:
|
|
17
|
+
* fa/FaBeer -> "fa-beer", fa6/FaBeer -> "fa6-beer", hi2/HiOutlineBell -> "hi2-outline-bell".
|
|
18
|
+
* react-icons ships no categories or tags.
|
|
19
|
+
*/
|
|
20
|
+
const ICON_FUNCTION = /export function (\w+)\s*\(props\)\s*\{\s*return GenIcon\(/g;
|
|
21
|
+
function toNode(value) {
|
|
22
|
+
if (!value || typeof value !== "object" || Array.isArray(value) || typeof value.tag !== "string") {
|
|
23
|
+
throw new Error("GenIcon node is missing a tag");
|
|
24
|
+
}
|
|
25
|
+
const child = Array.isArray(value.child) ? value.child.map(toNode) : [];
|
|
26
|
+
return { tag: value.tag, attr: toSvgAttrs(value.attr), child };
|
|
27
|
+
}
|
|
28
|
+
function iconName(set, importName) {
|
|
29
|
+
// Set ids map to component prefixes: fa6 -> "Fa", lia -> "Lia", hi2 -> "Hi".
|
|
30
|
+
const base = set.replace(/\d+$/, "");
|
|
31
|
+
const prefix = base.charAt(0).toUpperCase() + base.slice(1);
|
|
32
|
+
const rest = importName.startsWith(prefix) ? importName.slice(prefix.length) : importName;
|
|
33
|
+
return `${set}-${toKebabCase(rest)}`;
|
|
34
|
+
}
|
|
35
|
+
export function parseSetFile(set, src) {
|
|
36
|
+
const icons = [];
|
|
37
|
+
for (const match of src.matchAll(ICON_FUNCTION)) {
|
|
38
|
+
const importName = match[1];
|
|
39
|
+
const root = toNode(new LiteralCursor(src, match.index + match[0].length).value());
|
|
40
|
+
icons.push({
|
|
41
|
+
name: iconName(set, importName),
|
|
42
|
+
importName,
|
|
43
|
+
importPath: `react-icons/${set}`,
|
|
44
|
+
set,
|
|
45
|
+
categories: [],
|
|
46
|
+
tags: [],
|
|
47
|
+
svg: renderSvg(root.child),
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return icons;
|
|
51
|
+
}
|
|
52
|
+
export function parseIcons(packageDir) {
|
|
53
|
+
const icons = [];
|
|
54
|
+
const sets = readdirSync(packageDir, { withFileTypes: true })
|
|
55
|
+
.filter((entry) => entry.isDirectory() && entry.name !== "lib")
|
|
56
|
+
.map((entry) => entry.name)
|
|
57
|
+
.sort();
|
|
58
|
+
for (const set of sets) {
|
|
59
|
+
const file = join(packageDir, set, "index.mjs");
|
|
60
|
+
if (!existsSync(file))
|
|
61
|
+
continue;
|
|
62
|
+
icons.push(...parseSetFile(set, readFileSync(file, "utf8")));
|
|
63
|
+
}
|
|
64
|
+
return icons;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=react-icons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-icons.js","sourceRoot":"","sources":["../../../src/providers/adapters/react-icons.ts"],"names":[],"mappings":"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"}
|