mirror of
https://github.com/iconify/iconify.git
synced 2024-12-13 14:13:06 +00:00
Make few icon set info fields optional, clean up code for converting icon set info
This commit is contained in:
parent
fe1d673603
commit
c4dde40fc8
18
packages/types/package-lock.json
generated
18
packages/types/package-lock.json
generated
@ -1,21 +1,21 @@
|
||||
{
|
||||
"name": "@iconify/types",
|
||||
"version": "1.0.9",
|
||||
"version": "1.0.10",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@iconify/types",
|
||||
"version": "1.0.9",
|
||||
"version": "1.0.10",
|
||||
"license": "(Apache-2.0 OR GPL-2.0)",
|
||||
"devDependencies": {
|
||||
"typescript": "^4.1.2"
|
||||
"typescript": "^4.4.3"
|
||||
}
|
||||
},
|
||||
"node_modules/typescript": {
|
||||
"version": "4.1.3",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz",
|
||||
"integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==",
|
||||
"version": "4.4.3",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz",
|
||||
"integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==",
|
||||
"dev": true,
|
||||
"bin": {
|
||||
"tsc": "bin/tsc",
|
||||
@ -28,9 +28,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"typescript": {
|
||||
"version": "4.1.3",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz",
|
||||
"integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==",
|
||||
"version": "4.4.3",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz",
|
||||
"integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@iconify/types",
|
||||
"description": "Types for Iconify data",
|
||||
"version": "1.0.9",
|
||||
"version": "1.0.10",
|
||||
"author": "Vjacheslav Trushkin",
|
||||
"license": "(Apache-2.0 OR GPL-2.0)",
|
||||
"main": "./index.js",
|
||||
@ -17,6 +17,6 @@
|
||||
"directory": "packages/types"
|
||||
},
|
||||
"devDependencies": {
|
||||
"typescript": "^4.1.2"
|
||||
"typescript": "^4.4.3"
|
||||
}
|
||||
}
|
||||
|
@ -144,7 +144,7 @@ export interface IconifyInfo {
|
||||
};
|
||||
|
||||
// Array of icons that should be used for samples in icon sets list.
|
||||
samples: string[];
|
||||
samples?: string[];
|
||||
|
||||
// Icon grid: number or array of numbers.
|
||||
height?: number | number[];
|
||||
@ -156,8 +156,8 @@ export interface IconifyInfo {
|
||||
category?: string;
|
||||
|
||||
// Palette status. True if icons have predefined color scheme, false if icons use currentColor.
|
||||
// Icon set should not mix icons with and without palette to simplify search.
|
||||
palette: boolean;
|
||||
// Ideally, icon set should not mix icons with and without palette to simplify search.
|
||||
palette?: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
|
18
packages/utils/package-lock.json
generated
18
packages/utils/package-lock.json
generated
@ -1,15 +1,15 @@
|
||||
{
|
||||
"name": "@iconify/utils",
|
||||
"version": "1.0.10",
|
||||
"version": "1.0.13",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@iconify/utils",
|
||||
"version": "1.0.10",
|
||||
"version": "1.0.13",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@iconify/types": "^1.0.7"
|
||||
"@iconify/types": "^1.0.10"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@iconify/library-builder": "^1.0.3",
|
||||
@ -723,9 +723,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@iconify/types": {
|
||||
"version": "1.0.7",
|
||||
"resolved": "https://registry.npmjs.org/@iconify/types/-/types-1.0.7.tgz",
|
||||
"integrity": "sha512-zdwkVc67O9SqI/svsogD2s+XB3Uk4Xx+PrMEn5Qm3ktKSXFveZL0iP3yzqbrFg1KRRd93nRs4QycLaIRMhA0Pg=="
|
||||
"version": "1.0.10",
|
||||
"resolved": "https://registry.npmjs.org/@iconify/types/-/types-1.0.10.tgz",
|
||||
"integrity": "sha512-SN3z6einVeUckDQiE8p4POF7X4hk4/y2+a7a4ogJOCxX5XT6z1zXNN8dwS5O1vloXpc6mkHizRZm2qPnhK6NnQ=="
|
||||
},
|
||||
"node_modules/@istanbuljs/load-nyc-config": {
|
||||
"version": "1.1.0",
|
||||
@ -5832,9 +5832,9 @@
|
||||
}
|
||||
},
|
||||
"@iconify/types": {
|
||||
"version": "1.0.7",
|
||||
"resolved": "https://registry.npmjs.org/@iconify/types/-/types-1.0.7.tgz",
|
||||
"integrity": "sha512-zdwkVc67O9SqI/svsogD2s+XB3Uk4Xx+PrMEn5Qm3ktKSXFveZL0iP3yzqbrFg1KRRd93nRs4QycLaIRMhA0Pg=="
|
||||
"version": "1.0.10",
|
||||
"resolved": "https://registry.npmjs.org/@iconify/types/-/types-1.0.10.tgz",
|
||||
"integrity": "sha512-SN3z6einVeUckDQiE8p4POF7X4hk4/y2+a7a4ogJOCxX5XT6z1zXNN8dwS5O1vloXpc6mkHizRZm2qPnhK6NnQ=="
|
||||
},
|
||||
"@istanbuljs/load-nyc-config": {
|
||||
"version": "1.1.0",
|
||||
|
@ -2,7 +2,7 @@
|
||||
"name": "@iconify/utils",
|
||||
"description": "Common functions for working with Iconify icon sets used by various packages.",
|
||||
"author": "Vjacheslav Trushkin",
|
||||
"version": "1.0.12",
|
||||
"version": "1.0.13",
|
||||
"license": "MIT",
|
||||
"bugs": "https://github.com/iconify/iconify/issues",
|
||||
"homepage": "https://iconify.design/",
|
||||
@ -104,7 +104,7 @@
|
||||
}
|
||||
},
|
||||
"dependencies": {
|
||||
"@iconify/types": "^1.0.7"
|
||||
"@iconify/types": "^1.0.10"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@iconify/library-builder": "^1.0.3",
|
||||
|
@ -14,20 +14,12 @@ describe('Testing convertIconSetInfo', () => {
|
||||
});
|
||||
expected = {
|
||||
name: 'Foo',
|
||||
version: '',
|
||||
total: 0,
|
||||
author: {
|
||||
name: 'Unknown',
|
||||
url: '',
|
||||
name: '',
|
||||
},
|
||||
license: {
|
||||
title: 'Unknown',
|
||||
spdx: '',
|
||||
url: '',
|
||||
title: '',
|
||||
},
|
||||
samples: [],
|
||||
palette: false,
|
||||
category: '',
|
||||
};
|
||||
expect(result).toEqual(expected);
|
||||
|
||||
@ -67,8 +59,6 @@ describe('Testing convertIconSetInfo', () => {
|
||||
});
|
||||
expected = {
|
||||
name: 'Foo',
|
||||
version: '',
|
||||
total: 0,
|
||||
author: {
|
||||
name: 'Author',
|
||||
url: 'https://localhost/',
|
||||
@ -82,7 +72,6 @@ describe('Testing convertIconSetInfo', () => {
|
||||
samples: ['arrow-left', 'arrow-right', 'arrow-up'],
|
||||
displayHeight: 24,
|
||||
palette: true,
|
||||
category: '',
|
||||
};
|
||||
expect(result).toEqual(expected);
|
||||
|
||||
@ -106,21 +95,15 @@ describe('Testing convertIconSetInfo', () => {
|
||||
});
|
||||
expected = {
|
||||
name: 'Foo',
|
||||
version: '',
|
||||
total: 100,
|
||||
author: {
|
||||
name: 'Author',
|
||||
url: '',
|
||||
},
|
||||
license: {
|
||||
title: 'BSD',
|
||||
spdx: '',
|
||||
url: '',
|
||||
},
|
||||
height: [16, 18],
|
||||
samples: [],
|
||||
palette: true,
|
||||
category: '',
|
||||
};
|
||||
expect(result).toEqual(expected);
|
||||
|
||||
@ -182,7 +165,6 @@ describe('Testing convertIconSetInfo', () => {
|
||||
const result = convertIconSetInfo(raw);
|
||||
const expected = {
|
||||
name: 'Ant Design Icons',
|
||||
version: '',
|
||||
total: 728,
|
||||
author: {
|
||||
name: 'HeskeyBaozi',
|
||||
@ -190,8 +172,6 @@ describe('Testing convertIconSetInfo', () => {
|
||||
},
|
||||
license: {
|
||||
title: 'MIT',
|
||||
spdx: '',
|
||||
url: '',
|
||||
},
|
||||
height: 16,
|
||||
samples: ['pushpin', 'pie-chart-outline', 'user-add-outline'],
|
||||
@ -227,7 +207,6 @@ describe('Testing convertIconSetInfo', () => {
|
||||
},
|
||||
license: {
|
||||
title: 'Open Font License',
|
||||
spdx: '',
|
||||
url: 'http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL',
|
||||
},
|
||||
samples: ['wrench', 'bell-o', 'user-o'],
|
||||
@ -248,7 +227,6 @@ describe('Testing convertIconSetInfo', () => {
|
||||
},
|
||||
license: {
|
||||
title: 'Open Font License',
|
||||
spdx: '',
|
||||
url: 'http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL',
|
||||
},
|
||||
samples: ['wrench', 'bell-o', 'user-o'],
|
||||
|
@ -2,6 +2,7 @@ import type { IconifyInfo } from '@iconify/types';
|
||||
|
||||
const minDisplayHeight = 16;
|
||||
const maxDisplayHeight = 24;
|
||||
const maxSamplesCount = 3;
|
||||
|
||||
/**
|
||||
* Item provided by API or loaded from collections.json, slightly different from IconifyInfo
|
||||
@ -38,6 +39,24 @@ export interface LegacyIconifyInfo {
|
||||
palette?: 'Colorless' | 'Colorful';
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if displayHeight value is valid, returns 0 on failure
|
||||
*/
|
||||
function validateDisplayHeight(value: number): number {
|
||||
while (value < minDisplayHeight) {
|
||||
value *= 2;
|
||||
}
|
||||
while (value > maxDisplayHeight) {
|
||||
value /= 2;
|
||||
}
|
||||
|
||||
return value === Math.round(value) &&
|
||||
value >= minDisplayHeight &&
|
||||
value <= maxDisplayHeight
|
||||
? value
|
||||
: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert data to valid CollectionInfo
|
||||
*/
|
||||
@ -83,48 +102,75 @@ export function convertIconSetInfo(
|
||||
return null;
|
||||
}
|
||||
|
||||
// Generate data
|
||||
const result: IconifyInfo = {
|
||||
name: name,
|
||||
total: typeof source.total === 'number' ? source.total : 0,
|
||||
version: typeof source.version === 'string' ? source.version : '',
|
||||
author: {
|
||||
name: getSourceNestedString(
|
||||
'author',
|
||||
'name',
|
||||
typeof source.author === 'string' ? source.author : 'Unknown'
|
||||
),
|
||||
url: getSourceNestedString('author', 'url', ''),
|
||||
},
|
||||
license: {
|
||||
title: getSourceNestedString(
|
||||
'license',
|
||||
'title',
|
||||
typeof source.license === 'string' ? source.license : 'Unknown'
|
||||
),
|
||||
spdx: getSourceNestedString('license', 'spdx', ''),
|
||||
url: getSourceNestedString('license', 'url', ''),
|
||||
},
|
||||
samples: [],
|
||||
category: typeof source.category === 'string' ? source.category : '',
|
||||
palette: typeof source.palette === 'boolean' ? source.palette : false,
|
||||
};
|
||||
// Generate basic info
|
||||
const info = {
|
||||
name,
|
||||
} as IconifyInfo;
|
||||
|
||||
// Total as string
|
||||
if (typeof source.total === 'string') {
|
||||
const num = parseInt(source.total);
|
||||
if (num > 0) {
|
||||
result.total = num;
|
||||
// Number of icons
|
||||
switch (typeof source.total) {
|
||||
case 'number':
|
||||
info.total = source.total;
|
||||
break;
|
||||
|
||||
case 'string': {
|
||||
const num = parseInt(source.total);
|
||||
if (num > 0) {
|
||||
info.total = num;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Add samples
|
||||
// Version
|
||||
if (typeof source.version === 'string') {
|
||||
info.version = source.version;
|
||||
}
|
||||
|
||||
// Author
|
||||
info.author = {
|
||||
name: getSourceNestedString(
|
||||
'author',
|
||||
'name',
|
||||
typeof source.author === 'string' ? source.author : ''
|
||||
),
|
||||
};
|
||||
if (typeof source.author === 'object') {
|
||||
const sourceAuthor = source.author as Record<string, string>;
|
||||
if (typeof sourceAuthor.url === 'string') {
|
||||
info.author.url = sourceAuthor.url;
|
||||
}
|
||||
}
|
||||
|
||||
// License
|
||||
info.license = {
|
||||
title: getSourceNestedString(
|
||||
'license',
|
||||
'title',
|
||||
typeof source.license === 'string' ? source.license : ''
|
||||
),
|
||||
};
|
||||
if (typeof source.license === 'object') {
|
||||
const sourceLicense = source.license as Record<string, string>;
|
||||
if (typeof sourceLicense.spdx === 'string') {
|
||||
info.license.spdx = sourceLicense.spdx;
|
||||
}
|
||||
if (typeof sourceLicense.url === 'string') {
|
||||
info.license.url = sourceLicense.url;
|
||||
}
|
||||
}
|
||||
|
||||
// Samples
|
||||
if (source.samples instanceof Array) {
|
||||
const samples: string[] = [];
|
||||
source.samples.forEach((item) => {
|
||||
if (result.samples.length < 3 && typeof item === 'string') {
|
||||
result.samples.push(item);
|
||||
if (typeof item === 'string' && samples.length < maxSamplesCount) {
|
||||
samples.push(item);
|
||||
}
|
||||
});
|
||||
if (samples.length) {
|
||||
info.samples = samples;
|
||||
}
|
||||
}
|
||||
|
||||
// Add height
|
||||
@ -134,7 +180,7 @@ export function convertIconSetInfo(
|
||||
) {
|
||||
const num = parseInt(source.height as string);
|
||||
if (num > 0) {
|
||||
result.height = num;
|
||||
info.height = num;
|
||||
}
|
||||
}
|
||||
|
||||
@ -142,40 +188,29 @@ export function convertIconSetInfo(
|
||||
source.height.forEach((item) => {
|
||||
const num = parseInt(item);
|
||||
if (num > 0) {
|
||||
if (!(result.height instanceof Array)) {
|
||||
result.height = [];
|
||||
if (!(info.height instanceof Array)) {
|
||||
info.height = [];
|
||||
}
|
||||
result.height.push(num);
|
||||
info.height.push(num);
|
||||
}
|
||||
});
|
||||
|
||||
switch ((result.height as number[]).length) {
|
||||
switch ((info.height as number[]).length) {
|
||||
case 0:
|
||||
delete result.height;
|
||||
delete info.height;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
result.height = (result.height as number[])[0];
|
||||
info.height = (info.height as number[])[0];
|
||||
}
|
||||
}
|
||||
|
||||
// Add display height
|
||||
if (typeof result.height === 'number') {
|
||||
if (typeof info.height === 'number') {
|
||||
// Convert from height
|
||||
result.displayHeight = result.height;
|
||||
while (result.displayHeight < minDisplayHeight) {
|
||||
result.displayHeight *= 2;
|
||||
}
|
||||
while (result.displayHeight > maxDisplayHeight) {
|
||||
result.displayHeight /= 2;
|
||||
}
|
||||
|
||||
if (
|
||||
result.displayHeight !== Math.round(result.displayHeight) ||
|
||||
result.displayHeight < minDisplayHeight ||
|
||||
result.displayHeight > maxDisplayHeight
|
||||
) {
|
||||
delete result.displayHeight;
|
||||
const displayHeight = validateDisplayHeight(info.height);
|
||||
if (displayHeight) {
|
||||
info.displayHeight = displayHeight;
|
||||
}
|
||||
}
|
||||
|
||||
@ -183,32 +218,41 @@ export function convertIconSetInfo(
|
||||
const value = source[prop];
|
||||
if (typeof value === 'number' || typeof value === 'string') {
|
||||
// Convert from source.displayHeight or source.samplesHeight
|
||||
const num = parseInt(value as string);
|
||||
if (
|
||||
num >= minDisplayHeight &&
|
||||
num <= maxDisplayHeight &&
|
||||
Math.round(num) === num
|
||||
) {
|
||||
result.displayHeight = num;
|
||||
const displayHeight = validateDisplayHeight(
|
||||
parseInt(value as string)
|
||||
);
|
||||
if (displayHeight) {
|
||||
info.displayHeight = displayHeight;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Convert palette from string value
|
||||
if (typeof source.palette === 'string') {
|
||||
switch (source.palette.toLowerCase()) {
|
||||
case 'colorless': // Iconify v1
|
||||
case 'false': // Boolean as string
|
||||
result.palette = false;
|
||||
break;
|
||||
|
||||
case 'colorful': // Iconify v1
|
||||
case 'true': // Boolean as string
|
||||
result.palette = true;
|
||||
}
|
||||
// Category
|
||||
if (typeof source.category === 'string') {
|
||||
info.category = source.category;
|
||||
}
|
||||
|
||||
// Parse all old keys
|
||||
// Palette
|
||||
switch (typeof source.palette) {
|
||||
case 'boolean':
|
||||
info.palette = source.palette;
|
||||
break;
|
||||
|
||||
case 'string':
|
||||
switch (source.palette.toLowerCase()) {
|
||||
case 'colorless': // Iconify v1
|
||||
case 'false': // Boolean as string
|
||||
info.palette = false;
|
||||
break;
|
||||
|
||||
case 'colorful': // Iconify v1
|
||||
case 'true': // Boolean as string
|
||||
info.palette = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// Parse all old strings
|
||||
Object.keys(source).forEach((key) => {
|
||||
const value = source[key];
|
||||
if (typeof value !== 'string') {
|
||||
@ -217,20 +261,20 @@ export function convertIconSetInfo(
|
||||
switch (key) {
|
||||
case 'url':
|
||||
case 'uri':
|
||||
result.author.url = value;
|
||||
info.author.url = value;
|
||||
break;
|
||||
|
||||
case 'licenseURL':
|
||||
case 'licenseURI':
|
||||
result.license.url = value;
|
||||
info.license.url = value;
|
||||
break;
|
||||
|
||||
case 'licenseID':
|
||||
case 'licenseSPDX':
|
||||
result.license.spdx = value;
|
||||
info.license.spdx = value;
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
return result;
|
||||
return info;
|
||||
}
|
||||
|
@ -15,20 +15,12 @@ describe('Testing convertIconSetInfo', () => {
|
||||
});
|
||||
expected = {
|
||||
name: 'Foo',
|
||||
version: '',
|
||||
total: 0,
|
||||
author: {
|
||||
name: 'Unknown',
|
||||
url: '',
|
||||
name: '',
|
||||
},
|
||||
license: {
|
||||
title: 'Unknown',
|
||||
spdx: '',
|
||||
url: '',
|
||||
title: '',
|
||||
},
|
||||
samples: [],
|
||||
palette: false,
|
||||
category: '',
|
||||
};
|
||||
expect(result).toEqual(expected);
|
||||
|
||||
@ -68,8 +60,6 @@ describe('Testing convertIconSetInfo', () => {
|
||||
});
|
||||
expected = {
|
||||
name: 'Foo',
|
||||
version: '',
|
||||
total: 0,
|
||||
author: {
|
||||
name: 'Author',
|
||||
url: 'https://localhost/',
|
||||
@ -83,7 +73,6 @@ describe('Testing convertIconSetInfo', () => {
|
||||
samples: ['arrow-left', 'arrow-right', 'arrow-up'],
|
||||
displayHeight: 24,
|
||||
palette: true,
|
||||
category: '',
|
||||
};
|
||||
expect(result).toEqual(expected);
|
||||
|
||||
@ -107,21 +96,15 @@ describe('Testing convertIconSetInfo', () => {
|
||||
});
|
||||
expected = {
|
||||
name: 'Foo',
|
||||
version: '',
|
||||
total: 100,
|
||||
author: {
|
||||
name: 'Author',
|
||||
url: '',
|
||||
},
|
||||
license: {
|
||||
title: 'BSD',
|
||||
spdx: '',
|
||||
url: '',
|
||||
},
|
||||
height: [16, 18],
|
||||
samples: [],
|
||||
palette: true,
|
||||
category: '',
|
||||
};
|
||||
expect(result).toEqual(expected);
|
||||
|
||||
@ -183,7 +166,6 @@ describe('Testing convertIconSetInfo', () => {
|
||||
const result = convertIconSetInfo(raw);
|
||||
const expected: IconifyInfo = {
|
||||
name: 'Ant Design Icons',
|
||||
version: '',
|
||||
total: 728,
|
||||
author: {
|
||||
name: 'HeskeyBaozi',
|
||||
@ -191,8 +173,6 @@ describe('Testing convertIconSetInfo', () => {
|
||||
},
|
||||
license: {
|
||||
title: 'MIT',
|
||||
spdx: '',
|
||||
url: '',
|
||||
},
|
||||
height: 16,
|
||||
samples: ['pushpin', 'pie-chart-outline', 'user-add-outline'],
|
||||
@ -228,7 +208,6 @@ describe('Testing convertIconSetInfo', () => {
|
||||
},
|
||||
license: {
|
||||
title: 'Open Font License',
|
||||
spdx: '',
|
||||
url: 'http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL',
|
||||
},
|
||||
samples: ['wrench', 'bell-o', 'user-o'],
|
||||
|
Loading…
Reference in New Issue
Block a user