w-orm-reladb 1.1.5 → 1.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,255 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+
5
+ <meta charset="utf-8">
6
+ <title>importModels.mjs - Documentation</title>
7
+
8
+
9
+ <script src="scripts/prettify/prettify.js"></script>
10
+ <script src="scripts/prettify/lang-css.js"></script>
11
+ <!--[if lt IE 9]>
12
+ <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
13
+ <![endif]-->
14
+ <link type="text/css" rel="stylesheet" href="styles/prettify.css">
15
+ <link type="text/css" rel="stylesheet" href="styles/jsdoc.css">
16
+ <script src="scripts/nav.js" defer></script>
17
+
18
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
19
+ </head>
20
+ <body>
21
+
22
+ <input type="checkbox" id="nav-trigger" class="nav-trigger" />
23
+ <label for="nav-trigger" class="navicon-button x">
24
+ <div class="navicon"></div>
25
+ </label>
26
+
27
+ <label for="nav-trigger" class="overlay"></label>
28
+
29
+ <nav >
30
+
31
+
32
+ <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WOrmReladb.html">WOrmReladb</a><ul class='methods'><li data-type='method'><a href="WOrmReladb.html#.closeSequelize">closeSequelize</a></li><li data-type='method'><a href="WOrmReladb.html#.createStorage">createStorage</a></li><li data-type='method'><a href="WOrmReladb.html#.del">del</a></li><li data-type='method'><a href="WOrmReladb.html#.delAll">delAll</a></li><li data-type='method'><a href="WOrmReladb.html#.genModelsByDB">genModelsByDB</a></li><li data-type='method'><a href="WOrmReladb.html#.genModelsByTabs">genModelsByTabs</a></li><li data-type='method'><a href="WOrmReladb.html#.genTransaction">genTransaction</a></li><li data-type='method'><a href="WOrmReladb.html#.initSequelize">initSequelize</a></li><li data-type='method'><a href="WOrmReladb.html#.insert">insert</a></li><li data-type='method'><a href="WOrmReladb.html#.insertBulk">insertBulk</a></li><li data-type='method'><a href="WOrmReladb.html#.save">save</a></li><li data-type='method'><a href="WOrmReladb.html#.select">select</a></li><li data-type='method'><a href="WOrmReladb.html#.selectByPk">selectByPk</a></li></ul></li></ul><h3>Global</h3><ul><li><a href="global.html#cvFind">cvFind</a></li><li><a href="global.html#getColKind">getColKind</a></li><li><a href="global.html#getColScale">getColScale</a></li><li><a href="global.html#importModels">importModels</a></li><li><a href="global.html#isKindOk">isKindOk</a></li><li><a href="global.html#normPk">normPk</a></li></ul>
33
+
34
+ </nav>
35
+
36
+ <div id="main">
37
+
38
+ <h1 class="page-title">importModels.mjs</h1>
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+ <section>
47
+ <article>
48
+ <pre class="prettyprint source linenums"><code>import fs from 'fs'
49
+ import path from 'path'
50
+ import JSON5 from 'json5'
51
+ import Sequelize from 'sequelize'
52
+ import each from 'lodash-es/each.js'
53
+ import get from 'lodash-es/get.js'
54
+ import isBoolean from 'lodash-es/isBoolean.js'
55
+ import genPm from 'wsemi/src/genPm.mjs'
56
+ import requireModel from './requireModel.js'
57
+
58
+
59
+ //匯入資料表設定檔(models)
60
+ //
61
+ //model內之id欄位須為主鍵, 否則sequelize拒絕匯入(model.js: A column called 'id' was added ... but not marked with 'primaryKey: true')
62
+ //原版以modifyModel於[每一次]匯入時無條件重寫呼叫端之model原始檔(逐行trim、刪空行並改為LF)以補上主鍵設定,
63
+ //而本套件每次操作(含select、selectByPk)皆匯入一次, 故讀取函數亦改變可被觀察之狀態(規格T9),
64
+ //且多行程併發時一方正截斷檔案而另一方讀取, 即讀到空內容並寫回空檔而[永久損毀](已實機重現: 4行程併發, 4/4輪model檔被截為0位元組)
65
+ //
66
+ //本版改於記憶體內補上主鍵設定, 一律不寫model檔:
67
+ // js格式於呼叫model之定義函數期間暫時包裝sequelize.define, 於定義前補上id之primaryKey
68
+ // json格式於解析後、define前補上
69
+
70
+
71
+ /**
72
+ * 令欄位定義之id為主鍵, 不改動傳入之物件
73
+ * 註: 僅於model完全沒有主鍵設定而有id欄時補上(sequelize於此情形拒絕匯入);
74
+ * model已有其他主鍵時不改動, 否則成為(既有主鍵, id)之複合主鍵而使主鍵去重失效(原版modifyModel有此缺陷)
75
+ *
76
+ * @ignore
77
+ * @param {Object} attrs 輸入欄位定義物件
78
+ * @returns {Object} 回傳欄位定義物件
79
+ */
80
+ function patchIdPk(attrs) {
81
+
82
+ //check
83
+ if (!attrs || !Object.prototype.hasOwnProperty.call(attrs, 'id')) {
84
+ return attrs
85
+ }
86
+
87
+ //check, 已有任一主鍵設定者不改動
88
+ let hasPk = Object.keys(attrs).some((k) => get(attrs[k], 'primaryKey') === true)
89
+ if (hasPk) {
90
+ return attrs
91
+ }
92
+
93
+ //id
94
+ let id = attrs.id
95
+
96
+ //idNew, id可為欄位設定物件或直接為型別
97
+ let idNew = Object.prototype.toString.call(id) === '[object Object]' &amp;&amp; get(id, 'type') !== undefined
98
+ ? { ...id, primaryKey: true }
99
+ : { type: id, primaryKey: true }
100
+
101
+ return { ...attrs, id: idNew }
102
+ }
103
+
104
+
105
+ /**
106
+ * 讀取js格式之model
107
+ * 註: 於呼叫model之定義函數期間暫時以實例自有屬性包裝define, 結束後刪除該屬性即回復原型上之define
108
+ *
109
+ * @ignore
110
+ */
111
+ function readJsModel(fn, sequelize) {
112
+ let define = sequelize.define
113
+ sequelize.define = function(name, attrs, options) {
114
+ return define.call(sequelize, name, patchIdPk(attrs), options)
115
+ }
116
+ try {
117
+ return requireModel(fn, sequelize, Sequelize.DataTypes)
118
+ }
119
+ finally {
120
+ delete sequelize.define
121
+ }
122
+ }
123
+
124
+
125
+ /**
126
+ * 讀取json格式之model
127
+ *
128
+ * @ignore
129
+ */
130
+ function readJsonModel(fn, sequelize) {
131
+
132
+ //s
133
+ let j = fs.readFileSync(fn, 'utf8')
134
+ let s = JSON5.parse(j)
135
+
136
+ //抽換DataTypes, 例如將'DataTypes.TEXT'改為DataTypes.TEXT
137
+ each(s.fields, (v) => {
138
+ v.type = get(Sequelize, v.type, null)
139
+ })
140
+
141
+ //model, 使用define產生model, 定義前於記憶體內補上id之主鍵設定
142
+ let model = sequelize.define(s.table, patchIdPk(s.fields), s.options)
143
+
144
+ return model
145
+ }
146
+
147
+
148
+ /**
149
+ * 匯入資料表設定檔
150
+ *
151
+ * 註: 不寫入model檔, id之主鍵設定於記憶體內補上
152
+ *
153
+ * @param {String} fdModels 輸入models所在資料夾字串
154
+ * @param {Object} sequelize 輸入sequelize實例
155
+ * @param {String} name 輸入資料表名稱字串
156
+ * @param {Object} [opt={}] 輸入設定物件
157
+ * @param {String} [opt.type='js'] 輸入資料表設定檔類型字串,可有'js'、'json'
158
+ * @param {Boolean} [opt.sync=false] 輸入是否將models資料同步至資料庫
159
+ * @returns {Promise} 回傳Promise,resolve回傳models物件,reject回傳錯誤訊息
160
+ */
161
+ async function importModels(fdModels, sequelize, name, opt = {}) {
162
+
163
+ //type
164
+ let type = get(opt, 'type')
165
+ if (type !== 'js' &amp;&amp; type !== 'json') {
166
+ type = 'js'
167
+ }
168
+
169
+ //sync
170
+ let sync = get(opt, 'sync')
171
+ if (!isBoolean(sync)) {
172
+ sync = false
173
+ }
174
+
175
+ //pm
176
+ let pm = genPm()
177
+
178
+ //file
179
+ let file = `${name}.${type}`
180
+
181
+ //fparent
182
+ let fparent = path.resolve(fdModels) + path.sep
183
+
184
+ //fn
185
+ let fn = fparent + file
186
+
187
+ //import
188
+ let model
189
+ try {
190
+ if (type === 'js') {
191
+ model = readJsModel(fn, sequelize)
192
+ }
193
+ else if (type === 'json') {
194
+ model = readJsonModel(fn, sequelize)
195
+ }
196
+ }
197
+ catch (err) {
198
+ pm.reject(err)
199
+ return pm
200
+ }
201
+
202
+ //sync
203
+ try {
204
+ if (sync) {
205
+ await model.sync() //{ force: true }
206
+ }
207
+ }
208
+ catch (err) {
209
+ pm.reject(err)
210
+ return pm
211
+ }
212
+
213
+ //models
214
+ let models = {}
215
+ try {
216
+ models[model.name] = model
217
+ }
218
+ catch (err) {
219
+ pm.reject(err)
220
+ return pm
221
+ }
222
+
223
+ //resolve
224
+ pm.resolve(models)
225
+
226
+ return pm
227
+ }
228
+
229
+
230
+ export default importModels
231
+ </code></pre>
232
+ </article>
233
+ </section>
234
+
235
+
236
+
237
+
238
+
239
+
240
+ </div>
241
+
242
+ <br class="clear">
243
+
244
+ <footer>
245
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Oct 16 2026 13:47:09 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
246
+ </footer>
247
+
248
+ <script>prettyPrint();</script>
249
+ <script src="scripts/polyfill.js"></script>
250
+ <script src="scripts/linenumber.js"></script>
251
+
252
+
253
+
254
+ </body>
255
+ </html>
package/docs/index.html CHANGED
@@ -29,7 +29,7 @@
29
29
  <nav >
30
30
 
31
31
 
32
- <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WOrmReladb.html">WOrmReladb</a><ul class='methods'><li data-type='method'><a href="WOrmReladb.html#.closeSequelize">closeSequelize</a></li><li data-type='method'><a href="WOrmReladb.html#.createStorage">createStorage</a></li><li data-type='method'><a href="WOrmReladb.html#.del">del</a></li><li data-type='method'><a href="WOrmReladb.html#.delAll">delAll</a></li><li data-type='method'><a href="WOrmReladb.html#.genModelsByDB">genModelsByDB</a></li><li data-type='method'><a href="WOrmReladb.html#.genModelsByTabs">genModelsByTabs</a></li><li data-type='method'><a href="WOrmReladb.html#.genTransaction">genTransaction</a></li><li data-type='method'><a href="WOrmReladb.html#.initSequelize">initSequelize</a></li><li data-type='method'><a href="WOrmReladb.html#.insert">insert</a></li><li data-type='method'><a href="WOrmReladb.html#.insertBulk">insertBulk</a></li><li data-type='method'><a href="WOrmReladb.html#.save">save</a></li><li data-type='method'><a href="WOrmReladb.html#.select">select</a></li><li data-type='method'><a href="WOrmReladb.html#.selectByPk">selectByPk</a></li></ul></li></ul>
32
+ <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WOrmReladb.html">WOrmReladb</a><ul class='methods'><li data-type='method'><a href="WOrmReladb.html#.closeSequelize">closeSequelize</a></li><li data-type='method'><a href="WOrmReladb.html#.createStorage">createStorage</a></li><li data-type='method'><a href="WOrmReladb.html#.del">del</a></li><li data-type='method'><a href="WOrmReladb.html#.delAll">delAll</a></li><li data-type='method'><a href="WOrmReladb.html#.genModelsByDB">genModelsByDB</a></li><li data-type='method'><a href="WOrmReladb.html#.genModelsByTabs">genModelsByTabs</a></li><li data-type='method'><a href="WOrmReladb.html#.genTransaction">genTransaction</a></li><li data-type='method'><a href="WOrmReladb.html#.initSequelize">initSequelize</a></li><li data-type='method'><a href="WOrmReladb.html#.insert">insert</a></li><li data-type='method'><a href="WOrmReladb.html#.insertBulk">insertBulk</a></li><li data-type='method'><a href="WOrmReladb.html#.save">save</a></li><li data-type='method'><a href="WOrmReladb.html#.select">select</a></li><li data-type='method'><a href="WOrmReladb.html#.selectByPk">selectByPk</a></li></ul></li></ul><h3>Global</h3><ul><li><a href="global.html#cvFind">cvFind</a></li><li><a href="global.html#getColKind">getColKind</a></li><li><a href="global.html#getColScale">getColScale</a></li><li><a href="global.html#importModels">importModels</a></li><li><a href="global.html#isKindOk">isKindOk</a></li><li><a href="global.html#normPk">normPk</a></li></ul>
33
33
 
34
34
  </nav>
35
35
 
@@ -71,7 +71,7 @@
71
71
  <br class="clear">
72
72
 
73
73
  <footer>
74
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Sat Oct 10 2026 23:54:28 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
74
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Oct 16 2026 13:47:09 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
75
75
  </footer>
76
76
 
77
77
  <script>prettyPrint();</script>
package/g-mssql.mjs CHANGED
@@ -134,7 +134,7 @@ async function test() {
134
134
 
135
135
 
136
136
  //select by regex
137
- let sr = await w.select({ name: { $regex: 'PeT', $options: '$i' } })
137
+ let sr = await w.select({ name: { $regex: 'PeT', $options: 'i' } })
138
138
  console.log('selectReg', sr)
139
139
 
140
140
 
@@ -149,7 +149,7 @@ async function test() {
149
149
 
150
150
 
151
151
  //select by regex
152
- let sr = await w.select({ name: { $regex: 'PeT', $options: '$i' } })
152
+ let sr = await w.select({ name: { $regex: 'PeT', $options: 'i' } })
153
153
  console.log('selectReg', sr)
154
154
 
155
155
 
package/g-sqlite.mjs CHANGED
@@ -142,7 +142,7 @@ async function test() {
142
142
 
143
143
 
144
144
  //select by regex
145
- let sr = await w.select({ name: { $regex: 'PeT', $options: '$i' } })
145
+ let sr = await w.select({ name: { $regex: 'PeT', $options: 'i' } })
146
146
  console.log('selectReg', sr)
147
147
 
148
148
 
@@ -0,0 +1,74 @@
1
+ /* jshint indent: 1 */
2
+ module.exports = function(sequelize, DataTypes) {
3
+ return sequelize.define('tcond', {
4
+ 'id': {
5
+ type: DataTypes.STRING,
6
+ allowNull: false,
7
+ primaryKey: true,
8
+ autoIncrement: false,
9
+ comment: null
10
+ },
11
+ 's': {
12
+ type: DataTypes.STRING,
13
+ allowNull: true,
14
+ autoIncrement: false,
15
+ comment: null
16
+ },
17
+ 't': {
18
+ type: DataTypes.TEXT,
19
+ allowNull: true,
20
+ autoIncrement: false,
21
+ comment: null
22
+ },
23
+ 'i': {
24
+ type: DataTypes.INTEGER,
25
+ allowNull: true,
26
+ autoIncrement: false,
27
+ comment: null
28
+ },
29
+ 'f': {
30
+ type: DataTypes.FLOAT,
31
+ allowNull: true,
32
+ autoIncrement: false,
33
+ comment: null
34
+ },
35
+ 'p': {
36
+ type: DataTypes.DOUBLE,
37
+ allowNull: true,
38
+ autoIncrement: false,
39
+ comment: null
40
+ },
41
+ 'dec': {
42
+ type: DataTypes.DECIMAL(10, 2),
43
+ allowNull: true,
44
+ autoIncrement: false,
45
+ comment: null
46
+ },
47
+ 'b': {
48
+ type: DataTypes.BOOLEAN,
49
+ allowNull: true,
50
+ autoIncrement: false,
51
+ comment: null
52
+ },
53
+ 'd': {
54
+ type: DataTypes.DATE,
55
+ allowNull: true,
56
+ autoIncrement: false,
57
+ comment: null
58
+ },
59
+ 'length': {
60
+ type: DataTypes.INTEGER,
61
+ allowNull: true,
62
+ autoIncrement: false,
63
+ comment: null
64
+ },
65
+ 'p$x': {
66
+ type: DataTypes.STRING,
67
+ allowNull: true,
68
+ autoIncrement: false,
69
+ comment: null
70
+ }
71
+ }, {
72
+ tableName: 'tcond'
73
+ });
74
+ };
@@ -0,0 +1,20 @@
1
+ /* jshint indent: 1 */
2
+ module.exports = function(sequelize, DataTypes) {
3
+ return sequelize.define('tpkdec', {
4
+ 'id': {
5
+ type: DataTypes.DECIMAL(10, 2),
6
+ allowNull: false,
7
+ primaryKey: true,
8
+ autoIncrement: false,
9
+ comment: null
10
+ },
11
+ 'name': {
12
+ type: DataTypes.TEXT,
13
+ allowNull: true,
14
+ autoIncrement: false,
15
+ comment: null
16
+ }
17
+ }, {
18
+ tableName: 'tpkdec'
19
+ });
20
+ };
@@ -0,0 +1,20 @@
1
+ /* jshint indent: 1 */
2
+ module.exports = function(sequelize, DataTypes) {
3
+ return sequelize.define('tpkint', {
4
+ 'id': {
5
+ type: DataTypes.INTEGER,
6
+ allowNull: false,
7
+ primaryKey: true,
8
+ autoIncrement: false,
9
+ comment: null
10
+ },
11
+ 'name': {
12
+ type: DataTypes.TEXT,
13
+ allowNull: true,
14
+ autoIncrement: false,
15
+ comment: null
16
+ }
17
+ }, {
18
+ tableName: 'tpkint'
19
+ });
20
+ };
package/package.json CHANGED
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "name": "w-orm-reladb",
3
- "version": "1.1.5",
3
+ "version": "1.1.7",
4
4
  "main": "dist/w-orm-reladb.umd.js",
5
5
  "dependencies": {
6
6
  "json5": "^2.2.3",
7
7
  "sqlite3": "^6.0.1",
8
8
  "tedious": "^19.2.2",
9
- "w-auto-sequelize": "^1.0.47",
10
- "wsemi": "^1.9.11"
9
+ "w-auto-sequelize": "^1.0.48",
10
+ "wsemi": "^1.9.16"
11
11
  },
12
12
  "dependenciesTemp": {
13
13
  "@journeyapps/sqlcipher": "^5.3.1",
14
14
  "msg": "install sqlcipher fo the protection when db=sqlite"
15
15
  },
16
16
  "devDependencies": {
17
- "w-package-tools": "^1.1.16"
17
+ "w-package-tools": "^1.1.18"
18
18
  },
19
19
  "scripts": {
20
20
  "test": "mocha --parallel \"test/*.test.mjs\" --timeout 180000",