@fuzdev/fuz_util 0.42.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 (135) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +83 -0
  3. package/dist/array.d.ts +15 -0
  4. package/dist/array.d.ts.map +1 -0
  5. package/dist/array.js +25 -0
  6. package/dist/async.d.ts +62 -0
  7. package/dist/async.d.ts.map +1 -0
  8. package/dist/async.js +147 -0
  9. package/dist/colors.d.ts +41 -0
  10. package/dist/colors.d.ts.map +1 -0
  11. package/dist/colors.js +106 -0
  12. package/dist/counter.d.ts +7 -0
  13. package/dist/counter.d.ts.map +1 -0
  14. package/dist/counter.js +7 -0
  15. package/dist/deep_equal.d.ts +18 -0
  16. package/dist/deep_equal.d.ts.map +1 -0
  17. package/dist/deep_equal.js +152 -0
  18. package/dist/dom.d.ts +35 -0
  19. package/dist/dom.d.ts.map +1 -0
  20. package/dist/dom.js +95 -0
  21. package/dist/error.d.ts +15 -0
  22. package/dist/error.d.ts.map +1 -0
  23. package/dist/error.js +18 -0
  24. package/dist/fetch.d.ts +81 -0
  25. package/dist/fetch.d.ts.map +1 -0
  26. package/dist/fetch.js +162 -0
  27. package/dist/fs.d.ts +34 -0
  28. package/dist/fs.d.ts.map +1 -0
  29. package/dist/fs.js +73 -0
  30. package/dist/function.d.ts +27 -0
  31. package/dist/function.d.ts.map +1 -0
  32. package/dist/function.js +21 -0
  33. package/dist/git.d.ts +132 -0
  34. package/dist/git.d.ts.map +1 -0
  35. package/dist/git.js +288 -0
  36. package/dist/id.d.ts +18 -0
  37. package/dist/id.d.ts.map +1 -0
  38. package/dist/id.js +18 -0
  39. package/dist/iterator.d.ts +5 -0
  40. package/dist/iterator.d.ts.map +1 -0
  41. package/dist/iterator.js +9 -0
  42. package/dist/json.d.ts +30 -0
  43. package/dist/json.d.ts.map +1 -0
  44. package/dist/json.js +44 -0
  45. package/dist/library_json.d.ts +42 -0
  46. package/dist/library_json.d.ts.map +1 -0
  47. package/dist/library_json.js +76 -0
  48. package/dist/log.d.ts +188 -0
  49. package/dist/log.d.ts.map +1 -0
  50. package/dist/log.js +393 -0
  51. package/dist/map.d.ts +12 -0
  52. package/dist/map.d.ts.map +1 -0
  53. package/dist/map.js +14 -0
  54. package/dist/maths.d.ts +85 -0
  55. package/dist/maths.d.ts.map +1 -0
  56. package/dist/maths.js +87 -0
  57. package/dist/object.d.ts +46 -0
  58. package/dist/object.d.ts.map +1 -0
  59. package/dist/object.js +89 -0
  60. package/dist/package_json.d.ts +90 -0
  61. package/dist/package_json.d.ts.map +1 -0
  62. package/dist/package_json.js +112 -0
  63. package/dist/path.d.ts +63 -0
  64. package/dist/path.d.ts.map +1 -0
  65. package/dist/path.js +83 -0
  66. package/dist/print.d.ts +52 -0
  67. package/dist/print.d.ts.map +1 -0
  68. package/dist/print.js +89 -0
  69. package/dist/process.d.ts +77 -0
  70. package/dist/process.d.ts.map +1 -0
  71. package/dist/process.js +148 -0
  72. package/dist/random.d.ts +25 -0
  73. package/dist/random.d.ts.map +1 -0
  74. package/dist/random.js +35 -0
  75. package/dist/random_alea.d.ts +23 -0
  76. package/dist/random_alea.d.ts.map +1 -0
  77. package/dist/random_alea.js +95 -0
  78. package/dist/regexp.d.ts +12 -0
  79. package/dist/regexp.d.ts.map +1 -0
  80. package/dist/regexp.js +16 -0
  81. package/dist/result.d.ts +64 -0
  82. package/dist/result.d.ts.map +1 -0
  83. package/dist/result.js +48 -0
  84. package/dist/source_json.d.ts +375 -0
  85. package/dist/source_json.d.ts.map +1 -0
  86. package/dist/source_json.js +189 -0
  87. package/dist/string.d.ts +51 -0
  88. package/dist/string.d.ts.map +1 -0
  89. package/dist/string.js +92 -0
  90. package/dist/throttle.d.ts +26 -0
  91. package/dist/throttle.d.ts.map +1 -0
  92. package/dist/throttle.js +53 -0
  93. package/dist/timings.d.ts +33 -0
  94. package/dist/timings.d.ts.map +1 -0
  95. package/dist/timings.js +75 -0
  96. package/dist/types.d.ts +77 -0
  97. package/dist/types.d.ts.map +1 -0
  98. package/dist/types.js +10 -0
  99. package/dist/url.d.ts +10 -0
  100. package/dist/url.d.ts.map +1 -0
  101. package/dist/url.js +8 -0
  102. package/package.json +125 -0
  103. package/src/lib/array.ts +30 -0
  104. package/src/lib/async.ts +182 -0
  105. package/src/lib/colors.ts +132 -0
  106. package/src/lib/counter.ts +11 -0
  107. package/src/lib/deep_equal.ts +155 -0
  108. package/src/lib/dom.ts +108 -0
  109. package/src/lib/error.ts +22 -0
  110. package/src/lib/fetch.ts +231 -0
  111. package/src/lib/fs.ts +128 -0
  112. package/src/lib/function.ts +32 -0
  113. package/src/lib/git.ts +390 -0
  114. package/src/lib/id.ts +30 -0
  115. package/src/lib/iterator.ts +8 -0
  116. package/src/lib/json.ts +61 -0
  117. package/src/lib/library_json.ts +122 -0
  118. package/src/lib/log.ts +469 -0
  119. package/src/lib/map.ts +18 -0
  120. package/src/lib/maths.ts +91 -0
  121. package/src/lib/object.ts +110 -0
  122. package/src/lib/package_json.ts +135 -0
  123. package/src/lib/path.ts +137 -0
  124. package/src/lib/print.ts +111 -0
  125. package/src/lib/process.ts +207 -0
  126. package/src/lib/random.ts +48 -0
  127. package/src/lib/random_alea.ts +107 -0
  128. package/src/lib/regexp.ts +17 -0
  129. package/src/lib/result.ts +67 -0
  130. package/src/lib/source_json.ts +209 -0
  131. package/src/lib/string.ts +99 -0
  132. package/src/lib/throttle.ts +70 -0
  133. package/src/lib/timings.ts +93 -0
  134. package/src/lib/types.ts +99 -0
  135. package/src/lib/url.ts +14 -0
@@ -0,0 +1,99 @@
1
+ /*
2
+
3
+ These are convenient global types that can be used in both Felt and user code.
4
+ It probably makes more sense to give this file a `.d.ts` extension,
5
+ but that complicates the build because TypeScript does not output them.
6
+
7
+ TODO probably make this `.d.ts` when we make a proper build process
8
+
9
+ */
10
+
11
+ export type ClassConstructor<TInstance, TArgs extends Array<any> = Array<any>> = new (
12
+ ...args: TArgs
13
+ ) => TInstance;
14
+
15
+ export type OmitStrict<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
16
+
17
+ /**
18
+ * Like `Pick` but works for type unions.
19
+ *
20
+ * @see https://stackoverflow.com/questions/75271774/creating-a-type-using-pick-with-a-type-that-is-defined-as-a-union-of-types
21
+ * @see https://stackoverflow.com/users/5770132/oblosys
22
+ */
23
+ export type PickUnion<T, K extends KeyofUnion<T>> = T extends unknown
24
+ ? K & keyof T extends never // eslint-disable-line @typescript-eslint/no-redundant-type-constituents
25
+ ? never
26
+ : Pick<T, K & keyof T> // eslint-disable-line @typescript-eslint/no-redundant-type-constituents
27
+ : never;
28
+
29
+ /**
30
+ * Like `keyof` but works for type unions.
31
+ *
32
+ * @see https://stackoverflow.com/questions/75271774/creating-a-type-using-pick-with-a-type-that-is-defined-as-a-union-of-types
33
+ * @see https://stackoverflow.com/users/5770132/oblosys
34
+ */
35
+ export type KeyofUnion<T> = T extends unknown ? keyof T : never;
36
+
37
+ // these were thrown together quickly - is there a better way to do this?
38
+ // there are probably better names for them!
39
+ // see `Required`, `Exclude` and `Extract` for possible leads for improvements
40
+ export type PartialExcept<T, K extends keyof T> = {[P in K]: T[P]} & {
41
+ [P in Exclude<keyof T, K>]?: T[P];
42
+ };
43
+ export type PartialOnly<T, K extends keyof T> = {[P in K]?: T[P]} & {
44
+ [P in Exclude<keyof T, K>]: T[P];
45
+ };
46
+
47
+ export type PartialValues<T> = {
48
+ [P in keyof T]: Partial<T[P]>;
49
+ };
50
+
51
+ export type Assignable<T, K extends keyof T = keyof T> = {
52
+ -readonly [P in K]: T[P];
53
+ };
54
+
55
+ export type Defined<T> = T extends undefined ? never : T;
56
+ export type NotNull<T> = T extends null ? never : T;
57
+
58
+ export type ArrayElement<T> = T extends ReadonlyArray<infer U> ? U : never;
59
+
60
+ /**
61
+ * The `Flavored` and `Branded` type helpers add varying degrees of nominal typing to other types.
62
+ * This is especially useful with primitives like strings and numbers.
63
+ *
64
+ * @see https://spin.atomicobject.com/typescript-flexible-nominal-typing/
65
+ *
66
+ * `Flavored` is a looser form of `Branded` that trades
67
+ * explicitness and a little safety in some cases for ergonomics.
68
+ * With `Flavored` you don't need to cast unflavored types:
69
+ *
70
+ * ```ts
71
+ * type Email = Flavored<string, 'Email'>;
72
+ * const email1: Email = 'foo'; // ok
73
+ * type Address = Flavored<string, 'Address'>;
74
+ * const email2: Email = 'foo' as Address; // error!
75
+ * ```
76
+ *
77
+ * `Branded` requires casting:
78
+ *
79
+ * ```ts
80
+ * type PhoneNumber = Branded<string, 'PhoneNumber'>;
81
+ * const phone1: PhoneNumber = 'foo'; // error!
82
+ * const phone2: PhoneNumber = 'foo' as PhoneNumber; // ok
83
+ * ```
84
+ *
85
+ * See also Zod's `.brand` schema helper:
86
+ *
87
+ * @see https://github.com/colinhacks/zod#brand
88
+ *
89
+ */
90
+ export type Flavored<TValue, TName> = TValue & Flavor<TName>;
91
+ declare const FlavoredSymbol: unique symbol;
92
+ export interface Flavor<T> {
93
+ readonly [FlavoredSymbol]?: T;
94
+ }
95
+ export type Branded<TValue, TName> = TValue & Brand<TName>;
96
+ declare const BrandedSymbol: unique symbol;
97
+ export interface Brand<T> {
98
+ readonly [BrandedSymbol]: T;
99
+ }
package/src/lib/url.ts ADDED
@@ -0,0 +1,14 @@
1
+ import {z} from 'zod';
2
+
3
+ import {strip_end, strip_start} from './string.js';
4
+ import type {Flavored} from './types.js';
5
+
6
+ /**
7
+ * Formats a URL by removing 'https://', 'www.', and trailing slashes.
8
+ * Notably it does not remove 'http://', so the user can see that it's insecure.
9
+ */
10
+ export const format_url = (url: string): string =>
11
+ strip_end(strip_start(strip_start(url, 'https://'), 'www.'), '/');
12
+
13
+ export const Url = z.url();
14
+ export type Url = Flavored<z.infer<typeof Url>, 'Url'>; // TODO brand is too annoying to use, but this doesn't work for schema composition