2
0
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:
Vjacheslav Trushkin 2024-07-28 22:57:37 +03:00
parent 5ff09d6936
commit aba9a7b00e
3 changed files with 45 additions and 8 deletions

View File

@ -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,

View File

@ -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(

View File

@ -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();
});
}); });