@onerjs/serializers 8.41.6 → 8.41.7

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.
Files changed (67) hide show
  1. package/3MF/3mfSerializer.configuration.d.ts +9 -0
  2. package/3MF/3mfSerializer.configuration.js +11 -0
  3. package/3MF/3mfSerializer.configuration.js.map +1 -0
  4. package/3MF/3mfSerializer.d.ts +132 -0
  5. package/3MF/3mfSerializer.js +328 -0
  6. package/3MF/3mfSerializer.js.map +1 -0
  7. package/3MF/core/index.d.ts +2 -0
  8. package/3MF/core/index.js +4 -0
  9. package/3MF/core/index.js.map +1 -0
  10. package/3MF/core/model/3mf.builder.d.ts +231 -0
  11. package/3MF/core/model/3mf.builder.js +403 -0
  12. package/3MF/core/model/3mf.builder.js.map +1 -0
  13. package/3MF/core/model/3mf.d.ts +329 -0
  14. package/3MF/core/model/3mf.interfaces.d.ts +321 -0
  15. package/3MF/core/model/3mf.interfaces.js +39 -0
  16. package/3MF/core/model/3mf.interfaces.js.map +1 -0
  17. package/3MF/core/model/3mf.js +377 -0
  18. package/3MF/core/model/3mf.js.map +1 -0
  19. package/3MF/core/model/3mf.opc.d.ts +66 -0
  20. package/3MF/core/model/3mf.opc.interfaces.d.ts +126 -0
  21. package/3MF/core/model/3mf.opc.interfaces.js +75 -0
  22. package/3MF/core/model/3mf.opc.interfaces.js.map +1 -0
  23. package/3MF/core/model/3mf.opc.js +91 -0
  24. package/3MF/core/model/3mf.opc.js.map +1 -0
  25. package/3MF/core/model/3mf.serializer.d.ts +118 -0
  26. package/3MF/core/model/3mf.serializer.js +171 -0
  27. package/3MF/core/model/3mf.serializer.js.map +1 -0
  28. package/3MF/core/model/3mf.types.d.ts +46 -0
  29. package/3MF/core/model/3mf.types.js +2 -0
  30. package/3MF/core/model/3mf.types.js.map +1 -0
  31. package/3MF/core/model/index.d.ts +7 -0
  32. package/3MF/core/model/index.js +8 -0
  33. package/3MF/core/model/index.js.map +1 -0
  34. package/3MF/core/xml/index.d.ts +6 -0
  35. package/3MF/core/xml/index.js +7 -0
  36. package/3MF/core/xml/index.js.map +1 -0
  37. package/3MF/core/xml/xml.builder.bytes.d.ts +33 -0
  38. package/3MF/core/xml/xml.builder.bytes.js +60 -0
  39. package/3MF/core/xml/xml.builder.bytes.js.map +1 -0
  40. package/3MF/core/xml/xml.builder.d.ts +94 -0
  41. package/3MF/core/xml/xml.builder.js +286 -0
  42. package/3MF/core/xml/xml.builder.js.map +1 -0
  43. package/3MF/core/xml/xml.builder.string.d.ts +19 -0
  44. package/3MF/core/xml/xml.builder.string.js +35 -0
  45. package/3MF/core/xml/xml.builder.string.js.map +1 -0
  46. package/3MF/core/xml/xml.interfaces.d.ts +91 -0
  47. package/3MF/core/xml/xml.interfaces.js +110 -0
  48. package/3MF/core/xml/xml.interfaces.js.map +1 -0
  49. package/3MF/core/xml/xml.serializer.d.ts +39 -0
  50. package/3MF/core/xml/xml.serializer.format.d.ts +92 -0
  51. package/3MF/core/xml/xml.serializer.format.js +122 -0
  52. package/3MF/core/xml/xml.serializer.format.js.map +1 -0
  53. package/3MF/core/xml/xml.serializer.js +261 -0
  54. package/3MF/core/xml/xml.serializer.js.map +1 -0
  55. package/3MF/index.d.ts +3 -0
  56. package/3MF/index.js +5 -0
  57. package/3MF/index.js.map +1 -0
  58. package/index.d.ts +1 -0
  59. package/index.js +1 -0
  60. package/index.js.map +1 -1
  61. package/legacy/legacy-3mfSerializer.d.ts +1 -0
  62. package/legacy/legacy-3mfSerializer.js +20 -0
  63. package/legacy/legacy-3mfSerializer.js.map +1 -0
  64. package/legacy/legacy.d.ts +1 -0
  65. package/legacy/legacy.js +1 -0
  66. package/legacy/legacy.js.map +1 -1
  67. package/package.json +3 -3
@@ -0,0 +1,60 @@
1
+ /** */
2
+ export class Utf8XmlWriterToBytes {
3
+ constructor(_sink, _opts = {}) {
4
+ this._sink = _sink;
5
+ this._opts = _opts;
6
+ /** */
7
+ this.count = 0;
8
+ this._encoder = new TextEncoder();
9
+ this._pending = "";
10
+ this._pendingChars = 0;
11
+ }
12
+ /**
13
+ * @param data
14
+ * @returns
15
+ */
16
+ write(...data) {
17
+ if (data.length === 0) {
18
+ return this;
19
+ }
20
+ const s = data.join("");
21
+ if (s.length === 0) {
22
+ return this;
23
+ }
24
+ this._pending += s;
25
+ this._pendingChars += s.length;
26
+ const limit = this._opts.flushChars ?? 64 * 1024;
27
+ if (this._pendingChars >= limit) {
28
+ this.flush();
29
+ }
30
+ return this;
31
+ }
32
+ /**
33
+ * @returns
34
+ */
35
+ flush() {
36
+ if (this._pendingChars === 0) {
37
+ return this;
38
+ }
39
+ const bytes = this._encoder.encode(this._pending);
40
+ this._sink.push(bytes);
41
+ this.count += bytes.length;
42
+ this._pending = "";
43
+ this._pendingChars = 0;
44
+ return this;
45
+ }
46
+ /**
47
+ */
48
+ finish() {
49
+ this.flush();
50
+ this._sink.push(new Uint8Array(0), true);
51
+ }
52
+ /**
53
+ */
54
+ clear() {
55
+ this._pending = "";
56
+ this._pendingChars = 0;
57
+ this.count = 0;
58
+ }
59
+ }
60
+ //# sourceMappingURL=xml.builder.bytes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml.builder.bytes.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/3MF/core/xml/xml.builder.bytes.ts"],"names":[],"mappings":"AAOA,MAAM;AACN,MAAM,OAAO,oBAAoB;IAO7B,YACqB,KAAe,EACf,QAAiC,EAAE;QADnC,UAAK,GAAL,KAAK,CAAU;QACf,UAAK,GAAL,KAAK,CAA8B;QARxD,MAAM;QACC,UAAK,GAAG,CAAC,CAAC;QACT,aAAQ,GAAG,IAAI,WAAW,EAAE,CAAC;QAC7B,aAAQ,GAAG,EAAE,CAAC;QACd,kBAAa,GAAG,CAAC,CAAC;IAKvB,CAAC;IAEJ;;;OAGG;IACH,KAAK,CAAC,GAAG,IAAc;QACnB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;QACnB,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,MAAM,CAAC;QAE/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,GAAG,IAAI,CAAC;QACjD,IAAI,IAAI,CAAC,aAAa,IAAI,KAAK,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK;QACD,IAAI,IAAI,CAAC,aAAa,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;QAE3B,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QAEvB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;OACG;IACH,MAAM;QACF,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED;OACG;IACH,KAAK;QACD,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACnB,CAAC;CACJ","sourcesContent":["import type { IXmlWriter } from \"./xml.builder\";\r\n\r\n/** */\r\nexport type ByteSink = {\r\n push(chunk: Uint8Array, final?: boolean): void;\r\n};\r\n\r\n/** */\r\nexport class Utf8XmlWriterToBytes implements IXmlWriter {\r\n /** */\r\n public count = 0;\r\n private _encoder = new TextEncoder();\r\n private _pending = \"\";\r\n private _pendingChars = 0;\r\n\r\n constructor(\r\n private readonly _sink: ByteSink,\r\n private readonly _opts: { flushChars?: number } = {}\r\n ) {}\r\n\r\n /**\r\n * @param data\r\n * @returns\r\n */\r\n write(...data: string[]): IXmlWriter {\r\n if (data.length === 0) {\r\n return this;\r\n }\r\n\r\n const s = data.join(\"\");\r\n if (s.length === 0) {\r\n return this;\r\n }\r\n\r\n this._pending += s;\r\n this._pendingChars += s.length;\r\n\r\n const limit = this._opts.flushChars ?? 64 * 1024;\r\n if (this._pendingChars >= limit) {\r\n this.flush();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns\r\n */\r\n flush(): this {\r\n if (this._pendingChars === 0) {\r\n return this;\r\n }\r\n\r\n const bytes = this._encoder.encode(this._pending);\r\n this._sink.push(bytes);\r\n this.count += bytes.length;\r\n\r\n this._pending = \"\";\r\n this._pendingChars = 0;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n */\r\n finish(): void {\r\n this.flush();\r\n this._sink.push(new Uint8Array(0), true);\r\n }\r\n\r\n /**\r\n */\r\n clear(): void {\r\n this._pending = \"\";\r\n this._pendingChars = 0;\r\n this.count = 0;\r\n }\r\n}\r\n"]}
@@ -0,0 +1,94 @@
1
+ import type { IXmlBuilder } from "./xml.interfaces.js";
2
+ /**
3
+ */
4
+ export interface IXmlWriter {
5
+ /**
6
+ * @param data
7
+ * @returns
8
+ */
9
+ write(...data: string[]): IXmlWriter;
10
+ /** */
11
+ count: number;
12
+ /** */
13
+ clear(): void;
14
+ }
15
+ /** */
16
+ export declare enum TokenType {
17
+ Declaration = 0,
18
+ Tag = 1,
19
+ Attribute = 2,
20
+ Text = 3
21
+ }
22
+ /** */
23
+ export declare class XmlBuilder implements IXmlBuilder {
24
+ /** */
25
+ static Context: {
26
+ new (name: string, depth: number): {
27
+ /** */
28
+ name: string;
29
+ /** */
30
+ closed: boolean;
31
+ /** */
32
+ lastToken: TokenType | null;
33
+ /** */
34
+ depth: number;
35
+ ns2prefix: Map<string, string>;
36
+ prefix2ns: Map<string, string>;
37
+ defaultNs: string | null;
38
+ };
39
+ };
40
+ /** */
41
+ private _w;
42
+ /** */
43
+ private _ctxStack;
44
+ /** */
45
+ private _d;
46
+ constructor(w: IXmlWriter);
47
+ /**
48
+ *
49
+ * @param version
50
+ * @param encoding
51
+ * @param standalone
52
+ * @returns
53
+ */
54
+ dec(version: string, encoding?: string, standalone?: boolean): IXmlBuilder;
55
+ /**
56
+ *
57
+ * @param ns
58
+ * @param n
59
+ * @param v
60
+ * @returns
61
+ */
62
+ att(ns: string | null, n: string, v: string): IXmlBuilder;
63
+ /**
64
+ *
65
+ * @param ns
66
+ * @param n
67
+ * @returns
68
+ */
69
+ ele(ns: string | null, n: string): IXmlBuilder;
70
+ /**
71
+ *
72
+ * @param txt
73
+ * @returns
74
+ */
75
+ text(txt: string): IXmlBuilder;
76
+ /**
77
+ *
78
+ * @returns
79
+ */
80
+ end(): IXmlBuilder;
81
+ protected _pushContext(name: string, depth: number): InstanceType<typeof XmlBuilder.Context>;
82
+ protected _popContext(): InstanceType<typeof XmlBuilder.Context> | undefined;
83
+ protected _peekContext(): InstanceType<typeof XmlBuilder.Context> | undefined;
84
+ protected get _contextDepth(): number;
85
+ private _writeAttStr;
86
+ private _lookupPrefix;
87
+ private _escText;
88
+ private _escAttr;
89
+ private _isXmlnsDecl;
90
+ private _registerNamespace;
91
+ private _allocPrefix;
92
+ private _ensurePrefixDeclared;
93
+ private _closeOpenTagIfNeeded;
94
+ }
@@ -0,0 +1,286 @@
1
+ /** */
2
+ class XmlSyntax {
3
+ }
4
+ /** */
5
+ XmlSyntax.OpenTag = "<";
6
+ /** */
7
+ XmlSyntax.CloseTag = ">";
8
+ /** */
9
+ XmlSyntax.Slash = "/";
10
+ /** */
11
+ XmlSyntax.Question = "?";
12
+ /** */
13
+ XmlSyntax.Quote = '"';
14
+ /** */
15
+ XmlSyntax.Equal = "=";
16
+ /** */
17
+ XmlSyntax.Space = " ";
18
+ /** */
19
+ XmlSyntax.Semicolon = ":";
20
+ /** */
21
+ XmlSyntax.Dec = "<?xml";
22
+ /** */
23
+ XmlSyntax.Xml = "xml";
24
+ /** */
25
+ XmlSyntax.Xmlns = "xmlns";
26
+ /** */
27
+ XmlSyntax.Xsi = "xsi";
28
+ /** */
29
+ XmlSyntax.VersionKeyword = "version";
30
+ /** */
31
+ XmlSyntax.EncodingKeyword = "encoding";
32
+ /** */
33
+ XmlSyntax.StandaloneKeyword = "standalone";
34
+ /** */
35
+ export var TokenType;
36
+ (function (TokenType) {
37
+ TokenType[TokenType["Declaration"] = 0] = "Declaration";
38
+ TokenType[TokenType["Tag"] = 1] = "Tag";
39
+ TokenType[TokenType["Attribute"] = 2] = "Attribute";
40
+ TokenType[TokenType["Text"] = 3] = "Text";
41
+ })(TokenType || (TokenType = {}));
42
+ /** */
43
+ export class XmlBuilder {
44
+ constructor(w) {
45
+ /** */
46
+ this._ctxStack = [];
47
+ /** */
48
+ this._d = 0;
49
+ this._w = w;
50
+ }
51
+ /**
52
+ *
53
+ * @param version
54
+ * @param encoding
55
+ * @param standalone
56
+ * @returns
57
+ */
58
+ dec(version, encoding, standalone) {
59
+ this._w.write(XmlSyntax.Dec);
60
+ this._writeAttStr(XmlSyntax.VersionKeyword, version);
61
+ if (encoding) {
62
+ this._writeAttStr(XmlSyntax.EncodingKeyword, encoding);
63
+ }
64
+ if (standalone !== undefined) {
65
+ this._writeAttStr(XmlSyntax.StandaloneKeyword, standalone ? "yes" : "no");
66
+ }
67
+ this._w.write(XmlSyntax.Question, XmlSyntax.CloseTag);
68
+ return this;
69
+ }
70
+ /**
71
+ *
72
+ * @param ns
73
+ * @param n
74
+ * @param v
75
+ * @returns
76
+ */
77
+ att(ns, n, v) {
78
+ const ctx = this._peekContext();
79
+ if (!ctx) {
80
+ throw new Error("att() without open element");
81
+ }
82
+ if (ctx.closed) {
83
+ throw new Error(`att() after start tag closed for <${ctx.name}>`);
84
+ }
85
+ // explicit namespace declaration: xmlns or xmlns:prefix
86
+ if (this._isXmlnsDecl(ns, n)) {
87
+ if (n === XmlSyntax.Xmlns) {
88
+ // default namespace
89
+ ctx.defaultNs = v;
90
+ // you can store default as empty prefix if you want
91
+ this._registerNamespace(ctx, "", v);
92
+ this._writeAttStr(XmlSyntax.Xmlns, v);
93
+ }
94
+ else {
95
+ if (!ns) {
96
+ const prefix = n.slice(6); // "xmlns:"
97
+ this._registerNamespace(ctx, prefix, v);
98
+ this._writeAttStr(n, v);
99
+ }
100
+ else {
101
+ this._registerNamespace(ctx, n, v);
102
+ this._writeAttStr(`${ns}:${n}`, v);
103
+ }
104
+ }
105
+ ctx.lastToken = TokenType.Attribute;
106
+ return this;
107
+ }
108
+ // normal attribute
109
+ let qn = n;
110
+ if (ns) {
111
+ // treat ns as a namespace URI, not a prefix
112
+ const p = this._ensurePrefixDeclared(ctx, ns);
113
+ qn = `${p}:${n}`;
114
+ }
115
+ ctx.lastToken = TokenType.Attribute;
116
+ this._writeAttStr(qn, v);
117
+ return this;
118
+ }
119
+ /**
120
+ *
121
+ * @param ns
122
+ * @param n
123
+ * @returns
124
+ */
125
+ ele(ns, n) {
126
+ let ctx = this._peekContext();
127
+ if (ctx) {
128
+ this._closeOpenTagIfNeeded(ctx);
129
+ }
130
+ let qns = n;
131
+ if (ns) {
132
+ const p = this._lookupPrefix(ns) ?? ns;
133
+ qns = `${p}:${n}`;
134
+ }
135
+ ctx = this._pushContext(qns, ++this._d);
136
+ this._w.write(XmlSyntax.OpenTag, qns);
137
+ return this;
138
+ }
139
+ /**
140
+ *
141
+ * @param txt
142
+ * @returns
143
+ */
144
+ text(txt) {
145
+ const ctx = this._peekContext();
146
+ if (!ctx) {
147
+ throw new Error("text() without open element");
148
+ }
149
+ this._closeOpenTagIfNeeded(ctx);
150
+ ctx.lastToken = TokenType.Text;
151
+ this._w.write(this._escText(txt));
152
+ return this;
153
+ }
154
+ /**
155
+ *
156
+ * @returns
157
+ */
158
+ end() {
159
+ const ctx = this._popContext();
160
+ if (ctx) {
161
+ this._d--;
162
+ if (!ctx.closed) {
163
+ this._w.write(XmlSyntax.Slash, XmlSyntax.CloseTag);
164
+ }
165
+ else {
166
+ this._w.write(XmlSyntax.OpenTag, XmlSyntax.Slash, ctx.name, XmlSyntax.CloseTag);
167
+ }
168
+ }
169
+ return this;
170
+ }
171
+ _pushContext(name, depth) {
172
+ const ctx = new XmlBuilder.Context(name, depth);
173
+ this._ctxStack.push(ctx);
174
+ return ctx;
175
+ }
176
+ _popContext() {
177
+ return this._ctxStack.pop();
178
+ }
179
+ _peekContext() {
180
+ return this._ctxStack[this._ctxStack.length - 1];
181
+ }
182
+ get _contextDepth() {
183
+ return this._ctxStack.length;
184
+ }
185
+ _writeAttStr(name, value) {
186
+ this._w.write(XmlSyntax.Space, name, XmlSyntax.Equal, XmlSyntax.Quote, this._escAttr(value), XmlSyntax.Quote);
187
+ }
188
+ _lookupPrefix(ns) {
189
+ let i = this._ctxStack.length - 1;
190
+ if (i >= 0) {
191
+ do {
192
+ const ctx = this._ctxStack[i--];
193
+ const p = ctx.ns2prefix?.get(ns);
194
+ if (p) {
195
+ return p;
196
+ }
197
+ } while (i >= 0);
198
+ }
199
+ return undefined;
200
+ }
201
+ _escText(s) {
202
+ return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
203
+ }
204
+ _escAttr(s) {
205
+ return this._escText(s).replace(/"/g, "&quot;").replace(/'/g, "&apos;");
206
+ }
207
+ _isXmlnsDecl(ns, n) {
208
+ if (ns) {
209
+ return ns === XmlSyntax.Xmlns;
210
+ }
211
+ const l = n.length;
212
+ const s = XmlSyntax.Xmlns.length;
213
+ if (l >= s) {
214
+ return n.startsWith(XmlSyntax.Xmlns) && (n.length == s || n[s] == XmlSyntax.Semicolon);
215
+ }
216
+ return false;
217
+ }
218
+ _registerNamespace(ctx, prefix, uri) {
219
+ if (prefix === XmlSyntax.Xml || prefix === XmlSyntax.Xmlns) {
220
+ throw new Error(`reserved prefix '${prefix}'`);
221
+ }
222
+ const existingUri = ctx.prefix2ns.get(prefix);
223
+ if (existingUri && existingUri !== uri) {
224
+ throw new Error(`prefix '${prefix}' already bound to a different namespace`);
225
+ }
226
+ const existingPrefix = ctx.ns2prefix.get(uri);
227
+ if (!existingPrefix) {
228
+ ctx.ns2prefix.set(uri, prefix);
229
+ }
230
+ ctx.prefix2ns.set(prefix, uri);
231
+ }
232
+ _allocPrefix(ctx) {
233
+ let i = 1;
234
+ while (true) {
235
+ const p = `ns${i++}`;
236
+ if (!ctx.prefix2ns.has(p)) {
237
+ return p;
238
+ }
239
+ }
240
+ }
241
+ _ensurePrefixDeclared(ctx, uri) {
242
+ const existing = this._lookupPrefix(uri);
243
+ if (existing) {
244
+ return existing;
245
+ }
246
+ if (ctx.closed) {
247
+ throw new Error(`can not declare namespace after start tag closed for <${ctx.name}>`);
248
+ }
249
+ const prefix = this._allocPrefix(ctx);
250
+ // write xmlns:prefix="uri" and register it
251
+ this._writeAttStr(`${XmlSyntax.Xmlns}:${prefix}`, uri);
252
+ this._registerNamespace(ctx, prefix, uri);
253
+ return prefix;
254
+ }
255
+ _closeOpenTagIfNeeded(ctx) {
256
+ if (!ctx.closed) {
257
+ this._w.write(XmlSyntax.CloseTag);
258
+ ctx.closed = true;
259
+ }
260
+ }
261
+ }
262
+ /** */
263
+ XmlBuilder.Context = class {
264
+ /**
265
+ *
266
+ *@param name
267
+ *@param depth
268
+ */
269
+ constructor(name, depth) {
270
+ /** */
271
+ this.name = "";
272
+ /** */
273
+ this.closed = false;
274
+ /** */
275
+ this.lastToken = null;
276
+ // uri -> prefix
277
+ this.ns2prefix = new Map();
278
+ // prefix -> uri (for conflict checks)
279
+ this.prefix2ns = new Map();
280
+ // optional: default namespace uri
281
+ this.defaultNs = null;
282
+ this.name = name;
283
+ this.depth = depth;
284
+ }
285
+ };
286
+ //# sourceMappingURL=xml.builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml.builder.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/3MF/core/xml/xml.builder.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IXmlBuilder } from \"./xml.interfaces\";\r\n\r\n/**\r\n */\r\nexport interface IXmlWriter {\r\n /**\r\n * @param data\r\n * @returns\r\n */\r\n write(...data: string[]): IXmlWriter;\r\n /** */\r\n count: number;\r\n /** */\r\n clear(): void;\r\n}\r\n\r\n/** */\r\nclass XmlSyntax {\r\n /** */\r\n public static OpenTag: string = \"<\";\r\n /** */\r\n public static CloseTag: string = \">\";\r\n /** */\r\n public static Slash: string = \"/\";\r\n /** */\r\n public static Question: string = \"?\";\r\n /** */\r\n public static Quote: string = '\"';\r\n /** */\r\n public static Equal: string = \"=\";\r\n /** */\r\n public static Space: string = \" \";\r\n /** */\r\n public static Semicolon: string = \":\";\r\n\r\n /** */\r\n public static Dec = \"<?xml\";\r\n /** */\r\n public static Xml = \"xml\";\r\n /** */\r\n public static Xmlns = \"xmlns\";\r\n /** */\r\n public static Xsi = \"xsi\";\r\n\r\n /** */\r\n public static VersionKeyword = \"version\";\r\n /** */\r\n public static EncodingKeyword = \"encoding\";\r\n /** */\r\n public static StandaloneKeyword = \"standalone\";\r\n}\r\n\r\n/** */\r\nexport enum TokenType {\r\n Declaration,\r\n Tag,\r\n Attribute,\r\n Text,\r\n}\r\n\r\n/** */\r\nexport class XmlBuilder implements IXmlBuilder {\r\n /** */\r\n static Context = class {\r\n /** */\r\n name: string = \"\";\r\n /** */\r\n closed: boolean = false;\r\n /** */\r\n lastToken: TokenType | null = null;\r\n /** */\r\n depth: number;\r\n\r\n // uri -> prefix\r\n ns2prefix: Map<string, string> = new Map();\r\n\r\n // prefix -> uri (for conflict checks)\r\n prefix2ns: Map<string, string> = new Map();\r\n\r\n // optional: default namespace uri\r\n defaultNs: string | null = null;\r\n\r\n /**\r\n *\r\n *@param name\r\n *@param depth\r\n */\r\n constructor(name: string, depth: number) {\r\n this.name = name;\r\n this.depth = depth;\r\n }\r\n };\r\n\r\n /** */\r\n private _w: IXmlWriter;\r\n /** */\r\n private _ctxStack: Array<InstanceType<typeof XmlBuilder.Context>> = [];\r\n /** */\r\n private _d: number = 0;\r\n\r\n public constructor(w: IXmlWriter) {\r\n this._w = w;\r\n }\r\n\r\n /**\r\n *\r\n * @param version\r\n * @param encoding\r\n * @param standalone\r\n * @returns\r\n */\r\n public dec(version: string, encoding?: string, standalone?: boolean): IXmlBuilder {\r\n this._w.write(XmlSyntax.Dec);\r\n this._writeAttStr(XmlSyntax.VersionKeyword, version);\r\n if (encoding) {\r\n this._writeAttStr(XmlSyntax.EncodingKeyword, encoding);\r\n }\r\n if (standalone !== undefined) {\r\n this._writeAttStr(XmlSyntax.StandaloneKeyword, standalone ? \"yes\" : \"no\");\r\n }\r\n this._w.write(XmlSyntax.Question, XmlSyntax.CloseTag);\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param ns\r\n * @param n\r\n * @param v\r\n * @returns\r\n */\r\n public att(ns: string | null, n: string, v: string): IXmlBuilder {\r\n const ctx = this._peekContext();\r\n if (!ctx) {\r\n throw new Error(\"att() without open element\");\r\n }\r\n if (ctx.closed) {\r\n throw new Error(`att() after start tag closed for <${ctx.name}>`);\r\n }\r\n\r\n // explicit namespace declaration: xmlns or xmlns:prefix\r\n if (this._isXmlnsDecl(ns, n)) {\r\n if (n === XmlSyntax.Xmlns) {\r\n // default namespace\r\n ctx.defaultNs = v;\r\n // you can store default as empty prefix if you want\r\n this._registerNamespace(ctx, \"\", v);\r\n this._writeAttStr(XmlSyntax.Xmlns, v);\r\n } else {\r\n if (!ns) {\r\n const prefix = n.slice(6); // \"xmlns:\"\r\n this._registerNamespace(ctx, prefix, v);\r\n this._writeAttStr(n, v);\r\n } else {\r\n this._registerNamespace(ctx, n, v);\r\n this._writeAttStr(`${ns}:${n}`, v);\r\n }\r\n }\r\n ctx.lastToken = TokenType.Attribute;\r\n return this;\r\n }\r\n\r\n // normal attribute\r\n let qn = n;\r\n\r\n if (ns) {\r\n // treat ns as a namespace URI, not a prefix\r\n const p = this._ensurePrefixDeclared(ctx, ns);\r\n qn = `${p}:${n}`;\r\n }\r\n\r\n ctx.lastToken = TokenType.Attribute;\r\n this._writeAttStr(qn, v);\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param ns\r\n * @param n\r\n * @returns\r\n */\r\n public ele(ns: string | null, n: string): IXmlBuilder {\r\n let ctx = this._peekContext();\r\n if (ctx) {\r\n this._closeOpenTagIfNeeded(ctx);\r\n }\r\n let qns = n;\r\n if (ns) {\r\n const p = this._lookupPrefix(ns) ?? ns;\r\n qns = `${p}:${n}`;\r\n }\r\n ctx = this._pushContext(qns, ++this._d);\r\n this._w.write(XmlSyntax.OpenTag, qns);\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param txt\r\n * @returns\r\n */\r\n public text(txt: string): IXmlBuilder {\r\n const ctx = this._peekContext();\r\n if (!ctx) {\r\n throw new Error(\"text() without open element\");\r\n }\r\n this._closeOpenTagIfNeeded(ctx);\r\n ctx.lastToken = TokenType.Text;\r\n this._w.write(this._escText(txt));\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n */\r\n public end(): IXmlBuilder {\r\n const ctx = this._popContext();\r\n if (ctx) {\r\n this._d--;\r\n if (!ctx.closed) {\r\n this._w.write(XmlSyntax.Slash, XmlSyntax.CloseTag);\r\n } else {\r\n this._w.write(XmlSyntax.OpenTag, XmlSyntax.Slash, ctx.name, XmlSyntax.CloseTag);\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n protected _pushContext(name: string, depth: number): InstanceType<typeof XmlBuilder.Context> {\r\n const ctx = new XmlBuilder.Context(name, depth);\r\n this._ctxStack.push(ctx);\r\n return ctx;\r\n }\r\n\r\n protected _popContext(): InstanceType<typeof XmlBuilder.Context> | undefined {\r\n return this._ctxStack.pop();\r\n }\r\n\r\n protected _peekContext(): InstanceType<typeof XmlBuilder.Context> | undefined {\r\n return this._ctxStack[this._ctxStack.length - 1];\r\n }\r\n\r\n protected get _contextDepth(): number {\r\n return this._ctxStack.length;\r\n }\r\n\r\n private _writeAttStr(name: string, value: string) {\r\n this._w.write(XmlSyntax.Space, name, XmlSyntax.Equal, XmlSyntax.Quote, this._escAttr(value), XmlSyntax.Quote);\r\n }\r\n\r\n private _lookupPrefix(ns: string): string | undefined {\r\n let i = this._ctxStack.length - 1;\r\n if (i >= 0) {\r\n do {\r\n const ctx = this._ctxStack[i--];\r\n const p = ctx.ns2prefix?.get(ns);\r\n if (p) {\r\n return p;\r\n }\r\n } while (i >= 0);\r\n }\r\n return undefined;\r\n }\r\n\r\n private _escText(s: string): string {\r\n return s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\r\n }\r\n\r\n private _escAttr(s: string): string {\r\n return this._escText(s).replace(/\"/g, \"&quot;\").replace(/'/g, \"&apos;\");\r\n }\r\n\r\n private _isXmlnsDecl(ns: string | null, n: string): boolean {\r\n if (ns) {\r\n return ns === XmlSyntax.Xmlns;\r\n }\r\n const l = n.length;\r\n const s = XmlSyntax.Xmlns.length;\r\n if (l >= s) {\r\n return n.startsWith(XmlSyntax.Xmlns) && (n.length == s || n[s] == XmlSyntax.Semicolon);\r\n }\r\n return false;\r\n }\r\n\r\n private _registerNamespace(ctx: InstanceType<typeof XmlBuilder.Context>, prefix: string, uri: string) {\r\n if (prefix === XmlSyntax.Xml || prefix === XmlSyntax.Xmlns) {\r\n throw new Error(`reserved prefix '${prefix}'`);\r\n }\r\n\r\n const existingUri = ctx.prefix2ns.get(prefix);\r\n if (existingUri && existingUri !== uri) {\r\n throw new Error(`prefix '${prefix}' already bound to a different namespace`);\r\n }\r\n\r\n const existingPrefix = ctx.ns2prefix.get(uri);\r\n if (!existingPrefix) {\r\n ctx.ns2prefix.set(uri, prefix);\r\n }\r\n\r\n ctx.prefix2ns.set(prefix, uri);\r\n }\r\n\r\n private _allocPrefix(ctx: InstanceType<typeof XmlBuilder.Context>): string {\r\n let i = 1;\r\n while (true) {\r\n const p = `ns${i++}`;\r\n if (!ctx.prefix2ns.has(p)) {\r\n return p;\r\n }\r\n }\r\n }\r\n\r\n private _ensurePrefixDeclared(ctx: InstanceType<typeof XmlBuilder.Context>, uri: string): string {\r\n const existing = this._lookupPrefix(uri);\r\n if (existing) {\r\n return existing;\r\n }\r\n\r\n if (ctx.closed) {\r\n throw new Error(`can not declare namespace after start tag closed for <${ctx.name}>`);\r\n }\r\n\r\n const prefix = this._allocPrefix(ctx);\r\n\r\n // write xmlns:prefix=\"uri\" and register it\r\n this._writeAttStr(`${XmlSyntax.Xmlns}:${prefix}`, uri);\r\n this._registerNamespace(ctx, prefix, uri);\r\n\r\n return prefix;\r\n }\r\n\r\n private _closeOpenTagIfNeeded(ctx: InstanceType<typeof XmlBuilder.Context>) {\r\n if (!ctx.closed) {\r\n this._w.write(XmlSyntax.CloseTag);\r\n ctx.closed = true;\r\n }\r\n }\r\n}\r\n"]}
@@ -0,0 +1,19 @@
1
+ import type { IXmlWriter } from "./xml.builder.js";
2
+ /** */
3
+ export declare class StringXmlWriter implements IXmlWriter {
4
+ /** */
5
+ count: number;
6
+ private _chunks;
7
+ /**
8
+ * @param data
9
+ * @returns
10
+ */
11
+ write(...data: string[]): IXmlWriter;
12
+ /**
13
+ * @returns
14
+ */
15
+ toString(): string;
16
+ /**
17
+ */
18
+ clear(): void;
19
+ }
@@ -0,0 +1,35 @@
1
+ /** */
2
+ export class StringXmlWriter {
3
+ constructor() {
4
+ /** */
5
+ this.count = 0;
6
+ this._chunks = [];
7
+ }
8
+ /**
9
+ * @param data
10
+ * @returns
11
+ */
12
+ write(...data) {
13
+ if (data.length === 0) {
14
+ return this;
15
+ }
16
+ // join once per call, keeps DOM out, very fast
17
+ const s = data.join("");
18
+ this._chunks.push(s);
19
+ this.count += s.length;
20
+ return this;
21
+ }
22
+ /**
23
+ * @returns
24
+ */
25
+ toString() {
26
+ return this._chunks.join("");
27
+ }
28
+ /**
29
+ */
30
+ clear() {
31
+ this._chunks = [];
32
+ this.count = 0;
33
+ }
34
+ }
35
+ //# sourceMappingURL=xml.builder.string.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml.builder.string.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/3MF/core/xml/xml.builder.string.ts"],"names":[],"mappings":"AAEA,MAAM;AACN,MAAM,OAAO,eAAe;IAA5B;QACI,MAAM;QACC,UAAK,GAAG,CAAC,CAAC;QACT,YAAO,GAAa,EAAE,CAAC;IA+BnC,CAAC;IA7BG;;;OAGG;IACH,KAAK,CAAC,GAAG,IAAc;QACnB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,+CAA+C;QAC/C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC;QACvB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,QAAQ;QACJ,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC;IAED;OACG;IACH,KAAK;QACD,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACnB,CAAC;CACJ","sourcesContent":["import type { IXmlWriter } from \"./xml.builder\";\r\n\r\n/** */\r\nexport class StringXmlWriter implements IXmlWriter {\r\n /** */\r\n public count = 0;\r\n private _chunks: string[] = [];\r\n\r\n /**\r\n * @param data\r\n * @returns\r\n */\r\n write(...data: string[]): IXmlWriter {\r\n if (data.length === 0) {\r\n return this;\r\n }\r\n\r\n // join once per call, keeps DOM out, very fast\r\n const s = data.join(\"\");\r\n this._chunks.push(s);\r\n this.count += s.length;\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns\r\n */\r\n toString(): string {\r\n return this._chunks.join(\"\");\r\n }\r\n\r\n /**\r\n */\r\n clear(): void {\r\n this._chunks = [];\r\n this.count = 0;\r\n }\r\n}\r\n"]}
@@ -0,0 +1,91 @@
1
+ import type { IXmlSerializerFormatOptions } from "./xml.serializer.format.js";
2
+ /** */
3
+ export interface IQualifiedName {
4
+ /** */
5
+ ns?: string;
6
+ /** */
7
+ name: string;
8
+ }
9
+ /** */
10
+ export interface IXmlBuilder {
11
+ dec(version: string, encoding?: string, standalone?: boolean): IXmlBuilder;
12
+ att(ns: string | null, n: string, v: string): IXmlBuilder;
13
+ ele(ns: string | null, n: string): IXmlBuilder;
14
+ text(txt: string): IXmlBuilder;
15
+ end(): IXmlBuilder;
16
+ }
17
+ /**
18
+ * @param x
19
+ * @returns
20
+ */
21
+ export declare function IsQualifiedName(x: unknown): x is {
22
+ name: string;
23
+ };
24
+ export type XmlName = string | IQualifiedName;
25
+ type FieldKind = "attr" | "elem" | "none";
26
+ /**
27
+ *
28
+ */
29
+ export interface IFormatter<T = any> {
30
+ toString(value: T): string;
31
+ }
32
+ export type FormatterCtor<T> = new (args: IXmlSerializerFormatOptions) => IFormatter<T>;
33
+ type FieldMeta = {
34
+ kind: FieldKind;
35
+ prop: string;
36
+ name?: XmlName;
37
+ ignore?: boolean;
38
+ formatter?: FormatterCtor<any>;
39
+ };
40
+ /**
41
+ * @param name
42
+ * @returns
43
+ */
44
+ export declare function XmlName(name: XmlName): (ctor: Function) => void;
45
+ /**
46
+ * tell the serializer to ignore the property
47
+ * @returns
48
+ */
49
+ export declare function XmlIgnore(): (target: any, prop: string) => void;
50
+ /**
51
+ * tell the serializer to serialize the property as attribute
52
+ * @returns
53
+ */
54
+ export declare function XmlAttr(opts?: {
55
+ name: XmlName;
56
+ formatter?: FormatterCtor<any>;
57
+ }): (target: any, prop: string) => void;
58
+ /**
59
+ * tell the serializer to serialize the property as element - this is the default behavior but shoud be
60
+ * specified when wanted to update the default name of the classe or if the class is not decorated (without \@XmlName)
61
+ * @returns
62
+ */
63
+ export declare function XmlElem(opts?: {
64
+ name: XmlName;
65
+ }): (target: any, prop: string) => void;
66
+ /**
67
+ *
68
+ * @param obj
69
+ * @returns
70
+ */
71
+ export declare function GetXmlFieldMeta(obj: any): FieldMeta[];
72
+ /**
73
+ *
74
+ * @param obj
75
+ * @returns
76
+ */
77
+ export declare function GetXmlName(obj: any): XmlName | undefined;
78
+ /**
79
+ *
80
+ * @param qn
81
+ * @returns
82
+ */
83
+ export declare function XmlNameToParts(qn: XmlName): IQualifiedName;
84
+ /**
85
+ *
86
+ * @param name
87
+ * @param prefix
88
+ * @returns
89
+ */
90
+ export declare function ToQualifiedString(name: string, prefix?: string): string;
91
+ export {};