123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- /**
- * Property helper functions.
- *
- * @_subsection api/utils:Properties [about-properties]
- */
- function checkType(value: any, type: string, name: string): void {
- const types = type.split("|").map(t => t.trim());
- for (let i = 0; i < types.length; i++) {
- switch (type) {
- case "any":
- return;
- case "bigint":
- case "boolean":
- case "number":
- case "string":
- if (typeof(value) === type) { return; }
- }
- }
- const error: any = new Error(`invalid value for type ${ type }`);
- error.code = "INVALID_ARGUMENT";
- error.argument = `value.${ name }`;
- error.value = value;
- throw error;
- }
- /**
- * Resolves to a new object that is a copy of %%value%%, but with all
- * values resolved.
- */
- export async function resolveProperties<T>(value: { [ P in keyof T ]: T[P] | Promise<T[P]>}): Promise<T> {
- const keys = Object.keys(value);
- const results = await Promise.all(keys.map((k) => Promise.resolve(value[<keyof T>k])));
- return results.reduce((accum: any, v, index) => {
- accum[keys[index]] = v;
- return accum;
- }, <{ [ P in keyof T]: T[P] }>{ });
- }
- /**
- * Assigns the %%values%% to %%target%% as read-only values.
- *
- * It %%types%% is specified, the values are checked.
- */
- export function defineProperties<T>(
- target: T,
- values: { [ K in keyof T ]?: T[K] },
- types?: { [ K in keyof T ]?: string }): void {
- for (let key in values) {
- let value = values[key];
- const type = (types ? types[key]: null);
- if (type) { checkType(value, type, key); }
- Object.defineProperty(target, key, { enumerable: true, value, writable: false });
- }
- }
|