9b0281f518c8be834b5fba78023d63bd9fa2cc709f38ff97d00d682c71e362bc2d183efbbe0e9c830d4866967975a89fdab6bfe47b0bac1b383baad94da596 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = _decorate;
  6. var _toArray = require("toArray");
  7. var _toPropertyKey = require("toPropertyKey");
  8. function _decorate(decorators, factory, superClass, mixins) {
  9. var api = _getDecoratorsApi();
  10. if (mixins) {
  11. for (var i = 0; i < mixins.length; i++) {
  12. api = mixins[i](api);
  13. }
  14. }
  15. var r = factory(function initialize(O) {
  16. api.initializeInstanceElements(O, decorated.elements);
  17. }, superClass);
  18. var decorated = api.decorateClass(_coalesceClassElements(r.d.map(_createElementDescriptor)), decorators);
  19. api.initializeClassElements(r.F, decorated.elements);
  20. return api.runClassFinishers(r.F, decorated.finishers);
  21. }
  22. function _getDecoratorsApi() {
  23. _getDecoratorsApi = function () {
  24. return api;
  25. };
  26. var api = {
  27. elementsDefinitionOrder: [["method"], ["field"]],
  28. initializeInstanceElements: function (O, elements) {
  29. ["method", "field"].forEach(function (kind) {
  30. elements.forEach(function (element) {
  31. if (element.kind === kind && element.placement === "own") {
  32. this.defineClassElement(O, element);
  33. }
  34. }, this);
  35. }, this);
  36. },
  37. initializeClassElements: function (F, elements) {
  38. var proto = F.prototype;
  39. ["method", "field"].forEach(function (kind) {
  40. elements.forEach(function (element) {
  41. var placement = element.placement;
  42. if (element.kind === kind && (placement === "static" || placement === "prototype")) {
  43. var receiver = placement === "static" ? F : proto;
  44. this.defineClassElement(receiver, element);
  45. }
  46. }, this);
  47. }, this);
  48. },
  49. defineClassElement: function (receiver, element) {
  50. var descriptor = element.descriptor;
  51. if (element.kind === "field") {
  52. var initializer = element.initializer;
  53. descriptor = {
  54. enumerable: descriptor.enumerable,
  55. writable: descriptor.writable,
  56. configurable: descriptor.configurable,
  57. value: initializer === void 0 ? void 0 : initializer.call(receiver)
  58. };
  59. }
  60. Object.defineProperty(receiver, element.key, descriptor);
  61. },
  62. decorateClass: function (elements, decorators) {
  63. var newElements = [];
  64. var finishers = [];
  65. var placements = {
  66. static: [],
  67. prototype: [],
  68. own: []
  69. };
  70. elements.forEach(function (element) {
  71. this.addElementPlacement(element, placements);
  72. }, this);
  73. elements.forEach(function (element) {
  74. if (!_hasDecorators(element)) return newElements.push(element);
  75. var elementFinishersExtras = this.decorateElement(element, placements);
  76. newElements.push(elementFinishersExtras.element);
  77. newElements.push.apply(newElements, elementFinishersExtras.extras);
  78. finishers.push.apply(finishers, elementFinishersExtras.finishers);
  79. }, this);
  80. if (!decorators) {
  81. return {
  82. elements: newElements,
  83. finishers: finishers
  84. };
  85. }
  86. var result = this.decorateConstructor(newElements, decorators);
  87. finishers.push.apply(finishers, result.finishers);
  88. result.finishers = finishers;
  89. return result;
  90. },
  91. addElementPlacement: function (element, placements, silent) {
  92. var keys = placements[element.placement];
  93. if (!silent && keys.indexOf(element.key) !== -1) {
  94. throw new TypeError("Duplicated element (" + element.key + ")");
  95. }
  96. keys.push(element.key);
  97. },
  98. decorateElement: function (element, placements) {
  99. var extras = [];
  100. var finishers = [];
  101. for (var decorators = element.decorators, i = decorators.length - 1; i >= 0; i--) {
  102. var keys = placements[element.placement];
  103. keys.splice(keys.indexOf(element.key), 1);
  104. var elementObject = this.fromElementDescriptor(element);
  105. var elementFinisherExtras = this.toElementFinisherExtras((0, decorators[i])(elementObject) || elementObject);
  106. element = elementFinisherExtras.element;
  107. this.addElementPlacement(element, placements);
  108. if (elementFinisherExtras.finisher) {
  109. finishers.push(elementFinisherExtras.finisher);
  110. }
  111. var newExtras = elementFinisherExtras.extras;
  112. if (newExtras) {
  113. for (var j = 0; j < newExtras.length; j++) {
  114. this.addElementPlacement(newExtras[j], placements);
  115. }
  116. extras.push.apply(extras, newExtras);
  117. }
  118. }
  119. return {
  120. element: element,
  121. finishers: finishers,
  122. extras: extras
  123. };
  124. },
  125. decorateConstructor: function (elements, decorators) {
  126. var finishers = [];
  127. for (var i = decorators.length - 1; i >= 0; i--) {
  128. var obj = this.fromClassDescriptor(elements);
  129. var elementsAndFinisher = this.toClassDescriptor((0, decorators[i])(obj) || obj);
  130. if (elementsAndFinisher.finisher !== undefined) {
  131. finishers.push(elementsAndFinisher.finisher);
  132. }
  133. if (elementsAndFinisher.elements !== undefined) {
  134. elements = elementsAndFinisher.elements;
  135. for (var j = 0; j < elements.length - 1; j++) {
  136. for (var k = j + 1; k < elements.length; k++) {
  137. if (elements[j].key === elements[k].key && elements[j].placement === elements[k].placement) {
  138. throw new TypeError("Duplicated element (" + elements[j].key + ")");
  139. }
  140. }
  141. }
  142. }
  143. }
  144. return {
  145. elements: elements,
  146. finishers: finishers
  147. };
  148. },
  149. fromElementDescriptor: function (element) {
  150. var obj = {
  151. kind: element.kind,
  152. key: element.key,
  153. placement: element.placement,
  154. descriptor: element.descriptor
  155. };
  156. var desc = {
  157. value: "Descriptor",
  158. configurable: true
  159. };
  160. Object.defineProperty(obj, Symbol.toStringTag, desc);
  161. if (element.kind === "field") obj.initializer = element.initializer;
  162. return obj;
  163. },
  164. toElementDescriptors: function (elementObjects) {
  165. if (elementObjects === undefined) return;
  166. return _toArray(elementObjects).map(function (elementObject) {
  167. var element = this.toElementDescriptor(elementObject);
  168. this.disallowProperty(elementObject, "finisher", "An element descriptor");
  169. this.disallowProperty(elementObject, "extras", "An element descriptor");
  170. return element;
  171. }, this);
  172. },
  173. toElementDescriptor: function (elementObject) {
  174. var kind = String(elementObject.kind);
  175. if (kind !== "method" && kind !== "field") {
  176. throw new TypeError('An element descriptor\'s .kind property must be either "method" or' + ' "field", but a decorator created an element descriptor with' + ' .kind "' + kind + '"');
  177. }
  178. var key = _toPropertyKey(elementObject.key);
  179. var placement = String(elementObject.placement);
  180. if (placement !== "static" && placement !== "prototype" && placement !== "own") {
  181. throw new TypeError('An element descriptor\'s .placement property must be one of "static",' + ' "prototype" or "own", but a decorator created an element descriptor' + ' with .placement "' + placement + '"');
  182. }
  183. var descriptor = elementObject.descriptor;
  184. this.disallowProperty(elementObject, "elements", "An element descriptor");
  185. var element = {
  186. kind: kind,
  187. key: key,
  188. placement: placement,
  189. descriptor: Object.assign({}, descriptor)
  190. };
  191. if (kind !== "field") {
  192. this.disallowProperty(elementObject, "initializer", "A method descriptor");
  193. } else {
  194. this.disallowProperty(descriptor, "get", "The property descriptor of a field descriptor");
  195. this.disallowProperty(descriptor, "set", "The property descriptor of a field descriptor");
  196. this.disallowProperty(descriptor, "value", "The property descriptor of a field descriptor");
  197. element.initializer = elementObject.initializer;
  198. }
  199. return element;
  200. },
  201. toElementFinisherExtras: function (elementObject) {
  202. var element = this.toElementDescriptor(elementObject);
  203. var finisher = _optionalCallableProperty(elementObject, "finisher");
  204. var extras = this.toElementDescriptors(elementObject.extras);
  205. return {
  206. element: element,
  207. finisher: finisher,
  208. extras: extras
  209. };
  210. },
  211. fromClassDescriptor: function (elements) {
  212. var obj = {
  213. kind: "class",
  214. elements: elements.map(this.fromElementDescriptor, this)
  215. };
  216. var desc = {
  217. value: "Descriptor",
  218. configurable: true
  219. };
  220. Object.defineProperty(obj, Symbol.toStringTag, desc);
  221. return obj;
  222. },
  223. toClassDescriptor: function (obj) {
  224. var kind = String(obj.kind);
  225. if (kind !== "class") {
  226. throw new TypeError('A class descriptor\'s .kind property must be "class", but a decorator' + ' created a class descriptor with .kind "' + kind + '"');
  227. }
  228. this.disallowProperty(obj, "key", "A class descriptor");
  229. this.disallowProperty(obj, "placement", "A class descriptor");
  230. this.disallowProperty(obj, "descriptor", "A class descriptor");
  231. this.disallowProperty(obj, "initializer", "A class descriptor");
  232. this.disallowProperty(obj, "extras", "A class descriptor");
  233. var finisher = _optionalCallableProperty(obj, "finisher");
  234. var elements = this.toElementDescriptors(obj.elements);
  235. return {
  236. elements: elements,
  237. finisher: finisher
  238. };
  239. },
  240. runClassFinishers: function (constructor, finishers) {
  241. for (var i = 0; i < finishers.length; i++) {
  242. var newConstructor = (0, finishers[i])(constructor);
  243. if (newConstructor !== undefined) {
  244. if (typeof newConstructor !== "function") {
  245. throw new TypeError("Finishers must return a constructor.");
  246. }
  247. constructor = newConstructor;
  248. }
  249. }
  250. return constructor;
  251. },
  252. disallowProperty: function (obj, name, objectType) {
  253. if (obj[name] !== undefined) {
  254. throw new TypeError(objectType + " can't have a ." + name + " property.");
  255. }
  256. }
  257. };
  258. return api;
  259. }
  260. function _createElementDescriptor(def) {
  261. var key = _toPropertyKey(def.key);
  262. var descriptor;
  263. if (def.kind === "method") {
  264. descriptor = {
  265. value: def.value,
  266. writable: true,
  267. configurable: true,
  268. enumerable: false
  269. };
  270. } else if (def.kind === "get") {
  271. descriptor = {
  272. get: def.value,
  273. configurable: true,
  274. enumerable: false
  275. };
  276. } else if (def.kind === "set") {
  277. descriptor = {
  278. set: def.value,
  279. configurable: true,
  280. enumerable: false
  281. };
  282. } else if (def.kind === "field") {
  283. descriptor = {
  284. configurable: true,
  285. writable: true,
  286. enumerable: true
  287. };
  288. }
  289. var element = {
  290. kind: def.kind === "field" ? "field" : "method",
  291. key: key,
  292. placement: def.static ? "static" : def.kind === "field" ? "own" : "prototype",
  293. descriptor: descriptor
  294. };
  295. if (def.decorators) element.decorators = def.decorators;
  296. if (def.kind === "field") element.initializer = def.value;
  297. return element;
  298. }
  299. function _coalesceGetterSetter(element, other) {
  300. if (element.descriptor.get !== undefined) {
  301. other.descriptor.get = element.descriptor.get;
  302. } else {
  303. other.descriptor.set = element.descriptor.set;
  304. }
  305. }
  306. function _coalesceClassElements(elements) {
  307. var newElements = [];
  308. var isSameElement = function (other) {
  309. return other.kind === "method" && other.key === element.key && other.placement === element.placement;
  310. };
  311. for (var i = 0; i < elements.length; i++) {
  312. var element = elements[i];
  313. var other;
  314. if (element.kind === "method" && (other = newElements.find(isSameElement))) {
  315. if (_isDataDescriptor(element.descriptor) || _isDataDescriptor(other.descriptor)) {
  316. if (_hasDecorators(element) || _hasDecorators(other)) {
  317. throw new ReferenceError("Duplicated methods (" + element.key + ") can't be decorated.");
  318. }
  319. other.descriptor = element.descriptor;
  320. } else {
  321. if (_hasDecorators(element)) {
  322. if (_hasDecorators(other)) {
  323. throw new ReferenceError("Decorators can't be placed on different accessors with for " + "the same property (" + element.key + ").");
  324. }
  325. other.decorators = element.decorators;
  326. }
  327. _coalesceGetterSetter(element, other);
  328. }
  329. } else {
  330. newElements.push(element);
  331. }
  332. }
  333. return newElements;
  334. }
  335. function _hasDecorators(element) {
  336. return element.decorators && element.decorators.length;
  337. }
  338. function _isDataDescriptor(desc) {
  339. return desc !== undefined && !(desc.value === undefined && desc.writable === undefined);
  340. }
  341. function _optionalCallableProperty(obj, name) {
  342. var value = obj[name];
  343. if (value !== undefined && typeof value !== "function") {
  344. throw new TypeError("Expected '" + name + "' to be a function");
  345. }
  346. return value;
  347. }
  348. //# sourceMappingURL=decorate.js.map