Эффективный и самый простой способ вставки контента на основе шаблона в сгенерированные файлы с помощью генератора Yeoman.

Предположим, у меня уже есть несколько файлов, сгенерированных генератором, и я хочу создать несколько подгенераторов, которые вставляют содержимое в эти файлы на основе некоторого шаблона содержимого.

Цель состоит в том, чтобы создать генератор многоуровневой архитектуры, состоящей из 3 слоев (для приложения Angular2, написанного на машинописном языке):

  • прикладной слой
  • слой метье и
  • уровень бизнес-делегата

Для каждого слоя основной генератор должен сгенерировать все составляющие его файлы: файл модуля, файлы интерфейсов, ... Основные 3 файла, сгенерированные в этом процессе, выглядят так:

hero.applicatif.ts:

import { Injectable } from '@angular/core';
import { IHeroApplicatif } from './hero.applicatif.interface';
import { HeroMetier } from '../metier/hero.metier';
@Injectable()
export class HeroApplicatif implements IHeroApplicatif {
    constructor(private heroMetier: HeroMetier) {}
}

hero.metier.ts:

import { Injectable } from '@angular/core';
import { IHeroMetier } from './hero.metier.interface';
import { HeroBusinessDelegate } from '../business-delegate/hero.business-delegate';
@Injectable()
export class HeroMetier implements IHeroMetier {
    constructor(private heroBusinessDelegate: HeroBusinessDelegate) {}
}

hero.business-delegate.ts:

import { Injectable } from '@angular/core';
import { Http, Headers } from '@angular/http';
import { IHeroBusinessDelegate } from './hero.business-delegate.interface';
@Injectable()
export class HeroBusinessDelegate implements IHeroBusinessDelegate {
    constructor(private http: Http) {}
}

Генерация этих файлов на основе шаблонов не представляет проблемы. Но я хочу, чтобы подгенераторы предлагали пользователю ввести имя метода, тип возвращаемого значения и параметры, поэтому подгенератор должен был модифицировать каждый ранее сгенерированный файл для вставки кодов, которые по умолчанию для каждого слоя передают вызов в следующий слой.

Предположим, что подгенератор предложил пользователю ввести метод с именем getHero, содержимое 3 файлов должно быть изменено следующим образом:

hero.applicatif.ts:

import { Injectable } from '@angular/core';
import { IHeroApplicatif } from './hero.applicatif.interface';
import { HeroMetier } from '../metier/hero.metier';
@Injectable()
export class HeroApplicatif implements IHeroApplicatif {
    constructor(private heroMetier: HeroMetier) {}
    getHero(id:number): Promise<any> {
        return this.heroMetier.getHero(id);
    }
}

hero.metier.ts:

import { Injectable } from '@angular/core';
import { IHeroMetier } from './hero.metier.interface';
import { HeroBusinessDelegate } from '../business-delegate/hero.business-delegate';
@Injectable()
export class HeroMetier implements IHeroMetier {
    constructor(private heroBusinessDelegate: HeroBusinessDelegate) {}
    getHero(id:number): Promise<any> {
        return this.heroBusinessDelegate.getHero(id);        
    }
}

hero.business-delegate.ts:

import { Injectable } from '@angular/core';
import { Http, Headers } from '@angular/http';
import { IHeroBusinessDelegate } from './hero.business-delegate.interface';
@Injectable()
export class HeroBusinessDelegate implements IHeroBusinessDelegate {
    constructor(private http: Http) {}
    getHero(id:number): Promise<any> {
        return this.http.get(...).toPromise();
    }
}

Каков самый простой, безопасный и современный способ сделать это?


person Faly    schedule 31.01.2017    source источник
comment
В какой файл вы хотите вставить контент? Пожалуйста, предоставьте пример: содержимое файла, в которое вы хотите вставить новое содержимое + содержимое, которое вы хотите вставить   -  person Simon Boudrias    schedule 02.02.2017
comment
@SimonBoudrias Хорошо, я отредактирую сообщение, чтобы привести пример   -  person Faly    schedule 02.02.2017
comment
@SimonBoudrias некоторые примеры файлов теперь представлены в сообщении   -  person Faly    schedule 02.02.2017


Ответы (1)


Чтобы редактировать содержимое файлов кода безопасным способом, который не приведет к неожиданным изменениям со стороны конечного пользователя, самым безопасным способом является изменение файла Абстрактное синтаксическое дерево.

Существует несколько парсеров AST, доступных для Node. Двумя наиболее популярными являются Esprima и Желудь. Также есть несколько инструментов, созданных на основе этих парсеров, чтобы упростить модификацию AST.

Я написал такой инструмент некоторое время назад, если вы хотите проверить его https://github.com/SBoudrias/AST-query — это может сработать в вашем случае.

person Simon Boudrias    schedule 02.02.2017