2
0
mirror of https://github.com/iconify/iconify.git synced 2024-10-23 17:12:03 +00:00
iconify/iconify-icon/icon/src/functions.ts

176 lines
4.3 KiB
TypeScript
Raw Normal View History

import type { IconifyJSON } from '@iconify/types';
// Core
import {
allowSimpleNames,
IconifyStorageFunctions,
} from '@iconify/core/lib/storage/functions';
import {
iconExists,
getIcon,
addIcon,
addCollection,
} from '@iconify/core/lib/storage/functions';
import { listIcons } from '@iconify/core/lib/storage/storage';
import type { IconifyBuilderFunctions } from '@iconify/core/lib/builder/functions';
import { iconToSVG as buildIcon } from '@iconify/utils/lib/svg/build';
import { calculateSize } from '@iconify/utils/lib/svg/size';
// API
import type {
IconifyAPIFunctions,
IconifyAPIInternalFunctions,
} from '@iconify/core/lib/api/functions';
import { setAPIModule } from '@iconify/core/lib/api/modules';
import type { PartialIconifyAPIConfig } from '@iconify/core/lib/api/config';
import {
addAPIProvider,
getAPIConfig,
listAPIProviders,
} from '@iconify/core/lib/api/config';
import {
fetchAPIModule,
setFetch,
getFetch,
} from '@iconify/core/lib/api/modules/fetch';
import { loadIcons, loadIcon } from '@iconify/core/lib/api/icons';
import { sendAPIQuery } from '@iconify/core/lib/api/query';
// Cache
import { initBrowserStorage } from '@iconify/core/lib/browser-storage';
import { toggleBrowserCache } from '@iconify/core/lib/browser-storage/functions';
import type {
IconifyBrowserCacheType,
IconifyBrowserCacheFunctions,
} from '@iconify/core/lib/browser-storage/functions';
import { appendCustomStyle } from './render/style';
/**
* Interface for exported functions
*/
export interface IconifyExportedFunctions
extends IconifyStorageFunctions,
IconifyBuilderFunctions,
IconifyBrowserCacheFunctions,
IconifyAPIFunctions {
// API internal functions
_api: IconifyAPIInternalFunctions;
// Append custom style to all components
appendCustomStyle: (value: string) => void;
}
/**
* Get functions and initialise stuff
*/
export function exportFunctions(): IconifyExportedFunctions {
/**
* Initialise stuff
*/
// Set API module
setAPIModule('', fetchAPIModule);
// Allow simple icon names
allowSimpleNames(true);
/**
* Browser stuff
*/
interface WindowWithIconifyStuff {
IconifyPreload?: IconifyJSON[] | IconifyJSON;
IconifyProviders?: Record<string, PartialIconifyAPIConfig>;
}
let _window: WindowWithIconifyStuff;
try {
_window = window as WindowWithIconifyStuff;
} catch (err) {
//
}
if (_window) {
// Set cache and load existing cache
initBrowserStorage();
// Load icons from global "IconifyPreload"
if (_window.IconifyPreload !== void 0) {
const preload = _window.IconifyPreload;
const err = 'Invalid IconifyPreload syntax.';
if (typeof preload === 'object' && preload !== null) {
(preload instanceof Array ? preload : [preload]).forEach(
(item) => {
try {
if (
// Check if item is an object and not null/array
typeof item !== 'object' ||
item === null ||
item instanceof Array ||
// Check for 'icons' and 'prefix'
typeof item.icons !== 'object' ||
typeof item.prefix !== 'string' ||
// Add icon set
!addCollection(item)
) {
console.error(err);
}
} catch (e) {
console.error(err);
}
}
);
}
}
// Set API from global "IconifyProviders"
if (_window.IconifyProviders !== void 0) {
const providers = _window.IconifyProviders;
if (typeof providers === 'object' && providers !== null) {
for (const key in providers) {
const err = 'IconifyProviders[' + key + '] is invalid.';
try {
const value = providers[key];
if (
typeof value !== 'object' ||
!value ||
value.resources === void 0
) {
continue;
}
if (!addAPIProvider(key, value)) {
console.error(err);
}
} catch (e) {
console.error(err);
}
}
}
}
}
const _api: IconifyAPIInternalFunctions = {
getAPIConfig,
setAPIModule,
sendAPIQuery,
setFetch,
getFetch,
listAPIProviders,
};
return {
enableCache: (storage: IconifyBrowserCacheType) =>
toggleBrowserCache(storage, true),
disableCache: (storage: IconifyBrowserCacheType) =>
toggleBrowserCache(storage, false),
iconExists,
getIcon,
listIcons,
addIcon,
addCollection,
calculateSize,
buildIcon,
loadIcons,
loadIcon,
addAPIProvider,
appendCustomStyle,
_api,
};
}