xml-model 0.2.3 → 0.2.4

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.
@@ -15,7 +15,7 @@ const __RΦ = { m: (k, v) => (t, ...a) => t && Reflect.metadata ? Reflect.metada
15
15
  __RΦ.t[id] = t = l;
16
16
  }
17
17
  return t;
18
- }, t: { [4]: { RΦ: t => ({ TΦ: "~" }) }, [111]: { RΦ: t => ({ TΦ: "O", m: [{ n: "elements", f: "", t: __RΦ.a(107) }] }) }, [107]: { RΦ: t => ({ TΦ: "[", e: __RΦ.a(105) }) }, [105]: { LΦ: t => require("../types").IΦXMLElement }, [13]: { LΦ: t => String }, [14]: { LΦ: t => Number }, [1696]: { RΦ: t => ({ TΦ: "O", m: [{ n: "elements", f: "", t: __RΦ.a(3123) }] }) }, [3123]: { RΦ: t => ({ TΦ: "[", e: __RΦ.a(3121) }) }, [3121]: { RΦ: t => ({ TΦ: "O", m: [{ n: "type", f: "", t: __RΦ.a(13) }, { n: "name", f: "", t: __RΦ.a(13) }] }) }, [20]: { LΦ: t => Boolean } } };
18
+ }, t: { [4]: { RΦ: t => ({ TΦ: "~" }) }, [111]: { RΦ: t => ({ TΦ: "O", m: [{ n: "elements", f: "", t: __RΦ.a(107) }] }) }, [107]: { RΦ: t => ({ TΦ: "[", e: __RΦ.a(105) }) }, [105]: { LΦ: t => require("../types").IΦXMLElement }, [13]: { LΦ: t => String }, [14]: { LΦ: t => Number }, [1696]: { RΦ: t => ({ TΦ: "O", m: [{ n: "elements", f: "", t: __RΦ.a(3124) }] }) }, [3124]: { RΦ: t => ({ TΦ: "[", e: __RΦ.a(3122) }) }, [3122]: { RΦ: t => ({ TΦ: "O", m: [{ n: "type", f: "", t: __RΦ.a(13) }, { n: "name", f: "", t: __RΦ.a(13) }] }) }, [20]: { LΦ: t => Boolean } } };
19
19
  const model_1 = require("../model");
20
20
  const xml_1 = require("../xml");
21
21
  // string is <string>value</string>
@@ -221,9 +221,10 @@ class XMLModel {
221
221
  const properties = new Map();
222
222
  const parent = getParentModel(this);
223
223
  if (parent)
224
- parent
225
- .resolveAllProperties()
226
- .forEach(__RΦ.f((prop, key) => properties.set(key, prop), [__RΦ.m("rt:p", [{ n: "prop", t: () => __RΦ.a(4), v: null }, { n: "key", t: () => __RΦ.a(4), v: null }]), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(1069))], ""));
224
+ parent.resolveAllProperties().forEach(__RΦ.f((prop, key) => {
225
+ properties.delete(key); // delete prop if already present
226
+ properties.set(key, prop);
227
+ }, [__RΦ.m("rt:p", [{ n: "prop", t: () => __RΦ.a(4), v: null }, { n: "key", t: () => __RΦ.a(4), v: null }]), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(22))], ""));
227
228
  this.options.properties.options.forEach(__RΦ.f((options, key) => properties.set(key, new Proxy(options, {
228
229
  get: __RΦ.f((target, p, reciever) => {
229
230
  if (p === "model")
@@ -0,0 +1,2 @@
1
+ import "mocha";
2
+ import "reflect-metadata";
@@ -0,0 +1,234 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const __RΦ = { m: (k, v) => (t, ...a) => t && Reflect.metadata ? Reflect.metadata(k, v)(t, ...a) : void 0, f: (f, d, n) => (d.forEach(d => d(f)), Object.defineProperty(f, "name", { value: n, writable: false }), f), c: (c, d, dp, dsp, n) => (d.forEach(d => d(c)), dp.forEach(([p, d]) => d(c.prototype, p)), dsp.forEach(([p, d]) => d(c, p)), n ? Object.defineProperty(c, "name", { value: n, writable: false }) : undefined, c), r: (o, a) => (Object.assign(o, a)), a: id => {
13
+ let t = __RΦ.t[id];
14
+ if (t === void 0)
15
+ return void 0;
16
+ if (t.RΦ) {
17
+ let r = t.RΦ;
18
+ delete t.RΦ;
19
+ __RΦ.r(t, r(t));
20
+ }
21
+ else if (t.LΦ) {
22
+ let l = t.LΦ();
23
+ delete t.LΦ;
24
+ __RΦ.t[id] = t = l;
25
+ }
26
+ return t;
27
+ }, t: { [2701]: { RΦ: t => ({ TΦ: "O", m: [{ n: "propA", f: "", t: __RΦ.a(13) }, { n: "propB", f: "", t: __RΦ.a(20) }, { n: "propC", f: "", t: __RΦ.a(2717) }, { n: "propD", f: "", t: __RΦ.a(705) }, { n: "__constructor", f: "", t: __RΦ.a(4) }] }) }, [13]: { LΦ: t => String }, [20]: { LΦ: t => Boolean }, [2717]: { RΦ: t => ({ TΦ: "[", e: __RΦ.a(2715) }) }, [2715]: { TΦ: "5", name: "B" }, [705]: { RΦ: t => ({ TΦ: "|", t: [__RΦ.a(47), __RΦ.a(135)] }) }, [47]: { LΦ: t => 0 }, [135]: { LΦ: t => 1 }, [4]: { RΦ: t => ({ TΦ: "~" }) }, [2653]: { RΦ: t => ({ TΦ: "O", m: [{ n: "name", f: "", t: __RΦ.a(13) }, { n: "nbPages", f: "", t: __RΦ.a(14) }] }) }, [14]: { LΦ: t => Number }, [2672]: { RΦ: t => ({ TΦ: "[", e: __RΦ.a(2616) }) }, [2616]: { TΦ: "5", name: "Book" }, [22]: { RΦ: t => ({ TΦ: "V" }) }, [101]: { RΦ: t => ({ TΦ: "m", t: __RΦ.a(102), p: [] }) }, [102]: { LΦ: t => Object } } };
28
+ require("mocha");
29
+ const chai_1 = require("chai");
30
+ require("reflect-metadata");
31
+ const model_1 = require("./model");
32
+ const xml_1 = __importDefault(require("./xml"));
33
+ const typescript_rtti_1 = require("typescript-rtti");
34
+ let Book = class Book {
35
+ constructor(options) {
36
+ this.name = options.name;
37
+ this.nbPages = options.nbPages;
38
+ }
39
+ };
40
+ Book = __decorate([
41
+ (0, model_1.Model)({
42
+ fromXML({ model, properties }) {
43
+ return new model.type(properties);
44
+ },
45
+ })
46
+ ], Book);
47
+ (t => __RΦ.t[2616] = t)(Book);
48
+ __RΦ.m("rt:SP", [])(Book);
49
+ __RΦ.m("rt:P", ["name", "nbPages"])(Book);
50
+ __RΦ.m("rt:Sm", [])(Book);
51
+ __RΦ.m("rt:m", ["fromXML"])(Book);
52
+ __RΦ.m("rt:p", [{ n: "options", t: () => __RΦ.a(2653), v: null }])(Book);
53
+ __RΦ.m("rt:f", "C")(Book);
54
+ __RΦ.m("rt:t", () => __RΦ.a(13))(Book.prototype, "name");
55
+ __RΦ.m("rt:f", "P")(Book.prototype, "name");
56
+ __RΦ.m("rt:t", () => __RΦ.a(14))(Book.prototype, "nbPages");
57
+ __RΦ.m("rt:f", "P")(Book.prototype, "nbPages");
58
+ let Library = class Library {
59
+ constructor(name, ...books) {
60
+ this.books = [];
61
+ this.name = name;
62
+ this.books.push(...books);
63
+ }
64
+ };
65
+ Library = __decorate([
66
+ (0, model_1.Model)({
67
+ fromXML({ model, properties }) {
68
+ return new model.type(properties.name, ...properties.books);
69
+ },
70
+ })
71
+ ], Library);
72
+ (t => __RΦ.t[2656] = t)(Library);
73
+ __RΦ.m("rt:SP", [])(Library);
74
+ __RΦ.m("rt:P", ["name", "books"])(Library);
75
+ __RΦ.m("rt:Sm", [])(Library);
76
+ __RΦ.m("rt:m", ["fromXML"])(Library);
77
+ __RΦ.m("rt:p", [{ n: "name", t: () => __RΦ.a(13), v: null }, { n: "books", t: () => __RΦ.a(2672), v: null, f: "3" }])(Library);
78
+ __RΦ.m("rt:f", "C")(Library);
79
+ __RΦ.m("rt:t", () => __RΦ.a(13))(Library.prototype, "name");
80
+ __RΦ.m("rt:f", "P")(Library.prototype, "name");
81
+ __RΦ.m("rt:t", () => __RΦ.a(2672))(Library.prototype, "books");
82
+ __RΦ.m("rt:f", "P")(Library.prototype, "books");
83
+ describe("Library Example", __RΦ.f(() => {
84
+ const library = new Library("test");
85
+ for (let i = 1; i <= 4; i++) {
86
+ const book = new Book({ name: `Book #${i}`, nbPages: Math.pow(10, i) });
87
+ library.books.push(book);
88
+ }
89
+ const libraryXMLString = xml_1.default.stringify(xml_1.default.parse(`<library>
90
+ <name>${library.name}</name>
91
+ <books>
92
+ ${library.books
93
+ .map(__RΦ.f((book) => ` <book>
94
+ <name>${book.name}</name>
95
+ <nb-pages>${book.nbPages}</nb-pages>
96
+ </book>`, [__RΦ.m("rt:p", [{ n: "book", t: () => __RΦ.a(4), v: null }]), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(13))], ""))
97
+ .join("")}
98
+ </books>
99
+ </library>`));
100
+ it("Object -> XML", __RΦ.f(() => {
101
+ const xml = (0, model_1.getModel)(Library).toXML(library);
102
+ (0, chai_1.expect)(xml_1.default.stringify(xml)).to.equal(libraryXMLString);
103
+ }, [__RΦ.m("rt:p", []), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(22))], ""));
104
+ it("XML -> Object", __RΦ.f(() => {
105
+ const parsedLibrary = (0, model_1.getModel)(Library).fromXML(libraryXMLString);
106
+ (0, chai_1.expect)(parsedLibrary instanceof Library).to.be.true;
107
+ (0, chai_1.expect)(parsedLibrary).to.deep.equal(library);
108
+ }, [__RΦ.m("rt:p", []), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(22))], ""));
109
+ }, [__RΦ.m("rt:p", []), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(22))], ""));
110
+ let A = class A {
111
+ constructor(record) {
112
+ this.propA = "";
113
+ this.propB = true;
114
+ this.propC = [];
115
+ this.propD = 0;
116
+ if (record)
117
+ Object.entries(record).forEach(__RΦ.f(([key, val]) => {
118
+ this[key] = val;
119
+ }, [__RΦ.m("rt:p", [{ n: "[key, val]", t: () => __RΦ.a(4), v: null }]), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(22))], ""));
120
+ }
121
+ };
122
+ __decorate([
123
+ (0, model_1.Prop)({ tagname: "b", inline: true })
124
+ ], A.prototype, "propC", void 0);
125
+ __decorate([
126
+ (0, model_1.Prop)({ tagname: "propd" })
127
+ ], A.prototype, "propD", void 0);
128
+ A = __decorate([
129
+ (0, model_1.Model)({
130
+ fromXML({ model, properties }) {
131
+ return new model.type(properties);
132
+ },
133
+ })
134
+ ], A);
135
+ (t => __RΦ.t[2702] = t)(A);
136
+ __RΦ.m("rt:SP", [])(A);
137
+ __RΦ.m("rt:P", ["propA", "propB", "propC", "propD"])(A);
138
+ __RΦ.m("rt:Sm", [])(A);
139
+ __RΦ.m("rt:m", ["fromXML"])(A);
140
+ __RΦ.m("rt:p", [{ n: "record", t: () => __RΦ.a(101), v: null, f: "?" }])(A);
141
+ __RΦ.m("rt:f", "C")(A);
142
+ __RΦ.m("rt:t", () => __RΦ.a(13))(A.prototype, "propA");
143
+ __RΦ.m("rt:f", "P")(A.prototype, "propA");
144
+ __RΦ.m("rt:t", () => __RΦ.a(20))(A.prototype, "propB");
145
+ __RΦ.m("rt:f", "P")(A.prototype, "propB");
146
+ __RΦ.m("rt:t", () => __RΦ.a(2717))(A.prototype, "propC");
147
+ __RΦ.m("rt:f", "P")(A.prototype, "propC");
148
+ __RΦ.m("rt:t", () => __RΦ.a(705))(A.prototype, "propD");
149
+ __RΦ.m("rt:f", "P")(A.prototype, "propD");
150
+ let B = class B {
151
+ constructor(record) {
152
+ this.propA = 0;
153
+ if (record)
154
+ Object.entries(record).forEach(__RΦ.f(([key, val]) => {
155
+ this[key] = val;
156
+ }, [__RΦ.m("rt:p", [{ n: "[key, val]", t: () => __RΦ.a(4), v: null }]), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(22))], ""));
157
+ }
158
+ };
159
+ B = __decorate([
160
+ (0, model_1.Model)({
161
+ fromXML({ model, properties }) {
162
+ return new model.type(properties);
163
+ },
164
+ })
165
+ ], B);
166
+ (t => __RΦ.t[2715] = t)(B);
167
+ __RΦ.m("rt:SP", [])(B);
168
+ __RΦ.m("rt:P", ["propA"])(B);
169
+ __RΦ.m("rt:Sm", [])(B);
170
+ __RΦ.m("rt:m", ["fromXML"])(B);
171
+ __RΦ.m("rt:p", [{ n: "record", t: () => __RΦ.a(101), v: null, f: "?" }])(B);
172
+ __RΦ.m("rt:f", "C")(B);
173
+ __RΦ.m("rt:t", () => __RΦ.a(14))(B.prototype, "propA");
174
+ __RΦ.m("rt:f", "P")(B.prototype, "propA");
175
+ describe("Edgy Cases", __RΦ.f(() => {
176
+ const instance = new A();
177
+ for (let i = 0; i < 8; i++) {
178
+ const b = new B();
179
+ b.propA = i;
180
+ instance.propC.push(b);
181
+ }
182
+ const instanceXMLString = xml_1.default.stringify(xml_1.default.parse(`<a>
183
+ <prop-a>${instance.propA}</prop-a>
184
+ <prop-b>${instance.propB}</prop-b>
185
+ ${instance.propC.map(__RΦ.f((b) => `<b><prop-a>${b.propA}</prop-a></b>`, [__RΦ.m("rt:p", [{ n: "b", t: () => __RΦ.a(4), v: null }]), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(13))], "")).join("")}
186
+ <propd>${instance.propD}</propd>
187
+ </a>`));
188
+ it("should give right type infos", __RΦ.f(() => {
189
+ const reflectedA = (0, typescript_rtti_1.reflect)(A, { TΦ: "c", t: void 0, p: [__RΦ.a(2701)], r: void 0, tp: [] });
190
+ (0, chai_1.assert)(reflectedA === (0, typescript_rtti_1.reflect)(A, { TΦ: "c", t: void 0, p: [__RΦ.a(2701)], r: void 0, tp: [] }));
191
+ (0, chai_1.expect)(reflectedA.getProperty("propA").type.isClass(String)).to.be.true;
192
+ (0, chai_1.expect)(reflectedA.getProperty("propB").type.isClass(Boolean)).to.be.true;
193
+ const ModelAPropCType = reflectedA.getProperty("propC").type;
194
+ (0, chai_1.expect)(ModelAPropCType.is("array") && ModelAPropCType.elementType.isClass(B)).to.be.true;
195
+ const ModelAPropDType = reflectedA.getProperty("propD").type;
196
+ (0, chai_1.expect)(ModelAPropDType.is("union")).to.be.true;
197
+ }, [__RΦ.m("rt:p", []), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(22))], ""));
198
+ it("XML -> Object", __RΦ.f(() => {
199
+ const parsed = (0, model_1.getModel)(A).fromXML(instanceXMLString);
200
+ (0, chai_1.expect)(parsed instanceof A).to.be.true;
201
+ (0, chai_1.expect)(parsed).to.deep.equal(instance);
202
+ }, [__RΦ.m("rt:p", []), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(22))], ""));
203
+ it("Object -> XML", __RΦ.f(() => {
204
+ const xml = (0, model_1.getModel)(A).toXML(instance);
205
+ (0, chai_1.expect)(xml_1.default.stringify(xml)).to.equal(instanceXMLString);
206
+ }, [__RΦ.m("rt:p", []), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(22))], ""));
207
+ }, [__RΦ.m("rt:p", []), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(22))], ""));
208
+ let C = class C extends B {
209
+ constructor() {
210
+ super(...arguments);
211
+ this.propB = 3;
212
+ }
213
+ };
214
+ C = __decorate([
215
+ (0, model_1.Model)()
216
+ ], C);
217
+ (t => __RΦ.t[2765] = t)(C);
218
+ __RΦ.m("rt:SP", [])(C);
219
+ __RΦ.m("rt:P", ["propB"])(C);
220
+ __RΦ.m("rt:Sm", [])(C);
221
+ __RΦ.m("rt:m", [])(C);
222
+ __RΦ.m("rt:f", "C")(C);
223
+ __RΦ.m("rt:t", () => __RΦ.a(14))(C.prototype, "propB");
224
+ __RΦ.m("rt:f", "P")(C.prototype, "propB");
225
+ describe("Inheritance", __RΦ.f(() => {
226
+ const cInstance = new C();
227
+ const cInstanceXMLString = `<c><prop-a>${cInstance.propA}</prop-a><prop-b>${cInstance.propB}</prop-b></c>`;
228
+ it("XML -> Object", __RΦ.f(() => {
229
+ (0, chai_1.expect)((0, model_1.getModel)(C).fromXML(cInstanceXMLString)).to.deep.equal(cInstance);
230
+ }, [__RΦ.m("rt:p", []), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(22))], ""));
231
+ it("Object -> XML", __RΦ.f(() => {
232
+ (0, chai_1.expect)(xml_1.default.stringify((0, model_1.getModel)(C).toXML(cInstance))).to.equal(cInstanceXMLString);
233
+ }, [__RΦ.m("rt:p", []), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(22))], ""));
234
+ }, [__RΦ.m("rt:p", []), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(22))], ""));
@@ -13,7 +13,7 @@ const __RΦ = { m: (k, v) => (t, ...a) => t && Reflect.metadata ? Reflect.metada
13
13
  __RΦ.t[id] = t = l;
14
14
  }
15
15
  return t;
16
- }, t: { [4]: { RΦ: t => ({ TΦ: "~" }) }, [111]: { RΦ: t => ({ TΦ: "O", m: [{ n: "elements", f: "", t: __RΦ.a(107) }] }) }, [107]: { RΦ: t => ({ TΦ: "[", e: __RΦ.a(105) }) }, [105]: { LΦ: t => LΦ_0.IΦXMLElement }, [13]: { LΦ: t => String }, [14]: { LΦ: t => Number }, [1696]: { RΦ: t => ({ TΦ: "O", m: [{ n: "elements", f: "", t: __RΦ.a(3123) }] }) }, [3123]: { RΦ: t => ({ TΦ: "[", e: __RΦ.a(3121) }) }, [3121]: { RΦ: t => ({ TΦ: "O", m: [{ n: "type", f: "", t: __RΦ.a(13) }, { n: "name", f: "", t: __RΦ.a(13) }] }) }, [20]: { LΦ: t => Boolean } } };
16
+ }, t: { [4]: { RΦ: t => ({ TΦ: "~" }) }, [111]: { RΦ: t => ({ TΦ: "O", m: [{ n: "elements", f: "", t: __RΦ.a(107) }] }) }, [107]: { RΦ: t => ({ TΦ: "[", e: __RΦ.a(105) }) }, [105]: { LΦ: t => LΦ_0.IΦXMLElement }, [13]: { LΦ: t => String }, [14]: { LΦ: t => Number }, [1696]: { RΦ: t => ({ TΦ: "O", m: [{ n: "elements", f: "", t: __RΦ.a(3124) }] }) }, [3124]: { RΦ: t => ({ TΦ: "[", e: __RΦ.a(3122) }) }, [3122]: { RΦ: t => ({ TΦ: "O", m: [{ n: "type", f: "", t: __RΦ.a(13) }, { n: "name", f: "", t: __RΦ.a(13) }] }) }, [20]: { LΦ: t => Boolean } } };
17
17
  import { createModel } from "../model";
18
18
  import { getContent, fromContent } from "../xml";
19
19
  import * as LΦ_0 from "../types";
@@ -218,9 +218,10 @@ export class XMLModel {
218
218
  const properties = new Map();
219
219
  const parent = getParentModel(this);
220
220
  if (parent)
221
- parent
222
- .resolveAllProperties()
223
- .forEach(__RΦ.f((prop, key) => properties.set(key, prop), [__RΦ.m("rt:p", [{ n: "prop", t: () => __RΦ.a(4), v: null }, { n: "key", t: () => __RΦ.a(4), v: null }]), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(1069))], ""));
221
+ parent.resolveAllProperties().forEach(__RΦ.f((prop, key) => {
222
+ properties.delete(key); // delete prop if already present
223
+ properties.set(key, prop);
224
+ }, [__RΦ.m("rt:p", [{ n: "prop", t: () => __RΦ.a(4), v: null }, { n: "key", t: () => __RΦ.a(4), v: null }]), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(22))], ""));
224
225
  this.options.properties.options.forEach(__RΦ.f((options, key) => properties.set(key, new Proxy(options, {
225
226
  get: __RΦ.f((target, p, reciever) => {
226
227
  if (p === "model")
@@ -0,0 +1,2 @@
1
+ import "mocha";
2
+ import "reflect-metadata";
@@ -0,0 +1,229 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ const __RΦ = { m: (k, v) => (t, ...a) => t && Reflect.metadata ? Reflect.metadata(k, v)(t, ...a) : void 0, f: (f, d, n) => (d.forEach(d => d(f)), Object.defineProperty(f, "name", { value: n, writable: false }), f), c: (c, d, dp, dsp, n) => (d.forEach(d => d(c)), dp.forEach(([p, d]) => d(c.prototype, p)), dsp.forEach(([p, d]) => d(c, p)), n ? Object.defineProperty(c, "name", { value: n, writable: false }) : undefined, c), r: (o, a) => (Object.assign(o, a)), a: id => {
8
+ let t = __RΦ.t[id];
9
+ if (t === void 0)
10
+ return void 0;
11
+ if (t.RΦ) {
12
+ let r = t.RΦ;
13
+ delete t.RΦ;
14
+ __RΦ.r(t, r(t));
15
+ }
16
+ else if (t.LΦ) {
17
+ let l = t.LΦ();
18
+ delete t.LΦ;
19
+ __RΦ.t[id] = t = l;
20
+ }
21
+ return t;
22
+ }, t: { [2701]: { RΦ: t => ({ TΦ: "O", m: [{ n: "propA", f: "", t: __RΦ.a(13) }, { n: "propB", f: "", t: __RΦ.a(20) }, { n: "propC", f: "", t: __RΦ.a(2717) }, { n: "propD", f: "", t: __RΦ.a(705) }, { n: "__constructor", f: "", t: __RΦ.a(4) }] }) }, [13]: { LΦ: t => String }, [20]: { LΦ: t => Boolean }, [2717]: { RΦ: t => ({ TΦ: "[", e: __RΦ.a(2715) }) }, [2715]: { TΦ: "5", name: "B" }, [705]: { RΦ: t => ({ TΦ: "|", t: [__RΦ.a(47), __RΦ.a(135)] }) }, [47]: { LΦ: t => 0 }, [135]: { LΦ: t => 1 }, [4]: { RΦ: t => ({ TΦ: "~" }) }, [2653]: { RΦ: t => ({ TΦ: "O", m: [{ n: "name", f: "", t: __RΦ.a(13) }, { n: "nbPages", f: "", t: __RΦ.a(14) }] }) }, [14]: { LΦ: t => Number }, [2672]: { RΦ: t => ({ TΦ: "[", e: __RΦ.a(2616) }) }, [2616]: { TΦ: "5", name: "Book" }, [22]: { RΦ: t => ({ TΦ: "V" }) }, [101]: { RΦ: t => ({ TΦ: "m", t: __RΦ.a(102), p: [] }) }, [102]: { LΦ: t => Object } } };
23
+ import "mocha";
24
+ import { expect, assert } from "chai";
25
+ import "reflect-metadata";
26
+ import { Model, Prop, getModel } from "./model";
27
+ import XML from "./xml";
28
+ import { reflect } from "typescript-rtti";
29
+ let Book = class Book {
30
+ constructor(options) {
31
+ this.name = options.name;
32
+ this.nbPages = options.nbPages;
33
+ }
34
+ };
35
+ Book = __decorate([
36
+ Model({
37
+ fromXML({ model, properties }) {
38
+ return new model.type(properties);
39
+ },
40
+ })
41
+ ], Book);
42
+ (t => __RΦ.t[2616] = t)(Book);
43
+ __RΦ.m("rt:SP", [])(Book);
44
+ __RΦ.m("rt:P", ["name", "nbPages"])(Book);
45
+ __RΦ.m("rt:Sm", [])(Book);
46
+ __RΦ.m("rt:m", ["fromXML"])(Book);
47
+ __RΦ.m("rt:p", [{ n: "options", t: () => __RΦ.a(2653), v: null }])(Book);
48
+ __RΦ.m("rt:f", "C")(Book);
49
+ __RΦ.m("rt:t", () => __RΦ.a(13))(Book.prototype, "name");
50
+ __RΦ.m("rt:f", "P")(Book.prototype, "name");
51
+ __RΦ.m("rt:t", () => __RΦ.a(14))(Book.prototype, "nbPages");
52
+ __RΦ.m("rt:f", "P")(Book.prototype, "nbPages");
53
+ let Library = class Library {
54
+ constructor(name, ...books) {
55
+ this.books = [];
56
+ this.name = name;
57
+ this.books.push(...books);
58
+ }
59
+ };
60
+ Library = __decorate([
61
+ Model({
62
+ fromXML({ model, properties }) {
63
+ return new model.type(properties.name, ...properties.books);
64
+ },
65
+ })
66
+ ], Library);
67
+ (t => __RΦ.t[2656] = t)(Library);
68
+ __RΦ.m("rt:SP", [])(Library);
69
+ __RΦ.m("rt:P", ["name", "books"])(Library);
70
+ __RΦ.m("rt:Sm", [])(Library);
71
+ __RΦ.m("rt:m", ["fromXML"])(Library);
72
+ __RΦ.m("rt:p", [{ n: "name", t: () => __RΦ.a(13), v: null }, { n: "books", t: () => __RΦ.a(2672), v: null, f: "3" }])(Library);
73
+ __RΦ.m("rt:f", "C")(Library);
74
+ __RΦ.m("rt:t", () => __RΦ.a(13))(Library.prototype, "name");
75
+ __RΦ.m("rt:f", "P")(Library.prototype, "name");
76
+ __RΦ.m("rt:t", () => __RΦ.a(2672))(Library.prototype, "books");
77
+ __RΦ.m("rt:f", "P")(Library.prototype, "books");
78
+ describe("Library Example", __RΦ.f(() => {
79
+ const library = new Library("test");
80
+ for (let i = 1; i <= 4; i++) {
81
+ const book = new Book({ name: `Book #${i}`, nbPages: Math.pow(10, i) });
82
+ library.books.push(book);
83
+ }
84
+ const libraryXMLString = XML.stringify(XML.parse(`<library>
85
+ <name>${library.name}</name>
86
+ <books>
87
+ ${library.books
88
+ .map(__RΦ.f((book) => ` <book>
89
+ <name>${book.name}</name>
90
+ <nb-pages>${book.nbPages}</nb-pages>
91
+ </book>`, [__RΦ.m("rt:p", [{ n: "book", t: () => __RΦ.a(4), v: null }]), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(13))], ""))
92
+ .join("")}
93
+ </books>
94
+ </library>`));
95
+ it("Object -> XML", __RΦ.f(() => {
96
+ const xml = getModel(Library).toXML(library);
97
+ expect(XML.stringify(xml)).to.equal(libraryXMLString);
98
+ }, [__RΦ.m("rt:p", []), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(22))], ""));
99
+ it("XML -> Object", __RΦ.f(() => {
100
+ const parsedLibrary = getModel(Library).fromXML(libraryXMLString);
101
+ expect(parsedLibrary instanceof Library).to.be.true;
102
+ expect(parsedLibrary).to.deep.equal(library);
103
+ }, [__RΦ.m("rt:p", []), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(22))], ""));
104
+ }, [__RΦ.m("rt:p", []), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(22))], ""));
105
+ let A = class A {
106
+ constructor(record) {
107
+ this.propA = "";
108
+ this.propB = true;
109
+ this.propC = [];
110
+ this.propD = 0;
111
+ if (record)
112
+ Object.entries(record).forEach(__RΦ.f(([key, val]) => {
113
+ this[key] = val;
114
+ }, [__RΦ.m("rt:p", [{ n: "[key, val]", t: () => __RΦ.a(4), v: null }]), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(22))], ""));
115
+ }
116
+ };
117
+ __decorate([
118
+ Prop({ tagname: "b", inline: true })
119
+ ], A.prototype, "propC", void 0);
120
+ __decorate([
121
+ Prop({ tagname: "propd" })
122
+ ], A.prototype, "propD", void 0);
123
+ A = __decorate([
124
+ Model({
125
+ fromXML({ model, properties }) {
126
+ return new model.type(properties);
127
+ },
128
+ })
129
+ ], A);
130
+ (t => __RΦ.t[2702] = t)(A);
131
+ __RΦ.m("rt:SP", [])(A);
132
+ __RΦ.m("rt:P", ["propA", "propB", "propC", "propD"])(A);
133
+ __RΦ.m("rt:Sm", [])(A);
134
+ __RΦ.m("rt:m", ["fromXML"])(A);
135
+ __RΦ.m("rt:p", [{ n: "record", t: () => __RΦ.a(101), v: null, f: "?" }])(A);
136
+ __RΦ.m("rt:f", "C")(A);
137
+ __RΦ.m("rt:t", () => __RΦ.a(13))(A.prototype, "propA");
138
+ __RΦ.m("rt:f", "P")(A.prototype, "propA");
139
+ __RΦ.m("rt:t", () => __RΦ.a(20))(A.prototype, "propB");
140
+ __RΦ.m("rt:f", "P")(A.prototype, "propB");
141
+ __RΦ.m("rt:t", () => __RΦ.a(2717))(A.prototype, "propC");
142
+ __RΦ.m("rt:f", "P")(A.prototype, "propC");
143
+ __RΦ.m("rt:t", () => __RΦ.a(705))(A.prototype, "propD");
144
+ __RΦ.m("rt:f", "P")(A.prototype, "propD");
145
+ let B = class B {
146
+ constructor(record) {
147
+ this.propA = 0;
148
+ if (record)
149
+ Object.entries(record).forEach(__RΦ.f(([key, val]) => {
150
+ this[key] = val;
151
+ }, [__RΦ.m("rt:p", [{ n: "[key, val]", t: () => __RΦ.a(4), v: null }]), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(22))], ""));
152
+ }
153
+ };
154
+ B = __decorate([
155
+ Model({
156
+ fromXML({ model, properties }) {
157
+ return new model.type(properties);
158
+ },
159
+ })
160
+ ], B);
161
+ (t => __RΦ.t[2715] = t)(B);
162
+ __RΦ.m("rt:SP", [])(B);
163
+ __RΦ.m("rt:P", ["propA"])(B);
164
+ __RΦ.m("rt:Sm", [])(B);
165
+ __RΦ.m("rt:m", ["fromXML"])(B);
166
+ __RΦ.m("rt:p", [{ n: "record", t: () => __RΦ.a(101), v: null, f: "?" }])(B);
167
+ __RΦ.m("rt:f", "C")(B);
168
+ __RΦ.m("rt:t", () => __RΦ.a(14))(B.prototype, "propA");
169
+ __RΦ.m("rt:f", "P")(B.prototype, "propA");
170
+ describe("Edgy Cases", __RΦ.f(() => {
171
+ const instance = new A();
172
+ for (let i = 0; i < 8; i++) {
173
+ const b = new B();
174
+ b.propA = i;
175
+ instance.propC.push(b);
176
+ }
177
+ const instanceXMLString = XML.stringify(XML.parse(`<a>
178
+ <prop-a>${instance.propA}</prop-a>
179
+ <prop-b>${instance.propB}</prop-b>
180
+ ${instance.propC.map(__RΦ.f((b) => `<b><prop-a>${b.propA}</prop-a></b>`, [__RΦ.m("rt:p", [{ n: "b", t: () => __RΦ.a(4), v: null }]), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(13))], "")).join("")}
181
+ <propd>${instance.propD}</propd>
182
+ </a>`));
183
+ it("should give right type infos", __RΦ.f(() => {
184
+ const reflectedA = reflect(A, { TΦ: "c", t: void 0, p: [__RΦ.a(2701)], r: void 0, tp: [] });
185
+ assert(reflectedA === reflect(A, { TΦ: "c", t: void 0, p: [__RΦ.a(2701)], r: void 0, tp: [] }));
186
+ expect(reflectedA.getProperty("propA").type.isClass(String)).to.be.true;
187
+ expect(reflectedA.getProperty("propB").type.isClass(Boolean)).to.be.true;
188
+ const ModelAPropCType = reflectedA.getProperty("propC").type;
189
+ expect(ModelAPropCType.is("array") && ModelAPropCType.elementType.isClass(B)).to.be.true;
190
+ const ModelAPropDType = reflectedA.getProperty("propD").type;
191
+ expect(ModelAPropDType.is("union")).to.be.true;
192
+ }, [__RΦ.m("rt:p", []), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(22))], ""));
193
+ it("XML -> Object", __RΦ.f(() => {
194
+ const parsed = getModel(A).fromXML(instanceXMLString);
195
+ expect(parsed instanceof A).to.be.true;
196
+ expect(parsed).to.deep.equal(instance);
197
+ }, [__RΦ.m("rt:p", []), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(22))], ""));
198
+ it("Object -> XML", __RΦ.f(() => {
199
+ const xml = getModel(A).toXML(instance);
200
+ expect(XML.stringify(xml)).to.equal(instanceXMLString);
201
+ }, [__RΦ.m("rt:p", []), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(22))], ""));
202
+ }, [__RΦ.m("rt:p", []), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(22))], ""));
203
+ let C = class C extends B {
204
+ constructor() {
205
+ super(...arguments);
206
+ this.propB = 3;
207
+ }
208
+ };
209
+ C = __decorate([
210
+ Model()
211
+ ], C);
212
+ (t => __RΦ.t[2765] = t)(C);
213
+ __RΦ.m("rt:SP", [])(C);
214
+ __RΦ.m("rt:P", ["propB"])(C);
215
+ __RΦ.m("rt:Sm", [])(C);
216
+ __RΦ.m("rt:m", [])(C);
217
+ __RΦ.m("rt:f", "C")(C);
218
+ __RΦ.m("rt:t", () => __RΦ.a(14))(C.prototype, "propB");
219
+ __RΦ.m("rt:f", "P")(C.prototype, "propB");
220
+ describe("Inheritance", __RΦ.f(() => {
221
+ const cInstance = new C();
222
+ const cInstanceXMLString = `<c><prop-a>${cInstance.propA}</prop-a><prop-b>${cInstance.propB}</prop-b></c>`;
223
+ it("XML -> Object", __RΦ.f(() => {
224
+ expect(getModel(C).fromXML(cInstanceXMLString)).to.deep.equal(cInstance);
225
+ }, [__RΦ.m("rt:p", []), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(22))], ""));
226
+ it("Object -> XML", __RΦ.f(() => {
227
+ expect(XML.stringify(getModel(C).toXML(cInstance))).to.equal(cInstanceXMLString);
228
+ }, [__RΦ.m("rt:p", []), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(22))], ""));
229
+ }, [__RΦ.m("rt:p", []), __RΦ.m("rt:f", "F>"), __RΦ.m("rt:t", () => __RΦ.a(22))], ""));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xml-model",
3
- "version": "0.2.3",
3
+ "version": "0.2.4",
4
4
  "main": "build/main/index.js",
5
5
  "typings": "build/main/index.d.ts",
6
6
  "module": "build/module/index.js",