rfcs/5-jhipster-rfc-modular-needles.md
This RFC proposes to implement modular needles.
JHipster 8 modular approach needs a new needle approach for a better modularity.
JHipster 7 has lots of technology specific needles implemented at generator-base like:
addIconaddElementToMenuaddExternalResourcesToRootaddElementToAdminMenuaddEntityToMenuaddEntityToModuleaddAdminToModuleaddAngularModuleaddEntityToEhcacheaddChangelogToLiquibaseaddMainSCSSStyleaddWebpackConfigaddMavenPluginRepositoryThose needles should be implemented using a modular approach at the technology-specific generator.
Needles will be implemented as a stand-alone function having the generator as first parameter. For convenience, it will be exposed at the technology-specific generator as a class member method.
export function aNeedle(generator, needleData) {
if (!needles) {
needles = generator;
generator = null;
}
return createBaseNeedle(
return createBaseNeedle(
{
generator,
filePath, // File path for logging purpose
needlesPrefix: 'needle-prefix',
},
needles
);
}
export default class Generator {
aNeedle(...args) {
aNeedle(this, ...args);
}
}
Using needles api inside a child generator:
import Generator from './base-generator.mjs'
export default class ChildGenerator extends Generator {
get [POST_WRITING_PRIORITY]() {
writeNeedle() {
this.aNeedle(data);
}
}
}
Using a non-related generator:
import { aNeedle } from './base-generator.mjs'
export default class UnrelatedGenerator {
get [POST_WRITING_PRIORITY]() {
writeNeedle() {
aNeedle(this, data);
}
}
}
Realistic example applying multiple needles in the same file:
import { addProperty, addDependency, addDependencyToDevProfile } from 'generator-jhipster/generators/java-simple-application/generators/maven'
export default class UnrelatedGenerator {
get [POST_WRITING_PRIORITY]() {
writeNeedle() {
this.editFile('pom.xml',
addProperty(properties),
addDependency(prodDependencies),
addDependencyToDevProfile(devDependencies)
)
}
}
}
Needles api will not be exposed to every generator by default. It needs to be imported to be used.
This will allow creating a modular implementation.
Modular needle will be implemented in JHipster 7 keeping api stability and exposing the needles at generator-base.