await-ns-define-own-property.js (7088B)
1 // |reftest| async 2 // This file was procedurally generated from the following sources: 3 // - src/dynamic-import/ns-define-own-property.case 4 // - src/dynamic-import/namespace/await.template 5 /*--- 6 description: The [[DefineOwnProperty]] internal method returns `true` if no change is requested, and `false` otherwise. (value from await resolving) 7 esid: sec-finishdynamicimport 8 features: [Symbol.iterator, Reflect, Symbol, Symbol.toStringTag, dynamic-import] 9 flags: [generated, async] 10 info: | 11 Runtime Semantics: FinishDynamicImport ( referencingScriptOrModule, specifier, promiseCapability, completion ) 12 13 1. If completion is an abrupt completion, ... 14 2. Otherwise, 15 ... 16 d. Let namespace be GetModuleNamespace(moduleRecord). 17 e. If namespace is an abrupt completion, perform ! Call(promiseCapability.[[Reject]], undefined, « namespace.[[Value]] »). 18 f. Otherwise, perform ! Call(promiseCapability.[[Resolve]], undefined, « namespace.[[Value]] »). 19 20 Runtime Semantics: GetModuleNamespace ( module ) 21 22 ... 23 3. Let namespace be module.[[Namespace]]. 24 4. If namespace is undefined, then 25 a. Let exportedNames be ? module.GetExportedNames(« »). 26 b. Let unambiguousNames be a new empty List. 27 c. For each name that is an element of exportedNames, do 28 i. Let resolution be ? module.ResolveExport(name, « »). 29 ii. If resolution is a ResolvedBinding Record, append name to unambiguousNames. 30 d. Set namespace to ModuleNamespaceCreate(module, unambiguousNames). 31 5. Return namespace. 32 33 ModuleNamespaceCreate ( module, exports ) 34 35 ... 36 4. Let M be a newly created object. 37 5. Set M's essential internal methods to the definitions specified in 9.4.6. 38 7. Let sortedExports be a new List containing the same values as the list exports where the 39 values are ordered as if an Array of the same values had been sorted using Array.prototype.sort 40 using undefined as comparefn. 41 8. Set M.[[Exports]] to sortedExports. 42 9. Create own properties of M corresponding to the definitions in 26.3. 43 10. Set module.[[Namespace]] to M. 44 11. Return M. 45 46 26.3 Module Namespace Objects 47 48 A Module Namespace Object is a module namespace exotic object that provides runtime 49 property-based access to a module's exported bindings. There is no constructor function for 50 Module Namespace Objects. Instead, such an object is created for each module that is imported 51 by an ImportDeclaration that includes a NameSpaceImport. 52 53 In addition to the properties specified in 9.4.6 each Module Namespace Object has the 54 following own property: 55 56 26.3.1 @@toStringTag 57 58 The initial value of the @@toStringTag property is the String value "Module". 59 60 This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }. 61 62 Module Namespace Exotic Objects 63 64 A module namespace object is an exotic object that exposes the bindings exported from an 65 ECMAScript Module (See 15.2.3). There is a one-to-one correspondence between the String-keyed 66 own properties of a module namespace exotic object and the binding names exported by the 67 Module. The exported bindings include any bindings that are indirectly exported using export * 68 export items. Each String-valued own property key is the StringValue of the corresponding 69 exported binding name. These are the only String-keyed properties of a module namespace exotic 70 object. Each such property has the attributes { [[Writable]]: true, [[Enumerable]]: true, 71 [[Configurable]]: false }. Module namespace objects are not extensible. 72 73 ---*/ 74 var sym = Symbol('test262'); 75 76 const exported = ['local1', 'renamed', 'indirect']; 77 78 79 async function fn() { 80 const ns = await import('./define-own-property_FIXTURE.js'); 81 82 // Non-existant properties. 83 84 for (const key of ['local2', 0, sym, Symbol.iterator]) { 85 assert.sameValue( 86 Reflect.defineProperty(ns, key, {}), 87 false, 88 'Reflect.defineProperty: ' + key.toString() 89 ); 90 assert.throws(TypeError, function() { 91 Object.defineProperty(ns, key, {}); 92 }, 'Object.defineProperty: ' + key.toString()); 93 } 94 95 // Own properties. No change requested. 96 97 for (const key of ([...exported, Symbol.toStringTag])) { 98 assert.sameValue( 99 Reflect.defineProperty(ns, key, {}), 100 true, 101 `No change requested, Reflect.defineProperty: ${key.toString()}` 102 ); 103 assert.sameValue( 104 Object.defineProperty(ns, key, {}), 105 ns, 106 `No change requested, Object.defineProperty: ${key.toString()}` 107 ); 108 109 } 110 111 assert.sameValue( 112 Reflect.defineProperty(ns, 'indirect', 113 {writable: true, enumerable: true, configurable: false}), 114 true, 115 'Reflect.defineProperty: indirect' 116 ); 117 assert.sameValue( 118 Object.defineProperty(ns, 'indirect', 119 {writable: true, enumerable: true, configurable: false}), 120 ns, 121 'Object.defineProperty: indirect' 122 ); 123 124 assert.sameValue( 125 Reflect.defineProperty(ns, Symbol.toStringTag, 126 {value: "Module", writable: false, enumerable: false, 127 configurable: false}), 128 true, 129 'Reflect.defineProperty: Symbol.toStringTag' 130 ); 131 assert.sameValue( 132 Object.defineProperty(ns, Symbol.toStringTag, 133 {value: "Module", writable: false, enumerable: false, 134 configurable: false}), 135 ns, 136 'Object.defineProperty: Symbol.toStringTag' 137 ); 138 139 140 // Own properties. Change requested. 141 142 for (const key of ([...exported, Symbol.toStringTag])) { 143 assert.sameValue( 144 Reflect.defineProperty(ns, key, {value: 123}), 145 false, 146 `Change requested, Reflect.defineProperty: ${key.toString()}` 147 ); 148 assert.throws(TypeError, function() { 149 Object.defineProperty(ns, key, {value: 123}); 150 }, `Change requested, Object.defineProperty: ${key.toString()}`); 151 } 152 153 assert.sameValue( 154 Reflect.defineProperty(ns, 'indirect', 155 {writable: true, enumerable: true, configurable: true}), 156 false, 157 'Reflect.defineProperty: indirect' 158 ); 159 assert.throws(TypeError, function() { 160 Object.defineProperty(ns, 'indirect', 161 {writable: true, enumerable: true, configurable: true}); 162 }, 'Object.defineProperty: indirect'); 163 164 assert.sameValue( 165 Reflect.defineProperty(ns, Symbol.toStringTag, 166 {value: "module", writable: false, enumerable: false, 167 configurable: false}), 168 false, 169 'Reflect.defineProperty: Symbol.toStringTag' 170 ); 171 assert.throws(TypeError, function() { 172 Object.defineProperty(ns, Symbol.toStringTag, 173 {value: "module", writable: false, enumerable: false, 174 configurable: false}); 175 }, 'Object.defineProperty: Symbol.toStringTag'); 176 } 177 178 fn().then($DONE, $DONE).catch($DONE);