dobo 2.30.7 → 2.32.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 (123) hide show
  1. package/.jsdoc.conf.json +1 -1
  2. package/docs/Dobo.html +1 -24
  3. package/docs/DoboAction.html +13 -0
  4. package/docs/DoboAdapter.html +3 -0
  5. package/docs/DoboConnection.html +3 -0
  6. package/docs/DoboFeature.html +3 -0
  7. package/docs/DoboModel.html +51 -0
  8. package/docs/data/search.json +1 -1
  9. package/docs/extend_bajo_hook-docs.js.html +241 -0
  10. package/docs/external-Tools.html +3 -0
  11. package/docs/global.html +1 -5
  12. package/docs/index.html +1 -1
  13. package/docs/index.js.html +434 -380
  14. package/docs/lib_factory_action.js.html +290 -0
  15. package/docs/lib_factory_adapter.js.html +1057 -0
  16. package/docs/lib_factory_connection.js.html +112 -0
  17. package/docs/lib_factory_feature.js.html +55 -0
  18. package/docs/lib_factory_model.js.html +503 -0
  19. package/docs/lib_factory_model_build.js.html +28 -0
  20. package/docs/lib_factory_model_clear-record.js.html +33 -0
  21. package/docs/lib_factory_model_count-record.js.html +45 -0
  22. package/docs/lib_factory_model_create-record.js.html +52 -0
  23. package/docs/lib_factory_model_drop.js.html +29 -0
  24. package/docs/lib_factory_model_exists.js.html +29 -0
  25. package/docs/lib_factory_model_find-all-record.js.html +115 -0
  26. package/docs/lib_factory_model_find-one-record.js.html +41 -0
  27. package/docs/lib_factory_model_find-record.js.html +85 -0
  28. package/docs/lib_factory_model_get-record.js.html +55 -0
  29. package/docs/lib_factory_model_helper.js.html +579 -0
  30. package/docs/lib_factory_model_remove-record.js.html +47 -0
  31. package/docs/lib_factory_model_sanitize-body.js.html +60 -0
  32. package/docs/lib_factory_model_sanitize-fixture.js.html +59 -0
  33. package/docs/lib_factory_model_sanitize-record.js.html +73 -0
  34. package/docs/lib_factory_model_update-record.js.html +61 -0
  35. package/docs/lib_factory_model_upsert-record.js.html +74 -0
  36. package/docs/{method_validate.js.html → lib_factory_model_validate.js.html} +109 -73
  37. package/docs/lib_helper.js.html +466 -0
  38. package/docs/module-Helper.html +3 -0
  39. package/docs/module-Helper_Model.html +3 -0
  40. package/docs/module-Hook.html +15 -0
  41. package/docs/scripts/core.js +477 -476
  42. package/docs/scripts/resize.js +36 -36
  43. package/docs/scripts/search.js +105 -105
  44. package/docs/scripts/third-party/fuse.js +1 -1
  45. package/docs/scripts/third-party/hljs-line-num-original.js +285 -282
  46. package/docs/scripts/third-party/hljs-line-num.js +1 -1
  47. package/docs/scripts/third-party/hljs-original.js +1202 -1195
  48. package/docs/scripts/third-party/hljs.js +1 -1
  49. package/docs/scripts/third-party/popper.js +1 -1
  50. package/docs/scripts/third-party/tippy.js +1 -1
  51. package/docs/scripts/third-party/tocbot.js +509 -508
  52. package/docs/static/home.md +3 -1
  53. package/extend/bajo/hook-docs.js +238 -0
  54. package/extend/bajo/intl/en-US.json +9 -9
  55. package/extend/bajo/intl/id.json +9 -9
  56. package/extend/bajoCli/applet/rebuild-model.js +2 -2
  57. package/extend/dobo/{driver → adapter}/memory.js +6 -6
  58. package/extend/dobo/feature/immutable.js +2 -2
  59. package/extend/dobo/feature/removed-at.js +1 -1
  60. package/index.js +33 -30
  61. package/lib/factory/action.js +145 -18
  62. package/lib/factory/adapter.js +1054 -0
  63. package/lib/factory/connection.js +46 -22
  64. package/lib/factory/feature.js +23 -3
  65. package/lib/factory/model/build.js +11 -2
  66. package/lib/factory/model/bulk-create-record.js +2 -2
  67. package/lib/factory/model/clear-record.js +13 -3
  68. package/lib/factory/model/count-record.js +13 -2
  69. package/lib/factory/model/create-aggregate.js +2 -2
  70. package/lib/factory/model/create-attachment.js +1 -1
  71. package/lib/factory/model/create-histogram.js +2 -2
  72. package/lib/factory/model/create-record.js +15 -2
  73. package/lib/factory/model/drop.js +12 -2
  74. package/lib/factory/model/exists.js +10 -6
  75. package/lib/factory/model/find-all-record.js +14 -3
  76. package/lib/factory/model/find-attachment.js +1 -1
  77. package/lib/factory/model/find-one-record.js +13 -1
  78. package/lib/factory/model/find-record.js +17 -53
  79. package/lib/factory/model/get-record.js +11 -39
  80. package/lib/factory/model/{_util.js → helper.js} +176 -16
  81. package/lib/factory/model/remove-attachment.js +1 -1
  82. package/lib/factory/model/remove-record.js +11 -28
  83. package/lib/factory/model/sanitize-body.js +14 -12
  84. package/lib/factory/model/sanitize-fixture.js +17 -4
  85. package/lib/factory/model/sanitize-record.js +9 -6
  86. package/lib/factory/model/transaction.js +2 -2
  87. package/lib/factory/model/update-record.js +12 -40
  88. package/lib/factory/model/upsert-record.js +13 -42
  89. package/lib/factory/model/validate.js +47 -14
  90. package/lib/factory/model.js +301 -23
  91. package/lib/{collect-models.js → helper.js} +463 -364
  92. package/package.json +1 -1
  93. package/wiki/CHANGES.md +17 -7
  94. package/wiki/ECOSYSTEM.md +7 -7
  95. package/wiki/GETTING-STARTED.md +3 -3
  96. package/wiki/QUERY-LANGUAGE.md +1 -1
  97. package/docs/lib_collect-connections.js.html +0 -39
  98. package/docs/lib_collect-drivers.js.html +0 -52
  99. package/docs/lib_collect-features.js.html +0 -36
  100. package/docs/lib_collect-schemas.js.html +0 -94
  101. package/docs/lib_index.js.html +0 -6
  102. package/docs/method_model_create.js.html +0 -35
  103. package/docs/method_model_drop.js.html +0 -34
  104. package/docs/method_model_exists.js.html +0 -40
  105. package/docs/method_record_count.js.html +0 -69
  106. package/docs/method_record_create.js.html +0 -114
  107. package/docs/method_record_find-all.js.html +0 -44
  108. package/docs/method_record_find-one.js.html +0 -73
  109. package/docs/method_record_find.js.html +0 -118
  110. package/docs/method_record_get.js.html +0 -92
  111. package/docs/method_record_remove.js.html +0 -75
  112. package/docs/method_record_update.js.html +0 -107
  113. package/docs/method_record_upsert.js.html +0 -54
  114. package/docs/method_sanitize_body.js.html +0 -88
  115. package/docs/method_sanitize_date.js.html +0 -30
  116. package/docs/method_sanitize_id.js.html +0 -20
  117. package/docs/module-Lib.html +0 -3
  118. package/lib/collect-connections.js +0 -56
  119. package/lib/collect-drivers.js +0 -35
  120. package/lib/collect-features.js +0 -40
  121. package/lib/factory/driver.js +0 -574
  122. package/lib/factory/model/sanitize-id.js +0 -7
  123. package/lib/index.js +0 -3
@@ -0,0 +1,503 @@
1
+ <!DOCTYPE html><html lang="en" style="font-size:16px"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Source: lib/factory/model.js</title><!--[if lt IE 9]>
2
+ <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
3
+ <![endif]--><script src="scripts/third-party/hljs.js" defer="defer"></script><script src="scripts/third-party/hljs-line-num.js" defer="defer"></script><script src="scripts/third-party/popper.js" defer="defer"></script><script src="scripts/third-party/tippy.js" defer="defer"></script><script src="scripts/third-party/tocbot.min.js"></script><script>var baseURL="/",locationPathname="";baseURL=(locationPathname=document.location.pathname).substr(0,locationPathname.lastIndexOf("/")+1)</script><link rel="stylesheet" href="styles/clean-jsdoc-theme.min.css"><svg aria-hidden="true" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="display:none"><defs><symbol id="copy-icon" viewbox="0 0 488.3 488.3"><g><path d="M314.25,85.4h-227c-21.3,0-38.6,17.3-38.6,38.6v325.7c0,21.3,17.3,38.6,38.6,38.6h227c21.3,0,38.6-17.3,38.6-38.6V124 C352.75,102.7,335.45,85.4,314.25,85.4z M325.75,449.6c0,6.4-5.2,11.6-11.6,11.6h-227c-6.4,0-11.6-5.2-11.6-11.6V124 c0-6.4,5.2-11.6,11.6-11.6h227c6.4,0,11.6,5.2,11.6,11.6V449.6z"/><path d="M401.05,0h-227c-21.3,0-38.6,17.3-38.6,38.6c0,7.5,6,13.5,13.5,13.5s13.5-6,13.5-13.5c0-6.4,5.2-11.6,11.6-11.6h227 c6.4,0,11.6,5.2,11.6,11.6v325.7c0,6.4-5.2,11.6-11.6,11.6c-7.5,0-13.5,6-13.5,13.5s6,13.5,13.5,13.5c21.3,0,38.6-17.3,38.6-38.6 V38.6C439.65,17.3,422.35,0,401.05,0z"/></g></symbol><symbol id="search-icon" viewBox="0 0 512 512"><g><g><path d="M225.474,0C101.151,0,0,101.151,0,225.474c0,124.33,101.151,225.474,225.474,225.474 c124.33,0,225.474-101.144,225.474-225.474C450.948,101.151,349.804,0,225.474,0z M225.474,409.323 c-101.373,0-183.848-82.475-183.848-183.848S124.101,41.626,225.474,41.626s183.848,82.475,183.848,183.848 S326.847,409.323,225.474,409.323z"/></g></g><g><g><path d="M505.902,476.472L386.574,357.144c-8.131-8.131-21.299-8.131-29.43,0c-8.131,8.124-8.131,21.306,0,29.43l119.328,119.328 c4.065,4.065,9.387,6.098,14.715,6.098c5.321,0,10.649-2.033,14.715-6.098C514.033,497.778,514.033,484.596,505.902,476.472z"/></g></g></symbol><symbol id="font-size-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M11.246 15H4.754l-2 5H.6L7 4h2l6.4 16h-2.154l-2-5zm-.8-2L8 6.885 5.554 13h4.892zM21 12.535V12h2v8h-2v-.535a4 4 0 1 1 0-6.93zM19 18a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"/></symbol><symbol id="add-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M11 11V5h2v6h6v2h-6v6h-2v-6H5v-2z"/></symbol><symbol id="minus-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M5 11h14v2H5z"/></symbol><symbol id="dark-theme-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M10 7a7 7 0 0 0 12 4.9v.1c0 5.523-4.477 10-10 10S2 17.523 2 12 6.477 2 12 2h.1A6.979 6.979 0 0 0 10 7zm-6 5a8 8 0 0 0 15.062 3.762A9 9 0 0 1 8.238 4.938 7.999 7.999 0 0 0 4 12z"/></symbol><symbol id="light-theme-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 18a6 6 0 1 1 0-12 6 6 0 0 1 0 12zm0-2a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM11 1h2v3h-2V1zm0 19h2v3h-2v-3zM3.515 4.929l1.414-1.414L7.05 5.636 5.636 7.05 3.515 4.93zM16.95 18.364l1.414-1.414 2.121 2.121-1.414 1.414-2.121-2.121zm2.121-14.85l1.414 1.415-2.121 2.121-1.414-1.414 2.121-2.121zM5.636 16.95l1.414 1.414-2.121 2.121-1.414-1.414 2.121-2.121zM23 11v2h-3v-2h3zM4 11v2H1v-2h3z"/></symbol><symbol id="reset-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M18.537 19.567A9.961 9.961 0 0 1 12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10c0 2.136-.67 4.116-1.81 5.74L17 12h3a8 8 0 1 0-2.46 5.772l.997 1.795z"/></symbol><symbol id="down-icon" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M12.7803 6.21967C13.0732 6.51256 13.0732 6.98744 12.7803 7.28033L8.53033 11.5303C8.23744 11.8232 7.76256 11.8232 7.46967 11.5303L3.21967 7.28033C2.92678 6.98744 2.92678 6.51256 3.21967 6.21967C3.51256 5.92678 3.98744 5.92678 4.28033 6.21967L8 9.93934L11.7197 6.21967C12.0126 5.92678 12.4874 5.92678 12.7803 6.21967Z"></path></symbol><symbol id="codepen-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M16.5 13.202L13 15.535v3.596L19.197 15 16.5 13.202zM14.697 12L12 10.202 9.303 12 12 13.798 14.697 12zM20 10.869L18.303 12 20 13.131V10.87zM19.197 9L13 4.869v3.596l3.5 2.333L19.197 9zM7.5 10.798L11 8.465V4.869L4.803 9 7.5 10.798zM4.803 15L11 19.131v-3.596l-3.5-2.333L4.803 15zM4 13.131L5.697 12 4 10.869v2.262zM2 9a1 1 0 0 1 .445-.832l9-6a1 1 0 0 1 1.11 0l9 6A1 1 0 0 1 22 9v6a1 1 0 0 1-.445.832l-9 6a1 1 0 0 1-1.11 0l-9-6A1 1 0 0 1 2 15V9z"/></symbol><symbol id="close-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 10.586l4.95-4.95 1.414 1.414-4.95 4.95 4.95 4.95-1.414 1.414-4.95-4.95-4.95 4.95-1.414-1.414 4.95-4.95-4.95-4.95L7.05 5.636z"/></symbol><symbol id="menu-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M3 4h18v2H3V4zm0 7h18v2H3v-2zm0 7h18v2H3v-2z"/></symbol></defs></svg></head><body data-theme="light"><div class="sidebar-container"><div class="sidebar" id="sidebar"><a href="/" class="sidebar-title sidebar-title-anchor">Dobo API</a><div class="sidebar-items-container"><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-classes"><div>Classes</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="Dobo.html">Dobo</a></div><div class="sidebar-section-children"><a href="DoboAction.html">DoboAction</a></div><div class="sidebar-section-children"><a href="DoboAdapter.html">DoboAdapter</a></div><div class="sidebar-section-children"><a href="DoboConnection.html">DoboConnection</a></div><div class="sidebar-section-children"><a href="DoboFeature.html">DoboFeature</a></div><div class="sidebar-section-children"><a href="DoboModel.html">DoboModel</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-modules"><div>Modules</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="module-Helper.html">Helper</a></div><div class="sidebar-section-children"><a href="module-Helper_Model.html">Helper/Model</a></div><div class="sidebar-section-children"><a href="module-Hook.html">Hook</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-externals"><div>Externals</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="external-Tools.html">Tools</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-global"><div>Global</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="global.html#actionFactory">actionFactory</a></div><div class="sidebar-section-children"><a href="global.html#adapterFactory">adapterFactory</a></div><div class="sidebar-section-children"><a href="global.html#connectionFactory">connectionFactory</a></div><div class="sidebar-section-children"><a href="global.html#featureFactory">featureFactory</a></div><div class="sidebar-section-children"><a href="global.html#modelFactory">modelFactory</a></div><div class="sidebar-section-children"><a href="global.html#pluginFactory">pluginFactory</a></div></div></div></div></div><div class="navbar-container" id="VuAckcnZhf"><nav class="navbar"><div class="navbar-left-items"><div class="navbar-item"><a id="" href="https://www.npmjs.com/package/dobo" target="">NPM</a></div><div class="navbar-item"><a id="" href="https://github.com/ardhi/dobo" target="">Github</a></div><div class="navbar-item"><a id="" href="https://dobo.bajo.app/" target="">Dobo</a></div><div class="navbar-item"><a id="" href="https://bajo.app/" target="">Bajo</a></div></div><div class="navbar-right-items"><div class="navbar-right-item"><button class="icon-button search-button" aria-label="open-search"><svg><use xlink:href="#search-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button theme-toggle" aria-label="toggle-theme"><svg><use class="theme-svg-use" xlink:href="#dark-theme-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button font-size" aria-label="change-font-size"><svg><use xlink:href="#font-size-icon"></use></svg></button></div></div><nav></nav></nav></div><div class="toc-container"><div class="toc-content"><span class="bold">On this page</span><div id="eed4d2a0bfd64539bb9df78095dec881"></div></div></div><div class="body-wrapper"><div class="main-content"><div class="main-wrapper"><section id="source-page" class="source-page"><header><h1 id="title" class="has-anchor">lib_factory_model.js</h1></header><article><pre class="prettyprint source lang-js"><code>import { sanitizeAll, sanitizeRef } from '../helper.js'
4
+ import clearRecord from './model/clear-record.js'
5
+ import countRecord from './model/count-record.js'
6
+ import createRecord from './model/create-record.js'
7
+ import drop from './model/drop.js'
8
+ import findAllRecord from './model/find-all-record.js'
9
+ import findOneRecord from './model/find-one-record.js'
10
+ import findRecord from './model/find-record.js'
11
+ import getRecord from './model/get-record.js'
12
+ import createHistogram from './model/create-histogram.js'
13
+ import createAggregate from './model/create-aggregate.js'
14
+ import exists from './model/exists.js'
15
+ import build from './model/build.js'
16
+ import loadFixtures from './model/load-fixtures.js'
17
+ import removeRecord from './model/remove-record.js'
18
+ import updateRecord from './model/update-record.js'
19
+ import createAttachment from './model/create-attachment.js'
20
+ import updateAttachment from './model/update-attachment.js'
21
+ import getAttachment from './model/get-attachment.js'
22
+ import removeAttachment from './model/remove-attachment.js'
23
+ import findAttachment from './model/find-attachment.js'
24
+ import sanitizeBody from './model/sanitize-body.js'
25
+ import sanitizeRecord from './model/sanitize-record.js'
26
+ import sanitizeFixture from './model/sanitize-fixture.js'
27
+ import upsertRecord from './model/upsert-record.js'
28
+ import bulkCreateRecord from './model/bulk-create-record.js'
29
+ import listAttachment from './model/list-attachment.js'
30
+ import transaction from './model/transaction.js'
31
+ import validate from './model/validate.js'
32
+
33
+ /**
34
+ * @typedef {Object} TOptions
35
+ * @memberof DoboModel
36
+ * @type {Object}
37
+ * @property {boolean} [noHook=false] - If `true`, no model's hook will be executed
38
+ * @property {boolean} [noModelHook=false] - If `true`, no model's hook will be executed
39
+ * @property {boolean} [noDynHook=false] - If `true`, no dynamic hook will be executed
40
+ * @property {boolean} [noValidation=false] - If `true`, no validation of data payload performed
41
+ * @property {boolean} [noCheckUnique=false] - If `true`, no unique validation for ID performed
42
+ * @property {boolean} [noBodySanitizer=false] - If `true`, accept data payload as is without sanitization
43
+ * @property {boolean} [noRecordSanitizer=false] - If `true`, accept result payload as is without sanitization
44
+ * @property {boolean} [noResult=false] - If `true`, returns nothing
45
+ * @property {boolean} [truncateString=true] - If `true` (default), string is truncated to its model's `maxLength`
46
+ * @property {boolean} [partial] - If `true`, only updated values are saved. Otherwise replace all existing values with given payload. Defaults to `true` for `updateRecord`
47
+ * @property {boolean} [dataOnly=true] - If `true` (default) returns only record's object. Otherwise {@link DoboModel.TResult}
48
+ */
49
+
50
+ /**
51
+ * Sort order key used in pagination and sorting of records. It can be either:
52
+ * - `1` for ascending order (the default, if none is provided) or
53
+ * - `-1` for descending order.
54
+ * @typedef {string} TSortOrder
55
+ * @memberof DoboModel
56
+ */
57
+
58
+ /**
59
+ * Key value pairs used as sort order in pagination and sorting of records. It is an object where:
60
+ * - Key represents model's field name
61
+ * - Value represents its sort order
62
+ *
63
+ * @typedef {Object.&lt;string, DoboModel.TSortOrder>} TSort
64
+ * @memberof DoboModel
65
+ * @example
66
+ * // to sort by firstName (ascending) and lastName (descending)
67
+ * const sort = {
68
+ * firstName: 1,
69
+ * lastName: -1
70
+ * }
71
+ */
72
+
73
+ /**
74
+ * @typedef {Object} TPagination
75
+ * @memberof DoboModel
76
+ * @property {number} limit - Number of records per page
77
+ * @property {number} page - Page number
78
+ * @property {number} [skip] - Records to skip. If not provided, it will be calculated based on `limit` and `page`
79
+ */
80
+
81
+ /**
82
+ * Property value type definition. Used for building property `values` in a model which is an array of this object type.
83
+ * @typedef TPropertyValue
84
+ * @memberof DoboModel
85
+ * @type {Object}
86
+ * @property {string} value - The actual value of the property
87
+ * @property {string} text - The display text for the property value, which can be translated based on the request context
88
+ */
89
+
90
+ /**
91
+ * Formatted version of a record's property values. It is an object where:
92
+ * - Key represents the property name
93
+ * - Value represents its formatted value according to the property's data type or formatting function. Data type is ALWAYS in string.
94
+ *
95
+ * This record is then wrapped in a `_fmt` property.
96
+ * @typedef TRecordFormatted
97
+ * @memberof DoboModel
98
+ * @type {Object}
99
+ * @property {Object} [_fmt={}] - Wrapper
100
+ * @example
101
+ * {
102
+ * _fmt: {
103
+ * id: "1",
104
+ * item: "Laptop",
105
+ * createdAt: "Jan 1, 2024, 12:00 AM",
106
+ * isActive: "True",
107
+ * price: "2,500.00"
108
+ * }
109
+ * }
110
+ */
111
+
112
+ /**
113
+ * Reference record related to a record's result. It is an object where:
114
+ * - Key represents the name of the referenced record. Normally, it is the referenced model's name in camelCase format.
115
+ * - Value represents its reference record. It can be an object or an array of objects, depending on the relationship type.
116
+ *
117
+ * This record is then wrapped in a `_ref` property in the result object.
118
+ * @typedef TRecordRef
119
+ * @memberof DoboModel
120
+ * @type {Object}
121
+ * @property {Object} [_ref={}] - Wrapper
122
+ * @property {Object|Array} [_ref.&lt;string>.&lt;DoboModel.TRecord>] - Reference record
123
+ * @example
124
+ * {
125
+ * _ref: {
126
+ * user: {
127
+ * id: 1,
128
+ * name: "John Doe"
129
+ * },
130
+ * posts: [
131
+ * {
132
+ * id: 1,
133
+ * title: "Post Title"
134
+ * },
135
+ * {
136
+ * id: 2,
137
+ * title: "Another Post Title"
138
+ * }
139
+ * ]
140
+ * }
141
+ * }
142
+ */
143
+
144
+ /**
145
+ * The record returned from a model's action. It is an object where:
146
+ * - Key represents the property name
147
+ * - Value represents its value according to the property's data type
148
+ *
149
+ * This record is then merged with {@link DoboModel.TRecordFormatted} and {@link DoboModel.TRecordRef} to form the final record returned from a model's action.
150
+ * @typedef TRecord
151
+ * @memberof DoboModel
152
+ * @type {Object &amp; DoboModel.TRecordFormatted &amp; DoboModel.TRecordRef}
153
+ * @example
154
+ * {
155
+ * id: 1,
156
+ * item: "Laptop",
157
+ * createdAt: "2024-01-01T00:00:00.000Z",
158
+ * isActive: true,
159
+ * price: 2500.00,
160
+ * _fmt: {
161
+ * id: "1",
162
+ * item: "Laptop",
163
+ * createdAt: "Jan 1, 2024, 12:00 AM",
164
+ * isActive: "True",
165
+ * price: "2,500.00"
166
+ * },
167
+ * _ref: {
168
+ * user: {
169
+ * id: 1,
170
+ * name: "John Doe"
171
+ * }
172
+ * }
173
+ * }
174
+ */
175
+
176
+ /**
177
+ * The result returned from a model's action other than `find*`, `{create|update|remove}Record` if `dataOnly` is set to `false`.
178
+ * @typedef TResultRecord
179
+ * @memberof DoboModel
180
+ * @type {Object}
181
+ * @property {Array&lt;DoboModel.TRecord>} data - The data returned from the action
182
+ */
183
+
184
+ /**
185
+ * The result returned from a model's `find*` actions if `dataOnly` is set to `false`.
186
+ * @typedef TResultFindRecord
187
+ * @memberof DoboModel
188
+ * @type {Object}
189
+ * @property {Array&lt;DoboModel.TRecord>} data - The data returned from the action
190
+ * @property {number} [count] - The total number of records found, if applicable
191
+ * @property {boolean} [cached] - Indicates if the result was retrieved from cache, if applicable. Only available if `bajoCache` is used
192
+ * @property {Array} [warnings] - Any warnings generated during the action, if applicable
193
+ */
194
+
195
+ /**
196
+ * The result returned from a model's `getRecord` action if `dataOnly` is set to `false`.
197
+ * @typedef TResultGetRecord
198
+ * @memberof DoboModel
199
+ * @type {Object}
200
+ * @property {DoboModel.TRecord} data - The data returned from the action
201
+ */
202
+
203
+ /**
204
+ * The result returned from a model's `createRecord` action if `dataOnly` is set to `false`.
205
+ * @typedef TResultCreateRecord
206
+ * @memberof DoboModel
207
+ * @type {Object}
208
+ * @property {DoboModel.TRecord} data - The data returned from the action
209
+ */
210
+
211
+ /**
212
+ * The result returned from a model's `updateRecord` action if `dataOnly` is set to `false`.
213
+ * @typedef TResultUpdateRecord
214
+ * @memberof DoboModel
215
+ * @type {Object}
216
+ * @property {DoboModel.TRecord} data - The updated data returned from the action
217
+ * @property {DoboModel.TRecord} oldData - The previous data before the update
218
+ */
219
+
220
+ /**
221
+ * The result returned from a model's `removeRecord` action if `dataOnly` is set to `false`.
222
+ * @typedef TResultRemoveRecord
223
+ * @memberof DoboModel
224
+ * @type {Object}
225
+ * @property {DoboModel.TRecord} oldData - The removed data returned from the action
226
+ */
227
+
228
+ /**
229
+ * Model factory.
230
+ *
231
+ * @async
232
+ * @returns {Promise&lt;void>} Returns nothing
233
+ */
234
+ async function modelFactory () {
235
+ const { Tools } = this.app.baseClass
236
+ const { defaults } = this.app.lib._
237
+
238
+ /**
239
+ * Model class defintion.
240
+ *
241
+ * @class
242
+ */
243
+ class DoboModel extends Tools {
244
+ /**
245
+ * Constructor
246
+ */
247
+ constructor (plugin, options) {
248
+ super(plugin)
249
+
250
+ defaults(this, options)
251
+
252
+ /**
253
+ * Model's adapter name
254
+ * @type {string}
255
+ */
256
+ this.adapter = this.connection.adapter
257
+ }
258
+
259
+ /**
260
+ * Invoke a model's action. It will create a new instance of {@link DoboAction} and return it.
261
+ * @method
262
+ * @memberof DoboModel
263
+ * @param {string} name - The name of the action to invoke
264
+ * @param {...any} args - Arguments to pass to the action
265
+ * @returns {DoboAction} Returns an instance of {@link DoboAction}
266
+ */
267
+ action = (name, ...args) => {
268
+ const action = new this.app.baseClass.DoboAction(this, name, ...args)
269
+ return action
270
+ }
271
+
272
+ sanitizeObjectDef = async (obj) => {
273
+ await sanitizeAll.call(this.app.dobo, obj)
274
+ }
275
+
276
+ /**
277
+ * Sanitize a reference object based on the model's properties and rules.
278
+ * @method
279
+ * @memberof DoboModel
280
+ * @async
281
+ * @param {*} obj - The reference object to sanitize
282
+ * @param {boolean} [fatal=true] - Whether to throw an error if sanitization fails
283
+ */
284
+ sanitizeRef = async (obj, fatal = true) => {
285
+ await sanitizeRef.call(this.app.dobo, obj, this.app.dobo.models, fatal)
286
+ }
287
+
288
+ /**
289
+ * Sanitize the given ID based on the model's properties.
290
+ * @method
291
+ * @memberof DoboModel
292
+ * @param {string|number} id - The ID to sanitize
293
+ * @returns {string|number} Returns the sanitized ID
294
+ */
295
+ sanitizeId = (id) => {
296
+ const prop = this.properties.find(p => p.name === 'id')
297
+ if (prop.type === 'integer') id = parseInt(id)
298
+ return id
299
+ }
300
+
301
+ /**
302
+ * Get a property by its name.
303
+ * @method
304
+ * @memberof DoboModel
305
+ * @param {string} name - The name of the property to retrieve
306
+ * @returns {Object|null} Returns the property object if found, otherwise `undefined`
307
+ */
308
+ getProperty = (name) => {
309
+ return this.properties.find(prop => prop.name === name)
310
+ }
311
+
312
+ /**
313
+ * Get the model's properties based on the given options.
314
+ * @method
315
+ * @memberof DoboModel
316
+ * @param {Object} [options={}] - Options object
317
+ * @param {boolean} [options.noVirtual=false] - If `true`, exclude virtual properties
318
+ * @param {boolean} [options.namesOnly=false] - If `true`, return only property names instead of full property objects
319
+ * @returns {Array&lt;object|string>} Returns an array of properties or property names based on the options
320
+ */
321
+ getProperties = (options = {}) => {
322
+ const { noVirtual, namesOnly } = options
323
+ const items = noVirtual ? this.properties.filter(prop => !prop.virtual) : this.properties
324
+ return namesOnly ? items.map(item => item.name) : items
325
+ }
326
+
327
+ /**
328
+ * Get the model's virtual properties.
329
+ * @method
330
+ * @memberof DoboModel
331
+ * @param {boolean} [namesOnly=false] - If `true`, return only property names instead of full property objects
332
+ * @returns {Array&lt;object|string>} Returns an array of virtual properties or property names based on the `namesOnly` option
333
+ */
334
+ getVirtualProperties = (namesOnly) => {
335
+ const items = this.properties.filter(prop => prop.virtual)
336
+ return namesOnly ? items.map(item => item.name) : items
337
+ }
338
+
339
+ /**
340
+ * Get the model's non-virtual properties.
341
+ * @method
342
+ * @memberof DoboModel
343
+ * @param {boolean} [namesOnly=false] - If `true`, return only property names instead of full property objects
344
+ * @returns {Array&lt;object|string>} Returns an array of non-virtual properties or property names based on the `namesOnly` option
345
+ */
346
+ getNonVirtualProperties = (namesOnly) => {
347
+ const items = this.properties.filter(prop => !prop.virtual)
348
+ return namesOnly ? items.map(item => item.name) : items
349
+ }
350
+
351
+ /**
352
+ * Returns the model's indexes.
353
+ * @method
354
+ * @memberof DoboModel
355
+ * @returns {Array&lt;object>} Returns an array of index objects defined in the model
356
+ */
357
+ getIndexes = () => {
358
+ return this.indexes
359
+ }
360
+
361
+ /**
362
+ * Checks if the model has a property with the given name.
363
+ * @method
364
+ * @memberof DoboModel
365
+ * @param {string} name - The name of the property to check
366
+ * @returns {boolean} Returns `true` if the property exists, otherwise `false`
367
+ */
368
+ hasProperty = (name) => {
369
+ return !!this.getProperty(name)
370
+ }
371
+
372
+ syncIdField = (idField) => {
373
+ const { cloneDeep, findIndex } = this.app.lib._
374
+ if (!this.adapter) return
375
+ if (!idField) idField = cloneDeep(this.adapter.idField)
376
+ const idx = findIndex(this.properties, { name: 'id' })
377
+ if (idx === -1) return
378
+ this.properties.splice(idx, 1)
379
+ this.properties.unshift(idField)
380
+ }
381
+
382
+ /**
383
+ * Internal method to perform a simple lookup based on the provided value and lookupValue.
384
+ * @method
385
+ * @internal
386
+ * @memberof DoboModel
387
+ * @async
388
+ * @param {string|object|Array} value - The value to look up
389
+ * @param {object} lookupValue - The lookup values to replace in the query
390
+ * @param {object} [options={}] - Additional options for the lookup
391
+ * @returns {*|null|undefined} Returns the result of the lookup or `null` if not found or `undefined` if the value is not a string, object, or array
392
+ */
393
+ _simpleLookup = async (value, lookupValue, options = {}) => {
394
+ const { get, isEmpty, isString, isPlainObject, isArray } = this.app.lib._
395
+ let model
396
+ let field
397
+ let query
398
+ if (isString(value)) {
399
+ [model, field, ...query] = value.split(':')
400
+ query = query.join(':')
401
+ } else if (isPlainObject(value)) ({ model, field, query } = value)
402
+ else if (isArray(value)) [model, field, query] = value
403
+ else return
404
+ for (const key in lookupValue) {
405
+ query = query.replaceAll(`{${key}}`, lookupValue[key])
406
+ }
407
+ if (isEmpty(field)) field = 'id'
408
+ const { getModel } = this.app.dobo
409
+ const ref = getModel(model)
410
+ const opts = { ...options, noCache: true, noMagic: true }
411
+ opts.dataOnly = true
412
+ const rec = await ref.findOneRecord({ query }, opts)
413
+ return get(rec, field, null)
414
+ }
415
+
416
+ /**
417
+ * Builds the values for a given property if `prop.values` is set:
418
+ * - If a string, it will be treated as a handler and executed to get the values.
419
+ * - If a function, it will be executed to get the values.
420
+ * - If an array, it will be used as is.
421
+ *
422
+ * Values are returned as an array of {@link DoboModel.TPropertyValues}.
423
+ * If a request object is provided in the options, the `text` will be translated using
424
+ * the request's translation function.
425
+ * @async
426
+ * @method
427
+ * @memberof DoboModel
428
+ * @param {object} prop - The property definition
429
+ * @param {DoboModel.TOptions} opts - Additional options for building the property values
430
+ * @returns {Array&lt;DoboModel.TPropertyValue>} Returns an array of property values
431
+ */
432
+ buildPropValues = async (prop, opts) => {
433
+ const { isString, camelCase, isFunction } = this.app.lib._
434
+ const { callHandler } = this.app.bajo
435
+ const values = isString(prop.values) || isFunction(prop.values) ? await callHandler(this, prop.values, opts) : [...prop.values]
436
+ return values.map(v => {
437
+ if (isString(v)) v = { value: v, text: v }
438
+ if (opts.req) {
439
+ const key = camelCase(`${prop.name} ${v.text}`)
440
+ if (opts.req.te(key)) v.text = opts.req.t(key)
441
+ }
442
+ return v
443
+ })
444
+ }
445
+
446
+ build = build
447
+ exists = exists
448
+ drop = drop
449
+
450
+ createRecord = createRecord
451
+ getRecord = getRecord
452
+ updateRecord = updateRecord
453
+ upsertRecord = upsertRecord
454
+ removeRecord = removeRecord
455
+ clearRecord = clearRecord
456
+ findRecord = findRecord
457
+ findOneRecord = findOneRecord
458
+ findAllRecord = findAllRecord
459
+
460
+ transaction = transaction
461
+ bulkCreateRecord = bulkCreateRecord
462
+
463
+ createAggregate = createAggregate
464
+ createHistogram = createHistogram
465
+ countRecord = countRecord
466
+
467
+ createAttachment = createAttachment
468
+ getAttachment = getAttachment
469
+ updateAttachment = updateAttachment
470
+ removeAttachment = removeAttachment
471
+ findAttachment = findAttachment
472
+ listAttachment = listAttachment
473
+
474
+ loadFixtures = loadFixtures
475
+ sanitizeRecord = sanitizeRecord
476
+ sanitizeBody = sanitizeBody
477
+ sanitizeFixture = sanitizeFixture
478
+ validate = validate
479
+
480
+ // aliases
481
+ deleteRecord = removeRecord
482
+ clearRecords = clearRecord
483
+ countRecords = countRecord
484
+ findRecords = findRecord
485
+ findAllRecords = findAllRecord
486
+ listAttachments = listAttachment
487
+ bulkCreateRecords = bulkCreateRecord
488
+
489
+ getField = (name) => this.getProperty(name)
490
+ hasField = (name) => this.hasProperty(name)
491
+
492
+ dispose = async () => {
493
+ await super.dispose()
494
+ this.connection = null
495
+ this.adapter = null
496
+ }
497
+ }
498
+
499
+ this.app.baseClass.DoboModel = DoboModel
500
+ }
501
+
502
+ export default modelFactory
503
+ </code></pre></article></section></div></div></div><div class="search-container" id="PkfLWpAbet" style="display:none"><div class="wrapper" id="iCxFxjkHbP"><button class="icon-button search-close-button" id="VjLlGakifb" aria-label="close search"><svg><use xlink:href="#close-icon"></use></svg></button><div class="search-box-c"><svg><use xlink:href="#search-icon"></use></svg> <input type="text" id="vpcKVYIppa" class="search-input" placeholder="Search..." autofocus></div><div class="search-result-c" id="fWwVHRuDuN"><span class="search-result-c-text">Type anything to view search result</span></div></div></div><div class="mobile-menu-icon-container"><button class="icon-button" id="mobile-menu" data-isopen="false" aria-label="menu"><svg><use xlink:href="#menu-icon"></use></svg></button></div><div id="mobile-sidebar" class="mobile-sidebar-container"><div class="mobile-sidebar-wrapper"><a href="/" class="sidebar-title sidebar-title-anchor">Dobo API</a><div class="mobile-nav-links"><div class="navbar-item"><a id="" href="https://www.npmjs.com/package/dobo" target="">NPM</a></div><div class="navbar-item"><a id="" href="https://github.com/ardhi/dobo" target="">Github</a></div><div class="navbar-item"><a id="" href="https://dobo.bajo.app/" target="">Dobo</a></div><div class="navbar-item"><a id="" href="https://bajo.app/" target="">Bajo</a></div></div><div class="mobile-sidebar-items-c"><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-classes"><div>Classes</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="Dobo.html">Dobo</a></div><div class="sidebar-section-children"><a href="DoboAction.html">DoboAction</a></div><div class="sidebar-section-children"><a href="DoboAdapter.html">DoboAdapter</a></div><div class="sidebar-section-children"><a href="DoboConnection.html">DoboConnection</a></div><div class="sidebar-section-children"><a href="DoboFeature.html">DoboFeature</a></div><div class="sidebar-section-children"><a href="DoboModel.html">DoboModel</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-modules"><div>Modules</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="module-Helper.html">Helper</a></div><div class="sidebar-section-children"><a href="module-Helper_Model.html">Helper/Model</a></div><div class="sidebar-section-children"><a href="module-Hook.html">Hook</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-externals"><div>Externals</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="external-Tools.html">Tools</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-global"><div>Global</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="global.html#actionFactory">actionFactory</a></div><div class="sidebar-section-children"><a href="global.html#adapterFactory">adapterFactory</a></div><div class="sidebar-section-children"><a href="global.html#connectionFactory">connectionFactory</a></div><div class="sidebar-section-children"><a href="global.html#featureFactory">featureFactory</a></div><div class="sidebar-section-children"><a href="global.html#modelFactory">modelFactory</a></div><div class="sidebar-section-children"><a href="global.html#pluginFactory">pluginFactory</a></div></div></div><div class="mobile-navbar-actions"><div class="navbar-right-item"><button class="icon-button search-button" aria-label="open-search"><svg><use xlink:href="#search-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button theme-toggle" aria-label="toggle-theme"><svg><use class="theme-svg-use" xlink:href="#dark-theme-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button font-size" aria-label="change-font-size"><svg><use xlink:href="#font-size-icon"></use></svg></button></div></div></div></div><script type="text/javascript" src="scripts/core.min.js"></script><script src="scripts/search.min.js" defer="defer"></script><script src="scripts/third-party/fuse.js" defer="defer"></script><script type="text/javascript">var tocbotInstance=tocbot.init({tocSelector:"#eed4d2a0bfd64539bb9df78095dec881",contentSelector:".main-content",headingSelector:"h1, h2, h3",hasInnerContainers:!0,scrollContainer:".main-content",headingsOffset:130,onClick:bringLinkToView})</script></body></html>
@@ -0,0 +1,28 @@
1
+ <!DOCTYPE html><html lang="en" style="font-size:16px"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Source: lib/factory/model/build.js</title><!--[if lt IE 9]>
2
+ <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
3
+ <![endif]--><script src="scripts/third-party/hljs.js" defer="defer"></script><script src="scripts/third-party/hljs-line-num.js" defer="defer"></script><script src="scripts/third-party/popper.js" defer="defer"></script><script src="scripts/third-party/tippy.js" defer="defer"></script><script src="scripts/third-party/tocbot.min.js"></script><script>var baseURL="/",locationPathname="";baseURL=(locationPathname=document.location.pathname).substr(0,locationPathname.lastIndexOf("/")+1)</script><link rel="stylesheet" href="styles/clean-jsdoc-theme.min.css"><svg aria-hidden="true" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="display:none"><defs><symbol id="copy-icon" viewbox="0 0 488.3 488.3"><g><path d="M314.25,85.4h-227c-21.3,0-38.6,17.3-38.6,38.6v325.7c0,21.3,17.3,38.6,38.6,38.6h227c21.3,0,38.6-17.3,38.6-38.6V124 C352.75,102.7,335.45,85.4,314.25,85.4z M325.75,449.6c0,6.4-5.2,11.6-11.6,11.6h-227c-6.4,0-11.6-5.2-11.6-11.6V124 c0-6.4,5.2-11.6,11.6-11.6h227c6.4,0,11.6,5.2,11.6,11.6V449.6z"/><path d="M401.05,0h-227c-21.3,0-38.6,17.3-38.6,38.6c0,7.5,6,13.5,13.5,13.5s13.5-6,13.5-13.5c0-6.4,5.2-11.6,11.6-11.6h227 c6.4,0,11.6,5.2,11.6,11.6v325.7c0,6.4-5.2,11.6-11.6,11.6c-7.5,0-13.5,6-13.5,13.5s6,13.5,13.5,13.5c21.3,0,38.6-17.3,38.6-38.6 V38.6C439.65,17.3,422.35,0,401.05,0z"/></g></symbol><symbol id="search-icon" viewBox="0 0 512 512"><g><g><path d="M225.474,0C101.151,0,0,101.151,0,225.474c0,124.33,101.151,225.474,225.474,225.474 c124.33,0,225.474-101.144,225.474-225.474C450.948,101.151,349.804,0,225.474,0z M225.474,409.323 c-101.373,0-183.848-82.475-183.848-183.848S124.101,41.626,225.474,41.626s183.848,82.475,183.848,183.848 S326.847,409.323,225.474,409.323z"/></g></g><g><g><path d="M505.902,476.472L386.574,357.144c-8.131-8.131-21.299-8.131-29.43,0c-8.131,8.124-8.131,21.306,0,29.43l119.328,119.328 c4.065,4.065,9.387,6.098,14.715,6.098c5.321,0,10.649-2.033,14.715-6.098C514.033,497.778,514.033,484.596,505.902,476.472z"/></g></g></symbol><symbol id="font-size-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M11.246 15H4.754l-2 5H.6L7 4h2l6.4 16h-2.154l-2-5zm-.8-2L8 6.885 5.554 13h4.892zM21 12.535V12h2v8h-2v-.535a4 4 0 1 1 0-6.93zM19 18a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"/></symbol><symbol id="add-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M11 11V5h2v6h6v2h-6v6h-2v-6H5v-2z"/></symbol><symbol id="minus-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M5 11h14v2H5z"/></symbol><symbol id="dark-theme-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M10 7a7 7 0 0 0 12 4.9v.1c0 5.523-4.477 10-10 10S2 17.523 2 12 6.477 2 12 2h.1A6.979 6.979 0 0 0 10 7zm-6 5a8 8 0 0 0 15.062 3.762A9 9 0 0 1 8.238 4.938 7.999 7.999 0 0 0 4 12z"/></symbol><symbol id="light-theme-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 18a6 6 0 1 1 0-12 6 6 0 0 1 0 12zm0-2a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM11 1h2v3h-2V1zm0 19h2v3h-2v-3zM3.515 4.929l1.414-1.414L7.05 5.636 5.636 7.05 3.515 4.93zM16.95 18.364l1.414-1.414 2.121 2.121-1.414 1.414-2.121-2.121zm2.121-14.85l1.414 1.415-2.121 2.121-1.414-1.414 2.121-2.121zM5.636 16.95l1.414 1.414-2.121 2.121-1.414-1.414 2.121-2.121zM23 11v2h-3v-2h3zM4 11v2H1v-2h3z"/></symbol><symbol id="reset-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M18.537 19.567A9.961 9.961 0 0 1 12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10c0 2.136-.67 4.116-1.81 5.74L17 12h3a8 8 0 1 0-2.46 5.772l.997 1.795z"/></symbol><symbol id="down-icon" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M12.7803 6.21967C13.0732 6.51256 13.0732 6.98744 12.7803 7.28033L8.53033 11.5303C8.23744 11.8232 7.76256 11.8232 7.46967 11.5303L3.21967 7.28033C2.92678 6.98744 2.92678 6.51256 3.21967 6.21967C3.51256 5.92678 3.98744 5.92678 4.28033 6.21967L8 9.93934L11.7197 6.21967C12.0126 5.92678 12.4874 5.92678 12.7803 6.21967Z"></path></symbol><symbol id="codepen-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M16.5 13.202L13 15.535v3.596L19.197 15 16.5 13.202zM14.697 12L12 10.202 9.303 12 12 13.798 14.697 12zM20 10.869L18.303 12 20 13.131V10.87zM19.197 9L13 4.869v3.596l3.5 2.333L19.197 9zM7.5 10.798L11 8.465V4.869L4.803 9 7.5 10.798zM4.803 15L11 19.131v-3.596l-3.5-2.333L4.803 15zM4 13.131L5.697 12 4 10.869v2.262zM2 9a1 1 0 0 1 .445-.832l9-6a1 1 0 0 1 1.11 0l9 6A1 1 0 0 1 22 9v6a1 1 0 0 1-.445.832l-9 6a1 1 0 0 1-1.11 0l-9-6A1 1 0 0 1 2 15V9z"/></symbol><symbol id="close-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 10.586l4.95-4.95 1.414 1.414-4.95 4.95 4.95 4.95-1.414 1.414-4.95-4.95-4.95 4.95-1.414-1.414 4.95-4.95-4.95-4.95L7.05 5.636z"/></symbol><symbol id="menu-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M3 4h18v2H3V4zm0 7h18v2H3v-2zm0 7h18v2H3v-2z"/></symbol></defs></svg></head><body data-theme="light"><div class="sidebar-container"><div class="sidebar" id="sidebar"><a href="/" class="sidebar-title sidebar-title-anchor">Dobo API</a><div class="sidebar-items-container"><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-classes"><div>Classes</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="Dobo.html">Dobo</a></div><div class="sidebar-section-children"><a href="DoboAction.html">DoboAction</a></div><div class="sidebar-section-children"><a href="DoboAdapter.html">DoboAdapter</a></div><div class="sidebar-section-children"><a href="DoboConnection.html">DoboConnection</a></div><div class="sidebar-section-children"><a href="DoboFeature.html">DoboFeature</a></div><div class="sidebar-section-children"><a href="DoboModel.html">DoboModel</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-modules"><div>Modules</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="module-Helper.html">Helper</a></div><div class="sidebar-section-children"><a href="module-Helper_Model.html">Helper/Model</a></div><div class="sidebar-section-children"><a href="module-Hook.html">Hook</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-externals"><div>Externals</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="external-Tools.html">Tools</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-global"><div>Global</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="global.html#actionFactory">actionFactory</a></div><div class="sidebar-section-children"><a href="global.html#adapterFactory">adapterFactory</a></div><div class="sidebar-section-children"><a href="global.html#connectionFactory">connectionFactory</a></div><div class="sidebar-section-children"><a href="global.html#featureFactory">featureFactory</a></div><div class="sidebar-section-children"><a href="global.html#modelFactory">modelFactory</a></div><div class="sidebar-section-children"><a href="global.html#pluginFactory">pluginFactory</a></div></div></div></div></div><div class="navbar-container" id="VuAckcnZhf"><nav class="navbar"><div class="navbar-left-items"><div class="navbar-item"><a id="" href="https://www.npmjs.com/package/dobo" target="">NPM</a></div><div class="navbar-item"><a id="" href="https://github.com/ardhi/dobo" target="">Github</a></div><div class="navbar-item"><a id="" href="https://dobo.bajo.app/" target="">Dobo</a></div><div class="navbar-item"><a id="" href="https://bajo.app/" target="">Bajo</a></div></div><div class="navbar-right-items"><div class="navbar-right-item"><button class="icon-button search-button" aria-label="open-search"><svg><use xlink:href="#search-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button theme-toggle" aria-label="toggle-theme"><svg><use class="theme-svg-use" xlink:href="#dark-theme-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button font-size" aria-label="change-font-size"><svg><use xlink:href="#font-size-icon"></use></svg></button></div></div><nav></nav></nav></div><div class="toc-container"><div class="toc-content"><span class="bold">On this page</span><div id="eed4d2a0bfd64539bb9df78095dec881"></div></div></div><div class="body-wrapper"><div class="main-content"><div class="main-wrapper"><section id="source-page" class="source-page"><header><h1 id="title" class="has-anchor">lib_factory_model_build.js</h1></header><article><pre class="prettyprint source lang-js"><code>import { getFilterAndOptions, execHook, execModelHook } from './helper.js'
4
+ const action = 'build'
5
+
6
+ /**
7
+ * Build a model's definition based on its properties and rules.
8
+ *
9
+ * @async
10
+ * @memberof DoboModel
11
+ * @method
12
+ * @param {DoboModel.TOptions} opts - The options for building the model
13
+ * @returns {DoboModel.TResultRecord|DoboModel.TRecord}
14
+ */
15
+ async function build (opts = {}) {
16
+ opts.dataOnly = opts.dataOnly ?? true
17
+ const { dataOnly } = opts
18
+ const { options } = await getFilterAndOptions.call(this, null, opts, action)
19
+ await execHook.call(this, 'beforeBuildModel', options)
20
+ await execModelHook.call(this, 'beforeBuildModel', options)
21
+ const result = (await this.adapter._buildModel(this, options)) ?? {}
22
+ await execModelHook.call(this, 'afterBuildModel', result, options)
23
+ await execHook.call(this, 'afterBuildModel', result, options)
24
+ return dataOnly ? result.data : result
25
+ }
26
+
27
+ export default build
28
+ </code></pre></article></section></div></div></div><div class="search-container" id="PkfLWpAbet" style="display:none"><div class="wrapper" id="iCxFxjkHbP"><button class="icon-button search-close-button" id="VjLlGakifb" aria-label="close search"><svg><use xlink:href="#close-icon"></use></svg></button><div class="search-box-c"><svg><use xlink:href="#search-icon"></use></svg> <input type="text" id="vpcKVYIppa" class="search-input" placeholder="Search..." autofocus></div><div class="search-result-c" id="fWwVHRuDuN"><span class="search-result-c-text">Type anything to view search result</span></div></div></div><div class="mobile-menu-icon-container"><button class="icon-button" id="mobile-menu" data-isopen="false" aria-label="menu"><svg><use xlink:href="#menu-icon"></use></svg></button></div><div id="mobile-sidebar" class="mobile-sidebar-container"><div class="mobile-sidebar-wrapper"><a href="/" class="sidebar-title sidebar-title-anchor">Dobo API</a><div class="mobile-nav-links"><div class="navbar-item"><a id="" href="https://www.npmjs.com/package/dobo" target="">NPM</a></div><div class="navbar-item"><a id="" href="https://github.com/ardhi/dobo" target="">Github</a></div><div class="navbar-item"><a id="" href="https://dobo.bajo.app/" target="">Dobo</a></div><div class="navbar-item"><a id="" href="https://bajo.app/" target="">Bajo</a></div></div><div class="mobile-sidebar-items-c"><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-classes"><div>Classes</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="Dobo.html">Dobo</a></div><div class="sidebar-section-children"><a href="DoboAction.html">DoboAction</a></div><div class="sidebar-section-children"><a href="DoboAdapter.html">DoboAdapter</a></div><div class="sidebar-section-children"><a href="DoboConnection.html">DoboConnection</a></div><div class="sidebar-section-children"><a href="DoboFeature.html">DoboFeature</a></div><div class="sidebar-section-children"><a href="DoboModel.html">DoboModel</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-modules"><div>Modules</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="module-Helper.html">Helper</a></div><div class="sidebar-section-children"><a href="module-Helper_Model.html">Helper/Model</a></div><div class="sidebar-section-children"><a href="module-Hook.html">Hook</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-externals"><div>Externals</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="external-Tools.html">Tools</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-global"><div>Global</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="global.html#actionFactory">actionFactory</a></div><div class="sidebar-section-children"><a href="global.html#adapterFactory">adapterFactory</a></div><div class="sidebar-section-children"><a href="global.html#connectionFactory">connectionFactory</a></div><div class="sidebar-section-children"><a href="global.html#featureFactory">featureFactory</a></div><div class="sidebar-section-children"><a href="global.html#modelFactory">modelFactory</a></div><div class="sidebar-section-children"><a href="global.html#pluginFactory">pluginFactory</a></div></div></div><div class="mobile-navbar-actions"><div class="navbar-right-item"><button class="icon-button search-button" aria-label="open-search"><svg><use xlink:href="#search-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button theme-toggle" aria-label="toggle-theme"><svg><use class="theme-svg-use" xlink:href="#dark-theme-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button font-size" aria-label="change-font-size"><svg><use xlink:href="#font-size-icon"></use></svg></button></div></div></div></div><script type="text/javascript" src="scripts/core.min.js"></script><script src="scripts/search.min.js" defer="defer"></script><script src="scripts/third-party/fuse.js" defer="defer"></script><script type="text/javascript">var tocbotInstance=tocbot.init({tocSelector:"#eed4d2a0bfd64539bb9df78095dec881",contentSelector:".main-content",headingSelector:"h1, h2, h3",hasInnerContainers:!0,scrollContainer:".main-content",headingsOffset:130,onClick:bringLinkToView})</script></body></html>