@gershy/clearing 0.0.7 → 0.0.9

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.
package/cmp/cjs/main.js CHANGED
@@ -9,7 +9,7 @@ const applyClearing = (() => {
9
9
  return;
10
10
  global[memSym] = true;
11
11
  const symNames = [
12
- // <SYMBOLS>
12
+ // <SYMBOLS> :: definitions :: /[']([a-zA-Z0-9]+)[']/
13
13
  'add',
14
14
  'allArr',
15
15
  'allObj',
package/cmp/mjs/main.js CHANGED
@@ -7,7 +7,7 @@ const applyClearing = (() => {
7
7
  return;
8
8
  global[memSym] = true;
9
9
  const symNames = [
10
- // <SYMBOLS>
10
+ // <SYMBOLS> :: definitions :: /[']([a-zA-Z0-9]+)[']/
11
11
  'add',
12
12
  'allArr',
13
13
  'allObj',
@@ -1,8 +1,8 @@
1
1
  declare global {
2
2
 
3
3
  // Util
4
- type Fn<A=any[], T=any> = (...args: A) => T;
5
- type Obj<V = any> = { [typeof iden]: 'obj' } & { [k: string]: V };
4
+ type Fn<A extends any[] = any[], T = any> = (...args: A) => T;
5
+ type Obj<V = any> = { [k: string]: V };
6
6
 
7
7
  // Differentiate between "map" and "rec" ("record") - maps have arbitrary keys; recs have fixed keys
8
8
  type ObjMode<O extends { [K: string]: any }> = O extends { [K in infer KK]: any } ? (string extends KK ? 'map' : 'rec') : never;
@@ -12,15 +12,15 @@ declare global {
12
12
  type Itr<O extends Obj> = Iterable<[ ObjKeys<O>, ObjVals<O> ]>;
13
13
  type Json = null | boolean | number | string | Json[] | { [K: string]: Json };
14
14
  type Skip = undefined;
15
- type SkipNever<V> = V extends Skip ? Skip extends V ? never : V : V; // 0 extends (1 & T) ? any : V extends Skip ? Skip extends V ? never : V : V; // Only thing that doesn't work is `SkipNever<any>`
15
+ type SkipNever<V> = V extends Skip ? Skip extends V ? never : V : V;
16
16
  type UGH = any; // Use when necessary to escape typing because typescript has failed us
17
17
 
18
18
  type Dive<O extends Obj, K extends readonly string[], D = undefined> =
19
- K extends [ infer K0, ...infer KM ]
19
+ K extends [ infer K0 extends string, ...infer KM extends string[] ]
20
20
  ? K0 extends keyof O
21
21
  ? (ObjMode<O> extends 'map' ? D : never) | Dive<O[K0], KM, D>
22
22
  : D
23
- : O; // If `K` doesn't extend an array with a single item, it's an empty array - so use the current value
23
+ : O;
24
24
 
25
25
  type CharSet = {
26
26
  str: string,
@@ -41,7 +41,7 @@ declare global {
41
41
  (i: unknown, fn: FunctionConstructor): i is Fn,
42
42
  (i: unknown, fn: SymbolConstructor): i is symbol,
43
43
  <T>(i: unknown, prm: PromiseConstructor): i is Promise<T>,
44
- <C>(i: unknown, cls: C): i is InstanceType<C>
44
+ <C extends abstract new (...args: any) => any>(i: unknown, cls: C): i is InstanceType<C>
45
45
  };
46
46
  const clearing: {
47
47
 
@@ -63,7 +63,7 @@ declare global {
63
63
 
64
64
  };
65
65
 
66
- // <SYMBOLS>
66
+ // <SYMBOLS> :: declarations :: /const ([a-zA-Z0-9]+)[ ]*[:][ ]*unique symbol;/
67
67
  const add: unique symbol;
68
68
  const allArr: unique symbol;
69
69
  const allObj: unique symbol;
@@ -114,264 +114,184 @@ declare global {
114
114
  const upper: unique symbol;
115
115
  // </SYMBOLS>
116
116
 
117
- // Typing only
118
- const iden: unique symbol; // associate types with their *direct* constructor
119
-
120
- interface JSON { parse: (val: Buffer) => any };
121
-
122
- interface ProtoWithSymbols {
123
- [add]: undefined
124
- [at]: undefined
125
- [assert]: undefined
126
- [bind]: undefined
127
- [count]: undefined
128
- [cut]: undefined
129
- [dive]: undefined
130
- [empty]: undefined
131
- [fire]: undefined
132
- [group]: undefined
133
- [has]: undefined
134
- [hasHead]: undefined
135
- [hasTail]: undefined
136
- [indent]: undefined
137
- [limn]: undefined
138
- [lower]: undefined
139
- [mod]: undefined
140
- [map]: undefined
141
- [mapk]: undefined
142
- [merge]: undefined
143
- [padHead]: undefined
144
- [padTail]: undefined
145
- [rem]: undefined
146
- [find]: undefined
147
- [slash]: undefined
148
- [slice]: undefined
149
- [suppress]: undefined
150
- [toArr]: undefined
151
- [toNum]: undefined
152
- [toObj]: undefined
153
- [toStr]: undefined
154
- [upper]: undefined
117
+ // Adding symbol properties to Object.prototype will cause typescript to think these properties
118
+ // are also available for extending types, e.g. Array - to avoid this we merge in an object which
119
+ // defines every symbol as `undefined`!
120
+ type SymbolsProto = {
121
+ // <SYMBOLS> :: SymbolsProto :: /\[([a-zA-Z0-9]+)\][ ]*[:][ ]*undefined
122
+ [add]: undefined,
123
+ [allArr]: undefined,
124
+ [allObj]: undefined,
125
+ [at]: undefined,
126
+ [assert]: undefined,
127
+ [base32]: undefined,
128
+ [base36]: undefined,
129
+ [base62]: undefined,
130
+ [base64Std]: undefined,
131
+ [base64Url]: undefined,
132
+ [baseline]: undefined,
133
+ [bind]: undefined,
134
+ [bits]: undefined,
135
+ [char]: undefined,
136
+ [charset]: undefined,
137
+ [code]: undefined,
138
+ [count]: undefined,
139
+ [cut]: undefined,
140
+ [dive]: undefined,
141
+ [empty]: undefined,
142
+ [find]: undefined,
143
+ [fire]: undefined,
144
+ [group]: undefined,
145
+ [has]: undefined,
146
+ [hasHead]: undefined,
147
+ [hasTail]: undefined,
148
+ [indent]: undefined,
149
+ [int32]: undefined,
150
+ [int64]: undefined,
151
+ [isInt]: undefined,
152
+ [later]: undefined,
153
+ [limn]: undefined,
154
+ [lower]: undefined,
155
+ [map]: undefined,
156
+ [mapk]: undefined,
157
+ [merge]: undefined,
158
+ [mod]: undefined,
159
+ [padHead]: undefined,
160
+ [padTail]: undefined,
161
+ [rem]: undefined,
162
+ [slash]: undefined,
163
+ [slice]: undefined,
164
+ [suppress]: undefined,
165
+ [toArr]: undefined,
166
+ [toNum]: undefined,
167
+ [toObj]: undefined,
168
+ [toStr]: undefined,
169
+ [upper]: undefined
170
+ // </SYMBOLS>
155
171
  };
156
172
 
157
173
  interface ErrorConstructor {
158
174
  [assert]: <V = any>(args: V, fn: (args: V) => boolean) => void
159
- };
160
- interface Error extends ProtoWithSymbols {
175
+ }
176
+ interface Error extends SymbolsProto {
161
177
  [mod]: (props: { [K: string]: any }) => Error,
162
178
  [fire]: (props?: { [K: string]: any }) => never,
163
179
  [suppress]: () => Error,
164
-
165
- [limn]: (seen?: Map) => (Obj<Json> & {
180
+ [limn]: (seen?: Map<any, any>) => (Obj<Json> & {
166
181
  form: string,
167
182
  msg: string,
168
183
  trace: string[],
169
184
  cause: null | ReturnType<Error[typeof limn]>
170
185
  })
171
- };
186
+ }
172
187
 
173
- interface ArrayConstructor {};
174
- interface Array<T> extends ProtoWithSymbols {
175
- [iden]: 'arr',
188
+ interface ArrayConstructor {}
189
+ interface Array<T> extends SymbolsProto {
176
190
  [has]: (val: unknown) => boolean,
177
- [map]: {
178
- <
179
- Fn extends (v: T, i: number) => any
180
- >(
181
- fn: Fn
182
- ): Exclude<ReturnType<Fn>, Skip>[]
183
- },
184
- [add]: <TT extends T>(val: TT) => TT,
185
- [rem]: <TT extends T>(val: TT) => void,
191
+ [map]: <Fn extends (v: T, i: number) => any>(fn: Fn) => Exclude<ReturnType<Fn>, Skip>[],
192
+ [add]: <TT extends T>(val: TT) => TT,
193
+ [rem]: <TT extends T>(val: TT) => void,
186
194
  [count]: () => number,
187
- [empty]: (this: any[]) => this is never[],
188
- [toObj]: <Fn extends (v: T, n: number) => Skip | readonly [string, any], R = Exclude<ReturnType<Fn>, Skip>>(fn: Fn) => { [K in R[0]]: R[1] },
189
- [find]: (fn: (val: T, n: number) => any) => ({ found: true, val: T, ind: number } | { found: false, val: null, ind: null }),
195
+ [empty]: () => boolean,
196
+ [toObj]: <R extends readonly [string, any]>(fn: (v: T, n: number) => Skip | R) => { [K: string]: any },
197
+ [find]: (fn: (val: T, n: number) => any) => ({ found: true, val: T, ind: number } | { found: false, val: null, ind: null }),
190
198
  [group]: <G extends string>(fn: (v: T) => Skip | G) => { [K in G]?: T[] }
191
- };
199
+ }
192
200
 
193
- interface FunctionConstructor {};
194
- interface Function extends ProtoWithSymbols {
195
- [iden]: 'fnc',
196
- [bind]: {
197
- <
198
- Fn extends (...args: any[]) => any,
199
- To
200
- >(
201
- this: Fn,
202
- to: To
203
- ): ((...args: Parameters<Fn> extends [ infer A0, ...infer AM ] ? AM : never) => ReturnType<Fn>)
204
- }
205
- };
201
+ interface FunctionConstructor {}
202
+ interface Function extends SymbolsProto {
203
+ [bind]: <Fn extends (...args: any[]) => any, To>(this: Fn, to: To) => ((...args: Parameters<Fn> extends [ infer A0, ...infer AM ] ? AM : never) => ReturnType<Fn>)
204
+ }
206
205
 
207
206
  interface NumberConstructor {
208
207
  [int32]: number,
209
208
  [int64]: number
210
- };
211
- interface Number extends ProtoWithSymbols {
212
- [iden]: 'num',
209
+ }
210
+ interface Number extends SymbolsProto {
213
211
  [char]: () => string,
214
212
  [isInt]: () => boolean,
215
213
  [toStr]: (str: string | CharSet, len?: number) => string,
216
214
  [toArr]: <T>(fn: (n: number) => T) => T[],
217
- [toObj]: <Fn extends (n: number) => Skip | readonly [string, any], R = Exclude<ReturnType<Fn>, Skip>>(fn: Fn) => { [K in R[0]]: R[1] },
215
+ [toObj]: <R extends readonly [string, any]>(fn: (n: number) => Skip | R) => { [K: string]: any },
218
216
  [bits]: () => Generator<number>,
219
- [Symbol.iterator]: () => Generator<number>,
220
- [map]: undefined // Prevent calling `map` on `Number` - use `toStr` instead!
221
- };
217
+ [Symbol.iterator]: () => Generator<number>
218
+ }
222
219
 
223
- interface BigIntConstructor {};
224
- interface BigInt extends ProtoWithSymbols {
220
+ interface BigIntConstructor {}
221
+ interface BigInt extends SymbolsProto {
225
222
  [toStr]: (str: string | CharSet, len?: number) => string
226
- };
223
+ }
227
224
 
228
- interface ObjectConstructor {};
229
- interface Object extends ProtoWithSymbols {
230
- [iden]: 'obj',
231
- [empty]: {
232
- <
233
- O extends Obj
234
- >(
235
- this: O
236
- ): ObjMode<O> extends 'rec'
237
- ? never & '<rec>.empty is invalid'
238
- : this is Obj<never>,
239
- },
240
-
241
- [at]: {
242
- <
243
- O extends Obj,
244
- K extends string | string[],
245
- D extends any = undefined
246
- >(
247
- this: O,
248
- k: K,
249
- def?: D
250
- ): Dive<O, K extends string[] ? K : [ K ], D>,
251
- },
252
- [has]: {
253
- // <O extends Obj>(this: O, k: string): boolean,
254
- // <O extends Obj>(this: O, k: string): k is (ObjMode<O> extends 'rec' ? keyof O : any),
255
- // <O extends Obj>(this: O, k: string): k is (ObjMode<O> extends 'rec' ? keyof O : any),
256
-
257
- // <O extends Obj, K extends keyof any>(this: O, k: K): this is { [K]: O[keyof O] }
258
-
259
- <O extends Obj>(this: O, k: unknown): k is keyof O
260
-
261
- },
262
- [map]: {
263
- <
264
- O extends Obj,
265
- Fn extends (v: ObjVals<O>, k: ObjKeys<O>) => any
266
- >(
267
- this: O,
268
- fn: Fn
269
- ): { [K in keyof O]: Exclude<ReturnType<Fn>, Skip> },
270
- },
271
- [mapk]: {
272
- <
273
- O extends Obj,
274
- Fn extends (v: O[keyof O], k: ObjKeys<O>) => undefined | [ string, any ]
275
- >(
276
- this: O,
277
- fn: Fn
278
- ): { [K in Exclude<ReturnType<Fn>, Skip>[0]]: Exclude<ReturnType<Fn>, Skip>[1] },
279
- },
280
- [merge]: {
281
- <
282
- O1 extends Obj,
283
- O2 extends Obj
284
- >(
285
- this: readonly O1,
286
- val: readonly O2
287
- ): O1 & O2,
288
- },
289
- [slice]: {
290
- <O extends Obj, K extends readonly (keyof O)[]>(this: O, keys: K): { [P in K[number]]: SkipNever<O[P]> }
291
- },
292
- [slash]: {
293
- <
294
- O extends Obj,
295
- T extends readonly (keyof O)[]
296
- >(
297
- this: O,
298
- keys: T
299
- ): { [K in keyof O as Exclude<keyof O, T[number]>]: O[K] }
300
- },
301
- [toArr]: {
302
- <
303
- O extends Obj,
304
- Fn extends (v: O[keyof O], k: ObjKeys<O>) => any
305
- >(
306
- this: O,
307
- fn: Fn
308
- ): Exclude<ReturnType<Fn>, Skip>[],
309
- },
310
- [count]: {
311
- <O extends Obj>(this: O): number,
312
- },
313
- [group]: {
314
- <O extends Obj, G extends string>(fn: (v: T) => Skip | G): { [K in G]?: Optional<O> }
315
- },
316
- [Symbol.iterator]: {
317
- <O extends Obj>(this: O): Iterator<[ ObjKeys<O>, ObjVals<O> ]>
318
- },
319
- $$inspect: <V>(this: V) => { v: V }
320
- };
225
+ interface ObjectConstructor {}
226
+ interface Object {
227
+ [empty]: () => boolean,
228
+ [at]: <O extends Obj, K extends string | string[], D extends any = undefined>(this: O, k: K, def?: D) => Dive<O, K extends string[] ? K : [ K ], D>,
229
+ [has]: <O extends Obj>(this: O, k: unknown) => k is keyof O,
230
+ [map]: <O extends Obj, Fn extends (v: ObjVals<O>, k: ObjKeys<O>) => any>(this: O, fn: Fn) => { [K in keyof O]: Exclude<ReturnType<Fn>, Skip> },
231
+ [mapk]: <O extends Obj, Fn extends (v: O[keyof O], k: ObjKeys<O>) => undefined | [ string, any ]>(this: O, fn: Fn) => { [K: string]: any },
232
+ [merge]: <O1 extends Obj, O2 extends Obj>(this: O1, val: O2) => O1 & O2,
233
+ [slice]: <O extends Obj, K extends readonly (keyof O)[]>(this: O, keys: K) => { [P in K[number]]: SkipNever<O[P]> },
234
+ [slash]: <O extends Obj, T extends readonly (keyof O)[]>(this: O, keys: T) => { [K in keyof O as Exclude<keyof O, T[number]>]: O[K] },
235
+ [toArr]: <O extends Obj, Fn extends (v: O[keyof O], k: ObjKeys<O>) => any>(this: O, fn: Fn) => Exclude<ReturnType<Fn>, Skip>[],
236
+ [count]: () => number,
237
+ [group]: <O extends Obj, G extends string>(this: O, fn: (v: O[keyof O]) => Skip | G) => { [K in G]?: Partial<O> },
238
+ [Symbol.iterator]: <O extends Obj>(this: O) => Iterator<[ ObjKeys<O>, ObjVals<O> ]>
239
+ }
321
240
 
322
241
  interface PromiseConstructor {
323
242
  [allArr]: PromiseConstructor['all'],
324
- [allObj]: <O extends { [K: keyof any]: Promise<any> }>(obj: O) => { [K in keyof O]: Awaited<O[K]> },
243
+ [allObj]: <O extends { [K: string]: Promise<any> }>(obj: O) => Promise<{ [K in keyof O]: Awaited<O[K]> }>,
325
244
  [later]: <T=void>() => PromiseLater<T>
326
- };
327
- interface Promise<T> {};
328
- interface PromiseLater<T=void> extends Promise<T>, ProtoWithSymbols {
245
+ }
246
+ interface Promise<T> {}
247
+ interface PromiseLater<T=void> extends Promise<T> {
329
248
  resolve: T extends void ? () => void : (v: T) => void,
330
249
  reject: (err: any) => void
331
- };
250
+ }
332
251
 
333
- interface SetConstructor {};
334
- interface Set<T> extends ProtoWithSymbols {
252
+ interface SetConstructor {}
253
+ interface Set<T> extends SymbolsProto {
335
254
  [count]: () => number,
336
255
  [empty]: () => boolean,
337
- [find]: (fn: (val: T) => any) => ({ found: true, val: T } | { found: false, val: null }),
338
- [map]: <V>(fn: (val: T, ind: number) => V) => Exclude<V, Skip>[],
256
+ [find]: (fn: (val: T) => any) => ({ found: true, val: T } | { found: false, val: null }),
257
+ [map]: <V>(fn: (val: T, ind: number) => V) => Exclude<V, Skip>[],
339
258
  [toArr]: <V>(fn: (val: T, ind: number) => V) => Exclude<V, Skip>[],
340
- [toObj]: <Fn extends (val: T) => Skip | readonly [string, any], R = Exclude<ReturnType<Fn>, Skip>>(fn: Fn) => { [K in R[0]]: R[1] },
341
- [rem]: (val: T) => void
342
- };
259
+ [toObj]: <R extends readonly [string, any]>(fn: (val: T) => Skip | R) => { [K: string]: any },
260
+ [rem]: (val: T) => void
261
+ }
343
262
 
344
- interface MapConstructor {};
345
- interface Map<K, V> extends ProtoWithSymbols {
346
- [add]: (k: K, v: V) => void,
263
+ interface MapConstructor {}
264
+ interface Map<K, V> extends SymbolsProto {
265
+ [add]: (k: K, v: V) => void,
347
266
  [count]: () => number,
348
267
  [empty]: () => boolean,
349
- [find]: (fn: (val: V, key: K) => any) => ({ found: true, val: V, key: K } | { found: false, val: null, key: null }),
350
- [map]: <T>(fn: (val: V, key: K) => Skip | readonly [string, any]) => { [Key: string]: any },
268
+ [find]: (fn: (val: V, key: K) => any) => ({ found: true, val: V, key: K } | { found: false, val: null, key: null }),
269
+ [map]: <T>(fn: (val: V, key: K) => Skip | readonly [string, any]) => { [Key: string]: any },
351
270
  [toArr]: <T>(fn: (val: V, key: K) => T) => Exclude<T, Skip>[],
352
271
  [toObj]: <T>(fn: (val: V, key: K) => Skip | readonly [string, any]) => { [Key: string]: any },
353
- [rem]: (key: K) => void
354
- };
272
+ [rem]: (key: K) => void
273
+ }
355
274
 
356
275
  interface StringConstructor {
357
276
  [base32]: string,
358
277
  [base36]: string,
359
278
  [base62]: string,
360
- [base64]: string,
279
+ [base64Url]: string,
361
280
  [base64Std]: string,
362
281
  [baseline]: (str: string) => string,
363
282
  [charset]: (str: string) => CharSet,
364
- };
365
- interface String extends ProtoWithSymbols {
366
- [count](): number,
367
- [has](s: string): boolean,
368
- [padHead](n: number, s?: string): string,
369
- [padTail](n: number, s?: string): string,
283
+ }
284
+ interface String extends SymbolsProto {
285
+ [code]: (ind?: number) => number,
286
+ [count]: () => number,
287
+ [has]: (s: string) => boolean,
288
+ [padHead]: (n: number, s?: string) => string,
289
+ [padTail]: (n: number, s?: string) => string,
370
290
  [toNum]: (chrs: string | CharSet) => bigint,
371
- [hasHead]<H extends string>(this: string, head: H): this is `${H}${string}`,
372
- [hasTail]<T extends string>(this: string, tail: T): this is `${string}${T}`,
373
- [upper]<S extends string>(this: S): Uppercase<S>,
374
- [lower]<S extends string>(this: S): Lowercase<S>,
291
+ [hasHead]: <H extends string>(this: string, head: H) => this is `${H}${string}`,
292
+ [hasTail]: <T extends string>(this: string, tail: T) => this is `${string}${T}`,
293
+ [upper]: <S extends string>(this: S) => Uppercase<S>,
294
+ [lower]: <S extends string>(this: S) => Lowercase<S>,
375
295
  [cut]: {
376
296
  (str: string, cuts: 1): [ string, string ],
377
297
  (str: string, cuts: 2): [ string, string, string ],
@@ -383,7 +303,7 @@ declare global {
383
303
  (amount: number, char?: string): string,
384
304
  (str: string): string
385
305
  }
386
- };
306
+ }
387
307
 
388
308
  }
389
309
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gershy/clearing",
3
- "version": "0.0.7",
3
+ "version": "0.0.9",
4
4
  "description": "Adds the features you always wish javascript had!",
5
5
  "keywords": [
6
6
  "clearing",