Skip to content

Commit fa59cc0

Browse files
committed
internal: add generics to base-core
1 parent be0f240 commit fa59cc0

File tree

25 files changed

+101
-72
lines changed

25 files changed

+101
-72
lines changed

.blueprint/generate-sample/generator.mts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { GENERATOR_APP, GENERATOR_INFO, GENERATOR_JDL } from '../../generators/g
77
import { entitiesByType, generateSample } from './support/index.js';
88
import assert from 'assert';
99

10-
export default class extends BaseGenerator {
10+
export default class extends BaseGenerator<{ entities: string[] }> {
1111
sampleName;
1212
global;
1313
projectFolder;

generators/angular/generator.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ import type { AngularApplication, AngularEntity } from './types.js';
4343

4444
const { ANGULAR } = clientFrameworkTypes;
4545

46-
export default class AngularGenerator extends BaseApplicationGenerator<DefaultTaskTypes<AngularEntity, AngularApplication>> {
46+
export default class AngularGenerator extends BaseApplicationGenerator<unknown, DefaultTaskTypes<AngularEntity, AngularApplication>> {
4747
async beforeQueue() {
4848
if (!this.fromBlueprint) {
4949
await this.composeWithBlueprints();

generators/angular/types.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ export interface AngularEntity extends Entity {
2626
* @param fields returns the import of enums that are referenced by the fields
2727
* @returns {typeImports:Map} the fields that potentially contains some enum types
2828
*/
29-
generateEntityClientEnumImports: (fields: any) => Map<any, any>;
29+
generateEntityClientEnumImports?: (fields: any) => Map<any, any>;
3030
}
3131

3232
export type AngularApplication = {
3333
/** @experimental to be replaced with needles */
34-
angularEntities: AngularEntity[];
34+
angularEntities?: AngularEntity[];
3535
} & ApplicationType<AngularEntity>;

generators/base-application/generator.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,11 @@ const asPriority = BaseGenerator.asPriority;
8686
* This is the base class for a generator that generates entities.
8787
*/
8888
export default class BaseApplicationGenerator<
89+
ConfigType = unknown,
8990
TaskTypes extends DefaultTaskTypes<any, any> = DefaultTaskTypes,
90-
> extends BaseGenerator<TaskTypes> {
91+
Options = unknown,
92+
Features = unknown,
93+
> extends BaseGenerator<ConfigType & ApplicationConfiguration, TaskTypes, Options, Features> {
9194
static CONFIGURING_EACH_ENTITY = asPriority(CONFIGURING_EACH_ENTITY);
9295

9396
static LOADING_ENTITIES = asPriority(LOADING_ENTITIES);
@@ -104,7 +107,6 @@ export default class BaseApplicationGenerator<
104107

105108
static POST_WRITING_ENTITIES = asPriority(POST_WRITING_ENTITIES);
106109

107-
declare jhipsterConfig: ApplicationConfiguration & Record<string, any>;
108110
declare sharedData: SharedData;
109111

110112
constructor(args: string | string[], options: JHipsterGeneratorOptions, features: JHipsterGeneratorFeatures) {

generators/base-application/support/task-type-inference.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,44 +17,45 @@
1717
import type { ApplicationType } from '../../../lib/types/application/application.js';
1818
import type { TaskTypes } from '../../../lib/types/application/tasks.js';
1919
import type CoreGenerator from '../../base-core/generator.js';
20+
import type BaseApplicationGenerator from '../../base-application/generator.js';
2021
import type { WriteFileSection } from '../../base/api.js';
2122
import type { Entity } from '../../../lib/types/application/entity.js';
2223

2324
export function asWriteFilesSection<Data = ApplicationType<Entity>>(section: WriteFileSection<Data>) {
2425
return section;
2526
}
2627

27-
export function asPromptingTask<E = Entity, A = ApplicationType<E>, const G extends CoreGenerator = CoreGenerator>(
28+
export function asPromptingTask<E = Entity, A = ApplicationType<E>, const G extends CoreGenerator = BaseApplicationGenerator>(
2829
task: (this: G, params: TaskTypes<E, A>['PromptingTaskParam']) => void,
2930
) {
3031
return task;
3132
}
3233

33-
export function asPostPreparingEachEntityTask<E = Entity, A = ApplicationType<E>, const G extends CoreGenerator = CoreGenerator>(
34+
export function asPostPreparingEachEntityTask<E = Entity, A = ApplicationType<E>, const G extends CoreGenerator = BaseApplicationGenerator>(
3435
task: (this: G, params: TaskTypes<E, A>['PostPreparingEachEntityTaskParam']) => void,
3536
) {
3637
return task;
3738
}
3839

39-
export function asWritingTask<E = Entity, A = ApplicationType<E>, const G extends CoreGenerator = CoreGenerator>(
40+
export function asWritingTask<E = Entity, A = ApplicationType<E>, const G extends CoreGenerator = BaseApplicationGenerator>(
4041
task: (this: G, params: TaskTypes<E, A>['WritingTaskParam']) => void,
4142
) {
4243
return task;
4344
}
4445

45-
export function asWritingEntitiesTask<E = Entity, A = ApplicationType<E>, const G extends CoreGenerator = CoreGenerator>(
46+
export function asWritingEntitiesTask<E = Entity, A = ApplicationType<E>, const G extends CoreGenerator = BaseApplicationGenerator>(
4647
task: (this: G, params: TaskTypes<E, A>['WritingEntitiesTaskParam']) => void,
4748
) {
4849
return task;
4950
}
5051

51-
export function asPostWritingTask<E = Entity, A = ApplicationType<E>, const G extends CoreGenerator = CoreGenerator>(
52+
export function asPostWritingTask<E = Entity, A = ApplicationType<E>, const G extends CoreGenerator = BaseApplicationGenerator>(
5253
task: (this: G, params: TaskTypes<E, A>['PostWritingTaskParam']) => void,
5354
) {
5455
return task;
5556
}
5657

57-
export function asPostWritingEntitiesTask<E = Entity, A = ApplicationType<E>, const G extends CoreGenerator = CoreGenerator>(
58+
export function asPostWritingEntitiesTask<E = Entity, A = ApplicationType<E>, const G extends CoreGenerator = BaseApplicationGenerator>(
5859
task: (this: G, params: TaskTypes<E, A>['PostWritingEntitiesTaskParam']) => void,
5960
) {
6061
return task;

generators/base-core/generator.ts

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,7 @@ import { dockerPlaceholderGenerator } from '../docker/utils.js';
7575
import { getConfigWithDefaults } from '../../lib/jhipster/index.js';
7676
import { extractArgumentsFromConfigs } from '../../lib/command/index.js';
7777
import type BaseApplicationGenerator from '../base-application/generator.js';
78-
import type { ApplicationConfiguration } from '../../lib/types/application/yo-rc.js';
79-
import type { Control } from '../base/types.js';
78+
import type { Config, Control } from './types.js';
8079
import { convertWriteFileSectionsToBlocks } from './internal/index.js';
8180

8281
const {
@@ -111,7 +110,12 @@ const deepMerge = (source1: any, source2: any) => mergeWith({}, source1, source2
111110
/**
112111
* This is the base class for a generator for every generator.
113112
*/
114-
export default class CoreGenerator extends YeomanGenerator<JHipsterGeneratorOptions, JHipsterGeneratorFeatures> {
113+
export default class CoreGenerator<
114+
ConfigType extends Config = Config,
115+
ConfigDefaultsType extends Readonly<ConfigType> = Readonly<ConfigType>,
116+
Options = unknown,
117+
Features = unknown,
118+
> extends YeomanGenerator<JHipsterGeneratorOptions & Options, JHipsterGeneratorFeatures & Features> {
115119
static asPriority = asPriority;
116120

117121
static INITIALIZING = asPriority(INITIALIZING);
@@ -153,7 +157,7 @@ export default class CoreGenerator extends YeomanGenerator<JHipsterGeneratorOpti
153157

154158
readonly sharedData!: SharedData<any>;
155159
readonly logger: Logger;
156-
jhipsterConfig!: Record<string, any>;
160+
jhipsterConfig!: ConfigType;
157161
/**
158162
* @deprecated
159163
*/
@@ -189,9 +193,9 @@ export default class CoreGenerator extends YeomanGenerator<JHipsterGeneratorOpti
189193
this._config = this._getStorage('generator-jhipster');
190194

191195
/* JHipster config using proxy mode used as a plain object instead of using get/set. */
192-
this.jhipsterConfig = this.config.createProxy();
196+
this.jhipsterConfig = this.config.createProxy() as ConfigType;
193197

194-
this.sharedData = this.createSharedData() as any;
198+
this.sharedData = this.createSharedData();
195199

196200
/* Options parsing must be executed after forcing jhipster storage namespace and after sharedData have been populated */
197201
this.parseJHipsterOptions(baseCommand.options);
@@ -254,7 +258,7 @@ export default class CoreGenerator extends YeomanGenerator<JHipsterGeneratorOpti
254258
/**
255259
* JHipster config with default values fallback
256260
*/
257-
get jhipsterConfigWithDefaults(): Readonly<ApplicationConfiguration & Record<string, any>> {
261+
get jhipsterConfigWithDefaults(): ConfigDefaultsType {
258262
const configWithDefaults = getConfigWithDefaults(removeFieldsWithNullishValues(this.config.getAll()));
259263
defaults(configWithDefaults, {
260264
skipFakeData: false,
@@ -263,7 +267,7 @@ export default class CoreGenerator extends YeomanGenerator<JHipsterGeneratorOpti
263267
autoCrlf: false,
264268
pages: [],
265269
});
266-
return configWithDefaults as ApplicationConfiguration;
270+
return configWithDefaults as ConfigDefaultsType;
267271
}
268272

269273
/**
@@ -680,11 +684,11 @@ You can ignore this error by passing '--skip-checks' to jhipster command.`);
680684
}
681685
} else {
682686
// Get and store lastLiquibaseTimestamp, a future timestamp can be used
683-
let lastLiquibaseTimestamp = this.jhipsterConfig.lastLiquibaseTimestamp;
687+
const lastLiquibaseTimestamp = this.jhipsterConfig.lastLiquibaseTimestamp;
684688
if (lastLiquibaseTimestamp) {
685-
lastLiquibaseTimestamp = new Date(lastLiquibaseTimestamp);
686-
if (lastLiquibaseTimestamp >= now) {
687-
now = lastLiquibaseTimestamp;
689+
const lastTimeStampDate = new Date(lastLiquibaseTimestamp);
690+
if (lastTimeStampDate >= now) {
691+
now = lastTimeStampDate;
688692
now.setSeconds(now.getSeconds() + 1);
689693
now.setMilliseconds(0);
690694
}

generators/base/types.d.ts renamed to generators/base-core/types.d.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,10 @@ export type Control = {
1717
*/
1818
cleanupFiles: (cleanup: CleanupArgumentType) => Promise<void> | ((oldVersion: string, cleanup: CleanupArgumentType) => Promise<void>);
1919
};
20+
21+
export type Config = {
22+
jhipsterVersion?: string;
23+
autoCrlf?: boolean;
24+
lastLiquibaseTimestamp?: number;
25+
blueprints?: { name: string; version?: string }[];
26+
};

generators/base-entity-changes/generator.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ type TaskTypes = ApplicationTaskTypes & {
5353
/**
5454
* This is the base class for a generator for every generator.
5555
*/
56-
export default abstract class GeneratorBaseEntityChanges extends GeneratorBaseApplication<TaskTypes> {
56+
export default abstract class GeneratorBaseEntityChanges extends GeneratorBaseApplication<unknown, TaskTypes> {
5757
recreateInitialChangelog!: boolean;
5858
private entityChanges!: any[];
5959

generators/base-workspaces/generator.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,17 @@ type WorkspacesTypes<E extends Entity = Entity, A extends ApplicationType<E> = A
5959
/**
6060
* This is the base class for a generator that generates entities.
6161
*/
62-
export default abstract class BaseWorkspacesGenerator extends BaseGenerator<WorkspacesTypes> {
62+
export default abstract class BaseWorkspacesGenerator<Config = unknown> extends BaseGenerator<
63+
Config & {
64+
appsFolders: string[];
65+
directoryPath: string;
66+
deploymentType: string;
67+
jwtSecretKey: string;
68+
adminPassword: string;
69+
serviceDiscoveryType: string;
70+
},
71+
WorkspacesTypes
72+
> {
6373
static PROMPTING_WORKSPACES = BaseGenerator.asPriority(PROMPTING_WORKSPACES);
6474

6575
static CONFIGURING_WORKSPACES = BaseGenerator.asPriority(CONFIGURING_WORKSPACES);

generators/base-workspaces/internal/deployments.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@
1919
import { defaults } from 'lodash-es';
2020
import { applicationOptions, deploymentOptions } from '../../../lib/jhipster/index.js';
2121
import { loadDerivedPlatformConfig, loadDerivedServerAndPlatformProperties, loadPlatformConfig } from '../../server/support/index.js';
22-
import type { GeneratorBaseCore } from '../../index.js';
22+
import type BaseWorkspacesGenerator from '../index.js';
2323

2424
const { OptionNames } = applicationOptions;
2525
const { Options: DeploymentOptions } = deploymentOptions;
2626

2727
const { JWT_SECRET_KEY } = OptionNames;
2828

2929
export function loadDeploymentConfig(
30-
this: GeneratorBaseCore,
30+
this: BaseWorkspacesGenerator,
3131
{
3232
config = defaults({}, this.jhipsterConfig, DeploymentOptions.defaults(this.jhipsterConfig.deploymentType)),
3333
deployment = this,

generators/base/generator.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import { union } from 'lodash-es';
2626
import { packageJson } from '../../lib/index.js';
2727
import CoreGenerator from '../base-core/index.js';
2828
import type { TaskTypes as BaseTaskTypes, GenericTaskGroup } from '../../lib/types/base/tasks.js';
29+
import type { Config } from '../base-core/types.js';
2930
import { packageNameToNamespace } from './support/index.js';
3031
import { loadBlueprintsFromConfiguration, mergeBlueprints, normalizeBlueprintName, parseBluePrints } from './internal/index.js';
3132
import { PRIORITY_NAMES } from './priorities.js';
@@ -35,7 +36,12 @@ import { LOCAL_BLUEPRINT_PACKAGE_NAMESPACE } from './support/constants.js';
3536
/**
3637
* Base class that contains blueprints support.
3738
*/
38-
export default class JHipsterBaseBlueprintGenerator<TaskTypes extends BaseTaskTypes = BaseTaskTypes> extends CoreGenerator {
39+
export default class JHipsterBaseBlueprintGenerator<
40+
ConfigType = unknown,
41+
TaskTypes extends BaseTaskTypes = BaseTaskTypes,
42+
Options = unknown,
43+
Features = unknown,
44+
> extends CoreGenerator<ConfigType & Config, Readonly<ConfigType & Config>, Options, Features> {
3945
fromBlueprint!: boolean;
4046
sbsBlueprint?: boolean;
4147
delegateToBlueprint?: boolean;

generators/base/shared-data.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import { GENERATOR_JHIPSTER } from '../generator-constants.js';
2929
import type { ApplicationType, BaseApplicationSource } from '../../lib/types/application/application.js';
3030
import type { Entity } from '../../lib/types/application/entity.js';
3131
import type { Entity as BaseEntity } from '../../lib/types/base/entity.js';
32-
import type { CleanupArgumentType, Control } from './types.js';
32+
import type { CleanupArgumentType, Control } from '../base-core/types.js';
3333

3434
export default class SharedData<EntityType extends BaseEntity = Entity, Application = ApplicationType> {
3535
_storage: any;

generators/bootstrap/generator.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ export default class BootstrapGenerator extends BaseGenerator {
212212
await createPrettierTransform.call(this, {
213213
ignoreErrors,
214214
prettierPackageJson: true,
215-
prettierJava: !this.jhipsterConfig.skipServer,
215+
prettierJava: !(this.jhipsterConfig as any).skipServer,
216216
extensions: this.prettierExtensions.join(','),
217217
prettierOptions: this.prettierOptions,
218218
skipForks: this.skipForks,

generators/client/generator.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ export default class JHipsterClientGenerator extends BaseApplicationGenerator {
8585
if (this.jhipsterConfig.devServerPort !== undefined || this.jhipsterConfig.applicationIndex === undefined) return;
8686

8787
const { applicationIndex, devServerPort } = this.jhipsterConfigWithDefaults;
88-
this.jhipsterConfig.devServerPort = devServerPort + applicationIndex;
88+
this.jhipsterConfig.devServerPort = devServerPort! + applicationIndex!;
8989
},
9090
});
9191
}

generators/git/generator.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,7 @@ import type { QueuedAdapter } from '@yeoman/types';
2323
import BaseGenerator from '../base/index.js';
2424
import { files } from './files.js';
2525

26-
/**
27-
* @class
28-
* @extends {BaseGenerator}
29-
*/
30-
export default class GitGenerator extends BaseGenerator {
26+
export default class GitGenerator extends BaseGenerator<{ baseName?: string; monorepository?: boolean }> {
3127
gitInitialized!: boolean;
3228
skipGit!: boolean;
3329
forceGit!: boolean;
@@ -68,7 +64,7 @@ export default class GitGenerator extends BaseGenerator {
6864
async preparing() {
6965
if (!this.skipGit) {
7066
// Force write .yo-rc.json to disk, it's used to check if the application is regenerated
71-
this.jhipsterConfig.skipGit = undefined;
67+
this.jhipsterConfig.monorepository ??= undefined;
7268
}
7369
},
7470
});

generators/info/generator.ts

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,19 @@
2121
*/
2222
import chalk from 'chalk';
2323

24-
import BaseApplicationGenerator from '../base-application/index.js';
24+
import BaseGenerator from '../base/index.js';
2525
import JSONToJDLEntityConverter from '../../lib/jdl/converters/json-to-jdl-entity-converter.js';
2626
import JSONToJDLOptionConverter from '../../lib/jdl/converters/json-to-jdl-option-converter.js';
2727
import type { JHipsterGeneratorFeatures, JHipsterGeneratorOptions } from '../base/api.js';
28-
import { YO_RC_FILE } from '../generator-constants.js';
28+
import { JHIPSTER_CONFIG_DIR, YO_RC_FILE } from '../generator-constants.js';
2929
import { applicationsLookup } from '../workspaces/support/applications-lookup.js';
3030
import type { Entity } from '../../lib/types/base/entity.js';
31-
import { convertFieldBlobType } from '../../lib/application/field-types.js';
31+
import { getEntitiesFromDir } from '../base-application/support/index.js';
3232
import { replaceSensitiveConfig } from './support/utils.js';
3333

3434
const isInfoCommand = commandName => commandName === 'info' || undefined;
3535

36-
export default class InfoGenerator extends BaseApplicationGenerator {
36+
export default class InfoGenerator extends BaseGenerator<{ appsFolders?: string[]; baseName?: string; packages?: string[] }> {
3737
constructor(args: string | string[], options: JHipsterGeneratorOptions, features: JHipsterGeneratorFeatures) {
3838
super(args, options, {
3939
jhipsterBootstrap: false,
@@ -44,7 +44,7 @@ export default class InfoGenerator extends BaseApplicationGenerator {
4444
});
4545
}
4646

47-
get [BaseApplicationGenerator.INITIALIZING]() {
47+
get [BaseGenerator.INITIALIZING]() {
4848
return this.asInitializingTaskGroup({
4949
sayHello() {
5050
this.log.log(chalk.white('Welcome to the JHipster Information Sub-Generator\n'));
@@ -143,16 +143,13 @@ export default class InfoGenerator extends BaseApplicationGenerator {
143143
let jdlObject;
144144
const entities = new Map<string, Entity>();
145145
try {
146-
this.getExistingEntities().forEach(({ name, definition: entity }) => {
147-
if (entity.fields) {
148-
for (const field of entity.fields) {
149-
if (field.fieldType === 'byte[]') {
150-
convertFieldBlobType(field);
151-
}
152-
}
146+
const foundEntities = getEntitiesFromDir(this.destinationPath(JHIPSTER_CONFIG_DIR));
147+
for (const entity of foundEntities) {
148+
const entityJson = this.readDestinationJSON(this.destinationPath(JHIPSTER_CONFIG_DIR, `${entity}.json`));
149+
if (entityJson) {
150+
entities.set(entity, entityJson);
153151
}
154-
entities.set(name, entity);
155-
});
152+
}
156153
jdlObject = JSONToJDLEntityConverter.convertEntitiesToJDL(entities);
157154
JSONToJDLOptionConverter.convertServerOptionsToJDL({ 'generator-jhipster': this.config.getAll() }, jdlObject);
158155
} catch (error) {

generators/javascript/generators/husky/command.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
*/
1919
import type { JHipsterCommandDefinition } from '../../../../lib/command/index.js';
2020

21-
const command: JHipsterCommandDefinition = {
21+
const command = {
2222
configs: {
2323
skipCommitHook: {
2424
description: 'Skip adding husky commit hooks',
@@ -29,6 +29,6 @@ const command: JHipsterCommandDefinition = {
2929
},
3030
},
3131
import: [],
32-
};
32+
} as const satisfies JHipsterCommandDefinition;
3333

3434
export default command;

generators/jdl/generator.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ const toJdlFile = file => {
4747

4848
type ApplicationWithEntitiesAndPath = ApplicationWithEntities & { folder?: string; sharedFs?: MemFs };
4949

50-
export default class JdlGenerator extends BaseGenerator {
50+
export default class JdlGenerator extends BaseGenerator<{ baseName: string; prodDatabaseType: string }> {
5151
jdlFiles?: string[];
5252
inline?: string;
5353
jdlContents: string[] = [];

0 commit comments

Comments
 (0)