mirror of
https://github.com/iconify/iconify.git
synced 2024-12-12 13:47:49 +00:00
chore(utils): treat each cwd differently in loader
This commit is contained in:
parent
5ff09d6936
commit
aba9a7b00e
@ -1,12 +1,17 @@
|
|||||||
import { promises as fs, Stats } from 'fs';
|
import { promises as fs, Stats } from 'fs';
|
||||||
import { isPackageExists, importModule } from 'local-pkg';
|
import { importModule } from 'local-pkg';
|
||||||
import type { IconifyJSON } from '@iconify/types';
|
import type { IconifyJSON } from '@iconify/types';
|
||||||
import { tryInstallPkg } from './install-pkg';
|
import { tryInstallPkg } from './install-pkg';
|
||||||
import type { AutoInstall } from './types';
|
import type { AutoInstall } from './types';
|
||||||
import { resolvePath } from 'mlly';
|
import { resolvePath } from 'mlly';
|
||||||
|
|
||||||
const _collections: Record<string, Promise<IconifyJSON | undefined>> = {};
|
// Cache: [cwd][name] => icon set promise
|
||||||
const isLegacyExists = isPackageExists('@iconify/json');
|
type CachedItem = Promise<IconifyJSON | undefined>;
|
||||||
|
type CachedItems = Record<string, CachedItem>;
|
||||||
|
const _collections = Object.create(null) as Record<string, CachedItems>;
|
||||||
|
|
||||||
|
// Check if full package exists, per cwd value
|
||||||
|
const isLegacyExists = Object.create(null) as Record<string, boolean>;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Asynchronously loads a collection from the file system.
|
* Asynchronously loads a collection from the file system.
|
||||||
@ -22,10 +27,14 @@ export async function loadCollectionFromFS(
|
|||||||
scope = '@iconify-json',
|
scope = '@iconify-json',
|
||||||
cwd = process.cwd()
|
cwd = process.cwd()
|
||||||
): Promise<IconifyJSON | undefined> {
|
): Promise<IconifyJSON | undefined> {
|
||||||
if (!(await _collections[name])) {
|
const cache =
|
||||||
_collections[name] = task();
|
_collections[cwd] ||
|
||||||
|
(_collections[cwd] = Object.create(null) as CachedItems);
|
||||||
|
|
||||||
|
if (!(await cache[name])) {
|
||||||
|
cache[name] = task();
|
||||||
}
|
}
|
||||||
return _collections[name];
|
return cache[name];
|
||||||
|
|
||||||
async function task() {
|
async function task() {
|
||||||
const packageName = scope.length === 0 ? name : `${scope}/${name}`;
|
const packageName = scope.length === 0 ? name : `${scope}/${name}`;
|
||||||
@ -35,7 +44,20 @@ export async function loadCollectionFromFS(
|
|||||||
|
|
||||||
// Legacy support for @iconify/json
|
// Legacy support for @iconify/json
|
||||||
if (scope === '@iconify-json') {
|
if (scope === '@iconify-json') {
|
||||||
if (!jsonPath && isLegacyExists) {
|
// Check legacy package exists
|
||||||
|
if (isLegacyExists[cwd] === undefined) {
|
||||||
|
const testResult = await resolvePath(
|
||||||
|
`@iconify/json/collections.json`,
|
||||||
|
{
|
||||||
|
url: cwd,
|
||||||
|
}
|
||||||
|
).catch(() => undefined);
|
||||||
|
isLegacyExists[cwd] = !!testResult;
|
||||||
|
}
|
||||||
|
const checkLegacy = isLegacyExists[cwd];
|
||||||
|
|
||||||
|
// Check legacy package
|
||||||
|
if (!jsonPath && checkLegacy) {
|
||||||
jsonPath = await resolvePath(
|
jsonPath = await resolvePath(
|
||||||
`@iconify/json/json/${name}.json`,
|
`@iconify/json/json/${name}.json`,
|
||||||
{
|
{
|
||||||
@ -45,7 +67,7 @@ export async function loadCollectionFromFS(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Try to install the package if it doesn't exist
|
// Try to install the package if it doesn't exist
|
||||||
if (!jsonPath && !isLegacyExists && autoInstall) {
|
if (!jsonPath && !checkLegacy && autoInstall) {
|
||||||
await tryInstallPkg(packageName, autoInstall);
|
await tryInstallPkg(packageName, autoInstall);
|
||||||
jsonPath = await resolvePath(`${packageName}/icons.json`, {
|
jsonPath = await resolvePath(`${packageName}/icons.json`, {
|
||||||
url: cwd,
|
url: cwd,
|
||||||
|
@ -10,6 +10,7 @@ describe('external-pkg', () => {
|
|||||||
});
|
});
|
||||||
expect(result).toBeTruthy();
|
expect(result).toBeTruthy();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('loadNodeIcon works with importModule and scoped package name', async () => {
|
test('loadNodeIcon works with importModule and scoped package name', async () => {
|
||||||
const result = await loadNodeIcon('test-color-icons', 'about', {
|
const result = await loadNodeIcon('test-color-icons', 'about', {
|
||||||
customCollections: createExternalPackageIconLoader(
|
customCollections: createExternalPackageIconLoader(
|
||||||
|
@ -122,4 +122,18 @@ describe('Testing loadIcon with @iconify-json/flat-color-icons>', () => {
|
|||||||
expect(result && result.includes('width="')).toBeFalsy();
|
expect(result && result.includes('width="')).toBeFalsy();
|
||||||
expect(result && result.includes('height="1em"')).toBeTruthy();
|
expect(result && result.includes('height="1em"')).toBeTruthy();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('loadIcon with bad cwd', async () => {
|
||||||
|
const result = await loadNodeIcon('flat-color-icons', 'up-left', {
|
||||||
|
cwd: './tests',
|
||||||
|
});
|
||||||
|
expect(result).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('loadIcon with multiple cwd', async () => {
|
||||||
|
const result = await loadNodeIcon('flat-color-icons', 'up-left', {
|
||||||
|
cwd: ['./tests', process.cwd()],
|
||||||
|
});
|
||||||
|
expect(result).toBeTruthy();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user