diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index da49db8..7f39fb4 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -10,9 +10,12 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 + - name: Setup Node.js + uses: actions/setup-node@v1 + with: + node-version: 15 - run: npm ci - - run: npm run asbuild:untouched + - run: npm run asbuild # Run benchmark with `go test -bench` and stores the output to a file - name: Run benchmark run: npm run benchmark | tee benchmark/output.txt diff --git a/asconfig.json b/asconfig.json index 384cc2b..af1b1b3 100644 --- a/asconfig.json +++ b/asconfig.json @@ -9,11 +9,11 @@ "release": { "binaryFile": "build/optimized.wasm", "textFile": "build/optimized.wat", - "sourceMap": true, + "sourceMap": false, "optimizeLevel": 3, - "shrinkLevel": 1, - "converge": false, - "noAssert": false + "shrinkLevel": 0, + "converge": true, + "noAssert": true }, "test": { "debug": true diff --git a/assembly/__spec_tests__/generated.spec.ts b/assembly/__spec_tests__/generated.spec.ts index 95c6422..0989a34 100644 --- a/assembly/__spec_tests__/generated.spec.ts +++ b/assembly/__spec_tests__/generated.spec.ts @@ -776,7 +776,11 @@ it("line: 152 - matches ([\\da-f:]+)$ against 'abc'", () => { expect(match.matches[0]).toBe("abc".substring(0, 3)); expect(match.matches[1]).toBe("abc".substring(0, 3)); }); -xit("line: 153 - aspect [Actual]: null vs [Expected]: Not null issue", () => {}); +it("line: 153 - matches ([\\da-f:]+)$ against 'fed'", () => { + const match = exec("([\\da-f:]+)$", "fed", "is"); + expect(match.matches[0]).toBe("fed".substring(0, 3)); + expect(match.matches[1]).toBe("fed".substring(0, 3)); +}); it("line: 154 - matches ([\\da-f:]+)$ against 'E'", () => { const match = exec("([\\da-f:]+)$", "E", "is"); expect(match.matches[0]).toBe("E".substring(0, 1)); @@ -1044,8 +1048,8 @@ xit("line: 199 - non capturing groups not supported", () => {}); xit("line: 200 - non capturing groups not supported", () => {}); xit("line: 201 - non capturing groups not supported", () => {}); xit("line: 202 - non capturing groups not supported", () => {}); -xit("line: 203 - aspect [Actual]: null vs [Expected]: Not null issue", () => {}); -xit("line: 204 - aspect [Actual]: null vs [Expected]: Not null issue", () => {}); +xit("line: 203 - test appears to be incorrect?", () => {}); +xit("line: 204 - test appears to be incorrect?", () => {}); it("line: 205 - matches ^ a\\ b[c ]d $ against 'abcd'", () => { expectNotMatch("^ a\\ b[c ]d $", ["abcd"]); }); @@ -1352,7 +1356,7 @@ it("line: 1083 - matches ^[ab]{1,3}(ab*?|b) against 'The quick brown fox'", () = xit("line: 1084 - back references are not supported", () => {}); xit("line: 1085 - back references are not supported", () => {}); xit("line: 1086 - test encoding issue", () => {}); -xit("line: 1087 - requires triage", () => {}); +xit("line: 1087 - test requires a substring function", () => {}); xit("line: 1088 - requires triage", () => {}); it("line: 1089 - matches abc\\x0def\\x00pqr\\x000xyz\\x0000AB against 'abc456 abc\x0def\x00pqr\x000xyz\x0000ABCDE'", () => { const match = exec( @@ -1506,8 +1510,13 @@ it("line: 1144 - matches ^[W-c]+$ against 'WXY_^abc'", () => { const match = exec("^[W-c]+$", "WXY_^abc", "s"); expect(match.matches[0]).toBe("WXY_^abc".substring(0, 8)); }); -xit("line: 1145 - as-pect test issue", () => {}); -xit("line: 1146 - as-pect test issue", () => {}); +it("line: 1145 - matches ^[W-c]+$ against 'wxy'", () => { + expectNotMatch("^[W-c]+$", ["wxy"]); +}); +it("line: 1146 - matches ^[W-c]+$ against 'WXY_^abc'", () => { + const match = exec("^[W-c]+$", "WXY_^abc", "is"); + expect(match.matches[0]).toBe("WXY_^abc".substring(0, 8)); +}); xit("line: 1147 - requires triage", () => {}); xit("line: 1148 - requires triage", () => {}); xit("line: 1149 - requires triage", () => {}); diff --git a/assembly/__tests__/character-sets.spec.ts b/assembly/__tests__/character-sets.spec.ts index 47f5955..aeb7cf1 100644 --- a/assembly/__tests__/character-sets.spec.ts +++ b/assembly/__tests__/character-sets.spec.ts @@ -43,3 +43,12 @@ it("treats - as a literal in negated sets", () => { expectNotMatch("[^-abc]", ["-", "a", "b", "c"]); expectMatch("[^-abc]", ["1", "A"]); }); + +it("supports case insensitive matching", () => { + // simple ranges + expectMatch("[a-c]", ["A", "C", "a", "c"], "i"); + expectNotMatch("[a-c]", ["D", "d"], "i"); + // complex + expectMatch("[W-c]", ["W", "w", "C", "c"], "i"); + expectNotMatch("[W-c]", ["V", "v", "D", "d"], "i"); +}); diff --git a/assembly/__tests__/utils.ts b/assembly/__tests__/utils.ts index 224daee..d264a23 100644 --- a/assembly/__tests__/utils.ts +++ b/assembly/__tests__/utils.ts @@ -1,7 +1,11 @@ import { RegExp, Match } from ".."; -export function expectMatch(regex: string, arr: string[]): void { - let regexp = new RegExp(regex); +export function expectMatch( + regex: string, + arr: string[], + flags: string = "" +): void { + let regexp = new RegExp(regex, flags); for (let i = 0; i < arr.length; i++) { const value = arr[i]; const match = exec(regexp, value); @@ -9,8 +13,12 @@ export function expectMatch(regex: string, arr: string[]): void { } } -export function expectNotMatch(regex: string, arr: string[]): void { - let regexp = new RegExp(regex); +export function expectNotMatch( + regex: string, + arr: string[], + flags: string = "" +): void { + let regexp = new RegExp(regex, flags); for (let i = 0; i < arr.length; i++) { const match = regexp.exec(arr[i]); expect(match).toBeNull( diff --git a/assembly/nfa/matcher.ts b/assembly/nfa/matcher.ts index a392601..b739bc4 100644 --- a/assembly/nfa/matcher.ts +++ b/assembly/nfa/matcher.ts @@ -8,6 +8,7 @@ import { NodeType, } from "../parser/node"; import { Flags } from "../regexp"; +import { Range } from "../util"; const enum MatcherType { Character, @@ -36,7 +37,10 @@ export class Matcher { node: CharacterRangeNode, flags: Flags ): CharacterRangeMatcher { - return new CharacterRangeMatcher(node.from, node.to, flags.ignoreCase); + return new CharacterRangeMatcher( + new Range(node.from, node.to), + flags.ignoreCase + ); } static fromCharacterSetNode( @@ -89,20 +93,36 @@ export class CharacterMatcher extends Matcher { } } +const LOWERCASE_LETTERS = new Range(Char.a, Char.z); +const UPPERCASE_LETTERS = new Range(Char.A, Char.Z); +const UPPER_LOWER_OFFSET = Char.a - Char.A; + export class CharacterRangeMatcher extends Matcher { - constructor(private from: u32, private to: u32, private ignoreCase: bool) { + private ranges: Range[]; + + constructor(private range: Range, ignoreCase: bool) { super(MatcherType.CharacterRange); + this.ranges = [range]; + if (ignoreCase) { - this.from |= 0x20; - this.to |= 0x20; + const lowerIntersect = range.intersection(LOWERCASE_LETTERS); + if (lowerIntersect) { + this.ranges.push(lowerIntersect.offset(-UPPER_LOWER_OFFSET)); + } + const upperIntersect = range.intersection(UPPERCASE_LETTERS); + if (upperIntersect) { + this.ranges.push(upperIntersect.offset(UPPER_LOWER_OFFSET)); + } } } matches(code: u32): bool { - if (this.ignoreCase) { - code |= 0x20; + for (let i = 0, len = this.ranges.length; i < len; i++) { + if (code >= u32(this.ranges[i].from) && code <= u32(this.ranges[i].to)) { + return true; + } } - return code >= this.from && code <= this.to; + return false; } } diff --git a/assembly/util.ts b/assembly/util.ts index 8796260..9215e04 100644 --- a/assembly/util.ts +++ b/assembly/util.ts @@ -11,3 +11,17 @@ export function replaceAtIndex(arr: T[], index: u32, item: T): T[] { unchecked((res[index] = item)); return res; } + +export class Range { + constructor(public from: i32, public to: i32) {} + + intersection(other: Range): Range | null { + const lower = i32(Math.max(this.from, other.from)); + const upper = i32(Math.min(this.to, other.to)); + return lower < upper ? new Range(lower, upper) : null; + } + + offset(value: i32): Range { + return new Range(this.from + value, this.to + value); + } +} diff --git a/benchmark/benchmark.js b/benchmark/benchmark.js index 73c58fb..3808d28 100644 --- a/benchmark/benchmark.js +++ b/benchmark/benchmark.js @@ -5,17 +5,14 @@ const loader = require("@assemblyscript/loader"); const Benchmark = require("benchmark"); const suite = new Benchmark.Suite(); -wasmModule = loader.instantiateSync( - fs.readFileSync("./build/debug/assemblyscript-regex.wasm"), - { - env: { - log: () => { - const { __getString } = wasmModule.exports; - console.log(__getString(strPtr)); - }, +wasmModule = loader.instantiateSync(fs.readFileSync("./build/optimized.wasm"), { + env: { + log: () => { + const { __getString } = wasmModule.exports; + console.log(__getString(strPtr)); }, - } -); + }, +}); // the executeRegExp exported function is ex function executeRegex(regexStr, valueStr, untilNull = false) { diff --git a/package-lock.json b/package-lock.json index b577051..912869d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,6 @@ "@types/node": "^14.14.13", "@typescript-eslint/eslint-plugin": "^4.14.1", "@typescript-eslint/parser": "^4.14.1", - "asbuild": "0.0.10", "assemblyscript": "^0.18.0", "benchmark": "^2.1.4", "eslint": "^7.18.0", @@ -30,17 +29,13 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/@as-pect/assembly/-/assembly-6.0.0.tgz", "integrity": "sha512-B1bBMg2onl+RomWLlsWfrHdB8d4Xu7GOJn5eMwI4gjXvDKfbNXeSrL1gdkL7oZAHCf04XJ0XRWdUXfPdqTZdGA==", - "dev": true, - "peerDependencies": { - "assemblyscript": "^0.18.7" - } + "dev": true }, "node_modules/@as-pect/cli": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@as-pect/cli/-/cli-6.0.0.tgz", "integrity": "sha512-YlRP56oflSwal03VXG/e08Ov8RsTvSYRajXh8Bb3HTLJaaoQhoodgHkQJPTZQy1rhIvJvYRN1uqZkZdppB8M/A==", "dev": true, - "license": "MIT", "dependencies": { "@as-pect/assembly": "^6.0.0", "@as-pect/core": "^6.0.0", @@ -56,9 +51,6 @@ "optionalDependencies": { "@as-pect/csv-reporter": "^6.0.0", "@as-pect/json-reporter": "^6.0.0" - }, - "peerDependencies": { - "assemblyscript": "^0.18.7" } }, "node_modules/@as-pect/core": { @@ -71,9 +63,6 @@ "@as-pect/snapshots": "^6.0.0", "chalk": "^4.1.0", "long": "^4.0.0" - }, - "peerDependencies": { - "assemblyscript": "^0.18.7" } }, "node_modules/@as-pect/csv-reporter": { @@ -335,19 +324,13 @@ "dev": true, "dependencies": { "@octokit/types": "^6.8.0" - }, - "peerDependencies": { - "@octokit/core": ">=2" } }, "node_modules/@octokit/plugin-request-log": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.3.tgz", "integrity": "sha512-4RFU4li238jMJAzLgAwkBAw+4Loile5haQMQr+uhFq27BmyJXcXSKvoQKqh0agsZEiUlW6iSv3FAgvmGkur7OQ==", - "dev": true, - "peerDependencies": { - "@octokit/core": ">=3" - } + "dev": true }, "node_modules/@octokit/plugin-rest-endpoint-methods": { "version": "4.10.1", @@ -357,9 +340,6 @@ "dependencies": { "@octokit/types": "^6.8.2", "deprecation": "^2.3.1" - }, - "peerDependencies": { - "@octokit/core": ">=3" } }, "node_modules/@octokit/request": { @@ -427,9 +407,6 @@ }, "engines": { "node": ">=10.18" - }, - "peerDependencies": { - "semantic-release": ">=16.0.0 <18.0.0" } }, "node_modules/@semantic-release/error": { @@ -463,9 +440,6 @@ }, "engines": { "node": ">=10.18" - }, - "peerDependencies": { - "semantic-release": ">=16.0.0 <18.0.0" } }, "node_modules/@semantic-release/npm": { @@ -490,9 +464,6 @@ }, "engines": { "node": ">=10.19" - }, - "peerDependencies": { - "semantic-release": ">=16.0.0 <18.0.0" } }, "node_modules/@semantic-release/release-notes-generator": { @@ -514,9 +485,6 @@ }, "engines": { "node": ">=10.18" - }, - "peerDependencies": { - "semantic-release": ">=15.8.0 <18.0.0" } }, "node_modules/@semantic-release/release-notes-generator/node_modules/get-stream": { @@ -529,9 +497,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@tootallnate/once": { @@ -758,9 +723,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ansi-regex": { @@ -835,20 +797,6 @@ "node": ">=0.10.0" } }, - "node_modules/asbuild": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/asbuild/-/asbuild-0.0.10.tgz", - "integrity": "sha512-pSBYULxYuOjFVfcyeMgnJLsFbFbwqONxn9yYwMj7F44HcdVvsJzDx7wdg49uG8KmIuiQc7vjoMg3bg6oC/Al7g==", - "dev": true, - "dependencies": { - "yargs": "^15.4.1" - }, - "bin": { - "asb": "bin/asb", - "asbuild": "bin/asb", - "assemblyscript-build": "bin/asb" - } - }, "node_modules/assemblyscript": { "version": "0.18.9", "resolved": "https://registry.npmjs.org/assemblyscript/-/assemblyscript-0.18.9.tgz", @@ -861,10 +809,6 @@ "bin": { "asc": "bin/asc", "asinit": "bin/asinit" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/assemblyscript" } }, "node_modules/astral-regex": { @@ -980,9 +924,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cardinal": { @@ -1101,17 +1042,6 @@ "node": ">=4" } }, - "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1373,9 +1303,6 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/del/node_modules/p-map": { @@ -1388,9 +1315,6 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/deprecation": { @@ -1517,9 +1441,6 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, "node_modules/env-ci/node_modules/get-stream": { @@ -1532,9 +1453,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/env-ci/node_modules/human-signals": { @@ -1853,9 +1771,6 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, "node_modules/fast-deep-equal": { @@ -1912,9 +1827,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/file-entry-cache": { @@ -2044,9 +1956,6 @@ "dev": true, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/git-log-parser": { @@ -2447,9 +2356,6 @@ "dev": true, "dependencies": { "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-extglob": { @@ -2651,9 +2557,6 @@ "dependencies": { "graceful-fs": "^4.1.6", "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" } }, "node_modules/jsonparse": { @@ -2841,9 +2744,6 @@ "cli-table": "^0.3.1", "node-emoji": "^1.10.0", "supports-hyperlinks": "^2.1.0" - }, - "peerDependencies": { - "marked": ">=0.4.0 <2.0.0" } }, "node_modules/meow": { @@ -2866,9 +2766,6 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/meow/node_modules/type-fest": { @@ -2878,9 +2775,6 @@ "dev": true, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/meow/node_modules/yargs-parser": { @@ -3025,10 +2919,6 @@ "nearley-test": "bin/nearley-test.js", "nearley-unparse": "bin/nearley-unparse.js", "nearleyc": "bin/nearleyc.js" - }, - "funding": { - "type": "individual", - "url": "https://nearley.js.org/#give-to-nearley" } }, "node_modules/neo-async": { @@ -3083,9 +2973,6 @@ "dev": true, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/npm": { @@ -3093,6 +2980,7 @@ "resolved": "https://registry.npmjs.org/npm/-/npm-6.14.11.tgz", "integrity": "sha512-1Zh7LjuIoEhIyjkBflSSGzfjuPQwDlghNloppjruOH5bmj9midT9qcNT0tRUZRR04shU9ekrxNy9+UTBrqeBpQ==", "bundleDependencies": [ + "JSONStream", "abbrev", "ansicolors", "ansistyles", @@ -3133,7 +3021,6 @@ "init-package-json", "is-cidr", "json-parse-better-errors", - "JSONStream", "lazy-property", "libcipm", "libnpm", @@ -3184,11 +3071,11 @@ "qrcode-terminal", "query-string", "qw", + "read", "read-cmd-shim", "read-installed", "read-package-json", "read-package-tree", - "read", "readable-stream", "readdir-scoped-modules", "request", @@ -8611,9 +8498,6 @@ }, "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/opencollective-postinstall": { @@ -8632,9 +8516,6 @@ "dev": true, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-filter": { @@ -9039,9 +8920,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up/node_modules/type-fest": { @@ -9165,12 +9043,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "node_modules/resolve": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", @@ -9179,9 +9051,6 @@ "dependencies": { "is-core-module": "^2.1.0", "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/resolve-from": { @@ -9310,9 +9179,6 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/semantic-release/node_modules/y18n": { @@ -9402,12 +9268,6 @@ "node": ">=8" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -9805,9 +9665,6 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/tempy/node_modules/type-fest": { @@ -9817,9 +9674,6 @@ "dev": true, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/text-encoding": { @@ -9965,9 +9819,6 @@ "dev": true, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/typescript": { @@ -10075,12 +9926,6 @@ "node": ">= 8" } }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "node_modules/which-pm-runs": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", @@ -10102,20 +9947,6 @@ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -10131,12 +9962,6 @@ "node": ">=0.4" } }, - "node_modules/y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true - }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -10152,41 +9977,6 @@ "node": ">= 6" } }, - "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -10211,8 +10001,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/@as-pect/assembly/-/assembly-6.0.0.tgz", "integrity": "sha512-B1bBMg2onl+RomWLlsWfrHdB8d4Xu7GOJn5eMwI4gjXvDKfbNXeSrL1gdkL7oZAHCf04XJ0XRWdUXfPdqTZdGA==", - "dev": true, - "requires": {} + "dev": true }, "@as-pect/cli": { "version": "6.0.0", @@ -10479,8 +10268,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.3.tgz", "integrity": "sha512-4RFU4li238jMJAzLgAwkBAw+4Loile5haQMQr+uhFq27BmyJXcXSKvoQKqh0agsZEiUlW6iSv3FAgvmGkur7OQ==", - "dev": true, - "requires": {} + "dev": true }, "@octokit/plugin-rest-endpoint-methods": { "version": "4.10.1", @@ -10880,15 +10668,6 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, - "asbuild": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/asbuild/-/asbuild-0.0.10.tgz", - "integrity": "sha512-pSBYULxYuOjFVfcyeMgnJLsFbFbwqONxn9yYwMj7F44HcdVvsJzDx7wdg49uG8KmIuiQc7vjoMg3bg6oC/Al7g==", - "dev": true, - "requires": { - "yargs": "^15.4.1" - } - }, "assemblyscript": { "version": "0.18.9", "resolved": "https://registry.npmjs.org/assemblyscript/-/assemblyscript-0.18.9.tgz", @@ -11087,17 +10866,6 @@ } } }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -17499,12 +17267,6 @@ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "resolve": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", @@ -17685,12 +17447,6 @@ "integrity": "sha512-bXWyL6EAKOJa81XG1OZ/Yyuq+oT0b2YLlxx7c+mrdYPaPbnj6WgVULXhinMIeZGufuUBu/eVRqXEhiv4imfwxA==", "dev": true }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -18231,12 +17987,6 @@ "isexe": "^2.0.0" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "which-pm-runs": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", @@ -18255,17 +18005,6 @@ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -18278,12 +18017,6 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true - }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -18296,35 +18029,6 @@ "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", "dev": true }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/package.json b/package.json index 5132269..c73c17e 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,8 @@ "prettier": "prettier --check .", "prettier:write": "prettier --write .", "eslint:write": "npm run eslint -- --fix ", - "asbuild:untouched": "asb --target debug", - "asbuild:optimized": "asb", + "asbuild:untouched": "asc assembly/index.ts --target debug", + "asbuild:optimized": "asc assembly/index.ts --target release", "asbuild": "npm run asbuild:untouched && npm run asbuild:optimized", "tsrun": "ts-node ts/index.ts", "benchmark": "node benchmark/benchmark.js", @@ -26,7 +26,6 @@ "@types/node": "^14.14.13", "@typescript-eslint/eslint-plugin": "^4.14.1", "@typescript-eslint/parser": "^4.14.1", - "asbuild": "0.0.10", "assemblyscript": "^0.18.0", "benchmark": "^2.1.4", "eslint": "^7.18.0", diff --git a/spec/test-generator.js b/spec/test-generator.js index 3bcd45a..dfc32eb 100644 --- a/spec/test-generator.js +++ b/spec/test-generator.js @@ -21,8 +21,11 @@ const knownIssues = { 1288, ], "test contains an octal escape sequence": [1102], + // the test results measure captured groups using character length / locations + // see: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/length + // this is tricky to reproduce + "test requires a substring function": [1087], "requires triage": [ - 1087, 1363, 1369, 1163, @@ -32,15 +35,10 @@ const knownIssues = { 1413, ...range(1301, 1308), ], - "as-pect test issue": [1145, 1146], "test indicates a malformed regex, whereas it appears OK in JS": [1189], "test regex contains syntax not supported in JS": [82, 1158, 281], "the test behaviour differs between PCRE and JS": [290], - "aspect [Actual]: null vs [Expected]: Not null issue": [ - 153, - 203, - 204, - ], + "test appears to be incorrect?": [203, 204], }; const hasKnownIssue = (index) => { diff --git a/ts/index.ts b/ts/index.ts index 56f58b6..89080e1 100644 --- a/ts/index.ts +++ b/ts/index.ts @@ -5,10 +5,6 @@ globalAny.log = console.log; import { RegExp } from "../assembly/regexp"; -const regexObj = new RegExp("^(a){1,3}"); -const match = regexObj.exec("abc"); +const regexObj = new RegExp("[a-c]", "i"); +const match = regexObj.exec("A"); console.log(JSON.stringify(match, null, 2)); - -const regexObj2 = new RegExp("(a|b)c|a(b|c)"); -const match2 = regexObj2.exec("ab"); -console.log(JSON.stringify(match2, null, 2));