UNPKG

@jspm/generator

Version:

Package Import Map Generation Tool

358 lines (356 loc) 10.4 kB
import { expandExportsEntries } from './package.js'; import assert from 'node:assert'; // Helper to convert Set to sorted array for assertion const setToArray = (set)=>Array.from(set).sort(); // Test: Simple string export { const entriesList = new Set(); expandExportsEntries('./src/index.js', [], undefined, entriesList); assert.deepEqual(setToArray(entriesList), [ 'src/index.js' ]); }// Test: Simple object export with files { const entriesList = new Set(); const files = new Set([ 'lib/main.js', 'lib/utils.js' ]); expandExportsEntries('./lib/main.js', [], files, entriesList); assert.deepEqual(setToArray(entriesList), [ 'lib/main.js' ]); }// Test: Array of exports (first match wins) { const entriesList = new Set(); const files = new Set([ 'lib/main.js', 'dist/main.js' ]); expandExportsEntries([ './lib/main.js', './dist/main.js' ], [], files, entriesList); assert.deepEqual(setToArray(entriesList), [ 'lib/main.js' ]); }// Test: Null export (valid resolution) { const entriesList = new Set(); expandExportsEntries(null, [], undefined, entriesList); assert.deepEqual(setToArray(entriesList), []); }// Test: Simple exports map { const entriesList = new Set(); expandExportsEntries({ '.': './main.js', './utils': './utils.js' }, [], undefined, entriesList); assert.deepEqual(setToArray(entriesList), [ 'main.js', 'utils.js' ]); }// Test: Condition resolution - default { const entriesList = new Set(); expandExportsEntries({ '.': { default: './main.js' } }, [], undefined, entriesList); assert.deepEqual(setToArray(entriesList), [ 'main.js' ]); }// Test: Condition resolution - environment match { const entriesList = new Set(); expandExportsEntries({ '.': { development: './dev.js', production: './prod.js', default: './main.js' } }, [ 'development' ], undefined, entriesList); assert.deepEqual(setToArray(entriesList), [ 'dev.js' ]); }// Test: Condition exclusion - development excludes production { const entriesList = new Set(); expandExportsEntries({ '.': { development: './dev.js', production: './prod.js' } }, [ 'development' ], undefined, entriesList); assert.deepEqual(setToArray(entriesList), [ 'dev.js' ]); }// Test: Condition exclusion - import excludes require { const entriesList = new Set(); expandExportsEntries({ '.': { import: './esm.js', require: './cjs.js' } }, [ 'import' ], undefined, entriesList); assert.deepEqual(setToArray(entriesList), [ 'esm.js' ]); }// Test: Condition exclusion edge case - ordering { const entriesList = new Set(); expandExportsEntries({ '.': { import: './esm.js', production: { import: './esm-prod.js', default: './prod.js' }, development: './dev.js' } }, [ 'import' ], undefined, entriesList); assert.deepEqual(setToArray(entriesList), [ 'esm.js' ]); }// Test: Condition exclusion - multiple exclusions { const entriesList = new Set(); expandExportsEntries({ '.': { import: { development: './dev-esm.js' }, require: { production: './prod-cjs.js' } } }, [ 'import' ], undefined, entriesList); assert.deepEqual(setToArray(entriesList), [ 'dev-esm.js' ]); }// Test: Wildcard patterns without filesystem { const entriesList = new Set(); expandExportsEntries({ './features/*': './src/features/*/index.js' }, [], undefined, entriesList); assert.deepEqual(setToArray(entriesList), []); }// Test: Wildcard patterns with filesystem { const entriesList = new Set(); const files = new Set([ 'src/features/auth/index.js', 'src/features/admin/index.js', 'src/features/user/index.js' ]); expandExportsEntries({ './features/*': './src/features/*/index.js' }, [], files, entriesList); assert.deepEqual(setToArray(entriesList), [ 'src/features/admin/index.js', 'src/features/auth/index.js', 'src/features/user/index.js' ]); }// Test: Wildcard pattern with prefix and suffix { const entriesList = new Set(); const files = new Set([ 'dist/client/app.js', 'dist/client/worker.js', 'dist/server/app.js' ]); expandExportsEntries({ './client/*': './dist/client/*.js' }, [], files, entriesList); assert.deepEqual(setToArray(entriesList), [ 'dist/client/app.js', 'dist/client/worker.js' ]); }// Test: Path shadowing - exact path shadows wildcard { const entriesList = new Set(); const files = new Set([ 'lib/utils.js', 'lib/special/utils.js', 'lib/special/parser.js' ]); expandExportsEntries({ './utils': './lib/utils.js', './special/*': './lib/special/*.js' }, [], files, entriesList); assert.deepEqual(setToArray(entriesList), [ 'lib/special/parser.js', 'lib/special/utils.js', 'lib/utils.js' ]); }// Test: Path shadowing - nested wildcards { const entriesList = new Set(); const files = new Set([ 'lib/utils.js', 'lib/features/auth/index.js', 'lib/features/auth/utils.js', 'lib/features/user/index.js' ]); expandExportsEntries({ './utils': './lib/utils.js', './features/*': './lib/features/*', './features/auth/*': './lib/features/auth/u*.js' }, [], files, entriesList); assert.deepEqual(setToArray(entriesList), [ 'lib/features/auth/utils.js', 'lib/features/user/index.js', 'lib/utils.js' ]); }// Test: Complex nested conditions with wildcards { const entriesList = new Set(); const files = new Set([ 'src/client/dev/index.js', 'src/client/prod/index.js', 'src/server/dev/index.js', 'src/server/prod/index.js' ]); expandExportsEntries({ './*/client': { development: './src/client/dev/*.js', production: './src/client/prod/*.js' }, './*/server': { development: './src/server/dev/*.js', production: './src/server/prod/*.js' } }, [ 'development' ], files, entriesList); assert.deepEqual(setToArray(entriesList), [ 'src/client/dev/index.js', 'src/server/dev/index.js' ]); }// Test: Edge case - empty exports { const entriesList = new Set(); expandExportsEntries({}, [], undefined, entriesList); assert.deepEqual(setToArray(entriesList), []); }// Test: Edge case - non-dot keys (should treat as simple target) { const entriesList = new Set(); expandExportsEntries({ main: './index.js' }, [], undefined, entriesList); assert.deepEqual(setToArray(entriesList), [ 'index.js' ]); }// Test: Edge case - mixed dot and non-dot keys (invalid exports) { const entriesList = new Set(); expandExportsEntries({ '.': './main.js', utils: './utils.js' }, [], undefined, entriesList); assert.deepEqual(setToArray(entriesList), [ 'utils.js' ]); }// Test: File filtering - only add files that exist { const entriesList = new Set(); const files = new Set([ 'src/index.js' ]); expandExportsEntries({ '.': './src/index.js', './utils': './src/utils.js' }, [], files, entriesList); assert.deepEqual(setToArray(entriesList), [ 'src/index.js' ]); }// Test: Recursive conditions { const entriesList = new Set(); expandExportsEntries({ '.': { development: { import: './dev-esm.js', require: './dev-cjs.js' }, production: { import: './prod-esm.js', require: './prod-cjs.js' } } }, [ 'development', 'import' ], undefined, entriesList); assert.deepEqual(setToArray(entriesList), [ 'dev-esm.js' ]); }// Test: Wildcard edge case - pattern in middle of target { const entriesList = new Set(); const files = new Set([ 'dist/client-1.0.0.js', 'dist/client-2.0.0.js', 'dist/server-1.0.0.js' ]); // Note: The current implementation has a bug in the slicing logic for this case expandExportsEntries({ './client': './dist/client-*.js' }, [], files, entriesList); assert.deepEqual(setToArray(entriesList), []); // Expected bug! }// Test: Multiple wildcards in same pattern (not supported by spec) { const entriesList = new Set(); const files = new Set([ 'src/v1/auth/index.js' ]); expandExportsEntries({ './*/auth': './src/*/auth/*.js' }, [], files, entriesList); assert.deepEqual(setToArray(entriesList), []); // Only first wildcard is processed }// Test: Trailing slash behavior (deprecated, not supported properly) { const entriesList = new Set(); expandExportsEntries({ './utils/': './src/utils/' }, [], undefined, entriesList); assert.deepEqual(setToArray(entriesList), [ 'src/utils/' ]); }// Test: Complex path shadowing scenario { const entriesList = new Set(); const files = new Set([ 'lib/index.js', 'lib/features/auth.js', 'lib/features/utils.js', 'lib/utils/index.js', 'lib/utils/common.js' ]); expandExportsEntries({ '.': './lib/index.js', './features/*': './lib/features/*.js', './utils': './lib/utils/index.js', './utils/*': './lib/utils/*.js' }, [], files, entriesList); assert.deepEqual(setToArray(entriesList), [ 'lib/features/auth.js', 'lib/features/utils.js', 'lib/index.js', 'lib/utils/common.js', 'lib/utils/index.js' ]); }console.log('All tests passed! ✨'); //# sourceMappingURL=package.test.js.map