@jsenv/core 23.8.2 → 23.8.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/jsenv_browser_system.js +46 -39
- package/dist/jsenv_browser_system.js.map +14 -14
- package/dist/jsenv_compile_proxy.js.map +6 -6
- package/dist/jsenv_exploring_index.js.map +5 -5
- package/dist/jsenv_exploring_redirector.js.map +12 -12
- package/dist/jsenv_toolbar.js.map +7 -7
- package/dist/jsenv_toolbar_injector.js.map +5 -5
- package/helpers/babel/.eslintrc.cjs +24 -24
- package/helpers/babel/AsyncGenerator/AsyncGenerator.js +81 -81
- package/helpers/babel/AwaitValue/AwaitValue.js +3 -3
- package/helpers/babel/applyDecoratorDescriptor/applyDecoratorDescriptor.js +33 -33
- package/helpers/babel/arrayLikeToArray/arrayLikeToArray.js +7 -7
- package/helpers/babel/arrayWithHoles/arrayWithHoles.js +4 -4
- package/helpers/babel/arrayWithoutHoles/arrayWithoutHoles.js +6 -6
- package/helpers/babel/assertThisInitialized/assertThisInitialized.js +7 -7
- package/helpers/babel/asyncGeneratorDelegate/asyncGeneratorDelegate.js +40 -40
- package/helpers/babel/asyncIterator/asyncIterator.js +12 -12
- package/helpers/babel/asyncToGenerator/asyncToGenerator.js +34 -34
- package/helpers/babel/awaitAsyncGenerator/awaitAsyncGenerator.js +5 -5
- package/helpers/babel/classApplyDescriptorDestructureSet/classApplyDescriptorDestructureSet.js +20 -20
- package/helpers/babel/classApplyDescriptorGet/classApplyDescriptorGet.js +6 -6
- package/helpers/babel/classApplyDescriptorSet/classApplyDescriptorSet.js +13 -13
- package/helpers/babel/classCallCheck/classCallCheck.js +5 -5
- package/helpers/babel/classCheckPrivateStaticAccess/classCheckPrivateStaticAccess.js +5 -5
- package/helpers/babel/classCheckPrivateStaticFieldDescriptor/classCheckPrivateStaticFieldDescriptor.js +6 -6
- package/helpers/babel/classExtractFieldDescriptor/classExtractFieldDescriptor.js +7 -7
- package/helpers/babel/classNameTDZError/classNameTDZError.js +4 -4
- package/helpers/babel/classPrivateFieldDestructureSet/classPrivateFieldDestructureSet.js +7 -7
- package/helpers/babel/classPrivateFieldGet/classPrivateFieldGet.js +7 -7
- package/helpers/babel/classPrivateFieldLooseBase/classPrivateFieldLooseBase.js +6 -6
- package/helpers/babel/classPrivateFieldLooseKey/classPrivateFieldLooseKey.js +5 -5
- package/helpers/babel/classPrivateFieldSet/classPrivateFieldSet.js +8 -8
- package/helpers/babel/classPrivateMethodGet/classPrivateMethodGet.js +6 -6
- package/helpers/babel/classPrivateMethodSet/classPrivateMethodSet.js +3 -3
- package/helpers/babel/classStaticPrivateFieldSpecGet/classStaticPrivateFieldSpecGet.js +9 -9
- package/helpers/babel/classStaticPrivateFieldSpecSet/classStaticPrivateFieldSpecSet.js +15 -15
- package/helpers/babel/classStaticPrivateMethodGet/classStaticPrivateMethodGet.js +6 -6
- package/helpers/babel/classStaticPrivateMethodSet/classStaticPrivateMethodSet.js +3 -3
- package/helpers/babel/construct/construct.js +16 -16
- package/helpers/babel/createClass/createClass.js +15 -15
- package/helpers/babel/createForOfIteratorHelper/createForOfIteratorHelper.js +60 -60
- package/helpers/babel/createForOfIteratorHelperLoose/createForOfIteratorHelperLoose.js +23 -23
- package/helpers/babel/createRawReactElement/createRawReactElement.js +50 -50
- package/helpers/babel/createSuper/createSuper.js +22 -22
- package/helpers/babel/decorate/decorate.js +403 -403
- package/helpers/babel/defaults/defaults.js +11 -11
- package/helpers/babel/defineEnumerableProperties/defineEnumerableProperties.js +23 -23
- package/helpers/babel/defineProperty/defineProperty.js +18 -18
- package/helpers/babel/extends/extends.js +14 -14
- package/helpers/babel/get/get.js +13 -13
- package/helpers/babel/getPrototypeOf/getPrototypeOf.js +4 -4
- package/helpers/babel/inherits/inherits.js +15 -15
- package/helpers/babel/inheritsLoose/inheritsLoose.js +7 -7
- package/helpers/babel/initializerDefineProperty/initializerDefineProperty.js +10 -10
- package/helpers/babel/initializerWarningHelper/initializerWarningHelper.js +6 -6
- package/helpers/babel/instanceof/instanceof.js +6 -6
- package/helpers/babel/interopRequireDefault/interopRequireDefault.js +3 -3
- package/helpers/babel/interopRequireWildcard/interopRequireWildcard.js +37 -37
- package/helpers/babel/isNativeFunction/isNativeFunction.js +4 -4
- package/helpers/babel/isNativeReflectConstruct/isNativeReflectConstruct.js +21 -21
- package/helpers/babel/iterableToArray/iterableToArray.js +7 -7
- package/helpers/babel/iterableToArrayLimit/iterableToArrayLimit.js +36 -36
- package/helpers/babel/iterableToArrayLimitLoose/iterableToArrayLimitLoose.js +10 -10
- package/helpers/babel/jsx/jsx.js +45 -45
- package/helpers/babel/maybeArrayLike/maybeArrayLike.js +10 -10
- package/helpers/babel/newArrowCheck/newArrowCheck.js +5 -5
- package/helpers/babel/nonIterableRest/nonIterableRest.js +5 -5
- package/helpers/babel/nonIterableSpread/nonIterableSpread.js +5 -5
- package/helpers/babel/objectDestructuringEmpty/objectDestructuringEmpty.js +3 -3
- package/helpers/babel/objectSpread/objectSpread.js +23 -23
- package/helpers/babel/objectSpread2/objectSpread2.js +33 -33
- package/helpers/babel/objectWithoutProperties/objectWithoutProperties.js +19 -19
- package/helpers/babel/objectWithoutPropertiesLoose/objectWithoutPropertiesLoose.js +13 -13
- package/helpers/babel/possibleConstructorReturn/possibleConstructorReturn.js +10 -10
- package/helpers/babel/readOnlyError/readOnlyError.js +4 -4
- package/helpers/babel/readme.md +9 -9
- package/helpers/babel/set/set.js +44 -44
- package/helpers/babel/setPrototypeOf/setPrototypeOf.js +6 -6
- package/helpers/babel/skipFirstGeneratorNext/skipFirstGeneratorNext.js +8 -8
- package/helpers/babel/slicedToArray/slicedToArray.js +10 -10
- package/helpers/babel/slicedToArrayLoose/slicedToArrayLoose.js +13 -13
- package/helpers/babel/superPropBase/superPropBase.js +10 -10
- package/helpers/babel/taggedTemplateLiteral/taggedTemplateLiteral.js +10 -10
- package/helpers/babel/taggedTemplateLiteralLoose/taggedTemplateLiteralLoose.js +7 -7
- package/helpers/babel/tdz/tdz.js +4 -4
- package/helpers/babel/temporalRef/temporalRef.js +6 -6
- package/helpers/babel/temporalUndefined/temporalUndefined.js +3 -3
- package/helpers/babel/toArray/toArray.js +10 -10
- package/helpers/babel/toConsumableArray/toConsumableArray.js +10 -10
- package/helpers/babel/toPrimitive/toPrimitive.js +10 -10
- package/helpers/babel/toPropertyKey/toPropertyKey.js +6 -6
- package/helpers/babel/typeof/typeof.js +14 -14
- package/helpers/babel/unsupportedIterableToArray/unsupportedIterableToArray.js +12 -12
- package/helpers/babel/wrapAsyncGenerator/wrapAsyncGenerator.js +8 -8
- package/helpers/babel/wrapNativeSuper/wrapNativeSuper.js +30 -30
- package/helpers/babel/wrapRegExp/wrapRegExp.js +63 -63
- package/helpers/babel/writeOnlyError/writeOnlyError.js +4 -4
- package/helpers/regenerator-runtime/regenerator-runtime.js +748 -748
- package/{LICENSE → license} +21 -21
- package/package.json +2 -2
- package/src/buildProject.js +300 -300
- package/src/execute.js +184 -184
- package/src/internal/browser-launcher/jsenv-browser-system.js +203 -199
- package/src/internal/building/buildUsingRollup.js +2 -10
- package/src/internal/compiling/babel_plugin_import_assertions.js +121 -121
- package/src/internal/compiling/babel_plugin_import_metadata.js +22 -22
- package/src/internal/compiling/babel_plugin_import_visitor.js +84 -84
- package/src/internal/compiling/compile-directory/getOrGenerateCompiledFile.js +268 -268
- package/src/internal/compiling/compile-directory/updateMeta.js +154 -154
- package/src/internal/compiling/compile-directory/validateCache.js +265 -265
- package/src/internal/compiling/compileFile.js +233 -224
- package/src/internal/compiling/compileHtml.js +550 -550
- package/src/internal/compiling/createCompiledFileService.js +291 -291
- package/src/internal/compiling/html_source_file_service.js +403 -404
- package/src/internal/compiling/js-compilation-service/jsenvTransform.js +272 -270
- package/src/internal/compiling/jsenvCompilerForHtml.js +374 -308
- package/src/internal/compiling/jsenvCompilerForJavaScript.js +2 -0
- package/src/internal/compiling/startCompileServer.js +1086 -1048
- package/src/internal/compiling/transformResultToCompilationResult.js +220 -220
- package/src/internal/executing/coverage/babel_plugin_instrument.js +90 -90
- package/src/internal/executing/coverage/reportToCoverage.js +193 -187
- package/src/internal/executing/executePlan.js +183 -183
- package/src/internal/executing/launchAndExecute.js +458 -458
- package/src/internal/generateGroupMap/featuresCompatMap.js +29 -0
- package/src/internal/generateGroupMap/jsenvBabelPluginCompatMap.js +1 -8
- package/src/internal/runtime/createBrowserRuntime/scanBrowserRuntimeFeatures.js +246 -246
- package/src/internal/runtime/createNodeRuntime/scanNodeRuntimeFeatures.js +112 -112
- package/src/internal/runtime/s.js +727 -727
- package/src/internal/toolbar/jsenv-logo.svg +144 -144
- package/src/internal/toolbar/toolbar.main.css +196 -196
- package/src/internal/toolbar/toolbar.main.js +227 -227
- package/src/internal/url_conversion.js +317 -317
- package/src/startExploring.js +309 -309
|
@@ -1,403 +1,403 @@
|
|
|
1
|
-
/* eslint-disable block-scoped-var */
|
|
2
|
-
/* eslint-disable no-nested-ternary */
|
|
3
|
-
/* eslint-disable no-negated-condition */
|
|
4
|
-
/* eslint-disable consistent-return */
|
|
5
|
-
/* eslint-disable prefer-spread */
|
|
6
|
-
/* eslint-disable no-void */
|
|
7
|
-
/* eslint-disable no-sequences */
|
|
8
|
-
import toArray from "../toArray/toArray.js"
|
|
9
|
-
import toPropertyKey from "../toPropertyKey/toPropertyKey.js"
|
|
10
|
-
|
|
11
|
-
// ClassDefinitionEvaluation (Steps 26-*)
|
|
12
|
-
export default function _decorate(
|
|
13
|
-
decorators /* : ClassDecorator[] */,
|
|
14
|
-
factory /* : ClassFactory */,
|
|
15
|
-
superClass /* : ?Class<*> */,
|
|
16
|
-
mixins /* : ?Array<Function> */,
|
|
17
|
-
) /* : Class<*> */ {
|
|
18
|
-
var api = _getDecoratorsApi()
|
|
19
|
-
if (mixins) {
|
|
20
|
-
for (var i = 0; i < mixins.length; i++) {
|
|
21
|
-
api = mixins[i](api)
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
var r = factory(function initialize(O) {
|
|
25
|
-
api.initializeInstanceElements(O, decorated.elements)
|
|
26
|
-
}, superClass)
|
|
27
|
-
var decorated = api.decorateClass(
|
|
28
|
-
_coalesceClassElements(r.d.map(_createElementDescriptor)),
|
|
29
|
-
decorators,
|
|
30
|
-
)
|
|
31
|
-
api.initializeClassElements(r.F, decorated.elements)
|
|
32
|
-
return api.runClassFinishers(r.F, decorated.finishers)
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
var _getDecoratorsApi = function () {
|
|
36
|
-
var api = {
|
|
37
|
-
elementsDefinitionOrder: [["method"], ["field"]],
|
|
38
|
-
// InitializeInstanceElements
|
|
39
|
-
initializeInstanceElements(/* ::<C>*/ O /* : C */, elements /* : ElementDescriptor[] */) {
|
|
40
|
-
;["method", "field"].forEach(function (kind) {
|
|
41
|
-
elements.forEach(function (element /* : ElementDescriptor */) {
|
|
42
|
-
if (element.kind === kind && element.placement === "own") {
|
|
43
|
-
this.defineClassElement(O, element)
|
|
44
|
-
}
|
|
45
|
-
}, this)
|
|
46
|
-
}, this)
|
|
47
|
-
},
|
|
48
|
-
// InitializeClassElements
|
|
49
|
-
initializeClassElements(/* ::<C>*/ F /* : Class<C> */, elements /* : ElementDescriptor[] */) {
|
|
50
|
-
var proto = F.prototype
|
|
51
|
-
;["method", "field"].forEach(function (kind) {
|
|
52
|
-
elements.forEach(function (element /* : ElementDescriptor */) {
|
|
53
|
-
var placement = element.placement
|
|
54
|
-
if (element.kind === kind && (placement === "static" || placement === "prototype")) {
|
|
55
|
-
var receiver = placement === "static" ? F : proto
|
|
56
|
-
this.defineClassElement(receiver, element)
|
|
57
|
-
}
|
|
58
|
-
}, this)
|
|
59
|
-
}, this)
|
|
60
|
-
},
|
|
61
|
-
// DefineClassElement
|
|
62
|
-
defineClassElement(
|
|
63
|
-
/* ::<C>*/ receiver /* : C | Class<C> */,
|
|
64
|
-
element /* : ElementDescriptor */,
|
|
65
|
-
) {
|
|
66
|
-
var descriptor /* : PropertyDescriptor */ = element.descriptor
|
|
67
|
-
if (element.kind === "field") {
|
|
68
|
-
var initializer = element.initializer
|
|
69
|
-
descriptor = {
|
|
70
|
-
enumerable: descriptor.enumerable,
|
|
71
|
-
writable: descriptor.writable,
|
|
72
|
-
configurable: descriptor.configurable,
|
|
73
|
-
value: initializer === void 0 ? void 0 : initializer.call(receiver),
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
Object.defineProperty(receiver, element.key, descriptor)
|
|
77
|
-
},
|
|
78
|
-
// DecorateClass
|
|
79
|
-
decorateClass(
|
|
80
|
-
elements /* : ElementDescriptor[] */,
|
|
81
|
-
decorators /* : ClassDecorator[] */,
|
|
82
|
-
) /* : ElementsFinishers */ {
|
|
83
|
-
var newElements /* : ElementDescriptor[] */ = []
|
|
84
|
-
var finishers /* : ClassFinisher[] */ = []
|
|
85
|
-
var placements /* : Placements */ = {
|
|
86
|
-
static: [],
|
|
87
|
-
prototype: [],
|
|
88
|
-
own: [],
|
|
89
|
-
}
|
|
90
|
-
elements.forEach(function (element /* : ElementDescriptor */) {
|
|
91
|
-
this.addElementPlacement(element, placements)
|
|
92
|
-
}, this)
|
|
93
|
-
elements.forEach(function (element /* : ElementDescriptor */) {
|
|
94
|
-
if (!_hasDecorators(element)) return newElements.push(element)
|
|
95
|
-
var elementFinishersExtras /* : ElementFinishersExtras */ = this.decorateElement(
|
|
96
|
-
element,
|
|
97
|
-
placements,
|
|
98
|
-
)
|
|
99
|
-
newElements.push(elementFinishersExtras.element)
|
|
100
|
-
newElements.push.apply(newElements, elementFinishersExtras.extras)
|
|
101
|
-
finishers.push.apply(finishers, elementFinishersExtras.finishers)
|
|
102
|
-
}, this)
|
|
103
|
-
if (!decorators) {
|
|
104
|
-
return { elements: newElements, finishers }
|
|
105
|
-
}
|
|
106
|
-
var result /* : ElementsFinishers */ = this.decorateConstructor(newElements, decorators)
|
|
107
|
-
finishers.push.apply(finishers, result.finishers)
|
|
108
|
-
result.finishers = finishers
|
|
109
|
-
return result
|
|
110
|
-
},
|
|
111
|
-
// AddElementPlacement
|
|
112
|
-
addElementPlacement(
|
|
113
|
-
element /* : ElementDescriptor */,
|
|
114
|
-
placements /* : Placements */,
|
|
115
|
-
silent /* : boolean */,
|
|
116
|
-
) {
|
|
117
|
-
var keys = placements[element.placement]
|
|
118
|
-
if (!silent && keys.indexOf(element.key) !== -1) {
|
|
119
|
-
throw new TypeError(`Duplicated element (${element.key})`)
|
|
120
|
-
}
|
|
121
|
-
keys.push(element.key)
|
|
122
|
-
},
|
|
123
|
-
// DecorateElement
|
|
124
|
-
decorateElement(
|
|
125
|
-
element /* : ElementDescriptor */,
|
|
126
|
-
placements /* : Placements */,
|
|
127
|
-
) /* : ElementFinishersExtras */ {
|
|
128
|
-
var extras /* : ElementDescriptor[] */ = []
|
|
129
|
-
var finishers /* : ClassFinisher[] */ = []
|
|
130
|
-
for (var decorators = element.decorators, i = decorators.length - 1; i >= 0; i--) {
|
|
131
|
-
// (inlined) RemoveElementPlacement
|
|
132
|
-
var keys = placements[element.placement]
|
|
133
|
-
keys.splice(keys.indexOf(element.key), 1)
|
|
134
|
-
var elementObject /* : ElementObjectInput */ = this.fromElementDescriptor(element)
|
|
135
|
-
var elementFinisherExtras /* : ElementFinisherExtras */ = this.toElementFinisherExtras(
|
|
136
|
-
(0, decorators[i])(elementObject) /* : ElementObjectOutput */ || elementObject,
|
|
137
|
-
)
|
|
138
|
-
element = elementFinisherExtras.element
|
|
139
|
-
this.addElementPlacement(element, placements)
|
|
140
|
-
if (elementFinisherExtras.finisher) {
|
|
141
|
-
finishers.push(elementFinisherExtras.finisher)
|
|
142
|
-
}
|
|
143
|
-
var newExtras /* : ElementDescriptor[] | void */ = elementFinisherExtras.extras
|
|
144
|
-
if (newExtras) {
|
|
145
|
-
for (var j = 0; j < newExtras.length; j++) {
|
|
146
|
-
this.addElementPlacement(newExtras[j], placements)
|
|
147
|
-
}
|
|
148
|
-
extras.push.apply(extras, newExtras)
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
return { element, finishers, extras }
|
|
152
|
-
},
|
|
153
|
-
// DecorateConstructor
|
|
154
|
-
decorateConstructor(
|
|
155
|
-
elements /* : ElementDescriptor[] */,
|
|
156
|
-
decorators /* : ClassDecorator[] */,
|
|
157
|
-
) /* : ElementsFinishers */ {
|
|
158
|
-
var finishers /* : ClassFinisher[] */ = []
|
|
159
|
-
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
160
|
-
var obj /* : ClassObject */ = this.fromClassDescriptor(elements)
|
|
161
|
-
var elementsAndFinisher /* : ElementsFinisher */ = this.toClassDescriptor(
|
|
162
|
-
(0, decorators[i])(obj) /* : ClassObject */ || obj,
|
|
163
|
-
)
|
|
164
|
-
if (elementsAndFinisher.finisher !== undefined) {
|
|
165
|
-
finishers.push(elementsAndFinisher.finisher)
|
|
166
|
-
}
|
|
167
|
-
if (elementsAndFinisher.elements !== undefined) {
|
|
168
|
-
elements = elementsAndFinisher.elements
|
|
169
|
-
for (var j = 0; j < elements.length - 1; j++) {
|
|
170
|
-
for (var k = j + 1; k < elements.length; k++) {
|
|
171
|
-
if (
|
|
172
|
-
elements[j].key === elements[k].key &&
|
|
173
|
-
elements[j].placement === elements[k].placement
|
|
174
|
-
) {
|
|
175
|
-
throw new TypeError(`Duplicated element (${elements[j].key})`)
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
return { elements, finishers }
|
|
182
|
-
},
|
|
183
|
-
// FromElementDescriptor
|
|
184
|
-
fromElementDescriptor(element /* : ElementDescriptor */) /* : ElementObject */ {
|
|
185
|
-
var obj /* : ElementObject */ = {
|
|
186
|
-
kind: element.kind,
|
|
187
|
-
key: element.key,
|
|
188
|
-
placement: element.placement,
|
|
189
|
-
descriptor: element.descriptor,
|
|
190
|
-
}
|
|
191
|
-
var desc = {
|
|
192
|
-
value: "Descriptor",
|
|
193
|
-
configurable: true,
|
|
194
|
-
}
|
|
195
|
-
Object.defineProperty(obj, Symbol.toStringTag, desc)
|
|
196
|
-
if (element.kind === "field") obj.initializer = element.initializer
|
|
197
|
-
return obj
|
|
198
|
-
},
|
|
199
|
-
// ToElementDescriptors
|
|
200
|
-
toElementDescriptors(elementObjects /* : ElementObject[] */) /* : ElementDescriptor[] */ {
|
|
201
|
-
if (elementObjects === undefined) return
|
|
202
|
-
return toArray(elementObjects).map(function (elementObject) {
|
|
203
|
-
var element = this.toElementDescriptor(elementObject)
|
|
204
|
-
this.disallowProperty(elementObject, "finisher", "An element descriptor")
|
|
205
|
-
this.disallowProperty(elementObject, "extras", "An element descriptor")
|
|
206
|
-
return element
|
|
207
|
-
}, this)
|
|
208
|
-
},
|
|
209
|
-
// ToElementDescriptor
|
|
210
|
-
toElementDescriptor(elementObject /* : ElementObject */) /* : ElementDescriptor */ {
|
|
211
|
-
var kind = String(elementObject.kind)
|
|
212
|
-
if (kind !== "method" && kind !== "field") {
|
|
213
|
-
throw new TypeError(
|
|
214
|
-
`${
|
|
215
|
-
'An element descriptor\'s .kind property must be either "method" or' +
|
|
216
|
-
' "field", but a decorator created an element descriptor with' +
|
|
217
|
-
' .kind "'
|
|
218
|
-
}${kind}"`,
|
|
219
|
-
)
|
|
220
|
-
}
|
|
221
|
-
var key = toPropertyKey(elementObject.key)
|
|
222
|
-
var placement = String(elementObject.placement)
|
|
223
|
-
if (placement !== "static" && placement !== "prototype" && placement !== "own") {
|
|
224
|
-
throw new TypeError(
|
|
225
|
-
`${
|
|
226
|
-
'An element descriptor\'s .placement property must be one of "static",' +
|
|
227
|
-
' "prototype" or "own", but a decorator created an element descriptor' +
|
|
228
|
-
' with .placement "'
|
|
229
|
-
}${placement}"`,
|
|
230
|
-
)
|
|
231
|
-
}
|
|
232
|
-
var descriptor /* : PropertyDescriptor */ = elementObject.descriptor
|
|
233
|
-
this.disallowProperty(elementObject, "elements", "An element descriptor")
|
|
234
|
-
var element /* : ElementDescriptor */ = {
|
|
235
|
-
kind,
|
|
236
|
-
key,
|
|
237
|
-
placement,
|
|
238
|
-
descriptor: Object.assign({}, descriptor),
|
|
239
|
-
}
|
|
240
|
-
if (kind !== "field") {
|
|
241
|
-
this.disallowProperty(elementObject, "initializer", "A method descriptor")
|
|
242
|
-
} else {
|
|
243
|
-
this.disallowProperty(descriptor, "get", "The property descriptor of a field descriptor")
|
|
244
|
-
this.disallowProperty(descriptor, "set", "The property descriptor of a field descriptor")
|
|
245
|
-
this.disallowProperty(descriptor, "value", "The property descriptor of a field descriptor")
|
|
246
|
-
element.initializer = elementObject.initializer
|
|
247
|
-
}
|
|
248
|
-
return element
|
|
249
|
-
},
|
|
250
|
-
toElementFinisherExtras(elementObject /* : ElementObject */) /* : ElementFinisherExtras */ {
|
|
251
|
-
var element /* : ElementDescriptor */ = this.toElementDescriptor(elementObject)
|
|
252
|
-
var finisher /* : ClassFinisher */ = _optionalCallableProperty(elementObject, "finisher")
|
|
253
|
-
var extras /* : ElementDescriptors[] */ = this.toElementDescriptors(elementObject.extras)
|
|
254
|
-
return { element, finisher, extras }
|
|
255
|
-
},
|
|
256
|
-
// FromClassDescriptor
|
|
257
|
-
fromClassDescriptor(elements /* : ElementDescriptor[] */) /* : ClassObject */ {
|
|
258
|
-
var obj = {
|
|
259
|
-
kind: "class",
|
|
260
|
-
elements: elements.map(this.fromElementDescriptor, this),
|
|
261
|
-
}
|
|
262
|
-
var desc = { value: "Descriptor", configurable: true }
|
|
263
|
-
Object.defineProperty(obj, Symbol.toStringTag, desc)
|
|
264
|
-
return obj
|
|
265
|
-
},
|
|
266
|
-
// ToClassDescriptor
|
|
267
|
-
toClassDescriptor(obj /* : ClassObject */) /* : ElementsFinisher */ {
|
|
268
|
-
var kind = String(obj.kind)
|
|
269
|
-
if (kind !== "class") {
|
|
270
|
-
throw new TypeError(
|
|
271
|
-
`${
|
|
272
|
-
'A class descriptor\'s .kind property must be "class", but a decorator' +
|
|
273
|
-
' created a class descriptor with .kind "'
|
|
274
|
-
}${kind}"`,
|
|
275
|
-
)
|
|
276
|
-
}
|
|
277
|
-
this.disallowProperty(obj, "key", "A class descriptor")
|
|
278
|
-
this.disallowProperty(obj, "placement", "A class descriptor")
|
|
279
|
-
this.disallowProperty(obj, "descriptor", "A class descriptor")
|
|
280
|
-
this.disallowProperty(obj, "initializer", "A class descriptor")
|
|
281
|
-
this.disallowProperty(obj, "extras", "A class descriptor")
|
|
282
|
-
var finisher = _optionalCallableProperty(obj, "finisher")
|
|
283
|
-
var elements = this.toElementDescriptors(obj.elements)
|
|
284
|
-
return { elements, finisher }
|
|
285
|
-
},
|
|
286
|
-
// RunClassFinishers
|
|
287
|
-
runClassFinishers(
|
|
288
|
-
constructor /* : Class<*> */,
|
|
289
|
-
finishers /* : ClassFinisher[] */,
|
|
290
|
-
) /* : Class<*> */ {
|
|
291
|
-
for (var i = 0; i < finishers.length; i++) {
|
|
292
|
-
var newConstructor /* : ?Class<*> */ = (0, finishers[i])(constructor)
|
|
293
|
-
if (newConstructor !== undefined) {
|
|
294
|
-
// NOTE: This should check if IsConstructor(newConstructor) is false.
|
|
295
|
-
if (typeof newConstructor !== "function") {
|
|
296
|
-
throw new TypeError("Finishers must return a constructor.")
|
|
297
|
-
}
|
|
298
|
-
constructor = newConstructor
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
return constructor
|
|
302
|
-
},
|
|
303
|
-
disallowProperty(obj, name, objectType) {
|
|
304
|
-
if (obj[name] !== undefined) {
|
|
305
|
-
throw new TypeError(`${objectType} can't have a .${name} property.`)
|
|
306
|
-
}
|
|
307
|
-
},
|
|
308
|
-
}
|
|
309
|
-
_getDecoratorsApi = function () {
|
|
310
|
-
return api
|
|
311
|
-
}
|
|
312
|
-
return api
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
// ClassElementEvaluation
|
|
316
|
-
function _createElementDescriptor(def /* : ElementDefinition */) /* : ElementDescriptor */ {
|
|
317
|
-
var key = toPropertyKey(def.key)
|
|
318
|
-
var descriptor /* : PropertyDescriptor */
|
|
319
|
-
if (def.kind === "method") {
|
|
320
|
-
descriptor = {
|
|
321
|
-
value: def.value,
|
|
322
|
-
writable: true,
|
|
323
|
-
configurable: true,
|
|
324
|
-
enumerable: false,
|
|
325
|
-
}
|
|
326
|
-
} else if (def.kind === "get") {
|
|
327
|
-
descriptor = { get: def.value, configurable: true, enumerable: false }
|
|
328
|
-
} else if (def.kind === "set") {
|
|
329
|
-
descriptor = { set: def.value, configurable: true, enumerable: false }
|
|
330
|
-
} else if (def.kind === "field") {
|
|
331
|
-
descriptor = { configurable: true, writable: true, enumerable: true }
|
|
332
|
-
}
|
|
333
|
-
var element /* : ElementDescriptor */ = {
|
|
334
|
-
kind: def.kind === "field" ? "field" : "method",
|
|
335
|
-
key,
|
|
336
|
-
placement: def.static ? "static" : def.kind === "field" ? "own" : "prototype",
|
|
337
|
-
descriptor,
|
|
338
|
-
}
|
|
339
|
-
if (def.decorators) element.decorators = def.decorators
|
|
340
|
-
if (def.kind === "field") element.initializer = def.value
|
|
341
|
-
return element
|
|
342
|
-
}
|
|
343
|
-
// CoalesceGetterSetter
|
|
344
|
-
function _coalesceGetterSetter(element /* : ElementDescriptor */, other /* : ElementDescriptor */) {
|
|
345
|
-
if (element.descriptor.get !== undefined) {
|
|
346
|
-
other.descriptor.get = element.descriptor.get
|
|
347
|
-
} else {
|
|
348
|
-
other.descriptor.set = element.descriptor.set
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
// CoalesceClassElements
|
|
352
|
-
function _coalesceClassElements(elements /* : ElementDescriptor[] */) /* : ElementDescriptor[] */ {
|
|
353
|
-
var newElements /* : ElementDescriptor[] */ = []
|
|
354
|
-
var isSameElement = function (other /* : ElementDescriptor */) /* : boolean */ {
|
|
355
|
-
return (
|
|
356
|
-
other.kind === "method" && other.key === element.key && other.placement === element.placement
|
|
357
|
-
)
|
|
358
|
-
}
|
|
359
|
-
for (var i = 0; i < elements.length; i++) {
|
|
360
|
-
var element /* : ElementDescriptor */ = elements[i]
|
|
361
|
-
var other /* : ElementDescriptor */
|
|
362
|
-
if (element.kind === "method" && (other = newElements.find(isSameElement))) {
|
|
363
|
-
if (_isDataDescriptor(element.descriptor) || _isDataDescriptor(other.descriptor)) {
|
|
364
|
-
if (_hasDecorators(element) || _hasDecorators(other)) {
|
|
365
|
-
throw new ReferenceError(`Duplicated methods (${element.key}) can't be decorated.`)
|
|
366
|
-
}
|
|
367
|
-
other.descriptor = element.descriptor
|
|
368
|
-
} else {
|
|
369
|
-
if (_hasDecorators(element)) {
|
|
370
|
-
if (_hasDecorators(other)) {
|
|
371
|
-
throw new ReferenceError(
|
|
372
|
-
`${
|
|
373
|
-
"Decorators can't be placed on different accessors with for " +
|
|
374
|
-
"the same property ("
|
|
375
|
-
}${element.key}).`,
|
|
376
|
-
)
|
|
377
|
-
}
|
|
378
|
-
other.decorators = element.decorators
|
|
379
|
-
}
|
|
380
|
-
_coalesceGetterSetter(element, other)
|
|
381
|
-
}
|
|
382
|
-
} else {
|
|
383
|
-
newElements.push(element)
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
return newElements
|
|
387
|
-
}
|
|
388
|
-
function _hasDecorators(element /* : ElementDescriptor */) /* : boolean */ {
|
|
389
|
-
return element.decorators && element.decorators.length
|
|
390
|
-
}
|
|
391
|
-
function _isDataDescriptor(desc /* : PropertyDescriptor */) /* : boolean */ {
|
|
392
|
-
return desc !== undefined && !(desc.value === undefined && desc.writable === undefined)
|
|
393
|
-
}
|
|
394
|
-
function _optionalCallableProperty /* ::<T>*/(
|
|
395
|
-
obj /* : T */,
|
|
396
|
-
name /* : $Keys<T> */,
|
|
397
|
-
) /* : ?Function */ {
|
|
398
|
-
var value = obj[name]
|
|
399
|
-
if (value !== undefined && typeof value !== "function") {
|
|
400
|
-
throw new TypeError(`Expected '${name}' to be a function`)
|
|
401
|
-
}
|
|
402
|
-
return value
|
|
403
|
-
}
|
|
1
|
+
/* eslint-disable block-scoped-var */
|
|
2
|
+
/* eslint-disable no-nested-ternary */
|
|
3
|
+
/* eslint-disable no-negated-condition */
|
|
4
|
+
/* eslint-disable consistent-return */
|
|
5
|
+
/* eslint-disable prefer-spread */
|
|
6
|
+
/* eslint-disable no-void */
|
|
7
|
+
/* eslint-disable no-sequences */
|
|
8
|
+
import toArray from "../toArray/toArray.js"
|
|
9
|
+
import toPropertyKey from "../toPropertyKey/toPropertyKey.js"
|
|
10
|
+
|
|
11
|
+
// ClassDefinitionEvaluation (Steps 26-*)
|
|
12
|
+
export default function _decorate(
|
|
13
|
+
decorators /* : ClassDecorator[] */,
|
|
14
|
+
factory /* : ClassFactory */,
|
|
15
|
+
superClass /* : ?Class<*> */,
|
|
16
|
+
mixins /* : ?Array<Function> */,
|
|
17
|
+
) /* : Class<*> */ {
|
|
18
|
+
var api = _getDecoratorsApi()
|
|
19
|
+
if (mixins) {
|
|
20
|
+
for (var i = 0; i < mixins.length; i++) {
|
|
21
|
+
api = mixins[i](api)
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
var r = factory(function initialize(O) {
|
|
25
|
+
api.initializeInstanceElements(O, decorated.elements)
|
|
26
|
+
}, superClass)
|
|
27
|
+
var decorated = api.decorateClass(
|
|
28
|
+
_coalesceClassElements(r.d.map(_createElementDescriptor)),
|
|
29
|
+
decorators,
|
|
30
|
+
)
|
|
31
|
+
api.initializeClassElements(r.F, decorated.elements)
|
|
32
|
+
return api.runClassFinishers(r.F, decorated.finishers)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
var _getDecoratorsApi = function () {
|
|
36
|
+
var api = {
|
|
37
|
+
elementsDefinitionOrder: [["method"], ["field"]],
|
|
38
|
+
// InitializeInstanceElements
|
|
39
|
+
initializeInstanceElements(/* ::<C>*/ O /* : C */, elements /* : ElementDescriptor[] */) {
|
|
40
|
+
;["method", "field"].forEach(function (kind) {
|
|
41
|
+
elements.forEach(function (element /* : ElementDescriptor */) {
|
|
42
|
+
if (element.kind === kind && element.placement === "own") {
|
|
43
|
+
this.defineClassElement(O, element)
|
|
44
|
+
}
|
|
45
|
+
}, this)
|
|
46
|
+
}, this)
|
|
47
|
+
},
|
|
48
|
+
// InitializeClassElements
|
|
49
|
+
initializeClassElements(/* ::<C>*/ F /* : Class<C> */, elements /* : ElementDescriptor[] */) {
|
|
50
|
+
var proto = F.prototype
|
|
51
|
+
;["method", "field"].forEach(function (kind) {
|
|
52
|
+
elements.forEach(function (element /* : ElementDescriptor */) {
|
|
53
|
+
var placement = element.placement
|
|
54
|
+
if (element.kind === kind && (placement === "static" || placement === "prototype")) {
|
|
55
|
+
var receiver = placement === "static" ? F : proto
|
|
56
|
+
this.defineClassElement(receiver, element)
|
|
57
|
+
}
|
|
58
|
+
}, this)
|
|
59
|
+
}, this)
|
|
60
|
+
},
|
|
61
|
+
// DefineClassElement
|
|
62
|
+
defineClassElement(
|
|
63
|
+
/* ::<C>*/ receiver /* : C | Class<C> */,
|
|
64
|
+
element /* : ElementDescriptor */,
|
|
65
|
+
) {
|
|
66
|
+
var descriptor /* : PropertyDescriptor */ = element.descriptor
|
|
67
|
+
if (element.kind === "field") {
|
|
68
|
+
var initializer = element.initializer
|
|
69
|
+
descriptor = {
|
|
70
|
+
enumerable: descriptor.enumerable,
|
|
71
|
+
writable: descriptor.writable,
|
|
72
|
+
configurable: descriptor.configurable,
|
|
73
|
+
value: initializer === void 0 ? void 0 : initializer.call(receiver),
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
Object.defineProperty(receiver, element.key, descriptor)
|
|
77
|
+
},
|
|
78
|
+
// DecorateClass
|
|
79
|
+
decorateClass(
|
|
80
|
+
elements /* : ElementDescriptor[] */,
|
|
81
|
+
decorators /* : ClassDecorator[] */,
|
|
82
|
+
) /* : ElementsFinishers */ {
|
|
83
|
+
var newElements /* : ElementDescriptor[] */ = []
|
|
84
|
+
var finishers /* : ClassFinisher[] */ = []
|
|
85
|
+
var placements /* : Placements */ = {
|
|
86
|
+
static: [],
|
|
87
|
+
prototype: [],
|
|
88
|
+
own: [],
|
|
89
|
+
}
|
|
90
|
+
elements.forEach(function (element /* : ElementDescriptor */) {
|
|
91
|
+
this.addElementPlacement(element, placements)
|
|
92
|
+
}, this)
|
|
93
|
+
elements.forEach(function (element /* : ElementDescriptor */) {
|
|
94
|
+
if (!_hasDecorators(element)) return newElements.push(element)
|
|
95
|
+
var elementFinishersExtras /* : ElementFinishersExtras */ = this.decorateElement(
|
|
96
|
+
element,
|
|
97
|
+
placements,
|
|
98
|
+
)
|
|
99
|
+
newElements.push(elementFinishersExtras.element)
|
|
100
|
+
newElements.push.apply(newElements, elementFinishersExtras.extras)
|
|
101
|
+
finishers.push.apply(finishers, elementFinishersExtras.finishers)
|
|
102
|
+
}, this)
|
|
103
|
+
if (!decorators) {
|
|
104
|
+
return { elements: newElements, finishers }
|
|
105
|
+
}
|
|
106
|
+
var result /* : ElementsFinishers */ = this.decorateConstructor(newElements, decorators)
|
|
107
|
+
finishers.push.apply(finishers, result.finishers)
|
|
108
|
+
result.finishers = finishers
|
|
109
|
+
return result
|
|
110
|
+
},
|
|
111
|
+
// AddElementPlacement
|
|
112
|
+
addElementPlacement(
|
|
113
|
+
element /* : ElementDescriptor */,
|
|
114
|
+
placements /* : Placements */,
|
|
115
|
+
silent /* : boolean */,
|
|
116
|
+
) {
|
|
117
|
+
var keys = placements[element.placement]
|
|
118
|
+
if (!silent && keys.indexOf(element.key) !== -1) {
|
|
119
|
+
throw new TypeError(`Duplicated element (${element.key})`)
|
|
120
|
+
}
|
|
121
|
+
keys.push(element.key)
|
|
122
|
+
},
|
|
123
|
+
// DecorateElement
|
|
124
|
+
decorateElement(
|
|
125
|
+
element /* : ElementDescriptor */,
|
|
126
|
+
placements /* : Placements */,
|
|
127
|
+
) /* : ElementFinishersExtras */ {
|
|
128
|
+
var extras /* : ElementDescriptor[] */ = []
|
|
129
|
+
var finishers /* : ClassFinisher[] */ = []
|
|
130
|
+
for (var decorators = element.decorators, i = decorators.length - 1; i >= 0; i--) {
|
|
131
|
+
// (inlined) RemoveElementPlacement
|
|
132
|
+
var keys = placements[element.placement]
|
|
133
|
+
keys.splice(keys.indexOf(element.key), 1)
|
|
134
|
+
var elementObject /* : ElementObjectInput */ = this.fromElementDescriptor(element)
|
|
135
|
+
var elementFinisherExtras /* : ElementFinisherExtras */ = this.toElementFinisherExtras(
|
|
136
|
+
(0, decorators[i])(elementObject) /* : ElementObjectOutput */ || elementObject,
|
|
137
|
+
)
|
|
138
|
+
element = elementFinisherExtras.element
|
|
139
|
+
this.addElementPlacement(element, placements)
|
|
140
|
+
if (elementFinisherExtras.finisher) {
|
|
141
|
+
finishers.push(elementFinisherExtras.finisher)
|
|
142
|
+
}
|
|
143
|
+
var newExtras /* : ElementDescriptor[] | void */ = elementFinisherExtras.extras
|
|
144
|
+
if (newExtras) {
|
|
145
|
+
for (var j = 0; j < newExtras.length; j++) {
|
|
146
|
+
this.addElementPlacement(newExtras[j], placements)
|
|
147
|
+
}
|
|
148
|
+
extras.push.apply(extras, newExtras)
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return { element, finishers, extras }
|
|
152
|
+
},
|
|
153
|
+
// DecorateConstructor
|
|
154
|
+
decorateConstructor(
|
|
155
|
+
elements /* : ElementDescriptor[] */,
|
|
156
|
+
decorators /* : ClassDecorator[] */,
|
|
157
|
+
) /* : ElementsFinishers */ {
|
|
158
|
+
var finishers /* : ClassFinisher[] */ = []
|
|
159
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
160
|
+
var obj /* : ClassObject */ = this.fromClassDescriptor(elements)
|
|
161
|
+
var elementsAndFinisher /* : ElementsFinisher */ = this.toClassDescriptor(
|
|
162
|
+
(0, decorators[i])(obj) /* : ClassObject */ || obj,
|
|
163
|
+
)
|
|
164
|
+
if (elementsAndFinisher.finisher !== undefined) {
|
|
165
|
+
finishers.push(elementsAndFinisher.finisher)
|
|
166
|
+
}
|
|
167
|
+
if (elementsAndFinisher.elements !== undefined) {
|
|
168
|
+
elements = elementsAndFinisher.elements
|
|
169
|
+
for (var j = 0; j < elements.length - 1; j++) {
|
|
170
|
+
for (var k = j + 1; k < elements.length; k++) {
|
|
171
|
+
if (
|
|
172
|
+
elements[j].key === elements[k].key &&
|
|
173
|
+
elements[j].placement === elements[k].placement
|
|
174
|
+
) {
|
|
175
|
+
throw new TypeError(`Duplicated element (${elements[j].key})`)
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return { elements, finishers }
|
|
182
|
+
},
|
|
183
|
+
// FromElementDescriptor
|
|
184
|
+
fromElementDescriptor(element /* : ElementDescriptor */) /* : ElementObject */ {
|
|
185
|
+
var obj /* : ElementObject */ = {
|
|
186
|
+
kind: element.kind,
|
|
187
|
+
key: element.key,
|
|
188
|
+
placement: element.placement,
|
|
189
|
+
descriptor: element.descriptor,
|
|
190
|
+
}
|
|
191
|
+
var desc = {
|
|
192
|
+
value: "Descriptor",
|
|
193
|
+
configurable: true,
|
|
194
|
+
}
|
|
195
|
+
Object.defineProperty(obj, Symbol.toStringTag, desc)
|
|
196
|
+
if (element.kind === "field") obj.initializer = element.initializer
|
|
197
|
+
return obj
|
|
198
|
+
},
|
|
199
|
+
// ToElementDescriptors
|
|
200
|
+
toElementDescriptors(elementObjects /* : ElementObject[] */) /* : ElementDescriptor[] */ {
|
|
201
|
+
if (elementObjects === undefined) return
|
|
202
|
+
return toArray(elementObjects).map(function (elementObject) {
|
|
203
|
+
var element = this.toElementDescriptor(elementObject)
|
|
204
|
+
this.disallowProperty(elementObject, "finisher", "An element descriptor")
|
|
205
|
+
this.disallowProperty(elementObject, "extras", "An element descriptor")
|
|
206
|
+
return element
|
|
207
|
+
}, this)
|
|
208
|
+
},
|
|
209
|
+
// ToElementDescriptor
|
|
210
|
+
toElementDescriptor(elementObject /* : ElementObject */) /* : ElementDescriptor */ {
|
|
211
|
+
var kind = String(elementObject.kind)
|
|
212
|
+
if (kind !== "method" && kind !== "field") {
|
|
213
|
+
throw new TypeError(
|
|
214
|
+
`${
|
|
215
|
+
'An element descriptor\'s .kind property must be either "method" or' +
|
|
216
|
+
' "field", but a decorator created an element descriptor with' +
|
|
217
|
+
' .kind "'
|
|
218
|
+
}${kind}"`,
|
|
219
|
+
)
|
|
220
|
+
}
|
|
221
|
+
var key = toPropertyKey(elementObject.key)
|
|
222
|
+
var placement = String(elementObject.placement)
|
|
223
|
+
if (placement !== "static" && placement !== "prototype" && placement !== "own") {
|
|
224
|
+
throw new TypeError(
|
|
225
|
+
`${
|
|
226
|
+
'An element descriptor\'s .placement property must be one of "static",' +
|
|
227
|
+
' "prototype" or "own", but a decorator created an element descriptor' +
|
|
228
|
+
' with .placement "'
|
|
229
|
+
}${placement}"`,
|
|
230
|
+
)
|
|
231
|
+
}
|
|
232
|
+
var descriptor /* : PropertyDescriptor */ = elementObject.descriptor
|
|
233
|
+
this.disallowProperty(elementObject, "elements", "An element descriptor")
|
|
234
|
+
var element /* : ElementDescriptor */ = {
|
|
235
|
+
kind,
|
|
236
|
+
key,
|
|
237
|
+
placement,
|
|
238
|
+
descriptor: Object.assign({}, descriptor),
|
|
239
|
+
}
|
|
240
|
+
if (kind !== "field") {
|
|
241
|
+
this.disallowProperty(elementObject, "initializer", "A method descriptor")
|
|
242
|
+
} else {
|
|
243
|
+
this.disallowProperty(descriptor, "get", "The property descriptor of a field descriptor")
|
|
244
|
+
this.disallowProperty(descriptor, "set", "The property descriptor of a field descriptor")
|
|
245
|
+
this.disallowProperty(descriptor, "value", "The property descriptor of a field descriptor")
|
|
246
|
+
element.initializer = elementObject.initializer
|
|
247
|
+
}
|
|
248
|
+
return element
|
|
249
|
+
},
|
|
250
|
+
toElementFinisherExtras(elementObject /* : ElementObject */) /* : ElementFinisherExtras */ {
|
|
251
|
+
var element /* : ElementDescriptor */ = this.toElementDescriptor(elementObject)
|
|
252
|
+
var finisher /* : ClassFinisher */ = _optionalCallableProperty(elementObject, "finisher")
|
|
253
|
+
var extras /* : ElementDescriptors[] */ = this.toElementDescriptors(elementObject.extras)
|
|
254
|
+
return { element, finisher, extras }
|
|
255
|
+
},
|
|
256
|
+
// FromClassDescriptor
|
|
257
|
+
fromClassDescriptor(elements /* : ElementDescriptor[] */) /* : ClassObject */ {
|
|
258
|
+
var obj = {
|
|
259
|
+
kind: "class",
|
|
260
|
+
elements: elements.map(this.fromElementDescriptor, this),
|
|
261
|
+
}
|
|
262
|
+
var desc = { value: "Descriptor", configurable: true }
|
|
263
|
+
Object.defineProperty(obj, Symbol.toStringTag, desc)
|
|
264
|
+
return obj
|
|
265
|
+
},
|
|
266
|
+
// ToClassDescriptor
|
|
267
|
+
toClassDescriptor(obj /* : ClassObject */) /* : ElementsFinisher */ {
|
|
268
|
+
var kind = String(obj.kind)
|
|
269
|
+
if (kind !== "class") {
|
|
270
|
+
throw new TypeError(
|
|
271
|
+
`${
|
|
272
|
+
'A class descriptor\'s .kind property must be "class", but a decorator' +
|
|
273
|
+
' created a class descriptor with .kind "'
|
|
274
|
+
}${kind}"`,
|
|
275
|
+
)
|
|
276
|
+
}
|
|
277
|
+
this.disallowProperty(obj, "key", "A class descriptor")
|
|
278
|
+
this.disallowProperty(obj, "placement", "A class descriptor")
|
|
279
|
+
this.disallowProperty(obj, "descriptor", "A class descriptor")
|
|
280
|
+
this.disallowProperty(obj, "initializer", "A class descriptor")
|
|
281
|
+
this.disallowProperty(obj, "extras", "A class descriptor")
|
|
282
|
+
var finisher = _optionalCallableProperty(obj, "finisher")
|
|
283
|
+
var elements = this.toElementDescriptors(obj.elements)
|
|
284
|
+
return { elements, finisher }
|
|
285
|
+
},
|
|
286
|
+
// RunClassFinishers
|
|
287
|
+
runClassFinishers(
|
|
288
|
+
constructor /* : Class<*> */,
|
|
289
|
+
finishers /* : ClassFinisher[] */,
|
|
290
|
+
) /* : Class<*> */ {
|
|
291
|
+
for (var i = 0; i < finishers.length; i++) {
|
|
292
|
+
var newConstructor /* : ?Class<*> */ = (0, finishers[i])(constructor)
|
|
293
|
+
if (newConstructor !== undefined) {
|
|
294
|
+
// NOTE: This should check if IsConstructor(newConstructor) is false.
|
|
295
|
+
if (typeof newConstructor !== "function") {
|
|
296
|
+
throw new TypeError("Finishers must return a constructor.")
|
|
297
|
+
}
|
|
298
|
+
constructor = newConstructor
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
return constructor
|
|
302
|
+
},
|
|
303
|
+
disallowProperty(obj, name, objectType) {
|
|
304
|
+
if (obj[name] !== undefined) {
|
|
305
|
+
throw new TypeError(`${objectType} can't have a .${name} property.`)
|
|
306
|
+
}
|
|
307
|
+
},
|
|
308
|
+
}
|
|
309
|
+
_getDecoratorsApi = function () {
|
|
310
|
+
return api
|
|
311
|
+
}
|
|
312
|
+
return api
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// ClassElementEvaluation
|
|
316
|
+
function _createElementDescriptor(def /* : ElementDefinition */) /* : ElementDescriptor */ {
|
|
317
|
+
var key = toPropertyKey(def.key)
|
|
318
|
+
var descriptor /* : PropertyDescriptor */
|
|
319
|
+
if (def.kind === "method") {
|
|
320
|
+
descriptor = {
|
|
321
|
+
value: def.value,
|
|
322
|
+
writable: true,
|
|
323
|
+
configurable: true,
|
|
324
|
+
enumerable: false,
|
|
325
|
+
}
|
|
326
|
+
} else if (def.kind === "get") {
|
|
327
|
+
descriptor = { get: def.value, configurable: true, enumerable: false }
|
|
328
|
+
} else if (def.kind === "set") {
|
|
329
|
+
descriptor = { set: def.value, configurable: true, enumerable: false }
|
|
330
|
+
} else if (def.kind === "field") {
|
|
331
|
+
descriptor = { configurable: true, writable: true, enumerable: true }
|
|
332
|
+
}
|
|
333
|
+
var element /* : ElementDescriptor */ = {
|
|
334
|
+
kind: def.kind === "field" ? "field" : "method",
|
|
335
|
+
key,
|
|
336
|
+
placement: def.static ? "static" : def.kind === "field" ? "own" : "prototype",
|
|
337
|
+
descriptor,
|
|
338
|
+
}
|
|
339
|
+
if (def.decorators) element.decorators = def.decorators
|
|
340
|
+
if (def.kind === "field") element.initializer = def.value
|
|
341
|
+
return element
|
|
342
|
+
}
|
|
343
|
+
// CoalesceGetterSetter
|
|
344
|
+
function _coalesceGetterSetter(element /* : ElementDescriptor */, other /* : ElementDescriptor */) {
|
|
345
|
+
if (element.descriptor.get !== undefined) {
|
|
346
|
+
other.descriptor.get = element.descriptor.get
|
|
347
|
+
} else {
|
|
348
|
+
other.descriptor.set = element.descriptor.set
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
// CoalesceClassElements
|
|
352
|
+
function _coalesceClassElements(elements /* : ElementDescriptor[] */) /* : ElementDescriptor[] */ {
|
|
353
|
+
var newElements /* : ElementDescriptor[] */ = []
|
|
354
|
+
var isSameElement = function (other /* : ElementDescriptor */) /* : boolean */ {
|
|
355
|
+
return (
|
|
356
|
+
other.kind === "method" && other.key === element.key && other.placement === element.placement
|
|
357
|
+
)
|
|
358
|
+
}
|
|
359
|
+
for (var i = 0; i < elements.length; i++) {
|
|
360
|
+
var element /* : ElementDescriptor */ = elements[i]
|
|
361
|
+
var other /* : ElementDescriptor */
|
|
362
|
+
if (element.kind === "method" && (other = newElements.find(isSameElement))) {
|
|
363
|
+
if (_isDataDescriptor(element.descriptor) || _isDataDescriptor(other.descriptor)) {
|
|
364
|
+
if (_hasDecorators(element) || _hasDecorators(other)) {
|
|
365
|
+
throw new ReferenceError(`Duplicated methods (${element.key}) can't be decorated.`)
|
|
366
|
+
}
|
|
367
|
+
other.descriptor = element.descriptor
|
|
368
|
+
} else {
|
|
369
|
+
if (_hasDecorators(element)) {
|
|
370
|
+
if (_hasDecorators(other)) {
|
|
371
|
+
throw new ReferenceError(
|
|
372
|
+
`${
|
|
373
|
+
"Decorators can't be placed on different accessors with for " +
|
|
374
|
+
"the same property ("
|
|
375
|
+
}${element.key}).`,
|
|
376
|
+
)
|
|
377
|
+
}
|
|
378
|
+
other.decorators = element.decorators
|
|
379
|
+
}
|
|
380
|
+
_coalesceGetterSetter(element, other)
|
|
381
|
+
}
|
|
382
|
+
} else {
|
|
383
|
+
newElements.push(element)
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
return newElements
|
|
387
|
+
}
|
|
388
|
+
function _hasDecorators(element /* : ElementDescriptor */) /* : boolean */ {
|
|
389
|
+
return element.decorators && element.decorators.length
|
|
390
|
+
}
|
|
391
|
+
function _isDataDescriptor(desc /* : PropertyDescriptor */) /* : boolean */ {
|
|
392
|
+
return desc !== undefined && !(desc.value === undefined && desc.writable === undefined)
|
|
393
|
+
}
|
|
394
|
+
function _optionalCallableProperty /* ::<T>*/(
|
|
395
|
+
obj /* : T */,
|
|
396
|
+
name /* : $Keys<T> */,
|
|
397
|
+
) /* : ?Function */ {
|
|
398
|
+
var value = obj[name]
|
|
399
|
+
if (value !== undefined && typeof value !== "function") {
|
|
400
|
+
throw new TypeError(`Expected '${name}' to be a function`)
|
|
401
|
+
}
|
|
402
|
+
return value
|
|
403
|
+
}
|