text: 'use strict';var lang_1 = require('angular2/src/core/facade/lang');
  var collection_1 = require('angular2/src/core/facade/collection');
  var change_detection_1 = require('angular2/src/core/change_detection/change_detection');
  var view_1 = require('angular2/src/core/metadata/view');
  var selector_1 = require('angular2/src/core/compiler/selector');
  var util_1 = require('./util');
  var interfaces_1 = require('angular2/src/core/linker/interfaces');
  // group 1: "property" from "[property]"
  // group 2: "event" from "(event)"
  var HOST_REG_EXP = /^(?:(?:\[([^\]]+)\])|(?:\(([^\)]+)\)))$/g;
  var CompileTypeMetadata = (function () {
      function CompileTypeMetadata(_a) {
          var _b = _a === void 0 ? {} : _a, runtime = _b.runtime, name = _b.name, moduleUrl = _b.moduleUrl, isHost = _b.isHost;
          this.runtime = runtime;
          this.name = name;
          this.moduleUrl = moduleUrl;
          this.isHost = lang_1.normalizeBool(isHost);
      }
      CompileTypeMetadata.fromJson = function (data) {
          return new CompileTypeMetadata({ name: data['name'], moduleUrl: data['moduleUrl'], isHost: data['isHost'] });
      };
      CompileTypeMetadata.prototype.toJson = function () {
          return {
              // Note: Runtime type can't be serialized...
              'name': this.name,
              'moduleUrl': this.moduleUrl,
              'isHost': this.isHost
          };
      };
      return CompileTypeMetadata;
  })();
  exports.CompileTypeMetadata = CompileTypeMetadata;
  var CompileTemplateMetadata = (function () {
      function CompileTemplateMetadata(_a) {
          var _b = _a === void 0 ? {} : _a, encapsulation = _b.encapsulation, template = _b.template, templateUrl = _b.templateUrl, styles = _b.styles, styleUrls = _b.styleUrls, ngContentSelectors = _b.ngContentSelectors;
          this.encapsulation = lang_1.isPresent(encapsulation) ? encapsulation : view_1.ViewEncapsulation.Emulated;
          this.template = template;
          this.templateUrl = templateUrl;
          this.styles = lang_1.isPresent(styles) ? styles : [];
          this.styleUrls = lang_1.isPresent(styleUrls) ? styleUrls : [];
          this.ngContentSelectors = lang_1.isPresent(ngContentSelectors) ? ngContentSelectors : [];
      }
      CompileTemplateMetadata.fromJson = function (data) {
          return new CompileTemplateMetadata({
              encapsulation: lang_1.isPresent(data['encapsulation']) ?
                  view_1.VIEW_ENCAPSULATION_VALUES[data['encapsulation']] :
                  data['encapsulation'],
              template: data['template'],
              templateUrl: data['templateUrl'],
              styles: data['styles'],
              styleUrls: data['styleUrls'],
              ngContentSelectors: data['ngContentSelectors']
          });
      };
      CompileTemplateMetadata.prototype.toJson = function () {
          return {
              'encapsulation': lang_1.isPresent(this.encapsulation) ? lang_1.serializeEnum(this.encapsulation) : this.encapsulation,
              'template': this.template,
              'templateUrl': this.templateUrl,
              'styles': this.styles,
              'styleUrls': this.styleUrls,
              'ngContentSelectors': this.ngContentSelectors
          };
      };
      return CompileTemplateMetadata;
  })();
  exports.CompileTemplateMetadata = CompileTemplateMetadata;
  var CompileDirectiveMetadata = (function () {
      function CompileDirectiveMetadata(_a) {
          var _b = _a === void 0 ? {} : _a, type = _b.type, isComponent = _b.isComponent, dynamicLoadable = _b.dynamicLoadable, selector = _b.selector, exportAs = _b.exportAs, changeDetection = _b.changeDetection, inputs = _b.inputs, outputs = _b.outputs, hostListeners = _b.hostListeners, hostProperties = _b.hostProperties, hostAttributes = _b.hostAttributes, lifecycleHooks = _b.lifecycleHooks, template = _b.template;
          this.type = type;
          this.isComponent = isComponent;
          this.dynamicLoadable = dynamicLoadable;
          this.selector = selector;
          this.exportAs = exportAs;
          this.changeDetection = changeDetection;
          this.inputs = inputs;
          this.outputs = outputs;
          this.hostListeners = hostListeners;
          this.hostProperties = hostProperties;
          this.hostAttributes = hostAttributes;
          this.lifecycleHooks = lifecycleHooks;
          this.template = template;
      }
      CompileDirectiveMetadata.create = function (_a) {
          var _b = _a === void 0 ? {} : _a, type = _b.type, isComponent = _b.isComponent, dynamicLoadable = _b.dynamicLoadable, selector = _b.selector, exportAs = _b.exportAs, changeDetection = _b.changeDetection, inputs = _b.inputs, outputs = _b.outputs, host = _b.host, lifecycleHooks = _b.lifecycleHooks, template = _b.template;
          var hostListeners = {};
          var hostProperties = {};
          var hostAttributes = {};
          if (lang_1.isPresent(host)) {
              collection_1.StringMapWrapper.forEach(host, function (value, key) {
                  var matches = lang_1.RegExpWrapper.firstMatch(HOST_REG_EXP, key);
                  if (lang_1.isBlank(matches)) {
                      hostAttributes[key] = value;
                  }
                  else if (lang_1.isPresent(matches[1])) {
                      hostProperties[matches[1]] = value;
                  }
                  else if (lang_1.isPresent(matches[2])) {
                      hostListeners[matches[2]] = value;
                  }
              });
          }
          var inputsMap = {};
          if (lang_1.isPresent(inputs)) {
              inputs.forEach(function (bindConfig) {
                  // canonical syntax: `dirProp: elProp`
                  // if there is no `:`, use dirProp = elProp
                  var parts = util_1.splitAtColon(bindConfig, [bindConfig, bindConfig]);
                  inputsMap[parts[0]] = parts[1];
              });
          }
          var outputsMap = {};
          if (lang_1.isPresent(outputs)) {
              outputs.forEach(function (bindConfig) {
                  // canonical syntax: `dirProp: elProp`
                  // if there is no `:`, use dirProp = elProp
                  var parts = util_1.splitAtColon(bindConfig, [bindConfig, bindConfig]);
                  outputsMap[parts[0]] = parts[1];
              });
          }
          return new CompileDirectiveMetadata({
              type: type,
              isComponent: lang_1.normalizeBool(isComponent),
              dynamicLoadable: lang_1.normalizeBool(dynamicLoadable),
              selector: selector,
              exportAs: exportAs,
              changeDetection: changeDetection,
              inputs: inputsMap,
              outputs: outputsMap,
              hostListeners: hostListeners,
              hostProperties: hostProperties,
              hostAttributes: hostAttributes,
              lifecycleHooks: lang_1.isPresent(lifecycleHooks) ? lifecycleHooks : [],
              template: template
          });
      };
      CompileDirectiveMetadata.fromJson = function (data) {
          return new CompileDirectiveMetadata({
              isComponent: data['isComponent'],
              dynamicLoadable: data['dynamicLoadable'],
              selector: data['selector'],
              exportAs: data['exportAs'],
              type: lang_1.isPresent(data['type']) ? CompileTypeMetadata.fromJson(data['type']) : data['type'],
              changeDetection: lang_1.isPresent(data['changeDetection']) ?
                  change_detection_1.CHANGE_DETECTION_STRATEGY_VALUES[data['changeDetection']] :
                  data['changeDetection'],
              inputs: data['inputs'],
              outputs: data['outputs'],
              hostListeners: data['hostListeners'],
              hostProperties: data['hostProperties'],
              hostAttributes: data['hostAttributes'],
              lifecycleHooks: data['lifecycleHooks'].map(function (hookValue) { return interfaces_1.LIFECYCLE_HOOKS_VALUES[hookValue]; }),
              template: lang_1.isPresent(data['template']) ? CompileTemplateMetadata.fromJson(data['template']) :
                  data['template']
          });
      };
      CompileDirectiveMetadata.prototype.toJson = function () {
          return {
              'isComponent': this.isComponent,
              'dynamicLoadable': this.dynamicLoadable,
              'selector': this.selector,
              'exportAs': this.exportAs,
              'type': lang_1.isPresent(this.type) ? this.type.toJson() : this.type,
              'changeDetection': lang_1.isPresent(this.changeDetection) ? lang_1.serializeEnum(this.changeDetection) :
                  this.changeDetection,
              'inputs': this.inputs,
              'outputs': this.outputs,
              'hostListeners': this.hostListeners,
              'hostProperties': this.hostProperties,
              'hostAttributes': this.hostAttributes,
              'lifecycleHooks': this.lifecycleHooks.map(function (hook) { return lang_1.serializeEnum(hook); }),
              'template': lang_1.isPresent(this.template) ? this.template.toJson() : this.template
          };
      };
      return CompileDirectiveMetadata;
  })();
  exports.CompileDirectiveMetadata = CompileDirectiveMetadata;
  function createHostComponentMeta(componentType, componentSelector) {
      var template = selector_1.CssSelector.parse(componentSelector)[0].getMatchingElementTemplate();
      return CompileDirectiveMetadata.create({
          type: new CompileTypeMetadata({
              runtime: Object,
              name: "Host" + componentType.name,
              moduleUrl: componentType.moduleUrl,
              isHost: true
          }),
          template: new CompileTemplateMetadata({ template: template, templateUrl: '', styles: [], styleUrls: [], ngContentSelectors: [] }),
          changeDetection: change_detection_1.ChangeDetectionStrategy.Default,
          inputs: [],
          outputs: [],
          host: {},
          lifecycleHooks: [],
          isComponent: true,
          dynamicLoadable: false,
          selector: '*'
      });
  }
  exports.createHostComponentMeta = createHostComponentMeta;
  //# sourceMappingURL=directive_metadata.js.map