| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1,3 +1,9 @@ | |||
| 1 | + 0.5.2 | ||
| 2 | + - Support named getter functions (https://github.com/guybedford/cjs-module-lexer/pull/26) | ||
| 3 | + | ||
| 4 | + 0.5.1: | ||
| 5 | + - Feature: Implement specific reexport getter forms (https://github.com/guybedford/cjs-module-lexer/pull/25) | ||
| 6 | + | ||
| 1 | 7 | 0.5.0 | |
| 2 | 8 | - Breaking Change: No longer emit Object.defineProperty exports (https://github.com/guybedford/cjs-module-lexer/pull/24) | |
| 3 | 9 | - Doc: Update link to WASI SDK (https://github.com/guybedford/cjs-module-lexer/pull/19) | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -70,31 +70,35 @@ STRING_LITERAL: A `"` or `'` bounded ECMA-262 string literal. | |||
| 70 | 70 | ||
| 71 | 71 | IDENTIFIER_STRING: ( `"` IDENTIFIER `"` | `'` IDENTIFIER `'` ) | |
| 72 | 72 | ||
| 73 | - COMMENT_SPACE: Any ECMA-262 whitespace, ECMA-262 block comment or ECMA-262 line comment | ||
| 74 | - | ||
| 75 | - MODULE_EXPORTS: `module` COMMENT_SPACE `.` COMMENT_SPACE `exports` | ||
| 73 | + MODULE_EXPORTS: `module` `.` `exports` | ||
| 76 | 74 | ||
| 77 | 75 | EXPORTS_IDENTIFIER: MODULE_EXPORTS_IDENTIFIER | `exports` | |
| 78 | 76 | ||
| 79 | - EXPORTS_DOT_ASSIGN: EXPORTS_IDENTIFIER COMMENT_SPACE `.` COMMENT_SPACE IDENTIFIER COMMENT_SPACE `=` | ||
| 77 | + EXPORTS_DOT_ASSIGN: EXPORTS_IDENTIFIER `.` IDENTIFIER `=` | ||
| 80 | 78 | ||
| 81 | - EXPORTS_LITERAL_COMPUTED_ASSIGN: EXPORTS_IDENTIFIER COMMENT_SPACE `[` COMMENT_SPACE IDENTIFIER_STRING COMMENT_SPACE `]` COMMENT_SPACE `=` | ||
| 79 | + EXPORTS_LITERAL_COMPUTED_ASSIGN: EXPORTS_IDENTIFIER `[` IDENTIFIER_STRING `]` `=` | ||
| 82 | 80 | ||
| 83 | - EXPORTS_LITERAL_PROP: (IDENTIFIER (COMMENT_SPACE `:` COMMENT_SPACE IDENTIFIER)?) | (IDENTIFIER_STRING COMMENT_SPACE `:` COMMENT_SPACE IDENTIFIER) | ||
| 81 | + EXPORTS_LITERAL_PROP: (IDENTIFIER `:` IDENTIFIER)?) | (IDENTIFIER_STRING `:` IDENTIFIER) | ||
| 84 | 82 | ||
| 85 | - EXPORTS_SPREAD: `...` COMMENT_SPACE (IDENTIFIER | REQUIRE) | ||
| 83 | + EXPORTS_SPREAD: `...` (IDENTIFIER | REQUIRE) | ||
| 86 | 84 | ||
| 87 | 85 | EXPORTS_MEMBER: EXPORTS_DOT_ASSIGN | EXPORTS_LITERAL_COMPUTED_ASSIGN | |
| 88 | 86 | ||
| 89 | - ES_MODULE_DEFINE: `Object` COMMENT_SPACE `.` COMMENT_SPACE `defineProperty COMMENT_SPACE `(` COMMENT_SPACE `__esModule` COMMENT_SPACE `,` COMMENT_SPACE IDENTIFIER_STRING | ||
| 87 | + EXPORTS_DEFINE: `Object` `.` `defineProperty `(` IDENTIFIER_STRING `, {` | ||
| 88 | + (`enumerable: true,`)? | ||
| 89 | + ( | ||
| 90 | + `value:` | | ||
| 91 | + `get` (`: function` IDENTIFIER? )? `()` {` return IDENTIFIER (`.` IDENTIFIER | `[` IDENTIFIER_STRING `]`)? `;`? `}` | ||
| 92 | + ) | ||
| 93 | + `})` | ||
| 90 | 94 | ||
| 91 | - EXPORTS_LITERAL: MODULE_EXPORTS COMMENT_SPACE `=` COMMENT_SPACE `{` COMMENT_SPACE (EXPORTS_LITERAL_PROP | EXPORTS_SPREAD) COMMENT_SPACE `,` COMMENT_SPACE)+ `}` | ||
| 95 | + EXPORTS_LITERAL: MODULE_EXPORTS `=` `{` (EXPORTS_LITERAL_PROP | EXPORTS_SPREAD) `,`)+ `}` | ||
| 92 | 96 | ||
| 93 | - REQUIRE: `require` COMMENT_SPACE `(` COMMENT_SPACE STRING_LITERAL COMMENT_SPACE `)` | ||
| 97 | + REQUIRE: `require` `(` STRING_LITERAL `)` | ||
| 94 | 98 | ||
| 95 | 99 | EXPORTS_ASSIGN: (`var` | `const` | `let`) IDENTIFIER `=` REQUIRE | |
| 96 | 100 | ||
| 97 | - MODULE_EXPORTS_ASSIGN: MODULE_EXPORTS COMMENT_SPACE `=` COMMENT_SPACE REQUIRE | ||
| 101 | + MODULE_EXPORTS_ASSIGN: MODULE_EXPORTS `=` REQUIRE | ||
| 98 | 102 | ||
| 99 | 103 | EXPORT_STAR: (`__export` | `__exportStar`) `(` REQUIRE | |
| 100 | 104 | ||
@@ -113,9 +117,9 @@ EXPORT_STAR_LIB: `Object.keys(` IDENTIFIER$1 `).forEach(function (` IDENTIFIER$2 | |||
| 113 | 117 | `})` | |
| 114 | 118 | ``` | |
| 115 | 119 | ||
| 116 | - * The returned export names are taken to be the combination of: | ||
| 117 | - 1. `IDENTIFIER` and `IDENTIFIER_STRING` slots for all `EXPORTS_MEMBER` and `EXPORTS_LITERAL` matches. | ||
| 118 | - 2. `__esModule` if there is an `ES_MODULE_DEFINE` match. | ||
| 120 | + Spacing between tokens is taken to be any ECMA-262 whitespace, ECMA-262 block comment or ECMA-262 line comment. | ||
| 121 | + | ||
| 122 | + * The returned export names are taken to be the combination of the `IDENTIFIER` and `IDENTIFIER_STRING` slots for all `EXPORTS_MEMBER`, `EXPORTS_LITERAL` and `EXPORTS_DEFINE` matches. | ||
| 119 | 123 | * The reexport specifiers are taken to be the the combination of: | |
| 120 | 124 | 1. The `REQUIRE` matches of the last matched of either `MODULE_EXPORTS_ASSIGN` or `EXPORTS_LITERAL`. | |
| 121 | 125 | 2. All _top-level_ `EXPORT_STAR` `REQUIRE` matches and `EXPORTS_ASSIGN` matches whose `IDENTIFIER` also matches the first `IDENTIFIER` in `EXPORT_STAR_LIB`. | |
@@ -156,17 +160,66 @@ It will in turn underclassify in cases where the identifiers are renamed: | |||
| 156 | 160 | })(exports); | |
| 157 | 161 | ``` | |
| 158 | 162 | ||
| 159 | - #### __esModule Detection | ||
| 160 | - | ||
| 161 | - In addition, `__esModule` is detected as an export when set by `Object.defineProperty`: | ||
| 163 | + `Object.defineProperty` is detected for specifically value and getter forms returning an identifier or member expression: | ||
| 162 | 164 | ||
| 163 | 165 | ```js | |
| 164 | - // DETECTS: __esModule | ||
| 165 | - Object.defineProperty(exports, 'a', { value: 'a' }); | ||
| 166 | + // DETECTS: a, b, c, d, __esModule | ||
| 167 | + Object.defineProperty(exports, 'a', { | ||
| 168 | + enumerable: true, | ||
| 169 | + get: function () { | ||
| 170 | + return q.p; | ||
| 171 | + } | ||
| 172 | + }); | ||
| 173 | + Object.defineProperty(exports, 'b', { | ||
| 174 | + enumerable: true, | ||
| 175 | + get: function () { | ||
| 176 | + return q['p']; | ||
| 177 | + } | ||
| 178 | + }); | ||
| 179 | + Object.defineProperty(exports, 'c', { | ||
| 180 | + enumerable: true, | ||
| 181 | + get () { | ||
| 182 | + return b; | ||
| 183 | + } | ||
| 184 | + }); | ||
| 185 | + Object.defineProperty(exports, 'd', { value: 'd' }); | ||
| 166 | 186 | Object.defineProperty(exports, '__esModule', { value: true }); | |
| 167 | 187 | ``` | |
| 168 | 188 | ||
| 169 | - No other named exports are detected for `defineProperty` calls in order not to trigger getters or non-enumerable properties unnecessarily. | ||
| 189 | + Alternative object definition structures or getter function bodies are not detected: | ||
| 190 | + | ||
| 191 | + ```js | ||
| 192 | + // DETECTS: NO EXPORTS | ||
| 193 | + Object.defineProperty(exports, 'a', { | ||
| 194 | + enumerable: false, | ||
| 195 | + get () { | ||
| 196 | + return p; | ||
| 197 | + } | ||
| 198 | + }); | ||
| 199 | + Object.defineProperty(exports, 'b', { | ||
| 200 | + configurable: true, | ||
| 201 | + get () { | ||
| 202 | + return p; | ||
| 203 | + } | ||
| 204 | + }); | ||
| 205 | + Object.defineProperty(exports, 'c', { | ||
| 206 | + get: () => p | ||
| 207 | + }); | ||
| 208 | + Object.defineProperty(exports, 'd', { | ||
| 209 | + enumerable: true, | ||
| 210 | + get: function () { | ||
| 211 | + return dynamic(); | ||
| 212 | + } | ||
| 213 | + }); | ||
| 214 | + Object.defineProperty(exports, 'e', { | ||
| 215 | + enumerable: true, | ||
| 216 | + get () { | ||
| 217 | + return 'str'; | ||
| 218 | + } | ||
| 219 | + }); | ||
| 220 | + ``` | ||
| 221 | + | ||
| 222 | + `Object.defineProperties` is also not supported. | ||
| 170 | 223 | ||
| 171 | 224 | #### Exports Object Assignment | |
| 172 | 225 | ||
@@ -281,65 +334,64 @@ Current results: | |||
| 281 | 334 | JS Build: | |
| 282 | 335 | ||
| 283 | 336 | ``` | |
| 284 | - --- JS Build --- | ||
| 285 | 337 | Module load time | |
| 286 | - > 2ms | ||
| 338 | + > 5ms | ||
| 287 | 339 | Cold Run, All Samples | |
| 288 | 340 | test/samples/*.js (3635 KiB) | |
| 289 | - > 311ms | ||
| 341 | + > 323ms | ||
| 290 | 342 | ||
| 291 | 343 | Warm Runs (average of 25 runs) | |
| 292 | 344 | test/samples/angular.js (1410 KiB) | |
| 293 | - > 14.76ms | ||
| 345 | + > 14.84ms | ||
| 294 | 346 | test/samples/angular.min.js (303 KiB) | |
| 295 | - > 5.04ms | ||
| 347 | + > 4.8ms | ||
| 296 | 348 | test/samples/d3.js (553 KiB) | |
| 297 | - > 7.12ms | ||
| 349 | + > 7.84ms | ||
| 298 | 350 | test/samples/d3.min.js (250 KiB) | |
| 299 | 351 | > 4ms | |
| 300 | 352 | test/samples/magic-string.js (34 KiB) | |
| 301 | - > 0.84ms | ||
| 353 | + > 0.72ms | ||
| 302 | 354 | test/samples/magic-string.min.js (20 KiB) | |
| 303 | - > 0.08ms | ||
| 355 | + > 0.4ms | ||
| 304 | 356 | test/samples/rollup.js (698 KiB) | |
| 305 | - > 9.08ms | ||
| 357 | + > 9.32ms | ||
| 306 | 358 | test/samples/rollup.min.js (367 KiB) | |
| 307 | - > 6ms | ||
| 359 | + > 6.52ms | ||
| 308 | 360 | ||
| 309 | 361 | Warm Runs, All Samples (average of 25 runs) | |
| 310 | 362 | test/samples/*.js (3635 KiB) | |
| 311 | - > 41.32ms | ||
| 363 | + > 44ms | ||
| 312 | 364 | ``` | |
| 313 | 365 | ||
| 314 | 366 | Wasm Build: | |
| 315 | 367 | ``` | |
| 316 | 368 | Module load time | |
| 317 | - > 10ms | ||
| 369 | + > 11ms | ||
| 318 | 370 | Cold Run, All Samples | |
| 319 | 371 | test/samples/*.js (3635 KiB) | |
| 320 | - > 47ms | ||
| 372 | + > 42ms | ||
| 321 | 373 | ||
| 322 | 374 | Warm Runs (average of 25 runs) | |
| 323 | 375 | test/samples/angular.js (1410 KiB) | |
| 324 | - > 12.96ms | ||
| 376 | + > 9.92ms | ||
| 325 | 377 | test/samples/angular.min.js (303 KiB) | |
| 326 | - > 4ms | ||
| 378 | + > 3.2ms | ||
| 327 | 379 | test/samples/d3.js (553 KiB) | |
| 328 | - > 6.12ms | ||
| 380 | + > 5.2ms | ||
| 329 | 381 | test/samples/d3.min.js (250 KiB) | |
| 330 | - > 3.08ms | ||
| 382 | + > 2.52ms | ||
| 331 | 383 | test/samples/magic-string.js (34 KiB) | |
| 332 | - > 0.32ms | ||
| 384 | + > 0.16ms | ||
| 333 | 385 | test/samples/magic-string.min.js (20 KiB) | |
| 334 | - > 0ms | ||
| 386 | + > 0.04ms | ||
| 335 | 387 | test/samples/rollup.js (698 KiB) | |
| 336 | - > 7.8ms | ||
| 388 | + > 6.44ms | ||
| 337 | 389 | test/samples/rollup.min.js (367 KiB) | |
| 338 | - > 4.64ms | ||
| 390 | + > 3.96ms | ||
| 339 | 391 | ||
| 340 | 392 | Warm Runs, All Samples (average of 25 runs) | |
| 341 | 393 | test/samples/*.js (3635 KiB) | |
| 342 | - > 35.64ms | ||
| 394 | + > 30.48ms | ||
| 343 | 395 | ``` | |
| 344 | 396 | ||
| 345 | 397 | ### Wasm Build Steps | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -260,30 +260,117 @@ function tryParseObjectDefineOrKeys (keys) { | |||
| 260 | 260 | pos++; | |
| 261 | 261 | ch = commentWhitespace(); | |
| 262 | 262 | if (ch === 100/*d*/ && source.startsWith('efineProperty', pos + 1)) { | |
| 263 | - pos += 14; | ||
| 264 | - revertPos = pos - 1; | ||
| 265 | - ch = commentWhitespace(); | ||
| 266 | - if (ch !== 40/*(*/) { | ||
| 267 | - pos = revertPos; | ||
| 268 | - return; | ||
| 269 | - } | ||
| 270 | - pos++; | ||
| 271 | - ch = commentWhitespace(); | ||
| 272 | - if (readExportsOrModuleDotExports(ch)) { | ||
| 263 | + while (true) { | ||
| 264 | + pos += 14; | ||
| 265 | + revertPos = pos - 1; | ||
| 266 | + ch = commentWhitespace(); | ||
| 267 | + if (ch !== 40/*(*/) break; | ||
| 268 | + pos++; | ||
| 269 | + ch = commentWhitespace(); | ||
| 270 | + if (!readExportsOrModuleDotExports(ch)) break; | ||
| 271 | + ch = commentWhitespace(); | ||
| 272 | + if (ch !== 44/*,*/) break; | ||
| 273 | + pos++; | ||
| 274 | + ch = commentWhitespace(); | ||
| 275 | + if (ch !== 39/*'*/ && ch !== 34/*"*/) break; | ||
| 276 | + let quot = ch; | ||
| 277 | + const exportPos = ++pos; | ||
| 278 | + if (!identifier() || source.charCodeAt(pos) !== quot) break; | ||
| 279 | + const expt = source.slice(exportPos, pos); | ||
| 280 | + pos++; | ||
| 281 | + ch = commentWhitespace(); | ||
| 282 | + if (ch !== 44/*,*/) break; | ||
| 283 | + pos++; | ||
| 273 | 284 | ch = commentWhitespace(); | |
| 274 | - if (ch === 44/*,*/) { | ||
| 285 | + if (ch !== 123/*{*/) break; | ||
| 286 | + pos++; | ||
| 287 | + ch = commentWhitespace(); | ||
| 288 | + if (ch === 101/*e*/) { | ||
| 289 | + if (!source.startsWith('numerable', pos + 1)) break; | ||
| 290 | + pos += 10; | ||
| 291 | + ch = commentWhitespace(); | ||
| 292 | + if (ch !== 58/*:*/) break; | ||
| 275 | 293 | pos++; | |
| 276 | 294 | ch = commentWhitespace(); | |
| 277 | - if (ch === 39/*'*/ || ch === 34/*"*/) { | ||
| 278 | - const exportPos = ++pos; | ||
| 279 | - if (identifier() && source.charCodeAt(pos) === ch) { | ||
| 280 | - // revert for "(" | ||
| 281 | - const expt = source.slice(exportPos, pos); | ||
| 282 | - if (expt === '__esModule') | ||
| 283 | - addExport(expt); | ||
| 284 | - } | ||
| 295 | + if (ch !== 116/*t*/ || !source.startsWith('rue', pos + 1)) break; | ||
| 296 | + pos += 4; | ||
| 297 | + ch = commentWhitespace(); | ||
| 298 | + if (ch !== 44) break; | ||
| 299 | + pos++; | ||
| 300 | + ch = commentWhitespace(); | ||
| 301 | + } | ||
| 302 | + if (ch === 118/*v*/) { | ||
| 303 | + if (!source.startsWith('alue', pos + 1)) break; | ||
| 304 | + pos += 5; | ||
| 305 | + ch = commentWhitespace(); | ||
| 306 | + if (ch !== 58/*:*/) break; | ||
| 307 | + pos++; | ||
| 308 | + addExport(expt); | ||
| 309 | + break; | ||
| 310 | + } | ||
| 311 | + else if (ch === 103/*g*/) { | ||
| 312 | + if (!source.startsWith('et', pos + 1)) break; | ||
| 313 | + pos += 3; | ||
| 314 | + ch = commentWhitespace(); | ||
| 315 | + if (ch === 58/*:*/) { | ||
| 316 | + pos++; | ||
| 317 | + ch = commentWhitespace(); | ||
| 318 | + if (ch !== 102/*f*/) break; | ||
| 319 | + if (!source.startsWith('unction', pos + 1)) break; | ||
| 320 | + pos += 8; | ||
| 321 | + let lastPos = pos; | ||
| 322 | + ch = commentWhitespace(); | ||
| 323 | + if (ch !== 40 && (lastPos === pos || !identifier())) break; | ||
| 324 | + ch = commentWhitespace(); | ||
| 325 | + } | ||
| 326 | + if (ch !== 40/*(*/) break; | ||
| 327 | + pos++; | ||
| 328 | + ch = commentWhitespace(); | ||
| 329 | + if (ch !== 41/*)*/) break; | ||
| 330 | + pos++; | ||
| 331 | + ch = commentWhitespace(); | ||
| 332 | + if (ch !== 123/*{*/) break; | ||
| 333 | + pos++; | ||
| 334 | + ch = commentWhitespace(); | ||
| 335 | + if (ch !== 114/*r*/) break; | ||
| 336 | + if (!source.startsWith('eturn', pos + 1)) break; | ||
| 337 | + pos += 6; | ||
| 338 | + ch = commentWhitespace(); | ||
| 339 | + if (!identifier()) break; | ||
| 340 | + ch = commentWhitespace(); | ||
| 341 | + if (ch === 46/*.*/) { | ||
| 342 | + pos++; | ||
| 343 | + commentWhitespace(); | ||
| 344 | + if (!identifier()) break; | ||
| 345 | + ch = commentWhitespace(); | ||
| 346 | + } | ||
| 347 | + else if (ch === 91/*[*/) { | ||
| 348 | + pos++; | ||
| 349 | + ch = commentWhitespace(); | ||
| 350 | + if (ch === 39/*'*/) singleQuoteString(); | ||
| 351 | + else if (ch === 34/*"*/) doubleQuoteString(); | ||
| 352 | + else break; | ||
| 353 | + pos++; | ||
| 354 | + ch = commentWhitespace(); | ||
| 355 | + if (ch !== 93/*]*/) break; | ||
| 356 | + pos++; | ||
| 357 | + ch = commentWhitespace(); | ||
| 358 | + } | ||
| 359 | + if (ch === 59/*;*/) { | ||
| 360 | + pos++; | ||
| 361 | + ch = commentWhitespace(); | ||
| 285 | 362 | } | |
| 363 | + if (ch !== 125/*}*/) break; | ||
| 364 | + pos++; | ||
| 365 | + ch = commentWhitespace(); | ||
| 366 | + if (ch !== 125/*}*/) break; | ||
| 367 | + pos++; | ||
| 368 | + ch = commentWhitespace(); | ||
| 369 | + if (ch !== 41/*)*/) break; | ||
| 370 | + addExport(expt); | ||
| 371 | + return; | ||
| 286 | 372 | } | |
| 373 | + break; | ||
| 287 | 374 | } | |
| 288 | 375 | } | |
| 289 | 376 | else if (keys && ch === 107/*k*/ && source.startsWith('eys', pos + 1)) { | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1,6 +1,6 @@ | |||
| 1 | 1 | { | |
| 2 | 2 | "name": "cjs-module-lexer", | |
| 3 | - "version": "0.5.0", | ||
| 3 | + "version": "0.5.2", | ||
| 4 | 4 | "description": "Lexes CommonJS modules, returning their named exports metadata", | |
| 5 | 5 | "main": "lexer.js", | |
| 6 | 6 | "exports": { | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1287,7 +1287,7 @@ success! | |||
| 1287 | 1287 | [`transformSource` hook]: #esm_transformsource_source_context_defaulttransformsource | |
| 1288 | 1288 | [`string`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String | |
| 1289 | 1289 | [`util.TextDecoder`]: util.md#util_class_util_textdecoder | |
| 1290 | - [cjs-module-lexer]: https://github.com/guybedford/cjs-module-lexer/tree/0.5.0 | ||
| 1290 | + [cjs-module-lexer]: https://github.com/guybedford/cjs-module-lexer/tree/0.5.2 | ||
| 1291 | 1291 | [special scheme]: https://url.spec.whatwg.org/#special-scheme | |
| 1292 | 1292 | [the official standard format]: https://tc39.github.io/ecma262/#sec-modules | |
| 1293 | 1293 | [transpiler loader example]: #esm_transpiler_loader | |
| Back | FazBrowse Home | New Git URL |
0 commit comments