ts-flex-query
Version:
Flexible and type-safe data queries
54 lines • 2.64 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.FieldOperator = void 0;
exports.field = field;
const field_1 = require("../../expressions/field");
const data_type_1 = require("../../types/data-type");
class FieldOperator {
constructor(name, type = { type: data_type_1.DataTypeType.unknown }) {
this.name = name;
this.type = type;
}
instantiate(input) {
return new field_1.FieldExpression(input, this.name, this.apply(input.dataType));
}
apply(type) {
const suggestion = this.applyWithoutKnownType(type);
return suggestion.type === data_type_1.DataTypeType.unknown
? this.type
: suggestion;
}
applyWithoutKnownType(type) {
var _a;
switch (type.type) {
case data_type_1.DataTypeType.object:
return (_a = type.fields[this.name]) !== null && _a !== void 0 ? _a : { type: data_type_1.DataTypeType.undefined };
case data_type_1.DataTypeType.unknownObject:
case data_type_1.DataTypeType.unknown:
return { type: data_type_1.DataTypeType.unknown };
default:
return { type: data_type_1.DataTypeType.undefined };
}
}
}
exports.FieldOperator = FieldOperator;
function field(name) {
return new FieldOperator(name);
}
// Operators defining the type of the selected field (primitive, object, or array):
// export function primitiveField<TIn, TField extends keyof NonNullable<TIn> & string>(
// field: TField extends infer T ? IfNullablePrimitive<NonNullable<TIn>[TField], TField, never> : never
// ): PipeOperator<TIn, undefined extends TIn ? NonNullable<TIn>[TField] | undefined : NonNullable<TIn>[TField]> {
// return new FieldOperator(field, { type: DataTypeType.unknownPrimitive });
// }
// export function objectField<TIn, TField extends keyof NonNullable<TIn> & string>(
// field: TField extends infer T ? IfNullableObject<NonNullable<TIn>[TField], TField, never> : never
// ): PipeOperator<TIn, undefined extends TIn ? NonNullable<TIn>[TField] | undefined : NonNullable<TIn>[TField]> {
// return new FieldOperator(field, { type: DataTypeType.unknownObject });
// }
// export function arrayField<TIn, TField extends keyof NonNullable<TIn> & string>(
// field: TField extends infer T ? IfNullableArray<NonNullable<TIn>[TField], TField, never> : never
// ): PipeOperator<TIn, undefined extends TIn ? NonNullable<TIn>[TField] | undefined : NonNullable<TIn>[TField]> {
// return new FieldOperator(field, { type: DataTypeType.unknownArray });
// }
//# sourceMappingURL=field.js.map