breeze-client 2.2.2 → 3.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 (299) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +83 -63
  3. package/adapters/abstract-data-service-adapter.d.ts +120 -0
  4. package/adapters/abstract-data-service-adapter.js +395 -0
  5. package/adapters/abstract-data-service-adapter.js.map +1 -0
  6. package/adapters/adapter-ajax-fetch.d.ts +12 -0
  7. package/adapters/adapter-ajax-fetch.js +13 -0
  8. package/adapters/adapter-ajax-fetch.js.map +1 -0
  9. package/{adapter-ajax-post → adapters}/adapter-ajax-post.d.ts +40 -36
  10. package/{fesm2022/breeze-client-adapter-ajax-post.mjs → adapters/adapter-ajax-post.js} +80 -82
  11. package/adapters/adapter-ajax-post.js.map +1 -0
  12. package/{adapter-ajax-fetch → adapters}/adapter-core.d.ts +4 -4
  13. package/{fesm2022/breeze-client-adapter-uri-builder-json.mjs → adapters/adapter-core.js} +48 -91
  14. package/adapters/adapter-core.js.map +1 -0
  15. package/adapters/adapter-data-service-webapi.d.ts +9 -0
  16. package/{fesm2022/breeze-client-adapter-data-service-webapi.mjs → adapters/adapter-data-service-webapi.js} +105 -107
  17. package/adapters/adapter-data-service-webapi.js.map +1 -0
  18. package/adapters/adapter-model-library-backing-store.d.ts +32 -0
  19. package/adapters/adapter-model-library-backing-store.js +321 -0
  20. package/adapters/adapter-model-library-backing-store.js.map +1 -0
  21. package/adapters/adapter-uri-builder-json.d.ts +11 -0
  22. package/adapters/adapter-uri-builder-json.js +40 -0
  23. package/adapters/adapter-uri-builder-json.js.map +1 -0
  24. package/adapters/http.d.ts +52 -0
  25. package/adapters/http.js +202 -0
  26. package/adapters/http.js.map +1 -0
  27. package/angular/adapter-angular-httpclient.d.ts +21 -0
  28. package/angular/adapter-angular-httpclient.js +70 -0
  29. package/angular/adapter-angular-httpclient.js.map +1 -0
  30. package/breeze.d.ts +215 -0
  31. package/breeze.js +141 -0
  32. package/breeze.js.map +1 -0
  33. package/config/config.d.ts +212 -0
  34. package/config/config.js +392 -0
  35. package/config/config.js.map +1 -0
  36. package/config/configure.d.ts +66 -0
  37. package/config/configure.js +46 -0
  38. package/config/configure.js.map +1 -0
  39. package/config/default-adapters.d.ts +1 -0
  40. package/config/default-adapters.js +40 -0
  41. package/config/default-adapters.js.map +1 -0
  42. package/config/interface-registry.d.ts +191 -0
  43. package/config/interface-registry.js +5 -0
  44. package/config/interface-registry.js.map +1 -0
  45. package/{src → core}/assert-param.d.ts +52 -60
  46. package/core/assert-param.js +390 -0
  47. package/core/assert-param.js.map +1 -0
  48. package/core/core.d.ts +285 -0
  49. package/core/core.js +772 -0
  50. package/core/core.js.map +1 -0
  51. package/core/enum.d.ts +116 -0
  52. package/core/enum.js +167 -0
  53. package/core/enum.js.map +1 -0
  54. package/core/event.d.ts +169 -0
  55. package/core/event.js +338 -0
  56. package/core/event.js.map +1 -0
  57. package/entity/array.d.ts +3 -0
  58. package/entity/array.js +4 -0
  59. package/entity/array.js.map +1 -0
  60. package/entity/complex-array.d.ts +17 -0
  61. package/entity/complex-array.js +104 -0
  62. package/entity/complex-array.js.map +1 -0
  63. package/entity/default-property-interceptor.d.ts +1 -0
  64. package/entity/default-property-interceptor.js +496 -0
  65. package/entity/default-property-interceptor.js.map +1 -0
  66. package/{src → entity}/entity-action.d.ts +36 -42
  67. package/entity/entity-action.js +45 -0
  68. package/entity/entity-action.js.map +1 -0
  69. package/entity/entity-aspect.d.ts +457 -0
  70. package/entity/entity-aspect.js +1262 -0
  71. package/entity/entity-aspect.js.map +1 -0
  72. package/entity/entity-base.d.ts +55 -0
  73. package/entity/entity-base.js +41 -0
  74. package/entity/entity-base.js.map +1 -0
  75. package/entity/entity-group.d.ts +1 -0
  76. package/entity/entity-group.js +224 -0
  77. package/entity/entity-group.js.map +1 -0
  78. package/entity/entity-key.d.ts +95 -0
  79. package/entity/entity-key.js +189 -0
  80. package/entity/entity-key.js.map +1 -0
  81. package/{src → entity}/entity-state.d.ts +112 -84
  82. package/entity/entity-state.js +135 -0
  83. package/entity/entity-state.js.map +1 -0
  84. package/entity/key-generator.d.ts +57 -0
  85. package/entity/key-generator.js +155 -0
  86. package/entity/key-generator.js.map +1 -0
  87. package/entity/observable-array.d.ts +25 -0
  88. package/entity/observable-array.js +230 -0
  89. package/entity/observable-array.js.map +1 -0
  90. package/entity/primitive-array.d.ts +12 -0
  91. package/entity/primitive-array.js +71 -0
  92. package/entity/primitive-array.js.map +1 -0
  93. package/entity/relation-array.d.ts +24 -0
  94. package/entity/relation-array.js +176 -0
  95. package/entity/relation-array.js.map +1 -0
  96. package/entity/unattached-children-map.d.ts +1 -0
  97. package/entity/unattached-children-map.js +105 -0
  98. package/entity/unattached-children-map.js.map +1 -0
  99. package/generate-entity-classes.js +1176 -0
  100. package/manager/entity-manager.d.ts +801 -0
  101. package/manager/entity-manager.js +2395 -0
  102. package/manager/entity-manager.js.map +1 -0
  103. package/{src → manager}/save-options.d.ts +48 -42
  104. package/manager/save-options.js +51 -0
  105. package/manager/save-options.js.map +1 -0
  106. package/{src → metadata}/data-service.d.ts +229 -184
  107. package/metadata/data-service.js +246 -0
  108. package/metadata/data-service.js.map +1 -0
  109. package/metadata/data-type.d.ts +122 -0
  110. package/metadata/data-type.js +465 -0
  111. package/metadata/data-type.js.map +1 -0
  112. package/metadata/entity-metadata.d.ts +1193 -0
  113. package/metadata/entity-metadata.js +2502 -0
  114. package/metadata/entity-metadata.js.map +1 -0
  115. package/{src → metadata}/local-query-comparison-options.d.ts +65 -59
  116. package/metadata/local-query-comparison-options.js +69 -0
  117. package/metadata/local-query-comparison-options.js.map +1 -0
  118. package/{src → metadata}/naming-convention.d.ts +75 -72
  119. package/metadata/naming-convention.js +97 -0
  120. package/metadata/naming-convention.js.map +1 -0
  121. package/mixins/mixin-get-entity-graph.d.ts +63 -0
  122. package/{fesm2022/breeze-client-mixin-get-entity-graph.mjs → mixins/mixin-get-entity-graph.js} +331 -253
  123. package/mixins/mixin-get-entity-graph.js.map +1 -0
  124. package/mixins/mixin-save-queuing.d.ts +98 -0
  125. package/{fesm2022/breeze-client-mixin-save-queuing.mjs → mixins/mixin-save-queuing.js} +493 -365
  126. package/mixins/mixin-save-queuing.js.map +1 -0
  127. package/package.json +63 -94
  128. package/query/entity-query.d.ts +521 -0
  129. package/query/entity-query.js +1149 -0
  130. package/query/entity-query.js.map +1 -0
  131. package/{src → query}/mapping-context.d.ts +44 -46
  132. package/query/mapping-context.js +412 -0
  133. package/query/mapping-context.js.map +1 -0
  134. package/query/predicate.d.ts +394 -0
  135. package/query/predicate.js +1294 -0
  136. package/query/predicate.js.map +1 -0
  137. package/query/property-path.d.ts +252 -0
  138. package/query/property-path.js +2 -0
  139. package/query/property-path.js.map +1 -0
  140. package/{src → query}/query-options.d.ts +143 -119
  141. package/query/query-options.js +180 -0
  142. package/query/query-options.js.map +1 -0
  143. package/rxjs/breeze-rxjs.d.ts +72 -0
  144. package/rxjs/breeze-rxjs.js +117 -0
  145. package/rxjs/breeze-rxjs.js.map +1 -0
  146. package/validation/validate.d.ts +583 -0
  147. package/validation/validate.js +961 -0
  148. package/validation/validate.js.map +1 -0
  149. package/{src → validation}/validation-options.d.ts +67 -63
  150. package/validation/validation-options.js +70 -0
  151. package/validation/validation-options.js.map +1 -0
  152. package/adapter-ajax-angularjs/adapter-ajax-angularjs.d.ts +0 -17
  153. package/adapter-ajax-angularjs/adapter-core.d.ts +0 -4
  154. package/adapter-ajax-angularjs/index.d.ts +0 -5
  155. package/adapter-ajax-fetch/adapter-ajax-fetch.d.ts +0 -18
  156. package/adapter-ajax-fetch/index.d.ts +0 -5
  157. package/adapter-ajax-httpclient/adapter-ajax-httpclient.d.ts +0 -13
  158. package/adapter-ajax-httpclient/adapter-core.d.ts +0 -4
  159. package/adapter-ajax-httpclient/index.d.ts +0 -5
  160. package/adapter-ajax-jquery/adapter-ajax-jquery.d.ts +0 -15
  161. package/adapter-ajax-jquery/index.d.ts +0 -5
  162. package/adapter-ajax-post/index.d.ts +0 -5
  163. package/adapter-data-service-odata/adapter-core.d.ts +0 -4
  164. package/adapter-data-service-odata/adapter-data-service-odata.d.ts +0 -17
  165. package/adapter-data-service-odata/index.d.ts +0 -5
  166. package/adapter-data-service-webapi/adapter-data-service-webapi.d.ts +0 -15
  167. package/adapter-data-service-webapi/index.d.ts +0 -5
  168. package/adapter-model-library-backing-store/adapter-model-library-backing-store.d.ts +0 -10
  169. package/adapter-model-library-backing-store/index.d.ts +0 -5
  170. package/adapter-model-library-ko/adapter-model-library-ko.d.ts +0 -10
  171. package/adapter-model-library-ko/index.d.ts +0 -5
  172. package/adapter-uri-builder-json/adapter-core.d.ts +0 -4
  173. package/adapter-uri-builder-json/adapter-uri-builder-json.d.ts +0 -8
  174. package/adapter-uri-builder-json/index.d.ts +0 -5
  175. package/adapter-uri-builder-odata/adapter-core.d.ts +0 -4
  176. package/adapter-uri-builder-odata/adapter-uri-builder-odata.d.ts +0 -8
  177. package/adapter-uri-builder-odata/index.d.ts +0 -5
  178. package/esm2022/adapter-ajax-angularjs/adapter-ajax-angularjs.mjs +0 -135
  179. package/esm2022/adapter-ajax-angularjs/adapter-core.mjs +0 -49
  180. package/esm2022/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.mjs +0 -5
  181. package/esm2022/adapter-ajax-fetch/adapter-ajax-fetch.mjs +0 -135
  182. package/esm2022/adapter-ajax-fetch/adapter-core.mjs +0 -49
  183. package/esm2022/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.mjs +0 -5
  184. package/esm2022/adapter-ajax-httpclient/adapter-ajax-httpclient.mjs +0 -139
  185. package/esm2022/adapter-ajax-httpclient/adapter-core.mjs +0 -49
  186. package/esm2022/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.mjs +0 -5
  187. package/esm2022/adapter-ajax-jquery/adapter-ajax-jquery.mjs +0 -107
  188. package/esm2022/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.mjs +0 -5
  189. package/esm2022/adapter-ajax-post/adapter-ajax-post.mjs +0 -77
  190. package/esm2022/adapter-ajax-post/breeze-client-adapter-ajax-post.mjs +0 -5
  191. package/esm2022/adapter-data-service-odata/adapter-core.mjs +0 -49
  192. package/esm2022/adapter-data-service-odata/adapter-data-service-odata.mjs +0 -461
  193. package/esm2022/adapter-data-service-odata/breeze-client-adapter-data-service-odata.mjs +0 -5
  194. package/esm2022/adapter-data-service-webapi/adapter-data-service-webapi.mjs +0 -100
  195. package/esm2022/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.mjs +0 -5
  196. package/esm2022/adapter-model-library-backing-store/adapter-model-library-backing-store.mjs +0 -269
  197. package/esm2022/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.mjs +0 -5
  198. package/esm2022/adapter-model-library-ko/adapter-model-library-ko.mjs +0 -241
  199. package/esm2022/adapter-model-library-ko/breeze-client-adapter-model-library-ko.mjs +0 -5
  200. package/esm2022/adapter-uri-builder-json/adapter-core.mjs +0 -49
  201. package/esm2022/adapter-uri-builder-json/adapter-uri-builder-json.mjs +0 -37
  202. package/esm2022/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.mjs +0 -5
  203. package/esm2022/adapter-uri-builder-odata/adapter-core.mjs +0 -49
  204. package/esm2022/adapter-uri-builder-odata/adapter-uri-builder-odata.mjs +0 -191
  205. package/esm2022/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.mjs +0 -5
  206. package/esm2022/breeze-client.mjs +0 -5
  207. package/esm2022/index.mjs +0 -2
  208. package/esm2022/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.mjs +0 -5
  209. package/esm2022/mixin-get-entity-graph/mixin-get-entity-graph.mjs +0 -269
  210. package/esm2022/mixin-save-queuing/breeze-client-mixin-save-queuing.mjs +0 -5
  211. package/esm2022/mixin-save-queuing/mixin-save-queuing.mjs +0 -421
  212. package/esm2022/src/abstract-data-service-adapter.mjs +0 -325
  213. package/esm2022/src/array.mjs +0 -4
  214. package/esm2022/src/assert-param.mjs +0 -330
  215. package/esm2022/src/breeze.mjs +0 -85
  216. package/esm2022/src/complex-array.mjs +0 -117
  217. package/esm2022/src/config.mjs +0 -232
  218. package/esm2022/src/core.mjs +0 -712
  219. package/esm2022/src/csdl-metadata-parser.mjs +0 -385
  220. package/esm2022/src/data-service.mjs +0 -221
  221. package/esm2022/src/data-type.mjs +0 -510
  222. package/esm2022/src/default-property-interceptor.mjs +0 -460
  223. package/esm2022/src/entity-action.mjs +0 -45
  224. package/esm2022/src/entity-aspect.mjs +0 -897
  225. package/esm2022/src/entity-group.mjs +0 -192
  226. package/esm2022/src/entity-key.mjs +0 -125
  227. package/esm2022/src/entity-manager.mjs +0 -2163
  228. package/esm2022/src/entity-metadata.mjs +0 -2242
  229. package/esm2022/src/entity-query.mjs +0 -1024
  230. package/esm2022/src/entity-state.mjs +0 -107
  231. package/esm2022/src/enum.mjs +0 -143
  232. package/esm2022/src/event.mjs +0 -264
  233. package/esm2022/src/interface-registry.mjs +0 -39
  234. package/esm2022/src/key-generator.mjs +0 -110
  235. package/esm2022/src/local-query-comparison-options.mjs +0 -65
  236. package/esm2022/src/mapping-context.mjs +0 -411
  237. package/esm2022/src/naming-convention.mjs +0 -92
  238. package/esm2022/src/observable-array.mjs +0 -183
  239. package/esm2022/src/predicate.mjs +0 -1259
  240. package/esm2022/src/primitive-array.mjs +0 -85
  241. package/esm2022/src/query-options.mjs +0 -152
  242. package/esm2022/src/relation-array.mjs +0 -173
  243. package/esm2022/src/save-options.mjs +0 -41
  244. package/esm2022/src/unattached-children-map.mjs +0 -56
  245. package/esm2022/src/validate.mjs +0 -995
  246. package/esm2022/src/validation-options.mjs +0 -64
  247. package/fesm2022/breeze-client-adapter-ajax-angularjs.mjs +0 -190
  248. package/fesm2022/breeze-client-adapter-ajax-angularjs.mjs.map +0 -1
  249. package/fesm2022/breeze-client-adapter-ajax-fetch.mjs +0 -190
  250. package/fesm2022/breeze-client-adapter-ajax-fetch.mjs.map +0 -1
  251. package/fesm2022/breeze-client-adapter-ajax-httpclient.mjs +0 -194
  252. package/fesm2022/breeze-client-adapter-ajax-httpclient.mjs.map +0 -1
  253. package/fesm2022/breeze-client-adapter-ajax-jquery.mjs +0 -114
  254. package/fesm2022/breeze-client-adapter-ajax-jquery.mjs.map +0 -1
  255. package/fesm2022/breeze-client-adapter-ajax-post.mjs.map +0 -1
  256. package/fesm2022/breeze-client-adapter-data-service-odata.mjs +0 -516
  257. package/fesm2022/breeze-client-adapter-data-service-odata.mjs.map +0 -1
  258. package/fesm2022/breeze-client-adapter-data-service-webapi.mjs.map +0 -1
  259. package/fesm2022/breeze-client-adapter-model-library-backing-store.mjs +0 -276
  260. package/fesm2022/breeze-client-adapter-model-library-backing-store.mjs.map +0 -1
  261. package/fesm2022/breeze-client-adapter-model-library-ko.mjs +0 -248
  262. package/fesm2022/breeze-client-adapter-model-library-ko.mjs.map +0 -1
  263. package/fesm2022/breeze-client-adapter-uri-builder-json.mjs.map +0 -1
  264. package/fesm2022/breeze-client-adapter-uri-builder-odata.mjs +0 -246
  265. package/fesm2022/breeze-client-adapter-uri-builder-odata.mjs.map +0 -1
  266. package/fesm2022/breeze-client-mixin-get-entity-graph.mjs.map +0 -1
  267. package/fesm2022/breeze-client-mixin-save-queuing.mjs.map +0 -1
  268. package/fesm2022/breeze-client.mjs +0 -14144
  269. package/fesm2022/breeze-client.mjs.map +0 -1
  270. package/index.d.ts +0 -1
  271. package/mixin-get-entity-graph/index.d.ts +0 -5
  272. package/mixin-get-entity-graph/mixin-get-entity-graph.d.ts +0 -31
  273. package/mixin-save-queuing/index.d.ts +0 -5
  274. package/mixin-save-queuing/mixin-save-queuing.d.ts +0 -32
  275. package/src/abstract-data-service-adapter.d.ts +0 -84
  276. package/src/array.d.ts +0 -3
  277. package/src/breeze.d.ts +0 -139
  278. package/src/complex-array.d.ts +0 -13
  279. package/src/config.d.ts +0 -104
  280. package/src/core.d.ts +0 -164
  281. package/src/csdl-metadata-parser.d.ts +0 -7
  282. package/src/data-type.d.ts +0 -89
  283. package/src/default-property-interceptor.d.ts +0 -4
  284. package/src/entity-aspect.d.ts +0 -332
  285. package/src/entity-group.d.ts +0 -28
  286. package/src/entity-key.d.ts +0 -77
  287. package/src/entity-manager.d.ts +0 -680
  288. package/src/entity-metadata.d.ts +0 -988
  289. package/src/entity-query.d.ts +0 -444
  290. package/src/enum.d.ts +0 -100
  291. package/src/event.d.ts +0 -142
  292. package/src/interface-registry.d.ts +0 -150
  293. package/src/key-generator.d.ts +0 -12
  294. package/src/observable-array.d.ts +0 -52
  295. package/src/predicate.d.ts +0 -376
  296. package/src/primitive-array.d.ts +0 -7
  297. package/src/relation-array.d.ts +0 -18
  298. package/src/unattached-children-map.d.ts +0 -19
  299. package/src/validate.d.ts +0 -650
@@ -0,0 +1,395 @@
1
+ import { core } from '../core/core.js';
2
+ import { config } from '../config/config.js';
3
+ import { builtinAjax } from './http.js';
4
+ import { JsonResultsAdapter } from '../metadata/data-service.js';
5
+ import { EntityType, MetadataStore } from '../metadata/entity-metadata.js';
6
+ /** For use by breeze plugin authors only. The class is used as the base class for most {@link DataServiceAdapter} implementations
7
+ @adapter (see {@link DataServiceAdapter})
8
+ @hidden
9
+ */
10
+ export class AbstractDataServiceAdapter {
11
+ // TODO use interface
12
+ checkForRecomposition(interfaceInitializedArgs) {
13
+ if (interfaceInitializedArgs.interfaceName === "ajax" && interfaceInitializedArgs.isDefault) {
14
+ this.initialize();
15
+ }
16
+ }
17
+ initialize() {
18
+ // An ajax adapter is optional. A registered one (deprecated) is used if there is one;
19
+ // otherwise requests go through config.fetch, which defaults to globalThis.fetch. This
20
+ // is also why registration order no longer matters: there is nothing to resolve.
21
+ this.ajaxImpl = config.getAdapterInstance("ajax") || builtinAjax;
22
+ }
23
+ /**
24
+ * Sends one request. Resolves with the response, or rejects with a `ServerError`.
25
+ *
26
+ * Subclasses should make their requests through this method rather than through
27
+ * `ajaxImpl`, whose callback-shaped contract is kept only for compatibility. This is the
28
+ * only place in the class that deals in success/error callbacks.
29
+ */
30
+ _ajax(config, errorMessagePrefix, prepareResponse) {
31
+ return new Promise((resolve, reject) => {
32
+ this.ajaxImpl.ajax({
33
+ ...config,
34
+ // Each callback is guarded: a throw inside one would otherwise escape into the ajax
35
+ // adapter and leave this promise pending for ever.
36
+ success: (httpResponse) => {
37
+ try {
38
+ prepareResponse && prepareResponse(httpResponse);
39
+ resolve(httpResponse);
40
+ }
41
+ catch (e) {
42
+ reject(e);
43
+ }
44
+ },
45
+ error: (httpResponse) => {
46
+ try {
47
+ // must run before makeHttpError: createError reads httpResponse.saveContext
48
+ // to attach per-entity validation errors.
49
+ prepareResponse && prepareResponse(httpResponse);
50
+ reject(AbstractDataServiceAdapter.makeHttpError(httpResponse, errorMessagePrefix));
51
+ }
52
+ catch (e) {
53
+ reject(e);
54
+ }
55
+ },
56
+ });
57
+ });
58
+ }
59
+ async fetchMetadata(metadataStore, dataService) {
60
+ const serviceName = dataService.serviceName;
61
+ const url = dataService.qualifyUrl("Metadata");
62
+ const httpResponse = await this._ajax({ type: "GET", url: url, dataType: 'json' }, "Metadata query failed for: " + url);
63
+ // might have been fetched by another query
64
+ if (metadataStore.hasMetadataFor(serviceName)) {
65
+ return "already fetched";
66
+ }
67
+ const data = httpResponse.data;
68
+ let metadata;
69
+ try {
70
+ metadata = typeof (data) === "string" ? JSON.parse(data) : data;
71
+ metadataStore.importMetadata(metadata);
72
+ }
73
+ catch (e) {
74
+ const errMsg = "Unable to either parse or import metadata: " + e.message;
75
+ throw AbstractDataServiceAdapter.makeHttpError(httpResponse, "Metadata query failed for: " + url + ". " + errMsg);
76
+ }
77
+ // import may have brought in the service.
78
+ if (!metadataStore.hasMetadataFor(serviceName)) {
79
+ metadataStore.addDataService(dataService);
80
+ }
81
+ return metadata;
82
+ }
83
+ /** Execute the query in the mappingContext. */
84
+ async executeQuery(mappingContext) {
85
+ mappingContext.adapter = this;
86
+ const usePost = mappingContext.query.usePostEnabled;
87
+ const params = usePost ? this._makeQueryPostParams(mappingContext) : this._makeQueryGetParams(mappingContext);
88
+ const httpResponse = await this._ajax(params);
89
+ const data = httpResponse.data;
90
+ try {
91
+ const results = data && (data.results || data.Results);
92
+ if (results) {
93
+ return {
94
+ results: results,
95
+ inlineCount: data.inlineCount || data.InlineCount,
96
+ httpResponse: httpResponse,
97
+ query: mappingContext.query
98
+ };
99
+ }
100
+ return { results: data, httpResponse: httpResponse, query: mappingContext.query };
101
+ }
102
+ catch (e) {
103
+ if (e instanceof Error) {
104
+ throw e;
105
+ }
106
+ throw AbstractDataServiceAdapter.makeHttpError(httpResponse);
107
+ }
108
+ }
109
+ /** Set up ajax parameters for query GET. This puts the query into the request querystring, in whatever syntax the UriBuilder produces. */
110
+ _makeQueryGetParams(mappingContext) {
111
+ const url = mappingContext.getUrl();
112
+ const params = {
113
+ type: "GET",
114
+ url: url,
115
+ params: mappingContext.query.parameters,
116
+ dataType: 'json',
117
+ crossDomain: false,
118
+ };
119
+ // useJsonp is deprecated. Breeze's own transport ignores dataType and crossDomain; this
120
+ // stays only because a registered (deprecated) ajax adapter could still act on them.
121
+ if (mappingContext.dataService.useJsonp) {
122
+ params.dataType = 'jsonp';
123
+ params.crossDomain = true;
124
+ }
125
+ return params;
126
+ }
127
+ /** Set up ajax parameters for query POST. This put the query into the request body as JSON. */
128
+ _makeQueryPostParams(mappingContext) {
129
+ const entityQuery = mappingContext.query;
130
+ const metadataStore = mappingContext.entityManager.metadataStore;
131
+ const url = mappingContext.dataService.qualifyUrl(entityQuery.resourceName);
132
+ let entityType = entityQuery._getFromEntityType(metadataStore, false);
133
+ if (!entityType) {
134
+ entityType = new EntityType(metadataStore);
135
+ }
136
+ const json = entityQuery.toJSONExt({ entityType: entityType, toNameOnServer: true });
137
+ json.from = undefined;
138
+ json.queryOptions = undefined;
139
+ // withParameters values go in the query string (params, below), as for a GET.
140
+ json.parameters = undefined;
141
+ const params = {
142
+ type: "POST",
143
+ url: url,
144
+ params: mappingContext.query.parameters,
145
+ dataType: 'json',
146
+ processData: false, // don't form-encode the body
147
+ contentType: "application/json; charset=UTF-8",
148
+ data: JSON.stringify(json),
149
+ crossDomain: false,
150
+ };
151
+ return params;
152
+ }
153
+ async saveChanges(saveContext, saveBundle) {
154
+ let adapter = saveContext.adapter = this;
155
+ let saveBundleSer = adapter._prepareSaveBundle(saveContext, saveBundle);
156
+ let bundle = JSON.stringify(saveBundleSer);
157
+ const url = saveContext.dataService.qualifyUrl(saveContext.resourceName);
158
+ // saveContext must be on the response before any error is built from it
159
+ const httpResponse = await this._ajax({
160
+ type: "POST",
161
+ url: url,
162
+ dataType: 'json',
163
+ contentType: "application/json",
164
+ data: bundle,
165
+ }, undefined, (r) => { r.saveContext = saveContext; });
166
+ const data = httpResponse.data;
167
+ if (data == null || data === "") {
168
+ const err = AbstractDataServiceAdapter.makeHttpError(httpResponse);
169
+ err.message = "The response to the save request to " + url + " (HTTP status " + httpResponse.status +
170
+ ") had no body. Breeze needs the saved entities and any key mappings to complete the save.";
171
+ throw err;
172
+ }
173
+ if (data.Errors || data.errors) {
174
+ throw AbstractDataServiceAdapter.makeHttpError(httpResponse);
175
+ }
176
+ const saveResult = adapter._prepareSaveResult(saveContext, data);
177
+ saveResult.httpResponse = httpResponse;
178
+ return saveResult;
179
+ }
180
+ /** Abstract method that needs to be overwritten in any concrete DataServiceAdapter subclass.
181
+ The return value from this method should be a serializable object that will be sent to the server after calling JSON.stringify on it.
182
+ */
183
+ _prepareSaveBundle(saveContext, saveBundle) {
184
+ // The implementor should call _createChangeRequestInterceptor
185
+ throw new Error("Need a concrete implementation of _prepareSaveBundle");
186
+ }
187
+ /**
188
+ Returns a constructor function for a "ChangeRequestInterceptor"
189
+ that can tweak the saveBundle both as it is built and when it is completed
190
+ by a concrete DataServiceAdapater.
191
+
192
+ Initialized with a default, no-op implementation that developers can replace with a
193
+ substantive implementation that changes the individual entity change requests
194
+ or aspects of the entire 'saveBundle' without having to write their own DataService adapters.
195
+ ```ts
196
+ let adapter = breeze.config.getAdapterInstance('dataService');
197
+ adapter.changeRequestInterceptor = function (saveContext, saveBundle) {
198
+ this.getRequest = function (request, entity, index) {
199
+ // alter the request that the adapter prepared for this entity
200
+ // based on the entity, saveContext, and saveBundle
201
+ // e.g., add a custom header or prune the originalValuesMap
202
+ return request;
203
+ };
204
+ this.done = function (requests) {
205
+ // alter the array of requests representing the entire change-set
206
+ // based on the saveContext and saveBundle
207
+ };
208
+ }
209
+ ```
210
+
211
+ @param saveContext - The BreezeJS "context" for the save operation.
212
+ @param saveBundle - Contains the array of entities-to-be-saved (AKA, the entity change-set).
213
+ @returns Constructor for a "ChangeRequestInterceptor".
214
+ */
215
+ changeRequestInterceptor = DefaultChangeRequestInterceptor;
216
+ /**
217
+ * Creates the change request interceptor for one save, from `changeRequestInterceptor`.
218
+ * Call it at the start of `_prepareSaveBundle`, pass each entity's request through its
219
+ * `getRequest`, and pass the finished array to its `done`.
220
+ *
221
+ * Falls back to a no-op interceptor when `changeRequestInterceptor` is not set. If the
222
+ * interceptor it creates has `oneTime` set, the adapter goes back to the no-op
223
+ * interceptor afterwards, so only this save is intercepted.
224
+ * @throws if the interceptor has no `getRequest` or `done` method.
225
+ */
226
+ _createChangeRequestInterceptor(saveContext, saveBundle) {
227
+ let adapter = saveContext.adapter;
228
+ let cri = adapter.changeRequestInterceptor;
229
+ let isFn = core.isFunction;
230
+ if (isFn(cri)) {
231
+ let pre = adapter.name + " DataServiceAdapter's ChangeRequestInterceptor";
232
+ let post = " is missing or not a function.";
233
+ let interceptor = new cri(saveContext, saveBundle);
234
+ if (!isFn(interceptor.getRequest)) {
235
+ throw new Error(pre + '.getRequest' + post);
236
+ }
237
+ if (!isFn(interceptor.done)) {
238
+ throw new Error(pre + '.done' + post);
239
+ }
240
+ if (interceptor.oneTime) {
241
+ adapter.changeRequestInterceptor = DefaultChangeRequestInterceptor;
242
+ }
243
+ return interceptor;
244
+ }
245
+ else {
246
+ return new DefaultChangeRequestInterceptor(saveContext, saveBundle);
247
+ }
248
+ }
249
+ /** Abstract method that needs to be overwritten in any concrete DataServiceAdapter sublclass.
250
+ This method needs to take the result returned the server and convert it into an ISaveResult.
251
+ */
252
+ _prepareSaveResult(saveContext, data) {
253
+ throw new Error("Need a concrete implementation of _prepareSaveResult");
254
+ }
255
+ /** Utility method that may be used in any concrete DataServiceAdapter sublclass to handle any
256
+ http connection issues. For an error with status 0 - the request got no response - it says in
257
+ the message that the server could not be reached, keeping any message the transport gave.
258
+ An aborted request is left alone. `makeHttpError` already applies it.
259
+ */
260
+ // Put this at the bottom of your http error analysis
261
+ static _catchNoConnectionError(err) {
262
+ if (err.status !== 0)
263
+ return;
264
+ const cause = err.httpResponse && err.httpResponse.error;
265
+ if (cause && cause.name === "AbortError")
266
+ return; // the app cancelled it; the server is irrelevant
267
+ const hint = "Likely did not or could not reach server. Is the server running?";
268
+ if (err.message && err.message.includes(hint))
269
+ return; // already applied
270
+ err.message = err.message
271
+ ? "HTTP response status 0: " + err.message + ". " + hint
272
+ : "HTTP response status 0 and no message. " + hint;
273
+ }
274
+ /**
275
+ * Builds the Breeze error for a failed HTTP response: an `Error` carrying `status`,
276
+ * `statusText`, `url`, `body` and `httpResponse`, whose message comes from the response
277
+ * body (a .NET exception, or `{ message, errors }`). For a save, it also carries the
278
+ * server's per-entity `entityErrors`, if `httpResponse.saveContext` is set.
279
+ *
280
+ * `_ajax` uses it for every failed request. Call it when your adapter makes a request some
281
+ * other way, then throw or reject with the result.
282
+ * @param httpResponse - The failed response.
283
+ * @param messagePrefix - Put at the start of the message, followed by "; ".
284
+ */
285
+ static makeHttpError(httpResponse, messagePrefix) {
286
+ const err = createError(httpResponse);
287
+ AbstractDataServiceAdapter._catchNoConnectionError(err);
288
+ if (messagePrefix) {
289
+ err.message = messagePrefix + "; " + err.message;
290
+ }
291
+ return err;
292
+ }
293
+ jsonResultsAdapter = new JsonResultsAdapter({
294
+ name: "noop",
295
+ visitNode: function ( /* node, mappingContext, nodeContext */) {
296
+ return {};
297
+ }
298
+ });
299
+ }
300
+ function createError(httpResponse) {
301
+ let err = new Error();
302
+ err.httpResponse = httpResponse;
303
+ err.status = httpResponse.status;
304
+ err.statusText = httpResponse.statusText;
305
+ err.body = httpResponse.data;
306
+ err.url = httpResponse.config && httpResponse.config.url;
307
+ let errObj = httpResponse.data;
308
+ if (!errObj) {
309
+ err.message = httpResponse.error && httpResponse.error.toString();
310
+ return err;
311
+ }
312
+ // some ajax providers convert an errant result into an object, others do not
313
+ // if not do it here.
314
+ if (typeof errObj === "string") {
315
+ try {
316
+ errObj = JSON.parse(errObj);
317
+ }
318
+ catch (e) {
319
+ // sometimes httpResponse.data is just the error message itself
320
+ err.message = errObj;
321
+ return err;
322
+ }
323
+ }
324
+ // The RFC 9457 `type` member, taken before the branch below because it is spelled the same
325
+ // whichever shape the rest of the document has: a Breeze server sends it alongside the
326
+ // capitalised pre-3.0 members as well as instead of them. This is what lets a caller tell a
327
+ // concurrency conflict from a duplicate key, which share a status code.
328
+ if (typeof errObj.type === "string")
329
+ err.problemType = errObj.type;
330
+ let saveContext = httpResponse.saveContext;
331
+ // if any of the follow properties exist the source is .NET
332
+ let tmp = errObj.Message || errObj.ExceptionMessage || errObj.EntityErrors || errObj.Errors;
333
+ let isDotNet = !!tmp;
334
+ let message, entityErrors;
335
+ if (!isDotNet) {
336
+ // RFC 9457 (Problem Details for HTTP APIs) calls the human-readable text `detail`, with
337
+ // `title` as the shorter summary of the problem *type*. A server that sends problem+json and
338
+ // nothing else would otherwise fall through to the generic message at the end of this
339
+ // function, which says entity errors were encountered whether or not any were - a confidently
340
+ // wrong message is harder to diagnose than a missing one.
341
+ message = errObj.message || errObj.detail || errObj.title;
342
+ // `entityErrors` is a Breeze extension member; RFC 9457 section 3.2 allows those, and the
343
+ // spec requires consumers to ignore members they do not recognize.
344
+ entityErrors = errObj.errors || errObj.entityErrors;
345
+ // Normalize the same way the .NET branch does. Without this a server sending the natural
346
+ // "Namespace.Type" spelling gets "Unable to locate a 'Type' by the name ..." from the entity
347
+ // lookup in processServerErrors, with nothing to connect it to the error format.
348
+ entityErrors = entityErrors && entityErrors.map(function (e) {
349
+ return e.entityTypeName
350
+ ? { ...e, entityTypeName: MetadataStore.normalizeTypeName(e.entityTypeName) }
351
+ : e;
352
+ });
353
+ }
354
+ else {
355
+ let tmp = errObj;
356
+ do {
357
+ // .NET exceptions can provide both ExceptionMessage and Message but ExceptionMethod if it
358
+ // exists has a more detailed message.
359
+ message = tmp.ExceptionMessage || tmp.Message;
360
+ tmp = tmp.InnerException;
361
+ } while (tmp);
362
+ // .EntityErrors will only occur as a result of an EntityErrorsException being deliberately thrown on the server
363
+ entityErrors = errObj.Errors || errObj.EntityErrors;
364
+ entityErrors = entityErrors && entityErrors.map(function (e) {
365
+ return {
366
+ errorName: e.ErrorName,
367
+ entityTypeName: MetadataStore.normalizeTypeName(e.EntityTypeName),
368
+ keyValues: e.KeyValues,
369
+ propertyName: e.PropertyName,
370
+ errorMessage: e.ErrorMessage,
371
+ custom: e.Custom
372
+ };
373
+ });
374
+ }
375
+ if (saveContext && entityErrors) {
376
+ let propNameFn = saveContext.entityManager.metadataStore.namingConvention.serverPropertyNameToClient;
377
+ entityErrors.forEach(function (e) {
378
+ e.propertyName = e.propertyName && propNameFn(e.propertyName);
379
+ });
380
+ err.entityErrors = entityErrors;
381
+ }
382
+ err.message = message || "Server side errors encountered - see the entityErrors collection on this object for more detail";
383
+ return err;
384
+ }
385
+ /** This is a default, no-op implementation that developers can replace. */
386
+ class DefaultChangeRequestInterceptor {
387
+ constructor(saveContext, saveBundle) {
388
+ }
389
+ getRequest(request, entity, index) {
390
+ return request;
391
+ }
392
+ done(requests) {
393
+ }
394
+ }
395
+ //# sourceMappingURL=abstract-data-service-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abstract-data-service-adapter.js","sourceRoot":"","sources":["../../src/adapters/abstract-data-service-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { core } from '../core/core.js';\r\nimport { config } from '../config/config.js';\r\nimport { builtinAjax } from './http.js';\r\nimport { EntityQuery } from '../query/entity-query.js';\r\nimport { DataServiceAdapter, AjaxAdapter, AjaxConfig, ChangeRequestInterceptorCtor, ChangeRequestInterceptor } from '../config/interface-registry.js';\r\nimport { Entity } from '../entity/entity-aspect.js';\r\nimport { MappingContext } from '../query/mapping-context.js';\r\nimport { DataService, JsonResultsAdapter } from '../metadata/data-service.js';\r\nimport { HttpResponse, SaveContext, SaveBundle, ServerError, SaveResult, SaveErrorFromServer, QueryResult } from '../manager/entity-manager.js';\r\nimport { EntityType, MetadataStore } from '../metadata/entity-metadata.js';\r\n\r\n/** For use by breeze plugin authors only. The class is used as the base class for most {@link DataServiceAdapter} implementations\r\n@adapter (see {@link DataServiceAdapter}) \r\n@hidden\r\n*/\r\nexport abstract class AbstractDataServiceAdapter implements DataServiceAdapter {\r\n /** @hidden @internal */\r\n declare _$impl?: any;\r\n /** The name of this adapter. */\r\n declare name: string;\r\n /**\r\n * The ajax adapter requests go through: the registered default if there is one, otherwise\r\n * a built-in one that uses `config.fetch`.\r\n * @deprecated Make requests with `_ajax`, and supply the transport with\r\n * `configureBreeze({ fetch })`.\r\n */\r\n declare ajaxImpl: AjaxAdapter;\r\n\r\n // TODO use interface\r\n checkForRecomposition(interfaceInitializedArgs: any) {\r\n if (interfaceInitializedArgs.interfaceName === \"ajax\" && interfaceInitializedArgs.isDefault) {\r\n this.initialize();\r\n }\r\n }\r\n\r\n initialize() {\r\n // An ajax adapter is optional. A registered one (deprecated) is used if there is one;\r\n // otherwise requests go through config.fetch, which defaults to globalThis.fetch. This\r\n // is also why registration order no longer matters: there is nothing to resolve.\r\n this.ajaxImpl = config.getAdapterInstance<AjaxAdapter>(\"ajax\") || builtinAjax;\r\n }\r\n\r\n /**\r\n * Sends one request. Resolves with the response, or rejects with a `ServerError`.\r\n *\r\n * Subclasses should make their requests through this method rather than through\r\n * `ajaxImpl`, whose callback-shaped contract is kept only for compatibility. This is the\r\n * only place in the class that deals in success/error callbacks.\r\n */\r\n protected _ajax(\r\n config: Omit<AjaxConfig, 'success' | 'error'>,\r\n errorMessagePrefix?: string,\r\n prepareResponse?: (httpResponse: HttpResponse) => void): Promise<HttpResponse> {\r\n return new Promise<HttpResponse>((resolve, reject) => {\r\n this.ajaxImpl.ajax({\r\n ...config,\r\n // Each callback is guarded: a throw inside one would otherwise escape into the ajax\r\n // adapter and leave this promise pending for ever.\r\n success: (httpResponse: HttpResponse) => {\r\n try {\r\n prepareResponse && prepareResponse(httpResponse);\r\n resolve(httpResponse);\r\n } catch (e) {\r\n reject(e);\r\n }\r\n },\r\n error: (httpResponse: HttpResponse) => {\r\n try {\r\n // must run before makeHttpError: createError reads httpResponse.saveContext\r\n // to attach per-entity validation errors.\r\n prepareResponse && prepareResponse(httpResponse);\r\n reject(AbstractDataServiceAdapter.makeHttpError(httpResponse, errorMessagePrefix));\r\n } catch (e) {\r\n reject(e);\r\n }\r\n },\r\n } as AjaxConfig);\r\n });\r\n }\r\n\r\n async fetchMetadata(metadataStore: MetadataStore, dataService: DataService) {\r\n const serviceName = dataService.serviceName;\r\n const url = dataService.qualifyUrl(\"Metadata\");\r\n\r\n const httpResponse = await this._ajax(\r\n { type: \"GET\", url: url, dataType: 'json' },\r\n \"Metadata query failed for: \" + url);\r\n\r\n // might have been fetched by another query\r\n if (metadataStore.hasMetadataFor(serviceName)) {\r\n return \"already fetched\";\r\n }\r\n\r\n const data = httpResponse.data;\r\n let metadata: any;\r\n try {\r\n metadata = typeof (data) === \"string\" ? JSON.parse(data) : data;\r\n metadataStore.importMetadata(metadata);\r\n } catch (e) {\r\n const errMsg = \"Unable to either parse or import metadata: \" + (e as Error).message;\r\n throw AbstractDataServiceAdapter.makeHttpError(httpResponse, \"Metadata query failed for: \" + url + \". \" + errMsg);\r\n }\r\n\r\n // import may have brought in the service.\r\n if (!metadataStore.hasMetadataFor(serviceName)) {\r\n metadataStore.addDataService(dataService);\r\n }\r\n\r\n return metadata;\r\n }\r\n\r\n /** Execute the query in the mappingContext. */\r\n async executeQuery(mappingContext: MappingContext): Promise<QueryResult> {\r\n mappingContext.adapter = this;\r\n\r\n const usePost = (mappingContext.query as EntityQuery).usePostEnabled;\r\n const params = usePost ? this._makeQueryPostParams(mappingContext) : this._makeQueryGetParams(mappingContext) as any;\r\n\r\n const httpResponse = await this._ajax(params);\r\n\r\n const data = httpResponse.data;\r\n try {\r\n const results = data && (data.results || data.Results);\r\n if (results) {\r\n return {\r\n results: results,\r\n inlineCount: data.inlineCount || data.InlineCount,\r\n httpResponse: httpResponse,\r\n query: mappingContext.query\r\n } as QueryResult;\r\n }\r\n return { results: data, httpResponse: httpResponse, query: mappingContext.query } as QueryResult;\r\n } catch (e) {\r\n if (e instanceof Error) { throw e; }\r\n throw AbstractDataServiceAdapter.makeHttpError(httpResponse);\r\n }\r\n }\r\n\r\n /** Set up ajax parameters for query GET. This puts the query into the request querystring, in whatever syntax the UriBuilder produces. */\r\n _makeQueryGetParams(mappingContext: MappingContext) {\r\n const url = mappingContext.getUrl();\r\n\r\n const params = {\r\n type: \"GET\",\r\n url: url,\r\n params: (mappingContext.query as EntityQuery).parameters,\r\n dataType: 'json',\r\n crossDomain: false,\r\n };\r\n // useJsonp is deprecated. Breeze's own transport ignores dataType and crossDomain; this\r\n // stays only because a registered (deprecated) ajax adapter could still act on them.\r\n if (mappingContext.dataService.useJsonp) {\r\n params.dataType = 'jsonp';\r\n params.crossDomain = true;\r\n }\r\n return params;\r\n }\r\n\r\n /** Set up ajax parameters for query POST. This put the query into the request body as JSON. */\r\n _makeQueryPostParams(mappingContext: MappingContext) {\r\n const entityQuery = mappingContext.query as EntityQuery;\r\n const metadataStore = mappingContext.entityManager.metadataStore;\r\n const url = mappingContext.dataService.qualifyUrl(entityQuery.resourceName!);\r\n\r\n let entityType = entityQuery._getFromEntityType(metadataStore, false);\r\n if (!entityType) { entityType = new EntityType(metadataStore); }\r\n const json = entityQuery.toJSONExt({ entityType: entityType, toNameOnServer: true}) as any;\r\n json.from = undefined;\r\n json.queryOptions = undefined;\r\n // withParameters values go in the query string (params, below), as for a GET.\r\n json.parameters = undefined;\r\n\r\n const params = {\r\n type: \"POST\",\r\n url: url,\r\n params: (mappingContext.query as EntityQuery).parameters,\r\n dataType: 'json',\r\n processData: false, // don't form-encode the body\r\n contentType: \"application/json; charset=UTF-8\",\r\n data: JSON.stringify(json),\r\n crossDomain: false,\r\n };\r\n return params;\r\n }\r\n\r\n async saveChanges(saveContext: SaveContext, saveBundle: SaveBundle): Promise<SaveResult> {\r\n let adapter = saveContext.adapter = this;\r\n\r\n let saveBundleSer = adapter._prepareSaveBundle(saveContext, saveBundle);\r\n let bundle = JSON.stringify(saveBundleSer);\r\n\r\n const url = saveContext.dataService.qualifyUrl(saveContext.resourceName);\r\n\r\n // saveContext must be on the response before any error is built from it\r\n const httpResponse = await this._ajax(\r\n {\r\n type: \"POST\",\r\n url: url,\r\n dataType: 'json',\r\n contentType: \"application/json\",\r\n data: bundle,\r\n },\r\n undefined,\r\n (r) => { r.saveContext = saveContext; });\r\n\r\n const data = httpResponse.data;\r\n if (data == null || data === \"\") {\r\n const err = AbstractDataServiceAdapter.makeHttpError(httpResponse);\r\n err.message = \"The response to the save request to \" + url + \" (HTTP status \" + httpResponse.status +\r\n \") had no body. Breeze needs the saved entities and any key mappings to complete the save.\";\r\n throw err;\r\n }\r\n if (data.Errors || data.errors) {\r\n throw AbstractDataServiceAdapter.makeHttpError(httpResponse);\r\n }\r\n\r\n const saveResult = adapter._prepareSaveResult(saveContext, data);\r\n saveResult.httpResponse = httpResponse;\r\n return saveResult;\r\n }\r\n\r\n /** Abstract method that needs to be overwritten in any concrete DataServiceAdapter subclass. \r\n The return value from this method should be a serializable object that will be sent to the server after calling JSON.stringify on it.\r\n */\r\n _prepareSaveBundle(saveContext: SaveContext, saveBundle: SaveBundle): any {\r\n // The implementor should call _createChangeRequestInterceptor\r\n throw new Error(\"Need a concrete implementation of _prepareSaveBundle\");\r\n }\r\n\r\n /**\r\n Returns a constructor function for a \"ChangeRequestInterceptor\"\r\n that can tweak the saveBundle both as it is built and when it is completed\r\n by a concrete DataServiceAdapater.\r\n\r\n Initialized with a default, no-op implementation that developers can replace with a\r\n substantive implementation that changes the individual entity change requests\r\n or aspects of the entire 'saveBundle' without having to write their own DataService adapters.\r\n ```ts\r\n let adapter = breeze.config.getAdapterInstance('dataService');\r\n adapter.changeRequestInterceptor = function (saveContext, saveBundle) {\r\n this.getRequest = function (request, entity, index) {\r\n // alter the request that the adapter prepared for this entity\r\n // based on the entity, saveContext, and saveBundle\r\n // e.g., add a custom header or prune the originalValuesMap\r\n return request;\r\n };\r\n this.done = function (requests) {\r\n // alter the array of requests representing the entire change-set\r\n // based on the saveContext and saveBundle\r\n };\r\n }\r\n ```\r\n\r\n @param saveContext - The BreezeJS \"context\" for the save operation.\r\n @param saveBundle - Contains the array of entities-to-be-saved (AKA, the entity change-set).\r\n @returns Constructor for a \"ChangeRequestInterceptor\".\r\n */\r\n changeRequestInterceptor: ChangeRequestInterceptorCtor = DefaultChangeRequestInterceptor;\r\n\r\n /**\r\n * Creates the change request interceptor for one save, from `changeRequestInterceptor`.\r\n * Call it at the start of `_prepareSaveBundle`, pass each entity's request through its\r\n * `getRequest`, and pass the finished array to its `done`.\r\n *\r\n * Falls back to a no-op interceptor when `changeRequestInterceptor` is not set. If the\r\n * interceptor it creates has `oneTime` set, the adapter goes back to the no-op\r\n * interceptor afterwards, so only this save is intercepted.\r\n * @throws if the interceptor has no `getRequest` or `done` method.\r\n */\r\n protected _createChangeRequestInterceptor(saveContext: SaveContext, saveBundle: SaveBundle): ChangeRequestInterceptor {\r\n let adapter = saveContext.adapter!;\r\n let cri = adapter.changeRequestInterceptor;\r\n let isFn = core.isFunction;\r\n\r\n if (isFn(cri)) {\r\n let pre = adapter.name + \" DataServiceAdapter's ChangeRequestInterceptor\";\r\n let post = \" is missing or not a function.\";\r\n let interceptor = new cri(saveContext, saveBundle);\r\n if (!isFn(interceptor.getRequest)) {\r\n throw new Error(pre + '.getRequest' + post);\r\n }\r\n if (!isFn(interceptor.done)) {\r\n throw new Error(pre + '.done' + post);\r\n }\r\n if (interceptor.oneTime) {\r\n adapter.changeRequestInterceptor = DefaultChangeRequestInterceptor;\r\n }\r\n return interceptor;\r\n } else {\r\n return new DefaultChangeRequestInterceptor(saveContext, saveBundle) as ChangeRequestInterceptor;\r\n }\r\n }\r\n\r\n /** Abstract method that needs to be overwritten in any concrete DataServiceAdapter sublclass. \r\n This method needs to take the result returned the server and convert it into an ISaveResult. \r\n */\r\n _prepareSaveResult(saveContext: SaveContext, data: any): SaveResult {\r\n throw new Error(\"Need a concrete implementation of _prepareSaveResult\");\r\n }\r\n\r\n\r\n /** Utility method that may be used in any concrete DataServiceAdapter sublclass to handle any \r\n http connection issues. For an error with status 0 - the request got no response - it says in\r\n the message that the server could not be reached, keeping any message the transport gave.\r\n An aborted request is left alone. `makeHttpError` already applies it.\r\n */\r\n // Put this at the bottom of your http error analysis\r\n static _catchNoConnectionError(err: ServerError) {\r\n if (err.status !== 0) return;\r\n const cause = err.httpResponse && err.httpResponse.error;\r\n if (cause && cause.name === \"AbortError\") return; // the app cancelled it; the server is irrelevant\r\n const hint = \"Likely did not or could not reach server. Is the server running?\";\r\n if (err.message && err.message.includes(hint)) return; // already applied\r\n err.message = err.message\r\n ? \"HTTP response status 0: \" + err.message + \". \" + hint\r\n : \"HTTP response status 0 and no message. \" + hint;\r\n }\r\n\r\n /**\r\n * Builds the Breeze error for a failed HTTP response: an `Error` carrying `status`,\r\n * `statusText`, `url`, `body` and `httpResponse`, whose message comes from the response\r\n * body (a .NET exception, or `{ message, errors }`). For a save, it also carries the\r\n * server's per-entity `entityErrors`, if `httpResponse.saveContext` is set.\r\n *\r\n * `_ajax` uses it for every failed request. Call it when your adapter makes a request some\r\n * other way, then throw or reject with the result.\r\n * @param httpResponse - The failed response.\r\n * @param messagePrefix - Put at the start of the message, followed by \"; \".\r\n */\r\n static makeHttpError(httpResponse: HttpResponse, messagePrefix?: string): ServerError {\r\n const err = createError(httpResponse);\r\n AbstractDataServiceAdapter._catchNoConnectionError(err);\r\n if (messagePrefix) {\r\n err.message = messagePrefix + \"; \" + err.message;\r\n }\r\n return err;\r\n }\r\n\r\n jsonResultsAdapter = new JsonResultsAdapter({\r\n name: \"noop\",\r\n\r\n visitNode: function (/* node, mappingContext, nodeContext */) {\r\n return {};\r\n }\r\n });\r\n}\r\n\r\nfunction createError(httpResponse: HttpResponse) {\r\n let err = new Error() as ServerError;\r\n err.httpResponse = httpResponse;\r\n err.status = httpResponse.status;\r\n err.statusText = httpResponse.statusText;\r\n err.body = httpResponse.data;\r\n err.url = httpResponse.config && httpResponse.config.url;\r\n\r\n let errObj = httpResponse.data;\r\n\r\n if (!errObj) {\r\n err.message = httpResponse.error && httpResponse.error.toString();\r\n return err;\r\n }\r\n\r\n // some ajax providers convert an errant result into an object, others do not\r\n // if not do it here.\r\n if (typeof errObj === \"string\") {\r\n try {\r\n errObj = JSON.parse(errObj);\r\n } catch (e) {\r\n // sometimes httpResponse.data is just the error message itself\r\n err.message = errObj;\r\n return err;\r\n }\r\n }\r\n\r\n // The RFC 9457 `type` member, taken before the branch below because it is spelled the same\r\n // whichever shape the rest of the document has: a Breeze server sends it alongside the\r\n // capitalised pre-3.0 members as well as instead of them. This is what lets a caller tell a\r\n // concurrency conflict from a duplicate key, which share a status code.\r\n if (typeof errObj.type === \"string\") err.problemType = errObj.type;\r\n\r\n let saveContext = httpResponse.saveContext;\r\n\r\n // if any of the follow properties exist the source is .NET\r\n let tmp = errObj.Message || errObj.ExceptionMessage || errObj.EntityErrors || errObj.Errors;\r\n let isDotNet = !!tmp;\r\n let message: string, entityErrors: any[];\r\n if (!isDotNet) {\r\n // RFC 9457 (Problem Details for HTTP APIs) calls the human-readable text `detail`, with\r\n // `title` as the shorter summary of the problem *type*. A server that sends problem+json and\r\n // nothing else would otherwise fall through to the generic message at the end of this\r\n // function, which says entity errors were encountered whether or not any were - a confidently\r\n // wrong message is harder to diagnose than a missing one.\r\n message = errObj.message || errObj.detail || errObj.title;\r\n // `entityErrors` is a Breeze extension member; RFC 9457 section 3.2 allows those, and the\r\n // spec requires consumers to ignore members they do not recognize.\r\n entityErrors = errObj.errors || errObj.entityErrors;\r\n // Normalize the same way the .NET branch does. Without this a server sending the natural\r\n // \"Namespace.Type\" spelling gets \"Unable to locate a 'Type' by the name ...\" from the entity\r\n // lookup in processServerErrors, with nothing to connect it to the error format.\r\n entityErrors = entityErrors && entityErrors.map(function (e: any) {\r\n return e.entityTypeName\r\n ? { ...e, entityTypeName: MetadataStore.normalizeTypeName(e.entityTypeName) }\r\n : e;\r\n });\r\n } else {\r\n let tmp = errObj;\r\n do {\r\n // .NET exceptions can provide both ExceptionMessage and Message but ExceptionMethod if it\r\n // exists has a more detailed message.\r\n message = tmp.ExceptionMessage || tmp.Message;\r\n tmp = tmp.InnerException;\r\n } while (tmp);\r\n // .EntityErrors will only occur as a result of an EntityErrorsException being deliberately thrown on the server\r\n entityErrors = errObj.Errors || errObj.EntityErrors;\r\n entityErrors = entityErrors && entityErrors.map(function (e) {\r\n return {\r\n errorName: e.ErrorName,\r\n entityTypeName: MetadataStore.normalizeTypeName(e.EntityTypeName),\r\n keyValues: e.KeyValues,\r\n propertyName: e.PropertyName,\r\n errorMessage: e.ErrorMessage,\r\n custom: e.Custom\r\n };\r\n });\r\n }\r\n\r\n if (saveContext && entityErrors) {\r\n\r\n let propNameFn = saveContext.entityManager.metadataStore.namingConvention.serverPropertyNameToClient;\r\n entityErrors.forEach(function (e) {\r\n e.propertyName = e.propertyName && propNameFn(e.propertyName);\r\n });\r\n (err as SaveErrorFromServer).entityErrors = entityErrors;\r\n }\r\n\r\n err.message = message || \"Server side errors encountered - see the entityErrors collection on this object for more detail\";\r\n return err;\r\n}\r\n\r\n\r\n/** This is a default, no-op implementation that developers can replace. */\r\nclass DefaultChangeRequestInterceptor {\r\n constructor(saveContext: SaveContext, saveBundle: SaveBundle) {\r\n\r\n }\r\n\r\n getRequest(request: any, entity: Entity, index: number) {\r\n return request;\r\n }\r\n\r\n done(requests: Object[]) {\r\n }\r\n}\r\n"]}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * `AjaxFetchAdapter` - deprecated.
3
+ *
4
+ * Breeze 3 does not need an ajax adapter. Requests go through `config.fetch`, which you set
5
+ * with `configureBreeze({ fetch })` and which defaults to `globalThis.fetch`.
6
+ *
7
+ * This entry point is kept so that 2.x startup code - `AjaxFetchAdapter.register()`,
8
+ * `configureBreeze({ ajax: AjaxFetchAdapter })`, `config.initializeAdapterInstance('ajax',
9
+ * 'fetch')` - and code that uses the adapter's `defaultSettings` or `requestInterceptor`
10
+ * keeps working. The implementation now lives in the core, shared with the default path.
11
+ */
12
+ export { AjaxFetchAdapter } from './http.js';
@@ -0,0 +1,13 @@
1
+ /**
2
+ * `AjaxFetchAdapter` - deprecated.
3
+ *
4
+ * Breeze 3 does not need an ajax adapter. Requests go through `config.fetch`, which you set
5
+ * with `configureBreeze({ fetch })` and which defaults to `globalThis.fetch`.
6
+ *
7
+ * This entry point is kept so that 2.x startup code - `AjaxFetchAdapter.register()`,
8
+ * `configureBreeze({ ajax: AjaxFetchAdapter })`, `config.initializeAdapterInstance('ajax',
9
+ * 'fetch')` - and code that uses the adapter's `defaultSettings` or `requestInterceptor`
10
+ * keeps working. The implementation now lives in the core, shared with the default path.
11
+ */
12
+ export { AjaxFetchAdapter } from './http.js';
13
+ //# sourceMappingURL=adapter-ajax-fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-ajax-fetch.js","sourceRoot":"","sources":["../../src/adapters/adapter-ajax-fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC","sourcesContent":["/**\n * `AjaxFetchAdapter` - deprecated.\n *\n * Breeze 3 does not need an ajax adapter. Requests go through `config.fetch`, which you set\n * with `configureBreeze({ fetch })` and which defaults to `globalThis.fetch`.\n *\n * This entry point is kept so that 2.x startup code - `AjaxFetchAdapter.register()`,\n * `configureBreeze({ ajax: AjaxFetchAdapter })`, `config.initializeAdapterInstance('ajax',\n * 'fetch')` - and code that uses the adapter's `defaultSettings` or `requestInterceptor`\n * keeps working. The implementation now lives in the core, shared with the default path.\n */\nexport { AjaxFetchAdapter } from './http.js';\n"]}
@@ -1,36 +1,40 @@
1
- import * as breeze from 'breeze-client';
2
- /**
3
- * Functions to enable Breeze to use POST for queries when
4
- * special parameters are passed using the .withParameters function.
5
- *
6
- * Copyright 2015-2021 IdeaBlade, Inc. All Rights Reserved.
7
- * Use, reproduction, distribution, and modification of this code is subject to the terms and
8
- * conditions of the IdeaBlade Breeze license, available at http://www.breezejs.com/license
9
- *
10
- * Author: Steve Schmitt
11
- * Version:
12
- * 1.2.0 - Moved into breeze-client repo and npm package
13
- * 1.1.0 - revised: eliminated return object, configAjaxAdapter method; add ajaxPostEnabled flag
14
- * 1.0.6 - original
15
- *
16
- * Special parameters:
17
- * $method: ‘POST’ or ‘GET’ (the default)
18
- * $encoding: ‘JSON’ or x-www-form-urlencoded (the default)
19
- * $data: contains the data to be sent to the server
20
- *
21
- * Installation:
22
- * var ajaxAdapter = config.initializeAdapterInstance('ajax', adapterName, true);
23
- * AjaxPostWrapper.wrapAjax(ajaxAdapter);
24
- *
25
- * Example:
26
- * var query = breeze.EntityQuery.from('SimilarCustomersPOST')
27
- * .withParameters({
28
- * $method: 'POST',
29
- * $encoding: 'JSON',
30
- * $data: { CompanyName: 'Hilo Hattie', ContactName: 'Donald', City: 'Duck', Country: 'USA', Phone: '808-234-5678' }
31
- * });
32
- *
33
- **/
34
- export declare class AjaxPostWrapper {
35
- static wrapAjax(ajaxAdapter: breeze.AjaxAdapter): void;
36
- }
1
+ import * as breeze from '../breeze.js';
2
+ /**
3
+ * Functions to enable Breeze to use POST for queries when
4
+ * special parameters are passed using the .withParameters function.
5
+ *
6
+ * Copyright 2015-2026 IdeaBlade, Inc. All Rights Reserved.
7
+ * Use, reproduction, distribution, and modification of this code is subject to the terms and
8
+ * conditions of the IdeaBlade Breeze license, available at http://www.breezejs.com/license
9
+ *
10
+ * Author: Steve Schmitt
11
+ * Version:
12
+ * 1.2.0 - Moved into breeze-client repo and npm package
13
+ * 1.1.0 - revised: eliminated return object, configAjaxAdapter method; add ajaxPostEnabled flag
14
+ * 1.0.6 - original
15
+ *
16
+ * Special parameters:
17
+ * $method: ‘POST’ or ‘GET’ (the default)
18
+ * $encoding: ‘JSON’ or x-www-form-urlencoded (the default)
19
+ * $data: contains the data to be sent to the server
20
+ *
21
+ * Installation:
22
+ * const ajaxAdapter = config.getAdapterInstance<AjaxAdapter>('ajax');
23
+ * AjaxPostWrapper.wrapAjax(ajaxAdapter);
24
+ *
25
+ * Breeze 3 needs no ajax adapter, so there is one to wrap only if you registered one with
26
+ * configureBreeze({ ajax: MyAdapter }). Otherwise wrap your own fetch function instead.
27
+ *
28
+ * Example:
29
+ * const query = EntityQuery.from('SimilarCustomersPOST')
30
+ * .toType(Customer)
31
+ * .withParameters({
32
+ * $method: 'POST',
33
+ * $encoding: 'JSON',
34
+ * $data: { companyName: 'Hilo Hattie', contactName: 'Donald', city: 'Duck', country: 'USA', phone: '808-234-5678' }
35
+ * });
36
+ *
37
+ */
38
+ export declare class AjaxPostWrapper {
39
+ static wrapAjax(ajaxAdapter: breeze.AjaxAdapter): void;
40
+ }