1
0
mirror of https://github.com/simple-icons/simple-icons.git synced 2025-07-02 22:16:54 +02:00
Files
simple-icons/scripts/utils.js

180 lines
4.5 KiB
JavaScript
Raw Normal View History

// @ts-check
2024-06-06 14:40:35 +02:00
/**
* @file Internal utilities.
*
* Here resides all the functionality that does not qualifies to reside
* in the SDK because is not publicly exposed.
*/
import fs from 'node:fs/promises';
2024-03-25 01:38:18 +08:00
import path from 'node:path';
import {
2024-12-21 22:49:25 +08:00
collator,
getDirnameFromImportMeta,
getIconSlug,
2024-12-21 22:49:25 +08:00
getIconsDataPath,
} from '../sdk.mjs';
const __dirname = getDirnameFromImportMeta(import.meta.url);
2024-06-06 14:40:35 +02:00
/**
* @typedef {import("../sdk.js").IconData} IconData
*/
/**
* Get JSON schema data.
* @param {string} [rootDirectory] Path to the root directory of the project.
2024-06-06 14:40:35 +02:00
* @returns {Promise<any>} JSON schema data.
*/
export const getJsonSchemaData = async (
2024-12-21 22:49:25 +08:00
rootDirectory = path.resolve(__dirname, '..'),
) =>
2024-12-21 22:49:25 +08:00
JSON.parse(
await fs.readFile(path.resolve(rootDirectory, '.jsonschema.json'), 'utf8'),
);
/**
* Write icons data to _data/simple-icons.json.
* @param {IconData[]} iconsData Icons data array.
* @param {boolean} [minify] Whether to minify the JSON output.
* @param {string} [rootDirectory] Path to the root directory of the project.
*/
2023-04-19 15:23:13 +02:00
export const writeIconsData = async (
2024-12-21 22:49:25 +08:00
iconsData,
minify = false,
2024-12-21 22:49:25 +08:00
rootDirectory = path.resolve(__dirname, '..'),
2023-04-19 15:23:13 +02:00
) => {
2024-12-21 22:49:25 +08:00
await fs.writeFile(
getIconsDataPath(rootDirectory),
`${JSON.stringify(iconsData, null, minify ? 0 : '\t')}\n`,
'utf8',
);
};
/**
* Get SPDX license IDs from `spdx-license-ids` package.
* @param {string} [rootDirectory] Path to the root directory of the project.
* @returns {Promise<string[]>} Set of SPDX license IDs.
*/
export const getSpdxLicenseIds = async (
2024-12-21 22:49:25 +08:00
rootDirectory = path.resolve(__dirname, '..'),
) =>
2024-12-21 22:49:25 +08:00
JSON.parse(
await fs.readFile(
path.resolve(
rootDirectory,
'node_modules',
'spdx-license-ids',
'index.json',
),
'utf8',
),
);
/**
* The compare function for sortng icons in _data/simple-icons.json.
* @param {IconData} a Icon A.
* @param {IconData} b Icon B.
* @returns {number} Comparison result.
*/
export const sortIconsCompare = (a, b) => {
2024-12-21 22:49:25 +08:00
return a.title === b.title
? collator.compare(getIconSlug(a), getIconSlug(b))
2024-12-21 22:49:25 +08:00
: collator.compare(a.title, b.title);
};
2025-02-23 01:22:52 +08:00
/**
* Sort icon data obeject.
* @param {IconData} icon The icon data as it appears in *_data/simple-icons.json*.
* @returns {IconData} The sorted icon data.
*/
const sortIcon = (icon) => {
const keyOrder = [
'title',
'slug',
'hex',
'source',
'guidelines',
'license',
'aliases',
// This is not appears in icon data but it's in the alias object.
'loc',
];
2025-02-23 01:22:52 +08:00
const sortedIcon = Object.fromEntries(
Object.entries(icon).sort(
([key1], [key2]) => keyOrder.indexOf(key1) - keyOrder.indexOf(key2),
),
);
// @ts-ignore
2025-02-23 01:22:52 +08:00
return sortedIcon;
};
/**
* Sort license object.
* @param {IconData['license']} license The license object as it appears in *_data/simple-icons.json*.
* @returns {IconData['license'] | undefined} The sorted license object.
*/
const sortLicense = (license) => {
if (!license) return undefined;
const keyOrder = ['type', 'url'];
const sortedLicense = Object.fromEntries(
Object.entries(license).sort(
([key1], [key2]) => keyOrder.indexOf(key1) - keyOrder.indexOf(key2),
),
);
// @ts-ignore
2025-02-23 01:22:52 +08:00
return sortedLicense;
};
/**
* Sort object key alphabetically.
* @param {IconData['aliases']} object The aliases object as it appears in *_data/simple-icons.json*.
* @returns {IconData['aliases'] | undefined} The sorted aliases object.
*/
const sortAlphabetically = (object) => {
if (!object) return undefined;
const sorted = Object.fromEntries(
Object.entries(object).sort(([key1], [key2]) => (key1 > key2 ? 1 : -1)),
);
return sorted;
};
/**
* Sort icons data.
* @param {IconData[]} iconsData The icons data as it appears in *_data/simple-icons.json*.
* @returns {IconData[]} The sorted icons data.
*/
export const formatIconData = (iconsData) => {
const mappedIcons = iconsData.map((icon) => {
return sortIcon({
...icon,
license: sortLicense(icon.license),
aliases: icon.aliases
? sortAlphabetically({
aka: icon.aliases.aka?.sort(collator.compare),
dup: icon.aliases.dup
? icon.aliases.dup
.sort(
// @ts-ignore
sortIconsCompare,
)
.map((d) =>
sortIcon({
...d,
// @ts-ignore
loc: sortAlphabetically(d.loc),
}),
)
2025-02-23 01:22:52 +08:00
: undefined,
// @ts-ignore
2025-02-23 01:22:52 +08:00
loc: sortAlphabetically(icon.aliases.loc),
old: icon.aliases.old?.sort(collator.compare),
})
: undefined,
});
});
const sortedIcons = [...mappedIcons].sort(sortIconsCompare);
return sortedIcons;
};