У меня есть плагин брокколи, который делает следующее:
- Чтение json-файла из корневой папки
- на основе JSON сгенерируйте несколько файлов HBS шаблона маршрута
Это работает отлично, и его также можно протестировать, запустив сборку брокколи.
Пример результата сборки брокколи:
templates/generated-route.hbs
templates/my-sub/generated.hbs
Следующим этапом будет интеграция его в ember-аддон, и я создал его с помощью preprocessTree
хука.
module.exports = {
name: 'route-template-generator',
included(app) {
this._super.included.apply(this, arguments);
this.options = Object.assign({}, app.options);
this.appName = app.name;
if (!this.options.trees) {
throw new Error('No trees found in app to add the new files to');
}
if (!this.appName) {
throw new Error('no valid application name, unable to add files to the tree');
}
},
preprocessTree(type, tree) {
if (type === 'template') {
const extraTemplates = new RouteTemplateGenerator(
[new Funnel(this.options.trees.app, { include: ['router.json'] })],
{ destDir: this.appName }
);
return mergeTrees([tree, extraTemplates], { overwrite: true });
}
return tree;
}
};
Проблема с приведенным выше решением заключается в том, что деревья не могут быть объединены, если не передано destDir
. Дерево ember-приложений начинается с имени приложения, например:
my-ember-app-name/templates/application.hbs
my-ember-app-name/router.js
...
При вызове этого аддона сразу из ember-приложения app.options.trees.app
будет работать, однако, когда этот аддон вызывается как зависимость от другого аддона, параметр в хуке included
получает объект аддона, у которого нет имени дерева приложений.
Итак, вопрос в том, как правильно записывать файлы в дерево приложений?