angular-odata
Version:
Client side OData typescript library for Angular
148 lines • 19.3 kB
JavaScript
import { raw } from '../../resources/query';
import { JsonType, } from '../../types';
import { ODataAnnotatable } from '../annotation';
export class ODataEnumTypeFieldParser extends ODataAnnotatable {
name;
value;
constructor(name, field) {
super(field);
this.name = name;
this.value = field.value;
}
titleize(term) {
return (term && this.annotatedValue(term)) || this.name;
}
}
export class ODataEnumTypeParser extends ODataAnnotatable {
name;
namespace;
alias;
flags;
members;
_fields;
parserOptions;
constructor(config, namespace, alias) {
super(config);
this.name = config.name;
this.namespace = namespace;
this.alias = alias;
this.flags = config.flags;
this.members = config.members;
this._fields = Object.entries(config.fields).map(([name, f]) => new ODataEnumTypeFieldParser(name, f));
}
configure({ options }) {
this.parserOptions = options;
}
isTypeOf(type) {
var names = [`${this.namespace}.${this.name}`];
if (this.alias)
names.push(`${this.alias}.${this.name}`);
return names.indexOf(type) !== -1;
}
fields(namesValue) {
if (namesValue === undefined)
return [...this._fields];
if (Array.isArray(namesValue))
return [...this._fields.filter((f) => namesValue.includes(f.value))];
if (typeof namesValue === 'number') {
return [
...this._fields.filter((f) => (this.flags && Boolean(f.value & namesValue)) ||
f.value === namesValue),
];
}
if (typeof namesValue === 'string') {
const names = namesValue.split(',').map((o) => o.trim());
return this._fields.filter((f) => names.includes(f.name));
}
return [];
}
field(nameValue) {
const field = this.fields().find((f) => f.name === nameValue || f.value === nameValue);
//Throw error if not found
//if (field === undefined)
// throw new Error(`${this.name} has no field for ${nameValue}`);
return field;
}
/**
* Map the fields of the enum type.
* @param mapper Function that maps the value to the new value
* @returns The fields mapped by the mapper
*/
mapFields(mapper) {
return this.fields().map(mapper);
}
// Deserialize
deserialize(value, options) {
// string -> number
const parserOptions = { ...this.parserOptions, ...options };
if (this.flags) {
return this.fields(value).reduce((acc, f) => acc | f.value, 0);
}
else {
return this.field(value)?.value;
}
}
// Serialize
serialize(value, options) {
// Enum are string | number
// string | number -> string
const parserOptions = { ...this.parserOptions, ...options };
if (this.flags) {
let names = this.fields(value).map((f) => f.name);
if (names.length === 0)
names = [`${value}`];
return !parserOptions?.stringAsEnum
? `${this.namespace}.${this.name}'${names.join(', ')}'`
: names.join(', ');
}
else {
let name = this.field(value)?.name;
if (name === undefined)
name = `${value}`;
return !parserOptions?.stringAsEnum
? `${this.namespace}.${this.name}'${name}'`
: name;
}
}
//Encode
encode(value, options) {
const parserOptions = { ...this.parserOptions, ...options };
const serialized = this.serialize(value, parserOptions);
if (serialized === undefined)
return undefined;
return parserOptions?.stringAsEnum
? raw(`'${serialized}'`)
: raw(serialized);
}
// Json Schema
toJsonSchema() {
return this.flags
? {
title: this.name,
type: JsonType.array,
items: {
type: JsonType.integer,
},
}
: {
type: JsonType.integer,
enum: this._fields.map((f) => f.value),
};
}
validate(value, { method, navigation = false, } = {}) {
if (this.flags) {
let fields = this.fields(value);
return value && fields.length === 0 ? ['mismatch'] : undefined;
}
else {
return this.fields(value).length !== 1 ? ['mismatch'] : undefined;
}
}
unpack(value) {
return this.fields(value).map((f) => f.value);
}
pack(value) {
return this.fields(value).reduce((acc, v) => acc | v.value, 0);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW51bS10eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL3NjaGVtYS9wYXJzZXJzL2VudW0tdHlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUMsT0FBTyxFQUtMLFFBQVEsR0FDVCxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFakQsTUFBTSxPQUFPLHdCQUF5QixTQUFRLGdCQUFnQjtJQUM1RCxJQUFJLENBQVM7SUFDYixLQUFLLENBQVM7SUFFZCxZQUFZLElBQVksRUFBRSxLQUEwQjtRQUNsRCxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDYixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUFzQjtRQUM3QixPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQzFELENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxtQkFDWCxTQUFRLGdCQUFnQjtJQUd4QixJQUFJLENBQVM7SUFDYixTQUFTLENBQVM7SUFDbEIsS0FBSyxDQUFVO0lBQ2YsS0FBSyxDQUFXO0lBQ2hCLE9BQU8sQ0FBMkQ7SUFDMUQsT0FBTyxDQUE2QjtJQUM1QyxhQUFhLENBQWlCO0lBRTlCLFlBQVksTUFBc0IsRUFBRSxTQUFpQixFQUFFLEtBQWM7UUFDbkUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3hCLElBQUks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LENBQVEsQ0FBQztJQUN4RSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYXcgfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvcXVlcnknO1xuaW1wb3J0IHtcbiAgRW51bVR5cGVDb25maWcsXG4gIEVudW1UeXBlRmllbGRDb25maWcsXG4gIFBhcnNlck9wdGlvbnMsXG4gIEZpZWxkUGFyc2VyLFxuICBKc29uVHlwZSxcbn0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgT0RhdGFBbm5vdGF0YWJsZSB9IGZyb20gJy4uL2Fubm90YXRpb24nO1xuXG5leHBvcnQgY2xhc3MgT0RhdGFFbnVtVHlwZUZpZWxkUGFyc2VyIGV4dGVuZHMgT0RhdGFBbm5vdGF0YWJsZSB7XG4gIG5hbWU6IHN0cmluZztcbiAgdmFsdWU6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIGZpZWxkOiBFbnVtVHlwZUZpZWxkQ29uZmlnKSB7XG4gICAgc3VwZXIoZmllbGQpO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy52YWx1ZSA9IGZpZWxkLnZhbHVlO1xuICB9XG5cbiAgdGl0bGVpemUodGVybT86IHN0cmluZyB8IFJlZ0V4cCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICh0ZXJtICYmIHRoaXMuYW5ub3RhdGVkVmFsdWUodGVybSkpIHx8IHRoaXMubmFtZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgT0RhdGFFbnVtVHlwZVBhcnNlcjxFPlxuICBleHRlbmRzIE9EYXRhQW5ub3RhdGFibGVcbiAgaW1wbGVtZW50cyBGaWVsZFBhcnNlcjxFPlxue1xuICBuYW1lOiBzdHJpbmc7XG4gIG5hbWVzcGFjZTogc3RyaW5nO1xuICBhbGlhcz86IHN0cmluZztcbiAgZmxhZ3M/OiBib29sZWFuO1xuICBtZW1iZXJzOiB7IFtuYW1lOiBzdHJpbmddOiBudW1iZXIgfSB8IHsgW3ZhbHVlOiBudW1iZXJdOiBzdHJpbmcgfTtcbiAgcHJpdmF0ZSBfZmllbGRzOiBPRGF0YUVudW1UeXBlRmllbGRQYXJzZXJbXTtcbiAgcGFyc2VyT3B0aW9ucz86IFBhcnNlck9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBFbnVtVHlwZUNvbmZpZywgbmFtZXNwYWNlOiBzdHJpbmcsIGFsaWFzPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcbiAgICB0aGlzLm5hbWUgPSBjb25maWcubmFtZTtcbiAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcbiAgICB0aGlzLmFsaWFzID0gYWxpYXM7XG4gICAgdGhpcy5mbGFncyA9IGNvbmZpZy5mbGFncztcbiAgICB0aGlzLm1lbWJlcnMgPSBjb25maWcubWVtYmVycztcbiAgICB0aGlzLl9maWVsZHMgPSBPYmplY3QuZW50cmllcyhjb25maWcuZmllbGRzKS5tYXAoXG4gICAgICAoW25hbWUsIGZdKSA9PiBuZXcgT0RhdGFFbnVtVHlwZUZpZWxkUGFyc2VyKG5hbWUsIGYpLFxuICAgICk7XG4gIH1cblxuICBjb25maWd1cmUoeyBvcHRpb25zIH06IHsgb3B0aW9uczogUGFyc2VyT3B0aW9ucyB9KSB7XG4gICAgdGhpcy5wYXJzZXJPcHRpb25zID0gb3B0aW9ucztcbiAgfVxuXG4gIGlzVHlwZU9mKHR5cGU6IHN0cmluZykge1xuICAgIHZhciBuYW1lcyA9IFtgJHt0aGlzLm5hbWVzcGFjZX0uJHt0aGlzLm5hbWV9YF07XG4gICAgaWYgKHRoaXMuYWxpYXMpIG5hbWVzLnB1c2goYCR7dGhpcy5hbGlhc30uJHt0aGlzLm5hbWV9YCk7XG4gICAgcmV0dXJuIG5hbWVzLmluZGV4T2YodHlwZSkgIT09IC0xO1xuICB9XG5cbiAgZmllbGRzKG5hbWVzVmFsdWU/OiBzdHJpbmcgfCBudW1iZXIgfCBudW1iZXJbXSk6IE9EYXRhRW51bVR5cGVGaWVsZFBhcnNlcltdIHtcbiAgICBpZiAobmFtZXNWYWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gWy4uLnRoaXMuX2ZpZWxkc107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmFtZXNWYWx1ZSkpXG4gICAgICByZXR1cm4gWy4uLnRoaXMuX2ZpZWxkcy5maWx0ZXIoKGYpID0+IG5hbWVzVmFsdWUuaW5jbHVkZXMoZi52YWx1ZSkpXTtcbiAgICBpZiAodHlwZW9mIG5hbWVzVmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICAuLi50aGlzLl9maWVsZHMuZmlsdGVyKFxuICAgICAgICAgIChmKSA9PlxuICAgICAgICAgICAgKHRoaXMuZmxhZ3MgJiYgQm9vbGVhbigoPGFueT5mLnZhbHVlKSAmICg8YW55Pm5hbWVzVmFsdWUpKSkgfHxcbiAgICAgICAgICAgIGYudmFsdWUgPT09IG5hbWVzVmFsdWUsXG4gICAgICAgICksXG4gICAgICBdO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG5hbWVzVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBuYW1lcyA9IG5hbWVzVmFsdWUuc3BsaXQoJywnKS5tYXAoKG8pID0+IG8udHJpbSgpKTtcbiAgICAgIHJldHVybiB0aGlzLl9maWVsZHMuZmlsdGVyKChmKSA9PiBuYW1lcy5pbmNsdWRlcyhmLm5hbWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZmllbGQobmFtZVZhbHVlOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmllbGRzKCkuZmluZChcbiAgICAgIChmKSA9PiBmLm5hbWUgPT09IG5hbWVWYWx1ZSB8fCBmLnZhbHVlID09PSBuYW1lVmFsdWUsXG4gICAgKTtcbiAgICAvL1Rocm93IGVycm9yIGlmIG5vdCBmb3VuZFxuICAgIC8vaWYgKGZpZWxkID09PSB1bmRlZmluZWQpXG4gICAgLy8gIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5hbWV9IGhhcyBubyBmaWVsZCBmb3IgJHtuYW1lVmFsdWV9YCk7XG4gICAgcmV0dXJuIGZpZWxkO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcCB0aGUgZmllbGRzIG9mIHRoZSBlbnVtIHR5cGUuXG4gICAqIEBwYXJhbSBtYXBwZXIgRnVuY3Rpb24gdGhhdCBtYXBzIHRoZSB2YWx1ZSB0byB0aGUgbmV3IHZhbHVlXG4gICAqIEByZXR1cm5zIFRoZSBmaWVsZHMgbWFwcGVkIGJ5IHRoZSBtYXBwZXJcbiAgICovXG4gIG1hcEZpZWxkczxSPihtYXBwZXI6IChmaWVsZDogT0RhdGFFbnVtVHlwZUZpZWxkUGFyc2VyKSA9PiBSKSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGRzKCkubWFwKG1hcHBlcik7XG4gIH1cblxuICAvLyBEZXNlcmlhbGl6ZVxuICBkZXNlcmlhbGl6ZSh2YWx1ZTogc3RyaW5nLCBvcHRpb25zPzogUGFyc2VyT3B0aW9ucyk6IEUge1xuICAgIC8vIHN0cmluZyAtPiBudW1iZXJcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID0geyAuLi50aGlzLnBhcnNlck9wdGlvbnMsIC4uLm9wdGlvbnMgfTtcbiAgICBpZiAodGhpcy5mbGFncykge1xuICAgICAgcmV0dXJuIHRoaXMuZmllbGRzKHZhbHVlKS5yZWR1Y2UoKGFjYywgZikgPT4gYWNjIHwgZi52YWx1ZSwgMCkgYXMgRTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZmllbGQodmFsdWUpPy52YWx1ZSBhcyBFO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNlcmlhbGl6ZVxuICBzZXJpYWxpemUodmFsdWU6IG51bWJlciwgb3B0aW9ucz86IFBhcnNlck9wdGlvbnMpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIC8vIEVudW0gYXJlIHN0cmluZyB8IG51bWJlclxuICAgIC8vIHN0cmluZyB8IG51bWJlciAtPiBzdHJpbmdcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID0geyAuLi50aGlzLnBhcnNlck9wdGlvbnMsIC4uLm9wdGlvbnMgfTtcbiAgICBpZiAodGhpcy5mbGFncykge1xuICAgICAgbGV0IG5hbWVzID0gdGhpcy5maWVsZHModmFsdWUpLm1hcCgoZikgPT4gZi5uYW1lKTtcbiAgICAgIGlmIChuYW1lcy5sZW5ndGggPT09IDApIG5hbWVzID0gW2Ake3ZhbHVlfWBdO1xuICAgICAgcmV0dXJuICFwYXJzZXJPcHRpb25zPy5zdHJpbmdBc0VudW1cbiAgICAgICAgPyBgJHt0aGlzLm5hbWVzcGFjZX0uJHt0aGlzLm5hbWV9JyR7bmFtZXMuam9pbignLCAnKX0nYFxuICAgICAgICA6IG5hbWVzLmpvaW4oJywgJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBuYW1lID0gdGhpcy5maWVsZCh2YWx1ZSk/Lm5hbWU7XG4gICAgICBpZiAobmFtZSA9PT0gdW5kZWZpbmVkKSBuYW1lID0gYCR7dmFsdWV9YDtcbiAgICAgIHJldHVybiAhcGFyc2VyT3B0aW9ucz8uc3RyaW5nQXNFbnVtXG4gICAgICAgID8gYCR7dGhpcy5uYW1lc3BhY2V9LiR7dGhpcy5uYW1lfScke25hbWV9J2BcbiAgICAgICAgOiBuYW1lO1xuICAgIH1cbiAgfVxuXG4gIC8vRW5jb2RlXG4gIGVuY29kZSh2YWx1ZTogbnVtYmVyLCBvcHRpb25zPzogUGFyc2VyT3B0aW9ucyk6IGFueSB7XG4gICAgY29uc3QgcGFyc2VyT3B0aW9ucyA9IHsgLi4udGhpcy5wYXJzZXJPcHRpb25zLCAuLi5vcHRpb25zIH07XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IHRoaXMuc2VyaWFsaXplKHZhbHVlLCBwYXJzZXJPcHRpb25zKTtcbiAgICBpZiAoc2VyaWFsaXplZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBwYXJzZXJPcHRpb25zPy5zdHJpbmdBc0VudW1cbiAgICAgID8gcmF3KGAnJHtzZXJpYWxpemVkfSdgKVxuICAgICAgOiByYXcoc2VyaWFsaXplZCk7XG4gIH1cblxuICAvLyBKc29uIFNjaGVtYVxuICB0b0pzb25TY2hlbWEoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmxhZ3NcbiAgICAgID8ge1xuICAgICAgICAgIHRpdGxlOiB0aGlzLm5hbWUsXG4gICAgICAgICAgdHlwZTogSnNvblR5cGUuYXJyYXksXG4gICAgICAgICAgaXRlbXM6IHtcbiAgICAgICAgICAgIHR5cGU6IEpzb25UeXBlLmludGVnZXIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgOiB7XG4gICAgICAgICAgdHlwZTogSnNvblR5cGUuaW50ZWdlcixcbiAgICAgICAgICBlbnVtOiB0aGlzLl9maWVsZHMubWFwKChmKSA9PiBmLnZhbHVlKSxcbiAgICAgICAgfTtcbiAgfVxuXG4gIHZhbGlkYXRlKFxuICAgIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIsXG4gICAge1xuICAgICAgbWV0aG9kLFxuICAgICAgbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIG1ldGhvZD86ICdjcmVhdGUnIHwgJ3VwZGF0ZScgfCAnbW9kaWZ5JztcbiAgICAgIG5hdmlnYXRpb24/OiBib29sZWFuO1xuICAgIH0gPSB7fSxcbiAgKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmZsYWdzKSB7XG4gICAgICBsZXQgZmllbGRzID0gdGhpcy5maWVsZHModmFsdWUpO1xuICAgICAgcmV0dXJuIHZhbHVlICYmIGZpZWxkcy5sZW5ndGggPT09IDAgPyBbJ21pc21hdGNoJ10gOiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmZpZWxkcyh2YWx1ZSkubGVuZ3RoICE9PSAxID8gWydtaXNtYXRjaCddIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHVucGFjayh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyW10ge1xuICAgIHJldHVybiB0aGlzLmZpZWxkcyh2YWx1ZSkubWFwKChmKSA9PiBmLnZhbHVlKTtcbiAgfVxuXG4gIHBhY2sodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IG51bWJlcltdKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZHModmFsdWUpLnJlZHVjZSgoYWNjLCB2KSA9PiBhY2MgfCB2LnZhbHVlLCAwKSBhcyBhbnk7XG4gIH1cbn1cbiJdfQ==