Skip to content

Commit 37fadd5

Browse files
authored
isStringLike (#6)
1 parent cfbd06b commit 37fadd5

16 files changed

+84
-47
lines changed

README.md

+17-8
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,8 @@ Same as above but for a 32-bits (x86) Windows or Linux binary.
171171
#### `isArrayOfStringNotEmpty(value: unknown): boolean`
172172
#### `isSizeArrayOfStringNotEmpty(value: unknown, length: number): boolean`
173173
#### `isArrayOfNumber(value: unknown): boolean`
174-
#### `isArrayOfStringLike(value: unknown, pattern: RegExp): boolean`
175-
#### `isSizeArrayOfStringLike(value: unknown, length: number, pattern: RegExp): boolean`
174+
#### `isArrayOfStringLike(value: unknown, pattern: RegExp | string): boolean`
175+
#### `isSizeArrayOfStringLike(value: unknown, length: number, pattern: RegExp | string): boolean`
176176
#### `isSizeArrayOfNumber(value: unknown, length: number): boolean`
177177
#### `isArrayOfNumberWithinRange(value: unknown, min: number, max: number): boolean`
178178
#### `isSizeArrayOfNumberWithinRange(value: unknown, length: number, min: number, max: number): boolean`
@@ -295,7 +295,15 @@ Plain object assigned as property within another:
295295
296296
#### `isString(value: unknown): boolean`
297297
#### `isStringNotEmpty(value: unknown): boolean`
298-
#### `isStringLike(value: unknown, pattern: RegExp): boolean`
298+
#### `isStringLike(value: unknown, pattern: RegExp | string): boolean`
299+
300+
If pattern is a string, this function will look for a corresponding known regex pattern.
301+
302+
As of this writing, these are:
303+
304+
- `hex`: Hexadecimal
305+
- `SRI`: [Subresource Integrity](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity)
306+
299307
#### `isHexString(value: unknown): boolean`
300308
301309
</details>
@@ -424,8 +432,8 @@ assert.shouldArrayOfString(["a","b"], new Error("custom error", { cause: err }))
424432
#### `shouldSizeArrayOfString(value: unknown, length: number, error?: Error | string): void`
425433
#### `shouldArrayOfStringNotEmpty(value: unknown, error?: Error | string): void`
426434
#### `shouldSizeArrayOfStringNotEmpty(value: unknown, length: number, error?: Error | string): void`
427-
#### `shouldArrayOfStringLike(value: unknown, pattern: RegExp, error?: Error | string | null): void`
428-
#### `shouldSizeArrayOfStringLike(value: unknown, length: number, pattern: RegExp, error?: Error | string | null): void`
435+
#### `shouldArrayOfStringLike(value: unknown, pattern: RegExp | string, error?: Error | string | null): void`
436+
#### `shouldSizeArrayOfStringLike(value: unknown, length: number, pattern: RegExp | string, error?: Error | string | null): void`
429437
#### `shouldArrayOfNumber(value: unknown, error?: Error | string): void`
430438
#### `shouldSizeArrayOfNumber(value: unknown, length: number, error?: Error | string): void`
431439
#### `shouldArrayOfNumberWithinRange(value: unknown, min: number, max: number, error?: Error | string): void`
@@ -485,7 +493,7 @@ alias: `shouldSizeArrayOfBuffer(value: unknown, length: number, error?: Error |
485493
486494
#### `shouldString(value: unknown, error?: Error | string): void`
487495
#### `shouldStringNotEmpty(value: unknown, error?: Error | string): void`
488-
#### `shouldStringLike(value: unknown, pattern: RegExp, error?: Error | string | null): void`
496+
#### `shouldStringLike(value: unknown, pattern: RegExp | string, error?: Error | string | null): void`
489497
#### `shouldHexString(value: unknown, error?: Error | string): void`
490498
491499
</details>
@@ -598,8 +606,8 @@ function(option = {}){
598606
#### `asSizeArrayOfString(value: unknown, length: number): string[] | null`
599607
#### `asArrayOfStringNotEmpty(value: unknown): string[] | null`
600608
#### `asSizeArrayOfStringNotEmpty(value: unknown, length: number): string[] | null`
601-
#### `asArrayOfStringLike(value: unknown, pattern: RegExp): string[] | null;
602-
#### `asSizeArrayOfStringLike(value: unknown, length: number, pattern: RegExp): string[] | null;
609+
#### `asArrayOfStringLike(value: unknown, pattern: RegExp | string): string[] | null;
610+
#### `asSizeArrayOfStringLike(value: unknown, length: number, pattern: RegExp | string): string[] | null;
603611
#### `asArrayOfNumber(value: unknown): number[] | null`
604612
#### `asSizeArrayOfNumber(value: unknown, length: number): number[] | null`
605613
#### `asArrayOfNumberWithinRange(value: unknown, min: number, max: number): number[] | null`
@@ -662,6 +670,7 @@ alias: `asSizeArrayOfBuffer(value: unknown, length: number): Uint8Array[] | Buff
662670
663671
#### `asString(value: unknown): string | null`
664672
#### `asStringNotEmpty(value: unknown): string | null`
673+
#### `asStringLike(value: unknown, pattern: RegExp | string): string | null`
665674
#### `asHexString(value: unknown): string | null`
666675
667676
</details>

lib/is/misc/runtime.js

+14-7
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,27 @@ found in the LICENSE file in the root directory of this source tree.
66

77
function isDeno(){
88
// @ts-ignore
9-
return typeof Deno !== 'undefined';
9+
return typeof Deno !== "undefined";
1010
}
1111

1212
function isNode(){
13-
return typeof process !== 'undefined' &&
14-
process.versions?.node &&
15-
!process.versions?.nw &&
16-
// @ts-ignore
17-
!(process.versions?.electron && process.type === "browser");
13+
if (typeof navigator !== "undefined")
14+
{
15+
return navigator.userAgent.startsWith("Node.js"); //(node >= 21)
16+
}
17+
else
18+
{
19+
return typeof process !== "undefined" &&
20+
process.versions?.node &&
21+
!process.versions?.nw &&
22+
// @ts-ignore
23+
!(process.versions?.electron && process.type === "browser");
24+
}
1825
}
1926

2027
function isBrowser(){
2128
//eslint-disable-next-line no-undef
22-
return typeof window !== 'undefined' && typeof window.document !== 'undefined';
29+
return typeof window !== "undefined" && typeof window.document !== "undefined";
2330
}
2431

2532
export {

lib/is/os/linux.js

+10-6
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ This source code is licensed under the MIT License
44
found in the LICENSE file in the root directory of this source tree.
55
*/
66

7-
import { platform } from "node:os";
7+
import { env, platform } from "node:process";
88
import { parse } from "../../util/freedesktop.os-release.js";
99

1010
function isLinux(){
11-
return platform() === "linux";
11+
return platform === "linux";
1212
}
1313

1414
//Distro
@@ -39,6 +39,8 @@ const isRaspberryPiOS = ()=> isDistro("raspbian", true);
3939
//Blue is the new Orange
4040
const isFedora = () => isDistro("fedora", true);
4141
const isFedoraLike = () => isDistro("fedora", false);
42+
//Embedded
43+
const isOpenWrt = () => isDistro("openwrt", true);
4244
//Others
4345
const isOpenSUSE = () => isDistro("opensuse", true);
4446
const isSlackware = () => isDistro("slackware", true);
@@ -47,20 +49,21 @@ const isGentoo = () => isDistro("gentoo", true);
4749
//DE
4850
function isDesktopEnvironment(name){
4951
if (!isLinux()) return false;
50-
const current = process.env['XDG_CURRENT_DESKTOP']?.split(":") ?? []; //Usually a single value but it's a colon-separated list by spec
51-
const session = process.env['XDG_SESSION_DESKTOP']?.toLowerCase();
52+
const current = env["XDG_CURRENT_DESKTOP"]?.split(":") ?? []; //Usually a single value but it's a colon-separated list by spec
53+
const session = env["XDG_SESSION_DESKTOP"]?.toLowerCase();
5254
return session === name || current.map(s => s.toLowerCase()).includes(name);
5355
}
56+
//const isCosmic = () => isDesktopEnvironment("cosmic?"); //TO DO: check value when released
5457
const isGnome = () => isDesktopEnvironment("gnome");
5558
const isKDE = () => isDesktopEnvironment("kde");
5659
const isXFCE = () => isDesktopEnvironment("xfce");
57-
const isMate = () => isDesktopEnvironment("mate");
5860
const isCinnamon = () => isDesktopEnvironment("cinnamon");
61+
const isMate = () => isDesktopEnvironment("mate");
5962

6063
//Display Server/Protocol
6164
function isWayland(){
6265
if (!isLinux()) return false;
63-
return !!process.env['WAYLAND_DISPLAY'] || process.env['XDG_SESSION_TYPE'] === "wayland";
66+
return Boolean(env["WAYLAND_DISPLAY"]) || env["XDG_SESSION_TYPE"] === "wayland";
6467
}
6568

6669
export {
@@ -81,6 +84,7 @@ export {
8184
isRaspberryPiOS as isRaspbian, //alias
8285
isFedora,
8386
isFedoraLike,
87+
isOpenWrt,
8488
isOpenSUSE,
8589
isSlackware,
8690
isGentoo,

lib/is/type/obj.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@ function isObjWithinObj(value){
9292
return isObjNotEmpty(value) && Object.values(value).every(elem => isObj(elem));
9393
}
9494

95-
function isError(value){
96-
return hasTag(value, "Error");
95+
function isError(value){
96+
return hasTag(value, "Error"); //TC39 Error.isError()
9797
}
9898

9999
function isRegExp(value){

lib/is/type/string.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ found in the LICENSE file in the root directory of this source tree.
55
*/
66

77
import { shouldRegExp } from "../../assert/type/obj.js";
8+
import { patterns } from "../../util/regex.js";
89

910
function isString(value){
1011
return typeof value === "string";
@@ -15,13 +16,13 @@ function isStringNotEmpty(value){
1516
}
1617

1718
function isStringLike(value, pattern){
19+
if (isStringNotEmpty(pattern)) pattern = patterns[pattern];
1820
shouldRegExp(pattern);
1921
return isStringNotEmpty(value) && pattern.test(value);
2022
}
2123

2224
function isHexString(value){
23-
const pattern = /^[0-9A-Fa-f]+$/;
24-
return isStringLike(value, pattern)
25+
return isStringLike(value, "hex")
2526
}
2627

2728
export {

lib/util/freedesktop.os-release.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ async function parse(){
4545

4646
const data = await read();
4747

48-
let result = Object.create(null);
48+
const result = Object.create(null);
4949
const lines = data.split("\n");
5050

5151
for (const line of lines){

lib/util/regex.js

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/*
2+
Copyright (c) Anthony Beaumont
3+
This source code is licensed under the MIT License
4+
found in the LICENSE file in the root directory of this source tree.
5+
*/
6+
7+
export const patterns = {
8+
hex: /^[0-9A-Fa-f]+$/,
9+
// https://w3c.github.io/webappsec-subresource-integrity/#grammardef-hash-with-options
10+
// https://www.w3.org/TR/CSP2/#source-list-syntax
11+
// https://www.rfc-editor.org/rfc/rfc5234#appendix-B.1
12+
SRI: /(sha256|sha384|sha512)-(([A-Za-z0-9+/]+|[A-Za-z0-9_-]+)={0,2}(?:\s|$)( +[!-~]*)?)?/i,
13+
};

package-lock.json

+11-10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@xan105/is",
3-
"version": "2.9.3",
3+
"version": "2.10.0",
44
"description": "Collection of various checks for asserting types and values at runtime",
55
"type": "module",
66
"exports": {
@@ -76,6 +76,6 @@
7676
"typescript": "^5.2.2"
7777
},
7878
"dependencies": {
79-
"@xan105/error": "^1.6.2"
79+
"@xan105/error": "^1.7.1"
8080
}
8181
}

test/type.js

+2
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,8 @@ t.notOk(check.isHexString("aabb110h"), "is hex string");
328328
t.notOk(check.isHexString(" aabb "), "is hex string");
329329
t.notOk(check.isHexString("hhaabb"), "is hex string");
330330

331+
t.ok(check.isStringLike("sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC", "SRI"), "is SRI string");
332+
331333
//assert
332334
t.doesNotThrow(function(){ assert.shouldString("hello world") }, "shouldString()");
333335
t.doesNotThrow(function(){ assert.shouldString("") }, "shouldString()");

types/assert/type/array.d.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ export function shouldArrayOfString(value: unknown, error?: Error | string | nul
44
export function shouldSizeArrayOfString(value: unknown, length: number, error?: Error | string | null): void;
55
export function shouldArrayOfStringNotEmpty(value: unknown, error?: Error | string | null): void;
66
export function shouldSizeArrayOfStringNotEmpty(value: unknown, length: number, error?: Error | string | null): void;
7-
export function shouldArrayOfStringLike(value: unknown, pattern: RegExp, error?: Error | string | null): void;
8-
export function shouldSizeArrayOfStringLike(value: unknown, length: number, pattern: RegExp, error?: Error | string | null): void;
7+
export function shouldArrayOfStringLike(value: unknown, pattern: RegExp | string, error?: Error | string | null): void;
8+
export function shouldSizeArrayOfStringLike(value: unknown, length: number, pattern: RegExp | string, error?: Error | string | null): void;
99
export function shouldArrayOfNumber(value: unknown, error?: Error | string | null): void;
1010
export function shouldSizeArrayOfNumber(value: unknown, length: number, error?: Error | string | null): void;
1111
export function shouldArrayOfNumberWithinRange(value: unknown, min: number, max: number, error?: Error | string | null): void;

types/assert/type/string.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
export function shouldString(value: unknown, error?: Error | string | null): void;
22
export function shouldStringNotEmpty(value: unknown, error?: Error | string | null): void;
3-
export function shouldStringLike(value: unknown, pattern: RegExp, error?: Error | string | null): void;
3+
export function shouldStringLike(value: unknown, pattern: RegExp | string, error?: Error | string | null): void;
44
export function shouldHexString(value: unknown, error?: Error | string | null): void;

types/is/type/array.d.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ export function isArrayOfString(value: unknown): boolean;
44
export function isSizeArrayOfString(value: unknown, length: number): boolean;
55
export function isArrayOfStringNotEmpty(value: unknown): boolean;
66
export function isSizeArrayOfStringNotEmpty(value: unknown, length: number): boolean;
7-
export function isArrayOfStringLike(value: unknown, pattern: RegExp): boolean;
8-
export function isSizeArrayOfStringLike(value: unknown, length: number, pattern: RegExp): boolean;
7+
export function isArrayOfStringLike(value: unknown, pattern: RegExp | string): boolean;
8+
export function isSizeArrayOfStringLike(value: unknown, length: number, pattern: RegExp | string): boolean;
99
export function isArrayOfNumber(value: unknown): boolean;
1010
export function isSizeArrayOfNumber(value: unknown, length: number): boolean;
1111
export function isArrayOfNumberWithinRange(value: unknown, min: number, max: number): boolean;

types/is/type/string.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
export function isString(value: unknown): boolean;
22
export function isStringNotEmpty(value: unknown): boolean;
3-
export function isStringLike(value: unknown, pattern: RegExp): boolean;
3+
export function isStringLike(value: unknown, pattern: RegExp | string): boolean;
44
export function isHexString(value: unknown): boolean;

types/opt/array.d.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ export function asArrayOfString(value: unknown): string[] | null;
44
export function asSizeArrayOfString(value: unknown, length: number): string[] | null;
55
export function asArrayOfStringNotEmpty(value: unknown): string[] | null;
66
export function asSizeArrayOfStringNotEmpty(value: unknown, length: number): string[] | null;
7-
export function asArrayOfStringLike(value: unknown, pattern: RegExp): string[] | null;
8-
export function asSizeArrayOfStringLike(value: unknown, length: number, pattern: RegExp): string[] | null;
7+
export function asArrayOfStringLike(value: unknown, pattern: RegExp | string): string[] | null;
8+
export function asSizeArrayOfStringLike(value: unknown, length: number, pattern: RegExp | string): string[] | null;
99
export function asArrayOfNumber(value: unknown): number[] | null;
1010
export function asSizeArrayOfNumber(value: unknown, length: number): number[] | null;
1111
export function asArrayOfNumberWithinRange(value: unknown, min: number, max: number): number[] | null;

types/opt/string.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
export function asString(value: unknown): string | null;
22
export function asStringNotEmpty(value: unknown): string | null;
3-
export function asStringLike(value: unknown, pattern: RegExp): string | null;
3+
export function asStringLike(value: unknown, pattern: RegExp | string): string | null;
44
export function asHexString(value: unknown): string | null;

0 commit comments

Comments
 (0)