JHipster-RFC-5:agulhas modulares.

Summary

Este RFC propõe a implementação de agulhas modulares.

Motivation

A abordagem modular de JHipster 8 necessita de uma nova abordagem de agulha para uma melhor modularidade.

Guide-level explanation

O JHipster 7 tem muitas agulhas específicas de tecnologia implementadas na generator-base como:

  • addIcon
  • addElementToMenu
  • addExternalResourcesToRoot
  • addElementToAdminMenu
  • addEntityToMenu
  • addEntityToModule
  • addAdminToModule
  • addAngularModule
  • addEntityToEhcache
  • addChangelogToLiquibase
  • addMainSCSSStyle
  • addWebpackConfig
  • addMavenPluginRepository
  • Many others

Essas agulhas devem ser implementadas utilizando uma abordagem modular no gerador específico da tecnologia.

Reference-level explanation

As agulhas serão implementadas como uma função autónoma tendo o gerador como primeiro parâmetro.Por conveniência,será exposto no gerador específico de tecnologia como um método de membro de classe.

export function aNeedle(generator, needleData) {
  if (!needles) {
    needles = generator;
    generator = null;
  }

 return createBaseNeedle(
  return createBaseNeedle(
    {
      generator,
      filePath, // Caminho do arquivo para fins de registro
      needlesPrefix: 'needle-prefix',
    },
    needles
  );
}

export default class Generator {
  aNeedle(...args) {
    aNeedle(this, ...args);
  }
}

Utilização num gerador para crianças:

import Generator from './base-generator.mjs'

export default class ChildGenerator extends Generator {
  get [POST_WRITING_PRIORITY]() {
    writeNeedle() {
      this.aNeedle(data);
    }
  }
}

Utilização num gerador não relacionado:

import { aNeedle } from './base-generator.mjs'

export default class UnrelatedGenerator {
  get [POST_WRITING_PRIORITY]() {
    writeNeedle() {
      aNeedle(this, data);
    }
  }
}

Exemplo realístico aplicando múltiplas agulhas no mesmo ficheiro:

import { addProperty, addDependency, addDependencyToDevProfile } from 'generator-jhipster/generators/maven'

export default class UnrelatedGenerator {
  get [POST_WRITING_PRIORITY]() {
    writeNeedle() {
      this.editFile('pom.xml',
        addProperty(properties),
        addDependency(prodDependencies),
        addDependencyToDevProfile(devDependencies)
      )
    }
  }
}

Drawbacks

As agulhas da api não serão expostas a todos os geradores por defeito.Precisa de ser importada para ser utilizada.

Justificação e alternativas

Isto permitirá a criação de uma implementação modular.

Unresolved questions

Implementation

A agulha modular será implementada em JHipster 7 mantendo a estabilidade da api e expondo as agulhas na base do gerador.