xansql 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 (232) hide show
  1. package/Types/fields/Array.d.ts +7 -0
  2. package/Types/fields/Array.js +6 -0
  3. package/Types/fields/Array.js.map +1 -0
  4. package/Types/fields/Array.mjs +6 -0
  5. package/Types/fields/Array.mjs.map +1 -0
  6. package/Types/fields/Boolean.d.ts +8 -0
  7. package/Types/fields/Boolean.js +11 -0
  8. package/Types/fields/Boolean.js.map +1 -0
  9. package/Types/fields/Boolean.mjs +11 -0
  10. package/Types/fields/Boolean.mjs.map +1 -0
  11. package/Types/fields/Date.d.ts +10 -0
  12. package/Types/fields/Date.js +22 -0
  13. package/Types/fields/Date.js.map +1 -0
  14. package/Types/fields/Date.mjs +22 -0
  15. package/Types/fields/Date.mjs.map +1 -0
  16. package/Types/fields/Enum.d.ts +8 -0
  17. package/Types/fields/Enum.js +10 -0
  18. package/Types/fields/Enum.js.map +1 -0
  19. package/Types/fields/Enum.mjs +10 -0
  20. package/Types/fields/Enum.mjs.map +1 -0
  21. package/Types/fields/File.d.ts +7 -0
  22. package/Types/fields/File.js +6 -0
  23. package/Types/fields/File.js.map +1 -0
  24. package/Types/fields/File.mjs +6 -0
  25. package/Types/fields/File.mjs.map +1 -0
  26. package/Types/fields/IDField.d.ts +6 -0
  27. package/Types/fields/IDField.js +2 -0
  28. package/Types/fields/IDField.js.map +1 -0
  29. package/Types/fields/IDField.mjs +2 -0
  30. package/Types/fields/IDField.mjs.map +1 -0
  31. package/Types/fields/Number.d.ts +8 -0
  32. package/Types/fields/Number.js +11 -0
  33. package/Types/fields/Number.js.map +1 -0
  34. package/Types/fields/Number.mjs +11 -0
  35. package/Types/fields/Number.mjs.map +1 -0
  36. package/Types/fields/Object.d.ts +8 -0
  37. package/Types/fields/Object.js +11 -0
  38. package/Types/fields/Object.js.map +1 -0
  39. package/Types/fields/Object.mjs +11 -0
  40. package/Types/fields/Object.mjs.map +1 -0
  41. package/Types/fields/Record.d.ts +8 -0
  42. package/Types/fields/Record.js +11 -0
  43. package/Types/fields/Record.js.map +1 -0
  44. package/Types/fields/Record.mjs +11 -0
  45. package/Types/fields/Record.mjs.map +1 -0
  46. package/Types/fields/Schema.d.ts +16 -0
  47. package/Types/fields/Schema.js +34 -0
  48. package/Types/fields/Schema.js.map +1 -0
  49. package/Types/fields/Schema.mjs +34 -0
  50. package/Types/fields/Schema.mjs.map +1 -0
  51. package/Types/fields/String.d.ts +10 -0
  52. package/Types/fields/String.js +20 -0
  53. package/Types/fields/String.js.map +1 -0
  54. package/Types/fields/String.mjs +20 -0
  55. package/Types/fields/String.mjs.map +1 -0
  56. package/Types/fields/Tuple.d.ts +8 -0
  57. package/Types/fields/Tuple.js +11 -0
  58. package/Types/fields/Tuple.js.map +1 -0
  59. package/Types/fields/Tuple.mjs +11 -0
  60. package/Types/fields/Tuple.mjs.map +1 -0
  61. package/Types/fields/Union.d.ts +8 -0
  62. package/Types/fields/Union.js +11 -0
  63. package/Types/fields/Union.js.map +1 -0
  64. package/Types/fields/Union.mjs +11 -0
  65. package/Types/fields/Union.mjs.map +1 -0
  66. package/Types/index.d.ts +56 -0
  67. package/Types/index.js +129 -0
  68. package/Types/index.js.map +1 -0
  69. package/Types/index.mjs +129 -0
  70. package/Types/index.mjs.map +1 -0
  71. package/Types/types.d.ts +20 -0
  72. package/core/ExcuteMeta.d.ts +11 -0
  73. package/core/ExcuteMeta.js +22 -0
  74. package/core/ExcuteMeta.js.map +1 -0
  75. package/core/ExcuteMeta.mjs +22 -0
  76. package/core/ExcuteMeta.mjs.map +1 -0
  77. package/core/Xansql.d.ts +46 -0
  78. package/core/Xansql.js +132 -0
  79. package/core/Xansql.js.map +1 -0
  80. package/core/Xansql.mjs +132 -0
  81. package/core/Xansql.mjs.map +1 -0
  82. package/core/XansqlError.js +11 -0
  83. package/core/XansqlError.js.map +1 -0
  84. package/core/XansqlError.mjs +11 -0
  85. package/core/XansqlError.mjs.map +1 -0
  86. package/core/XansqlResult.d.ts +12 -0
  87. package/core/XansqlResult.js +32 -0
  88. package/core/XansqlResult.js.map +1 -0
  89. package/core/XansqlResult.mjs +32 -0
  90. package/core/XansqlResult.mjs.map +1 -0
  91. package/core/classes/EventManager.d.ts +72 -0
  92. package/core/classes/EventManager.js +21 -0
  93. package/core/classes/EventManager.js.map +1 -0
  94. package/core/classes/EventManager.mjs +21 -0
  95. package/core/classes/EventManager.mjs.map +1 -0
  96. package/core/classes/ForeignInfo.js +51 -0
  97. package/core/classes/ForeignInfo.js.map +1 -0
  98. package/core/classes/ForeignInfo.mjs +51 -0
  99. package/core/classes/ForeignInfo.mjs.map +1 -0
  100. package/core/classes/Migration/ForeingMigration.d.ts +12 -0
  101. package/core/classes/Migration/ForeingMigration.js +52 -0
  102. package/core/classes/Migration/ForeingMigration.js.map +1 -0
  103. package/core/classes/Migration/ForeingMigration.mjs +52 -0
  104. package/core/classes/Migration/ForeingMigration.mjs.map +1 -0
  105. package/core/classes/Migration/IndexMigration.d.ts +12 -0
  106. package/core/classes/Migration/IndexMigration.js +49 -0
  107. package/core/classes/Migration/IndexMigration.js.map +1 -0
  108. package/core/classes/Migration/IndexMigration.mjs +49 -0
  109. package/core/classes/Migration/IndexMigration.mjs.map +1 -0
  110. package/core/classes/Migration/TableMigration.d.ts +33 -0
  111. package/core/classes/Migration/TableMigration.js +215 -0
  112. package/core/classes/Migration/TableMigration.js.map +1 -0
  113. package/core/classes/Migration/TableMigration.mjs +215 -0
  114. package/core/classes/Migration/TableMigration.mjs.map +1 -0
  115. package/core/classes/Migration/index.d.ts +12 -0
  116. package/core/classes/Migration/index.js +189 -0
  117. package/core/classes/Migration/index.js.map +1 -0
  118. package/core/classes/Migration/index.mjs +189 -0
  119. package/core/classes/Migration/index.mjs.map +1 -0
  120. package/core/classes/ModelFormatter.js +166 -0
  121. package/core/classes/ModelFormatter.js.map +1 -0
  122. package/core/classes/ModelFormatter.mjs +166 -0
  123. package/core/classes/ModelFormatter.mjs.map +1 -0
  124. package/core/classes/TypesGenerator.d.ts +13 -0
  125. package/core/classes/TypesGenerator.js +170 -0
  126. package/core/classes/TypesGenerator.js.map +1 -0
  127. package/core/classes/TypesGenerator.mjs +170 -0
  128. package/core/classes/TypesGenerator.mjs.map +1 -0
  129. package/core/classes/XansqlConfig.js +33 -0
  130. package/core/classes/XansqlConfig.js.map +1 -0
  131. package/core/classes/XansqlConfig.mjs +33 -0
  132. package/core/classes/XansqlConfig.mjs.map +1 -0
  133. package/core/classes/XansqlFetch.js +304 -0
  134. package/core/classes/XansqlFetch.js.map +1 -0
  135. package/core/classes/XansqlFetch.mjs +304 -0
  136. package/core/classes/XansqlFetch.mjs.map +1 -0
  137. package/core/classes/XansqlTransaction.d.ts +13 -0
  138. package/core/classes/XansqlTransaction.js +46 -0
  139. package/core/classes/XansqlTransaction.js.map +1 -0
  140. package/core/classes/XansqlTransaction.mjs +46 -0
  141. package/core/classes/XansqlTransaction.mjs.map +1 -0
  142. package/core/type.d.ts +117 -0
  143. package/index.d.ts +3 -0
  144. package/index.js +1 -0
  145. package/index.js.map +1 -0
  146. package/index.mjs +1 -0
  147. package/index.mjs.map +1 -0
  148. package/model/Args/RelationExcuteArgs.js +5 -0
  149. package/model/Args/RelationExcuteArgs.js.map +1 -0
  150. package/model/Args/RelationExcuteArgs.mjs +5 -0
  151. package/model/Args/RelationExcuteArgs.mjs.map +1 -0
  152. package/model/Args/WhereArgs.js +226 -0
  153. package/model/Args/WhereArgs.js.map +1 -0
  154. package/model/Args/WhereArgs.mjs +226 -0
  155. package/model/Args/WhereArgs.mjs.map +1 -0
  156. package/model/Base.d.ts +26 -0
  157. package/model/Base.js +64 -0
  158. package/model/Base.js.map +1 -0
  159. package/model/Base.mjs +64 -0
  160. package/model/Base.mjs.map +1 -0
  161. package/model/Executer/Aggregate/SelectArgs.js +59 -0
  162. package/model/Executer/Aggregate/SelectArgs.js.map +1 -0
  163. package/model/Executer/Aggregate/SelectArgs.mjs +59 -0
  164. package/model/Executer/Aggregate/SelectArgs.mjs.map +1 -0
  165. package/model/Executer/Aggregate/index.js +59 -0
  166. package/model/Executer/Aggregate/index.js.map +1 -0
  167. package/model/Executer/Aggregate/index.mjs +59 -0
  168. package/model/Executer/Aggregate/index.mjs.map +1 -0
  169. package/model/Executer/Create/CreateDataArgs.js +145 -0
  170. package/model/Executer/Create/CreateDataArgs.js.map +1 -0
  171. package/model/Executer/Create/CreateDataArgs.mjs +145 -0
  172. package/model/Executer/Create/CreateDataArgs.mjs.map +1 -0
  173. package/model/Executer/Create/index.js +101 -0
  174. package/model/Executer/Create/index.js.map +1 -0
  175. package/model/Executer/Create/index.mjs +101 -0
  176. package/model/Executer/Create/index.mjs.map +1 -0
  177. package/model/Executer/Delete/index.js +112 -0
  178. package/model/Executer/Delete/index.js.map +1 -0
  179. package/model/Executer/Delete/index.mjs +112 -0
  180. package/model/Executer/Delete/index.mjs.map +1 -0
  181. package/model/Executer/Find/DistinctArgs.js +32 -0
  182. package/model/Executer/Find/DistinctArgs.js.map +1 -0
  183. package/model/Executer/Find/DistinctArgs.mjs +32 -0
  184. package/model/Executer/Find/DistinctArgs.mjs.map +1 -0
  185. package/model/Executer/Find/LimitArgs.js +31 -0
  186. package/model/Executer/Find/LimitArgs.js.map +1 -0
  187. package/model/Executer/Find/LimitArgs.mjs +31 -0
  188. package/model/Executer/Find/LimitArgs.mjs.map +1 -0
  189. package/model/Executer/Find/OrderByArgs.js +29 -0
  190. package/model/Executer/Find/OrderByArgs.js.map +1 -0
  191. package/model/Executer/Find/OrderByArgs.mjs +29 -0
  192. package/model/Executer/Find/OrderByArgs.mjs.map +1 -0
  193. package/model/Executer/Find/SelectArgs.js +119 -0
  194. package/model/Executer/Find/SelectArgs.js.map +1 -0
  195. package/model/Executer/Find/SelectArgs.mjs +119 -0
  196. package/model/Executer/Find/SelectArgs.mjs.map +1 -0
  197. package/model/Executer/Find/index.js +338 -0
  198. package/model/Executer/Find/index.js.map +1 -0
  199. package/model/Executer/Find/index.mjs +338 -0
  200. package/model/Executer/Find/index.mjs.map +1 -0
  201. package/model/Executer/Update/UpdateDataArgs.js +124 -0
  202. package/model/Executer/Update/UpdateDataArgs.js.map +1 -0
  203. package/model/Executer/Update/UpdateDataArgs.mjs +124 -0
  204. package/model/Executer/Update/UpdateDataArgs.mjs.map +1 -0
  205. package/model/Executer/Update/index.js +207 -0
  206. package/model/Executer/Update/index.js.map +1 -0
  207. package/model/Executer/Update/index.mjs +207 -0
  208. package/model/Executer/Update/index.mjs.map +1 -0
  209. package/model/include/ValueFormatter.js +99 -0
  210. package/model/include/ValueFormatter.js.map +1 -0
  211. package/model/include/ValueFormatter.mjs +99 -0
  212. package/model/include/ValueFormatter.mjs.map +1 -0
  213. package/model/index.d.ts +29 -0
  214. package/model/index.js +236 -0
  215. package/model/index.js.map +1 -0
  216. package/model/index.mjs +236 -0
  217. package/model/index.mjs.map +1 -0
  218. package/model/type.d.ts +106 -0
  219. package/package.json +32 -0
  220. package/readme.md +359 -0
  221. package/utils/chunker.js +53 -0
  222. package/utils/chunker.js.map +1 -0
  223. package/utils/chunker.mjs +53 -0
  224. package/utils/chunker.mjs.map +1 -0
  225. package/utils/index.js +49 -0
  226. package/utils/index.js.map +1 -0
  227. package/utils/index.mjs +49 -0
  228. package/utils/index.mjs.map +1 -0
  229. package/utils/sha256.js +66 -0
  230. package/utils/sha256.js.map +1 -0
  231. package/utils/sha256.mjs +66 -0
  232. package/utils/sha256.mjs.map +1 -0
@@ -0,0 +1,304 @@
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var securequ=require('securequ'),ExcuteMeta=require('../ExcuteMeta.js'),XansqlError=require('../XansqlError.js');let clientModule = null;
2
+ let serverModule = null;
3
+ class XansqlFetch {
4
+ constructor(xansql) {
5
+ this._client = null;
6
+ this._server = null;
7
+ this.secretCache = null;
8
+ this.loaded = false;
9
+ this.xansql = xansql;
10
+ let config = xansql.config.fetch;
11
+ if (config) {
12
+ if (typeof config === 'string') {
13
+ config = {
14
+ url: config
15
+ };
16
+ }
17
+ }
18
+ this.fetchConfig = config;
19
+ }
20
+ async client() {
21
+ if (!this._client) {
22
+ const secret = await this.makeSecret();
23
+ const config = this.fetchConfig;
24
+ clientModule = clientModule || (await import('securequ/client')).default;
25
+ this._client = new clientModule({
26
+ url: config.url,
27
+ secret
28
+ });
29
+ }
30
+ return this._client;
31
+ }
32
+ async server() {
33
+ if (!this._server) {
34
+ const xansql = this.xansql;
35
+ const config = xansql.config;
36
+ const fetchConfig = this.fetchConfig;
37
+ const secret = await this.makeSecret();
38
+ serverModule = serverModule || (await import('securequ/server')).default;
39
+ const url = new URL(fetchConfig.url);
40
+ this._server = new serverModule({
41
+ mode: fetchConfig.mode,
42
+ basepath: `/${url.pathname.replace(/^\/+/, '')}`,
43
+ file: config.file,
44
+ clients: [
45
+ {
46
+ origin: `*`,
47
+ secret
48
+ }
49
+ ]
50
+ });
51
+ }
52
+ return this._server;
53
+ }
54
+ async execute(sql, executeId) {
55
+ const client = await this.client();
56
+ const meta = ExcuteMeta.default.get(executeId);
57
+ const data = {
58
+ sql,
59
+ table: meta.model.table,
60
+ action: meta.action,
61
+ modelType: meta.modelType,
62
+ args: meta.args
63
+ };
64
+ if (meta.action === "SELECT" || meta.action === "AGGREGATE") {
65
+ let res = await client.get(await this.makePath('find'), { params: data });
66
+ !res.success && console.error(res);
67
+ return res.data || null;
68
+ }
69
+ else if (meta.action === "INSERT") {
70
+ let res = await client.post(await this.makePath('insert'), { body: data });
71
+ !res.success && console.error(res);
72
+ return res.data || null;
73
+ }
74
+ else if (meta.action === "UPDATE") {
75
+ let res = await client.put(await this.makePath('update'), { body: data });
76
+ !res.success && console.error(res);
77
+ return res.data || null;
78
+ }
79
+ else if (meta.action === "DELETE") {
80
+ let res = await client.delete(await this.makePath('delete'), { params: data });
81
+ !res.success && console.error(res);
82
+ return res.data || null;
83
+ }
84
+ else {
85
+ let res = await client.post(await this.makePath('executer'), { body: data });
86
+ !res.success && console.error(res);
87
+ return res.data || null;
88
+ }
89
+ }
90
+ async getSchema() {
91
+ const client = await this.client();
92
+ const res = await client.get(await this.makePath('raw_schema'));
93
+ if (!res.success) {
94
+ throw new XansqlError.default({
95
+ message: `Failed to fetch schema: ${res.message || 'Unknown error'}`
96
+ });
97
+ }
98
+ return res.data;
99
+ }
100
+ async onFetch(url, info) {
101
+ const xansql = this.xansql;
102
+ const config = xansql.config;
103
+ if (typeof window !== "undefined")
104
+ throw new XansqlError.default({
105
+ message: `XansqlFetch.onFetch cannot be called in browser environment.`,
106
+ });
107
+ const hasUrl = typeof config.fetch === "string" || typeof config.fetch.url === "string";
108
+ if (!config.fetch || !hasUrl)
109
+ throw new XansqlError.default({
110
+ message: `Xansql fetch configuration is not provided.`,
111
+ });
112
+ let server = await this.server();
113
+ if (!this.loaded) {
114
+ this.loaded = true;
115
+ server.get(await this.makePath('find'), async (req) => {
116
+ const params = req.searchParams;
117
+ if (info.isAuthorized) {
118
+ const isPermit = await info.isAuthorized({
119
+ method: "GET",
120
+ model: xansql.models.get(params.table),
121
+ action: params.action,
122
+ modelType: params.modelType,
123
+ args: params.args
124
+ });
125
+ if (!isPermit)
126
+ throw new XansqlError.default({
127
+ message: "isAuthorized denied for fetch request.",
128
+ model: params.table,
129
+ });
130
+ }
131
+ throw await xansql.execute(params.sql);
132
+ });
133
+ server.post(await this.makePath('insert'), async (req) => {
134
+ const params = req.body;
135
+ if (info.isAuthorized) {
136
+ const isPermit = await info.isAuthorized({
137
+ method: "POST",
138
+ model: xansql.models.get(params.table),
139
+ action: params.action,
140
+ modelType: params.modelType,
141
+ args: params.args,
142
+ });
143
+ if (!isPermit)
144
+ throw new XansqlError.default({
145
+ message: "isAuthorized denied for fetch request.",
146
+ model: params.table,
147
+ });
148
+ }
149
+ throw await xansql.execute(params.sql);
150
+ });
151
+ server.put(await this.makePath('update'), async (req) => {
152
+ const params = req.body;
153
+ if (info.isAuthorized) {
154
+ const isPermit = await info.isAuthorized({
155
+ method: "PUT",
156
+ model: xansql.models.get(params.table),
157
+ action: params.action,
158
+ modelType: params.modelType,
159
+ args: params.args,
160
+ });
161
+ if (!isPermit)
162
+ throw new XansqlError.default({
163
+ message: "isAuthorized denied for fetch request.",
164
+ model: params.table,
165
+ });
166
+ }
167
+ throw await xansql.execute(params.sql);
168
+ });
169
+ server.delete(await this.makePath('delete'), async (req) => {
170
+ const params = req.searchParams;
171
+ if (info.isAuthorized) {
172
+ const isPermit = await info.isAuthorized({
173
+ method: "DELETE",
174
+ model: xansql.models.get(params.table),
175
+ action: params.action,
176
+ modelType: params.modelType,
177
+ args: params.args,
178
+ });
179
+ if (!isPermit)
180
+ throw new XansqlError.default({
181
+ message: "isAuthorized denied for fetch request.",
182
+ model: params.table,
183
+ });
184
+ }
185
+ throw await xansql.execute(params.sql);
186
+ });
187
+ server.post(await this.makePath('executer'), async (req) => {
188
+ const params = req.body;
189
+ if (info.isAuthorized) {
190
+ const isPermit = await info.isAuthorized({
191
+ method: "POST",
192
+ model: xansql.models.get(params.table),
193
+ action: params.action,
194
+ modelType: params.modelType,
195
+ args: params.args,
196
+ });
197
+ if (!isPermit)
198
+ throw new XansqlError.default({
199
+ message: "isAuthorized denied for fetch request.",
200
+ model: params.table,
201
+ });
202
+ }
203
+ throw await xansql.execute(params.sql);
204
+ });
205
+ server.get(await this.makePath('raw_schema'), async (req) => {
206
+ if (info.isAuthorized) {
207
+ const isPermit = await info.isAuthorized({
208
+ method: "GET",
209
+ action: "getSchema",
210
+ model: null,
211
+ modelType: "main",
212
+ args: {},
213
+ });
214
+ if (!isPermit)
215
+ throw new XansqlError.default({
216
+ message: "isAuthorized denied for fetch request.",
217
+ });
218
+ }
219
+ throw await xansql.dialect.getSchema();
220
+ });
221
+ }
222
+ try {
223
+ const res = await server.listen(url, {
224
+ body: info.body,
225
+ headers: info.headers,
226
+ });
227
+ return {
228
+ status: res.status,
229
+ body: res.content,
230
+ };
231
+ }
232
+ catch (error) {
233
+ const secret = await this.makeSecret();
234
+ return {
235
+ status: 500,
236
+ body: await securequ.crypto.encryptBuffer({
237
+ success: false,
238
+ message: error.message || 'Internal Server Error'
239
+ }, secret)
240
+ };
241
+ }
242
+ }
243
+ async uploadFile(file, executeId) {
244
+ const xansql = this.xansql;
245
+ if (!xansql.config.file || !xansql.config.file.upload) {
246
+ throw new XansqlError.default("Xansql file upload configuration is not provided.");
247
+ }
248
+ if (typeof window !== "undefined" && !xansql.config.fetch) {
249
+ throw new XansqlError.default("Xansql fetch configuration is required in client side.");
250
+ }
251
+ if (typeof window !== "undefined") {
252
+ const client = await this.client();
253
+ const res = await client.uploadFile(file);
254
+ ExcuteMeta.default.delete(executeId);
255
+ return res.data;
256
+ }
257
+ else {
258
+ const server = await this.server();
259
+ return await server.uploadFile(file);
260
+ }
261
+ }
262
+ async deleteFile(fileId, executeId) {
263
+ const xansql = this.xansql;
264
+ if (!xansql.config.file || !xansql.config.file.delete) {
265
+ throw new XansqlError.default("Xansql file delete configuration is not provided.");
266
+ }
267
+ if (typeof window !== "undefined" && !xansql.config.fetch) {
268
+ throw new XansqlError.default("Xansql fetch configuration is required in client side.");
269
+ }
270
+ if (typeof window !== "undefined") {
271
+ const client = await this.client();
272
+ const res = await client.deleteFile(fileId);
273
+ ExcuteMeta.default.delete(executeId);
274
+ return res;
275
+ }
276
+ else {
277
+ const server = await this.server();
278
+ const res = await server.deleteFile(fileId);
279
+ return res;
280
+ }
281
+ }
282
+ async makeSecret() {
283
+ if (this.secretCache)
284
+ return this.secretCache;
285
+ const models = this.xansql.models;
286
+ let uid = '';
287
+ for (let model of models.values()) {
288
+ uid += model.table;
289
+ for (let column in model.schema) {
290
+ uid += column;
291
+ const field = model.schema[column];
292
+ const meta = field.meta || {};
293
+ uid += JSON.stringify(meta);
294
+ }
295
+ }
296
+ this.secretCache = await securequ.crypto.hash(uid);
297
+ return this.secretCache;
298
+ }
299
+ async makePath(path) {
300
+ const secret = await this.makeSecret();
301
+ const gen = `/${await securequ.crypto.hash(path + secret)}`;
302
+ return gen;
303
+ }
304
+ }exports.default=XansqlFetch;//# sourceMappingURL=XansqlFetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"XansqlFetch.js","sources":["../../../src/core/classes/XansqlFetch.ts"],"sourcesContent":["import { crypto, SecurequClient, SecurequServer } from \"securequ\";\nimport Xansql from \"../Xansql\"\nimport { ExecuterResult, XansqlFetchConfig, XansqlFileMeta, XansqlOnFetchInfo } from \"../type\";\nimport ExecuteMeta, { ExecuteMetaData } from \"../ExcuteMeta\";\nimport Model from \"../../model\";\nimport XansqlError from \"../XansqlError\";\n\nlet clientModule: typeof import(\"securequ/client\").default | null = null;\nlet serverModule: typeof import(\"securequ/server\").default | null = null;\n\n\nclass XansqlFetch {\n xansql: Xansql\n private _client: SecurequClient | null = null\n private _server: SecurequServer | null = null\n private secretCache: string | null = null\n private fetchConfig: XansqlFetchConfig\n\n constructor(xansql: Xansql) {\n this.xansql = xansql\n let config = xansql.config.fetch as XansqlFetchConfig\n if (config) {\n if (typeof config === 'string') {\n config = {\n url: config\n }\n }\n }\n this.fetchConfig = config\n }\n\n async client() {\n if (!this._client) {\n const secret = await this.makeSecret()\n const config = this.fetchConfig as XansqlFetchConfig\n clientModule = clientModule || (await import(\"securequ/client\")).default\n this._client = new clientModule({\n url: config.url,\n secret\n });\n }\n return this._client;\n }\n\n async server() {\n if (!this._server) {\n const xansql = this.xansql\n const config = xansql.config\n const fetchConfig = this.fetchConfig as XansqlFetchConfig\n const secret = await this.makeSecret()\n serverModule = serverModule || (await import(\"securequ/server\")).default;\n const url = new URL(fetchConfig.url)\n this._server = new serverModule({\n mode: fetchConfig.mode,\n basepath: `/${url.pathname.replace(/^\\/+/, '')}`,\n file: config.file,\n clients: [\n {\n origin: `*`,\n secret\n }\n ]\n });\n }\n return this._server;\n }\n\n async execute(sql: string, executeId: string): Promise<ExecuterResult> {\n\n const client = await this.client()\n const meta = ExecuteMeta.get(executeId) as ExecuteMetaData\n const data = {\n sql,\n table: meta.model.table,\n action: meta.action,\n modelType: meta.modelType,\n args: meta.args\n };\n\n if (meta.action === \"SELECT\" || meta.action === \"AGGREGATE\") {\n let res = await client.get(await this.makePath('find'), { params: data })\n !res.success && console.error(res);\n return res.data || null\n } else if (meta.action === \"INSERT\") {\n let res = await client.post(await this.makePath('insert'), { body: data })\n !res.success && console.error(res);\n return res.data || null\n } else if (meta.action === \"UPDATE\") {\n let res = await client.put(await this.makePath('update'), { body: data })\n !res.success && console.error(res);\n return res.data || null\n } else if (meta.action === \"DELETE\") {\n let res = await client.delete(await this.makePath('delete'), { params: data })\n !res.success && console.error(res);\n return res.data || null\n } else {\n let res = await client.post(await this.makePath('executer'), { body: data })\n !res.success && console.error(res);\n return res.data || null\n }\n }\n\n async getSchema(): Promise<any> {\n const client = await this.client()\n const res = await client.get(await this.makePath('raw_schema'))\n if (!res.success) {\n throw new XansqlError({\n message: `Failed to fetch schema: ${res.message || 'Unknown error'}`\n })\n }\n return res.data\n }\n\n private loaded = false\n async onFetch(url: string, info: XansqlOnFetchInfo) {\n const xansql = this.xansql\n const config = xansql.config\n\n if (typeof window !== \"undefined\") throw new XansqlError({\n message: `XansqlFetch.onFetch cannot be called in browser environment.`,\n })\n const hasUrl = typeof config.fetch === \"string\" || typeof config.fetch.url === \"string\"\n if (!config.fetch || !hasUrl) throw new XansqlError({\n message: `Xansql fetch configuration is not provided.`,\n })\n\n let server = await this.server()\n\n if (!this.loaded) {\n this.loaded = true\n server.get(await this.makePath('find'), async (req: any) => {\n const params: any = req.searchParams\n if (info.isAuthorized) {\n const isPermit = await info.isAuthorized({\n method: \"GET\",\n model: xansql.models.get(params.table) as Model,\n action: params.action,\n modelType: params.modelType,\n args: params.args\n })\n if (!isPermit) throw new XansqlError({\n message: \"isAuthorized denied for fetch request.\",\n model: params.table,\n })\n }\n throw await xansql.execute(params.sql);\n })\n server.post(await this.makePath('insert'), async (req: any) => {\n const params: any = req.body\n if (info.isAuthorized) {\n const isPermit = await info.isAuthorized({\n method: \"POST\",\n model: xansql.models.get(params.table) as Model,\n action: params.action,\n modelType: params.modelType,\n args: params.args,\n })\n if (!isPermit) throw new XansqlError({\n message: \"isAuthorized denied for fetch request.\",\n model: params.table,\n })\n }\n throw await xansql.execute(params.sql);\n })\n server.put(await this.makePath('update'), async (req: any) => {\n const params: any = req.body\n if (info.isAuthorized) {\n const isPermit = await info.isAuthorized({\n method: \"PUT\",\n model: xansql.models.get(params.table) as Model,\n action: params.action,\n modelType: params.modelType,\n args: params.args,\n })\n if (!isPermit) throw new XansqlError({\n message: \"isAuthorized denied for fetch request.\",\n model: params.table,\n })\n }\n throw await xansql.execute(params.sql);\n })\n server.delete(await this.makePath('delete'), async (req: any) => {\n const params: any = req.searchParams\n if (info.isAuthorized) {\n const isPermit = await info.isAuthorized({\n method: \"DELETE\",\n model: xansql.models.get(params.table) as Model,\n action: params.action,\n modelType: params.modelType,\n args: params.args,\n })\n if (!isPermit) throw new XansqlError({\n message: \"isAuthorized denied for fetch request.\",\n model: params.table,\n })\n }\n throw await xansql.execute(params.sql);\n })\n server.post(await this.makePath('executer'), async (req: any) => {\n const params: any = req.body\n if (info.isAuthorized) {\n const isPermit = await info.isAuthorized({\n method: \"POST\",\n model: xansql.models.get(params.table) as Model,\n action: params.action,\n modelType: params.modelType,\n args: params.args,\n })\n if (!isPermit) throw new XansqlError({\n message: \"isAuthorized denied for fetch request.\",\n model: params.table,\n })\n }\n throw await xansql.execute(params.sql);\n })\n server.get(await this.makePath('raw_schema'), async (req: any) => {\n if (info.isAuthorized) {\n const isPermit = await info.isAuthorized({\n method: \"GET\",\n action: \"getSchema\",\n model: null as any,\n modelType: \"main\",\n args: {},\n })\n if (!isPermit) throw new XansqlError({\n message: \"isAuthorized denied for fetch request.\",\n })\n }\n throw await xansql.dialect.getSchema();\n })\n }\n\n try {\n const res = await server.listen(url, {\n body: info.body,\n headers: info.headers,\n })\n\n return {\n status: res.status,\n body: res.content,\n }\n } catch (error: any) {\n const secret = await this.makeSecret()\n return {\n status: 500,\n body: await crypto.encryptBuffer({\n success: false,\n message: error.message || 'Internal Server Error'\n }, secret)\n }\n }\n }\n\n async uploadFile(file: File, executeId?: string): Promise<XansqlFileMeta> {\n const xansql = this.xansql;\n if (!xansql.config.file || !xansql.config.file.upload) {\n throw new XansqlError(\"Xansql file upload configuration is not provided.\");\n }\n\n if (typeof window !== \"undefined\" && !xansql.config.fetch) {\n throw new XansqlError(\"Xansql fetch configuration is required in client side.\");\n }\n\n if (typeof window !== \"undefined\") {\n const client = await this.client();\n const res = await client.uploadFile(file);\n ExecuteMeta.delete(executeId!);\n return res.data\n } else {\n const server = await this.server();\n return await server.uploadFile(file);\n }\n }\n\n async deleteFile(fileId: string, executeId?: string) {\n const xansql = this.xansql;\n if (!xansql.config.file || !xansql.config.file.delete) {\n throw new XansqlError(\"Xansql file delete configuration is not provided.\");\n }\n if (typeof window !== \"undefined\" && !xansql.config.fetch) {\n throw new XansqlError(\"Xansql fetch configuration is required in client side.\");\n }\n if (typeof window !== \"undefined\") {\n const client = await this.client();\n const res = await client.deleteFile(fileId);\n ExecuteMeta.delete(executeId!);\n return res;\n } else {\n const server = await this.server();\n const res = await server.deleteFile(fileId);\n return res;\n }\n }\n\n private async makeSecret() {\n if (this.secretCache) return this.secretCache;\n const models = this.xansql.models\n let uid = ''\n for (let model of models.values()) {\n uid += model.table\n for (let column in model.schema) {\n uid += column\n const field = model.schema[column]\n const meta = field.meta || {}\n uid += JSON.stringify(meta)\n }\n }\n\n this.secretCache = await crypto.hash(uid)\n return this.secretCache;\n }\n\n private async makePath(path: string) {\n const secret = await this.makeSecret()\n const gen = `/${await crypto.hash(path + secret)}`\n return gen;\n }\n\n}\n\nexport default XansqlFetch"],"names":["ExecuteMeta","XansqlError","crypto"],"mappings":"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"}
@@ -0,0 +1,304 @@
1
+ import {crypto}from'securequ';import ExecuteMeta from'../ExcuteMeta.mjs';import XansqlError from'../XansqlError.mjs';let clientModule = null;
2
+ let serverModule = null;
3
+ class XansqlFetch {
4
+ constructor(xansql) {
5
+ this._client = null;
6
+ this._server = null;
7
+ this.secretCache = null;
8
+ this.loaded = false;
9
+ this.xansql = xansql;
10
+ let config = xansql.config.fetch;
11
+ if (config) {
12
+ if (typeof config === 'string') {
13
+ config = {
14
+ url: config
15
+ };
16
+ }
17
+ }
18
+ this.fetchConfig = config;
19
+ }
20
+ async client() {
21
+ if (!this._client) {
22
+ const secret = await this.makeSecret();
23
+ const config = this.fetchConfig;
24
+ clientModule = clientModule || (await import('securequ/client')).default;
25
+ this._client = new clientModule({
26
+ url: config.url,
27
+ secret
28
+ });
29
+ }
30
+ return this._client;
31
+ }
32
+ async server() {
33
+ if (!this._server) {
34
+ const xansql = this.xansql;
35
+ const config = xansql.config;
36
+ const fetchConfig = this.fetchConfig;
37
+ const secret = await this.makeSecret();
38
+ serverModule = serverModule || (await import('securequ/server')).default;
39
+ const url = new URL(fetchConfig.url);
40
+ this._server = new serverModule({
41
+ mode: fetchConfig.mode,
42
+ basepath: `/${url.pathname.replace(/^\/+/, '')}`,
43
+ file: config.file,
44
+ clients: [
45
+ {
46
+ origin: `*`,
47
+ secret
48
+ }
49
+ ]
50
+ });
51
+ }
52
+ return this._server;
53
+ }
54
+ async execute(sql, executeId) {
55
+ const client = await this.client();
56
+ const meta = ExecuteMeta.get(executeId);
57
+ const data = {
58
+ sql,
59
+ table: meta.model.table,
60
+ action: meta.action,
61
+ modelType: meta.modelType,
62
+ args: meta.args
63
+ };
64
+ if (meta.action === "SELECT" || meta.action === "AGGREGATE") {
65
+ let res = await client.get(await this.makePath('find'), { params: data });
66
+ !res.success && console.error(res);
67
+ return res.data || null;
68
+ }
69
+ else if (meta.action === "INSERT") {
70
+ let res = await client.post(await this.makePath('insert'), { body: data });
71
+ !res.success && console.error(res);
72
+ return res.data || null;
73
+ }
74
+ else if (meta.action === "UPDATE") {
75
+ let res = await client.put(await this.makePath('update'), { body: data });
76
+ !res.success && console.error(res);
77
+ return res.data || null;
78
+ }
79
+ else if (meta.action === "DELETE") {
80
+ let res = await client.delete(await this.makePath('delete'), { params: data });
81
+ !res.success && console.error(res);
82
+ return res.data || null;
83
+ }
84
+ else {
85
+ let res = await client.post(await this.makePath('executer'), { body: data });
86
+ !res.success && console.error(res);
87
+ return res.data || null;
88
+ }
89
+ }
90
+ async getSchema() {
91
+ const client = await this.client();
92
+ const res = await client.get(await this.makePath('raw_schema'));
93
+ if (!res.success) {
94
+ throw new XansqlError({
95
+ message: `Failed to fetch schema: ${res.message || 'Unknown error'}`
96
+ });
97
+ }
98
+ return res.data;
99
+ }
100
+ async onFetch(url, info) {
101
+ const xansql = this.xansql;
102
+ const config = xansql.config;
103
+ if (typeof window !== "undefined")
104
+ throw new XansqlError({
105
+ message: `XansqlFetch.onFetch cannot be called in browser environment.`,
106
+ });
107
+ const hasUrl = typeof config.fetch === "string" || typeof config.fetch.url === "string";
108
+ if (!config.fetch || !hasUrl)
109
+ throw new XansqlError({
110
+ message: `Xansql fetch configuration is not provided.`,
111
+ });
112
+ let server = await this.server();
113
+ if (!this.loaded) {
114
+ this.loaded = true;
115
+ server.get(await this.makePath('find'), async (req) => {
116
+ const params = req.searchParams;
117
+ if (info.isAuthorized) {
118
+ const isPermit = await info.isAuthorized({
119
+ method: "GET",
120
+ model: xansql.models.get(params.table),
121
+ action: params.action,
122
+ modelType: params.modelType,
123
+ args: params.args
124
+ });
125
+ if (!isPermit)
126
+ throw new XansqlError({
127
+ message: "isAuthorized denied for fetch request.",
128
+ model: params.table,
129
+ });
130
+ }
131
+ throw await xansql.execute(params.sql);
132
+ });
133
+ server.post(await this.makePath('insert'), async (req) => {
134
+ const params = req.body;
135
+ if (info.isAuthorized) {
136
+ const isPermit = await info.isAuthorized({
137
+ method: "POST",
138
+ model: xansql.models.get(params.table),
139
+ action: params.action,
140
+ modelType: params.modelType,
141
+ args: params.args,
142
+ });
143
+ if (!isPermit)
144
+ throw new XansqlError({
145
+ message: "isAuthorized denied for fetch request.",
146
+ model: params.table,
147
+ });
148
+ }
149
+ throw await xansql.execute(params.sql);
150
+ });
151
+ server.put(await this.makePath('update'), async (req) => {
152
+ const params = req.body;
153
+ if (info.isAuthorized) {
154
+ const isPermit = await info.isAuthorized({
155
+ method: "PUT",
156
+ model: xansql.models.get(params.table),
157
+ action: params.action,
158
+ modelType: params.modelType,
159
+ args: params.args,
160
+ });
161
+ if (!isPermit)
162
+ throw new XansqlError({
163
+ message: "isAuthorized denied for fetch request.",
164
+ model: params.table,
165
+ });
166
+ }
167
+ throw await xansql.execute(params.sql);
168
+ });
169
+ server.delete(await this.makePath('delete'), async (req) => {
170
+ const params = req.searchParams;
171
+ if (info.isAuthorized) {
172
+ const isPermit = await info.isAuthorized({
173
+ method: "DELETE",
174
+ model: xansql.models.get(params.table),
175
+ action: params.action,
176
+ modelType: params.modelType,
177
+ args: params.args,
178
+ });
179
+ if (!isPermit)
180
+ throw new XansqlError({
181
+ message: "isAuthorized denied for fetch request.",
182
+ model: params.table,
183
+ });
184
+ }
185
+ throw await xansql.execute(params.sql);
186
+ });
187
+ server.post(await this.makePath('executer'), async (req) => {
188
+ const params = req.body;
189
+ if (info.isAuthorized) {
190
+ const isPermit = await info.isAuthorized({
191
+ method: "POST",
192
+ model: xansql.models.get(params.table),
193
+ action: params.action,
194
+ modelType: params.modelType,
195
+ args: params.args,
196
+ });
197
+ if (!isPermit)
198
+ throw new XansqlError({
199
+ message: "isAuthorized denied for fetch request.",
200
+ model: params.table,
201
+ });
202
+ }
203
+ throw await xansql.execute(params.sql);
204
+ });
205
+ server.get(await this.makePath('raw_schema'), async (req) => {
206
+ if (info.isAuthorized) {
207
+ const isPermit = await info.isAuthorized({
208
+ method: "GET",
209
+ action: "getSchema",
210
+ model: null,
211
+ modelType: "main",
212
+ args: {},
213
+ });
214
+ if (!isPermit)
215
+ throw new XansqlError({
216
+ message: "isAuthorized denied for fetch request.",
217
+ });
218
+ }
219
+ throw await xansql.dialect.getSchema();
220
+ });
221
+ }
222
+ try {
223
+ const res = await server.listen(url, {
224
+ body: info.body,
225
+ headers: info.headers,
226
+ });
227
+ return {
228
+ status: res.status,
229
+ body: res.content,
230
+ };
231
+ }
232
+ catch (error) {
233
+ const secret = await this.makeSecret();
234
+ return {
235
+ status: 500,
236
+ body: await crypto.encryptBuffer({
237
+ success: false,
238
+ message: error.message || 'Internal Server Error'
239
+ }, secret)
240
+ };
241
+ }
242
+ }
243
+ async uploadFile(file, executeId) {
244
+ const xansql = this.xansql;
245
+ if (!xansql.config.file || !xansql.config.file.upload) {
246
+ throw new XansqlError("Xansql file upload configuration is not provided.");
247
+ }
248
+ if (typeof window !== "undefined" && !xansql.config.fetch) {
249
+ throw new XansqlError("Xansql fetch configuration is required in client side.");
250
+ }
251
+ if (typeof window !== "undefined") {
252
+ const client = await this.client();
253
+ const res = await client.uploadFile(file);
254
+ ExecuteMeta.delete(executeId);
255
+ return res.data;
256
+ }
257
+ else {
258
+ const server = await this.server();
259
+ return await server.uploadFile(file);
260
+ }
261
+ }
262
+ async deleteFile(fileId, executeId) {
263
+ const xansql = this.xansql;
264
+ if (!xansql.config.file || !xansql.config.file.delete) {
265
+ throw new XansqlError("Xansql file delete configuration is not provided.");
266
+ }
267
+ if (typeof window !== "undefined" && !xansql.config.fetch) {
268
+ throw new XansqlError("Xansql fetch configuration is required in client side.");
269
+ }
270
+ if (typeof window !== "undefined") {
271
+ const client = await this.client();
272
+ const res = await client.deleteFile(fileId);
273
+ ExecuteMeta.delete(executeId);
274
+ return res;
275
+ }
276
+ else {
277
+ const server = await this.server();
278
+ const res = await server.deleteFile(fileId);
279
+ return res;
280
+ }
281
+ }
282
+ async makeSecret() {
283
+ if (this.secretCache)
284
+ return this.secretCache;
285
+ const models = this.xansql.models;
286
+ let uid = '';
287
+ for (let model of models.values()) {
288
+ uid += model.table;
289
+ for (let column in model.schema) {
290
+ uid += column;
291
+ const field = model.schema[column];
292
+ const meta = field.meta || {};
293
+ uid += JSON.stringify(meta);
294
+ }
295
+ }
296
+ this.secretCache = await crypto.hash(uid);
297
+ return this.secretCache;
298
+ }
299
+ async makePath(path) {
300
+ const secret = await this.makeSecret();
301
+ const gen = `/${await crypto.hash(path + secret)}`;
302
+ return gen;
303
+ }
304
+ }export{XansqlFetch as default};//# sourceMappingURL=XansqlFetch.mjs.map