From b321f92161bd2c4bfefc5e4cb0a520cc5135c798 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 8 Jul 2020 11:14:55 +0200 Subject: [PATCH] Add isAscii (#629) --- CHANGELOG.md | 4 ++ package.json | 2 +- packages/util/src/is/ascii.spec.ts | 31 ++++++++ packages/util/src/is/ascii.ts | 24 +++++++ packages/util/src/is/index.ts | 1 + yarn.lock | 110 +++++++++++++++++++++++++---- 6 files changed, 157 insertions(+), 15 deletions(-) create mode 100644 packages/util/src/is/ascii.spec.ts create mode 100644 packages/util/src/is/ascii.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e4c9bf3a..89c1d65d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # CHANGELOG +## 2.18.0-beta.x + +- Add `isAscii` to allow detection of ASCII characters (including tab, newline) + ## 2.17.1 Jul 6, 2020 - Add `encode{Derived, Multi}Address` to encode derived/multi addresses diff --git a/package.json b/package.json index acd1cc092..1d167f677 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@babel/core": "^7.10.4", - "@polkadot/dev": "^0.55.19", + "@polkadot/dev": "^0.55.20", "@polkadot/ts": "^0.3.27", "@types/jest": "^26.0.3" }, diff --git a/packages/util/src/is/ascii.spec.ts b/packages/util/src/is/ascii.spec.ts new file mode 100644 index 000000000..97123f298 --- /dev/null +++ b/packages/util/src/is/ascii.spec.ts @@ -0,0 +1,31 @@ +// Copyright 2017-2020 @polkadot/util authors & contributors +// This software may be modified and distributed under the terms +// of the Apache-2.0 license. See the LICENSE file for details. + +import { isAscii } from '.'; + +describe('isAscii', (): void => { + it('returns true for an ASCII string', (): void => { + expect(isAscii('Hello\tWorld!\n\rTesting')).toEqual(true); + }); + + it('returns true for ASCII bytes', (): void => { + expect(isAscii(new Uint8Array([0x31, 0x32, 0x20, 10]))).toEqual(true); + }); + + it('returns true for empty string inputs', (): void => { + expect(isAscii('')).toEqual(true); + }); + + it('returns true for empty U8a inputs', (): void => { + expect(isAscii(new Uint8Array())).toEqual(true); + }); + + it('returns false for empty undefined inputs', (): void => { + expect(isAscii()).toEqual(false); + }); + + it('returns false for non-printable characters', (): void => { + expect(isAscii(new Uint8Array([5]))).toEqual(false); + }); +}); diff --git a/packages/util/src/is/ascii.ts b/packages/util/src/is/ascii.ts new file mode 100644 index 000000000..b23db7eee --- /dev/null +++ b/packages/util/src/is/ascii.ts @@ -0,0 +1,24 @@ +// Copyright 2017-2020 @polkadot/util authors & contributors +// This software may be modified and distributed under the terms +// of the Apache-2.0 license. See the LICENSE file for details. + +import u8aToU8a from '../u8a/toU8a'; +import isString from './string'; + +const FORMAT = [9, 10, 13]; + +/** + * @name isAscii + * @summary Tests if the input is printable ASCII + * @description + * Checks to see if the input string or Uint8Array is printable ASCII, 32-127 + formatters + */ +export default function isAscii (value?: number[] | Buffer | Uint8Array | string | null): boolean { + if (!value) { + return isString(value); + } + + const u8a = u8aToU8a(value); + + return !u8a.some((byte) => (byte >= 127) || (byte < 32 && !FORMAT.includes(byte))); +} diff --git a/packages/util/src/is/index.ts b/packages/util/src/is/index.ts index e84ff4be3..ffafd714d 100644 --- a/packages/util/src/is/index.ts +++ b/packages/util/src/is/index.ts @@ -5,6 +5,7 @@ /** * @summary Type checking utilities */ +export { default as isAscii } from './ascii'; export { default as isBigInt } from './bigInt'; export { default as isBn } from './bn'; export { default as isBuffer } from './buffer'; diff --git a/yarn.lock b/yarn.lock index e94b54aa1..0c956ab28 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1330,6 +1330,16 @@ __metadata: languageName: node linkType: hard +"@babel/runtime-corejs3@npm:^7.8.3": + version: 7.10.4 + resolution: "@babel/runtime-corejs3@npm:7.10.4" + dependencies: + core-js-pure: ^3.0.0 + regenerator-runtime: ^0.13.4 + checksum: 3/5621e6b5c680751b14c9827f8569153646c43335d4cfc9d7ee22b576a7a8455b1029b2b9d8f64c39fd3ce574e4e311cccafdf1ece484538529db37dd14560b0d + languageName: node + linkType: hard + "@babel/runtime@npm:^7.10.4, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.9.6": version: 7.10.4 resolution: "@babel/runtime@npm:7.10.4" @@ -2654,9 +2664,9 @@ __metadata: languageName: node linkType: hard -"@polkadot/dev@npm:^0.55.19": - version: 0.55.19 - resolution: "@polkadot/dev@npm:0.55.19" +"@polkadot/dev@npm:^0.55.20": + version: 0.55.20 + resolution: "@polkadot/dev@npm:0.55.20" dependencies: "@babel/cli": ^7.10.4 "@babel/core": ^7.10.4 @@ -2685,10 +2695,10 @@ __metadata: babel-jest: ^26.1.0 babel-plugin-module-resolver: ^4.0.0 babel-plugin-styled-components: ^1.10.7 - browserslist: ^4.12.2 + browserslist: ^4.13.0 coveralls: ^3.1.0 cpx: ^1.5.0 - eslint: ^7.3.1 + eslint: ^7.4.0 eslint-config-standard: ^14.1.1 eslint-import-resolver-node: ^0.3.4 eslint-plugin-header: ^3.0.0 @@ -2718,7 +2728,7 @@ __metadata: vuepress: ^1.5.2 webpack: ^4.43.0 webpack-cli: ^3.3.12 - yargs: ^15.3.1 + yargs: ^15.4.0 bin: polkadot-ci-ghact-build: scripts/polkadot-ci-ghact-build.js polkadot-ci-ghact-docs: scripts/polkadot-ci-ghact-docs.js @@ -2739,7 +2749,7 @@ __metadata: polkadot-exec-typedoc: scripts/polkadot-exec-typedoc.js polkadot-exec-vuepress: scripts/polkadot-exec-vuepress.js polkadot-exec-webpack: scripts/polkadot-exec-webpack.js - checksum: 3/5f690f0995be5cbbf0b3522f7e494c3a23c1e35632918af0c34842363b5c93431192b058878c9cc91a1110a84c5aef1fd3100ed84ea2371d2c5af5322f877d31 + checksum: 3/6cf7767a27f96be988064b43071898f9216e1ddedfc1de3d5c7dc4f4f0dddc2091de4127b15837ec572d3adaf4e29046e5c4704958fb73af9fd5a18761a2ca1f languageName: node linkType: hard @@ -4914,7 +4924,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.0.0, browserslist@npm:^4.12.0, browserslist@npm:^4.12.2, browserslist@npm:^4.8.5": +"browserslist@npm:^4.0.0, browserslist@npm:^4.12.0, browserslist@npm:^4.8.5": version: 4.12.2 resolution: "browserslist@npm:4.12.2" dependencies: @@ -4928,6 +4938,20 @@ __metadata: languageName: node linkType: hard +"browserslist@npm:^4.13.0": + version: 4.13.0 + resolution: "browserslist@npm:4.13.0" + dependencies: + caniuse-lite: ^1.0.30001093 + electron-to-chromium: ^1.3.488 + escalade: ^3.0.1 + node-releases: ^1.1.58 + bin: + browserslist: cli.js + checksum: 3/91657dcc024f03f7b8a03f897e4a15c73774f39040f4e2fa9cb0e10b057113d71c97b29721590a80bf03dccfae1d69ad3fdf7326644c2c41cdd0410fb1a679a0 + languageName: node + linkType: hard + "bser@npm:2.1.1": version: 2.1.1 resolution: "bser@npm:2.1.1" @@ -5231,6 +5255,13 @@ __metadata: languageName: node linkType: hard +"caniuse-lite@npm:^1.0.30001093": + version: 1.0.30001094 + resolution: "caniuse-lite@npm:1.0.30001094" + checksum: 3/7b3ee77fda7b03fd613f39098452eecba004345c511779ed242393c06e45c9540dbb7deb9b21fc7a355ae6d8194e014395630d9a11172749f02f355a71665213 + languageName: node + linkType: hard + "capture-exit@npm:^2.0.0": version: 2.0.0 resolution: "capture-exit@npm:2.0.0" @@ -6078,6 +6109,13 @@ __metadata: languageName: node linkType: hard +"core-js-pure@npm:^3.0.0": + version: 3.6.5 + resolution: "core-js-pure@npm:3.6.5" + checksum: 3/91fc8e0b699d5bcb11f265ad4544d08c98096b86ad6c9b4c00109616db0aa992ceb58ea82d0dbae2a16658a7aaf2922aa6f9fc1107dc3b0055270799d0414a3f + languageName: node + linkType: hard + "core-js@npm:^2.4.0": version: 2.6.11 resolution: "core-js@npm:2.6.11" @@ -6637,6 +6675,15 @@ __metadata: languageName: node linkType: hard +"decamelize@npm:^3.2.0": + version: 3.2.0 + resolution: "decamelize@npm:3.2.0" + dependencies: + xregexp: ^4.2.4 + checksum: 3/dbe98e2e5f49a825c57a0f8c5ab0cb983669b71b6f689909b5f42888fb26c25d65a0c340930b2a3c2d770d6611e3be3b765e3776b75969263a3d401a31507ee4 + languageName: node + linkType: hard + "decimal.js@npm:^10.2.0": version: 10.2.0 resolution: "decimal.js@npm:10.2.0" @@ -7270,6 +7317,13 @@ __metadata: languageName: node linkType: hard +"electron-to-chromium@npm:^1.3.488": + version: 1.3.488 + resolution: "electron-to-chromium@npm:1.3.488" + checksum: 3/55f9f86483a2ba998b128de2f659a09ebe0ff46ac3518ebe948306999bfeab7567a1e40111ba65251ee84198dee575c6970ce4e91a59182ee923eb5234cc39ac + languageName: node + linkType: hard + "elliptic@npm:^6.0.0, elliptic@npm:^6.5.2, elliptic@npm:^6.5.3": version: 6.5.3 resolution: "elliptic@npm:6.5.3" @@ -7720,9 +7774,9 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^7.3.1": - version: 7.3.1 - resolution: "eslint@npm:7.3.1" +"eslint@npm:^7.4.0": + version: 7.4.0 + resolution: "eslint@npm:7.4.0" dependencies: "@babel/code-frame": ^7.0.0 ajv: ^6.10.0 @@ -7762,7 +7816,7 @@ __metadata: v8-compile-cache: ^2.0.3 bin: eslint: bin/eslint.js - checksum: 3/5d9fd38514ffb43d0c326488bae2338861a654d507e40594f0d6b39efee5d91ec3105d5408f2add6891e8b47d512a75f06b4ce974c2d70bc6d9ae62574b31deb + checksum: 3/ef144e684ce031b045aca156439af5c5ec8a9b843613ed2948bb28ed767dc5e106d9f057a9bf93c752071b7833656bc7affa1d28daa9609c6ea59d1311f0a8de languageName: node linkType: hard @@ -15736,7 +15790,7 @@ __metadata: resolution: "root-workspace-0b6124@workspace:." dependencies: "@babel/core": ^7.10.4 - "@polkadot/dev": ^0.55.19 + "@polkadot/dev": ^0.55.20 "@polkadot/ts": ^0.3.27 "@types/jest": ^26.0.3 languageName: unknown @@ -18928,6 +18982,15 @@ __metadata: languageName: node linkType: hard +"xregexp@npm:^4.2.4": + version: 4.3.0 + resolution: "xregexp@npm:4.3.0" + dependencies: + "@babel/runtime-corejs3": ^7.8.3 + checksum: 3/2dcef4888ea32e7c01b8f42d1ee3df24970de14b299a8f534ccecf2252d297092f92d037502176ec334b6c8d7cd1dd3dba0d3cf949e26f418d50b46846268839 + languageName: node + linkType: hard + "xtend@npm:>=4.0.0 <4.1.0-0, xtend@npm:^4.0.0, xtend@npm:~4.0.1": version: 4.0.2 resolution: "xtend@npm:4.0.2" @@ -18992,7 +19055,7 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^18.1.1, yargs-parser@npm:^18.1.3": +"yargs-parser@npm:^18.1.1, yargs-parser@npm:^18.1.2, yargs-parser@npm:^18.1.3": version: 18.1.3 resolution: "yargs-parser@npm:18.1.3" dependencies: @@ -19058,6 +19121,25 @@ __metadata: languageName: node linkType: hard +"yargs@npm:^15.4.0": + version: 15.4.0 + resolution: "yargs@npm:15.4.0" + dependencies: + cliui: ^6.0.0 + decamelize: ^3.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 + checksum: 3/b4163b7e8f67250bdd4472b8c0a76665030199f3167dcaedc83a6c7daccd761d24208db83320414b9861b44dc3242d737864b13058b5a59c734a5e690d7b7692 + languageName: node + linkType: hard + "yargs@npm:^2.1.1": version: 2.3.0 resolution: "yargs@npm:2.3.0"