Skip to content

Commit 41b78ea

Browse files
committed
feat: rework top level await to allow require()
1 parent cca62c2 commit 41b78ea

8 files changed

+35
-15
lines changed

eslint.config.js

+1
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ export default config(...configs, {
88
'unicorn/no-thenable': 'off',
99
'unicorn/prefer-event-target': 'off',
1010
'unicorn/no-object-as-default-parameter': 'off',
11+
'unicorn/prefer-top-level-await': 'off',
1112
},
1213
});

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
},
1818
".": {
1919
"types": "./dist/index.d.ts",
20+
"import": "./dist/import.js",
2021
"default": "./dist/index.js"
2122
}
2223
},

src/helpers.ts

+12-9
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { existsSync, mkdirSync, rmSync } from 'node:fs';
2+
import { createRequire } from 'node:module';
23
import { resolve } from 'node:path';
34
import process from 'node:process';
45
import { mock } from 'node:test';
@@ -18,13 +19,15 @@ import RunContext, { BasicRunContext, type RunContextSettings } from './run-cont
1819
import testContext from './test-context.js';
1920
import { createEnv as createEnvironment } from './default-environment.js';
2021

21-
let GeneratorImplementation;
22-
try {
23-
const GeneratorImport = await import('yeoman-generator');
24-
GeneratorImplementation = GeneratorImport.default ?? GeneratorImport;
25-
} catch {
26-
// Ignore error
27-
}
22+
let dummyParentClass;
23+
export const setDefaultDummyParentClass = parentClass => {
24+
dummyParentClass = parentClass;
25+
};
26+
27+
const getDummyParentClass = () => {
28+
dummyParentClass ??= createRequire(import.meta.url)('yeoman-generator').default;
29+
return dummyParentClass;
30+
};
2831

2932
export type CreateEnv = (options: BaseEnvironmentOptions) => Promise<BaseEnvironment>;
3033

@@ -145,7 +148,7 @@ export class YeomanTest {
145148
/**
146149
* Create a mocked generator
147150
*/
148-
createMockedGenerator(GeneratorClass = GeneratorImplementation): ReturnType<typeof mock.fn> {
151+
createMockedGenerator(GeneratorClass = getDummyParentClass()): ReturnType<typeof mock.fn> {
149152
class MockedGenerator extends GeneratorClass {}
150153
const generator = mock.fn(MockedGenerator);
151154
for (const methodName of ['run', 'queueTasks', 'runWithOptions', 'queueOwnTasks']) {
@@ -161,7 +164,7 @@ export class YeomanTest {
161164
* Create a simple, dummy generator
162165
*/
163166
createDummyGenerator<GenParameter extends BaseGenerator = DefaultGeneratorApi>(
164-
Generator: GetGeneratorConstructor<GenParameter> = GeneratorImplementation,
167+
Generator: GetGeneratorConstructor<GenParameter> = getDummyParentClass(),
165168
contents: Record<string, (...arguments_: any[]) => void> = {
166169
test(this: any) {
167170
this.shouldRun = true;

src/import.ts

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { setDefaultDummyParentClass } from './helpers.js';
2+
3+
let GeneratorImplementation;
4+
try {
5+
const GeneratorImport = await import('yeoman-generator');
6+
GeneratorImplementation = GeneratorImport.default ?? GeneratorImport;
7+
setDefaultDummyParentClass(GeneratorImplementation);
8+
} catch {
9+
// ignore
10+
}
11+
12+
export * from './index.js';
13+
export { default } from './index.js';

test/helpers.spec.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ import Generator from 'yeoman-generator';
1010
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
1111
import type Environment from 'yeoman-environment';
1212
import { createEnv as createEnvironment } from '../src/default-environment.js';
13-
import helpers from '../src/helpers.js';
13+
import helpers from '../src/import.js';
1414
import { TestAdapter } from '../src/adapter.js';
1515
import RunContext from '../src/run-context.js';
1616

17+
const [major, minor] = process.versions.node.split('.').map(Number);
18+
1719
/* Remove argument from promisify return */
1820
const promisify = function_ => () => promisify_(function_)();
1921
const require = createRequire(import.meta.url);
@@ -31,8 +33,8 @@ describe('yeoman-test', () => {
3133
StubGenerator = class extends Generator {};
3234
});
3335

34-
it('yeoman-test should allow to be required', () => {
35-
createRequire(import.meta.url)('../');
36+
it.skipIf(major < 20 || major === 21 || (major == 20 && minor < 12))('yeoman-test should allow to be required', () => {
37+
require('../');
3638
});
3739

3840
describe('.createGenerator()', () => {

test/run-context-environment.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { createRequire } from 'node:module';
66
import { mock } from 'node:test';
77
import { type LookupOptions } from '@yeoman/types';
88
import { afterAll, afterEach, beforeAll, beforeEach, describe, it } from 'vitest';
9-
import helpers from '../src/helpers.js';
9+
import helpers from '../src/import.js';
1010
import RunContext from '../src/run-context.js';
1111
import RunResult from '../src/run-result.js';
1212
import SimpleApp from './fixtures/generator-simple/app/index.js';

test/run-context.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { promisify as promisify_ } from 'node:util';
1010
import { afterEach, beforeAll, beforeEach, describe, expect, it } from 'vitest';
1111
import Generator from 'yeoman-generator';
1212
import { RunContextBase as RunContext } from '../src/run-context.js';
13-
import helpers from '../src/helpers.js';
13+
import helpers from '../src/import.js';
1414
import { BaseEnvironmentOptions } from '@yeoman/types';
1515

1616
const tempDirectory = realpathSync(os.tmpdir());

test/run-result.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { create as createMemFsEditor } from 'mem-fs-editor';
88
import { afterEach, beforeAll, beforeEach, describe, it } from 'vitest';
99
import RunContext from '../src/run-context.js';
1010
import RunResult from '../src/run-result.js';
11-
import helpers from '../src/helpers.js';
11+
import helpers from '../src/import.js';
1212
import testContext, { result } from '../src/test-context.js';
1313

1414
describe('run-result', () => {

0 commit comments

Comments
 (0)