Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import path from 'path';
import fastGlob from 'fast-glob';
import { Plugin } from 'esbuild';

Expand All @@ -10,22 +11,25 @@ const EsbuildPluginImportGlob = (): Plugin => ({
}

return {
path: args.path,
// make sure that imports are properly scoped to directories that are requested from
// otherwise results get overwritten
path: path.resolve(args.resolveDir, args.path),
namespace: 'import-glob',
pluginData: {
path: args.path,
resolveDir: args.resolveDir,
},
};
});

build.onLoad({ filter: /.*/, namespace: 'import-glob' }, async (args) => {
const files = (
await fastGlob(args.path, {
await fastGlob(args.pluginData.path, {
cwd: args.pluginData.resolveDir,
})
).sort();

let importerCode = `
const importerCode = `
${files
.map((module, index) => `import * as module${index} from '${module}'`)
.join(';')}
Expand All @@ -36,7 +40,7 @@ const EsbuildPluginImportGlob = (): Plugin => ({

export default modules;
export const filenames = [${files
.map((module, index) => `'${module}'`)
.map((module) => `'${module}'`)
.join(',')}]
`;

Expand Down
38 changes: 38 additions & 0 deletions tests/__snapshots__/index.test.ts.snap
Original file line number Diff line number Diff line change
@@ -1,5 +1,43 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`test keeps proper scope of imports 1`] = `
Object {
"default": Object {
"default": Array [
Object {
"default": "a",
},
Object {
"default": "b",
},
],
"filenames": Array [
"./cases/a.js",
"./cases/b.js",
],
},
}
`;

exports[`test keeps proper scope of imports 2`] = `
Object {
"default": Object {
"default": Array [
Object {
"default": "c",
},
Object {
"default": "d",
},
],
"filenames": Array [
"./cases/c.js",
"./cases/d.js",
],
},
}
`;

exports[`test should 1`] = `
Object {
"default": Array [
Expand Down
1 change: 1 addition & 0 deletions tests/conflicts/conflictA/cases/a.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default 'a';
1 change: 1 addition & 0 deletions tests/conflicts/conflictA/cases/b.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default 'b';
2 changes: 2 additions & 0 deletions tests/conflicts/conflictA/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
// this is the same as in conflictB
export * as default from './cases/*.js';
1 change: 1 addition & 0 deletions tests/conflicts/conflictB/cases/c.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default 'c';
1 change: 1 addition & 0 deletions tests/conflicts/conflictB/cases/d.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default 'd';
2 changes: 2 additions & 0 deletions tests/conflicts/conflictB/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
// this is the same as in conflictA
export * as default from './cases/*.js';
5 changes: 5 additions & 0 deletions tests/conflicts/main.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// @ts-ignore
import * as conflictingSetA from './conflictA';
import * as conflictingSetB from './conflictB';

console.log(conflictingSetA, conflictingSetB);
34 changes: 24 additions & 10 deletions tests/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,29 @@ import path from 'path';

describe('test', () => {
it('should', async () => {
const logs = await runTestFile('service/main.ts');

const migrationModules = logs[0][0];
expect(migrationModules).toMatchSnapshot();

const entitiesModules = logs[1][0];
expect(entitiesModules).toMatchSnapshot();

const migration2Modules = logs[2][0];
expect(migrationModules.default).toEqual(migration2Modules);
});

it('keeps proper scope of imports', async () => {
const logs = await runTestFile('conflicts/main.ts');

const [setA, setB] = logs[0];
expect(setA).toMatchSnapshot();
expect(setB).toMatchSnapshot();
});

async function runTestFile(testFile) {
const result = await build({
entryPoints: [path.resolve(__dirname, 'service', 'main.ts')],
entryPoints: [path.resolve(__dirname, testFile)],
write: false,
plugins: [requireContext()],
outfile: `tests/bundle.js`,
Expand All @@ -16,13 +37,6 @@ describe('test', () => {

eval(`(console) => ${result.outputFiles[0].text}`)({ log: fakeLogger });

const migrationModules = fakeLogger.mock.calls[0][0];
expect(migrationModules).toMatchSnapshot();

const entitesModules = fakeLogger.mock.calls[1][0];
expect(entitesModules).toMatchSnapshot();

const migration2Modules = fakeLogger.mock.calls[2][0];
expect(migrationModules.default).toEqual(migration2Modules);
});
return fakeLogger.mock.calls;
}
});