xml-model 1.3.2 → 2.0.0-beta.1
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/README.md +39 -35
- package/dist/index.d.ts +3 -7
- package/dist/index.js +18 -17
- package/dist/model.d.ts +53 -0
- package/dist/model.js +69 -0
- package/dist/util/zod.d.ts +4 -0
- package/dist/util/zod.js +21 -0
- package/dist/xml/codec.d.ts +87 -0
- package/dist/xml/codec.js +385 -0
- package/dist/xml/examples.d.ts +188 -0
- package/dist/xml/index.d.ts +5 -32
- package/dist/xml/index.js +14 -54
- package/dist/xml/model.d.ts +18 -0
- package/dist/xml/model.js +37 -0
- package/dist/xml/schema-meta.d.ts +57 -0
- package/dist/xml/schema-meta.js +96 -0
- package/dist/xml/xml-js.d.ts +138 -3
- package/dist/xml/xml-js.js +89 -5
- package/package.json +10 -23
- package/dist/_virtual/Reflect.js +0 -8
- package/dist/_virtual/Reflect2.js +0 -5
- package/dist/_virtual/_commonjsHelpers.js +0 -47
- package/dist/defaults.d.ts +0 -15
- package/dist/defaults.js +0 -130
- package/dist/errors.d.ts +0 -24
- package/dist/errors.js +0 -45
- package/dist/middleware.d.ts +0 -10
- package/dist/middleware.js +0 -25
- package/dist/model/built-ins.d.ts +0 -3
- package/dist/model/built-ins.js +0 -43
- package/dist/model/index.d.ts +0 -21
- package/dist/model/index.js +0 -236
- package/dist/model/property.d.ts +0 -6
- package/dist/model/property.js +0 -67
- package/dist/model/registry.d.ts +0 -9
- package/dist/model/registry.js +0 -19
- package/dist/model/types.d.ts +0 -74
- package/dist/node_modules/reflect-metadata/Reflect.js +0 -806
- package/dist/types.d.ts +0 -17
- package/dist/util/is-regexp.d.ts +0 -12
- package/dist/util/is-regexp.js +0 -8
- package/dist/util/merge-maps.d.ts +0 -2
- package/dist/util/merge-maps.js +0 -23
- package/dist/vite/index.d.ts +0 -53
- package/dist/vite/index.js +0 -63
- package/dist/vite/node_modules/typescript-rtti/dist.esm/common/format.js +0 -105
- package/dist/vite/node_modules/typescript-rtti/dist.esm/common/index.js +0 -55
- package/dist/vite/node_modules/typescript-rtti/dist.esm/transformer/api-call-transformer.js +0 -152
- package/dist/vite/node_modules/typescript-rtti/dist.esm/transformer/common/class-analyzer.js +0 -83
- package/dist/vite/node_modules/typescript-rtti/dist.esm/transformer/common/compile-error.js +0 -8
- package/dist/vite/node_modules/typescript-rtti/dist.esm/transformer/common/import-analyzer.js +0 -89
- package/dist/vite/node_modules/typescript-rtti/dist.esm/transformer/common/interface-analyzer.js +0 -58
- package/dist/vite/node_modules/typescript-rtti/dist.esm/transformer/common/visitor-base.js +0 -93
- package/dist/vite/node_modules/typescript-rtti/dist.esm/transformer/declarations-emitter.js +0 -31
- package/dist/vite/node_modules/typescript-rtti/dist.esm/transformer/encode-parameter.js +0 -64
- package/dist/vite/node_modules/typescript-rtti/dist.esm/transformer/find-relative-path.js +0 -41
- package/dist/vite/node_modules/typescript-rtti/dist.esm/transformer/flags.js +0 -43
- package/dist/vite/node_modules/typescript-rtti/dist.esm/transformer/forward-ref.js +0 -20
- package/dist/vite/node_modules/typescript-rtti/dist.esm/transformer/get-exports-for-symbol.js +0 -64
- package/dist/vite/node_modules/typescript-rtti/dist.esm/transformer/index.js +0 -130
- package/dist/vite/node_modules/typescript-rtti/dist.esm/transformer/legacy-decorator.js +0 -10
- package/dist/vite/node_modules/typescript-rtti/dist.esm/transformer/legacy-type-encoder.js +0 -82
- package/dist/vite/node_modules/typescript-rtti/dist.esm/transformer/literal-node.js +0 -9
- package/dist/vite/node_modules/typescript-rtti/dist.esm/transformer/metadata-collector.js +0 -56
- package/dist/vite/node_modules/typescript-rtti/dist.esm/transformer/metadata-decorator.js +0 -80
- package/dist/vite/node_modules/typescript-rtti/dist.esm/transformer/metadata-emitter.js +0 -425
- package/dist/vite/node_modules/typescript-rtti/dist.esm/transformer/metadata-encoder.js +0 -212
- package/dist/vite/node_modules/typescript-rtti/dist.esm/transformer/rt-helper.js +0 -96
- package/dist/vite/node_modules/typescript-rtti/dist.esm/transformer/rtti-visitor-base.js +0 -28
- package/dist/vite/node_modules/typescript-rtti/dist.esm/transformer/serialize.js +0 -31
- package/dist/vite/node_modules/typescript-rtti/dist.esm/transformer/type-encoder.js +0 -76
- package/dist/vite/node_modules/typescript-rtti/dist.esm/transformer/type-literal.js +0 -499
- package/dist/vite/node_modules/typescript-rtti/dist.esm/transformer/utils.js +0 -906
- package/dist/vite/node_modules/typescript-rtti/dist.esm/transformer/workarounds.js +0 -7
package/dist/defaults.js
DELETED
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import { getModel } from "./model/registry.js";
|
|
2
|
-
import { kebabCase } from "./util/kebab-case.js";
|
|
3
|
-
const defaults = {
|
|
4
|
-
fromXML() {
|
|
5
|
-
throw new TypeError(
|
|
6
|
-
"you should define 'defaults.fromXML' yourself or provide a 'fromXML' function to @Model() decorator's options"
|
|
7
|
-
);
|
|
8
|
-
},
|
|
9
|
-
propertyResolveSourceElements(context) {
|
|
10
|
-
const innerElements = context.xml.elements[0]?.elements || [];
|
|
11
|
-
return innerElements.filter((el) => context.property.isSourceElement(el, context));
|
|
12
|
-
},
|
|
13
|
-
propertySourceElementsFilter(element, context) {
|
|
14
|
-
return context.property.tagname === element.name;
|
|
15
|
-
},
|
|
16
|
-
propertyFromXML(context) {
|
|
17
|
-
const prop = context.property;
|
|
18
|
-
const elements = context.elements;
|
|
19
|
-
if (prop.reflected.isOptional && elements.length === 0) {
|
|
20
|
-
return void 0;
|
|
21
|
-
}
|
|
22
|
-
if (prop.model) {
|
|
23
|
-
return prop.model.fromXML({ elements });
|
|
24
|
-
}
|
|
25
|
-
const type = context.property.reflected.type;
|
|
26
|
-
if (type.is("class")) {
|
|
27
|
-
const model = getModel(type.class);
|
|
28
|
-
return model.fromXML({ elements: context.elements });
|
|
29
|
-
} else if (type.is("array")) {
|
|
30
|
-
let arrayEl = {};
|
|
31
|
-
if (!prop.inline && elements.length === 1 && elements[0].name === prop.tagname) {
|
|
32
|
-
arrayEl = elements[0];
|
|
33
|
-
} else if (prop.inline) {
|
|
34
|
-
arrayEl = { elements };
|
|
35
|
-
}
|
|
36
|
-
const els = arrayEl.elements || [];
|
|
37
|
-
const elType = type.elementType;
|
|
38
|
-
if (elType.is("class")) {
|
|
39
|
-
const model = getModel(elType.class);
|
|
40
|
-
const xmlInstances = els.map((el) => ({
|
|
41
|
-
elements: [el]
|
|
42
|
-
}));
|
|
43
|
-
return xmlInstances.map((xml) => model.fromXML(xml));
|
|
44
|
-
}
|
|
45
|
-
} else if (type.is("union") && type.types.length && type.types[0].is("literal")) {
|
|
46
|
-
const firstType = type.types[0];
|
|
47
|
-
if (firstType.is("literal")) {
|
|
48
|
-
const firstTypeCtor = firstType.value.constructor;
|
|
49
|
-
if (type.types.every((type2) => type2.is("literal") && type2.value.constructor === firstTypeCtor)) {
|
|
50
|
-
const model = getModel(firstTypeCtor);
|
|
51
|
-
return model.fromXML({ elements });
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
return void 0;
|
|
56
|
-
},
|
|
57
|
-
/* Object -> XML */
|
|
58
|
-
toXML({ properties, model }) {
|
|
59
|
-
const elements = [];
|
|
60
|
-
model.resolveAllProperties().forEach((prop) => {
|
|
61
|
-
if (prop.name in properties && typeof prop.name !== "symbol") {
|
|
62
|
-
const _xml = properties[prop.name];
|
|
63
|
-
_xml.elements.forEach((el) => {
|
|
64
|
-
el.name = prop.tagname;
|
|
65
|
-
elements.push(el);
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
return {
|
|
70
|
-
elements: [
|
|
71
|
-
{
|
|
72
|
-
type: "element",
|
|
73
|
-
name: model.options.tagname,
|
|
74
|
-
elements
|
|
75
|
-
}
|
|
76
|
-
]
|
|
77
|
-
};
|
|
78
|
-
},
|
|
79
|
-
tagnameFromModel(model) {
|
|
80
|
-
return kebabCase(model.type.name);
|
|
81
|
-
},
|
|
82
|
-
tagnameFromProperty(property) {
|
|
83
|
-
return kebabCase(String(property.name));
|
|
84
|
-
},
|
|
85
|
-
propertyToXML(context) {
|
|
86
|
-
const property = context.property;
|
|
87
|
-
const type = property.reflected.type;
|
|
88
|
-
const value = context.value;
|
|
89
|
-
if (property.reflected.isOptional && typeof value === "undefined") {
|
|
90
|
-
return { elements: [] };
|
|
91
|
-
}
|
|
92
|
-
if (property.model) {
|
|
93
|
-
return property.model.toXML(value);
|
|
94
|
-
}
|
|
95
|
-
const getXML = () => {
|
|
96
|
-
if (type.is("class")) {
|
|
97
|
-
const model = getModel(type.class);
|
|
98
|
-
return model.toXML(value);
|
|
99
|
-
} else if (type.is("array")) {
|
|
100
|
-
const elementType = type.elementType;
|
|
101
|
-
if (elementType.is("class")) {
|
|
102
|
-
const model = getModel(elementType.class);
|
|
103
|
-
const elements = [];
|
|
104
|
-
value.forEach((el) => elements.push(...model.toXML(el).elements));
|
|
105
|
-
return { elements: [{ type: "element", name: "array", elements }] };
|
|
106
|
-
}
|
|
107
|
-
} else if (type.is("union") && type.types.length && type.types[0].is("literal")) {
|
|
108
|
-
const firstType = type.types[0];
|
|
109
|
-
if (firstType.is("literal")) {
|
|
110
|
-
const firstTypeCtor = firstType.value.constructor;
|
|
111
|
-
if (type.types.every(
|
|
112
|
-
(type2) => type2.is("literal") && type2.value.constructor === firstTypeCtor
|
|
113
|
-
)) {
|
|
114
|
-
const model = getModel(firstTypeCtor);
|
|
115
|
-
return model.toXML(context.value);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
return { elements: [] };
|
|
120
|
-
};
|
|
121
|
-
const xml = getXML();
|
|
122
|
-
if (context.property.inline)
|
|
123
|
-
return { elements: xml.elements.map((el) => el.elements || []).flat() };
|
|
124
|
-
else return xml;
|
|
125
|
-
}
|
|
126
|
-
};
|
|
127
|
-
export {
|
|
128
|
-
defaults
|
|
129
|
-
};
|
|
130
|
-
//# sourceMappingURL=defaults.js.map
|
package/dist/errors.d.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { fromXMLContext, PropertyFromXMLContext, PropertyToXMLContext, toXMLContext } from './model/types';
|
|
2
|
-
export declare class FromXMLConversionError<T> extends Error {
|
|
3
|
-
context: Omit<fromXMLContext<T>, "properties">;
|
|
4
|
-
error: unknown;
|
|
5
|
-
name: string;
|
|
6
|
-
constructor(context: Omit<fromXMLContext<T>, "properties">, error: unknown);
|
|
7
|
-
}
|
|
8
|
-
export declare class PropertyFromXMLConversionError<T> extends FromXMLConversionError<T> {
|
|
9
|
-
propertyContext: PropertyFromXMLContext<T>;
|
|
10
|
-
name: string;
|
|
11
|
-
constructor(context: Omit<fromXMLContext<T>, "properties">, propertyContext: PropertyFromXMLContext<T>, error: unknown);
|
|
12
|
-
}
|
|
13
|
-
export declare class ToXMLConversionError<T> extends Error {
|
|
14
|
-
context: Omit<toXMLContext<T>, "properties">;
|
|
15
|
-
cause: unknown;
|
|
16
|
-
name: string;
|
|
17
|
-
constructor(context: Omit<toXMLContext<T>, "properties">, cause: unknown);
|
|
18
|
-
}
|
|
19
|
-
export declare class PropertyToXMLConversionError<T> extends ToXMLConversionError<T> {
|
|
20
|
-
propertyContext: PropertyToXMLContext<T>;
|
|
21
|
-
name: string;
|
|
22
|
-
constructor(context: Omit<toXMLContext<T>, "properties">, propertyContext: PropertyToXMLContext<T>, cause: unknown);
|
|
23
|
-
}
|
|
24
|
-
//# sourceMappingURL=errors.d.ts.map
|
package/dist/errors.js
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
class FromXMLConversionError extends Error {
|
|
2
|
-
constructor(context, error) {
|
|
3
|
-
const message = `[Model: ${context.model.type.name}] failed to convert from XML`;
|
|
4
|
-
super(message);
|
|
5
|
-
this.context = context;
|
|
6
|
-
this.error = error;
|
|
7
|
-
this.name = "FromXMLConversionError";
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
class PropertyFromXMLConversionError extends FromXMLConversionError {
|
|
11
|
-
constructor(context, propertyContext, error) {
|
|
12
|
-
super(context, error);
|
|
13
|
-
this.propertyContext = propertyContext;
|
|
14
|
-
this.name = "PropertyFromXMLConversionError";
|
|
15
|
-
this.message = `[Model: ${context.model.type.name}] failed to convert prop <${String(
|
|
16
|
-
propertyContext.property.name
|
|
17
|
-
)}> from XML`;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
class ToXMLConversionError extends Error {
|
|
21
|
-
constructor(context, cause) {
|
|
22
|
-
const message = `[Model: ${context.model.type.name}] failed to convert to XML`;
|
|
23
|
-
super(message);
|
|
24
|
-
this.context = context;
|
|
25
|
-
this.cause = cause;
|
|
26
|
-
this.name = "ToXMLConversionError";
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
class PropertyToXMLConversionError extends ToXMLConversionError {
|
|
30
|
-
constructor(context, propertyContext, cause) {
|
|
31
|
-
super(context, cause);
|
|
32
|
-
this.propertyContext = propertyContext;
|
|
33
|
-
this.name = "PropertyToXMLConversionError";
|
|
34
|
-
this.message = `[Model: ${context.model.type.name}] failed to convert prop <${String(
|
|
35
|
-
propertyContext.property.name
|
|
36
|
-
)}> to XML`;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
export {
|
|
40
|
-
FromXMLConversionError,
|
|
41
|
-
PropertyFromXMLConversionError,
|
|
42
|
-
PropertyToXMLConversionError,
|
|
43
|
-
ToXMLConversionError
|
|
44
|
-
};
|
|
45
|
-
//# sourceMappingURL=errors.js.map
|
package/dist/middleware.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export type Middleware<C, T> = (context: C, next: () => T) => T;
|
|
2
|
-
interface ChainableOptions<C, T> {
|
|
3
|
-
parent: ChainableOptions<C, T> | null;
|
|
4
|
-
middlewares: Middleware<C, T>[];
|
|
5
|
-
}
|
|
6
|
-
export declare function MiddlewareChain<C, T>(options: ChainableOptions<C, T>): Generator<Middleware<C, T>, void, unknown>;
|
|
7
|
-
type MiddlewareChain<C, T> = Iterator<Middleware<C, T>>;
|
|
8
|
-
export declare function resolve<C, T>(middlewares: MiddlewareChain<C, T>, context: C): T;
|
|
9
|
-
export {};
|
|
10
|
-
//# sourceMappingURL=middleware.d.ts.map
|
package/dist/middleware.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
function* MiddlewareChain(options) {
|
|
2
|
-
do {
|
|
3
|
-
for (let index = options.middlewares.length - 1; index >= 0; index--) {
|
|
4
|
-
yield options.middlewares[index];
|
|
5
|
-
}
|
|
6
|
-
if (options.parent) options = options.parent;
|
|
7
|
-
else return;
|
|
8
|
-
} while (true);
|
|
9
|
-
}
|
|
10
|
-
function resolve(middlewares, context) {
|
|
11
|
-
const next = () => {
|
|
12
|
-
const { value: nextMiddleware, done } = middlewares.next();
|
|
13
|
-
if (done || !nextMiddleware) {
|
|
14
|
-
throw new Error("no more next middleware");
|
|
15
|
-
} else {
|
|
16
|
-
return nextMiddleware(context, next);
|
|
17
|
-
}
|
|
18
|
-
};
|
|
19
|
-
return next();
|
|
20
|
-
}
|
|
21
|
-
export {
|
|
22
|
-
MiddlewareChain,
|
|
23
|
-
resolve
|
|
24
|
-
};
|
|
25
|
-
//# sourceMappingURL=middleware.js.map
|
package/dist/model/built-ins.js
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { getContent, fromContent } from "../xml/index.js";
|
|
2
|
-
function registerBuiltIns(create) {
|
|
3
|
-
create(String, {
|
|
4
|
-
toXML(ctx) {
|
|
5
|
-
return {
|
|
6
|
-
elements: [fromContent(ctx.object, "string")]
|
|
7
|
-
};
|
|
8
|
-
},
|
|
9
|
-
fromXML(ctx) {
|
|
10
|
-
return String(getContent(ctx.xml.elements[0]));
|
|
11
|
-
}
|
|
12
|
-
});
|
|
13
|
-
create(Number, {
|
|
14
|
-
toXML(ctx) {
|
|
15
|
-
return {
|
|
16
|
-
elements: [fromContent(String(ctx.object), "number")]
|
|
17
|
-
};
|
|
18
|
-
},
|
|
19
|
-
fromXML(ctx) {
|
|
20
|
-
return Number(getContent(ctx.xml.elements[0]));
|
|
21
|
-
}
|
|
22
|
-
});
|
|
23
|
-
create(Boolean, {
|
|
24
|
-
toXML(ctx) {
|
|
25
|
-
return {
|
|
26
|
-
elements: [
|
|
27
|
-
{
|
|
28
|
-
type: "element",
|
|
29
|
-
name: "boolean",
|
|
30
|
-
...fromContent(String(ctx.object))
|
|
31
|
-
}
|
|
32
|
-
]
|
|
33
|
-
};
|
|
34
|
-
},
|
|
35
|
-
fromXML(ctx) {
|
|
36
|
-
return Boolean(getContent(ctx.xml.elements[0]));
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
export {
|
|
41
|
-
registerBuiltIns as default
|
|
42
|
-
};
|
|
43
|
-
//# sourceMappingURL=built-ins.js.map
|
package/dist/model/index.d.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { Constructor } from 'typescript-rtti';
|
|
2
|
-
import { XMLModelOptions, XMLModelPropertyOptions, CreateXMLModelOptions } from './types';
|
|
3
|
-
import { XMLRoot } from '../types';
|
|
4
|
-
export declare function getParentModel(model: XMLModel<any>): XMLModel<any>;
|
|
5
|
-
export declare class XMLModel<T = any> {
|
|
6
|
-
readonly type: Constructor<T>;
|
|
7
|
-
options: XMLModelOptions<T>;
|
|
8
|
-
constructor(type: Constructor<T>, options: CreateXMLModelOptions<T>);
|
|
9
|
-
fromXML(xml: XMLRoot | string): T;
|
|
10
|
-
toXML(instance: unknown): XMLRoot;
|
|
11
|
-
get reflectedClass(): import('typescript-rtti').ReflectedClass<Constructor<T>>;
|
|
12
|
-
resolveAllProperties(): Map<string, XMLModelPropertyOptions<any> & {
|
|
13
|
-
model: any;
|
|
14
|
-
}>;
|
|
15
|
-
}
|
|
16
|
-
export declare function createModel<T>(type: Constructor<T>, options: CreateXMLModelOptions<T>): XMLModel<T>;
|
|
17
|
-
declare function ModelDecoratorFactory<T>(options?: CreateXMLModelOptions<T>): (constructor: Constructor<T>) => void;
|
|
18
|
-
export { getModel } from './registry';
|
|
19
|
-
export { ModelDecoratorFactory as Model };
|
|
20
|
-
export { Prop } from './property';
|
|
21
|
-
//# sourceMappingURL=index.d.ts.map
|
package/dist/model/index.js
DELETED
|
@@ -1,236 +0,0 @@
|
|
|
1
|
-
import "../_virtual/Reflect.js";
|
|
2
|
-
import { reflect } from "typescript-rtti";
|
|
3
|
-
import { ToXMLConversionError, PropertyToXMLConversionError, FromXMLConversionError, PropertyFromXMLConversionError } from "../errors.js";
|
|
4
|
-
import mergeMaps from "../util/merge-maps.js";
|
|
5
|
-
import { resolve, MiddlewareChain } from "../middleware.js";
|
|
6
|
-
import { getPropertyConversionOptions } from "./property.js";
|
|
7
|
-
import { Prop } from "./property.js";
|
|
8
|
-
import XML from "../xml/index.js";
|
|
9
|
-
import { defaults } from "../defaults.js";
|
|
10
|
-
import { findModel, registrerModel } from "./registry.js";
|
|
11
|
-
import { getModel } from "./registry.js";
|
|
12
|
-
import registerBuiltIns from "./built-ins.js";
|
|
13
|
-
function* ParentChain(constructor) {
|
|
14
|
-
let parent = Object.getPrototypeOf(constructor);
|
|
15
|
-
if (parent === constructor) {
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
while (parent) {
|
|
19
|
-
yield parent;
|
|
20
|
-
const _parent = Object.getPrototypeOf(constructor);
|
|
21
|
-
if (parent === _parent) {
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
parent = _parent;
|
|
25
|
-
}
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
function getParentModel(model) {
|
|
29
|
-
if (model.options.parent) return model.options.parent;
|
|
30
|
-
for (const constructor of ParentChain(model.type)) {
|
|
31
|
-
const model2 = findModel(constructor);
|
|
32
|
-
if (model2) {
|
|
33
|
-
return model2;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
return null;
|
|
37
|
-
}
|
|
38
|
-
class XMLModel {
|
|
39
|
-
constructor(type, options) {
|
|
40
|
-
this.type = type;
|
|
41
|
-
const model = this;
|
|
42
|
-
let parent = void 0;
|
|
43
|
-
const getParent = () => {
|
|
44
|
-
if (typeof parent === "undefined") parent = getParentModel(this);
|
|
45
|
-
return parent;
|
|
46
|
-
};
|
|
47
|
-
let propertiesLoaded = false;
|
|
48
|
-
const properties = {
|
|
49
|
-
options: /* @__PURE__ */ new Map(),
|
|
50
|
-
fromXML: {
|
|
51
|
-
get parent() {
|
|
52
|
-
return getParent()?.options.properties.fromXML || null;
|
|
53
|
-
},
|
|
54
|
-
middlewares: [
|
|
55
|
-
(context, next) => {
|
|
56
|
-
const record = getParent() ? next() : {};
|
|
57
|
-
properties.options.forEach((property) => {
|
|
58
|
-
const xml = context.xml;
|
|
59
|
-
const elements = property.resolveElements({
|
|
60
|
-
model,
|
|
61
|
-
xml,
|
|
62
|
-
property
|
|
63
|
-
});
|
|
64
|
-
const propertyFromXMLContext = {
|
|
65
|
-
model,
|
|
66
|
-
xml: context.xml,
|
|
67
|
-
property,
|
|
68
|
-
elements
|
|
69
|
-
};
|
|
70
|
-
try {
|
|
71
|
-
record[property.name] = property.fromXML(propertyFromXMLContext);
|
|
72
|
-
} catch (error) {
|
|
73
|
-
if (error instanceof FromXMLConversionError) {
|
|
74
|
-
throw error;
|
|
75
|
-
} else {
|
|
76
|
-
throw new PropertyFromXMLConversionError(context, propertyFromXMLContext, error);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
return record;
|
|
81
|
-
}
|
|
82
|
-
]
|
|
83
|
-
},
|
|
84
|
-
toXML: {
|
|
85
|
-
get parent() {
|
|
86
|
-
return getParent()?.options.properties.toXML || null;
|
|
87
|
-
},
|
|
88
|
-
middlewares: [
|
|
89
|
-
(context, next) => {
|
|
90
|
-
const record = getParent() ? next() : {};
|
|
91
|
-
properties.options.forEach((options2) => {
|
|
92
|
-
const propertyToXMLContext = {
|
|
93
|
-
model,
|
|
94
|
-
object: context.object,
|
|
95
|
-
property: options2,
|
|
96
|
-
value: context.object[options2.name]
|
|
97
|
-
};
|
|
98
|
-
try {
|
|
99
|
-
record[options2.name] = options2.toXML(propertyToXMLContext);
|
|
100
|
-
} catch (error) {
|
|
101
|
-
if (error instanceof ToXMLConversionError) {
|
|
102
|
-
throw error;
|
|
103
|
-
} else {
|
|
104
|
-
throw new PropertyToXMLConversionError(context, propertyToXMLContext, error);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
});
|
|
108
|
-
return record;
|
|
109
|
-
}
|
|
110
|
-
]
|
|
111
|
-
}
|
|
112
|
-
};
|
|
113
|
-
const loadProperties = () => {
|
|
114
|
-
const props = this.reflectedClass.ownProperties.filter(
|
|
115
|
-
(prop) => typeof prop.host.constructor.prototype[prop.name] !== "function"
|
|
116
|
-
);
|
|
117
|
-
props.forEach((property) => {
|
|
118
|
-
const options2 = getPropertyConversionOptions(
|
|
119
|
-
this.type,
|
|
120
|
-
property.name
|
|
121
|
-
);
|
|
122
|
-
if (!options2.ignored) {
|
|
123
|
-
properties.options.set(property.name, options2);
|
|
124
|
-
}
|
|
125
|
-
});
|
|
126
|
-
propertiesLoaded = true;
|
|
127
|
-
};
|
|
128
|
-
this.options = {
|
|
129
|
-
get properties() {
|
|
130
|
-
if (!propertiesLoaded) loadProperties();
|
|
131
|
-
return properties;
|
|
132
|
-
},
|
|
133
|
-
fromXML: {
|
|
134
|
-
middlewares: [],
|
|
135
|
-
get parent() {
|
|
136
|
-
return getParent()?.options.fromXML || null;
|
|
137
|
-
}
|
|
138
|
-
},
|
|
139
|
-
toXML: {
|
|
140
|
-
middlewares: [],
|
|
141
|
-
get parent() {
|
|
142
|
-
return getParent()?.options.toXML || null;
|
|
143
|
-
}
|
|
144
|
-
},
|
|
145
|
-
get tagname() {
|
|
146
|
-
return options.tagname || defaults.tagnameFromModel(model);
|
|
147
|
-
}
|
|
148
|
-
};
|
|
149
|
-
if (options.parent) this.options.parent = options.parent;
|
|
150
|
-
if (!getParent()) {
|
|
151
|
-
this.options.fromXML.middlewares.push((ctx) => defaults.fromXML(ctx));
|
|
152
|
-
this.options.toXML.middlewares.push((ctx) => defaults.toXML(ctx));
|
|
153
|
-
}
|
|
154
|
-
if (options.fromXML) this.options.fromXML.middlewares.push(options.fromXML);
|
|
155
|
-
if (options.toXML) this.options.toXML.middlewares.push(options.toXML);
|
|
156
|
-
}
|
|
157
|
-
fromXML(xml) {
|
|
158
|
-
const _xml = typeof xml === "string" ? XML.parse(xml) : xml;
|
|
159
|
-
const model = this;
|
|
160
|
-
const context = {
|
|
161
|
-
xml: _xml,
|
|
162
|
-
get properties() {
|
|
163
|
-
const propContext = {
|
|
164
|
-
xml: _xml,
|
|
165
|
-
model
|
|
166
|
-
};
|
|
167
|
-
return resolve(MiddlewareChain(model.options.properties.fromXML), propContext);
|
|
168
|
-
},
|
|
169
|
-
model
|
|
170
|
-
};
|
|
171
|
-
return resolve(MiddlewareChain(this.options.fromXML), context);
|
|
172
|
-
}
|
|
173
|
-
toXML(instance) {
|
|
174
|
-
const model = this;
|
|
175
|
-
if (instance instanceof this.type || typeof instance !== "undefined" && instance.constructor === this.type) {
|
|
176
|
-
const context = {
|
|
177
|
-
object: instance,
|
|
178
|
-
get properties() {
|
|
179
|
-
const propContext = {
|
|
180
|
-
object: instance,
|
|
181
|
-
model
|
|
182
|
-
};
|
|
183
|
-
return resolve(MiddlewareChain(model.options.properties.toXML), propContext);
|
|
184
|
-
},
|
|
185
|
-
model: this
|
|
186
|
-
};
|
|
187
|
-
return resolve(MiddlewareChain(this.options.toXML), context);
|
|
188
|
-
} else {
|
|
189
|
-
throw new TypeError(`provided object is not an instance of ${this.type.name}`);
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
get reflectedClass() {
|
|
193
|
-
return reflect(this.type);
|
|
194
|
-
}
|
|
195
|
-
resolveAllProperties() {
|
|
196
|
-
const ownProperties = /* @__PURE__ */ new Map();
|
|
197
|
-
const parent = getParentModel(this);
|
|
198
|
-
this.options.properties.options.forEach((options, key) => {
|
|
199
|
-
ownProperties.set(
|
|
200
|
-
key,
|
|
201
|
-
new Proxy(options, {
|
|
202
|
-
get: (target, p, reciever) => {
|
|
203
|
-
if (p === "model") return this;
|
|
204
|
-
else return Reflect.get(target, p, reciever);
|
|
205
|
-
}
|
|
206
|
-
})
|
|
207
|
-
// FIXME: is typing ok ?
|
|
208
|
-
);
|
|
209
|
-
});
|
|
210
|
-
const res = parent ? mergeMaps(parent.resolveAllProperties(), ownProperties) : ownProperties;
|
|
211
|
-
return res;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
function createModel(type, options) {
|
|
215
|
-
if (findModel(type)) {
|
|
216
|
-
throw new TypeError(`a model for type ${type.name} already exists`);
|
|
217
|
-
}
|
|
218
|
-
const model = new XMLModel(type, options);
|
|
219
|
-
registrerModel(model);
|
|
220
|
-
return model;
|
|
221
|
-
}
|
|
222
|
-
function ModelDecoratorFactory(options) {
|
|
223
|
-
return function(constructor) {
|
|
224
|
-
if (!findModel(constructor)) createModel(constructor, options || {});
|
|
225
|
-
};
|
|
226
|
-
}
|
|
227
|
-
registerBuiltIns(createModel);
|
|
228
|
-
export {
|
|
229
|
-
ModelDecoratorFactory as Model,
|
|
230
|
-
Prop,
|
|
231
|
-
XMLModel,
|
|
232
|
-
createModel,
|
|
233
|
-
getModel,
|
|
234
|
-
getParentModel
|
|
235
|
-
};
|
|
236
|
-
//# sourceMappingURL=index.js.map
|
package/dist/model/property.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { Constructor } from 'typescript-rtti';
|
|
2
|
-
import { XMLModelProperty, XMLModelPropertyOptions, CreateXMLModelPropertyOptions } from './types';
|
|
3
|
-
export declare function getPropertyConversionOptions<T>(constructor: Constructor<T>, property: XMLModelProperty<T>): XMLModelPropertyOptions<T>;
|
|
4
|
-
declare function PropDecoratorFactory<T = any>(options?: CreateXMLModelPropertyOptions<T>): (prototype: any, property: XMLModelProperty<T>) => void;
|
|
5
|
-
export { PropDecoratorFactory as Prop };
|
|
6
|
-
//# sourceMappingURL=property.d.ts.map
|
package/dist/model/property.js
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { reflect } from "typescript-rtti";
|
|
2
|
-
import { defaults } from "../defaults.js";
|
|
3
|
-
import isRegExp from "../util/is-regexp.js";
|
|
4
|
-
function resolvePropertyConversionOptions(options, constructor, property) {
|
|
5
|
-
const _options = {
|
|
6
|
-
name: property,
|
|
7
|
-
get reflected() {
|
|
8
|
-
const reflectedClass = reflect(constructor);
|
|
9
|
-
return reflectedClass.getOwnProperty(property) || reflectedClass.getProperty(property);
|
|
10
|
-
},
|
|
11
|
-
get tagname() {
|
|
12
|
-
return options.tagname || defaults.tagnameFromProperty(this);
|
|
13
|
-
},
|
|
14
|
-
inline: !!options.inline,
|
|
15
|
-
ignored: !!options.ignore,
|
|
16
|
-
isSourceElement: (...args) => defaults.propertySourceElementsFilter(...args),
|
|
17
|
-
resolveElements: options.resolveElements ? options.resolveElements : (...args) => defaults.propertyResolveSourceElements(...args),
|
|
18
|
-
fromXML: (context) => (options.fromXML ?? defaults.propertyFromXML)(context),
|
|
19
|
-
toXML: (context) => (options.toXML ?? defaults.propertyToXML)(context)
|
|
20
|
-
};
|
|
21
|
-
if (options?.model) _options.model = options.model;
|
|
22
|
-
if (options?.sourceElements) {
|
|
23
|
-
const _sourceElements = options.sourceElements;
|
|
24
|
-
if (typeof _sourceElements === "string") {
|
|
25
|
-
_options.isSourceElement = (element) => element.name === _sourceElements;
|
|
26
|
-
} else if (isRegExp(_sourceElements)) {
|
|
27
|
-
_options.isSourceElement = (element) => _sourceElements.test(element.name || "");
|
|
28
|
-
} else if (_sourceElements) {
|
|
29
|
-
_options.isSourceElement = _sourceElements;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
return _options;
|
|
33
|
-
}
|
|
34
|
-
const PropertyOptions = /* @__PURE__ */ new Map();
|
|
35
|
-
function storePropertyConversionOptions(constructor, property, options) {
|
|
36
|
-
let map = PropertyOptions.get(constructor);
|
|
37
|
-
if (!map) {
|
|
38
|
-
map = /* @__PURE__ */ new Map();
|
|
39
|
-
PropertyOptions.set(constructor, map);
|
|
40
|
-
}
|
|
41
|
-
map.set(property, options);
|
|
42
|
-
}
|
|
43
|
-
function findPropertyConversionOptions(constructor, property) {
|
|
44
|
-
const options = PropertyOptions.get(constructor);
|
|
45
|
-
if (options) {
|
|
46
|
-
return options.get(property);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
function getPropertyConversionOptions(constructor, property) {
|
|
50
|
-
const options = findPropertyConversionOptions(constructor, property);
|
|
51
|
-
return options ?? resolvePropertyConversionOptions({}, constructor, property);
|
|
52
|
-
}
|
|
53
|
-
function PropDecoratorFactory(options) {
|
|
54
|
-
return function(prototype, property) {
|
|
55
|
-
const _options = resolvePropertyConversionOptions(
|
|
56
|
-
options ?? {},
|
|
57
|
-
prototype.constructor,
|
|
58
|
-
property
|
|
59
|
-
);
|
|
60
|
-
storePropertyConversionOptions(prototype.constructor, property, _options);
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
export {
|
|
64
|
-
PropDecoratorFactory as Prop,
|
|
65
|
-
getPropertyConversionOptions
|
|
66
|
-
};
|
|
67
|
-
//# sourceMappingURL=property.js.map
|
package/dist/model/registry.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { Constructor } from 'typescript-rtti';
|
|
2
|
-
import { XMLModel } from '.';
|
|
3
|
-
type ModelID<T> = Constructor<T>;
|
|
4
|
-
export declare const Models: Map<ModelID<unknown>, XMLModel<unknown>>;
|
|
5
|
-
export declare function registrerModel(model: XMLModel<unknown>): Map<ModelID<unknown>, XMLModel<unknown>>;
|
|
6
|
-
export declare function findModel<T>(id: ModelID<T>): XMLModel<T> | undefined;
|
|
7
|
-
export declare function getModel<T>(id: ModelID<T>): XMLModel<T>;
|
|
8
|
-
export {};
|
|
9
|
-
//# sourceMappingURL=registry.d.ts.map
|
package/dist/model/registry.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
const Models = /* @__PURE__ */ new Map();
|
|
2
|
-
function registrerModel(model) {
|
|
3
|
-
return Models.set(model.type, model);
|
|
4
|
-
}
|
|
5
|
-
function findModel(id) {
|
|
6
|
-
return Models.get(id);
|
|
7
|
-
}
|
|
8
|
-
function getModel(id) {
|
|
9
|
-
const model = findModel(id);
|
|
10
|
-
if (model) return model;
|
|
11
|
-
else throw new TypeError(`couldn't find model for type ${id.name}`);
|
|
12
|
-
}
|
|
13
|
-
export {
|
|
14
|
-
Models,
|
|
15
|
-
findModel,
|
|
16
|
-
getModel,
|
|
17
|
-
registrerModel
|
|
18
|
-
};
|
|
19
|
-
//# sourceMappingURL=registry.js.map
|