locize-cli 11.0.0 → 12.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 (108) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/LICENSE +1 -1
  3. package/README.md +1 -0
  4. package/dist/cjs/add.js +90 -0
  5. package/{bin/locize → dist/cjs/cli.js} +390 -670
  6. package/dist/cjs/combineSubkeyPreprocessor.js +155 -0
  7. package/dist/cjs/convertToDesiredFormat.js +205 -0
  8. package/dist/cjs/convertToFlatFormat.js +231 -0
  9. package/dist/cjs/copyVersion.js +60 -0
  10. package/dist/cjs/createBranch.js +59 -0
  11. package/dist/cjs/deleteBranch.js +89 -0
  12. package/dist/cjs/deleteNamespace.js +37 -0
  13. package/dist/cjs/download.js +376 -0
  14. package/dist/cjs/filterNamespaces.js +13 -0
  15. package/dist/cjs/format.js +156 -0
  16. package/dist/cjs/formats.js +33 -0
  17. package/dist/cjs/get.js +66 -0
  18. package/dist/cjs/getBranches.js +37 -0
  19. package/dist/cjs/getJob.js +37 -0
  20. package/dist/cjs/getProjectStats.js +37 -0
  21. package/dist/cjs/getRemoteLanguages.js +38 -0
  22. package/dist/cjs/getRemoteNamespace.js +125 -0
  23. package/dist/cjs/index.js +37 -0
  24. package/dist/cjs/isValidUuid.js +6 -0
  25. package/dist/cjs/lngs.js +215 -0
  26. package/dist/cjs/mapLimit.js +22 -0
  27. package/dist/cjs/mergeBranch.js +80 -0
  28. package/dist/cjs/migrate.js +239 -0
  29. package/dist/cjs/missing.js +162 -0
  30. package/dist/cjs/package.json +5 -0
  31. package/{parseLocalLanguage.js → dist/cjs/parseLocalLanguage.js} +135 -142
  32. package/dist/cjs/parseLocalLanguages.js +18 -0
  33. package/dist/cjs/parseLocalReference.js +11 -0
  34. package/dist/cjs/publishVersion.js +42 -0
  35. package/dist/cjs/removeUndefinedFromArrays.js +19 -0
  36. package/dist/cjs/removeVersion.js +42 -0
  37. package/dist/cjs/request.js +66 -0
  38. package/dist/cjs/shouldUnflatten.js +21 -0
  39. package/dist/cjs/sortFlatResources.js +13 -0
  40. package/dist/cjs/sync.js +772 -0
  41. package/dist/cjs/unflatten.js +81 -0
  42. package/dist/esm/add.js +88 -0
  43. package/dist/esm/cli.js +1020 -0
  44. package/{combineSubkeyPreprocessor.js → dist/esm/combineSubkeyPreprocessor.js} +70 -73
  45. package/dist/esm/convertToDesiredFormat.js +203 -0
  46. package/dist/esm/convertToFlatFormat.js +229 -0
  47. package/dist/esm/copyVersion.js +58 -0
  48. package/dist/esm/createBranch.js +57 -0
  49. package/dist/esm/deleteBranch.js +87 -0
  50. package/dist/esm/deleteNamespace.js +35 -0
  51. package/dist/esm/download.js +374 -0
  52. package/{filterNamespaces.js → dist/esm/filterNamespaces.js} +4 -4
  53. package/dist/esm/format.js +154 -0
  54. package/{formats.js → dist/esm/formats.js} +7 -11
  55. package/dist/esm/get.js +64 -0
  56. package/dist/esm/getBranches.js +35 -0
  57. package/dist/esm/getJob.js +35 -0
  58. package/dist/esm/getProjectStats.js +35 -0
  59. package/dist/esm/getRemoteLanguages.js +36 -0
  60. package/dist/esm/getRemoteNamespace.js +123 -0
  61. package/dist/esm/index.js +16 -0
  62. package/dist/esm/isValidUuid.js +4 -0
  63. package/dist/esm/lngs.js +213 -0
  64. package/dist/esm/mapLimit.js +20 -0
  65. package/dist/esm/mergeBranch.js +78 -0
  66. package/dist/esm/migrate.js +237 -0
  67. package/dist/esm/missing.js +160 -0
  68. package/dist/esm/parseLocalLanguage.js +194 -0
  69. package/dist/esm/parseLocalLanguages.js +16 -0
  70. package/dist/esm/parseLocalReference.js +9 -0
  71. package/dist/esm/publishVersion.js +40 -0
  72. package/{removeUndefinedFromArrays.js → dist/esm/removeUndefinedFromArrays.js} +5 -5
  73. package/dist/esm/removeVersion.js +40 -0
  74. package/dist/esm/request.js +64 -0
  75. package/{shouldUnflatten.js → dist/esm/shouldUnflatten.js} +7 -7
  76. package/dist/esm/sortFlatResources.js +11 -0
  77. package/dist/esm/sync.js +770 -0
  78. package/{unflatten.js → dist/esm/unflatten.js} +36 -34
  79. package/package.json +39 -18
  80. package/rollup.config.js +57 -0
  81. package/add.js +0 -105
  82. package/convertToDesiredFormat.js +0 -268
  83. package/convertToFlatFormat.js +0 -322
  84. package/copyVersion.js +0 -69
  85. package/createBranch.js +0 -61
  86. package/deleteBranch.js +0 -97
  87. package/deleteNamespace.js +0 -39
  88. package/download.js +0 -516
  89. package/format.js +0 -206
  90. package/get.js +0 -81
  91. package/getBranches.js +0 -40
  92. package/getJob.js +0 -40
  93. package/getProjectStats.js +0 -40
  94. package/getRemoteLanguages.js +0 -40
  95. package/getRemoteNamespace.js +0 -122
  96. package/index.js +0 -9
  97. package/isValidUuid.js +0 -2
  98. package/lngs.json +0 -211
  99. package/mergeBranch.js +0 -102
  100. package/migrate.js +0 -314
  101. package/missing.js +0 -169
  102. package/parseLocalLanguages.js +0 -22
  103. package/parseLocalReference.js +0 -10
  104. package/publishVersion.js +0 -64
  105. package/removeVersion.js +0 -64
  106. package/request.js +0 -64
  107. package/sortFlatResources.js +0 -9
  108. package/sync.js +0 -786
package/lngs.json DELETED
@@ -1,211 +0,0 @@
1
- [
2
- "dev",
3
- "ach",
4
- "arn",
5
- "ast",
6
- "cgg",
7
- "csb",
8
- "dz",
9
- "es_ar",
10
- "es-ar",
11
- "fil",
12
- "fur",
13
- "gun",
14
- "jbo",
15
- "mai",
16
- "mfe",
17
- "mnk",
18
- "nah",
19
- "nap",
20
- "nso",
21
- "pap",
22
- "pms",
23
- "pt_br",
24
- "pt-br",
25
- "sah",
26
- "sco",
27
- "son",
28
- "ab",
29
- "aa",
30
- "af",
31
- "ak",
32
- "sq",
33
- "am",
34
- "ar",
35
- "an",
36
- "hy",
37
- "as",
38
- "av",
39
- "ae",
40
- "ay",
41
- "az",
42
- "bm",
43
- "ba",
44
- "eu",
45
- "be",
46
- "bn",
47
- "bh",
48
- "bi",
49
- "bs",
50
- "br",
51
- "bg",
52
- "my",
53
- "ca",
54
- "ch",
55
- "ce",
56
- "ny",
57
- "zh",
58
- "cv",
59
- "kw",
60
- "co",
61
- "cr",
62
- "hr",
63
- "cs",
64
- "da",
65
- "dv",
66
- "nl",
67
- "en",
68
- "eo",
69
- "et",
70
- "ee",
71
- "fo",
72
- "fj",
73
- "fi",
74
- "fr",
75
- "ff",
76
- "gl",
77
- "ka",
78
- "de",
79
- "el",
80
- "gn",
81
- "gu",
82
- "ht",
83
- "ha",
84
- "he",
85
- "hz",
86
- "hi",
87
- "ho",
88
- "hu",
89
- "ia",
90
- "id",
91
- "ie",
92
- "ga",
93
- "ig",
94
- "ik",
95
- "io",
96
- "is",
97
- "it",
98
- "iu",
99
- "ja",
100
- "jv",
101
- "kl",
102
- "kn",
103
- "kr",
104
- "ks",
105
- "kk",
106
- "km",
107
- "ki",
108
- "rw",
109
- "ky",
110
- "kv",
111
- "kg",
112
- "ko",
113
- "ku",
114
- "ckb",
115
- "kj",
116
- "la",
117
- "lb",
118
- "lg",
119
- "li",
120
- "ln",
121
- "lo",
122
- "lt",
123
- "lu",
124
- "lv",
125
- "gv",
126
- "mk",
127
- "mg",
128
- "ms",
129
- "ml",
130
- "mt",
131
- "mi",
132
- "mr",
133
- "mh",
134
- "mn",
135
- "na",
136
- "nv",
137
- "nb",
138
- "nd",
139
- "ne",
140
- "ng",
141
- "nn",
142
- "no",
143
- "ii",
144
- "nr",
145
- "oc",
146
- "oj",
147
- "cu",
148
- "om",
149
- "or",
150
- "os",
151
- "pa",
152
- "pi",
153
- "fa",
154
- "pl",
155
- "ps",
156
- "pt",
157
- "qu",
158
- "rm",
159
- "rn",
160
- "ro",
161
- "ru",
162
- "sa",
163
- "sc",
164
- "sd",
165
- "se",
166
- "sm",
167
- "sg",
168
- "sr",
169
- "gd",
170
- "sn",
171
- "si",
172
- "sk",
173
- "sl",
174
- "so",
175
- "st",
176
- "es",
177
- "su",
178
- "sw",
179
- "ss",
180
- "sv",
181
- "ta",
182
- "te",
183
- "tg",
184
- "th",
185
- "ti",
186
- "bo",
187
- "tk",
188
- "tl",
189
- "tn",
190
- "to",
191
- "tr",
192
- "ts",
193
- "tt",
194
- "tw",
195
- "ty",
196
- "ug",
197
- "uk",
198
- "ur",
199
- "uz",
200
- "ve",
201
- "vi",
202
- "vo",
203
- "wa",
204
- "cy",
205
- "wo",
206
- "fy",
207
- "xh",
208
- "yi",
209
- "yo",
210
- "za"
211
- ]
package/mergeBranch.js DELETED
@@ -1,102 +0,0 @@
1
- const colors = require('colors')
2
- const request = require('./request')
3
- const getBranches = require('./getBranches')
4
- const isValidUuid = require('./isValidUuid')
5
- const getJob = require('./getJob')
6
-
7
- const mergeBranch = (opt, cb) => {
8
- const queryParams = new URLSearchParams()
9
- if (opt.delete) {
10
- queryParams.append('delete', 'true')
11
- }
12
- const queryString = queryParams.size > 0 ? '?' + queryParams.toString() : ''
13
- request(opt.apiEndpoint + '/branch/merge/' + opt.branch + queryString, {
14
- method: 'post',
15
- headers: {
16
- Authorization: opt.apiKey
17
- }
18
- }, (err, res, obj) => {
19
- if (err || (obj && (obj.errorMessage || obj.message))) {
20
- if (!cb) console.log(colors.red('merging branch failed...'))
21
-
22
- if (err) {
23
- if (!cb) { console.error(colors.red(err.message)); process.exit(1) }
24
- if (cb) cb(err)
25
- return
26
- }
27
- if (obj && (obj.errorMessage || obj.message)) {
28
- if (!cb) { console.error(colors.red((obj.errorMessage || obj.message))); process.exit(1) }
29
- if (cb) cb(new Error((obj.errorMessage || obj.message)))
30
- return
31
- }
32
- }
33
- if (res.status === 404) {
34
- if (!cb) { console.error(colors.yellow(res.statusText + ' (' + res.status + ')')); process.exit(1) }
35
- if (cb) cb(null, null)
36
- return
37
- }
38
- if (res.status >= 300) {
39
- if (!cb) { console.error(colors.red(res.statusText + ' (' + res.status + ')')); process.exit(1) }
40
- if (cb) cb(new Error(res.statusText + ' (' + res.status + ')'))
41
- return
42
- }
43
-
44
- if (!obj || !obj.jobId) {
45
- if (!cb) { console.error(colors.red('No jobId! Something went wrong!')); process.exit(1) }
46
- if (cb) cb(new Error('No jobId! Something went wrong!'))
47
- return
48
- }
49
-
50
- (function waitForJob () {
51
- getJob({
52
- apiEndpoint: opt.apiEndpoint,
53
- apiKey: opt.apiKey,
54
- projectId: opt.branch
55
- }, obj.jobId, (err, job) => {
56
- if (err) {
57
- if (!cb) { console.error(colors.red(err.message)); process.exit(1) }
58
- if (cb) cb(err)
59
- return
60
- }
61
-
62
- if (job && !job.timeouted) {
63
- setTimeout(waitForJob, 2000)
64
- return
65
- }
66
-
67
- if (job && job.timeouted) {
68
- if (!cb) { console.error(colors.red('Job timeouted!')); process.exit(1) }
69
- if (cb) cb(new Error('Job timeouted!'))
70
- return
71
- }
72
-
73
- if (!cb) console.log(colors.green('merging branch successful'))
74
- if (cb) cb(null)
75
- })
76
- })()
77
- })
78
- }
79
-
80
- const handleError = (err, cb) => {
81
- if (!cb && err) {
82
- console.error(colors.red(err.stack))
83
- process.exit(1)
84
- }
85
- if (cb) cb(err)
86
- }
87
-
88
- module.exports = (opt, cb) => {
89
- getBranches(opt, (err, branches) => {
90
- if (err) return handleError(err, cb)
91
-
92
- let b
93
- if (isValidUuid(opt.branch)) b = branches.find((br) => br.id === opt.branch)
94
- if (!b) b = branches.find((br) => br.name === opt.branch)
95
- if (!b) {
96
- return handleError(new Error(`Branch ${opt.branch} not found!`), cb)
97
- }
98
- opt.branch = b.id
99
-
100
- mergeBranch(opt, cb)
101
- })
102
- }
package/migrate.js DELETED
@@ -1,314 +0,0 @@
1
- const fs = require('fs')
2
- const path = require('path')
3
- const flatten = require('flat')
4
- const async = require('async')
5
- const colors = require('colors')
6
- const request = require('./request')
7
- const getRemoteLanguages = require('./getRemoteLanguages')
8
-
9
- const getDirectories = (srcpath) => {
10
- return fs.readdirSync(srcpath).filter(function (file) {
11
- return fs.statSync(path.join(srcpath, file)).isDirectory()
12
- })
13
- }
14
-
15
- const getFiles = (srcpath) => {
16
- return fs.readdirSync(srcpath).filter(function (file) {
17
- return !fs.statSync(path.join(srcpath, file)).isDirectory()
18
- })
19
- }
20
-
21
- const load = (namespaces, cb) => {
22
- async.each(namespaces, (ns, done) => {
23
- fs.readFile(ns.path, 'utf8', (err, data) => {
24
- if (err) return done(err)
25
- try {
26
- ns.value = flatten(JSON.parse(data))
27
- } catch (err) {
28
- console.error(colors.red(err.stack))
29
- ns.value = {}
30
- }
31
- done()
32
- })
33
- }, (err) => cb(err, namespaces))
34
- }
35
-
36
- const parseLanguage = (p, cb) => {
37
- const dirs = getDirectories(p)
38
-
39
- const namespaces = []
40
-
41
- dirs.forEach((lng) => {
42
- const files = getFiles(path.join(p, lng))
43
-
44
- files.forEach((file) => {
45
- if (path.extname(file) !== '.json') return
46
-
47
- namespaces.push({
48
- language: lng,
49
- namespace: path.basename(file, '.json'),
50
- path: path.join(p, lng, file)
51
- })
52
- })
53
- })
54
-
55
- load(namespaces, cb)
56
- }
57
-
58
- const transfer = (opt, ns, cb) => {
59
- let url = `${opt.apiEndpoint}/update/{{projectId}}/{{version}}/{{lng}}/{{ns}}`
60
- .replace('{{projectId}}', opt.projectId)
61
- .replace('{{ver}}', opt.version)
62
- .replace('{{version}}', opt.version)
63
- .replace('{{language}}', ns.language)
64
- .replace('{{lng}}', ns.language)
65
- .replace('{{ns}}', ns.namespace)
66
- .replace('{{namespace}}', ns.namespace)
67
-
68
- console.log(colors.yellow(`transfering ${opt.version}/${ns.language}/${ns.namespace}...`))
69
-
70
- if (!opt.replace) url = url.replace('/update/', '/missing/')
71
-
72
- const data = ns.value
73
- const keysToSend = Object.keys(data).length
74
- if (keysToSend === 0) return cb(null)
75
-
76
- const payloadKeysLimit = 1000
77
-
78
- function send (d, so, isFirst, clb, isRetrying) {
79
- const queryParams = new URLSearchParams()
80
- if (so) {
81
- queryParams.append('omitstatsgeneration', 'true')
82
- }
83
- if (isFirst && opt.replace) {
84
- queryParams.append('replace', 'true')
85
- }
86
-
87
- const queryString = queryParams.size > 0 ? '?' + queryParams.toString() : ''
88
-
89
- request(url + queryString, {
90
- method: 'post',
91
- body: d,
92
- headers: {
93
- Authorization: opt.apiKey
94
- }
95
- }, (err, res, obj) => {
96
- if (err || (obj && (obj.errorMessage || obj.message))) {
97
- if (url.indexOf('/missing/') > -1 && res.status === 412) {
98
- console.log(colors.green(`transfered ${Object.keys(d).length} keys ${opt.version}/${ns.language}/${ns.namespace} (but all keys already existed)...`))
99
- clb(null)
100
- return
101
- }
102
- if (res.status === 504 && !isRetrying) {
103
- return setTimeout(() => send(d, so, isFirst, clb, true), 3000)
104
- }
105
- console.log(colors.red(`transfer failed for ${Object.keys(d).length} keys ${opt.version}/${ns.language}/${ns.namespace}...`))
106
-
107
- if (err) return clb(err)
108
- if (obj && (obj.errorMessage || obj.message)) return clb(new Error((obj.errorMessage || obj.message)))
109
- }
110
- if (res.status >= 300 && res.status !== 412) {
111
- if (obj && (obj.errorMessage || obj.message)) {
112
- return clb(new Error((obj.errorMessage || obj.message)))
113
- }
114
- return clb(new Error(res.statusText + ' (' + res.status + ')'))
115
- }
116
- console.log(colors.green(`transfered ${Object.keys(d).length} keys ${opt.version}/${ns.language}/${ns.namespace}...`))
117
- clb(null)
118
- })
119
- }
120
-
121
- if (keysToSend > payloadKeysLimit) {
122
- const tasks = []
123
- const keysInObj = Object.keys(data)
124
-
125
- while (keysInObj.length > payloadKeysLimit) {
126
- (function () {
127
- const pagedData = {}
128
- keysInObj.splice(0, payloadKeysLimit).forEach((k) => { pagedData[k] = data[k] })
129
- const hasMoreKeys = keysInObj.length > 0
130
- tasks.push((c) => send(pagedData, hasMoreKeys, false, c))
131
- })()
132
- }
133
-
134
- if (keysInObj.length === 0) return cb(null)
135
-
136
- const finalPagedData = {}
137
- keysInObj.splice(0, keysInObj.length).forEach((k) => { finalPagedData[k] = data[k] })
138
- tasks.push((c) => send(finalPagedData, false, false, c))
139
-
140
- async.series(tasks, cb)
141
- return
142
- }
143
-
144
- send(data, false, true, cb)
145
- }
146
-
147
- const upload = (opt, nss, cb) => {
148
- if (!opt.referenceLanguage) {
149
- async.eachLimit(
150
- nss,
151
- require('os').cpus().length,
152
- (ns, done) => transfer(opt, ns, done),
153
- cb
154
- )
155
- return
156
- }
157
-
158
- const nssRefLng = nss.filter((n) => n.language === opt.referenceLanguage)
159
- const nssNonRefLng = nss.filter((n) => n.language !== opt.referenceLanguage)
160
-
161
- async.eachLimit(
162
- nssRefLng,
163
- require('os').cpus().length,
164
- (ns, done) => transfer(opt, ns, done),
165
- (err) => {
166
- if (err) return cb(err)
167
- async.eachLimit(
168
- nssNonRefLng,
169
- require('os').cpus().length,
170
- (ns, done) => transfer(opt, ns, done),
171
- cb
172
- )
173
- }
174
- )
175
- }
176
-
177
- const addLanguage = (opt, l, cb) => {
178
- const url = opt.apiEndpoint + '/language/' + opt.projectId + '/' + l
179
-
180
- request(url, {
181
- method: 'post',
182
- headers: {
183
- Authorization: opt.apiKey
184
- }
185
- }, (err, res, obj) => {
186
- if (err || (obj && (obj.errorMessage || obj.message))) {
187
- console.log(colors.red(`failed to add language ${l}...`))
188
-
189
- if (err) return cb(err)
190
- if (obj && (obj.errorMessage || obj.message)) return cb(new Error((obj.errorMessage || obj.message)))
191
- }
192
- if (res.status >= 300 && res.status !== 412) return cb(new Error(res.statusText + ' (' + res.status + ')'))
193
- console.log(colors.green(`added language ${l}...`))
194
- cb(null)
195
- })
196
- }
197
-
198
- const migrate = (opt, cb) => {
199
- if (opt.format !== 'json') {
200
- const err = new Error(`Format ${opt.format} is not accepted!`)
201
- if (!cb) throw err
202
- if (cb) cb(err)
203
- return
204
- }
205
-
206
- opt.apiEndpoint = opt.apiEndpoint || 'https://api.locize.app'
207
-
208
- if (opt.language) {
209
- const files = getFiles(opt.path)
210
-
211
- const namespaces = files.map((file) => {
212
- return {
213
- language: opt.language,
214
- namespace: path.basename(file, '.json'),
215
- path: path.join(opt.path, file)
216
- }
217
- })
218
-
219
- load(namespaces, (err, nss) => {
220
- if (err) {
221
- if (!cb) { console.error(colors.red(err.stack)); process.exit(1) }
222
- if (cb) cb(err)
223
- return
224
- }
225
- upload(opt, nss, (err) => {
226
- if (err) {
227
- if (!cb) {
228
- console.error(colors.red(err.stack))
229
- process.exit(1)
230
- }
231
- if (cb) cb(err)
232
- return
233
- }
234
- if (!cb) console.log(colors.green('FINISHED'))
235
- if (cb) cb(null)
236
- })
237
- })
238
- return
239
- }
240
-
241
- if (opt.parseLanguage) {
242
- parseLanguage(opt.path, (err, nss) => {
243
- if (err) {
244
- if (!cb) console.error(colors.red(err.stack)); process.exit(1)
245
- if (cb) cb(err)
246
- return
247
- }
248
-
249
- getRemoteLanguages(opt, (err, remoteLanguages) => {
250
- if (err) {
251
- if (!cb) { console.error(colors.red(err.stack)); process.exit(1) }
252
- if (cb) cb(err)
253
- return
254
- }
255
-
256
- const localLanguages = []
257
- nss.forEach((n) => {
258
- if (localLanguages.indexOf(n.language) < 0) localLanguages.push(n.language)
259
- })
260
-
261
- const notExistingLanguages = localLanguages.filter((l) => remoteLanguages.indexOf(l) < 0)
262
-
263
- if (notExistingLanguages.length === 0) {
264
- upload(opt, nss, (err) => {
265
- if (err) {
266
- if (!cb) {
267
- console.error(colors.red(err.stack))
268
- process.exit(1)
269
- }
270
- if (cb) cb(err)
271
- return
272
- }
273
- if (!cb) console.log(colors.green('FINISHED'))
274
- if (cb) cb(null)
275
- })
276
- return
277
- }
278
-
279
- async.eachLimit(
280
- notExistingLanguages,
281
- require('os').cpus().length,
282
- (l, done) => addLanguage(opt, l, done),
283
- (err) => {
284
- if (err) {
285
- if (!cb) {
286
- console.error(colors.red(err.stack))
287
- process.exit(1)
288
- }
289
- if (cb) cb(err)
290
- return
291
- }
292
- setTimeout(() => {
293
- // wait a bit to make sure project is up-to-date also in cache
294
- upload(opt, nss, (err) => {
295
- if (err) {
296
- if (!cb) {
297
- console.error(colors.red(err.stack))
298
- process.exit(1)
299
- }
300
- if (cb) cb(err)
301
- return
302
- }
303
- if (!cb) console.log(colors.green('FINISHED'))
304
- if (cb) cb(null)
305
- })
306
- }, 5000)
307
- }
308
- )
309
- })
310
- })
311
- }
312
- }
313
-
314
- module.exports = migrate