From 351d3c6b51f7982792f03dbe9750c1cd96aba028 Mon Sep 17 00:00:00 2001 From: Francesco Trotta Date: Mon, 26 Jul 2021 23:25:44 +0200 Subject: [PATCH 001/101] Renamed packages --- .github/workflows/{novem.yml => ~mask.yml} | 8 +- .../{quinquaginta-duo.yml => ~solution.yml} | 8 +- .../quinquaginta-duo/test/spec/mask.spec.ts | 135 ------------------ packages/{novem => ~mask}/.npmrc | 0 .../dev/make-impl.js | 4 +- packages/{novem => ~mask}/dev/make.js | 0 .../dev/prepare-legacy-test.js | 0 .../{quinquaginta-duo => ~mask}/gulpfile.js | 0 packages/{novem => ~mask}/license.txt | 0 .../{quinquaginta-duo => ~mask}/package.json | 10 +- .../{quinquaginta-duo => ~mask}/readme.md | 11 +- .../src/index.ts} | 0 .../src/mask-index.ts | 0 .../{quinquaginta-duo => ~mask}/src/mask.ts | 0 packages/{novem => ~mask}/src/package.json | 0 .../src => ~mask/test}/package.json | 0 .../test/spec/mask-index.spec.ts | 0 packages/~mask/test/spec/mask.spec.ts | 128 +++++++++++++++++ packages/{novem => ~mask}/tsconfig.json | 0 .../{quinquaginta-duo => ~solution}/.npmrc | 0 .../{novem => ~solution}/dev/make-impl.js | 6 +- .../dev/make.js | 0 .../dev/prepare-legacy-test.js | 0 packages/{novem => ~solution}/gulpfile.js | 0 .../license.txt | 0 packages/{novem => ~solution}/package.json | 10 +- packages/{novem => ~solution}/readme.md | 8 +- packages/{novem => ~solution}/src/eval.ts | 0 .../src/novem.ts => ~solution/src/index.ts} | 0 .../test => ~solution/src}/package.json | 0 packages/{novem => ~solution}/src/rule.ts | 0 .../{novem => ~solution}/src/solution-type.ts | 0 packages/{novem => ~solution}/src/solution.ts | 0 packages/{novem => ~solution}/src/type-set.ts | 0 .../{novem => ~solution}/test/package.json | 0 .../test/spec/abstract-solution.spec.ts | 0 .../test/spec/dynamic-solution.spec.ts | 0 .../test/spec/lazy-solution.spec.ts | 2 +- .../test/spec/solution-type.spec.ts | 0 .../tsconfig.json | 0 src/lib/debug.js | 4 +- src/lib/definers.js | 2 +- src/lib/definitions.js | 2 +- src/lib/encoder/encoder-base.js | 4 +- src/lib/encoder/hex-code-of.js | 2 +- src/lib/features.js | 2 +- src/lib/jscrewit-base.js | 2 +- src/lib/optimizers/comma-optimizer.js | 2 +- .../optimizers/surrogate-pair-optimizer.js | 2 +- src/lib/optimizers/to-string-optimizer.js | 2 +- src/lib/solution.js | 4 +- 51 files changed, 175 insertions(+), 183 deletions(-) rename .github/workflows/{novem.yml => ~mask.yml} (90%) rename .github/workflows/{quinquaginta-duo.yml => ~solution.yml} (87%) delete mode 100644 packages/quinquaginta-duo/test/spec/mask.spec.ts rename packages/{novem => ~mask}/.npmrc (100%) rename packages/{quinquaginta-duo => ~mask}/dev/make-impl.js (94%) rename packages/{novem => ~mask}/dev/make.js (100%) rename packages/{novem => ~mask}/dev/prepare-legacy-test.js (100%) rename packages/{quinquaginta-duo => ~mask}/gulpfile.js (100%) rename packages/{novem => ~mask}/license.txt (100%) rename packages/{quinquaginta-duo => ~mask}/package.json (87%) rename packages/{quinquaginta-duo => ~mask}/readme.md (79%) rename packages/{quinquaginta-duo/src/quinquaginta-duo.ts => ~mask/src/index.ts} (100%) rename packages/{quinquaginta-duo => ~mask}/src/mask-index.ts (100%) rename packages/{quinquaginta-duo => ~mask}/src/mask.ts (100%) rename packages/{novem => ~mask}/src/package.json (100%) rename packages/{quinquaginta-duo/src => ~mask/test}/package.json (100%) rename packages/{quinquaginta-duo => ~mask}/test/spec/mask-index.spec.ts (100%) create mode 100644 packages/~mask/test/spec/mask.spec.ts rename packages/{novem => ~mask}/tsconfig.json (100%) rename packages/{quinquaginta-duo => ~solution}/.npmrc (100%) rename packages/{novem => ~solution}/dev/make-impl.js (94%) rename packages/{quinquaginta-duo => ~solution}/dev/make.js (100%) rename packages/{quinquaginta-duo => ~solution}/dev/prepare-legacy-test.js (100%) rename packages/{novem => ~solution}/gulpfile.js (100%) rename packages/{quinquaginta-duo => ~solution}/license.txt (100%) rename packages/{novem => ~solution}/package.json (90%) rename packages/{novem => ~solution}/readme.md (93%) rename packages/{novem => ~solution}/src/eval.ts (100%) rename packages/{novem/src/novem.ts => ~solution/src/index.ts} (100%) rename packages/{quinquaginta-duo/test => ~solution/src}/package.json (100%) rename packages/{novem => ~solution}/src/rule.ts (100%) rename packages/{novem => ~solution}/src/solution-type.ts (100%) rename packages/{novem => ~solution}/src/solution.ts (100%) rename packages/{novem => ~solution}/src/type-set.ts (100%) rename packages/{novem => ~solution}/test/package.json (100%) rename packages/{novem => ~solution}/test/spec/abstract-solution.spec.ts (100%) rename packages/{novem => ~solution}/test/spec/dynamic-solution.spec.ts (100%) rename packages/{novem => ~solution}/test/spec/lazy-solution.spec.ts (95%) rename packages/{novem => ~solution}/test/spec/solution-type.spec.ts (100%) rename packages/{quinquaginta-duo => ~solution}/tsconfig.json (100%) diff --git a/.github/workflows/novem.yml b/.github/workflows/~mask.yml similarity index 90% rename from .github/workflows/novem.yml rename to .github/workflows/~mask.yml index 96c0e789..dbc13f1b 100644 --- a/.github/workflows/novem.yml +++ b/.github/workflows/~mask.yml @@ -1,4 +1,4 @@ -name: novem Node.js CI +name: ~mask Node.js CI on: [push, pull_request] @@ -6,7 +6,7 @@ defaults: run: - working-directory: packages/novem + working-directory: packages/~mask jobs: @@ -56,7 +56,7 @@ jobs: - uses: actions/upload-artifact@v2 with: name: node-legacy - path: packages/novem/test/node-legacy + path: packages/~mask/test/node-legacy legacy-test: @@ -78,5 +78,5 @@ jobs: - uses: actions/download-artifact@v2 with: name: node-legacy - path: packages/novem/test/node-legacy + path: packages/~mask/test/node-legacy - run: npm run legacy-test diff --git a/.github/workflows/quinquaginta-duo.yml b/.github/workflows/~solution.yml similarity index 87% rename from .github/workflows/quinquaginta-duo.yml rename to .github/workflows/~solution.yml index 6e9b500c..7fa36cfc 100644 --- a/.github/workflows/quinquaginta-duo.yml +++ b/.github/workflows/~solution.yml @@ -1,4 +1,4 @@ -name: quinquaginta-duo Node.js CI +name: ~solution Node.js CI on: [push, pull_request] @@ -6,7 +6,7 @@ defaults: run: - working-directory: packages/quinquaginta-duo + working-directory: packages/~solution jobs: @@ -56,7 +56,7 @@ jobs: - uses: actions/upload-artifact@v2 with: name: node-legacy - path: packages/quinquaginta-duo/test/node-legacy + path: packages/~solution/test/node-legacy legacy-test: @@ -78,5 +78,5 @@ jobs: - uses: actions/download-artifact@v2 with: name: node-legacy - path: packages/quinquaginta-duo/test/node-legacy + path: packages/~solution/test/node-legacy - run: npm run legacy-test diff --git a/packages/quinquaginta-duo/test/spec/mask.spec.ts b/packages/quinquaginta-duo/test/spec/mask.spec.ts deleted file mode 100644 index 3ed775a8..00000000 --- a/packages/quinquaginta-duo/test/spec/mask.spec.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { maskAreEqual, maskIncludes, maskIntersection, maskNew, maskNext, maskUnion } -from '../../src/mask'; -import type { Mask } from '../../src/mask'; -import assert, { AssertionError } from 'assert'; - -function assertFail -(message: string, stackStartFn: Function, actual?: unknown, expected?: unknown): never -{ - const options = { message, actual, expected, stackStartFn, stackStartFunction: stackStartFn }; - const error = new AssertionError(options); - throw error; -} - -function assertMaskEmpty(actual: Mask): void -{ - const expected = maskNew(); - if (!maskAreEqual(actual, expected)) - { - const message = `Expected ${formatMask(actual)} to be empty`; - assertFail(message, assertMaskEmpty, actual, expected); - } -} - -function assertMaskEqual(actual: Mask, expected: Mask): void -{ - if (!maskAreEqual(actual, expected)) - { - const message = `Expected ${formatMask(actual)} to be equal to ${formatMask(expected)}`; - assertFail(message, assertMaskEqual, actual, expected); - } -} - -function assertMaskInclude(actual: Mask, includedMask: Mask): void -{ - if (!maskIncludes(actual, includedMask)) - { - const message = `Expected ${formatMask(actual)} to include ${formatMask(includedMask)}`; - assertFail(message, assertMaskInclude, actual); - } -} - -function assertMaskNotEmpty(actual: Mask): void -{ - const expected = maskNew(); - if (maskAreEqual(actual, expected)) - { - const message = `Expected ${formatMask(actual)} to be non-empty`; - assertFail(message, assertMaskNotEmpty, actual); - } -} - -function formatMask(mask: Mask): string -{ - const str = `mask ${String(mask)}`; - return str; -} - -describe -( - 'quinquaginta-duo', - () => - { - it - ( - 'maskNew', - () => - { - const newMask = maskNew(); - assertMaskEmpty(newMask); - }, - ); - - it - ( - 'maskNext', - () => - { - let prevMask = maskNew(); - for (let count = 0; count < 52; ++count) - { - const nextMask = maskNext(prevMask); - assertMaskNotEmpty(nextMask); - const intersectionMask = maskIntersection(nextMask, prevMask); - assertMaskEmpty(intersectionMask); - const unionMask = maskUnion(nextMask, prevMask); - prevMask = unionMask; - } - assert.throws(() => maskNext(prevMask), RangeError); - }, - ); - - it - ( - 'maskUnion', - () => - { - let prevMask = maskNew(); - for (let count = 0; count < 52; ++count) - { - const nextMask = maskNext(prevMask); - const unionMask = maskUnion(nextMask, prevMask); - assertMaskInclude(unionMask, prevMask); - assertMaskInclude(unionMask, nextMask); - prevMask = unionMask; - } - }, - ); - - it - ( - 'maskIntersection', - () => - { - const mask0 = maskNew(); - let prevHighMask = mask0; - let lowMask = maskNext(mask0); - for (let count = 0; count < 51; ++count) - { - const topMask = maskNext(lowMask); - const nextHighMask = maskUnion(prevHighMask, topMask); - { - const intersectionMask = maskIntersection(lowMask, nextHighMask); - assertMaskEqual(intersectionMask, prevHighMask); - } - { - const intersectionMask = maskIntersection(prevHighMask, mask0); - assertMaskEmpty(intersectionMask); - } - prevHighMask = nextHighMask; - lowMask = maskUnion(lowMask, topMask); - } - }, - ); - }, -); diff --git a/packages/novem/.npmrc b/packages/~mask/.npmrc similarity index 100% rename from packages/novem/.npmrc rename to packages/~mask/.npmrc diff --git a/packages/quinquaginta-duo/dev/make-impl.js b/packages/~mask/dev/make-impl.js similarity index 94% rename from packages/quinquaginta-duo/dev/make-impl.js rename to packages/~mask/dev/make-impl.js index 1d211243..a8d3db8a 100644 --- a/packages/quinquaginta-duo/dev/make-impl.js +++ b/packages/~mask/dev/make-impl.js @@ -11,7 +11,7 @@ async function bundle(pkgPath) const pkgConfigPath = join(pkgPath, 'package.json'); const require = createRequire(pkgConfigPath); const { homepage, name } = require(pkgConfigPath); - const inputPath = join(pkgPath, '.tmp-out/quinquaginta-duo.js'); + const inputPath = join(pkgPath, '.tmp-out/index.js'); const inputOptions = { external: ['tslib'], @@ -23,7 +23,7 @@ async function bundle(pkgPath) }, plugins: [rollupPluginCleanup({ comments: /^(?!\/ *(?:@ts-|eslint-disable-line ))/ })], }; - const outputPath = join(pkgPath, 'lib/quinquaginta-duo.js'); + const outputPath = join(pkgPath, 'lib/index.js'); const outputOptions = { banner: `// ${name} – ${homepage}\n`, file: outputPath, format: 'esm' }; const bundle = await rollup(inputOptions); diff --git a/packages/novem/dev/make.js b/packages/~mask/dev/make.js similarity index 100% rename from packages/novem/dev/make.js rename to packages/~mask/dev/make.js diff --git a/packages/novem/dev/prepare-legacy-test.js b/packages/~mask/dev/prepare-legacy-test.js similarity index 100% rename from packages/novem/dev/prepare-legacy-test.js rename to packages/~mask/dev/prepare-legacy-test.js diff --git a/packages/quinquaginta-duo/gulpfile.js b/packages/~mask/gulpfile.js similarity index 100% rename from packages/quinquaginta-duo/gulpfile.js rename to packages/~mask/gulpfile.js diff --git a/packages/novem/license.txt b/packages/~mask/license.txt similarity index 100% rename from packages/novem/license.txt rename to packages/~mask/license.txt diff --git a/packages/quinquaginta-duo/package.json b/packages/~mask/package.json similarity index 87% rename from packages/quinquaginta-duo/package.json rename to packages/~mask/package.json index f29cd928..b1530099 100644 --- a/packages/quinquaginta-duo/package.json +++ b/packages/~mask/package.json @@ -1,7 +1,7 @@ { - "name": "quinquaginta-duo", + "name": "~mask", "description": "Boolean vector provider for JScrewIt", - "homepage": "https://github.com/fasttime/JScrewIt/tree/master/packages/quinquaginta-duo", + "homepage": "https://github.com/fasttime/JScrewIt/tree/master/packages/~mask", "bugs": "https://github.com/fasttime/JScrewIt/issues", "license": "ISC", "author": "Francesco Trotta (https://github.com/fasttime)", @@ -9,9 +9,9 @@ "lib", "!.*" ], - "exports": "./lib/quinquaginta-duo.js", - "module": "./lib/quinquaginta-duo.js", - "types": "lib/quinquaginta-duo.d.ts", + "exports": "./lib/index.js", + "module": "./lib/index.js", + "types": "lib/index.d.ts", "directories": { "lib": "lib", "test": "test" diff --git a/packages/quinquaginta-duo/readme.md b/packages/~mask/readme.md similarity index 79% rename from packages/quinquaginta-duo/readme.md rename to packages/~mask/readme.md index 3ce59e91..733ad120 100644 --- a/packages/quinquaginta-duo/readme.md +++ b/packages/~mask/readme.md @@ -1,15 +1,15 @@ -# quinquaginta-duo +# ~mask This package provides the implementation of boolean vectors (masks) used by [JScrewIt](https://github.com/fasttime/JScrewIt) to represent features. -It is named after the word for the number fifty-two in Latin, which is the maximum number of boolean -elements that masks can handle in this implementation. +It was previously named *quinquaginta-duo* after the word for the number fifty-two in Latin, which +is the maximum number of boolean elements that masks can handle in this implementation. ## Overview A mask is an immutable, serializable, transparent data structure used to operate on multiple boolean values at once. -Masks should only be accessed using the mask functions provided by quinquaginta-duo. +Masks should only be accessed using the mask functions provided by this package. An exception to this rule is that a mask can be safely compared to undefined or null, because any valid mask is different from undefined or null. Apart from that, do not make any assumptions about the internal representation of masks, their type @@ -19,6 +19,5 @@ Passing anything other than a mask as an argument to a mask function results in ## Compatibility -The same JavaScript engines supported by the latest version of JScrewIt are supported by -quinquaginta-duo. +The same JavaScript engines supported by the latest version of JScrewIt are supported by ~mask. See [here](https://github.com/fasttime/JScrewIt#compatibility). diff --git a/packages/quinquaginta-duo/src/quinquaginta-duo.ts b/packages/~mask/src/index.ts similarity index 100% rename from packages/quinquaginta-duo/src/quinquaginta-duo.ts rename to packages/~mask/src/index.ts diff --git a/packages/quinquaginta-duo/src/mask-index.ts b/packages/~mask/src/mask-index.ts similarity index 100% rename from packages/quinquaginta-duo/src/mask-index.ts rename to packages/~mask/src/mask-index.ts diff --git a/packages/quinquaginta-duo/src/mask.ts b/packages/~mask/src/mask.ts similarity index 100% rename from packages/quinquaginta-duo/src/mask.ts rename to packages/~mask/src/mask.ts diff --git a/packages/novem/src/package.json b/packages/~mask/src/package.json similarity index 100% rename from packages/novem/src/package.json rename to packages/~mask/src/package.json diff --git a/packages/quinquaginta-duo/src/package.json b/packages/~mask/test/package.json similarity index 100% rename from packages/quinquaginta-duo/src/package.json rename to packages/~mask/test/package.json diff --git a/packages/quinquaginta-duo/test/spec/mask-index.spec.ts b/packages/~mask/test/spec/mask-index.spec.ts similarity index 100% rename from packages/quinquaginta-duo/test/spec/mask-index.spec.ts rename to packages/~mask/test/spec/mask-index.spec.ts diff --git a/packages/~mask/test/spec/mask.spec.ts b/packages/~mask/test/spec/mask.spec.ts new file mode 100644 index 00000000..c2ccc5fd --- /dev/null +++ b/packages/~mask/test/spec/mask.spec.ts @@ -0,0 +1,128 @@ +import { maskAreEqual, maskIncludes, maskIntersection, maskNew, maskNext, maskUnion } +from '../../src/mask'; +import type { Mask } from '../../src/mask'; +import assert, { AssertionError } from 'assert'; + +function assertFail +(message: string, stackStartFn: Function, actual?: unknown, expected?: unknown): never +{ + const options = { message, actual, expected, stackStartFn, stackStartFunction: stackStartFn }; + const error = new AssertionError(options); + throw error; +} + +function assertMaskEmpty(actual: Mask): void +{ + const expected = maskNew(); + if (!maskAreEqual(actual, expected)) + { + const message = `Expected ${formatMask(actual)} to be empty`; + assertFail(message, assertMaskEmpty, actual, expected); + } +} + +function assertMaskEqual(actual: Mask, expected: Mask): void +{ + if (!maskAreEqual(actual, expected)) + { + const message = `Expected ${formatMask(actual)} to be equal to ${formatMask(expected)}`; + assertFail(message, assertMaskEqual, actual, expected); + } +} + +function assertMaskInclude(actual: Mask, includedMask: Mask): void +{ + if (!maskIncludes(actual, includedMask)) + { + const message = `Expected ${formatMask(actual)} to include ${formatMask(includedMask)}`; + assertFail(message, assertMaskInclude, actual); + } +} + +function assertMaskNotEmpty(actual: Mask): void +{ + const expected = maskNew(); + if (maskAreEqual(actual, expected)) + { + const message = `Expected ${formatMask(actual)} to be non-empty`; + assertFail(message, assertMaskNotEmpty, actual); + } +} + +function formatMask(mask: Mask): string +{ + const str = `mask ${String(mask)}`; + return str; +} + +it +( + 'maskNew', + () => + { + const newMask = maskNew(); + assertMaskEmpty(newMask); + }, +); + +it +( + 'maskNext', + () => + { + let prevMask = maskNew(); + for (let count = 0; count < 52; ++count) + { + const nextMask = maskNext(prevMask); + assertMaskNotEmpty(nextMask); + const intersectionMask = maskIntersection(nextMask, prevMask); + assertMaskEmpty(intersectionMask); + const unionMask = maskUnion(nextMask, prevMask); + prevMask = unionMask; + } + assert.throws(() => maskNext(prevMask), RangeError); + }, +); + +it +( + 'maskUnion', + () => + { + let prevMask = maskNew(); + for (let count = 0; count < 52; ++count) + { + const nextMask = maskNext(prevMask); + const unionMask = maskUnion(nextMask, prevMask); + assertMaskInclude(unionMask, prevMask); + assertMaskInclude(unionMask, nextMask); + prevMask = unionMask; + } + }, +); + +it +( + 'maskIntersection', + () => + { + const mask0 = maskNew(); + let prevHighMask = mask0; + let lowMask = maskNext(mask0); + for (let count = 0; count < 51; ++count) + { + const topMask = maskNext(lowMask); + const nextHighMask = maskUnion(prevHighMask, topMask); + { + const intersectionMask = maskIntersection(lowMask, nextHighMask); + assertMaskEqual(intersectionMask, prevHighMask); + } + { + const intersectionMask = maskIntersection(prevHighMask, mask0); + assertMaskEmpty(intersectionMask); + } + prevHighMask = nextHighMask; + lowMask = maskUnion(lowMask, topMask); + } + }, +); diff --git a/packages/novem/tsconfig.json b/packages/~mask/tsconfig.json similarity index 100% rename from packages/novem/tsconfig.json rename to packages/~mask/tsconfig.json diff --git a/packages/quinquaginta-duo/.npmrc b/packages/~solution/.npmrc similarity index 100% rename from packages/quinquaginta-duo/.npmrc rename to packages/~solution/.npmrc diff --git a/packages/novem/dev/make-impl.js b/packages/~solution/dev/make-impl.js similarity index 94% rename from packages/novem/dev/make-impl.js rename to packages/~solution/dev/make-impl.js index afa95f23..a5cab1cd 100644 --- a/packages/novem/dev/make-impl.js +++ b/packages/~solution/dev/make-impl.js @@ -11,7 +11,7 @@ async function bundle(pkgPath) const pkgConfigPath = join(pkgPath, 'package.json'); const require = createRequire(pkgConfigPath); const { homepage, name } = require(pkgConfigPath); - const inputPath = join(pkgPath, '.tmp-out/novem.js'); + const inputPath = join(pkgPath, '.tmp-out/index.js'); const inputOptions = { external: ['tslib'], @@ -23,7 +23,7 @@ async function bundle(pkgPath) }, plugins: [rollupPluginCleanup({ comments: /^(?!\/ *(?:@ts-|eslint-disable-line ))/ })], }; - const outputPath = join(pkgPath, 'lib/novem.js'); + const outputPath = join(pkgPath, 'lib/index.js'); const outputOptions = { banner: `// ${name} – ${homepage}\n`, file: outputPath, format: 'esm' }; const bundle = await rollup(inputOptions); @@ -53,7 +53,7 @@ async function compile(pkgPath) return program; } )(); - const condition = ['novem.d.ts', 'solution.d.ts', 'solution-type.d.ts']; + const condition = ['index.d.ts', 'solution.d.ts', 'solution-type.d.ts']; const writeFile = (path, data, writeByteOrderMark) => { diff --git a/packages/quinquaginta-duo/dev/make.js b/packages/~solution/dev/make.js similarity index 100% rename from packages/quinquaginta-duo/dev/make.js rename to packages/~solution/dev/make.js diff --git a/packages/quinquaginta-duo/dev/prepare-legacy-test.js b/packages/~solution/dev/prepare-legacy-test.js similarity index 100% rename from packages/quinquaginta-duo/dev/prepare-legacy-test.js rename to packages/~solution/dev/prepare-legacy-test.js diff --git a/packages/novem/gulpfile.js b/packages/~solution/gulpfile.js similarity index 100% rename from packages/novem/gulpfile.js rename to packages/~solution/gulpfile.js diff --git a/packages/quinquaginta-duo/license.txt b/packages/~solution/license.txt similarity index 100% rename from packages/quinquaginta-duo/license.txt rename to packages/~solution/license.txt diff --git a/packages/novem/package.json b/packages/~solution/package.json similarity index 90% rename from packages/novem/package.json rename to packages/~solution/package.json index f4c8fcb3..2a1fae82 100644 --- a/packages/novem/package.json +++ b/packages/~solution/package.json @@ -1,7 +1,7 @@ { - "name": "novem", + "name": "~solution", "description": "Solution provider for JScrewIt", - "homepage": "https://github.com/fasttime/JScrewIt/tree/master/packages/novem", + "homepage": "https://github.com/fasttime/JScrewIt/tree/master/packages/~solution", "bugs": "https://github.com/fasttime/JScrewIt/issues", "license": "ISC", "author": "Francesco Trotta (https://github.com/fasttime)", @@ -9,9 +9,9 @@ "lib", "!.*" ], - "exports": "./lib/novem.js", - "module": "./lib/novem.js", - "types": "lib/novem.d.ts", + "exports": "./lib/index.js", + "module": "./lib/index.js", + "types": "lib/index.d.ts", "directories": { "lib": "lib", "test": "test" diff --git a/packages/novem/readme.md b/packages/~solution/readme.md similarity index 93% rename from packages/novem/readme.md rename to packages/~solution/readme.md index 2baef7a1..45c88de0 100644 --- a/packages/novem/readme.md +++ b/packages/~solution/readme.md @@ -1,8 +1,8 @@ -# novem +# ~solution This is the solution framework used by [JScrewIt](https://github.com/fasttime/JScrewIt). -It is named after the word for the number nine in Latin, because in a prior draft of the project -there were nine solution types. +It was previously named *novem* after the word for the number nine in Latin, because in a prior +draft of the project there were nine solution types. ## Overview @@ -61,5 +61,5 @@ Currently, the following solution types are distinguished. ## Compatibility -The same JavaScript engines supported by the latest version of JScrewIt are supported by novem. +The same JavaScript engines supported by the latest version of JScrewIt are supported by ~solution. See [here](https://github.com/fasttime/JScrewIt#compatibility). diff --git a/packages/novem/src/eval.ts b/packages/~solution/src/eval.ts similarity index 100% rename from packages/novem/src/eval.ts rename to packages/~solution/src/eval.ts diff --git a/packages/novem/src/novem.ts b/packages/~solution/src/index.ts similarity index 100% rename from packages/novem/src/novem.ts rename to packages/~solution/src/index.ts diff --git a/packages/quinquaginta-duo/test/package.json b/packages/~solution/src/package.json similarity index 100% rename from packages/quinquaginta-duo/test/package.json rename to packages/~solution/src/package.json diff --git a/packages/novem/src/rule.ts b/packages/~solution/src/rule.ts similarity index 100% rename from packages/novem/src/rule.ts rename to packages/~solution/src/rule.ts diff --git a/packages/novem/src/solution-type.ts b/packages/~solution/src/solution-type.ts similarity index 100% rename from packages/novem/src/solution-type.ts rename to packages/~solution/src/solution-type.ts diff --git a/packages/novem/src/solution.ts b/packages/~solution/src/solution.ts similarity index 100% rename from packages/novem/src/solution.ts rename to packages/~solution/src/solution.ts diff --git a/packages/novem/src/type-set.ts b/packages/~solution/src/type-set.ts similarity index 100% rename from packages/novem/src/type-set.ts rename to packages/~solution/src/type-set.ts diff --git a/packages/novem/test/package.json b/packages/~solution/test/package.json similarity index 100% rename from packages/novem/test/package.json rename to packages/~solution/test/package.json diff --git a/packages/novem/test/spec/abstract-solution.spec.ts b/packages/~solution/test/spec/abstract-solution.spec.ts similarity index 100% rename from packages/novem/test/spec/abstract-solution.spec.ts rename to packages/~solution/test/spec/abstract-solution.spec.ts diff --git a/packages/novem/test/spec/dynamic-solution.spec.ts b/packages/~solution/test/spec/dynamic-solution.spec.ts similarity index 100% rename from packages/novem/test/spec/dynamic-solution.spec.ts rename to packages/~solution/test/spec/dynamic-solution.spec.ts diff --git a/packages/novem/test/spec/lazy-solution.spec.ts b/packages/~solution/test/spec/lazy-solution.spec.ts similarity index 95% rename from packages/novem/test/spec/lazy-solution.spec.ts rename to packages/~solution/test/spec/lazy-solution.spec.ts index 8e66958b..00d4f34e 100644 --- a/packages/novem/test/spec/lazy-solution.spec.ts +++ b/packages/~solution/test/spec/lazy-solution.spec.ts @@ -1,4 +1,4 @@ -import { LazySolution, SolutionType } from '../../src/novem'; +import { LazySolution, SolutionType } from '../../src/index'; import assert from 'assert'; describe diff --git a/packages/novem/test/spec/solution-type.spec.ts b/packages/~solution/test/spec/solution-type.spec.ts similarity index 100% rename from packages/novem/test/spec/solution-type.spec.ts rename to packages/~solution/test/spec/solution-type.spec.ts diff --git a/packages/quinquaginta-duo/tsconfig.json b/packages/~solution/tsconfig.json similarity index 100% rename from packages/quinquaginta-duo/tsconfig.json rename to packages/~solution/tsconfig.json diff --git a/src/lib/debug.js b/src/lib/debug.js index 4766c37d..3abf946f 100644 --- a/src/lib/debug.js +++ b/src/lib/debug.js @@ -38,9 +38,9 @@ from './obj-utils'; import { ScrewBuffer, optimizeSolutions } from './screw-buffer'; import { DynamicSolution, SimpleSolution } from './solution'; import trimJS from './trim-js'; -import { SolutionType, calculateSolutionType } from 'novem'; +import { SolutionType, calculateSolutionType } from '~solution'; import { MaskMap, MaskSet, maskAreEqual, maskIncludes, maskNew, maskNext, maskUnion } -from 'quinquaginta-duo'; +from '~mask'; if (typeof NO_DEBUG === 'undefined') { diff --git a/src/lib/definers.js b/src/lib/definers.js index b3af2904..d304ab42 100644 --- a/src/lib/definers.js +++ b/src/lib/definers.js @@ -1,6 +1,6 @@ import { featuresToMask } from './features'; import { _Array_prototype_push_apply, _Array_prototype_slice_call } from './obj-utils'; -import { maskUnion } from 'quinquaginta-duo'; +import { maskUnion } from '~mask'; function callWithFeatures() { diff --git a/src/lib/definitions.js b/src/lib/definitions.js index a6b6a5e8..be89162e 100644 --- a/src/lib/definitions.js +++ b/src/lib/definitions.js @@ -9,7 +9,7 @@ import { replaceStaticExpr } from './encoder/encoder- import { Feature } from './features'; import { _String, createEmpty, noProto } from './obj-utils'; import { LazySolution, SimpleSolution } from './solution'; -import { SolutionType } from 'novem'; +import { SolutionType } from '~solution'; export var AMENDINGS = ['true', 'undefined', 'NaN']; diff --git a/src/lib/encoder/encoder-base.js b/src/lib/encoder/encoder-base.js index e4d9f21a..d6f83853 100644 --- a/src/lib/encoder/encoder-base.js +++ b/src/lib/encoder/encoder-base.js @@ -45,8 +45,8 @@ import replaceCharByAtob from './replace-char-by-atob'; import replaceCharByCharCode from './replace-char-by-char-code'; import replaceCharByEscSeq from './replace-char-by-esc-seq'; import replaceCharByUnescape from './replace-char-by-unescape'; -import { SolutionType } from 'novem'; -import { maskIncludes, maskNew } from 'quinquaginta-duo'; +import { maskIncludes, maskNew } from '~mask'; +import { SolutionType } from '~solution'; var ATOB_MASK = Feature.ATOB.mask; diff --git a/src/lib/encoder/hex-code-of.js b/src/lib/encoder/hex-code-of.js index c5e01923..e8589bff 100644 --- a/src/lib/encoder/hex-code-of.js +++ b/src/lib/encoder/hex-code-of.js @@ -1,6 +1,6 @@ import { OPTIMAL_B } from '../definitions'; import { extraZeros } from './encoder-utils'; -import { EMPTY_SOLUTION } from 'novem'; +import { EMPTY_SOLUTION } from '~solution'; var REPLACE_OPTIONS = { firstSolution: EMPTY_SOLUTION }; diff --git a/src/lib/features.js b/src/lib/features.js index 4f447978..7a2eefcc 100644 --- a/src/lib/features.js +++ b/src/lib/features.js @@ -31,7 +31,7 @@ import } from './obj-utils'; import { MaskSet, maskAreEqual, maskIncludes, maskIntersection, maskNew, maskNext, maskUnion } -from 'quinquaginta-duo'; +from '~mask'; var ALL = createEmpty(); var DESCRIPTION_MAP = createEmpty(); diff --git a/src/lib/jscrewit-base.js b/src/lib/jscrewit-base.js index be17b2cd..89040f99 100644 --- a/src/lib/jscrewit-base.js +++ b/src/lib/jscrewit-base.js @@ -7,7 +7,7 @@ import { wrapWithCall, wrapWithEval } from './enco import { Feature, validMaskFromArrayOrStringOrFeature } from './features'; import { _Error, _String, _setTimeout, assignNoEnum, esToString } from './obj-utils'; import trimJS from './trim-js'; -import { MaskMap, maskNew } from 'quinquaginta-duo'; +import { MaskMap, maskNew } from '~mask'; function cacheEncoder(encoder) { diff --git a/src/lib/optimizers/comma-optimizer.js b/src/lib/optimizers/comma-optimizer.js index fff346a5..b8334ef0 100644 --- a/src/lib/optimizers/comma-optimizer.js +++ b/src/lib/optimizers/comma-optimizer.js @@ -1,6 +1,6 @@ import { SCREW_AS_STRING } from '../screw-buffer'; import { SimpleSolution } from '../solution'; -import { SolutionType } from 'novem'; +import { SolutionType } from '~solution'; function appendLengthOf(solution) { diff --git a/src/lib/optimizers/surrogate-pair-optimizer.js b/src/lib/optimizers/surrogate-pair-optimizer.js index b54a8222..b9cf6d89 100644 --- a/src/lib/optimizers/surrogate-pair-optimizer.js +++ b/src/lib/optimizers/surrogate-pair-optimizer.js @@ -1,6 +1,6 @@ import { codePointFromSurrogatePair, shortestOf } from '../encoder/encoder-utils'; import { _Math_min } from '../obj-utils'; -import { SimpleSolution, SolutionType } from 'novem'; +import { SimpleSolution, SolutionType } from '~solution'; function calculateMinSurrogateAppendLength(encoder) { diff --git a/src/lib/optimizers/to-string-optimizer.js b/src/lib/optimizers/to-string-optimizer.js index 28fc39f0..4d0d524b 100644 --- a/src/lib/optimizers/to-string-optimizer.js +++ b/src/lib/optimizers/to-string-optimizer.js @@ -11,7 +11,7 @@ import { replaceMultiDigitNumber } from '../encoder/encoder-base'; import { _parseInt, createEmpty } from '../obj-utils'; import { SimpleSolution } from '../solution'; -import { SolutionType } from 'novem'; +import { SolutionType } from '~solution'; var BOND_EXTRA_LENGTH = 2; // Extra length of bonding parentheses "(" and ")". var CLUSTER_EXTRA_LENGTHS = []; diff --git a/src/lib/solution.js b/src/lib/solution.js index 30c65add..9a9078b3 100644 --- a/src/lib/solution.js +++ b/src/lib/solution.js @@ -1,5 +1,5 @@ import { assignNoEnum, _Object_defineProperty } from './obj-utils'; -import { AbstractSolution } from 'novem'; +import { AbstractSolution } from '~solution'; assignNoEnum ( @@ -18,4 +18,4 @@ assignNoEnum } ); -export { DynamicSolution, EMPTY_SOLUTION, LazySolution, SimpleSolution } from 'novem'; +export { DynamicSolution, EMPTY_SOLUTION, LazySolution, SimpleSolution } from '~solution'; From 59e999e16f791853873bb3f9faf32ee73f1f7185 Mon Sep 17 00:00:00 2001 From: Francesco Trotta Date: Sat, 31 Jul 2021 09:22:07 +0200 Subject: [PATCH 002/101] ~result-format as a package --- .github/workflows/JScrewIt.yml | 2 +- .github/workflows/~mask.yml | 4 +- .github/workflows/~result-format.yml | 82 ++++++++ .github/workflows/~solution.yml | 4 +- .gitignore | 1 + dev/internal/package-utils.mjs | 99 ++++++++++ .../internal/prepare-package-legacy-test.mjs | 12 +- gulpfile.js | 12 +- package.json | 5 +- packages/~mask/dev/make-impl.js | 70 +------ packages/~mask/gulpfile.js | 3 +- packages/~mask/package.json | 10 +- packages/~mask/readme.md | 5 - packages/~mask/tsconfig.json | 1 + packages/~result-format/.npmrc | 1 + .../dev/make-browser-spec-runner.js | 17 ++ packages/~result-format/dev/make-impl.js | 34 ++++ packages/~result-format/dev/make-lib.js | 17 ++ packages/~result-format/gulpfile.js | 70 +++++++ packages/~result-format/license.txt | 13 ++ packages/~result-format/package.json | 43 ++++ packages/~result-format/readme.md | 1 + packages/~result-format/src/index.ts | 1 + packages/~result-format/src/package.json | 3 + packages/~result-format/src/result-format.ts | 80 ++++++++ .../test/browser-spec-runner.ts | 2 + packages/~result-format/test/mocha-setup.ts | 9 + packages/~result-format/test/package.json | 6 + packages/~result-format/test/spec-runner.html | 19 ++ .../test/spec/result-format.spec.ts | 154 +++++++++++++++ packages/~result-format/tsconfig.json | 23 +++ packages/~solution/dev/make-impl.js | 84 +------- packages/~solution/dev/prepare-legacy-test.js | 54 ------ packages/~solution/gulpfile.js | 2 +- packages/~solution/package.json | 10 +- packages/~solution/readme.md | 5 - packages/~solution/tsconfig.json | 1 + src/test/spec-runner.html.hbs | 2 - src/ui/result-format.js | 90 --------- src/ui/ui-main.js | 15 +- test/result-format.spec.js | 183 ------------------ 41 files changed, 714 insertions(+), 535 deletions(-) create mode 100644 .github/workflows/~result-format.yml create mode 100644 dev/internal/package-utils.mjs rename packages/~mask/dev/prepare-legacy-test.js => dev/internal/prepare-package-legacy-test.mjs (78%) create mode 100644 packages/~result-format/.npmrc create mode 100755 packages/~result-format/dev/make-browser-spec-runner.js create mode 100644 packages/~result-format/dev/make-impl.js create mode 100755 packages/~result-format/dev/make-lib.js create mode 100644 packages/~result-format/gulpfile.js create mode 100644 packages/~result-format/license.txt create mode 100644 packages/~result-format/package.json create mode 100644 packages/~result-format/readme.md create mode 100644 packages/~result-format/src/index.ts create mode 100644 packages/~result-format/src/package.json create mode 100644 packages/~result-format/src/result-format.ts create mode 100644 packages/~result-format/test/browser-spec-runner.ts create mode 100644 packages/~result-format/test/mocha-setup.ts create mode 100644 packages/~result-format/test/package.json create mode 100644 packages/~result-format/test/spec-runner.html create mode 100644 packages/~result-format/test/spec/result-format.spec.ts create mode 100644 packages/~result-format/tsconfig.json delete mode 100755 packages/~solution/dev/prepare-legacy-test.js delete mode 100644 src/ui/result-format.js delete mode 100644 test/result-format.spec.js diff --git a/.github/workflows/JScrewIt.yml b/.github/workflows/JScrewIt.yml index 32db7eed..6b0aae9b 100644 --- a/.github/workflows/JScrewIt.yml +++ b/.github/workflows/JScrewIt.yml @@ -14,8 +14,8 @@ jobs: with: node-version: 16.x - run: npm install --workspaces - - run: npm run --workspaces make - run: npm install + - run: npm run --workspaces make - run: gulp lint - run: gulp bundle:lib - uses: actions/upload-artifact@v2 diff --git a/.github/workflows/~mask.yml b/.github/workflows/~mask.yml index dbc13f1b..3e838590 100644 --- a/.github/workflows/~mask.yml +++ b/.github/workflows/~mask.yml @@ -51,8 +51,8 @@ jobs: - uses: actions/setup-node@v2 with: node-version: 16.x - - run: npm install - - run: node dev/prepare-legacy-test + - run: npm install --prefix ../.. + - run: npm run prepare-legacy-test - uses: actions/upload-artifact@v2 with: name: node-legacy diff --git a/.github/workflows/~result-format.yml b/.github/workflows/~result-format.yml new file mode 100644 index 00000000..d6985927 --- /dev/null +++ b/.github/workflows/~result-format.yml @@ -0,0 +1,82 @@ +name: ~result-format Node.js CI + +on: [push, pull_request] + +defaults: + + run: + + working-directory: packages/~result-format + +jobs: + + lint: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: 16.x + - run: npm install + - run: gulp lint + + test: + + name: test (Node.js ${{ matrix.node-version }}) + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [12.x, 14.x, 16.x] + + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + - run: npm install + - run: npm test + + prepare-legacy-test: + + name: prepare legacy test + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: 16.x + - run: npm install --prefix ../.. + - run: npm run prepare-legacy-test + - uses: actions/upload-artifact@v2 + with: + name: node-legacy + path: packages/~result-format/test/node-legacy + + legacy-test: + + name: legacy test (Node.js ${{ matrix.node-version }}) + + needs: prepare-legacy-test + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [0.10.x, 0.12.x, 4.x, 6.x, 8.x, 10.x] + + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + - uses: actions/download-artifact@v2 + with: + name: node-legacy + path: packages/~result-format/test/node-legacy + - run: npm run legacy-test diff --git a/.github/workflows/~solution.yml b/.github/workflows/~solution.yml index 7fa36cfc..623de367 100644 --- a/.github/workflows/~solution.yml +++ b/.github/workflows/~solution.yml @@ -51,8 +51,8 @@ jobs: - uses: actions/setup-node@v2 with: node-version: 16.x - - run: npm install - - run: node dev/prepare-legacy-test + - run: npm install --prefix ../.. + - run: npm run prepare-legacy-test - uses: actions/upload-artifact@v2 with: name: node-legacy diff --git a/.gitignore b/.gitignore index b511a616..b1845c7f 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ /lib/**/*.js /lib/feature-all.d.ts /packages/*/lib +/packages/*/test/browser-spec-runner.js /packages/*/test/node-legacy /test/spec-runner.html /ui/**/*.js diff --git a/dev/internal/package-utils.mjs b/dev/internal/package-utils.mjs new file mode 100644 index 00000000..3f4b5cf6 --- /dev/null +++ b/dev/internal/package-utils.mjs @@ -0,0 +1,99 @@ +import fastGlob from 'fast-glob'; +import { createRequire } from 'module'; +import { isAbsolute, join, relative } from 'path'; +import { rollup } from 'rollup'; +import rollupPluginCleanup from 'rollup-plugin-cleanup'; +import ts from 'typescript'; +import { fileURLToPath } from 'url'; + +async function bundle(pkgPath) +{ + const pkgConfigPath = join(pkgPath, 'package.json'); + const require = createRequire(pkgConfigPath); + const { homepage, name } = require(pkgConfigPath); + const inputPath = join(pkgPath, '.tmp-out/index.js'); + const inputOptions = + { + external: ['tslib'], + input: inputPath, + plugins: [rollupPluginCleanup({ comments: /^(?!\/\s*@ts-)/ })], + }; + const outputPath = join(pkgPath, 'lib/index.js'); + const outputOptions = { banner: `// ${name} – ${homepage}\n`, file: outputPath, format: 'esm' }; + await bundleJS(inputOptions, outputOptions); +} + +export async function bundleJS(inputOptions, outputOptions) +{ + const bundle = await rollup(inputOptions); + const { output: [{ code }] } = await bundle.write(outputOptions); + return code; +} + +async function compile(pkgPath, dTsFilter) +{ + const declarationDir = join(pkgPath, 'lib'); + const newOptions = + { + declaration: true, + declarationDir, + outDir: join(pkgPath, '.tmp-out'), + rootDir: join(pkgPath, 'src'), + types: [], + }; + const writeFile = getWriteFile(ts.sys.writeFile, declarationDir, dTsFilter); + await compileTS(pkgPath, 'src/**/*.ts', newOptions, writeFile); +} + +export async function compileTS(pkgPath, source, newOptions, writeFile) +{ + const { sys } = ts; + const program = + await + (async () => + { + const fileNames = await fastGlob(source, { absolute: true, cwd: pkgPath }); + const tsConfigPath = join(pkgPath, 'tsconfig.json'); + const tsConfig = ts.readConfigFile(tsConfigPath, sys.readFile); + const { options } = ts.parseJsonConfigFileContent(tsConfig.config, sys, pkgPath); + Object.assign(options, { importHelpers: true, module: ts.ModuleKind.ES2020 }, newOptions); + const program = ts.createProgram(fileNames, options); + return program; + } + )(); + const emitResult = program.emit(undefined, writeFile); + const diagnostics = [...ts.getPreEmitDiagnostics(program), ...emitResult.diagnostics]; + if (diagnostics.length) + { + const reporter = ts.createDiagnosticReporter(sys, true); + diagnostics.forEach(reporter); + } + if (emitResult.emitSkipped) + throw Error('TypeScript compilation failed'); +} + +function getWriteFile(sysWriteFile, declarationDir, dTsFilter) +{ + const writeFile = + dTsFilter === undefined ? + sysWriteFile : + (path, data, writeByteOrderMark) => + { + const relativePath = relative(declarationDir, path); + if + ( + relativePath.startsWith('..') || + isAbsolute(relativePath) || + dTsFilter.includes(relativePath) + ) + sysWriteFile(path, data, writeByteOrderMark); + }; + return writeFile; +} + +export async function makePackage(pkgURL, dTsFilter) +{ + const pkgPath = fileURLToPath(pkgURL); + await compile(pkgPath, dTsFilter); + await bundle(pkgPath); +} diff --git a/packages/~mask/dev/prepare-legacy-test.js b/dev/internal/prepare-package-legacy-test.mjs similarity index 78% rename from packages/~mask/dev/prepare-legacy-test.js rename to dev/internal/prepare-package-legacy-test.mjs index 36b15f34..eaf0116d 100755 --- a/packages/~mask/dev/prepare-legacy-test.js +++ b/dev/internal/prepare-package-legacy-test.mjs @@ -1,11 +1,8 @@ -#!/usr/bin/env node - import { fork, spawn } from 'child_process'; import { mkdir, rm, writeFile } from 'fs/promises'; import { createRequire } from 'module'; import { EOL } from 'os'; import { join } from 'path'; -import { fileURLToPath } from 'url'; const NODE_LEGACY_DIR = 'test/node-legacy'; @@ -28,9 +25,9 @@ async function npmInstall() await endOf(childProcess); } -async function tsc(url) +async function tsc() { - const tscPath = createRequire(url).resolve('typescript/bin/tsc'); + const tscPath = createRequire(import.meta.url).resolve('typescript/bin/tsc'); const childProcess = fork(tscPath, ['--outDir', 'test/node-legacy']); await endOf(childProcess); } @@ -39,11 +36,8 @@ async function tsc(url) { try { - const pkgURL = new URL('..', import.meta.url); - const pkgPath = fileURLToPath(pkgURL); - process.chdir(pkgPath); await rm(NODE_LEGACY_DIR, { force: true, recursive: true }); - await Promise.all([tsc(pkgURL), npmInstall()]); + await Promise.all([tsc(), npmInstall()]); } catch (error) { diff --git a/gulpfile.js b/gulpfile.js index f93b1cb9..5b85786c 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -25,7 +25,9 @@ async function bundle(inputOptions, outputFile, banner) async function bundleUI() { - const inputOptions = { input: 'src/ui/ui-main.js' }; + const { nodeResolve } = require('@rollup/plugin-node-resolve'); + + const inputOptions = { input: 'src/ui/ui-main.js', plugins: [nodeResolve()] }; await bundle(inputOptions, '.tmp-out/ui.js'); } @@ -185,7 +187,8 @@ task nodeResolve({ dedupe: ['tslib'] }), ], }; - await bundle(inputOptions, 'lib/jscrewit.js', `// JScrewIt ${version} – ${homepage}\n`); + const banner = `// JScrewIt ${version} – ${homepage}\n`; + await bundle(inputOptions, 'lib/jscrewit.js', banner); }, ); @@ -274,14 +277,13 @@ task 'make-spec-runner', async () => { + const fastGlob = require('fast-glob'); const { writeFile } = require('fs/promises'); - const glob = require('glob'); const Handlebars = require('handlebars'); - const { promisify } = require('util'); async function getSpecs() { - const specs = await promisify(glob)('**/*.spec.js', { cwd: 'test/lib' }); + const specs = await fastGlob('**/*.spec.js', { cwd: 'test/lib' }); return specs; } diff --git a/package.json b/package.json index b2cfd34c..46d8e0f2 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "ebdd": "latest", "eslint-plugin-ebdd": "latest", "expectations": "latest", - "glob": "*", + "fast-glob": "latest", "gulp": "latest", "gulp-jsdoc3": "latest", "gulp-rename": "latest", @@ -68,7 +68,8 @@ "rollup-plugin-cleanup": "latest", "tslib": "latest", "typedoc": "latest", - "typedoc-plugin-markdown": "latest" + "typedoc-plugin-markdown": "latest", + "typescript": "latest" }, "workspaces": [ "./packages/*" diff --git a/packages/~mask/dev/make-impl.js b/packages/~mask/dev/make-impl.js index a8d3db8a..e8d7691d 100644 --- a/packages/~mask/dev/make-impl.js +++ b/packages/~mask/dev/make-impl.js @@ -1,72 +1,8 @@ -import fastGlob from 'fast-glob'; -import { createRequire } from 'module'; -import { join } from 'path'; -import { rollup } from 'rollup'; -import rollupPluginCleanup from 'rollup-plugin-cleanup'; -import ts from 'typescript'; -import { fileURLToPath } from 'url'; - -async function bundle(pkgPath) -{ - const pkgConfigPath = join(pkgPath, 'package.json'); - const require = createRequire(pkgConfigPath); - const { homepage, name } = require(pkgConfigPath); - const inputPath = join(pkgPath, '.tmp-out/index.js'); - const inputOptions = - { - external: ['tslib'], - input: inputPath, - onwarn(warning) - { - if (warning.code !== 'THIS_IS_UNDEFINED') - console.error(warning.message); - }, - plugins: [rollupPluginCleanup({ comments: /^(?!\/ *(?:@ts-|eslint-disable-line ))/ })], - }; - const outputPath = join(pkgPath, 'lib/index.js'); - const outputOptions = - { banner: `// ${name} – ${homepage}\n`, file: outputPath, format: 'esm' }; - const bundle = await rollup(inputOptions); - await bundle.write(outputOptions); -} - -async function compile(pkgPath) -{ - const { sys } = ts; - const program = - await - (async () => - { - const fileNames = await fastGlob('src/**/*.ts', { absolute: true, cwd: pkgPath }); - const tsConfigPath = join(pkgPath, 'tsconfig.json'); - const tsConfig = ts.readConfigFile(tsConfigPath, sys.readFile); - const { options } = ts.parseJsonConfigFileContent(tsConfig.config, sys, pkgPath); - options.declaration = true; - options.declarationDir = join(pkgPath, 'lib'); - options.importHelpers = true; - options.module = ts.ModuleKind.ES2020; - options.outDir = join(pkgPath, '.tmp-out'); - options.rootDir = join(pkgPath, 'src'); - options.types = []; - const program = ts.createProgram(fileNames, options); - return program; - } - )(); - const emitResult = program.emit(); - const diagnostics = [...ts.getPreEmitDiagnostics(program), ...emitResult.diagnostics]; - if (diagnostics.length) - { - const reporter = ts.createDiagnosticReporter(sys, true); - diagnostics.forEach(reporter); - } - if (emitResult.emitSkipped) - throw Error('TypeScript compilation failed'); -} +const PACKAGE_UTILS_URL = '../../../dev/internal/package-utils.mjs'; export default async function make() { + const { makePackage } = await import(PACKAGE_UTILS_URL); const pkgURL = new URL('..', import.meta.url); - const pkgPath = fileURLToPath(pkgURL); - await compile(pkgPath); - await bundle(pkgPath); + await makePackage(pkgURL); } diff --git a/packages/~mask/gulpfile.js b/packages/~mask/gulpfile.js index 5dad10d5..2855cfad 100644 --- a/packages/~mask/gulpfile.js +++ b/packages/~mask/gulpfile.js @@ -24,7 +24,7 @@ export async function lint() parserOptions: { project: 'tsconfig.json', sourceType: 'module' }, }, { - src: 'test/spec/**/*.ts', + src: 'test/**/*.ts', envs: ['ebdd/ebdd', 'mocha'], parserOptions: { project: 'test/tsconfig.json', sourceType: 'module' }, plugins: ['ebdd'], @@ -49,7 +49,6 @@ export function test(callback) '--reporter=text-summary', mochaPath, '--check-leaks', - '--global=__coverage__', '--require=ts-node/register', '--ui=ebdd', 'test/spec/**/*.spec.ts', diff --git a/packages/~mask/package.json b/packages/~mask/package.json index b1530099..5e0f0e9a 100644 --- a/packages/~mask/package.json +++ b/packages/~mask/package.json @@ -18,9 +18,9 @@ }, "scripts": { "build": "npm install && gulp", - "legacy-build": "node dev/prepare-legacy-test && npm run legacy-test", "legacy-test": "node -- test/node-legacy/node_modules/mocha/bin/mocha --check-leaks --ui=ebdd test/node-legacy/test/spec/**/*.spec.js", "make": "node dev/make", + "prepare-legacy-test": "node ../../dev/internal/prepare-package-legacy-test.mjs", "test": "mocha --check-leaks --require=ts-node/register --ui=ebdd test/spec/**/*.spec.ts" }, "devDependencies": { @@ -29,16 +29,10 @@ "@types/node": "latest", "ebdd": "latest", "eslint-plugin-ebdd": "latest", - "fast-glob": "latest", "gulp": "latest", - "merge-stream": "latest", "mocha": "latest", "nyc": "latest", - "rollup": "latest", - "rollup-plugin-cleanup": "latest", - "ts-node": "latest", - "tslib": "latest", - "typescript": "latest" + "ts-node": "latest" }, "private": true, "type": "module" diff --git a/packages/~mask/readme.md b/packages/~mask/readme.md index 733ad120..187892e8 100644 --- a/packages/~mask/readme.md +++ b/packages/~mask/readme.md @@ -16,8 +16,3 @@ Apart from that, do not make any assumptions about the internal representation o or truthiness. For performance reasons, mask functions do not check that their arguments are valid masks. Passing anything other than a mask as an argument to a mask function results in undefined behavior. - -## Compatibility - -The same JavaScript engines supported by the latest version of JScrewIt are supported by ~mask. -See [here](https://github.com/fasttime/JScrewIt#compatibility). diff --git a/packages/~mask/tsconfig.json b/packages/~mask/tsconfig.json index 13b68b98..d6f1a79b 100644 --- a/packages/~mask/tsconfig.json +++ b/packages/~mask/tsconfig.json @@ -6,6 +6,7 @@ "strict": true, "target": "ES5", "types": [ + "ebdd", "mocha", "node" ], diff --git a/packages/~result-format/.npmrc b/packages/~result-format/.npmrc new file mode 100644 index 00000000..43c97e71 --- /dev/null +++ b/packages/~result-format/.npmrc @@ -0,0 +1 @@ +package-lock=false diff --git a/packages/~result-format/dev/make-browser-spec-runner.js b/packages/~result-format/dev/make-browser-spec-runner.js new file mode 100755 index 00000000..931e4a66 --- /dev/null +++ b/packages/~result-format/dev/make-browser-spec-runner.js @@ -0,0 +1,17 @@ +#!/usr/bin/env node + +import { makeBrowserSpecRunner } from './make-impl.js'; + +(async () => +{ + try + { + await makeBrowserSpecRunner(); + } + catch (error) + { + console.error(error); + process.exitCode = 1; + } +} +)(); diff --git a/packages/~result-format/dev/make-impl.js b/packages/~result-format/dev/make-impl.js new file mode 100644 index 00000000..6c5bb84b --- /dev/null +++ b/packages/~result-format/dev/make-impl.js @@ -0,0 +1,34 @@ +import { join } from 'path'; +import rollupPluginNodeBuiltins from 'rollup-plugin-node-builtins'; +import rollupPluginNodeGlobals from 'rollup-plugin-node-globals'; +import { fileURLToPath } from 'url'; + +const PACKAGE_UTILS_URL = '../../../dev/internal/package-utils.mjs'; + +export async function makeBrowserSpecRunner() +{ + const { bundleJS, compileTS } = await import(PACKAGE_UTILS_URL); + const pkgURL = new URL('..', import.meta.url); + const pkgPath = fileURLToPath(pkgURL); + { + const outDir = join(pkgPath, '.tmp-out'); + const rootDir = join(pkgPath, '.'); + const newOptions = { outDir, rootDir }; + await compileTS(pkgPath, '{src,test}/**/*.ts', newOptions); + } + { + const inputPath = join(pkgPath, '.tmp-out/test/browser-spec-runner.js'); + const plugins = [rollupPluginNodeBuiltins(), rollupPluginNodeGlobals({ buffer: false })]; + const inputOptions = { input: inputPath, plugins }; + const outputPath = join(pkgPath, 'test/browser-spec-runner.js'); + const outputOptions = { esModule: false, file: outputPath, format: 'iife' }; + await bundleJS(inputOptions, outputOptions); + } +} + +export async function makeLib() +{ + const { makePackage } = await import(PACKAGE_UTILS_URL); + const pkgURL = new URL('..', import.meta.url); + await makePackage(pkgURL); +} diff --git a/packages/~result-format/dev/make-lib.js b/packages/~result-format/dev/make-lib.js new file mode 100755 index 00000000..6cbee98b --- /dev/null +++ b/packages/~result-format/dev/make-lib.js @@ -0,0 +1,17 @@ +#!/usr/bin/env node + +import { makeLib } from './make-impl.js'; + +(async () => +{ + try + { + await makeLib(); + } + catch (error) + { + console.error(error); + process.exitCode = 1; + } +} +)(); diff --git a/packages/~result-format/gulpfile.js b/packages/~result-format/gulpfile.js new file mode 100644 index 00000000..49ce3481 --- /dev/null +++ b/packages/~result-format/gulpfile.js @@ -0,0 +1,70 @@ +import { makeBrowserSpecRunner, makeLib } from './dev/make-impl.js'; +import { lint as lintImpl } from '@fasttime/lint'; +import { fork } from 'child_process'; +import { rm } from 'fs/promises'; +import gulp from 'gulp'; +import { createRequire } from 'module'; + +const { parallel, series } = gulp; + +export async function clean() +{ + const paths = + [ + '.nyc_output', + '.tmp-out', + 'coverage', + 'lib', + 'test/browser-spec-runner.js', + 'test/node-legacy', + ]; + const options = { force: true, recursive: true }; + await Promise.all(paths.map(path => rm(path, options))); +} + +export async function lint() +{ + await + lintImpl + ( + { + src: 'src/**/*.ts', + parserOptions: { project: 'tsconfig.json', sourceType: 'module' }, + }, + { + src: 'test/**/*.ts', + envs: ['ebdd/ebdd', 'mocha'], + parserOptions: { project: 'tsconfig.json', sourceType: 'module' }, + plugins: ['ebdd'], + }, + { + src: ['*.js', 'dev/**/*.js'], + envs: ['node'], + parserOptions: { ecmaVersion: 2020, sourceType: 'module' }, + }, + ); +} + +export function test(callback) +{ + const { resolve } = createRequire(import.meta.url); + const nycPath = resolve('nyc/bin/nyc'); + const mochaPath = resolve('mocha/bin/mocha'); + const forkArgs = + [ + '--include=src', + '--reporter=html', + '--reporter=text-summary', + mochaPath, + '--check-leaks', + '--require=ts-node/register', + '--ui=ebdd', + 'test/spec/**/*.spec.ts', + ]; + const childProcess = fork(nycPath, forkArgs); + childProcess.on('exit', code => callback(code && 'Test failed')); +} + +export { makeLib, makeBrowserSpecRunner }; + +export default series(parallel(clean, lint), test, parallel(makeLib, makeBrowserSpecRunner)); diff --git a/packages/~result-format/license.txt b/packages/~result-format/license.txt new file mode 100644 index 00000000..3d38ace8 --- /dev/null +++ b/packages/~result-format/license.txt @@ -0,0 +1,13 @@ +Copyright Francesco Trotta (https://github.com/fasttime) + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/packages/~result-format/package.json b/packages/~result-format/package.json new file mode 100644 index 00000000..dd573f5d --- /dev/null +++ b/packages/~result-format/package.json @@ -0,0 +1,43 @@ +{ + "name": "~result-format", + "description": "Arbitrary value formatter for JScrewIt", + "homepage": "https://github.com/fasttime/JScrewIt/tree/master/packages/~result-format", + "bugs": "https://github.com/fasttime/JScrewIt/issues", + "license": "ISC", + "author": "Francesco Trotta (https://github.com/fasttime)", + "files": [ + "lib", + "!.*" + ], + "exports": "./lib/index.js", + "module": "./lib/index.js", + "types": "lib/index.d.ts", + "directories": { + "lib": "lib", + "test": "test" + }, + "scripts": { + "build": "npm install && gulp", + "legacy-test": "node -- test/node-legacy/node_modules/mocha/bin/mocha --check-leaks --ui=ebdd test/node-legacy/test/spec/**/*.spec.js", + "make": "node dev/make-lib", + "prepare-legacy-test": "node ../../dev/internal/prepare-package-legacy-test.mjs", + "test": "mocha --check-leaks --require=ts-node/register --ui=ebdd test/spec/**/*.spec.ts" + }, + "devDependencies": { + "@fasttime/lint": "latest", + "@types/mocha": "latest", + "@types/node": "latest", + "ebdd": "latest", + "eslint-plugin-ebdd": "latest", + "gulp": "latest", + "mocha": "latest", + "mocha-bar": "latest", + "mocha_3": "npm:mocha@3.5.3", + "nyc": "latest", + "rollup-plugin-node-builtins": "latest", + "rollup-plugin-node-globals": "latest", + "ts-node": "latest" + }, + "private": true, + "type": "module" +} diff --git a/packages/~result-format/readme.md b/packages/~result-format/readme.md new file mode 100644 index 00000000..bec08d95 --- /dev/null +++ b/packages/~result-format/readme.md @@ -0,0 +1 @@ +# ~result-format diff --git a/packages/~result-format/src/index.ts b/packages/~result-format/src/index.ts new file mode 100644 index 00000000..c7527d6d --- /dev/null +++ b/packages/~result-format/src/index.ts @@ -0,0 +1 @@ +export * from './result-format'; diff --git a/packages/~result-format/src/package.json b/packages/~result-format/src/package.json new file mode 100644 index 00000000..158547c2 --- /dev/null +++ b/packages/~result-format/src/package.json @@ -0,0 +1,3 @@ +{ + "files": [] +} diff --git a/packages/~result-format/src/result-format.ts b/packages/~result-format/src/result-format.ts new file mode 100644 index 00000000..cec8141f --- /dev/null +++ b/packages/~result-format/src/result-format.ts @@ -0,0 +1,80 @@ +function formatItem(value: unknown): string | undefined +{ + let text; + const type = typeof value; + try + { + if (type === 'string') + text = `"${value}"`; + else if (value === 0 && 1 / value < 0) + text = '-0'; + else if (Array.isArray(value)) + text = value.length ? '[…]' : '[]'; + else if (type === 'bigint') + text = `${value}n`; + // In Node.js 0.12, calling String with a symbol argument throws a TypeError. + // Since this script is only used in browsers this is not a true problem, but still. + else if (type !== 'symbol') + text = String(value); + else + text = (value as symbol).toString(); + } + catch + { } + return text; +} + +export function formatValue(value: unknown): string | undefined +{ + let text; + if (Array.isArray(value)) + { + try + { + text = `[${value.map(formatItem).join(', ')}]`; + } + catch + { } + } + else + text = formatItem(value); + return text; +} + +export function formatValueType(value: unknown): string | undefined +{ + let valueType; + if (value !== null) + { + const type = typeof value; + // document.all has type "undefined". + if (type === 'function' || type === 'object' || type === 'undefined') + { + const prototype = Object.getPrototypeOf(value) as unknown; + if (prototype === Array.prototype) + { + switch ((value as unknown[]).length) + { + case 0: + valueType = 'an empty array'; + break; + case 1: + valueType = 'a one element array'; + break; + default: + valueType = 'an array'; + break; + } + } + else if (prototype === Date.prototype) + valueType = 'a date'; + else if (prototype === RegExp.prototype) + valueType = 'a regular expression'; + else if (type === 'function') + valueType = 'a function'; + else + valueType = 'an object'; + } + } + return valueType; +} diff --git a/packages/~result-format/test/browser-spec-runner.ts b/packages/~result-format/test/browser-spec-runner.ts new file mode 100644 index 00000000..867e5738 --- /dev/null +++ b/packages/~result-format/test/browser-spec-runner.ts @@ -0,0 +1,2 @@ +import './mocha-setup'; +import './spec/result-format.spec'; diff --git a/packages/~result-format/test/mocha-setup.ts b/packages/~result-format/test/mocha-setup.ts new file mode 100644 index 00000000..ebe58a7f --- /dev/null +++ b/packages/~result-format/test/mocha-setup.ts @@ -0,0 +1,9 @@ +mocha.setup({ checkLeaks: true, reporter: MochaBar, ui: 'ebdd' }); +addEventListener +( + 'DOMContentLoaded', + () => + { + mocha.run(); + }, +); diff --git a/packages/~result-format/test/package.json b/packages/~result-format/test/package.json new file mode 100644 index 00000000..fce7e495 --- /dev/null +++ b/packages/~result-format/test/package.json @@ -0,0 +1,6 @@ +{ + "files": [], + "devDependencies": { + "ebdd": "*" + } +} diff --git a/packages/~result-format/test/spec-runner.html b/packages/~result-format/test/spec-runner.html new file mode 100644 index 00000000..2556576c --- /dev/null +++ b/packages/~result-format/test/spec-runner.html @@ -0,0 +1,19 @@ + + + + + + + + + + + +~result-format Test Suite +

~result-format Test Suite

diff --git a/packages/~result-format/test/spec/result-format.spec.ts b/packages/~result-format/test/spec/result-format.spec.ts new file mode 100644 index 00000000..17b2f248 --- /dev/null +++ b/packages/~result-format/test/spec/result-format.spec.ts @@ -0,0 +1,154 @@ +import { formatValue, formatValueType } from '../../src/result-format'; +import * as assert from 'assert'; +import type { ParamOrParamInfo } from 'ebdd'; + +interface ParamData +{ + 0: string; + 1: unknown; + 2: string | undefined; + 3?: string; + doBefore?: () => void; + doAfter?: () => void; +} + +function createSparseArray(): unknown[] +{ + const sparseArray = []; + sparseArray[5] = 'foo'; + return sparseArray; +} + +function createSparseSingletonArray(): unknown[] +{ + const sparseSingletonArray: unknown[] = []; + sparseSingletonArray.length = 1; + return sparseSingletonArray; +} + +function createTypeUnknownObjParamData(): ParamData +{ + const obj = Object.create(new Date()) as { }; + obj.toString = (): string => 'foo'; + const paramData: ParamData = ['a strange object', obj, 'foo', 'an object']; + if (typeof Symbol !== 'undefined') + { + if ('toStringTag' in Symbol) + { + Object.defineProperty(obj, Symbol.toStringTag, { get: throwError }); + return paramData; + } + } + const { toString } = Object.prototype; + paramData.doBefore = + (): void => + { + const toStringCall = + (arg: unknown): string => + { + if (arg !== obj) + { + const str = Function.prototype.call.call(toString, arg) as string; + return str; + } + throwError(); + }; + toString.call = toStringCall as typeof toString.call; + }; + paramData.doAfter = + (): void => + { + // @ts-expect-error + delete toString.call; + }; + + return paramData; +} + +function createUnmappableArray(): Omit +{ + const unmappableArray = [] as Omit & { map: unknown; }; + unmappableArray.map = undefined; + return unmappableArray; +} + +function throwError(): never +{ + throw Error(); +} + +const paramDataList: ParamOrParamInfo>[] = +[ + ['a number', 1, '1'], + ['0', 0, '0'], + ['-0', -0, '-0'], + ['NaN', NaN, 'NaN'], + ['Infinity', Infinity, 'Infinity'], + ['an empty string', '', '""'], + ['a string', 'foo', '"foo"'], + ['a multiline string', 'foo\nbar', '"foo\nbar"'], + ['null', null, 'null'], + when + ( + typeof Symbol !== 'undefined', + ['a symbol', typeof Symbol !== 'undefined' && Symbol('foo'), 'Symbol(foo)'], + ), + when + ( + typeof BigInt !== 'undefined', + ['a bigint', typeof BigInt !== 'undefined' && BigInt(1), '1n'], + ), + ['an empty array', [], '[]', 'an empty array'], + ['a one element array', [''], '[""]', 'a one element array'], + ['an array with more elements', [1, 2], '[1, 2]', 'an array'], + ['a nesting of arrays', [[], [{ }]], '[[], […]]', 'an array'], + ['a sparse array', createSparseArray(), '[, , , , , "foo"]', 'an array'], + ['a sparse singleton array', createSparseSingletonArray(), '[]', 'a one element array'], + ['an unmappable array', createUnmappableArray(), undefined, 'an empty array'], + when + ( + typeof document !== 'undefined', + ['document.all', typeof document !== 'undefined' && document.all, , 'an object'], + ), + ['a plain object', { }, '[object Object]', 'an object'], + ['a function', Function(), , 'a function'], + ['a regular expression', /./, '/./', 'a regular expression'], + ['a date', new Date(), , 'a date'], + ['an object that throws errors', { toString: throwError }, undefined, 'an object'], + createTypeUnknownObjParamData(), +]; + +describe.per(paramDataList) +( + 'Given #[0]', + paramData => + { + const { 1: input, 2: expectedValue, 3: expectedValueType, doBefore, doAfter } = paramData; + const expectedValueProvided = 2 in paramData; + if (doBefore) + before(doBefore); + if (doAfter) + after(doAfter); + if (expectedValueProvided) + { + it + ( + 'formatValue returns the expected result', + () => + { + const actualValue = formatValue(input); + assert.strictEqual(actualValue, expectedValue); + }, + ); + } + it + ( + 'formatValueType returns the expected result', + () => + { + const actualValueType = formatValueType(input); + assert.strictEqual(actualValueType, expectedValueType); + }, + ); + }, +); diff --git a/packages/~result-format/tsconfig.json b/packages/~result-format/tsconfig.json new file mode 100644 index 00000000..6af9cbf2 --- /dev/null +++ b/packages/~result-format/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "module": "CommonJS", + "moduleResolution": "node", + "strict": true, + "target": "ES5", + "types": [ + "ebdd", + "mocha", + "mocha-bar", + "node" + ], + "useDefineForClassFields": false, // Define semantics disabled for performance reasons. + }, + "exclude": [ + "test/node-legacy" + ], + "include": [ + "src", + "test" + ] +} diff --git a/packages/~solution/dev/make-impl.js b/packages/~solution/dev/make-impl.js index a5cab1cd..e8d7691d 100644 --- a/packages/~solution/dev/make-impl.js +++ b/packages/~solution/dev/make-impl.js @@ -1,86 +1,8 @@ -import fastGlob from 'fast-glob'; -import { createRequire } from 'module'; -import { isAbsolute, join, relative } from 'path'; -import { rollup } from 'rollup'; -import rollupPluginCleanup from 'rollup-plugin-cleanup'; -import ts from 'typescript'; -import { fileURLToPath } from 'url'; - -async function bundle(pkgPath) -{ - const pkgConfigPath = join(pkgPath, 'package.json'); - const require = createRequire(pkgConfigPath); - const { homepage, name } = require(pkgConfigPath); - const inputPath = join(pkgPath, '.tmp-out/index.js'); - const inputOptions = - { - external: ['tslib'], - input: inputPath, - onwarn(warning) - { - if (warning.code !== 'THIS_IS_UNDEFINED') - console.error(warning.message); - }, - plugins: [rollupPluginCleanup({ comments: /^(?!\/ *(?:@ts-|eslint-disable-line ))/ })], - }; - const outputPath = join(pkgPath, 'lib/index.js'); - const outputOptions = - { banner: `// ${name} – ${homepage}\n`, file: outputPath, format: 'esm' }; - const bundle = await rollup(inputOptions); - await bundle.write(outputOptions); -} - -async function compile(pkgPath) -{ - const { sys } = ts; - const declarationDir = join(pkgPath, 'lib'); - const program = - await - (async () => - { - const fileNames = await fastGlob('src/**/*.ts', { absolute: true, cwd: pkgPath }); - const tsConfigPath = join(pkgPath, 'tsconfig.json'); - const tsConfig = ts.readConfigFile(tsConfigPath, sys.readFile); - const { options } = ts.parseJsonConfigFileContent(tsConfig.config, sys, pkgPath); - options.declaration = true; - options.declarationDir = declarationDir; - options.importHelpers = true; - options.module = ts.ModuleKind.ES2020; - options.outDir = join(pkgPath, '.tmp-out'); - options.rootDir = join(pkgPath, 'src'); - options.types = []; - const program = ts.createProgram(fileNames, options); - return program; - } - )(); - const condition = ['index.d.ts', 'solution.d.ts', 'solution-type.d.ts']; - const writeFile = - (path, data, writeByteOrderMark) => - { - const relativePath = relative(declarationDir, path); - if - ( - relativePath.startsWith('..') || - isAbsolute(relativePath) || - condition.includes(relativePath) - ) - sys.writeFile(path, data, writeByteOrderMark); - }; - const emitResult = program.emit(undefined, writeFile); - const diagnostics = [...ts.getPreEmitDiagnostics(program), ...emitResult.diagnostics]; - if (diagnostics.length) - { - const reporter = ts.createDiagnosticReporter(sys, true); - diagnostics.forEach(reporter); - } - if (emitResult.emitSkipped) - throw Error('TypeScript compilation failed'); -} +const PACKAGE_UTILS_URL = '../../../dev/internal/package-utils.mjs'; export default async function make() { + const { makePackage } = await import(PACKAGE_UTILS_URL); const pkgURL = new URL('..', import.meta.url); - const pkgPath = fileURLToPath(pkgURL); - await compile(pkgPath); - await bundle(pkgPath); + await makePackage(pkgURL); } diff --git a/packages/~solution/dev/prepare-legacy-test.js b/packages/~solution/dev/prepare-legacy-test.js deleted file mode 100755 index 36b15f34..00000000 --- a/packages/~solution/dev/prepare-legacy-test.js +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env node - -import { fork, spawn } from 'child_process'; -import { mkdir, rm, writeFile } from 'fs/promises'; -import { createRequire } from 'module'; -import { EOL } from 'os'; -import { join } from 'path'; -import { fileURLToPath } from 'url'; - -const NODE_LEGACY_DIR = 'test/node-legacy'; - -function endOf(childProcess) -{ - const executor = - (resolve, reject) => childProcess.on('exit', (code => code ? reject : resolve)()); - const promise = new Promise(executor); - return promise; -} - -async function npmInstall() -{ - await mkdir(NODE_LEGACY_DIR, { recursive: true }); - const pkg = { dependencies: { ebdd: '*', mocha: '3.5.3' }, private: true }; - const contents = JSON.stringify(pkg, null, 2) + EOL; - const path = join(NODE_LEGACY_DIR, 'package.json'); - await writeFile(path, contents); - const childProcess = spawn('npm', ['install'], { cwd: NODE_LEGACY_DIR, stdio: 'inherit' }); - await endOf(childProcess); -} - -async function tsc(url) -{ - const tscPath = createRequire(url).resolve('typescript/bin/tsc'); - const childProcess = fork(tscPath, ['--outDir', 'test/node-legacy']); - await endOf(childProcess); -} - -(async () => -{ - try - { - const pkgURL = new URL('..', import.meta.url); - const pkgPath = fileURLToPath(pkgURL); - process.chdir(pkgPath); - await rm(NODE_LEGACY_DIR, { force: true, recursive: true }); - await Promise.all([tsc(pkgURL), npmInstall()]); - } - catch (error) - { - console.error(error); - process.exitCode = 1; - } -} -)(); diff --git a/packages/~solution/gulpfile.js b/packages/~solution/gulpfile.js index 87916afd..2855cfad 100644 --- a/packages/~solution/gulpfile.js +++ b/packages/~solution/gulpfile.js @@ -24,7 +24,7 @@ export async function lint() parserOptions: { project: 'tsconfig.json', sourceType: 'module' }, }, { - src: 'test/spec/**/*.ts', + src: 'test/**/*.ts', envs: ['ebdd/ebdd', 'mocha'], parserOptions: { project: 'test/tsconfig.json', sourceType: 'module' }, plugins: ['ebdd'], diff --git a/packages/~solution/package.json b/packages/~solution/package.json index 2a1fae82..8bdb8eec 100644 --- a/packages/~solution/package.json +++ b/packages/~solution/package.json @@ -18,9 +18,9 @@ }, "scripts": { "build": "npm install && gulp", - "legacy-build": "node dev/prepare-legacy-test && npm run legacy-test", "legacy-test": "node -- test/node-legacy/node_modules/mocha/bin/mocha --check-leaks --ui=ebdd test/node-legacy/test/spec/**/*.spec.js", "make": "node dev/make", + "prepare-legacy-test": "node ../../dev/internal/prepare-package-legacy-test.mjs", "test": "mocha --check-leaks --require=ts-node/register --ui=ebdd test/spec/**/*.spec.ts" }, "devDependencies": { @@ -29,16 +29,10 @@ "@types/node": "latest", "ebdd": "latest", "eslint-plugin-ebdd": "latest", - "fast-glob": "latest", "gulp": "latest", - "merge-stream": "latest", "mocha": "latest", "nyc": "latest", - "rollup": "latest", - "rollup-plugin-cleanup": "latest", - "ts-node": "latest", - "tslib": "latest", - "typescript": "latest" + "ts-node": "latest" }, "private": true, "type": "module" diff --git a/packages/~solution/readme.md b/packages/~solution/readme.md index 45c88de0..24375dd9 100644 --- a/packages/~solution/readme.md +++ b/packages/~solution/readme.md @@ -58,8 +58,3 @@ Currently, the following solution types are distinguished. | prefixed string | `![]+([]+![])[+[]]` | | weak prefixed string | `+[]+([]+![])[+[]]` | | combined string | `([]+![])[+[]]+![]`, `[]+[]` | - -## Compatibility - -The same JavaScript engines supported by the latest version of JScrewIt are supported by ~solution. -See [here](https://github.com/fasttime/JScrewIt#compatibility). diff --git a/packages/~solution/tsconfig.json b/packages/~solution/tsconfig.json index 13b68b98..d6f1a79b 100644 --- a/packages/~solution/tsconfig.json +++ b/packages/~solution/tsconfig.json @@ -6,6 +6,7 @@ "strict": true, "target": "ES5", "types": [ + "ebdd", "mocha", "node" ], diff --git a/src/test/spec-runner.html.hbs b/src/test/spec-runner.html.hbs index 4f217629..45af6402 100644 --- a/src/test/spec-runner.html.hbs +++ b/src/test/spec-runner.html.hbs @@ -16,8 +16,6 @@ - - {{#each specs}} {{/each}} diff --git a/src/ui/result-format.js b/src/ui/result-format.js deleted file mode 100644 index ceef6161..00000000 --- a/src/ui/result-format.js +++ /dev/null @@ -1,90 +0,0 @@ -/* eslint-env browser */ - -(function () -{ - 'use strict'; // eslint-disable-line strict - - function formatItem(value) - { - var text; - var type = typeof value; - try - { - if (type === 'string') - text = '"' + value + '"'; - else if (value === 0 && 1 / value < 0) - text = '-0'; - else if (Array.isArray(value)) - text = value.length ? '[…]' : '[]'; - else if (type === 'bigint') - text = value + 'n'; - // In Node.js 0.12, calling String with a symbol argument throws a TypeError. - // Since this script is only used in browsers this is not a true problem, but still. - else if (type !== 'symbol') - text = String(value); - else - text = value.toString(); - } - catch (error) - { } - return text; - } - - self.formatValue = - function (value) - { - var text; - if (Array.isArray(value)) - { - try - { - text = '[' + value.map(formatItem).join(', ') + ']'; - } - catch (error) - { } - } - else - text = formatItem(value); - return text; - }; - - self.formatValueType = - function (value) - { - var valueType; - if (value !== null) - { - var type = typeof value; - // document.all has type "undefined". - if (type === 'function' || type === 'object' || type === 'undefined') - { - var prototype = Object.getPrototypeOf(value); - if (prototype === Array.prototype) - { - switch (value.length) - { - case 0: - valueType = 'an empty array'; - break; - case 1: - valueType = 'a one element array'; - break; - default: - valueType = 'an array'; - break; - } - } - else if (prototype === Date.prototype) - valueType = 'a date'; - else if (prototype === RegExp.prototype) - valueType = 'a regular expression'; - else if (type === 'function') - valueType = 'a function'; - else - valueType = 'an object'; - } - } - return valueType; - }; -} -)(); diff --git a/src/ui/ui-main.js b/src/ui/ui-main.js index a9ff8bc5..dd9cf7aa 100644 --- a/src/ui/ui-main.js +++ b/src/ui/ui-main.js @@ -11,14 +11,13 @@ outputArea, stats, */ -import './result-format'; - -import art from '../../.tmp-out/art'; -import WORKER_SRC from '../../.tmp-out/worker'; -import createButton from './button'; -import createEngineSelectionBox from './engine-selection-box'; -import showModalBox from './modal-box'; -import createRoll from './roll'; +import art from '../../.tmp-out/art'; +import WORKER_SRC from '../../.tmp-out/worker'; +import createButton from './button'; +import createEngineSelectionBox from './engine-selection-box'; +import showModalBox from './modal-box'; +import createRoll from './roll'; +import { formatValue, formatValueType } from '~result-format'; var JS_MIME_TYPE = 'application/javascript'; diff --git a/test/result-format.spec.js b/test/result-format.spec.js deleted file mode 100644 index fa865b65..00000000 --- a/test/result-format.spec.js +++ /dev/null @@ -1,183 +0,0 @@ -/* eslint-env ebdd/ebdd */ -/* global BigInt, Symbol, document, expect, global, require, self */ - -'use strict'; - -(function () -{ - function createSparseArray() - { - var sparseArray = []; - sparseArray[5] = 'foo'; - return sparseArray; - } - - function createSparseSingletonArray() - { - var sparseSingletonArray = []; - sparseSingletonArray.length = 1; - return sparseSingletonArray; - } - - function createUnmappableArray() - { - var unmappableArray = []; - unmappableArray.map = undefined; - return unmappableArray; - } - - function createTypeUnknownObjParamData() - { - var obj = Object.create(new Date()); - obj.toString = - function () - { - return 'foo'; - }; - var paramData = ['a strange object', obj, 'foo', 'an object']; - if (typeof Symbol !== 'undefined') - { - var toStringTag = Symbol.toStringTag; - if (toStringTag) - { - Object.defineProperty(obj, toStringTag, { get: throwError }); - return paramData; - } - } - var toString = Object.prototype.toString; - paramData.doBefore = - function () - { - toString.call = - function (arg) - { - if (arg !== obj) - return Function.prototype.call.call(toString, null, arg); - throwError(); - }; - }; - paramData.doAfter = - function () - { - delete toString.call; - }; - return paramData; - } - - function throwError() - { - throw Error(); - } - - var formatValue; - var formatValueType; - - if (typeof self === 'undefined') - { - require('expectations'); - global.self = { }; - require('../src/ui/result-format'); - formatValue = self.formatValue; - formatValueType = self.formatValueType; - delete global.self; - } - else - { - formatValue = self.formatValue; - formatValueType = self.formatValueType; - } - - describe - ( - 'Given', - function () - { - var paramDataList = - [ - ['a number', 1, '1'], - ['0', 0, '0'], - ['-0', -0, '-0'], - ['NaN', NaN, 'NaN'], - ['Infinity', Infinity, 'Infinity'], - ['an empty string', '', '""'], - ['a string', 'foo', '"foo"'], - ['a multiline string', 'foo\nbar', '"foo\nbar"'], - ['null', null, 'null'], - when - ( - typeof Symbol !== 'undefined', - ['a symbol', typeof Symbol !== 'undefined' && Symbol('foo'), 'Symbol(foo)'] - ), - when - ( - typeof BigInt !== 'undefined', - ['a bigint', typeof BigInt !== 'undefined' && BigInt(1), '1n'] - ), - ['an empty array', [], '[]', 'an empty array'], - ['a one element array', [''], '[""]', 'a one element array'], - ['an array with more elements', [1, 2], '[1, 2]', 'an array'], - ['a nesting of arrays', [[], [{ }]], '[[], […]]', 'an array'], - ['a sparse array', createSparseArray(), '[, , , , , "foo"]', 'an array'], - [ - 'a sparse singleton array', - createSparseSingletonArray(), - '[]', - 'a one element array', - ], - ['an unmappable array', createUnmappableArray(), undefined, 'an empty array'], - when - ( - typeof document !== 'undefined', - ['document.all', typeof document !== 'undefined' && document.all, , 'an object'] - ), - ['a plain object', { }, '[object Object]', 'an object'], - ['a function', Function(), , 'a function'], - ['a regular expression', /./, '/./', 'a regular expression'], - ['a date', new Date(), , 'a date'], - ['an object that throws errors', { toString: throwError }, undefined, 'an object'], - createTypeUnknownObjParamData(), - ]; - - describe.per(paramDataList) - ( - '#[0]', - function (paramData) - { - var input = paramData[1]; - var expectedValueProvided = 2 in paramData; - var expectedValue = paramData[2]; - var expectedValueType = paramData[3]; - var doBefore = paramData.doBefore; - var doAfter = paramData.doAfter; - - if (doBefore) - before(doBefore); - if (doAfter) - after(doAfter); - if (expectedValueProvided) - { - it - ( - 'formatValue returns the expected result', - function () - { - var actualValue = formatValue(input); - expect(actualValue).toBe(expectedValue); - } - ); - } - it - ( - 'formatValueType returns the expected result', - function () - { - var actualValueType = formatValueType(input); - expect(actualValueType).toBe(expectedValueType); - } - ); - } - ); - } - ); -} -)(); From 10dab01e5490ccf3e80948ea24c38107ccff4c69 Mon Sep 17 00:00:00 2001 From: Francesco Trotta Date: Mon, 2 Aug 2021 06:19:20 +0200 Subject: [PATCH 003/101] Patch for Rollup --- .github/workflows/JScrewIt.yml | 2 +- dev/patch-rollup.mjs | 40 ++++++++++++++++++++++++++++++++++ package.json | 1 + 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100755 dev/patch-rollup.mjs diff --git a/.github/workflows/JScrewIt.yml b/.github/workflows/JScrewIt.yml index 6b0aae9b..d671d072 100644 --- a/.github/workflows/JScrewIt.yml +++ b/.github/workflows/JScrewIt.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/setup-node@v2 with: node-version: 16.x - - run: npm install --workspaces + - run: npm install --ignore-scripts --workspaces - run: npm install - run: npm run --workspaces make - run: gulp lint diff --git a/dev/patch-rollup.mjs b/dev/patch-rollup.mjs new file mode 100755 index 00000000..c5613502 --- /dev/null +++ b/dev/patch-rollup.mjs @@ -0,0 +1,40 @@ +#!/usr/bin/env node + +// Patch Rollup to prevent it from trimming blocks of multiple single-line comments before import +// statements at the beginning of a module (See for instance "src/lib/definitions.js" or +// "src/lib/optimizers/to-string-optimizer.js"). + +import { readFile, writeFile } from 'fs/promises'; +import { createRequire } from 'module'; + +const SEARCH_LINE = +' start + findFirstLineBreakOutsideComment(code.original.slice(start, nextNode.start))' + +'[1];\n'; +const REPLACEMENT_LINE = +' start + code.original.slice(start, nextNode.start).search(/\\n\\s*$/) + 1;\n'; + +(async () => +{ + try + { + const require = createRequire(import.meta.url); + const rollupPath = require.resolve('rollup/dist/shared/rollup.js'); + const input = await readFile(rollupPath, 'utf8'); + const index = input.indexOf(SEARCH_LINE); + if (index === 0 || index > 0 && input[index - 1] === '\n') + { + const output = + input.slice(0, index) + REPLACEMENT_LINE + input.slice(index + SEARCH_LINE.length); + await writeFile(rollupPath, output); + console.log('Patching rollup.'); + } + else + console.log('Nothing to patch in rollup.'); + } + catch (error) + { + console.error(error); + process.exitCode = 1; + } +} +)(); diff --git a/package.json b/package.json index 46d8e0f2..4ae1a9af 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "build": "npm install && gulp", "docs": "gulp docs", "feature-info": "node dev/legacy/feature-info.js", + "prepare": "node dev/patch-rollup.mjs", "test": "mocha --check-leaks --ui=ebdd test/{*,*/*}.spec.js" }, "devDependencies": { From 5791a73b82da535bc8b7f94e60ec08a5f0912d88 Mon Sep 17 00:00:00 2001 From: Francesco Trotta Date: Tue, 3 Aug 2021 18:00:16 +0200 Subject: [PATCH 004/101] Updated code style --- src/lib/definitions.js | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/lib/definitions.js b/src/lib/definitions.js index 18fbfb0c..00aa737d 100644 --- a/src/lib/definitions.js +++ b/src/lib/definitions.js @@ -947,28 +947,19 @@ function getFHPaddingEntries(index) define('"".sub()[2]', CAPITAL_HTML), define ( - { - expr: '(RP_3_WA + Function("return toString")()())[11]', - optimize: true, - }, + { expr: '(RP_3_WA + Function("return toString")()())[11]', optimize: true }, GLOBAL_UNDEFINED ), define ( - { - expr: '(RP_3_WA + Function("return{}.toString")()())[11]', - optimize: true, - }, + { expr: '(RP_3_WA + Function("return{}.toString")()())[11]', optimize: true }, OBJECT_UNDEFINED ), define('(RP_3_WA + PLAIN_OBJECT[TO_STRING].call())[11]', UNDEFINED), define('(RP_3_WA + ARRAY_ITERATOR[TO_STRING].call())[11]', ARRAY_ITERATOR, UNDEFINED), define ( - { - expr: '(RP_3_WA + Function("return Intl.toString")()())[11]', - optimize: true, - }, + { expr: '(RP_3_WA + Function("return Intl.toString")()())[11]', optimize: true }, INTL, OBJECT_UNDEFINED ), From ef5ea68e263d745c5a4f1e4ed72eea1423185955 Mon Sep 17 00:00:00 2001 From: Francesco Trotta Date: Tue, 3 Aug 2021 18:00:47 +0200 Subject: [PATCH 005/101] Removed obsolete feature EXTERNAL --- Features.md | 1 - api-doc/README.md | 2 +- api-doc/interfaces/FeatureAll.md | 13 ------------- api-doc/interfaces/FeatureConstructor.md | 17 ----------------- src/lib/definitions.js | 7 ------- src/lib/features.js | 17 ----------------- test/helpers/feature-emulation.helpers.js | 10 ---------- test/lib/definitions.spec.js | 6 ------ 8 files changed, 1 insertion(+), 72 deletions(-) diff --git a/Features.md b/Features.md index 2bfcbd20..130f37d3 100644 --- a/Features.md +++ b/Features.md @@ -64,7 +64,6 @@ This table lists features available in the most common engines.
  • ESC_HTML_QUOT_ONLY
  • ESC_REGEXP_LF
  • ESC_REGEXP_SLASH -
  • EXTERNAL
  • FF_SRC
  • FILL
  • FLAT diff --git a/api-doc/README.md b/api-doc/README.md index 5ea25f56..5c786ddf 100644 --- a/api-doc/README.md +++ b/api-doc/README.md @@ -47,7 +47,7 @@ ___ ### ElementaryFeatureName -Ƭ **ElementaryFeatureName**: ``"ANY_DOCUMENT"`` \| ``"ANY_WINDOW"`` \| ``"ARRAY_ITERATOR"`` \| ``"ARROW"`` \| ``"AT"`` \| ``"ATOB"`` \| ``"BARPROP"`` \| ``"CAPITAL_HTML"`` \| ``"CONSOLE"`` \| ``"DOCUMENT"`` \| ``"DOMWINDOW"`` \| ``"ESC_HTML_ALL"`` \| ``"ESC_HTML_QUOT"`` \| ``"ESC_HTML_QUOT_ONLY"`` \| ``"ESC_REGEXP_LF"`` \| ``"ESC_REGEXP_SLASH"`` \| ``"EXTERNAL"`` \| ``"FF_SRC"`` \| ``"FILL"`` \| ``"FLAT"`` \| ``"FROM_CODE_POINT"`` \| ``"FUNCTION_19_LF"`` \| ``"FUNCTION_22_LF"`` \| ``"GENERIC_ARRAY_TO_STRING"`` \| ``"GLOBAL_UNDEFINED"`` \| ``"GMT"`` \| ``"HISTORY"`` \| ``"HTMLAUDIOELEMENT"`` \| ``"HTMLDOCUMENT"`` \| ``"IE_SRC"`` \| ``"INCR_CHAR"`` \| ``"INTL"`` \| ``"LOCALE_INFINITY"`` \| ``"LOCALE_NUMERALS"`` \| ``"LOCALE_NUMERALS_EXT"`` \| ``"LOCATION"`` \| ``"NAME"`` \| ``"NODECONSTRUCTOR"`` \| ``"NO_FF_SRC"`` \| ``"NO_IE_SRC"`` \| ``"NO_OLD_SAFARI_ARRAY_ITERATOR"`` \| ``"NO_V8_SRC"`` \| ``"OBJECT_UNDEFINED"`` \| ``"PLAIN_INTL"`` \| ``"REGEXP_STRING_ITERATOR"`` \| ``"SELF_OBJ"`` \| ``"SHORT_LOCALES"`` \| ``"STATUS"`` \| ``"UNDEFINED"`` \| ``"V8_SRC"`` \| ``"WINDOW"`` +Ƭ **ElementaryFeatureName**: ``"ANY_DOCUMENT"`` \| ``"ANY_WINDOW"`` \| ``"ARRAY_ITERATOR"`` \| ``"ARROW"`` \| ``"AT"`` \| ``"ATOB"`` \| ``"BARPROP"`` \| ``"CAPITAL_HTML"`` \| ``"CONSOLE"`` \| ``"DOCUMENT"`` \| ``"DOMWINDOW"`` \| ``"ESC_HTML_ALL"`` \| ``"ESC_HTML_QUOT"`` \| ``"ESC_HTML_QUOT_ONLY"`` \| ``"ESC_REGEXP_LF"`` \| ``"ESC_REGEXP_SLASH"`` \| ``"FF_SRC"`` \| ``"FILL"`` \| ``"FLAT"`` \| ``"FROM_CODE_POINT"`` \| ``"FUNCTION_19_LF"`` \| ``"FUNCTION_22_LF"`` \| ``"GENERIC_ARRAY_TO_STRING"`` \| ``"GLOBAL_UNDEFINED"`` \| ``"GMT"`` \| ``"HISTORY"`` \| ``"HTMLAUDIOELEMENT"`` \| ``"HTMLDOCUMENT"`` \| ``"IE_SRC"`` \| ``"INCR_CHAR"`` \| ``"INTL"`` \| ``"LOCALE_INFINITY"`` \| ``"LOCALE_NUMERALS"`` \| ``"LOCALE_NUMERALS_EXT"`` \| ``"LOCATION"`` \| ``"NAME"`` \| ``"NODECONSTRUCTOR"`` \| ``"NO_FF_SRC"`` \| ``"NO_IE_SRC"`` \| ``"NO_OLD_SAFARI_ARRAY_ITERATOR"`` \| ``"NO_V8_SRC"`` \| ``"OBJECT_UNDEFINED"`` \| ``"PLAIN_INTL"`` \| ``"REGEXP_STRING_ITERATOR"`` \| ``"SELF_OBJ"`` \| ``"SHORT_LOCALES"`` \| ``"STATUS"`` \| ``"UNDEFINED"`` \| ``"V8_SRC"`` \| ``"WINDOW"`` Name of an elementary feature. diff --git a/api-doc/interfaces/FeatureAll.md b/api-doc/interfaces/FeatureAll.md index 0a8d0f2b..c2f69345 100644 --- a/api-doc/interfaces/FeatureAll.md +++ b/api-doc/interfaces/FeatureAll.md @@ -37,7 +37,6 @@ - [ESC\_HTML\_QUOT\_ONLY](FeatureAll.md#esc_html_quot_only) - [ESC\_REGEXP\_LF](FeatureAll.md#esc_regexp_lf) - [ESC\_REGEXP\_SLASH](FeatureAll.md#esc_regexp_slash) -- [EXTERNAL](FeatureAll.md#external) - [FF](FeatureAll.md#ff) - [FF\_78](FeatureAll.md#ff_78) - [FF\_83](FeatureAll.md#ff_83) @@ -412,18 +411,6 @@ Available in Chrome, Edge, Firefox, Internet Explorer, Safari, Opera, and Node.j ___ -### EXTERNAL - -• **EXTERNAL**: [`ElementaryFeature`](ElementaryFeature.md) - -Existence of the global object sidebar having the string representation "\[object External\]". - -**`remarks`** - -Available in Firefox. This feature is not available inside web workers. - -___ - ### FF • **FF**: [`PredefinedFeature`](PredefinedFeature.md) diff --git a/api-doc/interfaces/FeatureConstructor.md b/api-doc/interfaces/FeatureConstructor.md index ce817207..69c2a6bc 100644 --- a/api-doc/interfaces/FeatureConstructor.md +++ b/api-doc/interfaces/FeatureConstructor.md @@ -87,7 +87,6 @@ An error is thrown if any of the specified features are not mutually compatible. - [ESC\_HTML\_QUOT\_ONLY](FeatureConstructor.md#esc_html_quot_only) - [ESC\_REGEXP\_LF](FeatureConstructor.md#esc_regexp_lf) - [ESC\_REGEXP\_SLASH](FeatureConstructor.md#esc_regexp_slash) -- [EXTERNAL](FeatureConstructor.md#external) - [FF](FeatureConstructor.md#ff) - [FF\_78](FeatureConstructor.md#ff_78) - [FF\_83](FeatureConstructor.md#ff_83) @@ -651,22 +650,6 @@ Available in Chrome, Edge, Firefox, Internet Explorer, Safari, Opera, and Node.j ___ -### EXTERNAL - -• **EXTERNAL**: [`ElementaryFeature`](ElementaryFeature.md) - -Existence of the global object sidebar having the string representation "\[object External\]". - -**`remarks`** - -Available in Firefox. This feature is not available inside web workers. - -#### Inherited from - -[FeatureAll](FeatureAll.md).[EXTERNAL](FeatureAll.md#external) - -___ - ### FF • **FF**: [`PredefinedFeature`](PredefinedFeature.md) diff --git a/src/lib/definitions.js b/src/lib/definitions.js index 00aa737d..3efa197e 100644 --- a/src/lib/definitions.js +++ b/src/lib/definitions.js @@ -363,7 +363,6 @@ function getFHPaddingEntries(index) var ESC_HTML_QUOT_ONLY = Feature.ESC_HTML_QUOT_ONLY; var ESC_REGEXP_LF = Feature.ESC_REGEXP_LF; var ESC_REGEXP_SLASH = Feature.ESC_REGEXP_SLASH; - var EXTERNAL = Feature.EXTERNAL; var FF_SRC = Feature.FF_SRC; var FILL = Feature.FILL; var FLAT = Feature.FLAT; @@ -804,7 +803,6 @@ function getFHPaddingEntries(index) defineCharAtFnPos('RegExp', 12), define('btoa("0NaN")[1]', ATOB), define('(RP_5_A + "".link())[10]', CAPITAL_HTML), - define('(RP_3_WA + sidebar)[11]', EXTERNAL), define('(RP_3_WA + Audio)[21]', HTMLAUDIOELEMENT), define('(RP_0_S + REGEXP_STRING_ITERATOR)[11]', REGEXP_STRING_ITERATOR), ], @@ -1104,7 +1102,6 @@ function getFHPaddingEntries(index) [ define('101[TO_STRING]("34")[1]'), define('btoa("falsefalse")[10]', ATOB), - define('(RP_1_WA + sidebar)[10]', EXTERNAL), ], 'y': '(RP_3_WA + [Infinity])[10]', 'z': @@ -1297,10 +1294,6 @@ function getFHPaddingEntries(index) [ define('Function("return self")()', SELF_OBJ), ], - sidebar: - [ - define('Function("return sidebar")()', EXTERNAL), - ], unescape: [ define({ expr: 'Function("return unescape")()', optimize: true }), diff --git a/src/lib/features.js b/src/lib/features.js index 7a2eefcc..c3a271d1 100644 --- a/src/lib/features.js +++ b/src/lib/features.js @@ -9,7 +9,6 @@ history, location, require, self, -sidebar, statusbar, */ @@ -817,19 +816,6 @@ assignNoEnum return available; }, }, - EXTERNAL: - { - description: - 'Existence of the global object sidebar having the string representation "[object ' + - 'External]".', - check: - function () - { - var available = typeof sidebar === 'object' && sidebar + '' === '[object External]'; - return available; - }, - attributes: { 'web-worker': 'web-worker-restriction' }, - }, FF_SRC: { description: @@ -1528,7 +1514,6 @@ assignNoEnum 'ESC_HTML_QUOT_ONLY', 'ESC_REGEXP_LF', 'ESC_REGEXP_SLASH', - 'EXTERNAL', 'FF_SRC', 'FILL', 'FLAT', @@ -1574,7 +1559,6 @@ assignNoEnum 'ESC_HTML_QUOT_ONLY', 'ESC_REGEXP_LF', 'ESC_REGEXP_SLASH', - 'EXTERNAL', 'FF_SRC', 'FILL', 'FLAT', @@ -1621,7 +1605,6 @@ assignNoEnum 'ESC_HTML_QUOT_ONLY', 'ESC_REGEXP_LF', 'ESC_REGEXP_SLASH', - 'EXTERNAL', 'FF_SRC', 'FILL', 'FLAT', diff --git a/test/helpers/feature-emulation.helpers.js b/test/helpers/feature-emulation.helpers.js index fac7bdff..0da16037 100644 --- a/test/helpers/feature-emulation.helpers.js +++ b/test/helpers/feature-emulation.helpers.js @@ -810,16 +810,6 @@ ), ESC_REGEXP_LF: makeEmuFeatureEscRegExp('\n', '\\n'), ESC_REGEXP_SLASH: makeEmuFeatureEscRegExp('/', '\\/'), - EXTERNAL: - function () - { - var toString = - function () - { - return '[object External]'; - }; - override(this, 'sidebar', { value: { toString: toString } }); - }, FF_SRC: makeEmuFeatureNativeFunctionSource(NATIVE_FUNCTION_SOURCE_INFO_FF), FILL: makeEmuFeatureArrayPrototypeFunction('fill', Function()), FLAT: diff --git a/test/lib/definitions.spec.js b/test/lib/definitions.spec.js index 5faa7861..fd10bb08 100644 --- a/test/lib/definitions.spec.js +++ b/test/lib/definitions.spec.js @@ -16,7 +16,6 @@ location, module, require, self, -sidebar, */ 'use strict'; @@ -506,11 +505,6 @@ sidebar, { this.toBe(self); }, - sidebar: - function () - { - this.toBe(sidebar); - }, unescape: isExpected(unescape), ANY_FUNCTION: function () From c763bac4524e3fad9cf3a37d6d17fbde6607d110 Mon Sep 17 00:00:00 2001 From: Francesco Trotta Date: Wed, 4 Aug 2021 05:21:37 +0200 Subject: [PATCH 006/101] Version 2.30.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4ae1a9af..97fafeaf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jscrewit", - "version": "2.29.0", + "version": "2.30.0", "description": "Converts plain JavaScript into JSFuck code, which consists of only six different characters: ! ( ) + [ ]", "keywords": [ "esoteric", From 5bd1e0443c6010e047fdaae458741f0af1758a45 Mon Sep 17 00:00:00 2001 From: Francesco Trotta Date: Wed, 4 Aug 2021 12:12:43 +0200 Subject: [PATCH 007/101] New lint util in packages --- .github/workflows/~mask.yml | 2 +- .github/workflows/~result-format.yml | 2 +- .github/workflows/~solution.yml | 2 +- packages/~mask/dev/impl.js | 33 +++++++++++++++++ packages/~mask/dev/lint.js | 20 +++++++++++ packages/~mask/dev/make-impl.js | 8 ----- packages/~mask/dev/make.js | 2 +- packages/~mask/gulpfile.js | 28 ++------------- packages/~mask/package.json | 1 + .../dev/{make-impl.js => impl.js} | 24 +++++++++++++ packages/~result-format/dev/lint.js | 20 +++++++++++ .../dev/make-browser-spec-runner.js | 2 +- packages/~result-format/dev/make-lib.js | 2 +- packages/~result-format/gulpfile.js | 36 ++++--------------- packages/~result-format/package.json | 1 + packages/~solution/dev/impl.js | 33 +++++++++++++++++ packages/~solution/dev/lint.js | 20 +++++++++++ packages/~solution/dev/make-impl.js | 8 ----- packages/~solution/dev/make.js | 2 +- packages/~solution/gulpfile.js | 28 ++------------- packages/~solution/package.json | 1 + 21 files changed, 170 insertions(+), 105 deletions(-) create mode 100644 packages/~mask/dev/impl.js create mode 100755 packages/~mask/dev/lint.js delete mode 100644 packages/~mask/dev/make-impl.js rename packages/~result-format/dev/{make-impl.js => impl.js} (68%) create mode 100755 packages/~result-format/dev/lint.js create mode 100644 packages/~solution/dev/impl.js create mode 100755 packages/~solution/dev/lint.js delete mode 100644 packages/~solution/dev/make-impl.js diff --git a/.github/workflows/~mask.yml b/.github/workflows/~mask.yml index 3e838590..1f4e7ca5 100644 --- a/.github/workflows/~mask.yml +++ b/.github/workflows/~mask.yml @@ -20,7 +20,7 @@ jobs: with: node-version: 16.x - run: npm install - - run: gulp lint + - run: npm run lint test: diff --git a/.github/workflows/~result-format.yml b/.github/workflows/~result-format.yml index d6985927..b937fed3 100644 --- a/.github/workflows/~result-format.yml +++ b/.github/workflows/~result-format.yml @@ -20,7 +20,7 @@ jobs: with: node-version: 16.x - run: npm install - - run: gulp lint + - run: npm run lint test: diff --git a/.github/workflows/~solution.yml b/.github/workflows/~solution.yml index 623de367..1c513826 100644 --- a/.github/workflows/~solution.yml +++ b/.github/workflows/~solution.yml @@ -20,7 +20,7 @@ jobs: with: node-version: 16.x - run: npm install - - run: gulp lint + - run: npm run lint test: diff --git a/packages/~mask/dev/impl.js b/packages/~mask/dev/impl.js new file mode 100644 index 00000000..06d26dcd --- /dev/null +++ b/packages/~mask/dev/impl.js @@ -0,0 +1,33 @@ +import { lint as lintImpl } from '@fasttime/lint'; + +const PACKAGE_UTILS_URL = '../../../dev/internal/package-utils.mjs'; + +export async function lint() +{ + await + lintImpl + ( + { + src: 'src/**/*.ts', + parserOptions: { project: 'tsconfig.json', sourceType: 'module' }, + }, + { + src: 'test/**/*.ts', + envs: ['ebdd/ebdd', 'mocha'], + parserOptions: { project: 'test/tsconfig.json', sourceType: 'module' }, + plugins: ['ebdd'], + }, + { + src: ['*.js', 'dev/**/*.js'], + envs: ['node'], + parserOptions: { ecmaVersion: 2020, sourceType: 'module' }, + }, + ); +} + +export async function make() +{ + const { makePackage } = await import(PACKAGE_UTILS_URL); + const pkgURL = new URL('..', import.meta.url); + await makePackage(pkgURL); +} diff --git a/packages/~mask/dev/lint.js b/packages/~mask/dev/lint.js new file mode 100755 index 00000000..443eca37 --- /dev/null +++ b/packages/~mask/dev/lint.js @@ -0,0 +1,20 @@ +#!/usr/bin/env node + +import { lint } from './impl.js'; +import { fileURLToPath } from 'url'; + +(async () => +{ + try + { + const pkgPath = fileURLToPath(new URL('..', import.meta.url)); + process.chdir(pkgPath); + await lint(); + } + catch (error) + { + console.error(error); + process.exitCode = 1; + } +} +)(); diff --git a/packages/~mask/dev/make-impl.js b/packages/~mask/dev/make-impl.js deleted file mode 100644 index e8d7691d..00000000 --- a/packages/~mask/dev/make-impl.js +++ /dev/null @@ -1,8 +0,0 @@ -const PACKAGE_UTILS_URL = '../../../dev/internal/package-utils.mjs'; - -export default async function make() -{ - const { makePackage } = await import(PACKAGE_UTILS_URL); - const pkgURL = new URL('..', import.meta.url); - await makePackage(pkgURL); -} diff --git a/packages/~mask/dev/make.js b/packages/~mask/dev/make.js index e689740c..18d697cb 100755 --- a/packages/~mask/dev/make.js +++ b/packages/~mask/dev/make.js @@ -1,6 +1,6 @@ #!/usr/bin/env node -import make from './make-impl.js'; +import { make } from './impl.js'; (async () => { diff --git a/packages/~mask/gulpfile.js b/packages/~mask/gulpfile.js index 2855cfad..d0bb3a04 100644 --- a/packages/~mask/gulpfile.js +++ b/packages/~mask/gulpfile.js @@ -1,5 +1,4 @@ -import make from './dev/make-impl.js'; -import { lint as lintImpl } from '@fasttime/lint'; +import { lint, make } from './dev/impl.js'; import { fork } from 'child_process'; import { rm } from 'fs/promises'; import gulp from 'gulp'; @@ -14,29 +13,6 @@ export async function clean() await Promise.all(paths.map(path => rm(path, options))); } -export async function lint() -{ - await - lintImpl - ( - { - src: 'src/**/*.ts', - parserOptions: { project: 'tsconfig.json', sourceType: 'module' }, - }, - { - src: 'test/**/*.ts', - envs: ['ebdd/ebdd', 'mocha'], - parserOptions: { project: 'test/tsconfig.json', sourceType: 'module' }, - plugins: ['ebdd'], - }, - { - src: ['*.js', 'dev/**/*.js'], - envs: ['node'], - parserOptions: { ecmaVersion: 2020, sourceType: 'module' }, - }, - ); -} - export function test(callback) { const { resolve } = createRequire(import.meta.url); @@ -57,6 +33,6 @@ export function test(callback) childProcess.on('exit', code => callback(code && 'Test failed')); } -export { make }; +export { lint, make }; export default series(parallel(clean, lint), test, make); diff --git a/packages/~mask/package.json b/packages/~mask/package.json index 5e0f0e9a..3a3495ac 100644 --- a/packages/~mask/package.json +++ b/packages/~mask/package.json @@ -19,6 +19,7 @@ "scripts": { "build": "npm install && gulp", "legacy-test": "node -- test/node-legacy/node_modules/mocha/bin/mocha --check-leaks --ui=ebdd test/node-legacy/test/spec/**/*.spec.js", + "lint": "node dev/lint", "make": "node dev/make", "prepare-legacy-test": "node ../../dev/internal/prepare-package-legacy-test.mjs", "test": "mocha --check-leaks --require=ts-node/register --ui=ebdd test/spec/**/*.spec.ts" diff --git a/packages/~result-format/dev/make-impl.js b/packages/~result-format/dev/impl.js similarity index 68% rename from packages/~result-format/dev/make-impl.js rename to packages/~result-format/dev/impl.js index 6c5bb84b..61adccf7 100644 --- a/packages/~result-format/dev/make-impl.js +++ b/packages/~result-format/dev/impl.js @@ -1,3 +1,4 @@ +import { lint as lintImpl } from '@fasttime/lint'; import { join } from 'path'; import rollupPluginNodeBuiltins from 'rollup-plugin-node-builtins'; import rollupPluginNodeGlobals from 'rollup-plugin-node-globals'; @@ -5,6 +6,29 @@ import { fileURLToPath } from 'url'; const PACKAGE_UTILS_URL = '../../../dev/internal/package-utils.mjs'; +export async function lint() +{ + await + lintImpl + ( + { + src: 'src/**/*.ts', + parserOptions: { project: 'tsconfig.json', sourceType: 'module' }, + }, + { + src: 'test/**/*.ts', + envs: ['ebdd/ebdd', 'mocha'], + parserOptions: { project: 'tsconfig.json', sourceType: 'module' }, + plugins: ['ebdd'], + }, + { + src: ['*.js', 'dev/**/*.js'], + envs: ['node'], + parserOptions: { ecmaVersion: 2020, sourceType: 'module' }, + }, + ); +} + export async function makeBrowserSpecRunner() { const { bundleJS, compileTS } = await import(PACKAGE_UTILS_URL); diff --git a/packages/~result-format/dev/lint.js b/packages/~result-format/dev/lint.js new file mode 100755 index 00000000..443eca37 --- /dev/null +++ b/packages/~result-format/dev/lint.js @@ -0,0 +1,20 @@ +#!/usr/bin/env node + +import { lint } from './impl.js'; +import { fileURLToPath } from 'url'; + +(async () => +{ + try + { + const pkgPath = fileURLToPath(new URL('..', import.meta.url)); + process.chdir(pkgPath); + await lint(); + } + catch (error) + { + console.error(error); + process.exitCode = 1; + } +} +)(); diff --git a/packages/~result-format/dev/make-browser-spec-runner.js b/packages/~result-format/dev/make-browser-spec-runner.js index 931e4a66..337b1f86 100755 --- a/packages/~result-format/dev/make-browser-spec-runner.js +++ b/packages/~result-format/dev/make-browser-spec-runner.js @@ -1,6 +1,6 @@ #!/usr/bin/env node -import { makeBrowserSpecRunner } from './make-impl.js'; +import { makeBrowserSpecRunner } from './impl.js'; (async () => { diff --git a/packages/~result-format/dev/make-lib.js b/packages/~result-format/dev/make-lib.js index 6cbee98b..60684d63 100755 --- a/packages/~result-format/dev/make-lib.js +++ b/packages/~result-format/dev/make-lib.js @@ -1,6 +1,6 @@ #!/usr/bin/env node -import { makeLib } from './make-impl.js'; +import { makeLib } from './impl.js'; (async () => { diff --git a/packages/~result-format/gulpfile.js b/packages/~result-format/gulpfile.js index 49ce3481..995c929c 100644 --- a/packages/~result-format/gulpfile.js +++ b/packages/~result-format/gulpfile.js @@ -1,9 +1,8 @@ -import { makeBrowserSpecRunner, makeLib } from './dev/make-impl.js'; -import { lint as lintImpl } from '@fasttime/lint'; -import { fork } from 'child_process'; -import { rm } from 'fs/promises'; -import gulp from 'gulp'; -import { createRequire } from 'module'; +import { lint, makeBrowserSpecRunner, makeLib } from './dev/impl.js'; +import { fork } from 'child_process'; +import { rm } from 'fs/promises'; +import gulp from 'gulp'; +import { createRequire } from 'module'; const { parallel, series } = gulp; @@ -22,29 +21,6 @@ export async function clean() await Promise.all(paths.map(path => rm(path, options))); } -export async function lint() -{ - await - lintImpl - ( - { - src: 'src/**/*.ts', - parserOptions: { project: 'tsconfig.json', sourceType: 'module' }, - }, - { - src: 'test/**/*.ts', - envs: ['ebdd/ebdd', 'mocha'], - parserOptions: { project: 'tsconfig.json', sourceType: 'module' }, - plugins: ['ebdd'], - }, - { - src: ['*.js', 'dev/**/*.js'], - envs: ['node'], - parserOptions: { ecmaVersion: 2020, sourceType: 'module' }, - }, - ); -} - export function test(callback) { const { resolve } = createRequire(import.meta.url); @@ -65,6 +41,6 @@ export function test(callback) childProcess.on('exit', code => callback(code && 'Test failed')); } -export { makeLib, makeBrowserSpecRunner }; +export { lint, makeLib, makeBrowserSpecRunner }; export default series(parallel(clean, lint), test, parallel(makeLib, makeBrowserSpecRunner)); diff --git a/packages/~result-format/package.json b/packages/~result-format/package.json index dd573f5d..0b4b1993 100644 --- a/packages/~result-format/package.json +++ b/packages/~result-format/package.json @@ -19,6 +19,7 @@ "scripts": { "build": "npm install && gulp", "legacy-test": "node -- test/node-legacy/node_modules/mocha/bin/mocha --check-leaks --ui=ebdd test/node-legacy/test/spec/**/*.spec.js", + "lint": "node dev/lint", "make": "node dev/make-lib", "prepare-legacy-test": "node ../../dev/internal/prepare-package-legacy-test.mjs", "test": "mocha --check-leaks --require=ts-node/register --ui=ebdd test/spec/**/*.spec.ts" diff --git a/packages/~solution/dev/impl.js b/packages/~solution/dev/impl.js new file mode 100644 index 00000000..06d26dcd --- /dev/null +++ b/packages/~solution/dev/impl.js @@ -0,0 +1,33 @@ +import { lint as lintImpl } from '@fasttime/lint'; + +const PACKAGE_UTILS_URL = '../../../dev/internal/package-utils.mjs'; + +export async function lint() +{ + await + lintImpl + ( + { + src: 'src/**/*.ts', + parserOptions: { project: 'tsconfig.json', sourceType: 'module' }, + }, + { + src: 'test/**/*.ts', + envs: ['ebdd/ebdd', 'mocha'], + parserOptions: { project: 'test/tsconfig.json', sourceType: 'module' }, + plugins: ['ebdd'], + }, + { + src: ['*.js', 'dev/**/*.js'], + envs: ['node'], + parserOptions: { ecmaVersion: 2020, sourceType: 'module' }, + }, + ); +} + +export async function make() +{ + const { makePackage } = await import(PACKAGE_UTILS_URL); + const pkgURL = new URL('..', import.meta.url); + await makePackage(pkgURL); +} diff --git a/packages/~solution/dev/lint.js b/packages/~solution/dev/lint.js new file mode 100755 index 00000000..443eca37 --- /dev/null +++ b/packages/~solution/dev/lint.js @@ -0,0 +1,20 @@ +#!/usr/bin/env node + +import { lint } from './impl.js'; +import { fileURLToPath } from 'url'; + +(async () => +{ + try + { + const pkgPath = fileURLToPath(new URL('..', import.meta.url)); + process.chdir(pkgPath); + await lint(); + } + catch (error) + { + console.error(error); + process.exitCode = 1; + } +} +)(); diff --git a/packages/~solution/dev/make-impl.js b/packages/~solution/dev/make-impl.js deleted file mode 100644 index e8d7691d..00000000 --- a/packages/~solution/dev/make-impl.js +++ /dev/null @@ -1,8 +0,0 @@ -const PACKAGE_UTILS_URL = '../../../dev/internal/package-utils.mjs'; - -export default async function make() -{ - const { makePackage } = await import(PACKAGE_UTILS_URL); - const pkgURL = new URL('..', import.meta.url); - await makePackage(pkgURL); -} diff --git a/packages/~solution/dev/make.js b/packages/~solution/dev/make.js index e689740c..18d697cb 100755 --- a/packages/~solution/dev/make.js +++ b/packages/~solution/dev/make.js @@ -1,6 +1,6 @@ #!/usr/bin/env node -import make from './make-impl.js'; +import { make } from './impl.js'; (async () => { diff --git a/packages/~solution/gulpfile.js b/packages/~solution/gulpfile.js index 2855cfad..d0bb3a04 100644 --- a/packages/~solution/gulpfile.js +++ b/packages/~solution/gulpfile.js @@ -1,5 +1,4 @@ -import make from './dev/make-impl.js'; -import { lint as lintImpl } from '@fasttime/lint'; +import { lint, make } from './dev/impl.js'; import { fork } from 'child_process'; import { rm } from 'fs/promises'; import gulp from 'gulp'; @@ -14,29 +13,6 @@ export async function clean() await Promise.all(paths.map(path => rm(path, options))); } -export async function lint() -{ - await - lintImpl - ( - { - src: 'src/**/*.ts', - parserOptions: { project: 'tsconfig.json', sourceType: 'module' }, - }, - { - src: 'test/**/*.ts', - envs: ['ebdd/ebdd', 'mocha'], - parserOptions: { project: 'test/tsconfig.json', sourceType: 'module' }, - plugins: ['ebdd'], - }, - { - src: ['*.js', 'dev/**/*.js'], - envs: ['node'], - parserOptions: { ecmaVersion: 2020, sourceType: 'module' }, - }, - ); -} - export function test(callback) { const { resolve } = createRequire(import.meta.url); @@ -57,6 +33,6 @@ export function test(callback) childProcess.on('exit', code => callback(code && 'Test failed')); } -export { make }; +export { lint, make }; export default series(parallel(clean, lint), test, make); diff --git a/packages/~solution/package.json b/packages/~solution/package.json index 8bdb8eec..922b422a 100644 --- a/packages/~solution/package.json +++ b/packages/~solution/package.json @@ -19,6 +19,7 @@ "scripts": { "build": "npm install && gulp", "legacy-test": "node -- test/node-legacy/node_modules/mocha/bin/mocha --check-leaks --ui=ebdd test/node-legacy/test/spec/**/*.spec.js", + "lint": "node dev/lint", "make": "node dev/make", "prepare-legacy-test": "node ../../dev/internal/prepare-package-legacy-test.mjs", "test": "mocha --check-leaks --require=ts-node/register --ui=ebdd test/spec/**/*.spec.ts" From 60b782524b568711ff6353fdb19521878d1cb764 Mon Sep 17 00:00:00 2001 From: Francesco Trotta Date: Wed, 4 Aug 2021 13:19:08 +0200 Subject: [PATCH 008/101] Linting top level await in packages --- .github/workflows/~mask.yml | 2 +- .github/workflows/~result-format.yml | 2 +- .github/workflows/~solution.yml | 2 +- dev/internal/package-utils.mjs | 9 ++++++++- package.json | 2 ++ packages/~mask/dev/impl.js | 15 +++++++++++---- packages/~mask/dev/lint.js | 18 +++--------------- packages/~mask/dev/make.js | 14 +------------- packages/~mask/package.json | 4 ++-- packages/~result-format/dev/impl.js | 14 +++++++++++--- packages/~result-format/dev/lint.js | 18 +++--------------- .../dev/make-browser-spec-runner.js | 14 +------------- packages/~result-format/dev/make-lib.js | 14 +------------- packages/~result-format/package.json | 4 ++-- packages/~solution/dev/impl.js | 17 ++++++++++++----- packages/~solution/dev/lint.js | 18 +++--------------- packages/~solution/dev/make.js | 14 +------------- packages/~solution/package.json | 4 ++-- 18 files changed, 66 insertions(+), 119 deletions(-) diff --git a/.github/workflows/~mask.yml b/.github/workflows/~mask.yml index 1f4e7ca5..df10c315 100644 --- a/.github/workflows/~mask.yml +++ b/.github/workflows/~mask.yml @@ -19,7 +19,7 @@ jobs: - uses: actions/setup-node@v2 with: node-version: 16.x - - run: npm install + - run: npm install --prefix ../.. - run: npm run lint test: diff --git a/.github/workflows/~result-format.yml b/.github/workflows/~result-format.yml index b937fed3..0bff1c8a 100644 --- a/.github/workflows/~result-format.yml +++ b/.github/workflows/~result-format.yml @@ -19,7 +19,7 @@ jobs: - uses: actions/setup-node@v2 with: node-version: 16.x - - run: npm install + - run: npm install --prefix ../.. - run: npm run lint test: diff --git a/.github/workflows/~solution.yml b/.github/workflows/~solution.yml index 1c513826..660ca90a 100644 --- a/.github/workflows/~solution.yml +++ b/.github/workflows/~solution.yml @@ -19,7 +19,7 @@ jobs: - uses: actions/setup-node@v2 with: node-version: 16.x - - run: npm install + - run: npm install --prefix ../.. - run: npm run lint test: diff --git a/dev/internal/package-utils.mjs b/dev/internal/package-utils.mjs index 3f4b5cf6..0cd4d7e8 100644 --- a/dev/internal/package-utils.mjs +++ b/dev/internal/package-utils.mjs @@ -1,3 +1,4 @@ +import { lint } from '@fasttime/lint'; import fastGlob from 'fast-glob'; import { createRequire } from 'module'; import { isAbsolute, join, relative } from 'path'; @@ -62,7 +63,11 @@ export async function compileTS(pkgPath, source, newOptions, writeFile) } )(); const emitResult = program.emit(undefined, writeFile); - const diagnostics = [...ts.getPreEmitDiagnostics(program), ...emitResult.diagnostics]; + const diagnostics = + [ + ...ts.getPreEmitDiagnostics(program).filter(({ code }) => code !== 2343), + ...emitResult.diagnostics, + ]; if (diagnostics.length) { const reporter = ts.createDiagnosticReporter(sys, true); @@ -91,6 +96,8 @@ function getWriteFile(sysWriteFile, declarationDir, dTsFilter) return writeFile; } +export { lint as lintPackage }; + export async function makePackage(pkgURL, dTsFilter) { const pkgPath = fileURLToPath(pkgURL); diff --git a/package.json b/package.json index 97fafeaf..4f950596 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,8 @@ "test": "mocha --check-leaks --ui=ebdd test/{*,*/*}.spec.js" }, "devDependencies": { + "@babel/eslint-parser": "latest", + "@babel/plugin-syntax-top-level-await": "latest", "@fasttime/lint": "latest", "@rollup/plugin-node-resolve": "latest", "acorn": "latest", diff --git a/packages/~mask/dev/impl.js b/packages/~mask/dev/impl.js index 06d26dcd..4916cd90 100644 --- a/packages/~mask/dev/impl.js +++ b/packages/~mask/dev/impl.js @@ -1,11 +1,12 @@ -import { lint as lintImpl } from '@fasttime/lint'; - const PACKAGE_UTILS_URL = '../../../dev/internal/package-utils.mjs'; +const importPackageUtils = () => import(PACKAGE_UTILS_URL); + export async function lint() { + const { lintPackage } = await importPackageUtils(); await - lintImpl + lintPackage ( { src: 'src/**/*.ts', @@ -20,7 +21,13 @@ export async function lint() { src: ['*.js', 'dev/**/*.js'], envs: ['node'], - parserOptions: { ecmaVersion: 2020, sourceType: 'module' }, + parser: '@babel/eslint-parser', + parserOptions: + { + babelOptions: { plugins: ['@babel/plugin-syntax-top-level-await'] }, + ecmaVersion: 2021, + requireConfigFile: false, + }, }, ); } diff --git a/packages/~mask/dev/lint.js b/packages/~mask/dev/lint.js index 443eca37..7d47dc71 100755 --- a/packages/~mask/dev/lint.js +++ b/packages/~mask/dev/lint.js @@ -3,18 +3,6 @@ import { lint } from './impl.js'; import { fileURLToPath } from 'url'; -(async () => -{ - try - { - const pkgPath = fileURLToPath(new URL('..', import.meta.url)); - process.chdir(pkgPath); - await lint(); - } - catch (error) - { - console.error(error); - process.exitCode = 1; - } -} -)(); +const pkgPath = fileURLToPath(new URL('..', import.meta.url)); +process.chdir(pkgPath); +await lint(); diff --git a/packages/~mask/dev/make.js b/packages/~mask/dev/make.js index 18d697cb..9b8ac0f6 100755 --- a/packages/~mask/dev/make.js +++ b/packages/~mask/dev/make.js @@ -2,16 +2,4 @@ import { make } from './impl.js'; -(async () => -{ - try - { - await make(); - } - catch (error) - { - console.error(error); - process.exitCode = 1; - } -} -)(); +await make(); diff --git a/packages/~mask/package.json b/packages/~mask/package.json index 3a3495ac..75d7c94c 100644 --- a/packages/~mask/package.json +++ b/packages/~mask/package.json @@ -25,7 +25,6 @@ "test": "mocha --check-leaks --require=ts-node/register --ui=ebdd test/spec/**/*.spec.ts" }, "devDependencies": { - "@fasttime/lint": "latest", "@types/mocha": "latest", "@types/node": "latest", "ebdd": "latest", @@ -33,7 +32,8 @@ "gulp": "latest", "mocha": "latest", "nyc": "latest", - "ts-node": "latest" + "ts-node": "latest", + "typescript": "latest" }, "private": true, "type": "module" diff --git a/packages/~result-format/dev/impl.js b/packages/~result-format/dev/impl.js index 61adccf7..18835943 100644 --- a/packages/~result-format/dev/impl.js +++ b/packages/~result-format/dev/impl.js @@ -1,4 +1,3 @@ -import { lint as lintImpl } from '@fasttime/lint'; import { join } from 'path'; import rollupPluginNodeBuiltins from 'rollup-plugin-node-builtins'; import rollupPluginNodeGlobals from 'rollup-plugin-node-globals'; @@ -6,10 +5,13 @@ import { fileURLToPath } from 'url'; const PACKAGE_UTILS_URL = '../../../dev/internal/package-utils.mjs'; +const importPackageUtils = () => import(PACKAGE_UTILS_URL); + export async function lint() { + const { lintPackage } = await importPackageUtils(); await - lintImpl + lintPackage ( { src: 'src/**/*.ts', @@ -24,7 +26,13 @@ export async function lint() { src: ['*.js', 'dev/**/*.js'], envs: ['node'], - parserOptions: { ecmaVersion: 2020, sourceType: 'module' }, + parser: '@babel/eslint-parser', + parserOptions: + { + babelOptions: { plugins: ['@babel/plugin-syntax-top-level-await'] }, + ecmaVersion: 2021, + requireConfigFile: false, + }, }, ); } diff --git a/packages/~result-format/dev/lint.js b/packages/~result-format/dev/lint.js index 443eca37..7d47dc71 100755 --- a/packages/~result-format/dev/lint.js +++ b/packages/~result-format/dev/lint.js @@ -3,18 +3,6 @@ import { lint } from './impl.js'; import { fileURLToPath } from 'url'; -(async () => -{ - try - { - const pkgPath = fileURLToPath(new URL('..', import.meta.url)); - process.chdir(pkgPath); - await lint(); - } - catch (error) - { - console.error(error); - process.exitCode = 1; - } -} -)(); +const pkgPath = fileURLToPath(new URL('..', import.meta.url)); +process.chdir(pkgPath); +await lint(); diff --git a/packages/~result-format/dev/make-browser-spec-runner.js b/packages/~result-format/dev/make-browser-spec-runner.js index 337b1f86..120a5e2e 100755 --- a/packages/~result-format/dev/make-browser-spec-runner.js +++ b/packages/~result-format/dev/make-browser-spec-runner.js @@ -2,16 +2,4 @@ import { makeBrowserSpecRunner } from './impl.js'; -(async () => -{ - try - { - await makeBrowserSpecRunner(); - } - catch (error) - { - console.error(error); - process.exitCode = 1; - } -} -)(); +await makeBrowserSpecRunner(); diff --git a/packages/~result-format/dev/make-lib.js b/packages/~result-format/dev/make-lib.js index 60684d63..47d78a63 100755 --- a/packages/~result-format/dev/make-lib.js +++ b/packages/~result-format/dev/make-lib.js @@ -2,16 +2,4 @@ import { makeLib } from './impl.js'; -(async () => -{ - try - { - await makeLib(); - } - catch (error) - { - console.error(error); - process.exitCode = 1; - } -} -)(); +await makeLib(); diff --git a/packages/~result-format/package.json b/packages/~result-format/package.json index 0b4b1993..8e8c0c8d 100644 --- a/packages/~result-format/package.json +++ b/packages/~result-format/package.json @@ -25,7 +25,6 @@ "test": "mocha --check-leaks --require=ts-node/register --ui=ebdd test/spec/**/*.spec.ts" }, "devDependencies": { - "@fasttime/lint": "latest", "@types/mocha": "latest", "@types/node": "latest", "ebdd": "latest", @@ -37,7 +36,8 @@ "nyc": "latest", "rollup-plugin-node-builtins": "latest", "rollup-plugin-node-globals": "latest", - "ts-node": "latest" + "ts-node": "latest", + "typescript": "latest" }, "private": true, "type": "module" diff --git a/packages/~solution/dev/impl.js b/packages/~solution/dev/impl.js index 06d26dcd..e5bd0d6e 100644 --- a/packages/~solution/dev/impl.js +++ b/packages/~solution/dev/impl.js @@ -1,11 +1,12 @@ -import { lint as lintImpl } from '@fasttime/lint'; - const PACKAGE_UTILS_URL = '../../../dev/internal/package-utils.mjs'; +const importPackageUtils = () => import(PACKAGE_UTILS_URL); + export async function lint() { + const { lintPackage } = await importPackageUtils(); await - lintImpl + lintPackage ( { src: 'src/**/*.ts', @@ -20,14 +21,20 @@ export async function lint() { src: ['*.js', 'dev/**/*.js'], envs: ['node'], - parserOptions: { ecmaVersion: 2020, sourceType: 'module' }, + parser: '@babel/eslint-parser', + parserOptions: + { + babelOptions: { plugins: ['@babel/plugin-syntax-top-level-await'] }, + ecmaVersion: 2021, + requireConfigFile: false, + }, }, ); } export async function make() { - const { makePackage } = await import(PACKAGE_UTILS_URL); + const { makePackage } = await importPackageUtils(); const pkgURL = new URL('..', import.meta.url); await makePackage(pkgURL); } diff --git a/packages/~solution/dev/lint.js b/packages/~solution/dev/lint.js index 443eca37..7d47dc71 100755 --- a/packages/~solution/dev/lint.js +++ b/packages/~solution/dev/lint.js @@ -3,18 +3,6 @@ import { lint } from './impl.js'; import { fileURLToPath } from 'url'; -(async () => -{ - try - { - const pkgPath = fileURLToPath(new URL('..', import.meta.url)); - process.chdir(pkgPath); - await lint(); - } - catch (error) - { - console.error(error); - process.exitCode = 1; - } -} -)(); +const pkgPath = fileURLToPath(new URL('..', import.meta.url)); +process.chdir(pkgPath); +await lint(); diff --git a/packages/~solution/dev/make.js b/packages/~solution/dev/make.js index 18d697cb..9b8ac0f6 100755 --- a/packages/~solution/dev/make.js +++ b/packages/~solution/dev/make.js @@ -2,16 +2,4 @@ import { make } from './impl.js'; -(async () => -{ - try - { - await make(); - } - catch (error) - { - console.error(error); - process.exitCode = 1; - } -} -)(); +await make(); diff --git a/packages/~solution/package.json b/packages/~solution/package.json index 922b422a..3393c6a5 100644 --- a/packages/~solution/package.json +++ b/packages/~solution/package.json @@ -25,7 +25,6 @@ "test": "mocha --check-leaks --require=ts-node/register --ui=ebdd test/spec/**/*.spec.ts" }, "devDependencies": { - "@fasttime/lint": "latest", "@types/mocha": "latest", "@types/node": "latest", "ebdd": "latest", @@ -33,7 +32,8 @@ "gulp": "latest", "mocha": "latest", "nyc": "latest", - "ts-node": "latest" + "ts-node": "latest", + "typescript": "latest" }, "private": true, "type": "module" From 243f1f476ea45192e2721687afab67ea01b9bdfd Mon Sep 17 00:00:00 2001 From: Francesco Trotta Date: Wed, 4 Aug 2021 16:43:15 +0200 Subject: [PATCH 009/101] New clean util in packages --- dev/internal/package-utils.mjs | 31 +++++++++++++++++++++------- packages/~mask/dev/clean.js | 5 +++++ packages/~mask/dev/impl.js | 8 +++++++ packages/~mask/gulpfile.js | 18 +++++----------- packages/~mask/package.json | 1 + packages/~result-format/dev/clean.js | 5 +++++ packages/~result-format/dev/impl.js | 17 +++++++++++++++ packages/~result-format/gulpfile.js | 26 +++++------------------ packages/~result-format/package.json | 1 + packages/~solution/dev/clean.js | 5 +++++ packages/~solution/dev/impl.js | 8 +++++++ packages/~solution/gulpfile.js | 18 +++++----------- packages/~solution/package.json | 1 + 13 files changed, 89 insertions(+), 55 deletions(-) create mode 100755 packages/~mask/dev/clean.js create mode 100755 packages/~result-format/dev/clean.js create mode 100755 packages/~solution/dev/clean.js diff --git a/dev/internal/package-utils.mjs b/dev/internal/package-utils.mjs index 0cd4d7e8..26301bf1 100644 --- a/dev/internal/package-utils.mjs +++ b/dev/internal/package-utils.mjs @@ -1,11 +1,12 @@ -import { lint } from '@fasttime/lint'; -import fastGlob from 'fast-glob'; -import { createRequire } from 'module'; -import { isAbsolute, join, relative } from 'path'; -import { rollup } from 'rollup'; -import rollupPluginCleanup from 'rollup-plugin-cleanup'; -import ts from 'typescript'; -import { fileURLToPath } from 'url'; +import { lint } from '@fasttime/lint'; +import fastGlob from 'fast-glob'; +import { rm } from 'fs/promises'; +import { createRequire } from 'module'; +import { isAbsolute, join, relative, resolve } from 'path'; +import { rollup } from 'rollup'; +import rollupPluginCleanup from 'rollup-plugin-cleanup'; +import ts from 'typescript'; +import { fileURLToPath } from 'url'; async function bundle(pkgPath) { @@ -31,6 +32,20 @@ export async function bundleJS(inputOptions, outputOptions) return code; } +export async function cleanPackage(pkgURL, ...paths) +{ + const pkgPath = fileURLToPath(pkgURL); + const options = { force: true, recursive: true }; + const cleanPath = + async path => + { + const resolvedPath = resolve(pkgPath, path); + await rm(resolvedPath, options); + }; + const promises = paths.map(cleanPath); + await Promise.all(promises); +} + async function compile(pkgPath, dTsFilter) { const declarationDir = join(pkgPath, 'lib'); diff --git a/packages/~mask/dev/clean.js b/packages/~mask/dev/clean.js new file mode 100755 index 00000000..35891e5f --- /dev/null +++ b/packages/~mask/dev/clean.js @@ -0,0 +1,5 @@ +#!/usr/bin/env node + +import { clean } from './impl.js'; + +await clean(); diff --git a/packages/~mask/dev/impl.js b/packages/~mask/dev/impl.js index 4916cd90..795e2cc9 100644 --- a/packages/~mask/dev/impl.js +++ b/packages/~mask/dev/impl.js @@ -1,5 +1,13 @@ const PACKAGE_UTILS_URL = '../../../dev/internal/package-utils.mjs'; +export async function clean() +{ + const { cleanPackage } = await importPackageUtils(); + const pkgURL = new URL('..', import.meta.url); + await + cleanPackage(pkgURL, '.nyc_output', '.tmp-out', 'coverage', 'lib', 'test/node-legacy'); +} + const importPackageUtils = () => import(PACKAGE_UTILS_URL); export async function lint() diff --git a/packages/~mask/gulpfile.js b/packages/~mask/gulpfile.js index d0bb3a04..7e066de0 100644 --- a/packages/~mask/gulpfile.js +++ b/packages/~mask/gulpfile.js @@ -1,18 +1,10 @@ -import { lint, make } from './dev/impl.js'; -import { fork } from 'child_process'; -import { rm } from 'fs/promises'; -import gulp from 'gulp'; -import { createRequire } from 'module'; +import { clean, lint, make } from './dev/impl.js'; +import { fork } from 'child_process'; +import gulp from 'gulp'; +import { createRequire } from 'module'; const { parallel, series } = gulp; -export async function clean() -{ - const paths = ['.nyc_output', '.tmp-out', 'coverage', 'lib', 'test/node-legacy']; - const options = { force: true, recursive: true }; - await Promise.all(paths.map(path => rm(path, options))); -} - export function test(callback) { const { resolve } = createRequire(import.meta.url); @@ -33,6 +25,6 @@ export function test(callback) childProcess.on('exit', code => callback(code && 'Test failed')); } -export { lint, make }; +export { clean, lint, make }; export default series(parallel(clean, lint), test, make); diff --git a/packages/~mask/package.json b/packages/~mask/package.json index 75d7c94c..a1aa2193 100644 --- a/packages/~mask/package.json +++ b/packages/~mask/package.json @@ -18,6 +18,7 @@ }, "scripts": { "build": "npm install && gulp", + "clean": "node dev/clean", "legacy-test": "node -- test/node-legacy/node_modules/mocha/bin/mocha --check-leaks --ui=ebdd test/node-legacy/test/spec/**/*.spec.js", "lint": "node dev/lint", "make": "node dev/make", diff --git a/packages/~result-format/dev/clean.js b/packages/~result-format/dev/clean.js new file mode 100755 index 00000000..35891e5f --- /dev/null +++ b/packages/~result-format/dev/clean.js @@ -0,0 +1,5 @@ +#!/usr/bin/env node + +import { clean } from './impl.js'; + +await clean(); diff --git a/packages/~result-format/dev/impl.js b/packages/~result-format/dev/impl.js index 18835943..28ae6714 100644 --- a/packages/~result-format/dev/impl.js +++ b/packages/~result-format/dev/impl.js @@ -5,6 +5,23 @@ import { fileURLToPath } from 'url'; const PACKAGE_UTILS_URL = '../../../dev/internal/package-utils.mjs'; +export async function clean() +{ + const { cleanPackage } = await importPackageUtils(); + const pkgURL = new URL('..', import.meta.url); + await + cleanPackage + ( + pkgURL, + '.nyc_output', + '.tmp-out', + 'coverage', + 'lib', + 'test/browser-spec-runner.js', + 'test/node-legacy', + ); +} + const importPackageUtils = () => import(PACKAGE_UTILS_URL); export async function lint() diff --git a/packages/~result-format/gulpfile.js b/packages/~result-format/gulpfile.js index 995c929c..0dd6d624 100644 --- a/packages/~result-format/gulpfile.js +++ b/packages/~result-format/gulpfile.js @@ -1,26 +1,10 @@ -import { lint, makeBrowserSpecRunner, makeLib } from './dev/impl.js'; -import { fork } from 'child_process'; -import { rm } from 'fs/promises'; -import gulp from 'gulp'; -import { createRequire } from 'module'; +import { clean, lint, makeBrowserSpecRunner, makeLib } from './dev/impl.js'; +import { fork } from 'child_process'; +import gulp from 'gulp'; +import { createRequire } from 'module'; const { parallel, series } = gulp; -export async function clean() -{ - const paths = - [ - '.nyc_output', - '.tmp-out', - 'coverage', - 'lib', - 'test/browser-spec-runner.js', - 'test/node-legacy', - ]; - const options = { force: true, recursive: true }; - await Promise.all(paths.map(path => rm(path, options))); -} - export function test(callback) { const { resolve } = createRequire(import.meta.url); @@ -41,6 +25,6 @@ export function test(callback) childProcess.on('exit', code => callback(code && 'Test failed')); } -export { lint, makeLib, makeBrowserSpecRunner }; +export { clean, lint, makeLib, makeBrowserSpecRunner }; export default series(parallel(clean, lint), test, parallel(makeLib, makeBrowserSpecRunner)); diff --git a/packages/~result-format/package.json b/packages/~result-format/package.json index 8e8c0c8d..893a75d3 100644 --- a/packages/~result-format/package.json +++ b/packages/~result-format/package.json @@ -18,6 +18,7 @@ }, "scripts": { "build": "npm install && gulp", + "clean": "node dev/clean", "legacy-test": "node -- test/node-legacy/node_modules/mocha/bin/mocha --check-leaks --ui=ebdd test/node-legacy/test/spec/**/*.spec.js", "lint": "node dev/lint", "make": "node dev/make-lib", diff --git a/packages/~solution/dev/clean.js b/packages/~solution/dev/clean.js new file mode 100755 index 00000000..35891e5f --- /dev/null +++ b/packages/~solution/dev/clean.js @@ -0,0 +1,5 @@ +#!/usr/bin/env node + +import { clean } from './impl.js'; + +await clean(); diff --git a/packages/~solution/dev/impl.js b/packages/~solution/dev/impl.js index e5bd0d6e..cbc0259e 100644 --- a/packages/~solution/dev/impl.js +++ b/packages/~solution/dev/impl.js @@ -1,5 +1,13 @@ const PACKAGE_UTILS_URL = '../../../dev/internal/package-utils.mjs'; +export async function clean() +{ + const { cleanPackage } = await importPackageUtils(); + const pkgURL = new URL('..', import.meta.url); + await + cleanPackage(pkgURL, '.nyc_output', '.tmp-out', 'coverage', 'lib', 'test/node-legacy'); +} + const importPackageUtils = () => import(PACKAGE_UTILS_URL); export async function lint() diff --git a/packages/~solution/gulpfile.js b/packages/~solution/gulpfile.js index d0bb3a04..7e066de0 100644 --- a/packages/~solution/gulpfile.js +++ b/packages/~solution/gulpfile.js @@ -1,18 +1,10 @@ -import { lint, make } from './dev/impl.js'; -import { fork } from 'child_process'; -import { rm } from 'fs/promises'; -import gulp from 'gulp'; -import { createRequire } from 'module'; +import { clean, lint, make } from './dev/impl.js'; +import { fork } from 'child_process'; +import gulp from 'gulp'; +import { createRequire } from 'module'; const { parallel, series } = gulp; -export async function clean() -{ - const paths = ['.nyc_output', '.tmp-out', 'coverage', 'lib', 'test/node-legacy']; - const options = { force: true, recursive: true }; - await Promise.all(paths.map(path => rm(path, options))); -} - export function test(callback) { const { resolve } = createRequire(import.meta.url); @@ -33,6 +25,6 @@ export function test(callback) childProcess.on('exit', code => callback(code && 'Test failed')); } -export { lint, make }; +export { clean, lint, make }; export default series(parallel(clean, lint), test, make); diff --git a/packages/~solution/package.json b/packages/~solution/package.json index 3393c6a5..c8ce7aca 100644 --- a/packages/~solution/package.json +++ b/packages/~solution/package.json @@ -18,6 +18,7 @@ }, "scripts": { "build": "npm install && gulp", + "clean": "node dev/clean", "legacy-test": "node -- test/node-legacy/node_modules/mocha/bin/mocha --check-leaks --ui=ebdd test/node-legacy/test/spec/**/*.spec.js", "lint": "node dev/lint", "make": "node dev/make", From eb553392b2363abed5e8ffe589043d41a319c743 Mon Sep 17 00:00:00 2001 From: Francesco Trotta Date: Wed, 4 Aug 2021 22:58:11 +0200 Subject: [PATCH 010/101] Fixed package build on Windows --- dev/internal/prepare-package-legacy-test.mjs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dev/internal/prepare-package-legacy-test.mjs b/dev/internal/prepare-package-legacy-test.mjs index eaf0116d..014b81fa 100755 --- a/dev/internal/prepare-package-legacy-test.mjs +++ b/dev/internal/prepare-package-legacy-test.mjs @@ -21,7 +21,9 @@ async function npmInstall() const contents = JSON.stringify(pkg, null, 2) + EOL; const path = join(NODE_LEGACY_DIR, 'package.json'); await writeFile(path, contents); - const childProcess = spawn('npm', ['install'], { cwd: NODE_LEGACY_DIR, stdio: 'inherit' }); + const childProcess = + // Option "shell" is required on Windows. + spawn('npm', ['install', '--silent'], { cwd: NODE_LEGACY_DIR, shell: true, stdio: 'inherit' }); await endOf(childProcess); } From 92ada39f41a7c8349a223d57e6696852eb42366e Mon Sep 17 00:00:00 2001 From: Francesco Trotta Date: Wed, 4 Aug 2021 22:59:13 +0200 Subject: [PATCH 011/101] Mirroring all package Gulp tasks in npm scripts --- packages/~mask/package.json | 1 + packages/~result-format/package.json | 5 ++++- packages/~solution/package.json | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/~mask/package.json b/packages/~mask/package.json index a1aa2193..1062e30c 100644 --- a/packages/~mask/package.json +++ b/packages/~mask/package.json @@ -19,6 +19,7 @@ "scripts": { "build": "npm install && gulp", "clean": "node dev/clean", + "coverage": "nyc --include=src --reporter=html --reporter=text-summary npm test", "legacy-test": "node -- test/node-legacy/node_modules/mocha/bin/mocha --check-leaks --ui=ebdd test/node-legacy/test/spec/**/*.spec.js", "lint": "node dev/lint", "make": "node dev/make", diff --git a/packages/~result-format/package.json b/packages/~result-format/package.json index 893a75d3..6d1e2dd1 100644 --- a/packages/~result-format/package.json +++ b/packages/~result-format/package.json @@ -19,9 +19,12 @@ "scripts": { "build": "npm install && gulp", "clean": "node dev/clean", + "coverage": "nyc --include=src --reporter=html --reporter=text-summary npm test", "legacy-test": "node -- test/node-legacy/node_modules/mocha/bin/mocha --check-leaks --ui=ebdd test/node-legacy/test/spec/**/*.spec.js", "lint": "node dev/lint", - "make": "node dev/make-lib", + "make": "npm run make-lib", + "make-browser-spec-runner": "node dev/make-browser-spec-runner", + "make-lib": "node dev/make-lib", "prepare-legacy-test": "node ../../dev/internal/prepare-package-legacy-test.mjs", "test": "mocha --check-leaks --require=ts-node/register --ui=ebdd test/spec/**/*.spec.ts" }, diff --git a/packages/~solution/package.json b/packages/~solution/package.json index c8ce7aca..3a1fad71 100644 --- a/packages/~solution/package.json +++ b/packages/~solution/package.json @@ -19,6 +19,7 @@ "scripts": { "build": "npm install && gulp", "clean": "node dev/clean", + "coverage": "nyc --include=src --reporter=html --reporter=text-summary npm test", "legacy-test": "node -- test/node-legacy/node_modules/mocha/bin/mocha --check-leaks --ui=ebdd test/node-legacy/test/spec/**/*.spec.js", "lint": "node dev/lint", "make": "node dev/make", From deb2196234a015845e5a125f96017cccd1f2050f Mon Sep 17 00:00:00 2001 From: Francesco Trotta Date: Fri, 6 Aug 2021 18:38:37 +0200 Subject: [PATCH 012/101] New features and new definitions of "L" --- Features.md | 3 ++ api-doc/README.md | 2 +- api-doc/interfaces/FeatureAll.md | 26 +++++++++ api-doc/interfaces/FeatureConstructor.md | 34 ++++++++++++ src/lib/definitions.js | 14 +++++ src/lib/features.js | 46 ++++++++++++++-- test/helpers/feature-emulation.helpers.js | 65 +++++++++++++++++++---- test/lib/definitions.spec.js | 5 ++ 8 files changed, 179 insertions(+), 16 deletions(-) diff --git a/Features.md b/Features.md index 130f37d3..2ec0b7d1 100644 --- a/Features.md +++ b/Features.md @@ -120,6 +120,7 @@ This table lists features available in the most common engines.
  • LOCALE_NUMERALS_EXT (Internet Explorer 11 on Windows 10)
  • NO_FF_SRC (implied by IE_SRC)
  • NO_V8_SRC (implied by IE_SRC) +
  • OBJECT_L_LOCATION_CTOR
  • OBJECT_UNDEFINED (Internet Explorer 10+)
  • PLAIN_INTL (Internet Explorer 11)
  • SELF_OBJ (implied by ANY_WINDOW and WINDOW) @@ -166,7 +167,9 @@ This table lists features available in the most common engines.
  • NO_IE_SRC (implied by FF_SRC)
  • NO_OLD_SAFARI_ARRAY_ITERATOR (Safari 9+)
  • NO_V8_SRC (implied by FF_SRC) +
  • OBJECT_L_LOCATION_CTOR (not in Safari 10+)
  • OBJECT_UNDEFINED (implied by GLOBAL_UNDEFINED) +
  • OLD_SAFARI_LOCATION_CTOR (not in Safari 10+)
  • PLAIN_INTL (Safari 10+, not in Safari 14.0.1+)
  • REGEXP_STRING_ITERATOR (Safari 13+)
  • SELF_OBJ (implied by ANY_WINDOW and WINDOW) diff --git a/api-doc/README.md b/api-doc/README.md index 5c786ddf..075e0315 100644 --- a/api-doc/README.md +++ b/api-doc/README.md @@ -47,7 +47,7 @@ ___ ### ElementaryFeatureName -Ƭ **ElementaryFeatureName**: ``"ANY_DOCUMENT"`` \| ``"ANY_WINDOW"`` \| ``"ARRAY_ITERATOR"`` \| ``"ARROW"`` \| ``"AT"`` \| ``"ATOB"`` \| ``"BARPROP"`` \| ``"CAPITAL_HTML"`` \| ``"CONSOLE"`` \| ``"DOCUMENT"`` \| ``"DOMWINDOW"`` \| ``"ESC_HTML_ALL"`` \| ``"ESC_HTML_QUOT"`` \| ``"ESC_HTML_QUOT_ONLY"`` \| ``"ESC_REGEXP_LF"`` \| ``"ESC_REGEXP_SLASH"`` \| ``"FF_SRC"`` \| ``"FILL"`` \| ``"FLAT"`` \| ``"FROM_CODE_POINT"`` \| ``"FUNCTION_19_LF"`` \| ``"FUNCTION_22_LF"`` \| ``"GENERIC_ARRAY_TO_STRING"`` \| ``"GLOBAL_UNDEFINED"`` \| ``"GMT"`` \| ``"HISTORY"`` \| ``"HTMLAUDIOELEMENT"`` \| ``"HTMLDOCUMENT"`` \| ``"IE_SRC"`` \| ``"INCR_CHAR"`` \| ``"INTL"`` \| ``"LOCALE_INFINITY"`` \| ``"LOCALE_NUMERALS"`` \| ``"LOCALE_NUMERALS_EXT"`` \| ``"LOCATION"`` \| ``"NAME"`` \| ``"NODECONSTRUCTOR"`` \| ``"NO_FF_SRC"`` \| ``"NO_IE_SRC"`` \| ``"NO_OLD_SAFARI_ARRAY_ITERATOR"`` \| ``"NO_V8_SRC"`` \| ``"OBJECT_UNDEFINED"`` \| ``"PLAIN_INTL"`` \| ``"REGEXP_STRING_ITERATOR"`` \| ``"SELF_OBJ"`` \| ``"SHORT_LOCALES"`` \| ``"STATUS"`` \| ``"UNDEFINED"`` \| ``"V8_SRC"`` \| ``"WINDOW"`` +Ƭ **ElementaryFeatureName**: ``"ANY_DOCUMENT"`` \| ``"ANY_WINDOW"`` \| ``"ARRAY_ITERATOR"`` \| ``"ARROW"`` \| ``"AT"`` \| ``"ATOB"`` \| ``"BARPROP"`` \| ``"CAPITAL_HTML"`` \| ``"CONSOLE"`` \| ``"DOCUMENT"`` \| ``"DOMWINDOW"`` \| ``"ESC_HTML_ALL"`` \| ``"ESC_HTML_QUOT"`` \| ``"ESC_HTML_QUOT_ONLY"`` \| ``"ESC_REGEXP_LF"`` \| ``"ESC_REGEXP_SLASH"`` \| ``"FF_SRC"`` \| ``"FILL"`` \| ``"FLAT"`` \| ``"FROM_CODE_POINT"`` \| ``"FUNCTION_19_LF"`` \| ``"FUNCTION_22_LF"`` \| ``"GENERIC_ARRAY_TO_STRING"`` \| ``"GLOBAL_UNDEFINED"`` \| ``"GMT"`` \| ``"HISTORY"`` \| ``"HTMLAUDIOELEMENT"`` \| ``"HTMLDOCUMENT"`` \| ``"IE_SRC"`` \| ``"INCR_CHAR"`` \| ``"INTL"`` \| ``"LOCALE_INFINITY"`` \| ``"LOCALE_NUMERALS"`` \| ``"LOCALE_NUMERALS_EXT"`` \| ``"LOCATION"`` \| ``"NAME"`` \| ``"NODECONSTRUCTOR"`` \| ``"NO_FF_SRC"`` \| ``"NO_IE_SRC"`` \| ``"NO_OLD_SAFARI_ARRAY_ITERATOR"`` \| ``"NO_V8_SRC"`` \| ``"OBJECT_L_LOCATION_CTOR"`` \| ``"OBJECT_UNDEFINED"`` \| ``"OLD_SAFARI_LOCATION_CTOR"`` \| ``"PLAIN_INTL"`` \| ``"REGEXP_STRING_ITERATOR"`` \| ``"SELF_OBJ"`` \| ``"SHORT_LOCALES"`` \| ``"STATUS"`` \| ``"UNDEFINED"`` \| ``"V8_SRC"`` \| ``"WINDOW"`` Name of an elementary feature. diff --git a/api-doc/interfaces/FeatureAll.md b/api-doc/interfaces/FeatureAll.md index c2f69345..7885e113 100644 --- a/api-doc/interfaces/FeatureAll.md +++ b/api-doc/interfaces/FeatureAll.md @@ -82,7 +82,9 @@ - [NO\_IE\_SRC](FeatureAll.md#no_ie_src) - [NO\_OLD\_SAFARI\_ARRAY\_ITERATOR](FeatureAll.md#no_old_safari_array_iterator) - [NO\_V8\_SRC](FeatureAll.md#no_v8_src) +- [OBJECT\_L\_LOCATION\_CTOR](FeatureAll.md#object_l_location_ctor) - [OBJECT\_UNDEFINED](FeatureAll.md#object_undefined) +- [OLD\_SAFARI\_LOCATION\_CTOR](FeatureAll.md#old_safari_location_ctor) - [PLAIN\_INTL](FeatureAll.md#plain_intl) - [REGEXP\_STRING\_ITERATOR](FeatureAll.md#regexp_string_iterator) - [SAFARI](FeatureAll.md#safari) @@ -913,6 +915,18 @@ Available in Firefox, Internet Explorer, and Safari. ___ +### OBJECT\_L\_LOCATION\_CTOR + +• **OBJECT\_L\_LOCATION\_CTOR**: [`ElementaryFeature`](ElementaryFeature.md) + +Existence of the global function location.constructor whose string representation starts with "\[object L" + +**`remarks`** + +Available in Internet Explorer and Safari before 10. This feature is not available inside web workers. + +___ + ### OBJECT\_UNDEFINED • **OBJECT\_UNDEFINED**: [`ElementaryFeature`](ElementaryFeature.md) @@ -925,6 +939,18 @@ Available in Chrome, Edge, Firefox, Internet Explorer 10+, Safari, Opera, Androi ___ +### OLD\_SAFARI\_LOCATION\_CTOR + +• **OLD\_SAFARI\_LOCATION\_CTOR**: [`ElementaryFeature`](ElementaryFeature.md) + +Existence of the global object location.constructor whose string representation starts with "\[object " and ends with "LocationConstructor\]" + +**`remarks`** + +Available in Safari before 10. + +___ + ### PLAIN\_INTL • **PLAIN\_INTL**: [`ElementaryFeature`](ElementaryFeature.md) diff --git a/api-doc/interfaces/FeatureConstructor.md b/api-doc/interfaces/FeatureConstructor.md index 69c2a6bc..05a1c362 100644 --- a/api-doc/interfaces/FeatureConstructor.md +++ b/api-doc/interfaces/FeatureConstructor.md @@ -132,7 +132,9 @@ An error is thrown if any of the specified features are not mutually compatible. - [NO\_IE\_SRC](FeatureConstructor.md#no_ie_src) - [NO\_OLD\_SAFARI\_ARRAY\_ITERATOR](FeatureConstructor.md#no_old_safari_array_iterator) - [NO\_V8\_SRC](FeatureConstructor.md#no_v8_src) +- [OBJECT\_L\_LOCATION\_CTOR](FeatureConstructor.md#object_l_location_ctor) - [OBJECT\_UNDEFINED](FeatureConstructor.md#object_undefined) +- [OLD\_SAFARI\_LOCATION\_CTOR](FeatureConstructor.md#old_safari_location_ctor) - [PLAIN\_INTL](FeatureConstructor.md#plain_intl) - [REGEXP\_STRING\_ITERATOR](FeatureConstructor.md#regexp_string_iterator) - [SAFARI](FeatureConstructor.md#safari) @@ -1332,6 +1334,22 @@ Available in Firefox, Internet Explorer, and Safari. ___ +### OBJECT\_L\_LOCATION\_CTOR + +• **OBJECT\_L\_LOCATION\_CTOR**: [`ElementaryFeature`](ElementaryFeature.md) + +Existence of the global function location.constructor whose string representation starts with "\[object L" + +**`remarks`** + +Available in Internet Explorer and Safari before 10. This feature is not available inside web workers. + +#### Inherited from + +[FeatureAll](FeatureAll.md).[OBJECT_L_LOCATION_CTOR](FeatureAll.md#object_l_location_ctor) + +___ + ### OBJECT\_UNDEFINED • **OBJECT\_UNDEFINED**: [`ElementaryFeature`](ElementaryFeature.md) @@ -1348,6 +1366,22 @@ Available in Chrome, Edge, Firefox, Internet Explorer 10+, Safari, Opera, Androi ___ +### OLD\_SAFARI\_LOCATION\_CTOR + +• **OLD\_SAFARI\_LOCATION\_CTOR**: [`ElementaryFeature`](ElementaryFeature.md) + +Existence of the global object location.constructor whose string representation starts with "\[object " and ends with "LocationConstructor\]" + +**`remarks`** + +Available in Safari before 10. + +#### Inherited from + +[FeatureAll](FeatureAll.md).[OLD_SAFARI_LOCATION_CTOR](FeatureAll.md#old_safari_location_ctor) + +___ + ### PLAIN\_INTL • **PLAIN\_INTL**: [`ElementaryFeature`](ElementaryFeature.md) diff --git a/src/lib/definitions.js b/src/lib/definitions.js index 3efa197e..1791d21c 100644 --- a/src/lib/definitions.js +++ b/src/lib/definitions.js @@ -388,7 +388,9 @@ function getFHPaddingEntries(index) var NO_IE_SRC = Feature.NO_IE_SRC; var NO_OLD_SAFARI_ARRAY_ITERATOR = Feature.NO_OLD_SAFARI_ARRAY_ITERATOR; var NO_V8_SRC = Feature.NO_V8_SRC; + var OBJECT_L_LOCATION_CTOR = Feature.OBJECT_L_LOCATION_CTOR; var OBJECT_UNDEFINED = Feature.OBJECT_UNDEFINED; + var OLD_SAFARI_LOCATION_CTOR = Feature.OLD_SAFARI_LOCATION_CTOR; var PLAIN_INTL = Feature.PLAIN_INTL; var REGEXP_STRING_ITERATOR = Feature.REGEXP_STRING_ITERATOR; var SELF_OBJ = Feature.SELF_OBJ; @@ -852,6 +854,12 @@ function getFHPaddingEntries(index) }, LOCATION ), + define('(RP_3_WA + LOCATION_CONSTRUCTOR)[11]', OBJECT_L_LOCATION_CTOR), + define + ( + '(LOCATION_CONSTRUCTOR + RP_0_S)[SLICE_OR_SUBSTR]("-20")[0]', + OLD_SAFARI_LOCATION_CTOR + ), define ( { @@ -861,6 +869,7 @@ function getFHPaddingEntries(index) AT, LOCATION ), + define('(LOCATION_CONSTRUCTOR + RP_0_S).at("-20")', AT, OLD_SAFARI_LOCATION_CTOR), define ( '[][TO_STRING].call(location)[SLICE_OR_SUBSTR]("-10")[1]', @@ -1441,6 +1450,11 @@ function getFHPaddingEntries(index) define({ expr: '"ar-td"', solutionType: SolutionType.COMBINED_STRING }), define({ expr: '"ar"', solutionType: SolutionType.COMBINED_STRING }, SHORT_LOCALES), ], + LOCATION_CONSTRUCTOR: + [ + define('Function("return location")().constructor', OBJECT_L_LOCATION_CTOR), + define('Function("return location")().constructor', OLD_SAFARI_LOCATION_CTOR), + ], PLAIN_OBJECT: [ define('Function("return{}")()'), diff --git a/src/lib/features.js b/src/lib/features.js index c3a271d1..3949c22e 100644 --- a/src/lib/features.js +++ b/src/lib/features.js @@ -596,7 +596,7 @@ assignNoEnum function () { var available = - typeof document === 'object' && /^\[object .*Document]$/.test(document + ''); + typeof document === 'object' && /^\[object [\S\s]*Document]$/.test(document + ''); return available; }, attributes: { 'web-worker': 'web-worker-restriction' }, @@ -611,7 +611,7 @@ assignNoEnum ( function (str) { - var available = /^\[object .*Window]$/.test(str); + var available = /^\[object [\S\s]*Window]$/.test(str); return available; } ), @@ -627,7 +627,7 @@ assignNoEnum function () { var available = - Array.prototype.entries && /^\[object Array.{8,9}]$/.test([].entries()); + Array.prototype.entries && /^\[object Array[\S\s]{8,9}]$/.test([].entries()); return available; }, }, @@ -1063,7 +1063,7 @@ assignNoEnum { var available = typeof location === 'object' && - /^\[object .*Location]$/.test(Object.prototype.toString.call(location)); + /^\[object [\S\s]*Location]$/.test(Object.prototype.toString.call(location)); return available; }, }, @@ -1154,6 +1154,20 @@ assignNoEnum }, excludes: ['V8_SRC'], }, + OBJECT_L_LOCATION_CTOR: + { + description: + 'Existence of the global function location.constructor whose string representation ' + + 'starts with "[object L"', + check: + function () + { + var available = + typeof location === 'object' && /^\[object L/.test(location.constructor); + return available; + }, + attributes: { 'web-worker': 'web-worker-restriction' }, + }, OBJECT_UNDEFINED: { description: @@ -1168,6 +1182,20 @@ assignNoEnum }, includes: ['UNDEFINED'], }, + OLD_SAFARI_LOCATION_CTOR: + { + description: + 'Existence of the global object location.constructor whose string representation ' + + 'starts with "[object " and ends with "LocationConstructor]"', + check: + function () + { + var available = + typeof location === 'object' && + /^\[object [\S\s]*LocationConstructor]$/.test(location.constructor); + return available; + }, + }, PLAIN_INTL: { description: @@ -1648,6 +1676,7 @@ assignNoEnum 'HISTORY', 'IE_SRC', 'INCR_CHAR', + 'OBJECT_L_LOCATION_CTOR', 'STATUS', 'UNDEFINED', 'WINDOW', @@ -1669,6 +1698,7 @@ assignNoEnum 'HISTORY', 'IE_SRC', 'INCR_CHAR', + 'OBJECT_L_LOCATION_CTOR', 'OBJECT_UNDEFINED', 'STATUS', 'WINDOW', @@ -1693,6 +1723,7 @@ assignNoEnum 'IE_SRC', 'INCR_CHAR', 'LOCALE_NUMERALS', + 'OBJECT_L_LOCATION_CTOR', 'OBJECT_UNDEFINED', 'PLAIN_INTL', 'SHORT_LOCALES', @@ -1720,6 +1751,7 @@ assignNoEnum 'INCR_CHAR', 'LOCALE_INFINITY', 'LOCALE_NUMERALS_EXT', + 'OBJECT_L_LOCATION_CTOR', 'OBJECT_UNDEFINED', 'PLAIN_INTL', 'SHORT_LOCALES', @@ -1985,6 +2017,8 @@ assignNoEnum 'LOCATION', 'NAME', 'NODECONSTRUCTOR', + 'OBJECT_L_LOCATION_CTOR', + 'OLD_SAFARI_LOCATION_CTOR', 'STATUS', 'WINDOW', ], @@ -2019,6 +2053,8 @@ assignNoEnum 'LOCATION', 'NAME', 'NODECONSTRUCTOR', + 'OBJECT_L_LOCATION_CTOR', + 'OLD_SAFARI_LOCATION_CTOR', 'STATUS', 'WINDOW', ], @@ -2056,6 +2092,8 @@ assignNoEnum 'NAME', 'NODECONSTRUCTOR', 'NO_OLD_SAFARI_ARRAY_ITERATOR', + 'OBJECT_L_LOCATION_CTOR', + 'OLD_SAFARI_LOCATION_CTOR', 'STATUS', 'WINDOW', ], diff --git a/test/helpers/feature-emulation.helpers.js b/test/helpers/feature-emulation.helpers.js index 0da16037..68ea1cc6 100644 --- a/test/helpers/feature-emulation.helpers.js +++ b/test/helpers/feature-emulation.helpers.js @@ -400,6 +400,17 @@ return setUp; } + function mockLocation(context) + { + var location = global.location; + if (!location) + { + location = { constructor: { } }; + override(context, 'location', { value: location }); + } + return location; + } + function override(context, path, descriptor) { var backupList = context.BACKUP || (context.BACKUP = []); @@ -512,7 +523,7 @@ ARROW_REGEXP, function (match, capture1, capture2) { - var replacement1 = /^\(.*\)$/.test(capture1) ? capture1 : '(' + capture1 + ')'; + var replacement1 = /^\([\S\s]*\)$/.test(capture1) ? capture1 : '(' + capture1 + ')'; var innerExpr = replaceArrowFunctions(capture2); var replacement2 = /^\{[\s\S]*\}$/.test(capture2) ? innerExpr : '{return(' + innerExpr + ')}'; @@ -584,12 +595,12 @@ var EMU_FEATURE_INFOS = { - ANY_DOCUMENT: makeEmuFeatureDocument('[object Document]', /^\[object .*Document]$/), - ANY_WINDOW: makeEmuFeatureSelf('[object Window]', /^\[object .*Window]$/), + ANY_DOCUMENT: makeEmuFeatureDocument('[object Document]', /^\[object [\S\s]*Document]$/), + ANY_WINDOW: makeEmuFeatureSelf('[object Window]', /^\[object [\S\s]*Window]$/), ARRAY_ITERATOR: function () { - if (Array.prototype.entries && /^\[object Array.{8,9}]$/.test([].entries())) + if (Array.prototype.entries && /^\[object Array[\S\s]{8,9}]$/.test([].entries())) return; var constructor = function () @@ -1002,13 +1013,8 @@ LOCATION: function () { - var location = global.location; - if (!location) - { - location = { }; - override(this, 'location', { value: location }); - } - if (!/^\[object .*Location]$/.test(Object.prototype.toString.call(location))) + var location = mockLocation(this); + if (!/^\[object [\S\s]*Location]$/.test(Object.prototype.toString.call(location))) registerDefaultToStringAdapter(this, location, '[object Location]'); patchGlobalToString(this); }, @@ -1060,6 +1066,22 @@ NO_V8_SRC: makeEmuFeatureNativeFunctionSource (NATIVE_FUNCTION_SOURCE_INFO_FF, NATIVE_FUNCTION_SOURCE_INFO_IE), + OBJECT_L_LOCATION_CTOR: + function () + { + var location = mockLocation(this); + var str = location.constructor + ''; + if (!/^\[object L/.test(str)) + { + str = '[object L' + str; + var toString = + function () + { + return str; + }; + override(this, 'location.constructor.toString', { value: toString }); + } + }, OBJECT_UNDEFINED: function () { @@ -1067,6 +1089,27 @@ if (toString() !== '[object Undefined]') registerDefaultToStringAdapter(this, undefined, '[object Undefined]'); }, + OLD_SAFARI_LOCATION_CTOR: + function () + { + var location = mockLocation(this); + var oldStr = location.constructor + ''; + var newStr = oldStr; + if (!/^\[object /.test(oldStr)) + newStr = '[object ' + newStr; + if (!/LocationConstructor]$/.test(oldStr)) + newStr += 'LocationConstructor]'; + if (newStr !== oldStr) + { + var toString = + function () + { + return newStr; + }; + override(this, 'location.constructor.toString', { value: toString }); + override(this, 'location.constructor.valueOf', { value: toString }); + } + }, PLAIN_INTL: function () { diff --git a/test/lib/definitions.spec.js b/test/lib/definitions.spec.js index fd10bb08..f2a6776b 100644 --- a/test/lib/definitions.spec.js +++ b/test/lib/definitions.spec.js @@ -557,6 +557,11 @@ self, { this.toMatch(/^ar(-td)?$/); }, + LOCATION_CONSTRUCTOR: + function () + { + this.toBe(location.constructor); + }, PLAIN_OBJECT: function () { From d71212011aaab574d28f1ff91cc95e4e1f40eed8 Mon Sep 17 00:00:00 2001 From: Francesco Trotta Date: Sat, 7 Aug 2021 10:56:42 +0200 Subject: [PATCH 013/101] New feature OBJECT_W_CTOR, new definition of "W" --- Features.md | 2 + api-doc/README.md | 2 +- api-doc/interfaces/FeatureAll.md | 13 ++++ api-doc/interfaces/FeatureConstructor.md | 17 +++++ src/lib/definitions.js | 2 + src/lib/features.js | 28 +++++++-- test/helpers/feature-emulation.helpers.js | 76 ++++++++--------------- 7 files changed, 85 insertions(+), 55 deletions(-) diff --git a/Features.md b/Features.md index 2ec0b7d1..670e2dd2 100644 --- a/Features.md +++ b/Features.md @@ -122,6 +122,7 @@ This table lists features available in the most common engines.
  • NO_V8_SRC (implied by IE_SRC)
  • OBJECT_L_LOCATION_CTOR
  • OBJECT_UNDEFINED (Internet Explorer 10+) +
  • OBJECT_W_CTOR
  • PLAIN_INTL (Internet Explorer 11)
  • SELF_OBJ (implied by ANY_WINDOW and WINDOW)
  • SHORT_LOCALES (Internet Explorer 11) @@ -169,6 +170,7 @@ This table lists features available in the most common engines.
  • NO_V8_SRC (implied by FF_SRC)
  • OBJECT_L_LOCATION_CTOR (not in Safari 10+)
  • OBJECT_UNDEFINED (implied by GLOBAL_UNDEFINED) +
  • OBJECT_W_CTOR (not in Safari 10+)
  • OLD_SAFARI_LOCATION_CTOR (not in Safari 10+)
  • PLAIN_INTL (Safari 10+, not in Safari 14.0.1+)
  • REGEXP_STRING_ITERATOR (Safari 13+) diff --git a/api-doc/README.md b/api-doc/README.md index 075e0315..2638dfb7 100644 --- a/api-doc/README.md +++ b/api-doc/README.md @@ -47,7 +47,7 @@ ___ ### ElementaryFeatureName -Ƭ **ElementaryFeatureName**: ``"ANY_DOCUMENT"`` \| ``"ANY_WINDOW"`` \| ``"ARRAY_ITERATOR"`` \| ``"ARROW"`` \| ``"AT"`` \| ``"ATOB"`` \| ``"BARPROP"`` \| ``"CAPITAL_HTML"`` \| ``"CONSOLE"`` \| ``"DOCUMENT"`` \| ``"DOMWINDOW"`` \| ``"ESC_HTML_ALL"`` \| ``"ESC_HTML_QUOT"`` \| ``"ESC_HTML_QUOT_ONLY"`` \| ``"ESC_REGEXP_LF"`` \| ``"ESC_REGEXP_SLASH"`` \| ``"FF_SRC"`` \| ``"FILL"`` \| ``"FLAT"`` \| ``"FROM_CODE_POINT"`` \| ``"FUNCTION_19_LF"`` \| ``"FUNCTION_22_LF"`` \| ``"GENERIC_ARRAY_TO_STRING"`` \| ``"GLOBAL_UNDEFINED"`` \| ``"GMT"`` \| ``"HISTORY"`` \| ``"HTMLAUDIOELEMENT"`` \| ``"HTMLDOCUMENT"`` \| ``"IE_SRC"`` \| ``"INCR_CHAR"`` \| ``"INTL"`` \| ``"LOCALE_INFINITY"`` \| ``"LOCALE_NUMERALS"`` \| ``"LOCALE_NUMERALS_EXT"`` \| ``"LOCATION"`` \| ``"NAME"`` \| ``"NODECONSTRUCTOR"`` \| ``"NO_FF_SRC"`` \| ``"NO_IE_SRC"`` \| ``"NO_OLD_SAFARI_ARRAY_ITERATOR"`` \| ``"NO_V8_SRC"`` \| ``"OBJECT_L_LOCATION_CTOR"`` \| ``"OBJECT_UNDEFINED"`` \| ``"OLD_SAFARI_LOCATION_CTOR"`` \| ``"PLAIN_INTL"`` \| ``"REGEXP_STRING_ITERATOR"`` \| ``"SELF_OBJ"`` \| ``"SHORT_LOCALES"`` \| ``"STATUS"`` \| ``"UNDEFINED"`` \| ``"V8_SRC"`` \| ``"WINDOW"`` +Ƭ **ElementaryFeatureName**: ``"ANY_DOCUMENT"`` \| ``"ANY_WINDOW"`` \| ``"ARRAY_ITERATOR"`` \| ``"ARROW"`` \| ``"AT"`` \| ``"ATOB"`` \| ``"BARPROP"`` \| ``"CAPITAL_HTML"`` \| ``"CONSOLE"`` \| ``"DOCUMENT"`` \| ``"DOMWINDOW"`` \| ``"ESC_HTML_ALL"`` \| ``"ESC_HTML_QUOT"`` \| ``"ESC_HTML_QUOT_ONLY"`` \| ``"ESC_REGEXP_LF"`` \| ``"ESC_REGEXP_SLASH"`` \| ``"FF_SRC"`` \| ``"FILL"`` \| ``"FLAT"`` \| ``"FROM_CODE_POINT"`` \| ``"FUNCTION_19_LF"`` \| ``"FUNCTION_22_LF"`` \| ``"GENERIC_ARRAY_TO_STRING"`` \| ``"GLOBAL_UNDEFINED"`` \| ``"GMT"`` \| ``"HISTORY"`` \| ``"HTMLAUDIOELEMENT"`` \| ``"HTMLDOCUMENT"`` \| ``"IE_SRC"`` \| ``"INCR_CHAR"`` \| ``"INTL"`` \| ``"LOCALE_INFINITY"`` \| ``"LOCALE_NUMERALS"`` \| ``"LOCALE_NUMERALS_EXT"`` \| ``"LOCATION"`` \| ``"NAME"`` \| ``"NODECONSTRUCTOR"`` \| ``"NO_FF_SRC"`` \| ``"NO_IE_SRC"`` \| ``"NO_OLD_SAFARI_ARRAY_ITERATOR"`` \| ``"NO_V8_SRC"`` \| ``"OBJECT_L_LOCATION_CTOR"`` \| ``"OBJECT_UNDEFINED"`` \| ``"OBJECT_W_CTOR"`` \| ``"OLD_SAFARI_LOCATION_CTOR"`` \| ``"PLAIN_INTL"`` \| ``"REGEXP_STRING_ITERATOR"`` \| ``"SELF_OBJ"`` \| ``"SHORT_LOCALES"`` \| ``"STATUS"`` \| ``"UNDEFINED"`` \| ``"V8_SRC"`` \| ``"WINDOW"`` Name of an elementary feature. diff --git a/api-doc/interfaces/FeatureAll.md b/api-doc/interfaces/FeatureAll.md index 7885e113..7a0c9b5a 100644 --- a/api-doc/interfaces/FeatureAll.md +++ b/api-doc/interfaces/FeatureAll.md @@ -84,6 +84,7 @@ - [NO\_V8\_SRC](FeatureAll.md#no_v8_src) - [OBJECT\_L\_LOCATION\_CTOR](FeatureAll.md#object_l_location_ctor) - [OBJECT\_UNDEFINED](FeatureAll.md#object_undefined) +- [OBJECT\_W\_CTOR](FeatureAll.md#object_w_ctor) - [OLD\_SAFARI\_LOCATION\_CTOR](FeatureAll.md#old_safari_location_ctor) - [PLAIN\_INTL](FeatureAll.md#plain_intl) - [REGEXP\_STRING\_ITERATOR](FeatureAll.md#regexp_string_iterator) @@ -939,6 +940,18 @@ Available in Chrome, Edge, Firefox, Internet Explorer 10+, Safari, Opera, Androi ___ +### OBJECT\_W\_CTOR + +• **OBJECT\_W\_CTOR**: [`ElementaryFeature`](ElementaryFeature.md) + +The property that the string representation of the global object constructor starts with "\[object W" + +**`remarks`** + +Available in Internet Explorer and Safari before 10. This feature is not available inside web workers in Safari before 10. + +___ + ### OLD\_SAFARI\_LOCATION\_CTOR • **OLD\_SAFARI\_LOCATION\_CTOR**: [`ElementaryFeature`](ElementaryFeature.md) diff --git a/api-doc/interfaces/FeatureConstructor.md b/api-doc/interfaces/FeatureConstructor.md index 05a1c362..4163a957 100644 --- a/api-doc/interfaces/FeatureConstructor.md +++ b/api-doc/interfaces/FeatureConstructor.md @@ -134,6 +134,7 @@ An error is thrown if any of the specified features are not mutually compatible. - [NO\_V8\_SRC](FeatureConstructor.md#no_v8_src) - [OBJECT\_L\_LOCATION\_CTOR](FeatureConstructor.md#object_l_location_ctor) - [OBJECT\_UNDEFINED](FeatureConstructor.md#object_undefined) +- [OBJECT\_W\_CTOR](FeatureConstructor.md#object_w_ctor) - [OLD\_SAFARI\_LOCATION\_CTOR](FeatureConstructor.md#old_safari_location_ctor) - [PLAIN\_INTL](FeatureConstructor.md#plain_intl) - [REGEXP\_STRING\_ITERATOR](FeatureConstructor.md#regexp_string_iterator) @@ -1366,6 +1367,22 @@ Available in Chrome, Edge, Firefox, Internet Explorer 10+, Safari, Opera, Androi ___ +### OBJECT\_W\_CTOR + +• **OBJECT\_W\_CTOR**: [`ElementaryFeature`](ElementaryFeature.md) + +The property that the string representation of the global object constructor starts with "\[object W" + +**`remarks`** + +Available in Internet Explorer and Safari before 10. This feature is not available inside web workers in Safari before 10. + +#### Inherited from + +[FeatureAll](FeatureAll.md).[OBJECT_W_CTOR](FeatureAll.md#object_w_ctor) + +___ + ### OLD\_SAFARI\_LOCATION\_CTOR • **OLD\_SAFARI\_LOCATION\_CTOR**: [`ElementaryFeature`](ElementaryFeature.md) diff --git a/src/lib/definitions.js b/src/lib/definitions.js index 1791d21c..5b2e1326 100644 --- a/src/lib/definitions.js +++ b/src/lib/definitions.js @@ -390,6 +390,7 @@ function getFHPaddingEntries(index) var NO_V8_SRC = Feature.NO_V8_SRC; var OBJECT_L_LOCATION_CTOR = Feature.OBJECT_L_LOCATION_CTOR; var OBJECT_UNDEFINED = Feature.OBJECT_UNDEFINED; + var OBJECT_W_CTOR = Feature.OBJECT_W_CTOR; var OLD_SAFARI_LOCATION_CTOR = Feature.OLD_SAFARI_LOCATION_CTOR; var PLAIN_INTL = Feature.PLAIN_INTL; var REGEXP_STRING_ITERATOR = Feature.REGEXP_STRING_ITERATOR; @@ -985,6 +986,7 @@ function getFHPaddingEntries(index) define('(self + RP_4_A)[SLICE_OR_SUBSTR]("-11")[0]', ANY_WINDOW), define('btoa(undefined)[1]', ATOB), define('(RP_0_S + self)[11]', DOMWINDOW), + define('(RP_3_WA + Function("return constructor")())[11]', OBJECT_W_CTOR), define('(RP_3_WA + self)[11]', WINDOW), define('(self + RP_4_A).at("-11")', ANY_WINDOW, AT), defineCharDefault({ atob: false }), diff --git a/src/lib/features.js b/src/lib/features.js index 3949c22e..4d9b7e53 100644 --- a/src/lib/features.js +++ b/src/lib/features.js @@ -665,7 +665,7 @@ assignNoEnum var available = typeof atob === 'function' && typeof btoa === 'function'; return available; }, - attributes: { 'web-worker': 'no-atob-in-web-worker' }, + attributes: { 'web-worker': 'old-safari-restriction' }, }, BARPROP: { @@ -1182,6 +1182,19 @@ assignNoEnum }, includes: ['UNDEFINED'], }, + OBJECT_W_CTOR: + { + description: + 'The property that the string representation of the global object constructor starts ' + + 'with "[object W"', + check: + function () + { + var available = /^\[object W/.test(constructor); + return available; + }, + attributes: { 'web-worker': 'old-safari-restriction' }, + }, OLD_SAFARI_LOCATION_CTOR: { description: @@ -1677,6 +1690,7 @@ assignNoEnum 'IE_SRC', 'INCR_CHAR', 'OBJECT_L_LOCATION_CTOR', + 'OBJECT_W_CTOR', 'STATUS', 'UNDEFINED', 'WINDOW', @@ -1700,6 +1714,7 @@ assignNoEnum 'INCR_CHAR', 'OBJECT_L_LOCATION_CTOR', 'OBJECT_UNDEFINED', + 'OBJECT_W_CTOR', 'STATUS', 'WINDOW', ], @@ -1725,6 +1740,7 @@ assignNoEnum 'LOCALE_NUMERALS', 'OBJECT_L_LOCATION_CTOR', 'OBJECT_UNDEFINED', + 'OBJECT_W_CTOR', 'PLAIN_INTL', 'SHORT_LOCALES', 'STATUS', @@ -1753,6 +1769,7 @@ assignNoEnum 'LOCALE_NUMERALS_EXT', 'OBJECT_L_LOCATION_CTOR', 'OBJECT_UNDEFINED', + 'OBJECT_W_CTOR', 'PLAIN_INTL', 'SHORT_LOCALES', 'STATUS', @@ -2018,6 +2035,7 @@ assignNoEnum 'NAME', 'NODECONSTRUCTOR', 'OBJECT_L_LOCATION_CTOR', + 'OBJECT_W_CTOR', 'OLD_SAFARI_LOCATION_CTOR', 'STATUS', 'WINDOW', @@ -2025,8 +2043,8 @@ assignNoEnum attributes: { 'char-increment-restriction': null, - 'no-atob-in-web-worker': null, 'no-console-in-web-worker': null, + 'old-safari-restriction': null, 'web-worker-restriction': null, }, }, @@ -2054,6 +2072,7 @@ assignNoEnum 'NAME', 'NODECONSTRUCTOR', 'OBJECT_L_LOCATION_CTOR', + 'OBJECT_W_CTOR', 'OLD_SAFARI_LOCATION_CTOR', 'STATUS', 'WINDOW', @@ -2061,7 +2080,7 @@ assignNoEnum attributes: { 'char-increment-restriction': null, - 'no-atob-in-web-worker': null, + 'old-safari-restriction': null, 'safari-bug-21820506': null, 'web-worker-restriction': null, }, @@ -2093,6 +2112,7 @@ assignNoEnum 'NODECONSTRUCTOR', 'NO_OLD_SAFARI_ARRAY_ITERATOR', 'OBJECT_L_LOCATION_CTOR', + 'OBJECT_W_CTOR', 'OLD_SAFARI_LOCATION_CTOR', 'STATUS', 'WINDOW', @@ -2100,7 +2120,7 @@ assignNoEnum attributes: { 'char-increment-restriction': null, - 'no-atob-in-web-worker': null, + 'old-safari-restriction': null, 'safari-bug-21820506': null, 'web-worker-restriction': null, }, diff --git a/test/helpers/feature-emulation.helpers.js b/test/helpers/feature-emulation.helpers.js index 68ea1cc6..84b87c09 100644 --- a/test/helpers/feature-emulation.helpers.js +++ b/test/helpers/feature-emulation.helpers.js @@ -31,6 +31,16 @@ return descriptor; } + function createStaticSupplier(value) + { + function supplier() + { + return value; + } + + return supplier; + } + function createToStringDescriptor(adapterList) { function get() @@ -214,11 +224,7 @@ document = { createElement: createElement, nodeName: '#document' }; override(this, 'document', { value: document }); } - var valueOf = - function () - { - return str; - }; + var valueOf = createStaticSupplier(str); override(this, 'document.valueOf', { value: valueOf }); }; return setUp; @@ -390,11 +396,7 @@ } else override(this, 'self', { value: { } }); - var valueOf = - function () - { - return str; - }; + var valueOf = createStaticSupplier(str); override(this, 'self.valueOf', { value: valueOf }); }; return setUp; @@ -506,11 +508,7 @@ function registerObjectFactory(context, path, str, constructor) { var obj = Object.create(constructor.prototype); - var factory = - function () - { - return obj; - }; + var factory = createStaticSupplier(obj); override(context, path, { value: factory }); registerDefaultToStringAdapter(context, obj, str); } @@ -780,11 +778,7 @@ if (!console || !Object.getPrototypeOf(console)) override(this, 'console', { value: Object.create(console || null) }); // ...end of the workaround. - var toString = - function () - { - return '[object Console]'; - }; + var toString = createStaticSupplier('[object Console]'); override(this, 'console.toString', { value: toString }); }, DOCUMENT: makeEmuFeatureDocument('[object Document]', /^\[object Document]$/), @@ -873,21 +867,13 @@ GMT: function () { - var Date = - function () - { - return 'Xxx Xxx 00 0000 00:00:00 GMT+0000 (XXX)'; - }; + var Date = createStaticSupplier('Xxx Xxx 00 0000 00:00:00 GMT+0000 (XXX)'); override(this, 'Date', { value: Date }); }, HISTORY: function () { - var toString = - function () - { - return '[object History]'; - }; + var toString = createStaticSupplier('[object History]'); override(this, 'history', { value: { toString: toString } }); }, HTMLAUDIOELEMENT: @@ -895,11 +881,7 @@ { if (!global.Audio) override(this, 'Audio', { value: { } }); - var toString = - function () - { - return 'function HTMLAudioElement'; - }; + var toString = createStaticSupplier('function HTMLAudioElement'); override(this, 'Audio.toString', { value: toString }); }, HTMLDOCUMENT: makeEmuFeatureDocument('[object HTMLDocument]', /^\[object HTMLDocument]$/), @@ -1034,11 +1016,7 @@ { if (!global.Node) override(this, 'Node', { value: { } }); - var toString = - function () - { - return '[object NodeConstructor]'; - }; + var toString = createStaticSupplier('[object NodeConstructor]'); override(this, 'Node.toString', { value: toString }); }, NO_FF_SRC: @@ -1074,11 +1052,7 @@ if (!/^\[object L/.test(str)) { str = '[object L' + str; - var toString = - function () - { - return str; - }; + var toString = createStaticSupplier(str); override(this, 'location.constructor.toString', { value: toString }); } }, @@ -1089,6 +1063,12 @@ if (toString() !== '[object Undefined]') registerDefaultToStringAdapter(this, undefined, '[object Undefined]'); }, + OBJECT_W_CTOR: + function () + { + var toString = createStaticSupplier('[object W'); + override(this, 'constructor.toString', { value: toString }); + }, OLD_SAFARI_LOCATION_CTOR: function () { @@ -1101,11 +1081,7 @@ newStr += 'LocationConstructor]'; if (newStr !== oldStr) { - var toString = - function () - { - return newStr; - }; + var toString = createStaticSupplier(newStr); override(this, 'location.constructor.toString', { value: toString }); override(this, 'location.constructor.valueOf', { value: toString }); } From 55ddc91b4999a466ee545d31f5bed4be11a07d8b Mon Sep 17 00:00:00 2001 From: Francesco Trotta Date: Sun, 8 Aug 2021 09:13:01 +0200 Subject: [PATCH 014/101] Using top level await in dev modules --- dev/char-index.mjs | 27 +++----- dev/deploy.mjs | 72 +++++++++----------- dev/internal/char-index-worker.mjs | 2 - dev/internal/prepare-package-legacy-test.mjs | 16 +---- dev/patch-rollup.mjs | 42 ++++++------ gulpfile.js | 8 ++- 6 files changed, 71 insertions(+), 96 deletions(-) diff --git a/dev/char-index.mjs b/dev/char-index.mjs index c05ed685..33b82d42 100755 --- a/dev/char-index.mjs +++ b/dev/char-index.mjs @@ -525,23 +525,16 @@ else const [,, command] = argv; const commandCall = COMMANDS[command]; - (async () => + try { - try - { - if (!commandCall) - { - fail - ('char-index: \'%s\' is not a valid command. See \'char-index help\'.', command); - } - await commandCall(); - } - catch (error) - { - if (error !== ARG_ERROR) - throw error; - process.exitCode = 1; - } + if (!commandCall) + fail('char-index: \'%s\' is not a valid command. See \'char-index help\'.', command); + await commandCall(); + } + catch (error) + { + if (error !== ARG_ERROR) + throw error; + process.exitCode = 1; } - )(); } diff --git a/dev/deploy.mjs b/dev/deploy.mjs index b152b8d8..ec526cd6 100755 --- a/dev/deploy.mjs +++ b/dev/deploy.mjs @@ -17,46 +17,9 @@ const REMOTE_HOME = '/html'; const __dirname = dirname(dirname(path)); process.chdir(__dirname); } -(async () => -{ - if (!await verifyBuild()) - { - process.exitCode = 1; - return; - } - const ftpAccessOptions = readFTPAccessOptions(); - if (ftpAccessOptions == null) - { - process.exitCode = 1; - return; - } - const client = new Client(); - try - { - await client.access(ftpAccessOptions); - - await client.ensureDir(REMOTE_HOME); - const readable = await createIndex(); - await client.uploadFrom(readable, 'index.html'); - await client.ensureDir('lib'); - await client.clearWorkingDir(); - await client.uploadFrom(JSCREWIT_MIN_PATH, 'jscrewit.min.js'); - - await client.ensureDir('../ui'); - await client.clearWorkingDir(); - await client.uploadFromDir('ui'); - } - catch (error) - { - console.error(error); - } - finally - { - client.close(); - } -} -)(); +if (!await deploy()) + process.exitCode = 1; async function createIndex() { @@ -120,6 +83,37 @@ ${end} return readable; } +async function deploy() +{ + if (!await verifyBuild()) + return false; + const ftpAccessOptions = readFTPAccessOptions(); + if (ftpAccessOptions == null) + return false; + const client = new Client(); + try + { + await client.access(ftpAccessOptions); + + await client.ensureDir(REMOTE_HOME); + const readable = await createIndex(); + await client.uploadFrom(readable, 'index.html'); + + await client.ensureDir('lib'); + await client.clearWorkingDir(); + await client.uploadFrom(JSCREWIT_MIN_PATH, 'jscrewit.min.js'); + + await client.ensureDir('../ui'); + await client.clearWorkingDir(); + await client.uploadFromDir('ui'); + } + finally + { + client.close(); + } + return true; +} + function readFTPAccessOptions() { let content; diff --git a/dev/internal/char-index-worker.mjs b/dev/internal/char-index-worker.mjs index b4bf05e1..740067a5 100644 --- a/dev/internal/char-index-worker.mjs +++ b/dev/internal/char-index-worker.mjs @@ -5,7 +5,6 @@ const { char, solutionBookMap: serializedSolutionBookMap } = workerData; serializedSolutionBookMap.delete(char); for (const [char, solutionBook] of serializedSolutionBookMap) solutionBookMap.importBook(char, solutionBook); -(async () => { const solutionBook = await @@ -17,4 +16,3 @@ for (const [char, solutionBook] of serializedSolutionBookMap) ); parentPort.postMessage({ solutionBook }); } -)(); diff --git a/dev/internal/prepare-package-legacy-test.mjs b/dev/internal/prepare-package-legacy-test.mjs index 014b81fa..6c1fc188 100755 --- a/dev/internal/prepare-package-legacy-test.mjs +++ b/dev/internal/prepare-package-legacy-test.mjs @@ -34,17 +34,5 @@ async function tsc() await endOf(childProcess); } -(async () => -{ - try - { - await rm(NODE_LEGACY_DIR, { force: true, recursive: true }); - await Promise.all([tsc(), npmInstall()]); - } - catch (error) - { - console.error(error); - process.exitCode = 1; - } -} -)(); +await rm(NODE_LEGACY_DIR, { force: true, recursive: true }); +await Promise.all([tsc(), npmInstall()]); diff --git a/dev/patch-rollup.mjs b/dev/patch-rollup.mjs index c5613502..1230af4c 100755 --- a/dev/patch-rollup.mjs +++ b/dev/patch-rollup.mjs @@ -13,28 +13,24 @@ const SEARCH_LINE = const REPLACEMENT_LINE = ' start + code.original.slice(start, nextNode.start).search(/\\n\\s*$/) + 1;\n'; -(async () => +const require = createRequire(import.meta.url); +const { emitWarning } = process; +process.emitWarning = +function (warning, type, code, ctor) { - try - { - const require = createRequire(import.meta.url); - const rollupPath = require.resolve('rollup/dist/shared/rollup.js'); - const input = await readFile(rollupPath, 'utf8'); - const index = input.indexOf(SEARCH_LINE); - if (index === 0 || index > 0 && input[index - 1] === '\n') - { - const output = - input.slice(0, index) + REPLACEMENT_LINE + input.slice(index + SEARCH_LINE.length); - await writeFile(rollupPath, output); - console.log('Patching rollup.'); - } - else - console.log('Nothing to patch in rollup.'); - } - catch (error) - { - console.error(error); - process.exitCode = 1; - } + if (code !== 'DEP0148') + emitWarning(warning, type, code, ctor); +}; +const rollupPath = require.resolve('rollup/dist/shared/rollup.js'); +process.emitWarning = emitWarning; +const input = await readFile(rollupPath, 'utf8'); +const index = input.indexOf(SEARCH_LINE); +if (index === 0 || index > 0 && input[index - 1] === '\n') +{ + const output = + input.slice(0, index) + REPLACEMENT_LINE + input.slice(index + SEARCH_LINE.length); + await writeFile(rollupPath, output); + console.log('Patching rollup.'); } -)(); +else + console.log('Nothing to patch in rollup.'); diff --git a/gulpfile.js b/gulpfile.js index 5b85786c..3e3105fa 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -138,7 +138,13 @@ task { src: ['dev/**/*.mjs'], envs: 'node', - parserOptions: { ecmaVersion: 2021, sourceType: 'module' }, + parser: '@babel/eslint-parser', + parserOptions: + { + babelOptions: { plugins: ['@babel/plugin-syntax-top-level-await'] }, + ecmaVersion: 2021, + requireConfigFile: false, + }, }, { src: From 91f668891f80bf61c5d5b75df8fe26375c13e9c6 Mon Sep 17 00:00:00 2001 From: Francesco Trotta Date: Sun, 8 Aug 2021 15:44:40 +0200 Subject: [PATCH 015/101] Showing latest value of gravitational constant --- JScrewIt.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/JScrewIt.html b/JScrewIt.html index d027d3f2..11fdf3d5 100644 --- a/JScrewIt.html +++ b/JScrewIt.html @@ -74,7 +74,7 @@

    JScrewIt

    Use the form below to encode your script. To encode a number or plain string, type it in - as you would in JavaScript, e.g. 6.67408e-11 or "Hello, World!". + as you would in JavaScript, e.g. 6.6743e-11 or "Hello, World!".