Ответ 1
Может быть, не использовать di.js, а вместо этого перевести аналогичный код в действительный синтаксис angular 1.X(во время шага сборки)
Небольшой пример и возможный запуск:
var falafel = require('falafel');
var traceur = require('traceur');
var src =
'@Inject(MyService,MyOtherService)' +
'class Thing{' +
' constructor(service,otherservice){' +
' }' +
'}';
src = traceur.compile(src, { annotations: true });
//console.log(src);
function tryGetPath(obj, path) {
path.split('.').forEach(function(key) {
obj = obj && obj[key];
});
return obj;
}
var output = falafel(src, function(node) {
//find `Object.defineProperty for 'annotations'`
if (node.type === 'CallExpression' && tryGetPath(node, 'arguments.1.value') === 'annotations') {
var injectable = tryGetPath(node, 'arguments.0.name');
var $inject = (tryGetPath(node, 'arguments.2.properties.0.value.body.body.0.argument.elements') || [])
.filter(function(a){return a.callee.name === 'Inject'})
.reduce(function(p,c){ p.push.apply(p,c.arguments); return p;},[])
.map(function(a){return "'"+a.name+"'";});
node.update(injectable + '.$inject = [' + $inject.toString() + '];');
}
});
console.log(output);
Возможно, вы даже можете использовать определенные атрибуты (например, @NgController
и т.д.), чтобы зарегистрировать его на своем модуле в качестве контроллера.