@pangza/orm 0.0.0-stage → 1.0.0

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 (142) hide show
  1. package/README.md +2 -2
  2. package/dist/BaseMapper.d.ts +112 -0
  3. package/dist/BaseMapper.d.ts.map +1 -0
  4. package/dist/BaseMapper.js +653 -0
  5. package/dist/BaseMapper.js.map +1 -0
  6. package/dist/DataSource.d.ts +61 -0
  7. package/dist/DataSource.d.ts.map +1 -0
  8. package/dist/DataSource.js +350 -0
  9. package/dist/DataSource.js.map +1 -0
  10. package/dist/Db.d.ts +67 -0
  11. package/dist/Db.d.ts.map +1 -0
  12. package/dist/Db.js +222 -0
  13. package/dist/Db.js.map +1 -0
  14. package/dist/IdType.d.ts +22 -0
  15. package/dist/IdType.d.ts.map +1 -0
  16. package/dist/IdType.js +34 -0
  17. package/dist/IdType.js.map +1 -0
  18. package/dist/QueryWrapper.d.ts +110 -0
  19. package/dist/QueryWrapper.d.ts.map +1 -0
  20. package/dist/QueryWrapper.js +343 -0
  21. package/dist/QueryWrapper.js.map +1 -0
  22. package/dist/config.d.ts +12 -0
  23. package/dist/config.d.ts.map +1 -0
  24. package/dist/config.js +80 -0
  25. package/dist/config.js.map +1 -0
  26. package/dist/dialect.d.ts +41 -0
  27. package/dist/dialect.d.ts.map +1 -0
  28. package/dist/dialect.js +171 -0
  29. package/dist/dialect.js.map +1 -0
  30. package/dist/enable.d.ts +12 -0
  31. package/dist/enable.d.ts.map +1 -0
  32. package/dist/enable.js +31 -0
  33. package/dist/enable.js.map +1 -0
  34. package/dist/entityDecorators.d.ts +77 -0
  35. package/dist/entityDecorators.d.ts.map +1 -0
  36. package/dist/entityDecorators.js +150 -0
  37. package/dist/entityDecorators.js.map +1 -0
  38. package/dist/errors.d.ts +11 -0
  39. package/dist/errors.d.ts.map +1 -0
  40. package/dist/errors.js +22 -0
  41. package/dist/errors.js.map +1 -0
  42. package/dist/fieldSelect.d.ts +49 -0
  43. package/dist/fieldSelect.d.ts.map +1 -0
  44. package/dist/fieldSelect.js +53 -0
  45. package/dist/fieldSelect.js.map +1 -0
  46. package/dist/fill.d.ts +8 -0
  47. package/dist/fill.d.ts.map +1 -0
  48. package/dist/fill.js +47 -0
  49. package/dist/fill.js.map +1 -0
  50. package/dist/flag.d.ts +2 -0
  51. package/dist/flag.d.ts.map +1 -0
  52. package/dist/flag.js +8 -0
  53. package/dist/flag.js.map +1 -0
  54. package/dist/hydrate.d.ts +38 -0
  55. package/dist/hydrate.d.ts.map +1 -0
  56. package/dist/hydrate.js +325 -0
  57. package/dist/hydrate.js.map +1 -0
  58. package/dist/identifier.d.ts +14 -0
  59. package/dist/identifier.d.ts.map +1 -0
  60. package/dist/identifier.js +51 -0
  61. package/dist/identifier.js.map +1 -0
  62. package/dist/index.d.ts +41 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +122 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/relation.d.ts +72 -0
  67. package/dist/relation.d.ts.map +1 -0
  68. package/dist/relation.js +150 -0
  69. package/dist/relation.js.map +1 -0
  70. package/dist/resultMap.d.ts +7 -0
  71. package/dist/resultMap.d.ts.map +1 -0
  72. package/dist/resultMap.js +25 -0
  73. package/dist/resultMap.js.map +1 -0
  74. package/dist/security.d.ts +16 -0
  75. package/dist/security.d.ts.map +1 -0
  76. package/dist/security.js +50 -0
  77. package/dist/security.js.map +1 -0
  78. package/dist/sqlDecorators.d.ts +60 -0
  79. package/dist/sqlDecorators.d.ts.map +1 -0
  80. package/dist/sqlDecorators.js +147 -0
  81. package/dist/sqlDecorators.js.map +1 -0
  82. package/dist/sqlLog.d.ts +30 -0
  83. package/dist/sqlLog.d.ts.map +1 -0
  84. package/dist/sqlLog.js +183 -0
  85. package/dist/sqlLog.js.map +1 -0
  86. package/dist/sqlTemplate.d.ts +38 -0
  87. package/dist/sqlTemplate.d.ts.map +1 -0
  88. package/dist/sqlTemplate.js +112 -0
  89. package/dist/sqlTemplate.js.map +1 -0
  90. package/dist/table.d.ts +17 -0
  91. package/dist/table.d.ts.map +1 -0
  92. package/dist/table.js +55 -0
  93. package/dist/table.js.map +1 -0
  94. package/dist/tableSearch.d.ts +72 -0
  95. package/dist/tableSearch.d.ts.map +1 -0
  96. package/dist/tableSearch.js +232 -0
  97. package/dist/tableSearch.js.map +1 -0
  98. package/dist/transactional.d.ts +27 -0
  99. package/dist/transactional.d.ts.map +1 -0
  100. package/dist/transactional.js +57 -0
  101. package/dist/transactional.js.map +1 -0
  102. package/dist/types.d.ts +155 -0
  103. package/dist/types.d.ts.map +1 -0
  104. package/dist/types.js +3 -0
  105. package/dist/types.js.map +1 -0
  106. package/dist/xml/MapperXml.d.ts +24 -0
  107. package/dist/xml/MapperXml.d.ts.map +1 -0
  108. package/dist/xml/MapperXml.js +92 -0
  109. package/dist/xml/MapperXml.js.map +1 -0
  110. package/dist/xml/execute.d.ts +12 -0
  111. package/dist/xml/execute.d.ts.map +1 -0
  112. package/dist/xml/execute.js +54 -0
  113. package/dist/xml/execute.js.map +1 -0
  114. package/dist/xml/index.d.ts +11 -0
  115. package/dist/xml/index.d.ts.map +1 -0
  116. package/dist/xml/index.js +29 -0
  117. package/dist/xml/index.js.map +1 -0
  118. package/dist/xml/loadMappers.d.ts +14 -0
  119. package/dist/xml/loadMappers.d.ts.map +1 -0
  120. package/dist/xml/loadMappers.js +171 -0
  121. package/dist/xml/loadMappers.js.map +1 -0
  122. package/dist/xml/parseMapperXml.d.ts +6 -0
  123. package/dist/xml/parseMapperXml.d.ts.map +1 -0
  124. package/dist/xml/parseMapperXml.js +225 -0
  125. package/dist/xml/parseMapperXml.js.map +1 -0
  126. package/dist/xml/registry.d.ts +15 -0
  127. package/dist/xml/registry.d.ts.map +1 -0
  128. package/dist/xml/registry.js +57 -0
  129. package/dist/xml/registry.js.map +1 -0
  130. package/dist/xml/renderSql.d.ts +6 -0
  131. package/dist/xml/renderSql.d.ts.map +1 -0
  132. package/dist/xml/renderSql.js +187 -0
  133. package/dist/xml/renderSql.js.map +1 -0
  134. package/dist/xml/types.d.ts +52 -0
  135. package/dist/xml/types.d.ts.map +1 -0
  136. package/dist/xml/types.js +3 -0
  137. package/dist/xml/types.js.map +1 -0
  138. package/dist/xml/xmlMapper.d.ts +16 -0
  139. package/dist/xml/xmlMapper.d.ts.map +1 -0
  140. package/dist/xml/xmlMapper.js +49 -0
  141. package/dist/xml/xmlMapper.js.map +1 -0
  142. package/package.json +35 -4
@@ -0,0 +1,225 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseMapperXml = parseMapperXml;
4
+ function stripNoise(xml) {
5
+ return xml
6
+ .replace(/<\?xml[\s\S]*?\?>/gi, "")
7
+ .replace(/<!DOCTYPE[\s\S]*?>/gi, "")
8
+ .replace(/<!--[\s\S]*?-->/g, "")
9
+ .trim();
10
+ }
11
+ function parseAttrs(raw) {
12
+ const attrs = {};
13
+ const re = /([A-Za-z_][\w:-]*)\s*=\s*(?:"([^"]*)"|'([^']*)')/g;
14
+ let m;
15
+ while ((m = re.exec(raw))) {
16
+ attrs[m[1]] = m[2] ?? m[3] ?? "";
17
+ }
18
+ return attrs;
19
+ }
20
+ function readOpenTag(src, from) {
21
+ if (src[from] !== "<")
22
+ return null;
23
+ if (src[from + 1] === "/" || src[from + 1] === "!" || src[from + 1] === "?") {
24
+ return null;
25
+ }
26
+ const end = src.indexOf(">", from);
27
+ if (end < 0)
28
+ throw new Error("XML 标签未闭合");
29
+ const body = src.slice(from + 1, end).trim();
30
+ const selfClosing = body.endsWith("/");
31
+ const inner = selfClosing ? body.slice(0, -1).trim() : body;
32
+ const sp = inner.search(/\s/);
33
+ const name = (sp < 0 ? inner : inner.slice(0, sp)).toLowerCase();
34
+ const attrRaw = sp < 0 ? "" : inner.slice(sp);
35
+ return {
36
+ name,
37
+ attrs: parseAttrs(attrRaw),
38
+ selfClosing,
39
+ end: end + 1,
40
+ };
41
+ }
42
+ function findCloseTag(src, name, from) {
43
+ const openRe = new RegExp(`<${name}\\b`, "gi");
44
+ const closeRe = new RegExp(`</${name}\\s*>`, "gi");
45
+ let depth = 1;
46
+ let i = from;
47
+ while (i < src.length && depth > 0) {
48
+ openRe.lastIndex = i;
49
+ closeRe.lastIndex = i;
50
+ const o = openRe.exec(src);
51
+ const c = closeRe.exec(src);
52
+ if (!c)
53
+ throw new Error(`缺少结束标签 </${name}>`);
54
+ if (o && o.index < c.index) {
55
+ // 可能是开标签;检查是否自闭合
56
+ const tag = readOpenTag(src, o.index);
57
+ if (tag && !tag.selfClosing)
58
+ depth += 1;
59
+ i = tag ? tag.end : o.index + 1;
60
+ }
61
+ else {
62
+ depth -= 1;
63
+ if (depth === 0)
64
+ return c.index;
65
+ i = c.index + c[0].length;
66
+ }
67
+ }
68
+ throw new Error(`缺少结束标签 </${name}>`);
69
+ }
70
+ function parseChildren(src) {
71
+ const nodes = [];
72
+ let i = 0;
73
+ while (i < src.length) {
74
+ const lt = src.indexOf("<", i);
75
+ if (lt < 0) {
76
+ const text = src.slice(i);
77
+ if (text)
78
+ nodes.push({ type: "text", text });
79
+ break;
80
+ }
81
+ if (lt > i) {
82
+ nodes.push({ type: "text", text: src.slice(i, lt) });
83
+ }
84
+ if (src.startsWith("</", lt))
85
+ break;
86
+ // CDATA → 纯文本
87
+ if (src.startsWith("<![CDATA[", lt)) {
88
+ const end = src.indexOf("]]>", lt);
89
+ if (end < 0)
90
+ throw new Error("CDATA 未闭合");
91
+ nodes.push({ type: "text", text: src.slice(lt + 9, end) });
92
+ i = end + 3;
93
+ continue;
94
+ }
95
+ const open = readOpenTag(src, lt);
96
+ if (!open) {
97
+ // 非标签的 <(如 age < 10)当作文本;建议用 CDATA
98
+ nodes.push({ type: "text", text: src[lt] });
99
+ i = lt + 1;
100
+ continue;
101
+ }
102
+ if (open.selfClosing) {
103
+ nodes.push(elementToNode(open.name, open.attrs, []));
104
+ i = open.end;
105
+ continue;
106
+ }
107
+ const closeAt = findCloseTag(src, open.name, open.end);
108
+ const inner = src.slice(open.end, closeAt);
109
+ const closeEnd = src.indexOf(">", closeAt) + 1;
110
+ nodes.push(elementToNode(open.name, open.attrs, parseChildren(inner)));
111
+ i = closeEnd;
112
+ }
113
+ return nodes;
114
+ }
115
+ function elementToNode(name, attrs, children) {
116
+ switch (name) {
117
+ case "if":
118
+ if (!attrs.test?.trim())
119
+ throw new Error("<if> 缺少 test");
120
+ return { type: "if", test: attrs.test.trim(), children };
121
+ case "where":
122
+ return { type: "where", children };
123
+ case "set":
124
+ return { type: "set", children };
125
+ case "trim":
126
+ return {
127
+ type: "trim",
128
+ prefix: attrs.prefix,
129
+ suffix: attrs.suffix,
130
+ prefixOverrides: attrs.prefixOverrides,
131
+ suffixOverrides: attrs.suffixOverrides,
132
+ children,
133
+ };
134
+ case "foreach":
135
+ if (!attrs.collection?.trim())
136
+ throw new Error("<foreach> 缺少 collection");
137
+ return {
138
+ type: "foreach",
139
+ collection: attrs.collection.trim(),
140
+ item: (attrs.item ?? "item").trim(),
141
+ index: attrs.index?.trim(),
142
+ open: attrs.open,
143
+ close: attrs.close,
144
+ separator: attrs.separator,
145
+ children,
146
+ };
147
+ case "include":
148
+ if (!attrs.refid?.trim())
149
+ throw new Error("<include> 缺少 refid");
150
+ return { type: "include", refid: attrs.refid.trim() };
151
+ default:
152
+ // 未知标签当文本保留,避免吞掉合法 SQL 中的比较符误伤;此处仅动态节点白名单
153
+ throw new Error(`XML Mapper 不支持标签 <${name}>`);
154
+ }
155
+ }
156
+ const STMT_KINDS = new Set(["select", "insert", "update", "delete"]);
157
+ /**
158
+ * 解析单个 Mapper XML 文本。
159
+ */
160
+ function parseMapperXml(xml, sourceFile = "") {
161
+ const cleaned = stripNoise(xml);
162
+ const rootOpen = readOpenTag(cleaned, cleaned.indexOf("<"));
163
+ if (!rootOpen || rootOpen.name !== "mapper") {
164
+ throw new Error(`${sourceFile || "XML"}: 根节点必须是 <mapper>`);
165
+ }
166
+ const namespace = (rootOpen.attrs.namespace ?? "").trim();
167
+ if (!namespace) {
168
+ throw new Error(`${sourceFile || "XML"}: <mapper> 缺少 namespace`);
169
+ }
170
+ const rootClose = findCloseTag(cleaned, "mapper", rootOpen.end);
171
+ const body = cleaned.slice(rootOpen.end, rootClose);
172
+ const sqlFragments = new Map();
173
+ const statements = [];
174
+ let i = 0;
175
+ while (i < body.length) {
176
+ const lt = body.indexOf("<", i);
177
+ if (lt < 0)
178
+ break;
179
+ if (body.startsWith("</", lt))
180
+ break;
181
+ const open = readOpenTag(body, lt);
182
+ if (!open) {
183
+ i = lt + 1;
184
+ continue;
185
+ }
186
+ if (open.selfClosing) {
187
+ i = open.end;
188
+ continue;
189
+ }
190
+ const closeAt = findCloseTag(body, open.name, open.end);
191
+ const inner = body.slice(open.end, closeAt);
192
+ const closeEnd = body.indexOf(">", closeAt) + 1;
193
+ const id = (open.attrs.id ?? "").trim();
194
+ if (open.name === "sql") {
195
+ if (!id)
196
+ throw new Error(`${sourceFile}: <sql> 缺少 id`);
197
+ if (sqlFragments.has(id)) {
198
+ throw new Error(`${sourceFile}: 重复 <sql id="${id}">`);
199
+ }
200
+ sqlFragments.set(id, parseChildren(inner));
201
+ }
202
+ else if (STMT_KINDS.has(open.name)) {
203
+ if (!id)
204
+ throw new Error(`${sourceFile}: <${open.name}> 缺少 id`);
205
+ statements.push({
206
+ namespace,
207
+ id,
208
+ kind: open.name,
209
+ nodes: parseChildren(inner),
210
+ resultType: open.attrs.resultType?.trim() || undefined,
211
+ datasource: open.attrs.datasource?.trim() || undefined,
212
+ sourceFile,
213
+ });
214
+ }
215
+ else if (open.name === "resultmap") {
216
+ // 首期跳过 resultMap 内容
217
+ }
218
+ else {
219
+ throw new Error(`${sourceFile}: 不支持的顶层标签 <${open.name}>(仅 sql/select/insert/update/delete)`);
220
+ }
221
+ i = closeEnd;
222
+ }
223
+ return { namespace, sourceFile, sqlFragments, statements };
224
+ }
225
+ //# sourceMappingURL=parseMapperXml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseMapperXml.js","sourceRoot":"","sources":["../../src/xml/parseMapperXml.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { SqlNode, XmlStatement } from "./types";
2
+ export interface XmlNamespaceBundle {
3
+ namespace: string;
4
+ fragments: Map<string, SqlNode[]>;
5
+ statements: Map<string, XmlStatement>;
6
+ files: string[];
7
+ }
8
+ export declare function clearXmlRegistry(): void;
9
+ export declare function getXmlNamespace(namespace: string): XmlNamespaceBundle | undefined;
10
+ export declare function listXmlNamespaces(): string[];
11
+ export declare function registerXmlBundle(namespace: string, sourceFile: string, fragments: Map<string, SqlNode[]>, statements: XmlStatement[]): void;
12
+ export declare function getXmlStatement(namespace: string, id: string): XmlStatement | undefined;
13
+ export declare function getXmlFragments(namespace: string): Map<string, SqlNode[]>;
14
+ export declare function countXmlStatements(): number;
15
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/xml/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAErD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAClC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACtC,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAID,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAEjF;AAED,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAE5C;AAED,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,EACjC,UAAU,EAAE,YAAY,EAAE,GACzB,IAAI,CA8BN;AAED,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,MAAM,GACT,YAAY,GAAG,SAAS,CAE1B;AAED,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,GAChB,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAExB;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAI3C"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.clearXmlRegistry = clearXmlRegistry;
4
+ exports.getXmlNamespace = getXmlNamespace;
5
+ exports.listXmlNamespaces = listXmlNamespaces;
6
+ exports.registerXmlBundle = registerXmlBundle;
7
+ exports.getXmlStatement = getXmlStatement;
8
+ exports.getXmlFragments = getXmlFragments;
9
+ exports.countXmlStatements = countXmlStatements;
10
+ const namespaces = new Map();
11
+ function clearXmlRegistry() {
12
+ namespaces.clear();
13
+ }
14
+ function getXmlNamespace(namespace) {
15
+ return namespaces.get(namespace);
16
+ }
17
+ function listXmlNamespaces() {
18
+ return [...namespaces.keys()];
19
+ }
20
+ function registerXmlBundle(namespace, sourceFile, fragments, statements) {
21
+ let bundle = namespaces.get(namespace);
22
+ if (!bundle) {
23
+ bundle = {
24
+ namespace,
25
+ fragments: new Map(),
26
+ statements: new Map(),
27
+ files: [],
28
+ };
29
+ namespaces.set(namespace, bundle);
30
+ }
31
+ bundle.files.push(sourceFile);
32
+ for (const [id, nodes] of fragments) {
33
+ if (bundle.fragments.has(id)) {
34
+ throw new Error(`XML 重复 <sql id="${id}">(namespace=${namespace}, file=${sourceFile})`);
35
+ }
36
+ bundle.fragments.set(id, nodes);
37
+ }
38
+ for (const stmt of statements) {
39
+ if (bundle.statements.has(stmt.id)) {
40
+ throw new Error(`XML 重复语句 id="${stmt.id}"(namespace=${namespace}, file=${sourceFile})`);
41
+ }
42
+ bundle.statements.set(stmt.id, stmt);
43
+ }
44
+ }
45
+ function getXmlStatement(namespace, id) {
46
+ return namespaces.get(namespace)?.statements.get(id);
47
+ }
48
+ function getXmlFragments(namespace) {
49
+ return namespaces.get(namespace)?.fragments ?? new Map();
50
+ }
51
+ function countXmlStatements() {
52
+ let n = 0;
53
+ for (const b of namespaces.values())
54
+ n += b.statements.size;
55
+ return n;
56
+ }
57
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/xml/registry.ts"],"names":[],"mappings":";;AAWA,4CAEC;AAED,0CAEC;AAED,8CAEC;AAED,8CAmCC;AAED,0CAKC;AAED,0CAIC;AAED,gDAIC;AApED,MAAM,UAAU,GAAG,IAAI,GAAG,EAA8B,CAAC;AAEzD,SAAgB,gBAAgB;IAC9B,UAAU,CAAC,KAAK,EAAE,CAAC;AACrB,CAAC;AAED,SAAgB,eAAe,CAAC,SAAiB;IAC/C,OAAO,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACnC,CAAC;AAED,SAAgB,iBAAiB;IAC/B,OAAO,CAAC,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;AAChC,CAAC;AAED,SAAgB,iBAAiB,CAC/B,SAAiB,EACjB,UAAkB,EAClB,SAAiC,EACjC,UAA0B;IAE1B,IAAI,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG;YACP,SAAS;YACT,SAAS,EAAE,IAAI,GAAG,EAAE;YACpB,UAAU,EAAE,IAAI,GAAG,EAAE;YACrB,KAAK,EAAE,EAAE;SACV,CAAC;QACF,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAE9B,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,SAAS,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CACb,mBAAmB,EAAE,gBAAgB,SAAS,UAAU,UAAU,GAAG,CACtE,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CACb,gBAAgB,IAAI,CAAC,EAAE,eAAe,SAAS,UAAU,UAAU,GAAG,CACvE,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAC7B,SAAiB,EACjB,EAAU;IAEV,OAAO,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,SAAgB,eAAe,CAC7B,SAAiB;IAEjB,OAAO,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,SAAS,IAAI,IAAI,GAAG,EAAE,CAAC;AAC3D,CAAC;AAED,SAAgB,kBAAkB;IAChC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,MAAM,EAAE;QAAE,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;IAC5D,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { SqlNode } from "./types";
2
+ /** 受限 test 表达式求值(禁止任意代码) */
3
+ export declare function evalTest(expr: string, ctx: Record<string, unknown>): boolean;
4
+ /** 将语句节点树渲染为带 #{} / ${} 的 SQL 文本 */
5
+ export declare function renderStatementSql(nodes: SqlNode[], ctx: Record<string, unknown>, fragments?: Map<string, SqlNode[]>): string;
6
+ //# sourceMappingURL=renderSql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderSql.d.ts","sourceRoot":"","sources":["../../src/xml/renderSql.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvC,4BAA4B;AAC5B,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CA+D5E;AAyID,oCAAoC;AACpC,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EAAE,EAChB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,SAAS,GAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAa,GAC5C,MAAM,CAMR"}
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.evalTest = evalTest;
4
+ exports.renderStatementSql = renderStatementSql;
5
+ const sqlTemplate_1 = require("../sqlTemplate");
6
+ /** 受限 test 表达式求值(禁止任意代码) */
7
+ function evalTest(expr, ctx) {
8
+ const raw = String(expr ?? "").trim();
9
+ if (!raw)
10
+ return false;
11
+ // 安全:拒绝危险 token
12
+ if (/[`$]|__proto__|constructor|Function|require|import|process|global|eval|=>/.test(raw)) {
13
+ throw new Error(`非法 test 表达式: ${raw}`);
14
+ }
15
+ // a != null / a == null / a != undefined
16
+ let m = raw.match(/^([A-Za-z_][\w.]*)\s*(!=|==|=)\s*(null|undefined)$/i);
17
+ if (m) {
18
+ const val = (0, sqlTemplate_1.getPath)(ctx, m[1]);
19
+ const isNull = val === null || val === undefined;
20
+ const op = m[2];
21
+ if (op === "!=")
22
+ return !isNull;
23
+ return isNull;
24
+ }
25
+ // a.length > 0 / a.length != 0
26
+ m = raw.match(/^([A-Za-z_][\w.]*)\.length\s*(>|>=|==|!=|<=|<)\s*(\d+)$/);
27
+ if (m) {
28
+ const val = (0, sqlTemplate_1.getPath)(ctx, m[1]);
29
+ const len = Array.isArray(val)
30
+ ? val.length
31
+ : typeof val === "string"
32
+ ? val.length
33
+ : 0;
34
+ return compare(len, m[2], Number(m[3]));
35
+ }
36
+ // a != '' / a == ''
37
+ m = raw.match(/^([A-Za-z_][\w.]*)\s*(!=|==|=)\s*(''|""|"")$/);
38
+ if (m) {
39
+ const val = (0, sqlTemplate_1.getPath)(ctx, m[1]);
40
+ const empty = val === "" || val === null || val === undefined;
41
+ return m[2] === "!=" ? !empty : empty;
42
+ }
43
+ // a == 1 / a > 0 数字比较
44
+ m = raw.match(/^([A-Za-z_][\w.]*)\s*(==|=|!=|>|>=|<|<=)\s*(-?\d+(?:\.\d+)?)$/);
45
+ if (m) {
46
+ const val = (0, sqlTemplate_1.getPath)(ctx, m[1]);
47
+ return compare(Number(val), m[2], Number(m[3]));
48
+ }
49
+ // 布尔字面量
50
+ if (/^(true|false)$/i.test(raw))
51
+ return /^true$/i.test(raw);
52
+ // 单独属性:truthy
53
+ if (/^[A-Za-z_][\w.]*$/.test(raw)) {
54
+ const val = (0, sqlTemplate_1.getPath)(ctx, raw);
55
+ if (Array.isArray(val))
56
+ return val.length > 0;
57
+ return val !== null && val !== undefined && val !== false && val !== "";
58
+ }
59
+ throw new Error(`不支持的 test 表达式(请用属性比较): ${raw}`);
60
+ }
61
+ function compare(left, op, right) {
62
+ switch (op) {
63
+ case ">":
64
+ return left > right;
65
+ case ">=":
66
+ return left >= right;
67
+ case "<":
68
+ return left < right;
69
+ case "<=":
70
+ return left <= right;
71
+ case "!=":
72
+ return left !== right;
73
+ case "==":
74
+ case "=":
75
+ return left === right;
76
+ default:
77
+ return false;
78
+ }
79
+ }
80
+ function stripLeadingAndOr(sql) {
81
+ return sql.replace(/^\s*(AND|OR)\s+/i, "").trim();
82
+ }
83
+ function applyTrim(body, opts) {
84
+ let s = body.trim();
85
+ if (!s)
86
+ return "";
87
+ if (opts.prefixOverrides) {
88
+ for (const token of opts.prefixOverrides.split("|").map((t) => t.trim())) {
89
+ if (!token)
90
+ continue;
91
+ const re = new RegExp(`^${escapeRe(token)}\\s+`, "i");
92
+ s = s.replace(re, "");
93
+ }
94
+ }
95
+ if (opts.suffixOverrides) {
96
+ for (const token of opts.suffixOverrides.split("|").map((t) => t.trim())) {
97
+ if (!token)
98
+ continue;
99
+ const re = new RegExp(`\\s+${escapeRe(token)}$`, "i");
100
+ s = s.replace(re, "");
101
+ }
102
+ }
103
+ s = s.trim();
104
+ if (!s)
105
+ return "";
106
+ if (opts.prefix)
107
+ s = `${opts.prefix} ${s}`;
108
+ if (opts.suffix)
109
+ s = `${s} ${opts.suffix}`;
110
+ return s;
111
+ }
112
+ function escapeRe(s) {
113
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
114
+ }
115
+ function renderNodes(nodes, ctx, fragments, stack) {
116
+ let out = "";
117
+ for (const node of nodes) {
118
+ out += renderNode(node, ctx, fragments, stack);
119
+ }
120
+ return out;
121
+ }
122
+ function renderNode(node, ctx, fragments, stack) {
123
+ switch (node.type) {
124
+ case "text":
125
+ return node.text;
126
+ case "if":
127
+ return evalTest(node.test, ctx)
128
+ ? renderNodes(node.children, ctx, fragments, stack)
129
+ : "";
130
+ case "where": {
131
+ const body = stripLeadingAndOr(renderNodes(node.children, ctx, fragments, stack).trim());
132
+ return body ? ` WHERE ${body} ` : " ";
133
+ }
134
+ case "set": {
135
+ let body = renderNodes(node.children, ctx, fragments, stack).trim();
136
+ body = body.replace(/,+\s*$/, "").trim();
137
+ return body ? ` SET ${body} ` : " ";
138
+ }
139
+ case "trim": {
140
+ const body = renderNodes(node.children, ctx, fragments, stack);
141
+ const trimmed = applyTrim(body, node);
142
+ return trimmed ? ` ${trimmed} ` : " ";
143
+ }
144
+ case "foreach": {
145
+ const coll = (0, sqlTemplate_1.getPath)(ctx, node.collection);
146
+ const list = Array.isArray(coll)
147
+ ? coll
148
+ : coll != null && typeof coll === "object"
149
+ ? Object.values(coll)
150
+ : [];
151
+ if (!list.length)
152
+ return "";
153
+ const parts = [];
154
+ list.forEach((item, idx) => {
155
+ const childCtx = {
156
+ ...ctx,
157
+ [node.item]: item,
158
+ };
159
+ if (node.index)
160
+ childCtx[node.index] = idx;
161
+ parts.push(renderNodes(node.children, childCtx, fragments, stack).trim());
162
+ });
163
+ const joined = parts.filter(Boolean).join(node.separator ?? "");
164
+ return `${node.open ?? ""}${joined}${node.close ?? ""}`;
165
+ }
166
+ case "include": {
167
+ if (stack.includes(node.refid)) {
168
+ throw new Error(`<include> 循环引用: ${stack.concat(node.refid).join(" -> ")}`);
169
+ }
170
+ const frag = fragments.get(node.refid);
171
+ if (!frag)
172
+ throw new Error(`找不到 <sql id="${node.refid}">`);
173
+ return renderNodes(frag, ctx, fragments, [...stack, node.refid]);
174
+ }
175
+ default:
176
+ return "";
177
+ }
178
+ }
179
+ /** 将语句节点树渲染为带 #{} / ${} 的 SQL 文本 */
180
+ function renderStatementSql(nodes, ctx, fragments = new Map()) {
181
+ return renderNodes(nodes, ctx, fragments, [])
182
+ .replace(/[ \t]+\n/g, "\n")
183
+ .replace(/\n+/g, " ")
184
+ .replace(/\s{2,}/g, " ")
185
+ .trim();
186
+ }
187
+ //# sourceMappingURL=renderSql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderSql.js","sourceRoot":"","sources":["../../src/xml/renderSql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ export type XmlStatementKind = "select" | "insert" | "update" | "delete";
2
+ /** 动态 SQL 节点树 */
3
+ export type SqlNode = {
4
+ type: "text";
5
+ text: string;
6
+ } | {
7
+ type: "if";
8
+ test: string;
9
+ children: SqlNode[];
10
+ } | {
11
+ type: "where";
12
+ children: SqlNode[];
13
+ } | {
14
+ type: "set";
15
+ children: SqlNode[];
16
+ } | {
17
+ type: "trim";
18
+ prefix?: string;
19
+ suffix?: string;
20
+ prefixOverrides?: string;
21
+ suffixOverrides?: string;
22
+ children: SqlNode[];
23
+ } | {
24
+ type: "foreach";
25
+ collection: string;
26
+ item: string;
27
+ index?: string;
28
+ open?: string;
29
+ close?: string;
30
+ separator?: string;
31
+ children: SqlNode[];
32
+ } | {
33
+ type: "include";
34
+ refid: string;
35
+ };
36
+ export interface XmlStatement {
37
+ namespace: string;
38
+ id: string;
39
+ kind: XmlStatementKind;
40
+ nodes: SqlNode[];
41
+ resultType?: string;
42
+ datasource?: string;
43
+ /** 来源文件,便于报错 */
44
+ sourceFile?: string;
45
+ }
46
+ export interface XmlMapperFile {
47
+ namespace: string;
48
+ sourceFile: string;
49
+ sqlFragments: Map<string, SqlNode[]>;
50
+ statements: XmlStatement[];
51
+ }
52
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/xml/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEzE,iBAAiB;AACjB,MAAM,MAAM,OAAO,GACf;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE,GAC3H;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB,GACD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvC,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACrC,UAAU,EAAE,YAAY,EAAE,CAAC;CAC5B"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/xml/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ export interface XmlMapperApi {
2
+ selectList(id: string, params?: Record<string, unknown>): Promise<unknown[]>;
3
+ selectOne(id: string, params?: Record<string, unknown>): Promise<unknown | null>;
4
+ insert(id: string, params?: Record<string, unknown>): Promise<number>;
5
+ update(id: string, params?: Record<string, unknown>): Promise<number>;
6
+ delete(id: string, params?: Record<string, unknown>): Promise<number>;
7
+ /** 按 kind 执行任意语句 */
8
+ execute(id: string, params?: Record<string, unknown>): Promise<unknown>;
9
+ }
10
+ /**
11
+ * 无类调用 XML 命名空间。
12
+ * @example
13
+ * await xmlMapper("com.pangza.UserMapper").selectList("findByRole", { roleId: 1 })
14
+ */
15
+ export declare function xmlMapper(namespace: string, datasource?: string): XmlMapperApi;
16
+ //# sourceMappingURL=xmlMapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xmlMapper.d.ts","sourceRoot":"","sources":["../../src/xml/xmlMapper.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7E,SAAS,CACP,EAAE,EAAE,MAAM,EACV,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACtE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACtE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACtE,oBAAoB;IACpB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACzE;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,GAClB,YAAY,CAoCd"}