2
0
mirror of https://github.com/iconify/iconify.git synced 2025-02-14 17:36:29 +00:00

chore: move to unbuild

This commit is contained in:
Joaquín Sánchez Jiménez 2022-03-02 21:11:50 +01:00
parent 79e4530fab
commit e74f332fb9
13 changed files with 2243 additions and 98 deletions

View File

@ -7,4 +7,5 @@ npm-debug.log
yarn.lock
tsconfig.tsbuildinfo
lib
dual-lib
tests-compiled

View File

@ -0,0 +1,45 @@
import { defineBuildConfig } from 'unbuild'
export default defineBuildConfig({
outDir: './dual-lib',
entries: [
{ input: 'src/colors/types', name: 'colors/types' },
{ input: 'src/colors/keywords', name: 'colors/keywords' },
{ input: 'src/colors/index', name: 'colors/index' },
{ input: 'src/customisations/bool', name: 'customizations/bool' },
{ input: 'src/customisations/compare', name: 'customizations/compare' },
{ input: 'src/customisations/index', name: 'customizations/index' },
{ input: 'src/customisations/rotate', name: 'customizations/rotate' },
{ input: 'src/customisations/shorthand', name: 'customizations/shorthand' },
{ input: 'src/icon/index', name: 'icon/index' },
{ input: 'src/icon/merge', name: 'icon/merge' },
{ input: 'src/icon/name', name: 'icon/name' },
{ input: 'src/icon-set/convert-info', name: 'icon-set/convert-info' },
{ input: 'src/icon-set/expand', name: 'icon-set/expand' },
{ input: 'src/icon-set/get-icon', name: 'icon-set/get-icon' },
{ input: 'src/icon-set/get-icons', name: 'icon-set/get-icons' },
{ input: 'src/icon-set/minify', name: 'icon-set/minify' },
{ input: 'src/icon-set/parse', name: 'icon-set/parse' },
{ input: 'src/icon-set/validate', name: 'icon-set/validate' },
{ input: 'src/loader/custom', name: 'loader/custom' },
{ input: 'src/loader/fs', name: 'loader/fs' },
{ input: 'src/loader/install-pkg', name: 'loader/install-pkg' },
{ input: 'src/loader/loader', name: 'loader/loader' },
{ input: 'src/loader/loaders', name: 'loader/loaders' },
{ input: 'src/loader/modern', name: 'loader/modern' },
{ input: 'src/loader/types', name: 'loader/types' },
{ input: 'src/loader/utils', name: 'loader/utils' },
{ input: 'src/loader/warn', name: 'loader/warn' },
{ input: 'src/misc/strings', name: 'misc/strings' },
{ input: 'src/svg/build', name: 'svg/build' },
{ input: 'src/svg/encode-svg-for-css', name: 'svg/encode-svg-for-css' },
{ input: 'src/svg/id', name: 'svg/id' },
{ input: 'src/svg/size', name: 'svg/size' },
{ input: 'src/index', name: 'index' },
],
clean: true,
declaration: true,
rollup: {
emitCJS: true,
},
})

View File

@ -0,0 +1,8 @@
{
"extends": "./tsconfig-base.json",
"include": ["src/**/*.ts", ".eslintrc.js"],
"compilerOptions": {
"rootDir": "./src",
"outDir": "./lib"
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,6 @@
{
"name": "@iconify/utils",
"type": "module",
"description": "Common functions for working with Iconify icon sets used by various packages.",
"author": "Vjacheslav Trushkin",
"version": "1.0.23",
@ -16,155 +17,181 @@
"lint": "eslint src/**/*.ts",
"prebuild": "npm run lint && npm run clean",
"build": "node build",
"build-dual": "unbuild",
"test:jest": "jest --runInBand",
"test:jasmine": "cross-env NODE_OPTIONS=--experimental-vm-modules npx jasmine",
"test": "npm run test:jest && npm run test:jasmine"
},
"main": "./lib/index.js",
"module": "./lib/index.mjs",
"sideEffects": "false",
"exports": {
"./*": "./*",
".": {
"require": "./lib/index.js",
"require": "./lib/index.cjs",
"import": "./lib/index.mjs"
},
"./lib/colors": {
"require": "./lib/colors/index.js",
"require": "./lib/colors/index.cjs",
"import": "./lib/colors/index.mjs"
},
"./lib/colors/index": {
"require": "./lib/colors/index.js",
"require": "./lib/colors/index.cjs",
"import": "./lib/colors/index.mjs"
},
"./lib/colors/keywords": {
"require": "./lib/colors/keywords.js",
"require": "./lib/colors/keywords.cjs",
"import": "./lib/colors/keywords.mjs"
},
"./lib/colors/types": {
"require": "./lib/colors/types.js",
"require": "./lib/colors/types.cjs",
"import": "./lib/colors/types.mjs"
},
"./lib/customisations/bool": {
"require": "./lib/customisations/bool.js",
"require": "./lib/customisations/bool.cjs",
"import": "./lib/customisations/bool.mjs"
},
"./lib/customisations/compare": {
"require": "./lib/customisations/compare.js",
"require": "./lib/customisations/compare.cjs",
"import": "./lib/customisations/compare.mjs"
},
"./lib/customisations": {
"require": "./lib/customisations/index.js",
"require": "./lib/customisations/index.cjs",
"import": "./lib/customisations/index.mjs"
},
"./lib/customisations/index": {
"require": "./lib/customisations/index.js",
"require": "./lib/customisations/index.cjs",
"import": "./lib/customisations/index.mjs"
},
"./lib/customisations/rotate": {
"require": "./lib/customisations/rotate.js",
"require": "./lib/customisations/rotate.cjs",
"import": "./lib/customisations/rotate.mjs"
},
"./lib/customisations/shorthand": {
"require": "./lib/customisations/shorthand.js",
"require": "./lib/customisations/shorthand.cjs",
"import": "./lib/customisations/shorthand.mjs"
},
"./lib/icon-set/convert-info": {
"require": "./lib/icon-set/convert-info.js",
"require": "./lib/icon-set/convert-info.cjs",
"import": "./lib/icon-set/convert-info.mjs"
},
"./lib/icon-set/expand": {
"require": "./lib/icon-set/expand.js",
"require": "./lib/icon-set/expand.cjs",
"import": "./lib/icon-set/expand.mjs"
},
"./lib/icon-set/get-icon": {
"require": "./lib/icon-set/get-icon.js",
"require": "./lib/icon-set/get-icon.cjs",
"import": "./lib/icon-set/get-icon.mjs"
},
"./lib/icon-set/get-icons": {
"require": "./lib/icon-set/get-icons.js",
"require": "./lib/icon-set/get-icons.cjs",
"import": "./lib/icon-set/get-icons.mjs"
},
"./lib/icon-set/minify": {
"require": "./lib/icon-set/minify.js",
"require": "./lib/icon-set/minify.cjs",
"import": "./lib/icon-set/minify.mjs"
},
"./lib/icon-set/parse": {
"require": "./lib/icon-set/parse.js",
"require": "./lib/icon-set/parse.cjs",
"import": "./lib/icon-set/parse.mjs"
},
"./lib/icon-set/validate": {
"require": "./lib/icon-set/validate.js",
"require": "./lib/icon-set/validate.cjs",
"import": "./lib/icon-set/validate.mjs"
},
"./lib/icon": {
"require": "./lib/icon/index.js",
"require": "./lib/icon/index.cjs",
"import": "./lib/icon/index.mjs"
},
"./lib/icon/index": {
"require": "./lib/icon/index.js",
"require": "./lib/icon/index.cjs",
"import": "./lib/icon/index.mjs"
},
"./lib/icon/merge": {
"require": "./lib/icon/merge.js",
"require": "./lib/icon/merge.cjs",
"import": "./lib/icon/merge.mjs"
},
"./lib/icon/name": {
"require": "./lib/icon/name.js",
"require": "./lib/icon/name.cjs",
"import": "./lib/icon/name.mjs"
},
"./lib": {
"require": "./lib/index.js",
"require": "./lib/index.cjs",
"import": "./lib/index.mjs"
},
"./lib/index": {
"require": "./lib/index.js",
"require": "./lib/index.cjs",
"import": "./lib/index.mjs"
},
"./lib/loader/custom": {
"require": "./lib/loader/custom.js",
"require": "./lib/loader/custom.cjs",
"import": "./lib/loader/custom.mjs"
},
"./lib/loader/fs": {
"require": "./lib/loader/fs.cjs",
"import": "./lib/loader/fs.mjs",
"types": "./lib/loader/fs.d.ts"
},
"./lib/loader/install-pkg": {
"require": "./lib/loader/install-pkg.cjs",
"import": "./lib/loader/install-pkg.mjs",
"types": "./lib/loader/install-pkg.d.ts"
},
"./lib/loader/loader": {
"require": "./lib/loader/loader.js",
"require": "./lib/loader/loader.cjs",
"import": "./lib/loader/loader.mjs"
},
"./lib/loader/loaders": {
"require": "./lib/loader/loaders.cjs",
"import": "./lib/loader/loaders.mjs",
"types": "./lib/loader/loaders.d.ts"
},
"./lib/loader/modern": {
"require": "./lib/loader/modern.js",
"require": "./lib/loader/modern.cjs",
"import": "./lib/loader/modern.mjs"
},
"./lib/loader/types": {
"require": "./lib/loader/types.js",
"require": "./lib/loader/types.cjs",
"import": "./lib/loader/types.mjs"
},
"./lib/loader/utils": {
"require": "./lib/loader/utils.js",
"require": "./lib/loader/utils.cjs",
"import": "./lib/loader/utils.mjs"
},
},
"./lib/loader/warn": {
"require": "./lib/loader/warn.cjs",
"import": "./lib/loader/warn.mjs",
"types": "./lib/loader/warn.d.ts"
},
"./lib/misc/strings": {
"require": "./lib/misc/strings.js",
"require": "./lib/misc/strings.cjs",
"import": "./lib/misc/strings.mjs"
},
"./lib/svg/build": {
"require": "./lib/svg/build.js",
"require": "./lib/svg/build.cjs",
"import": "./lib/svg/build.mjs"
},
"./lib/svg/encode-svg-for-css": {
"require": "./lib/svg/encode-svg-for-css.js",
"require": "./lib/svg/encode-svg-for-css.cjs",
"import": "./lib/svg/encode-svg-for-css.mjs"
},
"./lib/svg/id": {
"require": "./lib/svg/id.js",
"require": "./lib/svg/id.cjs",
"import": "./lib/svg/id.mjs"
},
"./lib/svg/size": {
"require": "./lib/svg/size.js",
"require": "./lib/svg/size.cjs",
"import": "./lib/svg/size.mjs"
}
},
"dependencies": {
"@antfu/utils": "^0.3.0",
}
},
"main": "./lib/index.cjs",
"module": "./lib/index.mjs",
"types": "./lib/index.d.ts",
"dependencies": {
"@antfu/install-pkg": "^0.1.0",
"@antfu/utils": "^0.3.0",
"@iconify/types": "^1.0.12",
"debug": "^4.3.3"
"debug": "^4.3.3",
"kolorist": "^1.5.0",
"local-pkg": "^0.4.0"
},
"devDependencies": {
"@iconify-json/flat-color-icons": "^1.0.2",
@ -179,6 +206,7 @@
"jest": "^27.2.1",
"rimraf": "^3.0.2",
"ts-jest": "^27.0.5",
"typescript": "^4.4.3"
"typescript": "^4.4.3",
"unbuild": "^0.6.9"
}
}

View File

@ -57,7 +57,7 @@ export type {
export { mergeIconProps } from './loader/utils';
export { getCustomIcon } from './loader/custom';
export { searchForIcon } from './loader/modern';
export { loadIcon } from './loader/loader';
export { isNode, loadIcon } from './loader/loader';
// Misc
export { camelize, camelToKebab, pascalize } from './misc/strings';
export { camelize, camelToKebab, snakelize, pascalize } from './misc/strings';

View File

@ -0,0 +1,39 @@
import { promises as fs, Stats } from 'fs';
import { isPackageExists, resolveModule } from 'local-pkg'
import type { IconifyJSON } from '@iconify/types'
import { tryInstallPkg } from './install-pkg';
const _collections: Record<string, Promise<IconifyJSON | undefined>> = {};
const isLegacyExists = isPackageExists('@iconify/json');
export async function loadCollectionFromFS(name: string, autoInstall = false): Promise<IconifyJSON | undefined> {
if (!_collections[name]) {
_collections[name] = task();
}
return _collections[name];
async function task() {
let jsonPath = resolveModule(`@iconify-json/${name}/icons.json`);
if (!jsonPath && isLegacyExists) {
jsonPath = resolveModule(`@iconify/json/json/${name}.json`);
}
if (!jsonPath && !isLegacyExists && autoInstall) {
await tryInstallPkg(`@iconify-json/${name}`);
jsonPath = resolveModule(`@iconify-json/${name}/icons.json`);
}
let stat: Stats | undefined;
try {
stat = jsonPath ? await fs.lstat(jsonPath) : undefined;
} catch (err) {
return undefined;
}
if (stat && stat.isFile()) {
return JSON.parse(await fs.readFile(jsonPath as string, 'utf8')) as IconifyJSON;
}
else {
return undefined;
}
}
}

View File

@ -1,6 +1,4 @@
import { getCustomIcon } from './custom';
import { searchForIcon } from './modern';
import { warnOnce } from './warn';
import type { IconifyLoaderOptions } from './types';
import { searchForIcon } from './modern';
@ -50,7 +48,21 @@ async function importFsModule(): Promise<typeof import('./fs') | undefined> {
} catch {
try {
// cjs environments
return require('./fs.js');
return require('./fs.cjs');
}
catch {
return undefined;
}
}
}
async function importWarnModule(): Promise<typeof import('./warn') | undefined> {
try {
return await import('./warn');
} catch {
try {
// cjs environments
return require('./warn.cjs');
}
catch {
return undefined;
@ -80,7 +92,8 @@ async function loadNodeBuiltinIcon(
}
if (!result && options?.warn) {
warnOnce(`failed to load ${options.warn} icon`);
const warnOnce = await importWarnModule().then(i => i?.warnOnce);
warnOnce?.(`failed to load ${options.warn} icon`);
}
return result;

View File

@ -1,8 +1,7 @@
import type { Awaitable } from '@antfu/utils';
import { promises as fs, Stats } from 'fs';
import type { CustomIconLoader } from './types';
import { camelize, pascalize } from '../misc/strings';
import { isNode } from './loader';
import { camelize, pascalize, snakelize } from '../misc/strings';
/**
* Returns CustomIconLoader for loading icons from a directory
@ -11,26 +10,26 @@ export function FileSystemIconLoader(
dir: string,
transform?: (svg: string) => Awaitable<string>
): CustomIconLoader {
return isNode
? async (name) => {
const paths = [
`${dir}/${name}.svg`,
`${dir}/${camelize(name)}.svg`,
`${dir}/${pascalize(name)}.svg`,
];
let stat: Stats;
for (const path of paths) {
try {
stat = await fs.lstat(path);
} catch (err) {
continue;
}
if (stat.isFile()) {
const svg = await fs.readFile(path, 'utf-8');
return typeof transform === 'function'
? await transform(svg)
: svg;
}
return async (name) => {
const paths = [
`${dir}/${name}.svg`,
`${dir}/${camelize(name)}.svg`,
`${dir}/${pascalize(name)}.svg`,
`${dir}/${snakelize(name)}.svg`,
];
let stat: Stats;
for (const path of paths) {
try {
stat = await fs.lstat(path);
} catch (err) {
continue;
}
} : () => undefined;
if (stat.isFile()) {
const svg = await fs.readFile(path, 'utf-8');
return typeof transform === 'function'
? await transform(svg)
: svg;
}
}
};
}

View File

@ -76,6 +76,11 @@ export type CustomCollections = Record<
* Options to use with the modern loader.
*/
export type IconifyLoaderOptions = {
/**
* Emit warning when missing icons are matched
*/
warn?: string
/**
* Add svg and xlink xml namespace when necessary.
*

View File

@ -0,0 +1,10 @@
import { yellow } from 'kolorist';
const warned = new Set<string>();
export function warnOnce(msg: string): void {
if (!warned.has(msg)) {
warned.add(msg);
console.warn(yellow(`[@iconify-loader] ${msg}`));
}
}

View File

@ -23,3 +23,11 @@ export function camelToKebab(key: string): string {
.trim();
return result.split(/\s+/g).join('-').toLowerCase();
}
/**
* Convert string string to snake-case
*/
export function snakelize(str: string): string {
const kebab = camelToKebab(str)
return kebab.replace(/-/g, '_')
}

View File

@ -1,8 +1,18 @@
{
"extends": "./tsconfig-base.json",
"include": ["src/**/*.ts", ".eslintrc.js"],
"compilerOptions": {
"rootDir": "./src",
"outDir": "./lib"
}
"rootDir": "./",
"outDir": "./dual-lib",
"target": "ES2019",
"module": "ESNext",
"lib": [
"ESNext",
"DOM"
],
"strict": true,
"moduleResolution": "node",
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"importsNotUsedAsValues": "error"
},
"include": ["./src/**/*.ts"]
}