extra-utils 5.1.0 → 5.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +2 -0
  2. package/lib/string/index.d.ts +1 -0
  3. package/lib/string/index.js +1 -0
  4. package/lib/string/index.js.map +1 -1
  5. package/lib/string/to-string.d.ts +1 -0
  6. package/lib/string/to-string.js +4 -0
  7. package/lib/string/to-string.js.map +1 -0
  8. package/package.json +15 -14
  9. package/src/array/index.ts +2 -0
  10. package/src/array/is-array.ts +7 -0
  11. package/src/array/is-empty-array.ts +9 -0
  12. package/src/boolean/index.ts +2 -0
  13. package/src/boolean/is-boolean.ts +7 -0
  14. package/src/boolean/is-falsy.ts +9 -0
  15. package/src/in-enum.ts +10 -0
  16. package/src/index.ts +14 -0
  17. package/src/is-date.ts +7 -0
  18. package/src/is-function.ts +9 -0
  19. package/src/is-regexp.ts +7 -0
  20. package/src/is-symbol.ts +7 -0
  21. package/src/json/index.ts +2 -0
  22. package/src/json/is-json-serializable.ts +17 -0
  23. package/src/json/is-json-value.ts +20 -0
  24. package/src/nullish/index.ts +3 -0
  25. package/src/nullish/is-null.ts +7 -0
  26. package/src/nullish/is-nullish.ts +12 -0
  27. package/src/nullish/is-undefined.ts +7 -0
  28. package/src/number/index.ts +5 -0
  29. package/src/number/is-bigint.ts +7 -0
  30. package/src/number/is-finite.ts +3 -0
  31. package/src/number/is-infinity.ts +7 -0
  32. package/src/number/is-nan.ts +7 -0
  33. package/src/number/is-number.ts +7 -0
  34. package/src/object/index.ts +3 -0
  35. package/src/object/is-empty-object.ts +7 -0
  36. package/src/object/is-object.ts +12 -0
  37. package/src/object/is-plain-object.ts +15 -0
  38. package/src/pipe-async.ts +79 -0
  39. package/src/pipe.ts +77 -0
  40. package/src/string/index.ts +8 -0
  41. package/src/string/is-char.ts +10 -0
  42. package/src/string/is-string.ts +7 -0
  43. package/src/string/is-url-string.ts +12 -0
  44. package/src/string/remove-blank-lines.ts +8 -0
  45. package/src/string/remove-extra-indents.ts +29 -0
  46. package/src/string/remove-leading-blank-lines.ts +20 -0
  47. package/src/string/remove-trailing-blank-lines.ts +20 -0
  48. package/src/string/to-string.ts +3 -0
  49. package/src/string/utils.ts +7 -0
package/README.md CHANGED
@@ -98,6 +98,8 @@ function isntChar(val: unknown): boolean
98
98
 
99
99
  function isURLString(text: string): boolean
100
100
  function isntURLString(text: string): boolean
101
+
102
+ function toString(val: unknown): string
101
103
  ```
102
104
 
103
105
  #### removeExtraIndents
@@ -5,3 +5,4 @@ export * from './remove-blank-lines.js';
5
5
  export * from './remove-extra-indents.js';
6
6
  export * from './remove-leading-blank-lines.js';
7
7
  export * from './remove-trailing-blank-lines.js';
8
+ export * from './to-string.js';
@@ -5,4 +5,5 @@ export * from './remove-blank-lines.js';
5
5
  export * from './remove-extra-indents.js';
6
6
  export * from './remove-leading-blank-lines.js';
7
7
  export * from './remove-trailing-blank-lines.js';
8
+ export * from './to-string.js';
8
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/string/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,oBAAoB,CAAA;AAClC,cAAc,yBAAyB,CAAA;AACvC,cAAc,2BAA2B,CAAA;AACzC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,kCAAkC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/string/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,oBAAoB,CAAA;AAClC,cAAc,yBAAyB,CAAA;AACvC,cAAc,2BAA2B,CAAA;AACzC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,kCAAkC,CAAA;AAChD,cAAc,gBAAgB,CAAA"}
@@ -0,0 +1 @@
1
+ export declare function toString(val: unknown): string;
@@ -0,0 +1,4 @@
1
+ export function toString(val) {
2
+ return `${val}`;
3
+ }
4
+ //# sourceMappingURL=to-string.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-string.js","sourceRoot":"","sources":["../../src/string/to-string.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ,CAAC,GAAY;IACnC,OAAO,GAAG,GAAG,EAAE,CAAA;AACjB,CAAC"}
package/package.json CHANGED
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "name": "extra-utils",
3
- "version": "5.1.0",
3
+ "version": "5.2.0",
4
4
  "description": "Utilities for JavaScript and Typescript",
5
5
  "files": [
6
+ "src",
6
7
  "lib"
7
8
  ],
8
9
  "type": "module",
@@ -35,30 +36,30 @@
35
36
  "devDependencies": {
36
37
  "@blackglory/jest-resolver": "^0.3.0",
37
38
  "@blackglory/pass": "^1.1.0",
38
- "@commitlint/cli": "^17.4.4",
39
- "@commitlint/config-conventional": "^17.4.4",
40
- "@types/jest": "^29.4.0",
41
- "@types/jsdom": "^21.1.0",
42
- "@types/lodash-es": "^4.17.6",
43
- "@typescript-eslint/eslint-plugin": "^5.52.0",
44
- "@typescript-eslint/parser": "^5.52.0",
39
+ "@commitlint/cli": "^17.6.1",
40
+ "@commitlint/config-conventional": "^17.6.1",
41
+ "@types/jest": "^29.5.0",
42
+ "@types/jsdom": "^21.1.1",
43
+ "@types/lodash-es": "^4.17.7",
44
+ "@typescript-eslint/eslint-plugin": "^5.58.0",
45
+ "@typescript-eslint/parser": "^5.58.0",
45
46
  "cross-env": "^7.0.3",
46
- "eslint": "^8.34.0",
47
+ "eslint": "^8.38.0",
47
48
  "husky": "^4.3.8",
48
- "jest": "^29.4.3",
49
- "jest-resolve": "^29.4.3",
49
+ "jest": "^29.5.0",
50
+ "jest-resolve": "^29.5.0",
50
51
  "npm-run-all": "^4.1.5",
51
52
  "rimraf": "^3.0.2",
52
53
  "standard-version": "^9.5.0",
53
- "ts-jest": "^29.0.5",
54
+ "ts-jest": "^29.1.0",
54
55
  "ts-patch": "^2.1.0",
55
- "tsd": "^0.25.0",
56
+ "tsd": "^0.28.1",
56
57
  "tslib": "^2.5.0",
57
58
  "typescript": "4.8",
58
59
  "typescript-transform-paths": "^3.4.6"
59
60
  },
60
61
  "dependencies": {
61
- "justypes": "^4.1.0",
62
+ "justypes": "^4.2.0",
62
63
  "lodash-es": "^4.17.21"
63
64
  }
64
65
  }
@@ -0,0 +1,2 @@
1
+ export * from './is-array.js'
2
+ export * from './is-empty-array.js'
@@ -0,0 +1,7 @@
1
+ export function isArray<T>(val: unknown): val is Array<T> {
2
+ return Array.isArray(val)
3
+ }
4
+
5
+ export function isntArray<T>(val: T): val is Exclude<T, Array<unknown>> {
6
+ return !isArray(val)
7
+ }
@@ -0,0 +1,9 @@
1
+ import { NonEmptyArray } from 'justypes'
2
+
3
+ export function isEmptyArray(val: unknown[]): boolean {
4
+ return val.length === 0
5
+ }
6
+
7
+ export function isntEmptyArray<T>(val: T[]): val is NonEmptyArray<T> {
8
+ return val.length !== 0
9
+ }
@@ -0,0 +1,2 @@
1
+ export * from './is-boolean.js'
2
+ export * from './is-falsy.js'
@@ -0,0 +1,7 @@
1
+ export function isBoolean(val: unknown): val is boolean {
2
+ return typeof val === 'boolean'
3
+ }
4
+
5
+ export function isntBoolean<T>(val: unknown): val is Exclude<T, boolean> {
6
+ return !isBoolean(val)
7
+ }
@@ -0,0 +1,9 @@
1
+ import { Falsy } from 'justypes'
2
+
3
+ export function isFalsy(val: unknown): val is Falsy {
4
+ return !val
5
+ }
6
+
7
+ export function isntFalsy<T>(val: T): val is Exclude<T, Falsy> {
8
+ return !isFalsy(val)
9
+ }
package/src/in-enum.ts ADDED
@@ -0,0 +1,10 @@
1
+ // 由于以下原因, 该函数不应该被改写为其他形式:
2
+ // - enum在TypeScript里被作为单独的类型看待, 不满足extends object
3
+ // - 作为泛型时, enum参数会被提取为typeof enum类型而不是enum
4
+ export function inEnum<T>(val: unknown, _enum: object): val is T {
5
+ return Object.values(_enum).includes(val)
6
+ }
7
+
8
+ export function notInEnum<T, U>(val: T, _enum: object): val is Exclude<T, U> {
9
+ return !inEnum(val, _enum)
10
+ }
package/src/index.ts ADDED
@@ -0,0 +1,14 @@
1
+ export * from './array/index.js'
2
+ export * from './boolean/index.js'
3
+ export * from './number/index.js'
4
+ export * from './object/index.js'
5
+ export * from './json/index.js'
6
+ export * from './string/index.js'
7
+ export * from './nullish/index.js'
8
+ export * from './in-enum.js'
9
+ export * from './is-regexp.js'
10
+ export * from './is-symbol.js'
11
+ export * from './is-date.js'
12
+ export * from './is-function.js'
13
+ export * from './pipe.js'
14
+ export * from './pipe-async.js'
package/src/is-date.ts ADDED
@@ -0,0 +1,7 @@
1
+ export function isDate(val: unknown): val is Date {
2
+ return val instanceof Date
3
+ }
4
+
5
+ export function isntDate<T>(val: T): val is Exclude<T, Date> {
6
+ return !isDate(val)
7
+ }
@@ -0,0 +1,9 @@
1
+ export function isFunction<T extends Function = (...args: any[]) => any>(
2
+ val: unknown
3
+ ): val is T {
4
+ return typeof val === 'function'
5
+ }
6
+
7
+ export function isntFunction<T>(val: T): val is Exclude<T, Function> {
8
+ return !isFunction(val)
9
+ }
@@ -0,0 +1,7 @@
1
+ export function isRegExp(val: unknown): val is RegExp {
2
+ return val instanceof RegExp
3
+ }
4
+
5
+ export function isntRegExp<T>(val: T): val is Exclude<T, RegExp> {
6
+ return !isRegExp(val)
7
+ }
@@ -0,0 +1,7 @@
1
+ export function isSymbol(val: unknown): val is symbol {
2
+ return typeof val === 'symbol'
3
+ }
4
+
5
+ export function isntSymbol<T>(val: T): val is Exclude<T, symbol> {
6
+ return !isSymbol(val)
7
+ }
@@ -0,0 +1,2 @@
1
+ export * from './is-json-value.js'
2
+ export * from './is-json-serializable.js'
@@ -0,0 +1,17 @@
1
+ import { JSONValue, JSONSerializable } from 'justypes'
2
+ import { isObject } from '@src/object/index.js'
3
+ import { isFunction } from '@src/is-function.js'
4
+
5
+ export function isJSONSerializable<T extends
6
+ | JSONValue
7
+ | Record<string, JSONValue | JSONSerializable<any>>
8
+ | Array<JSONValue | JSONSerializable<any>>
9
+ >(val: unknown): val is JSONSerializable<T> {
10
+ return isObject(val)
11
+ && 'toJSON' in val
12
+ && isFunction(val.toJSON)
13
+ }
14
+
15
+ export function isntJSONSerializable<T>(val: T): val is Exclude<T, JSONSerializable<any>> {
16
+ return !isJSONSerializable(val)
17
+ }
@@ -0,0 +1,20 @@
1
+ import { JSONValue } from 'justypes'
2
+ import { isNull } from '@src/nullish/index.js'
3
+ import { isBoolean } from '@src/boolean/index.js'
4
+ import { isString } from '@src/string/index.js'
5
+ import { isNumber } from '@src/number/index.js'
6
+ import { isArray } from '@src/array/index.js'
7
+ import { isPlainObject } from '@src/object/index.js'
8
+
9
+ export function isJSONValue(val: unknown): val is JSONValue {
10
+ return isNull(val)
11
+ || isBoolean(val)
12
+ || isString(val)
13
+ || isNumber(val)
14
+ || (isArray(val) && val.every(isJSONValue))
15
+ || (isPlainObject(val) && Object.values(val).every(isJSONValue))
16
+ }
17
+
18
+ export function isntJSONValue<T>(val: T): val is Exclude<T, JSONValue> {
19
+ return !isJSONValue(val)
20
+ }
@@ -0,0 +1,3 @@
1
+ export * from './is-null.js'
2
+ export * from './is-undefined.js'
3
+ export * from './is-nullish.js'
@@ -0,0 +1,7 @@
1
+ export function isNull(val: unknown): val is null {
2
+ return val === null
3
+ }
4
+
5
+ export function isntNull<T>(val: T): val is Exclude<T, null> {
6
+ return !isNull(val)
7
+ }
@@ -0,0 +1,12 @@
1
+ import { Nullish } from 'justypes'
2
+ import { isNull } from './is-null.js'
3
+ import { isUndefined } from './is-undefined.js'
4
+
5
+ export function isNullish(val: unknown): val is Nullish {
6
+ return isNull(val)
7
+ || isUndefined(val)
8
+ }
9
+
10
+ export function isntNullish<T>(val: T): val is Exclude<T, Nullish> {
11
+ return !isNullish(val)
12
+ }
@@ -0,0 +1,7 @@
1
+ export function isUndefined(val: unknown): val is undefined {
2
+ return val === undefined
3
+ }
4
+
5
+ export function isntUndefined<T>(val: T): val is Exclude<T, undefined> {
6
+ return !isUndefined(val)
7
+ }
@@ -0,0 +1,5 @@
1
+ export * from './is-bigint.js'
2
+ export * from './is-finite.js'
3
+ export * from './is-infinity.js'
4
+ export * from './is-nan.js'
5
+ export * from './is-number.js'
@@ -0,0 +1,7 @@
1
+ export function isBigInt(val: unknown): val is bigint {
2
+ return typeof val === 'bigint'
3
+ }
4
+
5
+ export function isntBigInt<T>(val: T): val is Exclude<T, bigint> {
6
+ return !isBigInt(val)
7
+ }
@@ -0,0 +1,3 @@
1
+ export function isFinite(val: number): boolean {
2
+ return Number.isFinite(val)
3
+ }
@@ -0,0 +1,7 @@
1
+ export function isPositiveInfinity(val: number): boolean {
2
+ return val === Infinity
3
+ }
4
+
5
+ export function isNegativeInfinity(val: number): boolean {
6
+ return val === -Infinity
7
+ }
@@ -0,0 +1,7 @@
1
+ export function isNaN(val: number): boolean {
2
+ return Number.isNaN(val)
3
+ }
4
+
5
+ export function isntNaN(val: number): boolean {
6
+ return !isNaN(val)
7
+ }
@@ -0,0 +1,7 @@
1
+ export function isNumber(val: unknown): val is number {
2
+ return typeof val === 'number'
3
+ }
4
+
5
+ export function isntNumber<T>(val: T): val is Exclude<T, number> {
6
+ return !isNumber(val)
7
+ }
@@ -0,0 +1,3 @@
1
+ export * from './is-empty-object.js'
2
+ export * from './is-object.js'
3
+ export * from './is-plain-object.js'
@@ -0,0 +1,7 @@
1
+ export function isEmptyObject(val: object): boolean {
2
+ return Object.keys(val).length === 0
3
+ }
4
+
5
+ export function isntEmptyObject(val: object): boolean {
6
+ return Object.keys(val).length !== 0
7
+ }
@@ -0,0 +1,12 @@
1
+ export function isObject(
2
+ val: unknown
3
+ ): val is object & Record<string | symbol | number, unknown> {
4
+ return val !== null
5
+ && typeof val === 'object'
6
+ }
7
+
8
+ export function isntObject<T>(
9
+ val: T
10
+ ): val is Exclude<T, object & Record<string | symbol | number, unknown>> {
11
+ return !isObject(val)
12
+ }
@@ -0,0 +1,15 @@
1
+ import { isPlainObject as isPlainObjectByLodash } from 'lodash-es'
2
+
3
+ export function isPlainObject(
4
+ val: unknown
5
+ ): val is object & Record<string | symbol | number, unknown> {
6
+ // 仅通过`Object.getPrototypeOf(val) === Object.prototype`无法判断Node.js的一些纯对象,
7
+ // 因此在此引入lodash的方法.
8
+ return isPlainObjectByLodash(val)
9
+ }
10
+
11
+ export function isntPlainObject<T>(
12
+ val: T
13
+ ): val is Exclude<T, object & Record<string | symbol | number, unknown>> {
14
+ return !isPlainObject(val)
15
+ }
@@ -0,0 +1,79 @@
1
+ import { Awaitable } from 'justypes'
2
+
3
+ export function pipeAsync<A, B, C, D, E, F, G, H>(
4
+ value: Awaitable<A>
5
+ , ...operators: [
6
+ (value: A) => Awaitable<B>
7
+ , (value: B) => Awaitable<C>
8
+ , (value: C) => Awaitable<D>
9
+ , (value: D) => Awaitable<E>
10
+ , (value: E) => Awaitable<F>
11
+ , (value: F) => Awaitable<G>
12
+ , (value: G) => Awaitable<H>
13
+ ]
14
+ ): Promise<H>
15
+ export function pipeAsync<A, B, C, D, E, F, G>(
16
+ value: Awaitable<A>
17
+ , ...operators: [
18
+ (value: A) => Awaitable<B>
19
+ , (value: B) => Awaitable<C>
20
+ , (value: C) => Awaitable<D>
21
+ , (value: D) => Awaitable<E>
22
+ , (value: E) => Awaitable<F>
23
+ , (value: F) => Awaitable<G>
24
+ ]
25
+ ): Promise<G>
26
+ export function pipeAsync<A, B, C, D, E, F>(
27
+ value: Awaitable<A>
28
+ , ...operators: [
29
+ (value: A) => Awaitable<B>
30
+ , (value: B) => Awaitable<C>
31
+ , (value: C) => Awaitable<D>
32
+ , (value: D) => Awaitable<E>
33
+ , (value: E) => Awaitable<F>
34
+ ]
35
+ ): Promise<F>
36
+ export function pipeAsync<A, B, C, D, E>(
37
+ value: Awaitable<A>
38
+ , ...operators: [
39
+ (value: A) => Awaitable<B>
40
+ , (value: B) => Awaitable<C>
41
+ , (value: C) => Awaitable<D>
42
+ , (value: D) => Awaitable<E>
43
+ ]
44
+ ): Promise<E>
45
+ export function pipeAsync<A, B, C, D>(
46
+ value: Awaitable<A>
47
+ , ...operators: [
48
+ (value: A) => Awaitable<B>
49
+ , (value: B) => Awaitable<C>
50
+ , (value: C) => Awaitable<D>
51
+ ]
52
+ ): Promise<D>
53
+ export function pipeAsync<A, B, C>(
54
+ value: Awaitable<A>
55
+ , ...operators: [
56
+ (value: A) => Awaitable<B>
57
+ , (value: B) => Awaitable<C>
58
+ ]
59
+ ): Promise<C>
60
+ export function pipeAsync<A, B>(
61
+ value: Awaitable<A>
62
+ , ...operators: [
63
+ (value: A) => Awaitable<B>
64
+ ]
65
+ ): Promise<B>
66
+ export function pipeAsync<T, U>(
67
+ value: Awaitable<T>
68
+ , ...operators: Array<(value: any) => Awaitable<unknown>>
69
+ ): Promise<U>
70
+ export async function pipeAsync<T, U>(
71
+ value: Awaitable<T>
72
+ , ...operators: Array<(value: T | U) => T | U>
73
+ ): Promise<U> {
74
+ let result: T | U = await value
75
+ for (const operator of operators) {
76
+ result = await operator(result)
77
+ }
78
+ return result as U
79
+ }
package/src/pipe.ts ADDED
@@ -0,0 +1,77 @@
1
+ export function pipe<A, B, C, D, E, F, G, H>(
2
+ value: A
3
+ , ...operators: [
4
+ (value: A) => B
5
+ , (value: B) => C
6
+ , (value: C) => D
7
+ , (value: D) => E
8
+ , (value: E) => F
9
+ , (value: F) => G
10
+ , (value: G) => H
11
+ ]
12
+ ): H
13
+ export function pipe<A, B, C, D, E, F, G>(
14
+ value: A
15
+ , ...operators: [
16
+ (value: A) => B
17
+ , (value: B) => C
18
+ , (value: C) => D
19
+ , (value: D) => E
20
+ , (value: E) => F
21
+ , (value: F) => G
22
+ ]
23
+ ): G
24
+ export function pipe<A, B, C, D, E, F>(
25
+ value: A
26
+ , ...operators: [
27
+ (value: A) => B
28
+ , (value: B) => C
29
+ , (value: C) => D
30
+ , (value: D) => E
31
+ , (value: E) => F
32
+ ]
33
+ ): F
34
+ export function pipe<A, B, C, D, E>(
35
+ value: A
36
+ , ...operators: [
37
+ (value: A) => B
38
+ , (value: B) => C
39
+ , (value: C) => D
40
+ , (value: D) => E
41
+ ]
42
+ ): E
43
+ export function pipe<A, B, C, D>(
44
+ value: A
45
+ , ...operators: [
46
+ (value: A) => B
47
+ , (value: B) => C
48
+ , (value: C) => D
49
+ ]
50
+ ): D
51
+ export function pipe<A, B, C>(
52
+ value: A
53
+ , ...operators: [
54
+ (value: A) => B
55
+ , (value: B) => C
56
+ ]
57
+ ): C
58
+ export function pipe<A, B>(
59
+ value: A
60
+ , ...operators: [
61
+ (value: A) => B
62
+ ]
63
+ ): B
64
+ export function pipe<T, U>(
65
+ value: T
66
+ , ...operators: Array<(value: any) => unknown>
67
+ ): U
68
+ export function pipe<T, U>(
69
+ value: T
70
+ , ...operators: Array<(value: T | U) => T | U>
71
+ ): U {
72
+ let result: T | U = value
73
+ for (const operator of operators) {
74
+ result = operator(result)
75
+ }
76
+ return result as U
77
+ }
@@ -0,0 +1,8 @@
1
+ export * from './is-char.js'
2
+ export * from './is-string.js'
3
+ export * from './is-url-string.js'
4
+ export * from './remove-blank-lines.js'
5
+ export * from './remove-extra-indents.js'
6
+ export * from './remove-leading-blank-lines.js'
7
+ export * from './remove-trailing-blank-lines.js'
8
+ export * from './to-string.js'
@@ -0,0 +1,10 @@
1
+ import { isString } from './is-string.js'
2
+
3
+ export function isChar(val: unknown): val is string {
4
+ return isString(val)
5
+ && val.length === 1
6
+ }
7
+
8
+ export function isntChar(val: unknown): boolean {
9
+ return !isChar(val)
10
+ }
@@ -0,0 +1,7 @@
1
+ export function isString(val: unknown): val is string {
2
+ return typeof val === 'string'
3
+ }
4
+
5
+ export function isntString<T>(val: T): val is Exclude<T, string> {
6
+ return !isString(val)
7
+ }
@@ -0,0 +1,12 @@
1
+ export function isURLString(text: string): boolean {
2
+ try {
3
+ new URL(text)
4
+ return true
5
+ } catch {
6
+ return false
7
+ }
8
+ }
9
+
10
+ export function isntURLString(text: string): boolean {
11
+ return !isURLString(text)
12
+ }
@@ -0,0 +1,8 @@
1
+ import { isntBlankLine } from './utils.js'
2
+
3
+ export function removeBlankLines(text: string): string {
4
+ return text
5
+ .split('\n')
6
+ .filter(line => isntBlankLine(line))
7
+ .join('\n')
8
+ }
@@ -0,0 +1,29 @@
1
+ import { isntBlankLine } from './utils.js'
2
+
3
+ export function removeExtraIndents(
4
+ text: string
5
+ , { ignoreBlankLines = false }: {
6
+ ignoreBlankLines?: boolean
7
+ } = {}
8
+ ): string {
9
+ const lines = text.split('\n')
10
+ const commonIndentLength = lines
11
+ .filter(line => ignoreBlankLines ? isntBlankLine(line) : true)
12
+ .reduce(
13
+ (acc, cur) => {
14
+ const indent = cur.match(/^(\s+)/)
15
+ if (indent) {
16
+ return Math.min(acc, indent[1].length)
17
+ } else {
18
+ return 0
19
+ }
20
+ }
21
+ , Infinity
22
+ )
23
+ if (commonIndentLength === 0 || commonIndentLength === Infinity) {
24
+ return text
25
+ }
26
+
27
+ const newLines = lines.map(x => x.slice(commonIndentLength))
28
+ return newLines.join('\n')
29
+ }
@@ -0,0 +1,20 @@
1
+ import { isBlankLine } from './utils.js'
2
+
3
+ export function removeLeadingBlankLines(
4
+ text: string
5
+ , maxRemovals: number = Infinity
6
+ ): string {
7
+ const lines = text.split('\n')
8
+
9
+ let removals = 0
10
+ while (
11
+ removals < maxRemovals &&
12
+ lines.length > 0 &&
13
+ isBlankLine(lines[0])
14
+ ) {
15
+ lines.shift()
16
+ removals++
17
+ }
18
+
19
+ return lines.join('\n')
20
+ }
@@ -0,0 +1,20 @@
1
+ import { isBlankLine } from './utils.js'
2
+
3
+ export function removeTrailingBlankLines(
4
+ text: string
5
+ , maxRemovals: number = Infinity
6
+ ): string {
7
+ const lines = text.split('\n')
8
+
9
+ let removals = 0
10
+ while (
11
+ removals < maxRemovals &&
12
+ lines.length > 0 &&
13
+ isBlankLine(lines[lines.length - 1])
14
+ ) {
15
+ lines.pop()
16
+ removals++
17
+ }
18
+
19
+ return lines.join('\n')
20
+ }
@@ -0,0 +1,3 @@
1
+ export function toString(val: unknown): string {
2
+ return `${val}`
3
+ }
@@ -0,0 +1,7 @@
1
+ export function isBlankLine(line: string): boolean {
2
+ return line.trim() === ''
3
+ }
4
+
5
+ export function isntBlankLine(line: string): boolean {
6
+ return !isBlankLine(line)
7
+ }