UNPKG

angular-odata

Version:

Client side OData typescript library for Angular

770 lines 97.3 kB
import { ODataStructuredTypeFieldParser } from '../../../schema'; import { Objects, Types } from '../../../utils'; import { normalizeValue } from '../builder'; import { ApplyExpression, GroupByTransformations } from './apply'; import { ComputeExpression } from './compute'; import { CountExpression } from './count'; import { ExpandExpression } from './expand'; import { FilterExpression } from './filter'; import { OrderByExpression } from './orderby'; import { SearchExpression } from './search'; import { SelectExpression } from './select'; export const FieldFactory = (names = []) => new Proxy({ _names: names }, { get(target, key) { let names = target['_names']; if (key === 'render') { return ({ aliases, escape, prefix, parser, options, }) => { let values = names.map((n) => render(n, { aliases, escape, prefix, parser, options })); if (prefix && (names.length === 0 || typeof names[0] === 'string')) { values = [prefix, ...values]; } return values.join('/'); }; } else if (key === 'clone') { return () => FieldFactory([...names]); } else if (key === 'isField') { return () => true; } else if (key === 'toJson') { return () => ({ $type: 'Field', names: names, }); } else if (key === 'resolve') { return (parser) => names.reduce((acc, name) => typeof name === 'string' ? acc?.field(name) : name?.resolve(parser), parser); } else { return FieldFactory([...names, key]); } }, has(target, key) { return (['toJson', 'isField', 'clone', 'render', 'resolve'].includes(key) || key in target); }, }); export const RenderableFactory = (value) => { if (Types.isPlainObject(value) && '$type' in value) { switch (value.$type) { case 'SelectExpression': return SelectExpression.fromJson(value); case 'ExpandExpression': return ExpandExpression.fromJson(value); case 'ComputeExpression': return ComputeExpression.fromJson(value); case 'ApplyExpression': return ApplyExpression.fromJson(value); case 'FilterExpression': return FilterExpression.fromJson(value); case 'OrderByExpression': return OrderByExpression.fromJson(value); case 'SearchExpression': return SearchExpression.fromJson(value); case 'CountExpression': return CountExpression.fromJson(value); case 'GroupByTransformations': return GroupByTransformations.fromJson(value); case 'Function': return Function.fromJson(value); case 'Operator': return Operator.fromJson(value); case 'Grouping': return Grouping.fromJson(value); case 'Aggregate': return Aggregate.fromJson(value); case 'GroupBy': return GroupBy.fromJson(value); case 'Lambda': return Lambda.fromJson(value); case 'Type': return Type.fromJson(value); case 'Field': return FieldFactory(value['names']); default: return value; } } return value; }; function applyMixins(derivedCtor, constructors) { constructors.forEach((baseCtor) => { Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => { Object.defineProperty(derivedCtor.prototype, name, Object.getOwnPropertyDescriptor(baseCtor.prototype, name) || Object.create(null)); }); }); } export function render(value, { aliases, normalize, escape, prefix, parser, options, } = {}) { if (Types.isFunction(value)) { return render(value(syntax), { aliases, normalize, prefix, parser, options, }); } if (Types.isObject(value) && 'render' in value) { return render(value.render({ aliases, escape, prefix, parser, options }), { aliases, normalize, escape, prefix, parser, options, }); } return normalize ? normalizeValue(value, { aliases, escape }) : value; } export function resolve(values, parser) { if (parser !== undefined) { let fields = values.filter((v) => Types.isObject(v) && 'isField' in v && v.isField()); if (fields.length === 1 && Types.isObject(parser) && 'field' in parser) { return fields[0].resolve(parser); } } return parser; } export function encode(values, parser, options) { if (parser !== undefined) { return values.map((v) => { if (Types.isArray(v)) return encode(v, parser, options); if (Types.isObject(v) || v == null) return v; try { return parser.encode(v, options); } catch { return v; } }); } return values; } export class Function { name; values; normalize; escape; constructor(name, values, normalize, escape = false) { this.name = name; this.values = values; this.normalize = normalize; this.escape = escape; } get [Symbol.toStringTag]() { return 'Function'; } toJson() { return { $type: Types.rawType(this), name: this.name, values: this.values.map((v) => Types.isObject(v) && 'toJson' in v ? v.toJson() : v), normalize: this.normalize, }; } static fromJson(json) { return new Function(json['name'], json['values'].map((v) => RenderableFactory(v)), json['normalize'], json['escape']); } render({ aliases, escape, prefix, parser, options, }) { parser = resolve(this.values, parser); let [left, ...values] = encode(this.values, parser, options); left = render(left, { aliases, escape, prefix, parser, normalize: this.normalize === 'all' || this.normalize === 'left', options, }); const params = [ left, ...values.map((v) => render(v, { aliases, escape, prefix, parser, normalize: this.normalize === 'all' || this.normalize === 'right', options, })), ]; return `${this.name}(${params.join(', ')})`; } clone() { return new Function(this.name, this.values.map((v) => Objects.clone(v)), this.normalize, this.escape); } resolve(parser) { return parser; } } export class StringAndCollectionFunctions { concat(left, right, normalize = 'right') { return new Function('concat', [left, right], normalize); } contains(left, right, normalize = 'right') { return new Function('contains', [left, right], normalize); } endsWith(left, right, normalize = 'right') { return new Function('endswith', [left, right], normalize); } indexOf(left, right, normalize = 'right') { return new Function('indexof', [left, right], normalize); } length(left, normalize = 'right') { return new Function('length', [left], normalize); } startsWith(left, right, normalize = 'right') { return new Function('startswith', [left, right], normalize); } subString(left, right, length, normalize = 'none') { let values = [left, right]; if (length !== undefined) { values.push(length); } return new Function('substring', values, normalize); } } export class CollectionFunctions { hasSubset(left, right, normalize = 'none') { return new Function('hassubset', [left, right], normalize); } hasSubsequence(left, right, normalize = 'none') { return new Function('hassubsequence', [left, right], normalize); } } export class StringFunctions { matchesPattern(left, pattern, normalize = 'none') { return new Function('matchesPattern', [left, pattern], normalize); } toLower(left, normalize = 'none') { return new Function('tolower', [left], normalize); } toUpper(left, normalize = 'none') { return new Function('toupper', [left], normalize); } trim(left, normalize = 'none') { return new Function('trim', [left], normalize); } } export class DateAndTimeFunctions { date(left, normalize = 'none') { return new Function('date', [left], normalize); } day(left, normalize = 'none') { return new Function('day', [left], normalize); } fractionalseconds(left, normalize = 'none') { return new Function('fractionalseconds', [left], normalize); } hour(left, normalize = 'none') { return new Function('hour', [left], normalize); } maxdatetime(left, normalize = 'none') { return new Function('maxdatetime', [left], normalize); } mindatetime(left, normalize = 'none') { return new Function('mindatetime', [left], normalize); } minute(left, normalize = 'none') { return new Function('minute', [left], normalize); } month(left, normalize = 'none') { return new Function('month', [left], normalize); } now() { return new Function('now', [], 'none'); } second(left, normalize = 'none') { return new Function('second', [left], normalize); } time(left, normalize = 'none') { return new Function('time', [left], normalize); } totaloffsetminutes(left, normalize = 'none') { return new Function('totaloffsetminutes', [left], normalize); } totalseconds(left, normalize = 'none') { return new Function('totalseconds', [left], normalize); } year(left, normalize = 'none') { return new Function('year', [left], normalize); } } export class ArithmeticFunctions { ceiling(left, normalize = 'none') { return new Function('ceiling', [left], normalize); } floor(left, normalize = 'none') { return new Function('floor', [left], normalize); } round(left, normalize = 'none') { return new Function('round', [left], normalize); } } export class TypeFunctions { cast(left, type) { return FieldFactory([ type !== undefined ? new Type('cast', type, left) : new Type('cast', left), ]); } isof(left, type) { return type !== undefined ? new Type('isof', type, left) : new Type('isof', left); } } export class GeoFunctions { geoDistance(left, right, normalize = 'right') { return new Function('geo.distance', [left, right], normalize); } geoIntersects(left, right, normalize = 'right') { return new Function('geo.intersects', [left, right], normalize); } geoLength(left, normalize = 'none') { return new Function('geo.length', [left], normalize); } } export class ConditionalFunctions { case(left, right, normalize = 'none') { return new Function('case', [left, right], normalize); } } export class Operator { op; values; normalize; constructor(op, values, normalize) { this.op = op; this.values = values; this.normalize = normalize; } get [Symbol.toStringTag]() { return 'Operator'; } toJson() { return { $type: Types.rawType(this), op: this.op, values: this.values.map((v) => Types.isObject(v) && 'toJson' in v ? v.toJson() : v), normalize: this.normalize, }; } static fromJson(json) { return new Operator(json['op'], json['values'].map((v) => RenderableFactory(v)), json['normalize']); } render({ aliases, escape, prefix, parser, options, }) { parser = resolve(this.values, parser); let [left, right] = encode(this.values, parser, options); left = render(left, { aliases, escape, prefix, parser, normalize: this.normalize === 'all' || this.normalize === 'left', options, }); if (right !== undefined) { right = Array.isArray(right) ? `(${right .map((v) => render(v, { aliases, escape, prefix, parser, normalize: this.normalize === 'all' || this.normalize === 'right', options, })) .join(',')})` : render(right, { aliases, escape, prefix, parser, normalize: this.normalize === 'all' || this.normalize === 'right', options, }); return `${left} ${this.op} ${right}`; } return `${this.op}(${left})`; } clone() { return new Operator(this.op, this.values.map((v) => Objects.clone(v)), this.normalize); } resolve(parser) { return parser; } } export class LogicalOperators { eq(left, right, normalize = 'right') { return new Operator('eq', [left, right], normalize); } ne(left, right, normalize = 'right') { return new Operator('ne', [left, right], normalize); } gt(left, right, normalize = 'right') { return new Operator('gt', [left, right], normalize); } ge(left, right, normalize = 'right') { return new Operator('ge', [left, right], normalize); } lt(left, right, normalize = 'right') { return new Operator('lt', [left, right], normalize); } le(left, right, normalize = 'right') { return new Operator('le', [left, right], normalize); } /* and(left: any, right: any, normalize: Normalize = 'right') { return new Operator('and', [left, right], normalize); } or(left: any, right: any, normalize: Normalize = 'right') { return new Operator('or', [left, right], normalize); } */ not(left, normalize = 'none') { return new Operator('not', [left], normalize); } has(left, right, normalize = 'right') { return new Operator('has', [left, right], normalize); } in(left, right, normalize = 'right') { return new Operator('in', [left, right], normalize); } } export class ArithmeticOperators { add(left, right, normalize = 'right') { return new Operator('add', [left, right], normalize); } sub(left, right, normalize = 'right') { return new Operator('sub', [left, right], normalize); } mul(left, right, normalize = 'right') { return new Operator('mul', [left, right], normalize); } div(left, right, normalize = 'right') { return new Operator('div', [left, right], normalize); } mod(left, right, normalize = 'right') { return new Operator('mod', [left, right], normalize); } neg(value, normalize = 'right') { return new Operator('-', [value], normalize); } } export class Grouping { group; constructor(group) { this.group = group; } get [Symbol.toStringTag]() { return 'Grouping'; } toJson() { return { $type: Types.rawType(this), group: this.group.toJson(), }; } static fromJson(json) { return new Grouping(json['group'].map((v) => RenderableFactory(v))); } render({ aliases, escape, prefix, parser, options, }) { return `(${render(this.group, { aliases, escape, prefix, parser, options, })})`; } clone() { return new Grouping(Objects.clone(this.group)); } resolve(parser) { return parser; } } export class GroupingOperators { group(value) { return new Grouping(value); } rollup(...values) { return new Function('rollup', values, 'none'); } } export class Aggregate { value; method; alias; constructor(value, method, alias) { this.value = value; this.method = method; this.alias = alias; } get [Symbol.toStringTag]() { return 'Aggregate'; } toJson() { return { $type: Types.rawType(this), value: this.value.toJson(), method: this.method, alias: this.alias, }; } static fromJson(json) { return new Aggregate(RenderableFactory(json['value']), json['method'], json['alias']); } render({ aliases, escape, prefix, parser, options, }) { return `aggregate(${render(this.value, { aliases, escape, prefix, parser, options, })} with ${this.method} as ${this.alias})`; } clone() { return new Aggregate(Objects.clone(this.value), this.method, this.alias); } resolve(parser) { return parser; } } export class GroupBy { properties; transformations; constructor(properties, transformations) { this.properties = properties; this.transformations = transformations; } get [Symbol.toStringTag]() { return 'GroupBy'; } toJson() { return { $type: Types.rawType(this), properties: this.properties.map((p) => p.toJson()), transformations: this.transformations?.toJson(), }; } static fromJson(json) { return new GroupBy(json['properties'].map((p) => RenderableFactory(p)), RenderableFactory(json['transformations'])); } render({ aliases, escape, prefix, parser, options, }) { const properties = this.properties .map((p) => render(p, { aliases, escape, prefix, parser, options, })) .join(','); const transformations = this.transformations ? ', ' + render(this.transformations, { aliases, escape, prefix, parser, options, }) : ''; return `groupby((${properties})${transformations})`; } clone() { return new GroupBy(Objects.clone(this.properties), Objects.clone(this.transformations)); } resolve(parser) { return parser; } } export class Transformations { aggregate(value, method, alias) { return new Aggregate(value, method, alias); } groupby(properties, options) { return new GroupBy(properties, options); } topCount(value, field, normalize = 'none') { return new Function('topcount', [value, field], normalize); } topSum(value, field, normalize = 'none') { return new Function('topsum', [value, field], normalize); } topPercent(value, field, normalize = 'none') { return new Function('toppercent', [value, field], normalize); } bottomCount(value, field, normalize = 'none') { return new Function('bottomcount', [value, field], normalize); } bottomSum(value, field, normalize = 'none') { return new Function('bottomsum', [value, field], normalize); } bottomPercent(value, field, normalize = 'none') { return new Function('bottompercent', [value, field], normalize); } identity() { return new Function('identity', [], 'none'); } search(value, normalize = 'none') { return new Function('search', [value], normalize); } filter(value, normalize = 'none') { return new Function('filter', [value], normalize); } skip(value, normalize = 'none') { return new Function('top', [value], normalize); } top(value, normalize = 'none') { return new Function('top', [value], normalize); } orderby(value, normalize = 'none') { return new Function('filter', [value], normalize); } } export class Type { name; type; value; constructor(name, type, value) { this.name = name; this.type = type; this.value = value; } get [Symbol.toStringTag]() { return 'Type'; } toJson() { return { $type: Types.rawType(this), name: this.name, type: this.type, value: this.value, }; } static fromJson(json) { return new Type(json['name'], json['type'], RenderableFactory(json['value'])); } render({ aliases, escape, prefix, parser, options, }) { let value; if (this.value) { parser = resolve([this.value], parser); let [left, right] = encode([this.value], parser, options); value = render(left, { aliases, escape, prefix, parser, options }); } return value ? `${this.name}(${value}, '${this.type}')` : `${this.name}('${this.type}')`; } clone() { return new Type(this.name, this.type, Objects.clone(this.value)); } resolve(parser) { parser = parser instanceof ODataStructuredTypeFieldParser && parser.isStructuredType() ? parser.structuredType() : parser; return parser?.findChildParser((p) => p.isTypeOf(this.type)); } } export class Lambda { op; values; alias; constructor(op, values, alias) { this.op = op; this.values = values; this.alias = alias; } get [Symbol.toStringTag]() { return 'Lambda'; } toJson() { return { $type: Types.rawType(this), op: this.op, values: this.values.map((v) => Types.isObject(v) && 'toJson' in v ? v.toJson() : v), alias: this.alias, }; } static fromJson(json) { return new Lambda(json['op'], json['values'].map((v) => RenderableFactory(v)), json['alias']); } render({ aliases, escape, prefix, parser, options, }) { parser = resolve(this.values, parser); let [left, right] = encode(this.values, parser, options); left = render(left, { aliases, escape, prefix, parser }); if (right) { let alias = this.alias || left.split('/').pop().toLowerCase()[0]; return `${left}/${this.op}(${alias}:${render(right, { aliases, escape, prefix: alias, options, parser, })})`; } else { return `${left}/${this.op}()`; } } clone() { return new Lambda(this.op, this.values.map((v) => Objects.clone(v)), this.alias); } resolve(parser) { return parser; } } export class LambdaOperators { any(left, right, alias) { return new Lambda('any', [left, right], alias); } all(left, right, alias) { return new Lambda('all', [left, right], alias); } } export class ODataOperators { } applyMixins(ODataOperators, [ LogicalOperators, ArithmeticOperators, GroupingOperators, LambdaOperators, ]); export const operators = new ODataOperators(); export class ODataFunctions { } applyMixins(ODataFunctions, [ StringAndCollectionFunctions, CollectionFunctions, StringFunctions, DateAndTimeFunctions, ArithmeticFunctions, TypeFunctions, GeoFunctions, ConditionalFunctions, ]); export const functions = new ODataFunctions(); export class ODataTransformations { } applyMixins(ODataTransformations, [Transformations]); export const transformations = new ODataTransformations(); export class ODataSyntax { } applyMixins(ODataSyntax, [ ODataOperators, ODataFunctions, ODataTransformations, ]); export const syntax = new ODataSyntax(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ludGF4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL3Jlc291cmNlcy9xdWVyeS9leHByZXNzaW9ucy9zeW50YXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFakUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDMUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQXVCNUMsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQzFCLFFBQWlDLEVBQUUsRUFDOUIsRUFBRSxDQUNQLElBQUksS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBTyxFQUFFO0lBQ2hDLEdBQUcsQ0FBQyxNQUFTLEVBQUUsR0FBb0I7UUFDakMsSUFBSSxLQUFLLEdBQUksTUFBYyxDQUFDLFFBQVEsQ0FBNEIsQ0FBQztRQUNqRSxJQUFJLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNyQixPQUFP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Q2YsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLENBQUMsTUFBVztRQUNqQixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLEVBQUUsQ0FBQyxJQUFTLEVBQUUsS0FBVSxFQUFFLFlBQXVCLE9BQU87UUFDdEQsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELEVBQUUsQ0FBQyxJQUFTLEVBQUUsS0FBVSxFQUFFLFlBQXVCLE9BQU87UUFDdEQsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELEVBQUUsQ0FBQyxJQUFTLEVBQUUsS0FBVSxFQUFFLFlBQXVCLE9BQU87UUFDdEQsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELEVBQUUsQ0FBQyxJQUFTLEVBQUUsS0FBVSxFQUFFLFlBQXVCLE9BQU87UUFDdEQsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELEVBQUUsQ0FBQyxJQUFTLEVBQUUsS0FBVSxFQUFFLFlBQXVCLE9BQU87UUFDdEQsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELEVBQUUsQ0FBQyxJQUFTLEVBQUUsS0FBVSxFQUFFLFlBQXVCLE9BQU87UUFDdEQsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUs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