utilium 2.0.0-pre.1 → 2.0.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.
package/dist/buffer.d.ts CHANGED
@@ -238,7 +238,7 @@ export declare class BufferView<T extends ArrayBufferLike = ArrayBufferLike> imp
238
238
  readonly byteLength: number;
239
239
  constructor(buffer?: T | ArrayBufferView<T> | ArrayLike<number>, byteOffset?: number, byteLength?: number);
240
240
  }
241
- /** Creates an array of a buffer view type */
241
+ /** Creates a fixed-size array of a buffer view type */
242
242
  export declare function BufferViewArray<T extends ArrayBufferViewConstructor>(element: T, size: number): {
243
243
  new <TArrayBuffer extends ArrayBufferLike = ArrayBuffer>(buffer?: TArrayBuffer | ArrayBufferView<TArrayBuffer> | ArrayLike<number>, byteOffset?: number, byteLength?: number): {
244
244
  [n: number]: any;
package/dist/buffer.js CHANGED
@@ -40,7 +40,7 @@ export function toUint8Array(buffer) {
40
40
  }
41
41
  export function initView(view, buffer, byteOffset, byteLength) {
42
42
  if (typeof buffer == 'number') {
43
- const per = view.BYTES_PER_ELEMENT ?? _throw('BYTES_PER_ELEMENT is not set');
43
+ const per = view.BYTES_PER_ELEMENT ?? _throw(new Error('BYTES_PER_ELEMENT is not set'));
44
44
  view.buffer = new ArrayBuffer(buffer * per);
45
45
  view.byteOffset = 0;
46
46
  view.byteLength = buffer * per;
@@ -77,19 +77,18 @@ export class BufferView {
77
77
  }
78
78
  }
79
79
  BufferView;
80
- /** Creates an array of a buffer view type */
80
+ /** Creates a fixed-size array of a buffer view type */
81
81
  export function BufferViewArray(element, size) {
82
82
  return class BufferViewArray extends Array {
83
83
  BYTES_PER_ELEMENT = size;
84
84
  constructor(buffer, byteOffset, byteLength) {
85
- const t_size = size;
86
- const length = (byteLength ?? t_size) / t_size;
85
+ const length = (byteLength ?? size) / size;
87
86
  if (!Number.isSafeInteger(length))
88
87
  throw new Error('Invalid array length: ' + length);
89
88
  super(length);
90
89
  initView(this, buffer, byteOffset, byteLength);
91
90
  for (let i = 0; i < length; i++) {
92
- this[i] = new element(this.buffer, this.byteOffset + i * t_size, t_size);
91
+ this[i] = new element(this.buffer, this.byteOffset + i * size, size);
93
92
  }
94
93
  }
95
94
  };
package/dist/index.d.ts CHANGED
@@ -4,6 +4,5 @@ export * from './numbers.js';
4
4
  export * from './objects.js';
5
5
  export * from './random.js';
6
6
  export * from './string.js';
7
- export * from './struct.js';
8
7
  export * from './types.js';
9
8
  export * as version from './version.js';
package/dist/index.js CHANGED
@@ -1,4 +1,3 @@
1
- // This file should not be added to
2
1
  // For better tree shaking, import from whichever file is actually needed
3
2
  export * from './list.js';
4
3
  export * from './misc.js';
@@ -6,6 +5,5 @@ export * from './numbers.js';
6
5
  export * from './objects.js';
7
6
  export * from './random.js';
8
7
  export * from './string.js';
9
- export * from './struct.js';
10
8
  export * from './types.js';
11
9
  export * as version from './version.js';
@@ -0,0 +1,66 @@
1
+ /* Shared eslint rules */
2
+ import eslint from '@eslint/js';
3
+ import globals from 'globals';
4
+ import tseslint from 'typescript-eslint';
5
+
6
+ export default function (tsconfigRootDir) {
7
+ return tseslint.config(
8
+ {
9
+ name: 'Utilium',
10
+ extends: [eslint.configs.recommended, ...tseslint.configs.recommendedTypeChecked],
11
+ files: ['src/**/*.ts', 'tests/**/*.ts'],
12
+ languageOptions: {
13
+ globals: { ...globals.browser, ...globals.node },
14
+ ecmaVersion: 'latest',
15
+ sourceType: 'module',
16
+ parserOptions: {
17
+ projectService: true,
18
+ tsconfigRootDir,
19
+ },
20
+ },
21
+ rules: {
22
+ 'no-useless-escape': 'warn',
23
+ 'no-unreachable': 'warn',
24
+ 'no-fallthrough': 'warn',
25
+ 'no-empty': 'warn',
26
+ 'no-case-declarations': 'warn',
27
+ 'prefer-const': 'warn',
28
+ 'prefer-rest-params': 'warn',
29
+ 'prefer-spread': 'warn',
30
+ 'no-unused-vars': 'off',
31
+ '@typescript-eslint/no-unused-vars': 'warn',
32
+ '@typescript-eslint/no-inferrable-types': 'off',
33
+ '@typescript-eslint/no-this-alias': 'off',
34
+ '@typescript-eslint/no-unsafe-function-type': 'warn',
35
+ '@typescript-eslint/no-wrapper-object-types': 'warn',
36
+ '@typescript-eslint/triple-slash-reference': 'warn',
37
+ '@typescript-eslint/no-non-null-assertion': 'off',
38
+ '@typescript-eslint/no-namespace': 'warn',
39
+ '@typescript-eslint/prefer-as-const': 'warn',
40
+ '@typescript-eslint/no-explicit-any': 'warn',
41
+ '@typescript-eslint/consistent-type-assertions': 'warn',
42
+ '@typescript-eslint/consistent-type-imports': 'warn',
43
+ '@typescript-eslint/no-unnecessary-type-assertion': 'warn',
44
+ '@typescript-eslint/require-await': 'warn',
45
+ '@typescript-eslint/no-unsafe-return': 'off',
46
+ '@typescript-eslint/no-unsafe-assignment': 'off',
47
+ '@typescript-eslint/no-unsafe-member-access': 'off',
48
+ '@typescript-eslint/no-unsafe-argument': 'off',
49
+ '@typescript-eslint/no-redundant-type-constituents': 'warn',
50
+ '@typescript-eslint/no-unsafe-call': 'warn',
51
+ '@typescript-eslint/restrict-plus-operands': 'off',
52
+ },
53
+ },
54
+ {
55
+ name: 'Tests overrides',
56
+ files: ['tests/**/*.ts'],
57
+ rules: {
58
+ '@typescript-eslint/no-unsafe-member-access': 'off',
59
+ '@typescript-eslint/no-unsafe-argument': 'off',
60
+ '@typescript-eslint/no-unsafe-assignment': 'off',
61
+ '@typescript-eslint/no-floating-promises': 'off',
62
+ '@typescript-eslint/no-explicit-any': 'off',
63
+ },
64
+ }
65
+ );
66
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "utilium",
3
- "version": "2.0.0-pre.1",
3
+ "version": "2.0.0",
4
4
  "description": "Typescript utilities",
5
5
  "funding": {
6
6
  "type": "individual",
@@ -12,23 +12,17 @@
12
12
  "exports": {
13
13
  ".": "./dist/index.js",
14
14
  "./*": "./dist/*",
15
- "./eslint": "./eslint.shared.js",
16
- "./source": "./src/*"
15
+ "./eslint": "./eslint.shared.js"
17
16
  },
18
17
  "files": [
19
- "src",
20
18
  "dist",
21
- "tsconfig.json",
22
- "scripts"
19
+ "eslint.shared.js"
23
20
  ],
24
21
  "scripts": {
25
22
  "format:check": "prettier --check .",
26
23
  "format": "prettier --write .",
27
24
  "lint": "tsc --noEmit && eslint src",
28
- "test": "tsx --test",
29
- "build": "tsc -p tsconfig.json",
30
- "build:docs": "typedoc",
31
- "prepublishOnly": "npm run build"
25
+ "prepublishOnly": "npx tsc"
32
26
  },
33
27
  "repository": {
34
28
  "type": "git",
package/readme.md CHANGED
@@ -2,7 +2,6 @@
2
2
 
3
3
  A bunch of utilities for Typescript. This includes:
4
4
 
5
- - Structs (using decorators)
6
5
  - Compile-time math types
7
6
  - Debugging types and functions
8
7
  - Utilities for using `fetch` with [HTTP range requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests)
@@ -1,99 +0,0 @@
1
- import type { ArrayBufferViewConstructor } from '../buffer.js';
2
- import type { UnionToTuple } from '../types.js';
3
- /** A definition for a primitive type */
4
- export interface Type<T = any> {
5
- readonly name: string;
6
- readonly size: number;
7
- readonly array: ArrayBufferViewConstructor;
8
- get(this: void, view: DataView, offset: number, littleEndian: boolean): T;
9
- set(this: void, view: DataView, offset: number, littleEndian: boolean, value: T): void;
10
- }
11
- export declare function isType<T = any>(type: unknown): type is Type<T>;
12
- export declare const types: {
13
- readonly int8: {
14
- readonly name: "int8";
15
- readonly size: 1;
16
- readonly array: Int8ArrayConstructor;
17
- readonly get: (this: void, view: DataView<ArrayBufferLike>, offset: number) => number;
18
- readonly set: (this: void, view: DataView<ArrayBufferLike>, offset: number, _le: boolean, value: any) => void;
19
- };
20
- readonly uint8: {
21
- readonly name: "uint8";
22
- readonly size: 1;
23
- readonly array: Uint8ArrayConstructor;
24
- readonly get: (this: void, view: DataView<ArrayBufferLike>, offset: number) => number;
25
- readonly set: (this: void, view: DataView<ArrayBufferLike>, offset: number, _le: boolean, value: any) => void;
26
- };
27
- readonly int16: {
28
- readonly name: "int16";
29
- readonly size: 2;
30
- readonly array: Int16ArrayConstructor;
31
- readonly get: (this: void, view: DataView<ArrayBufferLike>, offset: number, le: boolean) => number;
32
- readonly set: (this: void, view: DataView<ArrayBufferLike>, offset: number, le: boolean, value: any) => void;
33
- };
34
- readonly uint16: {
35
- readonly name: "uint16";
36
- readonly size: 2;
37
- readonly array: Uint16ArrayConstructor;
38
- readonly get: (this: void, view: DataView<ArrayBufferLike>, offset: number, le: boolean) => number;
39
- readonly set: (this: void, view: DataView<ArrayBufferLike>, offset: number, le: boolean, value: any) => void;
40
- };
41
- readonly int32: {
42
- readonly name: "int32";
43
- readonly size: 4;
44
- readonly array: Int32ArrayConstructor;
45
- readonly get: (this: void, view: DataView<ArrayBufferLike>, offset: number, le: boolean) => number;
46
- readonly set: (this: void, view: DataView<ArrayBufferLike>, offset: number, le: boolean, value: any) => void;
47
- };
48
- readonly uint32: {
49
- readonly name: "uint32";
50
- readonly size: 4;
51
- readonly array: Uint32ArrayConstructor;
52
- readonly get: (this: void, view: DataView<ArrayBufferLike>, offset: number, le: boolean) => number;
53
- readonly set: (this: void, view: DataView<ArrayBufferLike>, offset: number, le: boolean, value: any) => void;
54
- };
55
- readonly int64: {
56
- readonly name: "int64";
57
- readonly size: 8;
58
- readonly array: BigInt64ArrayConstructor;
59
- readonly get: (this: void, view: DataView<ArrayBufferLike>, offset: number, le: boolean) => bigint;
60
- readonly set: (this: void, view: DataView<ArrayBufferLike>, offset: number, le: boolean, value: any) => void;
61
- };
62
- readonly uint64: {
63
- readonly name: "uint64";
64
- readonly size: 8;
65
- readonly array: BigUint64ArrayConstructor;
66
- readonly get: (this: void, view: DataView<ArrayBufferLike>, offset: number, le: boolean) => bigint;
67
- readonly set: (this: void, view: DataView<ArrayBufferLike>, offset: number, le: boolean, value: any) => void;
68
- };
69
- readonly float32: {
70
- readonly name: "float32";
71
- readonly size: 4;
72
- readonly array: Float32ArrayConstructor;
73
- readonly get: (this: void, view: DataView<ArrayBufferLike>, offset: number, le: boolean) => number;
74
- readonly set: (this: void, view: DataView<ArrayBufferLike>, offset: number, le: boolean, value: any) => void;
75
- };
76
- readonly float64: {
77
- readonly name: "float64";
78
- readonly size: 8;
79
- readonly array: Float64ArrayConstructor;
80
- readonly get: (this: void, view: DataView<ArrayBufferLike>, offset: number, le: boolean) => number;
81
- readonly set: (this: void, view: DataView<ArrayBufferLike>, offset: number, le: boolean, value: any) => void;
82
- };
83
- };
84
- export type TypeName = keyof typeof types;
85
- export declare const typeNames: UnionToTuple<TypeName>;
86
- export declare function isTypeName(type: {
87
- toString(): string;
88
- }): type is TypeName;
89
- export type Valid = TypeName | Capitalize<TypeName> | 'char';
90
- export declare const validNames: ("int8" | "uint8" | "int16" | "uint16" | "int32" | "uint32" | "int64" | "uint64" | "float32" | "float64" | "Int8" | "Uint8" | "Int16" | "Uint16" | "Int32" | "Uint32" | "Int64" | "Uint64" | "Float32" | "Float64" | "char")[];
91
- export declare function isValid(type: {
92
- toString(): string;
93
- }): type is Valid;
94
- export declare function checkValid(type: {
95
- toString(): string;
96
- }): asserts type is Valid;
97
- export type Normalize<T extends Valid> = (T extends 'char' ? 'uint8' : Uncapitalize<T>) & TypeName;
98
- export declare function normalize<T extends Valid>(type: T): Normalize<T>;
99
- export type Size<T extends Valid | Type> = (T extends Valid ? (typeof types)[Normalize<T>] : T)['size'];
@@ -1,98 +0,0 @@
1
- import { capitalize } from '../string.js';
2
- export function isType(type) {
3
- return (typeof type == 'object'
4
- && type != null
5
- && 'size' in type
6
- && 'get' in type
7
- && 'set' in type
8
- && typeof type.size == 'number'
9
- && typeof type.get == 'function'
10
- && typeof type.set == 'function');
11
- }
12
- export const types = {
13
- int8: {
14
- name: 'int8',
15
- size: 1,
16
- array: Int8Array,
17
- get: (view, offset) => view.getInt8(offset),
18
- set: (view, offset, _le, value) => view.setInt8(offset, value),
19
- },
20
- uint8: {
21
- name: 'uint8',
22
- size: 1,
23
- array: Uint8Array,
24
- get: (view, offset) => view.getUint8(offset),
25
- set: (view, offset, _le, value) => view.setUint8(offset, value),
26
- },
27
- int16: {
28
- name: 'int16',
29
- size: 2,
30
- array: Int16Array,
31
- get: (view, offset, le) => view.getInt16(offset, le),
32
- set: (view, offset, le, value) => view.setInt16(offset, value, le),
33
- },
34
- uint16: {
35
- name: 'uint16',
36
- size: 2,
37
- array: Uint16Array,
38
- get: (view, offset, le) => view.getUint16(offset, le),
39
- set: (view, offset, le, value) => view.setUint16(offset, value, le),
40
- },
41
- int32: {
42
- name: 'int32',
43
- size: 4,
44
- array: Int32Array,
45
- get: (view, offset, le) => view.getInt32(offset, le),
46
- set: (view, offset, le, value) => view.setInt32(offset, value, le),
47
- },
48
- uint32: {
49
- name: 'uint32',
50
- size: 4,
51
- array: Uint32Array,
52
- get: (view, offset, le) => view.getUint32(offset, le),
53
- set: (view, offset, le, value) => view.setUint32(offset, value, le),
54
- },
55
- int64: {
56
- name: 'int64',
57
- size: 8,
58
- array: BigInt64Array,
59
- get: (view, offset, le) => view.getBigInt64(offset, le),
60
- set: (view, offset, le, value) => view.setBigInt64(offset, value, le),
61
- },
62
- uint64: {
63
- name: 'uint64',
64
- size: 8,
65
- array: BigUint64Array,
66
- get: (view, offset, le) => view.getBigUint64(offset, le),
67
- set: (view, offset, le, value) => view.setBigUint64(offset, value, le),
68
- },
69
- float32: {
70
- name: 'float32',
71
- size: 4,
72
- array: Float32Array,
73
- get: (view, offset, le) => view.getFloat32(offset, le),
74
- set: (view, offset, le, value) => view.setFloat32(offset, value, le),
75
- },
76
- float64: {
77
- name: 'float64',
78
- size: 8,
79
- array: Float64Array,
80
- get: (view, offset, le) => view.getFloat64(offset, le),
81
- set: (view, offset, le, value) => view.setFloat64(offset, value, le),
82
- },
83
- };
84
- export const typeNames = Object.keys(types);
85
- export function isTypeName(type) {
86
- return typeNames.includes(type.toString());
87
- }
88
- export const validNames = [...typeNames, ...typeNames.map(t => capitalize(t)), 'char'];
89
- export function isValid(type) {
90
- return validNames.includes(type.toString());
91
- }
92
- export function checkValid(type) {
93
- if (!isValid(type))
94
- throw new TypeError('Not a valid primitive type: ' + type);
95
- }
96
- export function normalize(type) {
97
- return (type == 'char' ? 'uint8' : type.toLowerCase());
98
- }
@@ -1,77 +0,0 @@
1
- import type { ClassLike } from '../types.js';
2
- import type * as primitive from './primitives.js';
3
- export type TypeLike = primitive.Type | Like | primitive.Valid | undefined | null;
4
- export type Type = Static | primitive.Type;
5
- /**
6
- * Options for struct initialization
7
- */
8
- export interface Options {
9
- packed: boolean;
10
- align: number;
11
- isUnion: boolean;
12
- }
13
- export interface Member {
14
- name: string;
15
- type: Type;
16
- offset: number;
17
- /** The size of the member, 0 for dynamically sized arrays */
18
- size: number;
19
- length?: number | string;
20
- /** A C-style type/name declaration string, used for diagnostics */
21
- decl: string;
22
- /** Whether the member is little endian */
23
- littleEndian: boolean;
24
- }
25
- export interface Metadata {
26
- options: Partial<Options>;
27
- members: Map<string, Member>;
28
- staticSize: number;
29
- /** Whether the struct is dynamically sized */
30
- isDynamic: boolean;
31
- /** Whether the struct is a union */
32
- isUnion: boolean;
33
- }
34
- export interface Init {
35
- members: Member[];
36
- size: number;
37
- isDynamic: boolean;
38
- isUnion: boolean;
39
- }
40
- type _DecoratorMetadata<T extends Metadata = Metadata> = DecoratorMetadata & {
41
- struct?: T;
42
- structInit?: Init;
43
- };
44
- export interface DecoratorContext<T extends Metadata = Metadata> {
45
- metadata: _DecoratorMetadata<T>;
46
- }
47
- /**
48
- * Initializes the struct metadata for a class
49
- * This also handles copying metadata from parent classes
50
- */
51
- export declare function initMetadata(context: DecoratorContext): Init;
52
- export interface Static<T extends Metadata = Metadata> {
53
- [Symbol.metadata]: Required<_DecoratorMetadata<T>>;
54
- readonly prototype: Instance<T>;
55
- new <TArrayBuffer extends ArrayBufferLike = ArrayBuffer>(buffer: TArrayBuffer, byteOffset?: number, length?: number): Instance<T> & ArrayBufferView<TArrayBuffer>;
56
- new (array?: ArrayLike<number> | ArrayBuffer): Instance<T>;
57
- }
58
- export interface StaticLike<T extends Metadata = Metadata> extends ClassLike {
59
- [Symbol.metadata]?: _DecoratorMetadata<T> | null;
60
- }
61
- export declare function isValidMetadata<T extends Metadata = Metadata>(arg: unknown): arg is DecoratorMetadata & {
62
- struct: T;
63
- };
64
- export declare function isStatic<T extends Metadata = Metadata>(arg: unknown): arg is Static<T>;
65
- export interface Instance<T extends Metadata = Metadata> extends ArrayBufferView, Record<PropertyKey, any> {
66
- constructor: Static<T>;
67
- }
68
- export interface InstanceLike<T extends Metadata = Metadata> {
69
- constructor: StaticLike<T>;
70
- }
71
- export declare function isInstance<T extends Metadata = Metadata>(arg: unknown): arg is Instance<T>;
72
- export declare function checkInstance<T extends Metadata = Metadata>(arg: unknown): asserts arg is Instance<T> & Record<keyof any, any>;
73
- export declare function isStruct<T extends Metadata = Metadata>(arg: unknown): arg is Instance<T> | Static<T>;
74
- export declare function checkStruct<T extends Metadata = Metadata>(arg: unknown): asserts arg is Instance<T> | Static<T>;
75
- export type Like<T extends Metadata = Metadata> = InstanceLike<T> | StaticLike<T>;
76
- export type Size<T extends TypeLike> = T extends undefined | null ? 0 : T extends primitive.Valid ? primitive.Size<T> : number;
77
- export {};
@@ -1,44 +0,0 @@
1
- /**
2
- * Polyfill Symbol.metadata
3
- * @see https://github.com/microsoft/TypeScript/issues/53461
4
- */
5
- Symbol.metadata ??= Symbol.for('Symbol.metadata');
6
- /**
7
- * Initializes the struct metadata for a class
8
- * This also handles copying metadata from parent classes
9
- */
10
- export function initMetadata(context) {
11
- context.metadata ??= {};
12
- const existing = context.metadata.structInit ?? {};
13
- context.metadata.structInit = {
14
- members: [...(existing.members ?? [])],
15
- size: existing.size ?? 0,
16
- isDynamic: existing.isDynamic ?? false,
17
- isUnion: existing.isUnion ?? false,
18
- };
19
- return context.metadata.structInit;
20
- }
21
- export function isValidMetadata(arg) {
22
- return arg != null && typeof arg == 'object' && 'struct' in arg;
23
- }
24
- export function isStatic(arg) {
25
- return typeof arg == 'function' && Symbol.metadata in arg && isValidMetadata(arg[Symbol.metadata]);
26
- }
27
- export function isInstance(arg) {
28
- return arg != null && typeof arg == 'object' && isStatic(arg.constructor);
29
- }
30
- export function checkInstance(arg) {
31
- if (isInstance(arg))
32
- return;
33
- throw new TypeError((typeof arg == 'function' ? arg.name : typeof arg == 'object' && arg ? arg.constructor.name : arg)
34
- + ' is not a struct instance');
35
- }
36
- export function isStruct(arg) {
37
- return isInstance(arg) || isStatic(arg);
38
- }
39
- export function checkStruct(arg) {
40
- if (isStruct(arg))
41
- return;
42
- throw new TypeError((typeof arg == 'function' ? arg.name : typeof arg == 'object' && arg ? arg.constructor.name : arg)
43
- + ' is not a struct');
44
- }
package/dist/struct.d.ts DELETED
@@ -1,41 +0,0 @@
1
- import * as primitive from './internal/primitives.js';
2
- import type { DecoratorContext, InstanceLike, Options, Size, StaticLike, TypeLike } from './internal/struct.js';
3
- export * as Struct from './internal/struct.js';
4
- /**
5
- * Gets the size in bytes of a type
6
- */
7
- export declare function sizeof<T extends TypeLike>(type: T | T[]): Size<T>;
8
- /**
9
- * Returns the offset (in bytes) of a member in a struct.
10
- */
11
- export declare function offsetof(type: StaticLike | InstanceLike, memberName: string): number;
12
- /** Aligns a number */
13
- export declare function align(value: number, alignment: number): number;
14
- /**
15
- * Decorates a class as a struct
16
- */
17
- export declare function struct(options?: Partial<Options>): <T extends StaticLike>(target: T, context: ClassDecoratorContext<T> & DecoratorContext) => void;
18
- export interface MemberOptions {
19
- bigEndian?: boolean;
20
- length?: number | string;
21
- align?: number;
22
- typeName?: string;
23
- }
24
- /**
25
- * Decorates a class member to be serialized
26
- */
27
- export declare function member<V>(type: primitive.Type | StaticLike, opt?: MemberOptions): (value: Target<V>, context: Context<V>) => Result<V>;
28
- type Target<V> = ClassAccessorDecoratorTarget<any, V>;
29
- type Result<V> = ClassAccessorDecoratorResult<any, V>;
30
- type Context<V> = ClassAccessorDecoratorContext<any, V> & DecoratorContext;
31
- type Decorator<V> = (value: Target<V>, context: Context<V>) => Result<V>;
32
- declare function _member<T extends primitive.Valid>(typeName: T): {
33
- <V>(length: number | string): Decorator<V>;
34
- <V>(value: Target<V>, context: Context<V>): Result<V>;
35
- };
36
- /**
37
- * Shortcut types
38
- *
39
- * Instead of writing `@member(type)` you can write `@types.type`, or `@types.type(length)` for arrays
40
- */
41
- export declare const types: { [K in primitive.Valid]: ReturnType<typeof _member<K>>; };