metadataReader.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. var ts = require("typescript");
  4. var astQuery_1 = require("../util/astQuery");
  5. var function_1 = require("../util/function");
  6. var logger_1 = require("../util/logger");
  7. var ngQuery_1 = require("../util/ngQuery");
  8. var utils_1 = require("../util/utils");
  9. var config_1 = require("./config");
  10. var metadata_1 = require("./metadata");
  11. var pathResolver_1 = require("./urlResolvers/pathResolver");
  12. var urlResolver_1 = require("./urlResolvers/urlResolver");
  13. var normalizeTransformed = function (t) {
  14. if (!t.map) {
  15. t.source = t.code;
  16. }
  17. return t;
  18. };
  19. var MetadataReader = (function () {
  20. function MetadataReader(fileResolver, urlResolver) {
  21. this.fileResolver = fileResolver;
  22. this.urlResolver = urlResolver;
  23. this.urlResolver = this.urlResolver || new urlResolver_1.UrlResolver(new pathResolver_1.PathResolver());
  24. }
  25. MetadataReader.prototype.read = function (d) {
  26. var _this = this;
  27. var componentMetadata = function_1.unwrapFirst(utils_1.maybeNodeArray(ts.createNodeArray(d.decorators)).map(function (dec) {
  28. return function_1.Maybe.lift(dec)
  29. .bind(astQuery_1.callExpression)
  30. .bind(astQuery_1.withIdentifier('Component'))
  31. .fmap(function () { return _this.readComponentMetadata(d, dec); });
  32. }));
  33. var directiveMetadata = function_1.unwrapFirst(utils_1.maybeNodeArray(ts.createNodeArray(d.decorators)).map(function (dec) {
  34. return function_1.Maybe.lift(dec)
  35. .bind(astQuery_1.callExpression)
  36. .bind(astQuery_1.withIdentifier('Directive'))
  37. .fmap(function () { return _this.readDirectiveMetadata(d, dec); });
  38. }));
  39. var pipeMetadata = function_1.unwrapFirst(utils_1.maybeNodeArray(ts.createNodeArray(d.decorators)).map(function (dec) {
  40. return function_1.Maybe.lift(dec)
  41. .bind(astQuery_1.callExpression)
  42. .bind(astQuery_1.withIdentifier('Pipe'))
  43. .fmap(function () { return _this.readPipeMetadata(d, dec); });
  44. }));
  45. var moduleMetadata = function_1.unwrapFirst(utils_1.maybeNodeArray(ts.createNodeArray(d.decorators)).map(function (dec) {
  46. return function_1.Maybe.lift(dec)
  47. .bind(astQuery_1.callExpression)
  48. .bind(astQuery_1.withIdentifier('NgModule'))
  49. .fmap(function () { return _this.readModuleMetadata(d, dec); });
  50. }));
  51. var injectableMetadata = function_1.unwrapFirst(utils_1.maybeNodeArray(ts.createNodeArray(d.decorators)).map(function (dec) {
  52. return function_1.Maybe.lift(dec)
  53. .bind(astQuery_1.callExpression)
  54. .bind(astQuery_1.withIdentifier('Injectable'))
  55. .fmap(function () { return _this.readInjectableMetadata(d, dec); });
  56. }));
  57. return directiveMetadata || componentMetadata || pipeMetadata || moduleMetadata || injectableMetadata;
  58. };
  59. MetadataReader.prototype.readDirectiveMetadata = function (d, dec) {
  60. var selectorExpression = utils_1.getDecoratorPropertyInitializer(dec, 'selector');
  61. var selector = selectorExpression && utils_1.isStringLiteralLike(selectorExpression) ? selectorExpression.text : undefined;
  62. return new metadata_1.DirectiveMetadata(d, dec, selector);
  63. };
  64. MetadataReader.prototype.readPipeMetadata = function (d, dec) {
  65. var nameExpression = utils_1.getDecoratorPropertyInitializer(dec, 'name');
  66. var name = nameExpression && utils_1.isStringLiteralLike(nameExpression) ? nameExpression.text : undefined;
  67. var pureExpression = utils_1.getDecoratorPropertyInitializer(dec, 'pure');
  68. var pure = pureExpression && utils_1.isBooleanLiteralLike(pureExpression) ? pureExpression : undefined;
  69. return new metadata_1.PipeMetadata(d, dec, name, pure);
  70. };
  71. MetadataReader.prototype.readModuleMetadata = function (d, dec) {
  72. return new metadata_1.ModuleMetadata(d, dec);
  73. };
  74. MetadataReader.prototype.readInjectableMetadata = function (d, dec) {
  75. var providedInExpression = utils_1.getDecoratorPropertyInitializer(dec, 'providedIn');
  76. return new metadata_1.InjectableMetadata(d, dec, providedInExpression);
  77. };
  78. MetadataReader.prototype.readComponentMetadata = function (d, dec) {
  79. var _this = this;
  80. var expr = this.getDecoratorArgument(dec);
  81. var directiveMetadata = this.readDirectiveMetadata(d, dec);
  82. var external_M = expr.fmap(function () { return _this.urlResolver.resolve(dec); });
  83. var animations_M = external_M.bind(function () { return _this.readComponentAnimationsMetadata(dec); });
  84. var style_M = external_M.bind(function (external) { return _this.readComponentStylesMetadata(dec, external); });
  85. var template_M = external_M.bind(function (external) { return _this.readComponentTemplateMetadata(dec, external); });
  86. return new metadata_1.ComponentMetadata(directiveMetadata.controller, directiveMetadata.decorator, directiveMetadata.selector, animations_M.unwrap(), style_M.unwrap(), template_M.unwrap());
  87. };
  88. MetadataReader.prototype.getDecoratorArgument = function (decorator) {
  89. return astQuery_1.decoratorArgument(decorator).bind(function_1.ifTrue(astQuery_1.hasProperties));
  90. };
  91. MetadataReader.prototype.readComponentAnimationsMetadata = function (dec) {
  92. return ngQuery_1.getAnimations(dec).fmap(function (inlineAnimations) {
  93. return inlineAnimations.elements.filter(utils_1.isStringLiteralLike).map(function (inlineAnimation) { return ({
  94. animation: normalizeTransformed({ code: inlineAnimation.text }),
  95. node: inlineAnimation
  96. }); });
  97. });
  98. };
  99. MetadataReader.prototype.readComponentTemplateMetadata = function (dec, external) {
  100. var _this = this;
  101. return ngQuery_1.getTemplate(dec)
  102. .fmap(function (inlineTemplate) { return ({
  103. node: inlineTemplate,
  104. template: normalizeTransformed(config_1.Config.transformTemplate(inlineTemplate.text)),
  105. url: undefined
  106. }); })
  107. .catch(function () {
  108. return function_1.Maybe.lift(external.templateUrl).bind(function (url) {
  109. return _this._resolve(url).fmap(function (template) { return ({
  110. node: undefined,
  111. template: normalizeTransformed(config_1.Config.transformTemplate(template, url)),
  112. url: url
  113. }); });
  114. });
  115. });
  116. };
  117. MetadataReader.prototype.readComponentStylesMetadata = function (dec, external) {
  118. var _this = this;
  119. return ngQuery_1.getInlineStyle(dec)
  120. .fmap(function (inlineStyles) {
  121. return inlineStyles.elements.filter(utils_1.isStringLiteralLike).map(function (inlineStyle) { return ({
  122. node: inlineStyle,
  123. style: normalizeTransformed(config_1.Config.transformStyle(inlineStyle.text))
  124. }); });
  125. })
  126. .catch(function () {
  127. return function_1.Maybe.lift(external.styleUrls)
  128. .fmap(function (urls) {
  129. return urls.map(function (url) {
  130. return _this._resolve(url).fmap(function (style) { return ({
  131. node: undefined,
  132. style: normalizeTransformed(config_1.Config.transformStyle(style, url)),
  133. url: url
  134. }); });
  135. });
  136. })
  137. .bind(function (url) { return function_1.listToMaybe(url); });
  138. });
  139. };
  140. MetadataReader.prototype._resolve = function (url) {
  141. try {
  142. return function_1.Maybe.lift(this.fileResolver.resolve(url));
  143. }
  144. catch (_a) {
  145. logger_1.logger.info('Cannot read file' + url);
  146. return function_1.Maybe.nothing;
  147. }
  148. };
  149. return MetadataReader;
  150. }());
  151. exports.MetadataReader = MetadataReader;