mirror of
https://github.com/lucide-icons/lucide.git
synced 2026-11-14 13:58:21 +00:00
Added icon release metadata builder
This commit is contained in:
@@ -28,5 +28,6 @@ docs/.vitepress/dist
|
||||
docs/.vitepress/.temp
|
||||
docs/.vitepress/data/iconNodes
|
||||
docs/.vitepress/data/iconMetaData.ts
|
||||
docs/.vitepress/data/releaseMetaData.json
|
||||
docs/.vercel
|
||||
docs/.nitro
|
||||
|
||||
@@ -2,9 +2,10 @@ import fs from "fs";
|
||||
import path from "path";
|
||||
import { parseSync } from "svgson";
|
||||
import { IconNode } from "../../../packages/lucide-react/src/createLucideIcon";
|
||||
import { IconEntity } from "../theme/types";
|
||||
import { IconEntity, Release } from "../theme/types";
|
||||
import { getContributors } from "./fetchAllContributors";
|
||||
import { generateHashedKey } from "./helpers";
|
||||
import releaseMeta from "../data/releaseMetaData.json";
|
||||
|
||||
const directory = path.join(process.cwd(), "../icons");
|
||||
|
||||
@@ -47,6 +48,7 @@ export async function getData(name: string, { withChildKeys = false }: GetDataOp
|
||||
categories,
|
||||
// contributors,
|
||||
iconNode,
|
||||
...(releaseMeta[name] ?? {})
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,8 @@ export interface IconEntity {
|
||||
categories: string[];
|
||||
contributors: Contributor[];
|
||||
iconNode: IconNode;
|
||||
createdRelease?: Release;
|
||||
changedRelease?: Release;
|
||||
}
|
||||
|
||||
export interface Contributor {
|
||||
@@ -36,3 +38,9 @@ export interface PackageItem {
|
||||
private?: boolean
|
||||
flutter?: object
|
||||
}
|
||||
|
||||
|
||||
export interface Release {
|
||||
version: string
|
||||
date: string
|
||||
}
|
||||
|
||||
+4
-1
@@ -10,10 +10,11 @@
|
||||
"docs:preview": "vitepress preview",
|
||||
"build:iconNodes": "node ../scripts/writeIconNodes.mjs",
|
||||
"build:metaJson": "node ../scripts/writeIconMetaIndex.mjs",
|
||||
"build:releaseJson": "node ../scripts/writeReleaseMetadata.mjs",
|
||||
"build:vercelJson": "node ../scripts/writeVercelOutput.mjs",
|
||||
"dev": "npx nitropack dev",
|
||||
"build:api": "npx nitropack build",
|
||||
"build": "pnpm build:iconNodes && pnpm build:metaJson && pnpm build:api && pnpm docs:build && pnpm build:vercelJson",
|
||||
"build": "pnpm build:iconNodes && pnpm build:metaJson && pnpm build:releaseJson && pnpm build:api && pnpm docs:build && pnpm build:vercelJson",
|
||||
"preview": "node .output/server/index.mjs"
|
||||
},
|
||||
"keywords": [],
|
||||
@@ -39,8 +40,10 @@
|
||||
"lucide-vue-next": "workspace:*",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"semver": "^7.5.0",
|
||||
"shiki": "^0.14.2",
|
||||
"shiki-processor": "^0.1.3",
|
||||
"simple-git": "^3.18.0",
|
||||
"svg-pathdata": "^6.0.3",
|
||||
"vue": "^3.2.47"
|
||||
}
|
||||
|
||||
@@ -41,6 +41,8 @@
|
||||
"minimist": "^1.2.8",
|
||||
"node-fetch": "^3.3.1",
|
||||
"prettier": "2.7.1",
|
||||
"semver": "^7.5.0",
|
||||
"simple-git": "^3.18.0",
|
||||
"svgo": "^3.0.2",
|
||||
"svgson": "^5.2.1"
|
||||
},
|
||||
|
||||
Generated
+311
-218
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,94 @@
|
||||
import {CleanOptions, simpleGit} from 'simple-git';
|
||||
import semver from 'semver';
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
import {readSvgDirectory} from './helpers.mjs';
|
||||
|
||||
const currentDir = process.cwd();
|
||||
const ICONS_DIR = path.resolve(currentDir, '../icons');
|
||||
const iconJsonFiles = readSvgDirectory(ICONS_DIR, '.json');
|
||||
|
||||
const location = path.resolve(currentDir, '.vitepress/data', 'releaseMetaData.json');
|
||||
|
||||
if (fs.existsSync(location)) {
|
||||
fs.unlinkSync(location);
|
||||
}
|
||||
|
||||
export const releaseMin = (a, b) => {
|
||||
if (!a) return b;
|
||||
if (!b) return a;
|
||||
return semver.gt(a.version, b.version) ? b : a;
|
||||
}
|
||||
|
||||
export const releaseMax = (a, b) => {
|
||||
if (!a) return b;
|
||||
if (!b) return a;
|
||||
return semver.gt(a.version, b.version) ? a : b;
|
||||
}
|
||||
|
||||
export const updateReleaseMetadataWithCommit = (metadata, date, release) => {
|
||||
metadata = metadata || {};
|
||||
metadata.createdRelease = releaseMin(metadata.createdRelease, release);
|
||||
metadata.changedRelease = releaseMax(metadata.changedRelease, release);
|
||||
}
|
||||
|
||||
export const fetchAllReleases = async () => {
|
||||
return (await Promise.all((await simpleGit().raw('show-ref', '--tags', '-d')).trim().split(/\n/)
|
||||
.map(async (line) => {
|
||||
const [commit, ref] = line.split(/ /);
|
||||
const version = semver.coerce(ref.replace('refs/tags/', '')).version;
|
||||
const date = (await simpleGit().show(['-s', '--format=%cI', commit])).trim();
|
||||
return {version, date};
|
||||
}))).filter(({version}) => semver.valid(version))
|
||||
}
|
||||
|
||||
simpleGit().clean(CleanOptions.FORCE);
|
||||
|
||||
const findRelease = (date, releases) => {
|
||||
let closestRelease = null;
|
||||
for (const release of releases) {
|
||||
if (release.date >= date && (closestRelease === null || release.date < closestRelease.date)) {
|
||||
closestRelease = release;
|
||||
}
|
||||
}
|
||||
return closestRelease;
|
||||
}
|
||||
|
||||
const fetchCommits = async (name) => {
|
||||
const file = `../icons/${name}.svg`;
|
||||
const {all: commits} = await simpleGit().log(['--reverse', '--follow', '--', file]);
|
||||
return commits;
|
||||
}
|
||||
|
||||
export const getReleaseMetadata = async (name, aliases, releases) => {
|
||||
const metadata = {name};
|
||||
for (let alias of [name, ...(aliases ?? [])]) {
|
||||
const commits = await fetchCommits(alias);
|
||||
for (const commit of commits) {
|
||||
const date = new Date(commit.date).toISOString();
|
||||
const release = findRelease(date, releases)
|
||||
updateReleaseMetadataWithCommit(metadata, date, release);
|
||||
}
|
||||
}
|
||||
return metadata;
|
||||
};
|
||||
|
||||
|
||||
const releases = await fetchAllReleases();
|
||||
const releaseMetaData = (await Promise.all(iconJsonFiles.map(async (iconJsonFile) => {
|
||||
const iconName = path.basename(iconJsonFile, '.json');
|
||||
const aliases = JSON.parse(fs.readFileSync(path.join(ICONS_DIR, iconJsonFile))).aliases;
|
||||
return await getReleaseMetadata(iconName, aliases, releases);
|
||||
}))).reduce((acc, {name, ...rest}) => {
|
||||
acc[name] = rest;
|
||||
return acc;
|
||||
}, {})
|
||||
|
||||
fs.promises
|
||||
.writeFile(location, JSON.stringify(releaseMetaData, null, 2), 'utf-8')
|
||||
.then(() => {
|
||||
console.log('Successfully written icon release meta cache file');
|
||||
})
|
||||
.catch((error) => {
|
||||
throw new Error(`Something went wrong generating icon release meta cache file,\n ${error}`);
|
||||
});
|
||||
Reference in New Issue
Block a user