mirror of
https://github.com/iconify/iconify.git
synced 2024-11-17 01:55:09 +00:00
chore(tailwind): split loader in separate file
This commit is contained in:
parent
0c0cbc2485
commit
c052341bc2
@ -1,45 +1,11 @@
|
|||||||
import { readFileSync } from 'fs';
|
|
||||||
import type { IconifyJSON } from '@iconify/types';
|
|
||||||
import { getIconsCSSData } from '@iconify/utils/lib/css/icons';
|
import { getIconsCSSData } from '@iconify/utils/lib/css/icons';
|
||||||
import { matchIconName } from '@iconify/utils/lib/icon/name';
|
import { matchIconName } from '@iconify/utils/lib/icon/name';
|
||||||
import type { IconifyPluginFileOptions, IconifyPluginOptions } from './options';
|
import { loadIconSet } from './loader';
|
||||||
|
import type { IconifyPluginOptions } from './options';
|
||||||
|
|
||||||
const missingIconsListError =
|
const missingIconsListError =
|
||||||
'TailwindCSS cannot dynamically find all used icons. Need to pass list of used icons to Iconify plugin.';
|
'TailwindCSS cannot dynamically find all used icons. Need to pass list of used icons to Iconify plugin.';
|
||||||
|
|
||||||
/**
|
|
||||||
* Locate icon set
|
|
||||||
*/
|
|
||||||
function locateIconSet(
|
|
||||||
prefix: string,
|
|
||||||
options: IconifyPluginFileOptions
|
|
||||||
): string | undefined {
|
|
||||||
if (options.files?.[prefix]) {
|
|
||||||
return options.files?.[prefix];
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
return require.resolve(`@iconify-json/${prefix}/icons.json`);
|
|
||||||
} catch {}
|
|
||||||
try {
|
|
||||||
return require.resolve(`@iconify/json/json/${prefix}.json`);
|
|
||||||
} catch {}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Load icon set
|
|
||||||
*/
|
|
||||||
function loadIconSet(
|
|
||||||
prefix: string,
|
|
||||||
options: IconifyPluginFileOptions
|
|
||||||
): IconifyJSON | undefined {
|
|
||||||
const filename = locateIconSet(prefix, options);
|
|
||||||
if (filename) {
|
|
||||||
try {
|
|
||||||
return JSON.parse(readFileSync(filename, 'utf8'));
|
|
||||||
} catch {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get icon names from list
|
* Get icon names from list
|
||||||
*/
|
*/
|
||||||
|
82
plugins/tailwind/src/loader.ts
Normal file
82
plugins/tailwind/src/loader.ts
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
import { readFileSync } from 'fs';
|
||||||
|
import type { IconifyJSON } from '@iconify/types';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback for loading icon set
|
||||||
|
*/
|
||||||
|
type IconifyJSONLoaderCallback = () => IconifyJSON;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Options for icon set loaders
|
||||||
|
*/
|
||||||
|
export interface IconifyPluginLoaderOptions {
|
||||||
|
// Location of icon set files. Key is icon set prefix
|
||||||
|
files?: Record<string, string>;
|
||||||
|
|
||||||
|
// Custom icon sets
|
||||||
|
// Value can be loaded icon set or callback that loads icon set
|
||||||
|
iconSets?: Record<string, IconifyJSON | IconifyJSONLoaderCallback>;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Locate icon set
|
||||||
|
*/
|
||||||
|
export function locateIconSet(
|
||||||
|
prefix: string,
|
||||||
|
options: IconifyPluginLoaderOptions
|
||||||
|
): string | undefined {
|
||||||
|
if (options.files?.[prefix]) {
|
||||||
|
return options.files?.[prefix];
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return require.resolve(`@iconify-json/${prefix}/icons.json`);
|
||||||
|
} catch {}
|
||||||
|
try {
|
||||||
|
return require.resolve(`@iconify/json/json/${prefix}.json`);
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cache for loaded icon sets
|
||||||
|
*
|
||||||
|
* Tailwind CSS can send multiple separate requests to plugin, this will
|
||||||
|
* prevent same data from being loaded multiple times.
|
||||||
|
*
|
||||||
|
* Key is filename, not prefix!
|
||||||
|
*/
|
||||||
|
const cache = Object.create(null) as Record<string, IconifyJSON>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load icon set
|
||||||
|
*/
|
||||||
|
export function loadIconSet(
|
||||||
|
prefix: string,
|
||||||
|
options: IconifyPluginLoaderOptions
|
||||||
|
): IconifyJSON | undefined {
|
||||||
|
// Check for custom icon set
|
||||||
|
const customIconSet = options.iconSets?.[prefix];
|
||||||
|
if (customIconSet) {
|
||||||
|
if (typeof customIconSet === 'function') {
|
||||||
|
// Callback. Store result in options to avoid loading it again
|
||||||
|
const result = customIconSet();
|
||||||
|
options.iconSets[prefix] = result;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return customIconSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
const filename = options.files?.[prefix] || locateIconSet(prefix, options);
|
||||||
|
if (filename) {
|
||||||
|
// Check for cache
|
||||||
|
if (cache[filename]) {
|
||||||
|
return cache[filename];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attempt to load it
|
||||||
|
try {
|
||||||
|
const result = JSON.parse(readFileSync(filename, 'utf8'));
|
||||||
|
cache[filename] = result;
|
||||||
|
return result;
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user