yeoman-test 8.0.0-beta.1 → 8.0.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ export function defaultEnvironment(): Promise<any>;
@@ -0,0 +1,4 @@
1
+ export const defaultEnvironment = async () => {
2
+ const dynamicEnv = await import('yeoman-environment');
3
+ return dynamicEnv.createEnv ?? dynamicEnv.default.createEnv;
4
+ };
package/dist/helpers.d.ts CHANGED
@@ -1,13 +1,12 @@
1
1
  import type { BaseEnvironmentOptions, BaseGenerator, BaseGeneratorOptions, GetGeneratorConstructor, GetGeneratorOptions, PromptAnswers } from '@yeoman/types';
2
2
  import type { SinonSpiedInstance } from 'sinon';
3
+ import type { DefaultEnvironmentApi, DefaultGeneratorApi } from '../types/type-helpers.js';
3
4
  import { type DummyPromptOptions } from './adapter.js';
4
5
  import RunContext, { BasicRunContext, type RunContextSettings } from './run-context.js';
5
- import type { DefaultEnvironmentApi, DefaultGeneratorApi } from './type-helpers.js';
6
6
  /**
7
7
  * Dependencies can be path (autodiscovery) or an array [<generator>, <name>]
8
8
  */
9
- export type Dependency = string | Parameters<DefaultEnvironmentApi['registerStub']>;
10
- export type GeneratorFactory<GenParameter extends BaseGenerator = DefaultGeneratorApi> = GetGeneratorConstructor<GenParameter> | ((...args: ConstructorParameters<GetGeneratorConstructor<GenParameter>>) => GenParameter);
9
+ export type Dependency = string | Parameters<DefaultEnvironmentApi['register']>;
11
10
  /**
12
11
  * Collection of unit test helpers. (mostly related to Mocha syntax)
13
12
  * @class YeomanTest
@@ -66,11 +65,11 @@ export declare class YeomanTest {
66
65
  /**
67
66
  * Create a mocked generator
68
67
  */
69
- createMockedGenerator(GeneratorClass: any): Promise<SinonSpiedInstance<DefaultGeneratorApi>>;
68
+ createMockedGenerator(GeneratorClass?: any): SinonSpiedInstance<DefaultGeneratorApi>;
70
69
  /**
71
70
  * Create a simple, dummy generator
72
71
  */
73
- createDummyGenerator<GenParameter extends BaseGenerator = DefaultGeneratorApi>(Generator?: GetGeneratorConstructor<GenParameter>, contents?: Record<string, (...args: any[]) => void>): Promise<new (...args: any[]) => GenParameter>;
72
+ createDummyGenerator<GenParameter extends BaseGenerator = DefaultGeneratorApi>(Generator?: GetGeneratorConstructor<GenParameter>, contents?: Record<string, (...args: any[]) => void>): new (...args: any[]) => GenParameter;
74
73
  /**
75
74
  * Create a generator, using the given dependencies and controller arguments
76
75
  * Dependecies can be path (autodiscovery) or an array [{generator}, {name}]
@@ -91,14 +90,6 @@ export declare class YeomanTest {
91
90
  * var angular = createGenerator('angular:app', deps);
92
91
  */
93
92
  createGenerator<GeneratorType extends BaseGenerator = DefaultGeneratorApi>(name: string, dependencies: Dependency[], args?: string[], options?: GetGeneratorOptions<GeneratorType>, localConfigOnly?: boolean): Promise<GeneratorType>;
94
- /**
95
- * @deprecated
96
- * Register a list of dependent generators into the provided env.
97
- * Dependecies can be path (autodiscovery) or an array [{generator}, {name}]
98
- *
99
- * @param dependencies - paths to the generators dependencies
100
- */
101
- registerDependencies(env: DefaultEnvironmentApi, dependencies: Dependency[]): void;
102
93
  /**
103
94
  * Shortcut to the Environment's createEnv.
104
95
  *
@@ -132,13 +123,13 @@ export declare class YeomanTest {
132
123
  * Run the provided Generator
133
124
  * @param GeneratorOrNamespace - Generator constructor or namespace
134
125
  */
135
- run<GeneratorType extends BaseGenerator = DefaultGeneratorApi>(GeneratorOrNamespace: string | GeneratorFactory<GeneratorType>, settings?: RunContextSettings, envOptions?: BaseEnvironmentOptions): RunContext<GeneratorType>;
126
+ run<GeneratorType extends BaseGenerator = DefaultGeneratorApi>(GeneratorOrNamespace: string | GetGeneratorConstructor<GeneratorType>, settings?: RunContextSettings, envOptions?: BaseEnvironmentOptions): RunContext<GeneratorType>;
136
127
  /**
137
128
  * Prepare a run context
138
129
  * @param {String|Function} GeneratorOrNamespace - Generator constructor or namespace
139
130
  * @return {RunContext}
140
131
  */
141
- create<GeneratorType extends BaseGenerator = DefaultGeneratorApi>(GeneratorOrNamespace: string | GeneratorFactory<GeneratorType>, settings?: RunContextSettings, envOptions?: BaseEnvironmentOptions): RunContext<GeneratorType>;
132
+ create<GeneratorType extends BaseGenerator = DefaultGeneratorApi>(GeneratorOrNamespace: string | GetGeneratorConstructor<GeneratorType>, settings?: RunContextSettings, envOptions?: BaseEnvironmentOptions): RunContext<GeneratorType>;
142
133
  /**
143
134
  * Prepare temporary dir without generator support.
144
135
  * Generator and environment will be undefined.
package/dist/helpers.js CHANGED
@@ -7,6 +7,13 @@ import { spy as sinonSpy, stub as sinonStub } from 'sinon';
7
7
  import { DummyPrompt, TestAdapter } from './adapter.js';
8
8
  import RunContext, { BasicRunContext } from './run-context.js';
9
9
  import testContext from './test-context.js';
10
+ import { defaultEnvironment } from './default-environment.js';
11
+ let GeneratorImplementation;
12
+ try {
13
+ const GeneratorImport = await import('yeoman-generator');
14
+ GeneratorImplementation = GeneratorImport.default ?? GeneratorImport;
15
+ }
16
+ catch { }
10
17
  const { cloneDeep } = _;
11
18
  /**
12
19
  * Collection of unit test helpers. (mostly related to Mocha syntax)
@@ -107,11 +114,7 @@ export class YeomanTest {
107
114
  /**
108
115
  * Create a mocked generator
109
116
  */
110
- async createMockedGenerator(GeneratorClass) {
111
- if (!GeneratorClass) {
112
- const GeneratorImplementation = await import('yeoman-generator');
113
- GeneratorClass = (GeneratorImplementation.default ?? GeneratorImplementation);
114
- }
117
+ createMockedGenerator(GeneratorClass = GeneratorImplementation) {
115
118
  class MockedGenerator extends GeneratorClass {
116
119
  }
117
120
  const generator = sinonSpy(MockedGenerator);
@@ -125,17 +128,12 @@ export class YeomanTest {
125
128
  /**
126
129
  * Create a simple, dummy generator
127
130
  */
128
- async createDummyGenerator(Generator, contents = {
131
+ createDummyGenerator(Generator = GeneratorImplementation, contents = {
129
132
  test() {
130
133
  this.shouldRun = true;
131
134
  },
132
135
  }) {
133
- if (!Generator) {
134
- const GeneratorImplementation = await import('yeoman-generator');
135
- Generator = (GeneratorImplementation.default ?? GeneratorImplementation);
136
- }
137
- const GeneratorConstructor = Generator;
138
- class DummyGenerator extends GeneratorConstructor {
136
+ class DummyGenerator extends Generator {
139
137
  constructor(...args) {
140
138
  const optIndex = Array.isArray(args[0]) ? 1 : 0;
141
139
  args[optIndex] = args[optIndex] ?? {};
@@ -174,30 +172,15 @@ export class YeomanTest {
174
172
  */
175
173
  async createGenerator(name, dependencies, args, options, localConfigOnly = true) {
176
174
  const env = await this.createEnv([], { sharedOptions: { localConfigOnly } });
177
- this.registerDependencies(env, dependencies);
178
- return env.create(name, args, options);
179
- }
180
- /**
181
- * @deprecated
182
- * Register a list of dependent generators into the provided env.
183
- * Dependecies can be path (autodiscovery) or an array [{generator}, {name}]
184
- *
185
- * @param dependencies - paths to the generators dependencies
186
- */
187
- registerDependencies(env, dependencies) {
188
175
  for (const dependency of dependencies) {
189
- if (Array.isArray(dependency)) {
190
- if (typeof dependency[0] === 'string') {
191
- env.register(...dependency);
192
- }
193
- else {
194
- env.registerStub(...dependency);
195
- }
176
+ if (typeof dependency === 'string') {
177
+ env.register(dependency);
196
178
  }
197
179
  else {
198
- env.register(dependency);
180
+ env.register(...dependency);
199
181
  }
200
182
  }
183
+ return env.create(name, args, options);
201
184
  }
202
185
  /**
203
186
  * Shortcut to the Environment's createEnv.
@@ -215,9 +198,7 @@ export class YeomanTest {
215
198
  * });
216
199
  */
217
200
  async createEnv(...args) {
218
- const dynamicEnv = await import('yeoman-environment');
219
- const createEnv = dynamicEnv.createEnv ?? dynamicEnv.default.createEnv;
220
- return createEnv(...args);
201
+ return (await defaultEnvironment())(...args);
221
202
  }
222
203
  /**
223
204
  * Creates a test environment.
@@ -1,13 +1,12 @@
1
1
  /// <reference types="node" resolution-mode="require"/>
2
2
  import { EventEmitter } from 'node:events';
3
3
  import { type Store } from 'mem-fs';
4
- import type { BaseEnvironmentOptions, BaseGenerator, GetGeneratorConstructor, GetGeneratorOptions, PromptAnswers } from '@yeoman/types';
5
- import { type LookupOptions } from 'yeoman-environment';
4
+ import type { BaseEnvironmentOptions, BaseGenerator, GetGeneratorConstructor, GetGeneratorOptions, PromptAnswers, LookupOptions } from '@yeoman/types';
6
5
  import { type MemFsEditorFile, type MemFsEditor } from 'mem-fs-editor';
6
+ import type { DefaultGeneratorApi, DefaultEnvironmentApi } from '../types/type-helpers.js';
7
7
  import RunResult, { type RunResultOptions } from './run-result.js';
8
- import { type Dependency, type YeomanTest, type GeneratorFactory } from './helpers.js';
8
+ import { type Dependency, type YeomanTest } from './helpers.js';
9
9
  import { type DummyPromptOptions } from './adapter.js';
10
- import type { DefaultGeneratorApi, DefaultEnvironmentApi } from './type-helpers.js';
11
10
  /**
12
11
  * Provides settings for creating a `RunContext`.
13
12
  */
@@ -33,7 +32,7 @@ export type RunContextSettings = {
33
32
  namespace?: string;
34
33
  };
35
34
  type PromiseRunResult<GeneratorType extends BaseGenerator> = Promise<RunResult<GeneratorType>>;
36
- type MockedGeneratorFactory<GenParameter extends BaseGenerator = DefaultGeneratorApi> = (GeneratorClass?: GetGeneratorConstructor<GenParameter>) => Promise<GenParameter>;
35
+ type MockedGeneratorFactory<GenParameter extends BaseGenerator = DefaultGeneratorApi> = (GeneratorClass?: GetGeneratorConstructor<GenParameter>) => GetGeneratorConstructor<GenParameter>;
37
36
  type EnvOptions = BaseEnvironmentOptions & {
38
37
  createEnv?: any;
39
38
  };
@@ -77,7 +76,7 @@ export declare class RunContextBase<GeneratorType extends BaseGenerator = Defaul
77
76
  * @param settings
78
77
  * @return {this}
79
78
  */
80
- constructor(generatorType?: string | GeneratorFactory<GeneratorType>, settings?: RunContextSettings, envOptions?: EnvOptions, helpers?: YeomanTest);
79
+ constructor(generatorType?: string | GetGeneratorConstructor<GeneratorType>, settings?: RunContextSettings, envOptions?: EnvOptions, helpers?: YeomanTest);
81
80
  /**
82
81
  * Run the generator on the environment and promises a RunResult instance.
83
82
  * @return {PromiseRunResult} Promise a RunResult instance.
@@ -296,16 +296,11 @@ export class RunContextBase extends EventEmitter {
296
296
  assert(Array.isArray(dependencies), 'dependencies should be an array');
297
297
  return this.onEnvironment(async (env) => {
298
298
  for (const dependency of dependencies) {
299
- if (Array.isArray(dependency)) {
300
- if (typeof dependency[0] === 'string') {
301
- env.register(...dependency);
302
- }
303
- else {
304
- env.registerStub(...dependency);
305
- }
299
+ if (typeof dependency === 'string') {
300
+ env.register(dependency);
306
301
  }
307
302
  else {
308
- env.register(dependency);
303
+ env.register(...dependency);
309
304
  }
310
305
  }
311
306
  });
@@ -332,13 +327,10 @@ export class RunContextBase extends EventEmitter {
332
327
  */
333
328
  withMockedGenerators(namespaces) {
334
329
  assert(Array.isArray(namespaces), 'namespaces should be an array');
335
- return this.onBeforePrepare(async () => {
336
- const MockedGenerator = await this.mockedGeneratorFactory();
337
- const dependencies = namespaces.map(namespace => [MockedGenerator, namespace]);
338
- const entries = dependencies.map(([generator, namespace]) => [namespace, generator]);
339
- Object.assign(this.mockedGenerators, Object.fromEntries(entries));
340
- this.withGenerators(dependencies);
341
- });
330
+ const mockedGenerators = Object.fromEntries(namespaces.map(namespace => [namespace, this.mockedGeneratorFactory()]));
331
+ const dependencies = Object.entries(mockedGenerators).map(([namespace, mock]) => [mock, { namespace }]);
332
+ Object.assign(this.mockedGenerators, mockedGenerators);
333
+ return this.withGenerators(dependencies);
342
334
  }
343
335
  /**
344
336
  * Mock the local configuration with the provided config
@@ -504,11 +496,11 @@ export class RunContextBase extends EventEmitter {
504
496
  const { namespace = typeof this.Generator === 'string' ? this.env.namespace(this.Generator) : 'gen:test' } = this.settings;
505
497
  if (typeof this.Generator === 'string' && namespace !== this.Generator) {
506
498
  // Generator is a file path, it should be registered.
507
- this.env.register(this.Generator, namespace);
499
+ this.env.register(this.Generator, { namespace });
508
500
  }
509
501
  else if (typeof this.Generator !== 'string') {
510
502
  const { resolved } = this.settings;
511
- this.env.registerStub(this.Generator, namespace, resolved);
503
+ this.env.register(this.Generator, { namespace, resolved });
512
504
  }
513
505
  this.generator = await this.env.create(namespace, this.args, {
514
506
  force: true,
@@ -1,9 +1,9 @@
1
1
  import type { Store } from 'mem-fs';
2
2
  import { type MemFsEditorFile, type MemFsEditor } from 'mem-fs-editor';
3
- import type { BaseEnvironmentOptions, BaseGenerator } from '@yeoman/types';
3
+ import type { BaseEnvironmentOptions, BaseGenerator, GetGeneratorConstructor } from '@yeoman/types';
4
+ import type { DefaultEnvironmentApi, DefaultGeneratorApi } from '../types/type-helpers.js';
4
5
  import { type RunContextSettings } from './run-context.js';
5
- import { type GeneratorFactory, type YeomanTest } from './helpers.js';
6
- import type { DefaultEnvironmentApi, DefaultGeneratorApi } from './type-helpers.js';
6
+ import { type YeomanTest } from './helpers.js';
7
7
  /**
8
8
  * Provides options for `RunResult`s.
9
9
  */
@@ -51,7 +51,7 @@ export default class RunResult<GeneratorType extends BaseGenerator = BaseGenerat
51
51
  * Create another RunContext reusing the settings.
52
52
  * See helpers.create api
53
53
  */
54
- create<GeneratorType extends BaseGenerator = DefaultGeneratorApi>(GeneratorOrNamespace: string | GeneratorFactory<GeneratorType>, settings?: RunContextSettings, envOptions?: BaseEnvironmentOptions): import("./run-context.js").default<GeneratorType>;
54
+ create<GeneratorType extends BaseGenerator = DefaultGeneratorApi>(GeneratorOrNamespace: string | GetGeneratorConstructor<GeneratorType>, settings?: RunContextSettings, envOptions?: BaseEnvironmentOptions): import("./run-context.js").default<GeneratorType>;
55
55
  /**
56
56
  * Return an object with fs changes.
57
57
  * @param {Function} filter - parameter forwarded to mem-fs-editor#dump
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "yeoman-test",
3
- "version": "8.0.0-beta.1",
3
+ "version": "8.0.0-beta.3",
4
4
  "description": "Test utilities for Yeoman generators",
5
5
  "keywords": [
6
6
  "yeoman",
@@ -17,7 +17,8 @@
17
17
  },
18
18
  "types": "./dist/index.d.ts",
19
19
  "files": [
20
- "dist"
20
+ "dist",
21
+ "types"
21
22
  ],
22
23
  "scripts": {
23
24
  "build": "tsc",
@@ -29,7 +30,7 @@
29
30
  "precommit": "lint-staged",
30
31
  "prepare": "npm run build",
31
32
  "pretest": "xo",
32
- "test": "c8 esmocha"
33
+ "test": "c8 esmocha --forbid-only"
33
34
  },
34
35
  "config": {
35
36
  "doc_path": "../yeoman-test-doc"
@@ -49,7 +50,7 @@
49
50
  "@types/sinon": "^10.0.13",
50
51
  "c8": "^7.13.0",
51
52
  "coveralls": "^3.1.1",
52
- "esmocha": "^0.1.4",
53
+ "esmocha": "^1.0.1",
53
54
  "husky": "^8.0.2",
54
55
  "jsdoc": "^3.6.10",
55
56
  "lint-staged": "^13.0.3",
@@ -58,13 +59,13 @@
58
59
  "tui-jsdoc-template": "^1.2.2",
59
60
  "typescript": "^5.0.4",
60
61
  "xo": "^0.54.2",
61
- "yeoman-environment": "^3.16.1",
62
- "yeoman-generator": "^6.0.0-beta.1"
62
+ "yeoman-environment": "^3.17.0",
63
+ "yeoman-generator": "^5.8.0"
63
64
  },
64
65
  "peerDependencies": {
65
- "@yeoman/types": "^0.3.0",
66
- "yeoman-environment": "^3.13.0 || ^4.0.0-alpha.0",
67
- "yeoman-generator": "^5.8.0 || ^6.0.0-beta.1"
66
+ "@yeoman/types": "^0.4.0",
67
+ "yeoman-environment": ">=3.17.0 < 5.0.0",
68
+ "yeoman-generator": ">=5.8.0 < 7.0.0"
68
69
  },
69
70
  "peerDependenciesMeta": {
70
71
  "yeoman-environment": {
@@ -0,0 +1,17 @@
1
+ import type { BaseGenerator, BaseEnvironment } from '@yeoman/types';
2
+ import type GeneratorImplementation from 'yeoman-generator';
3
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment, @typescript-eslint/prefer-ts-expect-error
4
+ // @ts-ignore
5
+ import type EnvironmentImplementation from 'yeoman-environment';
6
+ import type { IfAny } from 'type-fest';
7
+
8
+ export type DefaultGeneratorApi = IfAny<
9
+ typeof GeneratorImplementation,
10
+ BaseGenerator,
11
+ typeof GeneratorImplementation extends BaseGenerator ? typeof GeneratorImplementation : BaseGenerator
12
+ >;
13
+ export type DefaultEnvironmentApi = IfAny<
14
+ typeof EnvironmentImplementation,
15
+ BaseEnvironment,
16
+ typeof EnvironmentImplementation extends BaseEnvironment ? typeof EnvironmentImplementation : BaseEnvironment
17
+ >;
@@ -1,6 +0,0 @@
1
- import { type BaseGenerator, type BaseEnvironment } from '@yeoman/types';
2
- import type GeneratorImplementation from 'yeoman-generator';
3
- import type EnvironmentImplementation from 'yeoman-environment';
4
- import type { IfAny } from 'type-fest';
5
- export type DefaultGeneratorApi = IfAny<typeof GeneratorImplementation, BaseGenerator, typeof GeneratorImplementation extends BaseGenerator ? typeof GeneratorImplementation : BaseGenerator>;
6
- export type DefaultEnvironmentApi = IfAny<typeof EnvironmentImplementation, BaseEnvironment, typeof EnvironmentImplementation extends BaseEnvironment ? typeof EnvironmentImplementation : BaseEnvironment>;
@@ -1 +0,0 @@
1
- export {};