Socket
Socket
Sign inDemoInstall

@arktype/util

Package Overview
Dependencies
Maintainers
1
Versions
78
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@arktype/util - npm Package Compare versions

Comparing version 0.0.19 to 0.0.20

compilation.ts

8

__tests__/map.test.ts

@@ -69,2 +69,10 @@ import { attest } from "@arktype/attest"

})
it("maps from array to object", () => {
const result = map(["a", "b", "c"], (i, v) => [v, i])
attest<{
a: 0 | 2 | 1
b: 0 | 2 | 1
c: 0 | 2 | 1
}>(result).equals({ a: 0, b: 1, c: 2 })
})
})

7

functions.ts
import { throwInternalError } from "./errors.js"
import { CastableBase } from "./records.js"

@@ -25,3 +26,3 @@ export const cached = <T>(thunk: () => T) => {

export const CompiledFunction = class extends Function {
export const DynamicFunction = class extends Function {
constructor(...args: [string, ...string[]]) {

@@ -42,5 +43,5 @@ const params = args.slice(0, -1)

}
} as CompiledFunction
} as DynamicFunction
export type CompiledFunction = new <f extends (...args: never[]) => unknown>(
export type DynamicFunction = new <f extends (...args: never[]) => unknown>(
...args: ConstructorParameters<typeof Function>

@@ -47,0 +48,0 @@ ) => f & {

@@ -27,11 +27,22 @@ import type { ErrorMessage } from "./errors.js"

: ErrorMessage<`'${k & string}' is not a valid key`>
}
} & u
export type defer<t> = [t][t extends any ? 0 : never]
export type merge<base, merged> = {
[k in Exclude<keyof base, keyof merged>]: base[k]
} & merged &
unknown
export type merge<base, merged> = evaluate<
{
[k in Exclude<keyof base, keyof merged>]: base[k]
} & merged
>
export type UnknownUnion =
| string
| number
| symbol
| bigint
| boolean
| object
| null
| undefined
/**

@@ -70,6 +81,4 @@ * Interesection (`&`) that avoids evaluating `unknown` to `{}`

export type satisfy<t, u extends t> = u
export type satisfy<base, t extends base> = t
export type and<t, u> = evaluate<t & u>
export type defined<t> = t & ({} | null)

@@ -76,0 +85,0 @@

@@ -0,1 +1,3 @@

import type { NumberLiteral } from "./numericLiterals.js"
export type pathToString<

@@ -76,2 +78,28 @@ segments extends string[],

export type tail<t extends readonly unknown[]> = t extends readonly [
unknown,
...infer tail
]
? tail
: never
export type head<t extends readonly unknown[]> = t extends readonly [
infer head,
...unknown[]
]
? head
: never
export type last<t extends readonly unknown[]> = t extends readonly [
...unknown[],
infer last
]
? last
: never
export type numericStringKeyOf<t extends readonly unknown[]> = Extract<
keyof t,
NumberLiteral
>
export const listFrom = <t>(data: t) =>

@@ -142,2 +170,22 @@ (Array.isArray(data) ? data : [data]) as t extends readonly unknown[]

/**
* Appends a value to an array if it is not already included, returning the array
*
* @param to The array to which `value` is to be appended. If `to` is `undefined`, a new array
* is created including only `value`.
* @param value The value to append to the array. If `to` includes `value`, nothing is appended.
*/
export const appendUnique = <to extends unknown[]>(
to: to | undefined,
value: to[number]
) => {
if (to === undefined) {
return [value] as never
}
if (!to.includes(value)) {
to.push(value)
}
return to
}
export type groupableKeyOf<t> = {

@@ -144,0 +192,0 @@ [k in keyof t]: t[k] extends PropertyKey ? k : never

@@ -0,1 +1,2 @@

export * from "./compilation.js"
export * from "./domain.js"

@@ -14,2 +15,3 @@ export * from "./errors.js"

export * from "./records.js"
export * from "./registry.js"
export * from "./serialize.js"

@@ -16,0 +18,0 @@ export * from "./strings.js"

@@ -60,2 +60,9 @@ import type { evaluate } from "./generics.js"

export function map<
const o extends readonly unknown[],
transformed extends listable<Entry<string | symbol>>
>(
o: o,
flatMapEntry: (...args: numericArrayEntry<o>) => transformed
): objectFromListableEntries<extractEntrySets<transformed>>
export function map<
const o extends object,

@@ -93,4 +100,5 @@ transformed extends listable<Entry<number>>

): any {
const inputIsArray = Array.isArray(o)
const entries: Entry[] = Object.entries(o).flatMap((entry, i) => {
const result = Array.isArray(o)
const result = inputIsArray
? flatMapEntry(i, entry[1])

@@ -97,0 +105,0 @@ : flatMapEntry(...entry, i)

@@ -96,2 +96,8 @@ import { throwParseError } from "./errors.js"

export type parseNumber<token extends string> = token extends NumberLiteral<
infer value
>
? value
: never
export const tryParseInteger = <errorOnFail extends boolean | string>(

@@ -116,2 +122,13 @@ token: string,

export type parseInteger<token extends string> = token extends IntegerLiteral<
infer value
>
? `${value}` extends NumberLiteral<infer valueAsNumber>
? valueAsNumber
: never
: never
export type parseNonNegativeInteger<token extends string> =
token extends `-${string}` ? never : parseInteger<token>
export type NumericParseOptions<errorOnFail extends boolean | string> = {

@@ -118,0 +135,0 @@ errorOnFail?: errorOnFail

@@ -5,4 +5,4 @@ export declare const cached: <T>(thunk: () => T) => () => T;

export type thunkable<t> = t | Thunk<t>;
export declare const CompiledFunction: CompiledFunction;
export type CompiledFunction = new <f extends (...args: never[]) => unknown>(...args: ConstructorParameters<typeof Function>) => f & {
export declare const DynamicFunction: DynamicFunction;
export type DynamicFunction = new <f extends (...args: never[]) => unknown>(...args: ConstructorParameters<typeof Function>) => f & {
apply(thisArg: null, args: Parameters<f>): ReturnType<f>;

@@ -9,0 +9,0 @@ call(thisArg: null, ...args: Parameters<f>): ReturnType<f>;

import { throwInternalError } from "./errors.js";
import { CastableBase } from "./records.js";
export const cached = (thunk) => {

@@ -14,3 +15,3 @@ let isCached = false;

export const isThunk = (value) => typeof value === "function" && value.length === 0;
export const CompiledFunction = class extends Function {
export const DynamicFunction = class extends Function {
constructor(...args) {

@@ -17,0 +18,0 @@ const params = args.slice(0, -1);

@@ -17,7 +17,8 @@ import type { ErrorMessage } from "./errors.js";

[k in keyof t]: k extends keyof u ? conform<t[k], u[k]> : ErrorMessage<`'${k & string}' is not a valid key`>;
};
} & u;
export type defer<t> = [t][t extends any ? 0 : never];
export type merge<base, merged> = {
export type merge<base, merged> = evaluate<{
[k in Exclude<keyof base, keyof merged>]: base[k];
} & merged & unknown;
} & merged>;
export type UnknownUnion = string | number | symbol | bigint | boolean | object | null | undefined;
/**

@@ -37,4 +38,3 @@ * Interesection (`&`) that avoids evaluating `unknown` to `{}`

};
export type satisfy<t, u extends t> = u;
export type and<t, u> = evaluate<t & u>;
export type satisfy<base, t extends base> = t;
export type defined<t> = t & ({} | null);

@@ -41,0 +41,0 @@ export type autocomplete<suggestions extends string> = suggestions | (string & {});

@@ -0,1 +1,2 @@

import type { NumberLiteral } from "./numericLiterals.js";
export type pathToString<segments extends string[], delimiter extends string = "/"> = segments extends [] ? "/" : join<segments, delimiter>;

@@ -11,2 +12,15 @@ export type join<segments extends string[], delimiter extends string, result extends string = ""> = segments extends [infer head extends string, ...infer tail extends string[]] ? join<tail, delimiter, result extends "" ? head : `${result}${delimiter}${head}`> : result;

export type CollapsingList<t = unknown> = readonly [] | t | readonly [t, t, ...t[]];
export type tail<t extends readonly unknown[]> = t extends readonly [
unknown,
...infer tail
] ? tail : never;
export type head<t extends readonly unknown[]> = t extends readonly [
infer head,
...unknown[]
] ? head : never;
export type last<t extends readonly unknown[]> = t extends readonly [
...unknown[],
infer last
] ? last : never;
export type numericStringKeyOf<t extends readonly unknown[]> = Extract<keyof t, NumberLiteral>;
export declare const listFrom: <t>(data: t) => t extends readonly unknown[] ? [t] extends [null] ? t[] : t : t[];

@@ -27,2 +41,10 @@ export declare const spliterate: <item, included extends item>(list: readonly item[], by: (item: item) => item is included) => [included: included[], excluded: Exclude<item, included>[]];

export declare const append: <to extends element[] | undefined, element extends {}, value extends element | undefined>(to: to, value: value) => to | Extract<value, undefined>;
/**
* Appends a value to an array if it is not already included, returning the array
*
* @param to The array to which `value` is to be appended. If `to` is `undefined`, a new array
* is created including only `value`.
* @param value The value to append to the array. If `to` includes `value`, nothing is appended.
*/
export declare const appendUnique: <to extends unknown[]>(to: to | undefined, value: to[number]) => to;
export type groupableKeyOf<t> = {

@@ -29,0 +51,0 @@ [k in keyof t]: t[k] extends PropertyKey ? k : never;

@@ -58,2 +58,18 @@ export const getPath = (root, path) => {

};
/**
* Appends a value to an array if it is not already included, returning the array
*
* @param to The array to which `value` is to be appended. If `to` is `undefined`, a new array
* is created including only `value`.
* @param value The value to append to the array. If `to` includes `value`, nothing is appended.
*/
export const appendUnique = (to, value) => {
if (to === undefined) {
return [value];
}
if (!to.includes(value)) {
to.push(value);
}
return to;
};
export const groupBy = (array, discriminator) => array.reduce((result, item) => {

@@ -60,0 +76,0 @@ const key = item[discriminator];

@@ -0,1 +1,2 @@

export * from "./compilation.js";
export * from "./domain.js";

@@ -14,2 +15,3 @@ export * from "./errors.js";

export * from "./records.js";
export * from "./registry.js";
export * from "./serialize.js";

@@ -16,0 +18,0 @@ export * from "./strings.js";

@@ -0,1 +1,2 @@

export * from "./compilation.js";
export * from "./domain.js";

@@ -14,2 +15,3 @@ export * from "./errors.js";

export * from "./records.js";
export * from "./registry.js";
export * from "./serialize.js";

@@ -16,0 +18,0 @@ export * from "./strings.js";

@@ -17,2 +17,3 @@ import type { evaluate } from "./generics.js";

export declare function map<const o extends readonly unknown[], transformed extends listable<Entry<number>>>(o: o, flatMapEntry: (...args: numericArrayEntry<o>) => transformed): arrayFromListableEntries<extractEntries<transformed>>;
export declare function map<const o extends readonly unknown[], transformed extends listable<Entry<string | symbol>>>(o: o, flatMapEntry: (...args: numericArrayEntry<o>) => transformed): objectFromListableEntries<extractEntrySets<transformed>>;
export declare function map<const o extends object, transformed extends listable<Entry<number>>>(o: o, flatMapEntry: (...args: entryOf<o>) => transformed): arrayFromListableEntries<extractEntries<transformed>>;

@@ -19,0 +20,0 @@ export declare function map<const o extends object, transformed extends listable<Entry<number>>>(o: o, flatMapEntry: (...args: entryArgsWithIndex<o>) => transformed): arrayFromListableEntries<extractEntries<transformed>>;

// eslint-disable-next-line prefer-arrow-functions/prefer-arrow-functions
export function map(o, flatMapEntry) {
const inputIsArray = Array.isArray(o);
const entries = Object.entries(o).flatMap((entry, i) => {
const result = Array.isArray(o)
const result = inputIsArray
? flatMapEntry(i, entry[1])

@@ -6,0 +7,0 @@ : flatMapEntry(...entry, i);

@@ -44,4 +44,7 @@ export type Digit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;

export type tryParseNumber<token extends string, messageOnFail extends string> = token extends NumberLiteral<infer value> ? number extends value ? writeMalformedNumericLiteralMessage<token, "number"> : value : messageOnFail;
export type parseNumber<token extends string> = token extends NumberLiteral<infer value> ? value : never;
export declare const tryParseInteger: <errorOnFail extends string | boolean>(token: string, options?: NumericParseOptions<errorOnFail> | undefined) => errorOnFail extends string | true ? number : number | undefined;
export type tryParseInteger<token extends string, messageOnFail extends string> = token extends IntegerLiteral<infer value> ? bigint extends value ? writeMalformedNumericLiteralMessage<token, "integer"> : `${value}` extends NumberLiteral<infer valueAsNumber> ? valueAsNumber : never : messageOnFail;
export type parseInteger<token extends string> = token extends IntegerLiteral<infer value> ? `${value}` extends NumberLiteral<infer valueAsNumber> ? valueAsNumber : never : never;
export type parseNonNegativeInteger<token extends string> = token extends `-${string}` ? never : parseInteger<token>;
export type NumericParseOptions<errorOnFail extends boolean | string> = {

@@ -48,0 +51,0 @@ errorOnFail?: errorOnFail;

@@ -1,2 +0,2 @@

export declare const pick: <o extends object, keys extends readonly (keyof o)[]>(o: o, keys: keys) => Pick<o, keys[number]>;
export {};
//# sourceMappingURL=pick.d.ts.map

@@ -1,7 +0,2 @@

export const pick = (o, keys) => keys.reduce((result, k) => {
if (k in o) {
result[k] = o[k];
}
return result;
}, {});
export {};
//# sourceMappingURL=pick.js.map

@@ -29,2 +29,3 @@ import type { defined, evaluate } from "./generics.js";

};
export type keySetOf<o extends object> = keySet<Extract<keyof o, string>>;
export type mutable<o, maxDepth extends number = 1> = mutableRecurse<o, [

@@ -85,3 +86,6 @@ ], maxDepth>;

export declare const shallowClone: <input extends object>(input: input) => input;
export declare const splitByKeys: <o extends object, leftKeys extends keySetOf<o>>(o: o, leftKeys: leftKeys) => [Pick<o, keyof leftKeys & keyof o> extends infer T ? { [k in keyof T]: Pick<o, keyof leftKeys & keyof o>[k]; } : never, Omit<o, keyof leftKeys & keyof o> extends infer T_1 ? { [k_1 in keyof T_1]: Omit<o, keyof leftKeys & keyof o>[k_1]; } : never];
export type EmptyObject = Record<PropertyKey, never>;
export declare const isEmptyObject: (o: object) => o is EmptyObject;
export {};
//# sourceMappingURL=records.d.ts.map

@@ -21,2 +21,17 @@ export const entriesOf = (o) => Object.entries(o);

export const shallowClone = (input) => Object.create(Object.getPrototypeOf(input), Object.getOwnPropertyDescriptors(input));
export const splitByKeys = (o, leftKeys) => {
const l = {};
const r = {};
let k;
for (k in o) {
if (k in leftKeys) {
l[k] = o[k];
}
else {
r[k] = o[k];
}
}
return [l, r];
};
export const isEmptyObject = (o) => Object.keys(o).length === 0;
//# sourceMappingURL=records.js.map
{
"name": "@arktype/util",
"version": "0.0.19",
"version": "0.0.20",
"author": {

@@ -5,0 +5,0 @@ "name": "David Blass",

@@ -1,13 +0,2 @@

export const pick = <o extends object, keys extends readonly (keyof o)[]>(
o: o,
keys: keys
) =>
keys.reduce(
(result, k) => {
if (k in o) {
result[k] = o[k]
}
return result
},
{} as Pick<o, keys[number]>
)
import type { defined, evaluate } from "./generics.js"
import type { intersectUnion } from "./unionToTuple.js"

@@ -47,2 +46,4 @@ export type Dict<k extends string = string, v = unknown> = {

export type keySetOf<o extends object> = keySet<Extract<keyof o, string>>
export type mutable<o, maxDepth extends number = 1> = mutableRecurse<

@@ -167,1 +168,26 @@ o,

)
export const splitByKeys = <o extends object, leftKeys extends keySetOf<o>>(
o: o,
leftKeys: leftKeys
): [
evaluate<Pick<o, keyof leftKeys & keyof o>>,
evaluate<Omit<o, keyof leftKeys & keyof o>>
] => {
const l: any = {}
const r: any = {}
let k: keyof o
for (k in o) {
if (k in leftKeys) {
l[k] = o[k]
} else {
r[k] = o[k]
}
}
return [l, r]
}
export type EmptyObject = Record<PropertyKey, never>
export const isEmptyObject = (o: object): o is EmptyObject =>
Object.keys(o).length === 0

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc