piral-cli
Version:
The standard CLI for creating and building a Piral instance or a Pilet.
249 lines (235 loc) • 5.18 kB
text/typescript
import { describe, it, expect, vitest } from 'vitest';
import { readImportmap } from './importmap';
vitest.mock('./npm', () => ({
tryResolvePackage(id, dir) {
if (id === 'qxz') {
return undefined;
} else if (id.endsWith('package.json')) {
return `${dir}/${id}`;
} else {
return `${dir}/${id}/index.js`;
}
},
}));
const mockPackages = {
'/data/foo': {
name: 'foo',
version: '1.2.3',
},
'/data/bar': {
name: 'bar',
version: '1.0.0',
},
'/data/app1': {
name: 'app1',
version: '1.0.0',
importmap: {
imports: {
'foo@1.2.3': 'foo',
},
},
},
'/data/app1/foo': {
name: 'foo',
version: '1.2.3',
},
'/data/app2': {
name: 'app1',
version: '1.0.0',
importmap: {
imports: {
'qxz@1.0.0': '',
},
},
},
};
vitest.mock('./io', () => ({
checkIsDirectory() {},
getHash() {},
readJson(dir) {
return mockPackages[dir];
},
findFile(dir, file) {
return `${dir}/${file}`;
},
checkExists() {
return true;
},
}));
describe('Importmap', () => {
it('reads empty one from package.json', async () => {
const deps = await readImportmap('/data', {
importmap: {},
});
expect(deps).toEqual([]);
});
it('reads fully qualified local dependency', async () => {
const deps = await readImportmap('/data', {
importmap: {
imports: {
'foo@1.2.3': 'foo',
},
},
});
expect(deps).toEqual([
{
alias: undefined,
entry: '/data/foo/index.js',
id: 'foo@1.2.3',
isAsync: false,
name: 'foo',
ref: 'foo.js',
requireId: 'foo@1.2.3',
type: 'local',
},
]);
});
it('reads fully qualified local dependency with implied exact version', async () => {
const deps = await readImportmap('/data', {
importmap: {
imports: {
foo: 'foo',
},
},
});
expect(deps).toEqual([
{
alias: undefined,
entry: '/data/foo/index.js',
id: 'foo@1.2.3',
isAsync: false,
name: 'foo',
ref: 'foo.js',
requireId: 'foo@1.2.3',
type: 'local',
},
]);
});
it('reads fully qualified local dependency with implied match major version', async () => {
const deps = await readImportmap(
'/data',
{
importmap: {
imports: {
foo: 'foo',
},
},
},
'match-major',
);
expect(deps).toEqual([
{
alias: undefined,
entry: '/data/foo/index.js',
id: 'foo@1.2.3',
isAsync: false,
name: 'foo',
ref: 'foo.js',
requireId: 'foo@^1.0.0',
type: 'local',
},
]);
});
it('reads fully qualified local dependency with implied match major patch', async () => {
const deps = await readImportmap(
'/data',
{
importmap: {
imports: {
foo: 'foo',
},
},
},
'any-patch',
);
expect(deps).toEqual([
{
alias: undefined,
entry: '/data/foo/index.js',
id: 'foo@1.2.3',
isAsync: false,
name: 'foo',
ref: 'foo.js',
requireId: 'foo@~1.2.0',
type: 'local',
},
]);
});
it('reads fully qualified local dependency with implied any match', async () => {
const deps = await readImportmap(
'/data',
{
importmap: {
imports: {
foo: 'foo',
},
},
},
'all',
);
expect(deps).toEqual([
{
alias: undefined,
entry: '/data/foo/index.js',
id: 'foo@1.2.3',
isAsync: false,
name: 'foo',
ref: 'foo.js',
requireId: 'foo@*',
type: 'local',
},
]);
});
it('fails when the local version does not match the desired version', async () => {
await expect(
readImportmap('/data', {
importmap: {
imports: {
'bar@^2.0.0': '',
},
},
}),
).rejects.toThrow();
});
it('fails when the explicitly shared package is not installed', async () => {
await expect(
readImportmap('/data', {
importmap: {
imports: {
qxz: '',
},
},
}),
).rejects.toThrow();
});
it('accepts an importmap with valid resolvable inherited deps', async () => {
const deps = await readImportmap('/data', {
importmap: {
imports: {},
inherit: ['app1'],
},
});
expect(deps).toEqual([
{
alias: undefined,
entry: '/data/app1/foo/index.js',
id: 'foo@1.2.3',
isAsync: false,
name: 'foo',
ref: 'foo.js',
requireId: 'foo@1.2.3',
type: 'local',
parents: ['app1'],
},
]);
});
it('accepts an importmap with valid but unresolvable inherited deps', async () => {
const deps = await readImportmap('/data', {
importmap: {
imports: {},
inherit: ['app2'],
},
});
expect(deps).toEqual([]);
});
});