Skip to content

Commit 8f6be15

Browse files
authored
internal: add types to base-core (#29513)
1 parent bd9f337 commit 8f6be15

File tree

23 files changed

+129
-77
lines changed

23 files changed

+129
-77
lines changed

.blueprint/generate-sample/generator.mts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1+
import assert from 'assert';
12
import { basename, extname, resolve } from 'path';
23
import { transform } from '@yeoman/transform';
4+
import type { Config } from '../../generators/base-core/types.js';
35
import BaseGenerator from '../../generators/base-core/index.js';
46
import { packageJson } from '../../lib/index.js';
57
import { promptSamplesFolder } from '../support.mjs';
68
import { GENERATOR_APP, GENERATOR_INFO, GENERATOR_JDL } from '../../generators/generator-list.js';
79
import { entitiesByType, generateSample } from './support/index.js';
8-
import assert from 'assert';
910

10-
export default class extends BaseGenerator {
11+
export default class extends BaseGenerator<Config & { entities: string[] }> {
1112
sampleName;
1213
global;
1314
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 & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,11 @@ const PRIORITY_WITH_APPLICATION: string[] = [
115115
* This is the base class for a generator that generates entities.
116116
*/
117117
export default class BaseApplicationGenerator<
118+
ConfigType = unknown,
118119
TaskTypes extends DefaultTaskTypes<any, any> = DefaultTaskTypes,
119-
> extends BaseGenerator<TaskTypes> {
120+
Options = unknown,
121+
Features = unknown,
122+
> extends BaseGenerator<ConfigType & ApplicationConfiguration, TaskTypes, Options, Features> {
120123
static CONFIGURING_EACH_ENTITY = asPriority(CONFIGURING_EACH_ENTITY);
121124

122125
static LOADING_ENTITIES = asPriority(LOADING_ENTITIES);
@@ -133,8 +136,6 @@ export default class BaseApplicationGenerator<
133136

134137
static POST_WRITING_ENTITIES = asPriority(POST_WRITING_ENTITIES);
135138

136-
declare jhipsterConfig: ApplicationConfiguration & Record<string, any>;
137-
138139
constructor(args: string | string[], options: JHipsterGeneratorOptions, features: JHipsterGeneratorFeatures) {
139140
super(args, options, features);
140141

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

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,45 +17,52 @@
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-
task: (this: G, params: TaskTypes<E, A>['PostPreparingEachEntityTaskParam']) => void,
35-
) {
34+
export function asPostPreparingEachEntityTask<
35+
E = Entity,
36+
A = ApplicationType<E>,
37+
const G extends BaseApplicationGenerator = BaseApplicationGenerator,
38+
>(task: (this: G, params: TaskTypes<E, A>['PostPreparingEachEntityTaskParam']) => void) {
3639
return task;
3740
}
3841

39-
export function asWritingTask<E = Entity, A = ApplicationType<E>, const G extends CoreGenerator = CoreGenerator>(
42+
export function asWritingTask<E = Entity, A = ApplicationType<E>, const G extends CoreGenerator = BaseApplicationGenerator>(
4043
task: (this: G, params: TaskTypes<E, A>['WritingTaskParam']) => void,
4144
) {
4245
return task;
4346
}
4447

45-
export function asWritingEntitiesTask<E = Entity, A = ApplicationType<E>, const G extends CoreGenerator = CoreGenerator>(
46-
task: (this: G, params: TaskTypes<E, A>['WritingEntitiesTaskParam']) => void,
47-
) {
48+
export function asWritingEntitiesTask<
49+
E = Entity,
50+
A = ApplicationType<E>,
51+
const G extends BaseApplicationGenerator = BaseApplicationGenerator,
52+
>(task: (this: G, params: TaskTypes<E, A>['WritingEntitiesTaskParam']) => void) {
4853
return task;
4954
}
5055

51-
export function asPostWritingTask<E = Entity, A = ApplicationType<E>, const G extends CoreGenerator = CoreGenerator>(
56+
export function asPostWritingTask<E = Entity, A = ApplicationType<E>, const G extends CoreGenerator = BaseApplicationGenerator>(
5257
task: (this: G, params: TaskTypes<E, A>['PostWritingTaskParam']) => void,
5358
) {
5459
return task;
5560
}
5661

57-
export function asPostWritingEntitiesTask<E = Entity, A = ApplicationType<E>, const G extends CoreGenerator = CoreGenerator>(
58-
task: (this: G, params: TaskTypes<E, A>['PostWritingEntitiesTaskParam']) => void,
59-
) {
62+
export function asPostWritingEntitiesTask<
63+
E = Entity,
64+
A = ApplicationType<E>,
65+
const G extends BaseApplicationGenerator = BaseApplicationGenerator,
66+
>(task: (this: G, params: TaskTypes<E, A>['PostWritingEntitiesTaskParam']) => void) {
6067
return task;
6168
}

generators/base-core/generator.ts

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ import { dockerPlaceholderGenerator } from '../docker/utils.js';
7676
import { getConfigWithDefaults } from '../../lib/jhipster/index.js';
7777
import { extractArgumentsFromConfigs } from '../../lib/command/index.js';
7878
import type BaseApplicationGenerator from '../base-application/generator.js';
79-
import type { ApplicationConfiguration } from '../../lib/types/application/yo-rc.js';
8079
import type { CleanupArgumentType, Control } from '../base/types.js';
80+
import type { Config } from '../base-core/types.js';
8181
import type { GenericTaskGroup } from '../../lib/types/base/tasks.js';
8282
import { convertWriteFileSectionsToBlocks } from './internal/index.js';
8383

@@ -113,7 +113,10 @@ const deepMerge = (source1: any, source2: any) => mergeWith({}, source1, source2
113113
/**
114114
* This is the base class for a generator for every generator.
115115
*/
116-
export default class CoreGenerator extends YeomanGenerator<JHipsterGeneratorOptions, JHipsterGeneratorFeatures> {
116+
export default class CoreGenerator<ConfigType extends Config = Config, Options = unknown, Features = unknown> extends YeomanGenerator<
117+
JHipsterGeneratorOptions & Options,
118+
JHipsterGeneratorFeatures & Features
119+
> {
117120
static asPriority = asPriority;
118121

119122
static INITIALIZING = asPriority(INITIALIZING);
@@ -154,7 +157,7 @@ export default class CoreGenerator extends YeomanGenerator<JHipsterGeneratorOpti
154157
relative = posixRelative;
155158

156159
readonly logger: Logger;
157-
jhipsterConfig!: Record<string, any>;
160+
jhipsterConfig!: ConfigType;
158161
/**
159162
* @deprecated
160163
*/
@@ -190,7 +193,7 @@ export default class CoreGenerator extends YeomanGenerator<JHipsterGeneratorOpti
190193
this._config = this._getStorage('generator-jhipster');
191194

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

195198
/* Options parsing must be executed after forcing jhipster storage namespace and after sharedData have been populated */
196199
this.parseJHipsterOptions(baseCommand.options);
@@ -341,7 +344,7 @@ export default class CoreGenerator extends YeomanGenerator<JHipsterGeneratorOpti
341344
/**
342345
* JHipster config with default values fallback
343346
*/
344-
get jhipsterConfigWithDefaults(): Readonly<ApplicationConfiguration & Record<string, any>> {
347+
get jhipsterConfigWithDefaults(): Readonly<ConfigType> {
345348
const configWithDefaults = getConfigWithDefaults(removeFieldsWithNullishValues(this.config.getAll()));
346349
defaults(configWithDefaults, {
347350
skipFakeData: false,
@@ -350,7 +353,7 @@ export default class CoreGenerator extends YeomanGenerator<JHipsterGeneratorOpti
350353
autoCrlf: false,
351354
pages: [],
352355
});
353-
return configWithDefaults as ApplicationConfiguration;
356+
return configWithDefaults as Readonly<ConfigType>;
354357
}
355358

356359
/**
@@ -768,11 +771,11 @@ You can ignore this error by passing '--skip-checks' to jhipster command.`);
768771
}
769772
} else {
770773
// Get and store lastLiquibaseTimestamp, a future timestamp can be used
771-
let lastLiquibaseTimestamp = this.jhipsterConfig.lastLiquibaseTimestamp;
774+
const lastLiquibaseTimestamp = this.jhipsterConfig.lastLiquibaseTimestamp;
772775
if (lastLiquibaseTimestamp) {
773-
lastLiquibaseTimestamp = new Date(lastLiquibaseTimestamp);
774-
if (lastLiquibaseTimestamp >= now) {
775-
now = lastLiquibaseTimestamp;
776+
const lastTimestampDate = new Date(lastLiquibaseTimestamp);
777+
if (lastTimestampDate >= now) {
778+
now = lastTimestampDate;
776779
now.setSeconds(now.getSeconds() + 1);
777780
now.setMilliseconds(0);
778781
}

generators/base-core/types.d.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
* Copyright 2013-2025 the original author or authors from the JHipster project.
3+
*
4+
* This file is part of the JHipster project, see https://www.jhipster.tech/
5+
* for more information.
6+
*
7+
* Licensed under the Apache License, Version 2.0 (the "License");
8+
* you may not use this file except in compliance with the License.
9+
* You may obtain a copy of the License at
10+
*
11+
* https://www.apache.org/licenses/LICENSE-2.0
12+
*
13+
* Unless required by applicable law or agreed to in writing, software
14+
* distributed under the License is distributed on an "AS IS" BASIS,
15+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16+
* See the License for the specific language governing permissions and
17+
* limitations under the License.
18+
*/
19+
export type Config = {
20+
jhipsterVersion?: string;
21+
autoCrlf?: boolean;
22+
lastLiquibaseTimestamp?: number;
23+
blueprints?: { name: string; version?: string }[];
24+
};

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
@@ -61,7 +61,17 @@ type WorkspacesTypes<E extends Entity = Entity, A extends ApplicationType<E> = A
6161
/**
6262
* This is the base class for a generator that generates entities.
6363
*/
64-
export default abstract class BaseWorkspacesGenerator extends BaseGenerator<WorkspacesTypes> {
64+
export default abstract class BaseWorkspacesGenerator<Config = unknown> extends BaseGenerator<
65+
Config & {
66+
appsFolders: string[];
67+
directoryPath: string;
68+
deploymentType: string;
69+
jwtSecretKey: string;
70+
adminPassword: string;
71+
serviceDiscoveryType: string;
72+
},
73+
WorkspacesTypes
74+
> {
6575
static PROMPTING_WORKSPACES = BaseGenerator.asPriority(PROMPTING_WORKSPACES);
6676

6777
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, Options, Features> {
3945
fromBlueprint!: boolean;
4046
sbsBlueprint?: boolean;
4147
delegateToBlueprint?: boolean;

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: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,20 @@
2121
*/
2222
import chalk from 'chalk';
2323

24-
import BaseApplicationGenerator from '../base-application/index.js';
24+
import BaseCoreGenerator from '../base-core/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';
32+
import type { Config } from '../base-core/types.js';
3233
import { replaceSensitiveConfig } from './support/utils.js';
3334

3435
const isInfoCommand = commandName => commandName === 'info' || undefined;
3536

36-
export default class InfoGenerator extends BaseApplicationGenerator {
37+
export default class InfoGenerator extends BaseCoreGenerator<Config & { appsFolders?: string[]; baseName?: string; packages?: string[] }> {
3738
constructor(args: string | string[], options: JHipsterGeneratorOptions, features: JHipsterGeneratorFeatures) {
3839
super(args, options, {
3940
jhipsterBootstrap: false,
@@ -44,8 +45,8 @@ export default class InfoGenerator extends BaseApplicationGenerator {
4445
});
4546
}
4647

47-
get [BaseApplicationGenerator.INITIALIZING]() {
48-
return this.asInitializingTaskGroup({
48+
get [BaseCoreGenerator.INITIALIZING]() {
49+
return this.asAnyTaskGroup({
4950
sayHello() {
5051
this.log.log(chalk.white('Welcome to the JHipster Information Sub-Generator\n'));
5152
},
@@ -143,16 +144,13 @@ export default class InfoGenerator extends BaseApplicationGenerator {
143144
let jdlObject;
144145
const entities = new Map<string, Entity>();
145146
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-
}
147+
const foundEntities = getEntitiesFromDir(this.destinationPath(JHIPSTER_CONFIG_DIR));
148+
for (const entity of foundEntities) {
149+
const entityJson = this.readDestinationJSON(this.destinationPath(JHIPSTER_CONFIG_DIR, `${entity}.json`));
150+
if (entityJson) {
151+
entities.set(entity, entityJson);
153152
}
154-
entities.set(name, entity);
155-
});
153+
}
156154
jdlObject = JSONToJDLEntityConverter.convertEntitiesToJDL(entities);
157155
JSONToJDLOptionConverter.convertServerOptionsToJDL({ 'generator-jhipster': this.config.getAll() }, jdlObject);
158156
} catch (error) {

0 commit comments

Comments
 (0)