@jsreport/jsreport-core 3.0.1 → 3.1.2-test.2
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.
- package/LICENSE +166 -166
- package/README.md +298 -284
- package/index.js +29 -27
- package/lib/main/blobStorage/blobStorage.js +52 -47
- package/lib/main/blobStorage/inMemoryProvider.js +27 -27
- package/lib/main/blobStorage/mainActions.js +24 -24
- package/lib/main/createDefaultLoggerFormat.js +17 -17
- package/lib/main/defaults.js +14 -14
- package/lib/main/extensions/discover.js +20 -20
- package/lib/main/extensions/extensionsManager.js +264 -265
- package/lib/main/extensions/fileUtils.js +56 -55
- package/lib/main/extensions/findVersion.js +49 -53
- package/lib/main/extensions/locationCache.js +103 -97
- package/lib/main/extensions/sorter.js +10 -10
- package/lib/main/extensions/validateMinimalVersion.js +50 -50
- package/lib/main/folders/cascadeFolderRemove.js +25 -25
- package/lib/main/folders/getEntitiesInFolder.js +53 -53
- package/lib/main/folders/index.js +42 -42
- package/lib/main/folders/moveBetweenFolders.js +354 -354
- package/lib/main/folders/validateDuplicatedName.js +107 -107
- package/lib/main/folders/validateReservedName.js +53 -53
- package/lib/main/logger.js +244 -244
- package/lib/main/migration/resourcesToAssets.js +230 -210
- package/lib/main/migration/xlsxTemplatesToAssets.js +128 -118
- package/lib/main/monitoring.js +91 -91
- package/lib/main/optionsLoad.js +237 -237
- package/lib/main/optionsSchema.js +237 -237
- package/lib/main/reporter.js +579 -578
- package/lib/main/schemaValidator.js +252 -252
- package/lib/main/settings.js +154 -154
- package/lib/main/store/checkDuplicatedId.js +27 -27
- package/lib/main/store/collection.js +329 -329
- package/lib/main/store/documentStore.js +469 -469
- package/lib/main/store/mainActions.js +28 -28
- package/lib/main/store/memoryStoreProvider.js +99 -99
- package/lib/main/store/queue.js +48 -48
- package/lib/main/store/referenceUtils.js +251 -251
- package/lib/main/store/setupValidateId.js +43 -43
- package/lib/main/store/setupValidateShortid.js +71 -71
- package/lib/main/store/transaction.js +69 -69
- package/lib/main/store/typeUtils.js +180 -180
- package/lib/main/templates.js +34 -34
- package/lib/main/validateEntityName.js +62 -62
- package/lib/shared/createError.js +36 -36
- package/lib/shared/encryption.js +114 -114
- package/lib/shared/folders/index.js +11 -11
- package/lib/shared/folders/normalizeEntityPath.js +15 -15
- package/lib/shared/folders/resolveEntityFromPath.js +88 -88
- package/lib/shared/folders/resolveEntityPath.js +46 -46
- package/lib/shared/folders/resolveFolderFromPath.js +38 -38
- package/lib/shared/generateRequestId.js +4 -4
- package/lib/shared/listenerCollection.js +169 -0
- package/lib/shared/normalizeMetaFromLogs.js +30 -30
- package/lib/shared/reporter.js +123 -123
- package/lib/shared/request.js +64 -64
- package/lib/shared/tempFilesHandler.js +81 -81
- package/lib/shared/templates.js +82 -82
- package/lib/static/helpers.js +33 -33
- package/lib/worker/blobStorage.js +34 -34
- package/lib/worker/defaultProxyExtend.js +46 -46
- package/lib/worker/documentStore.js +49 -49
- package/lib/worker/extensionsManager.js +17 -17
- package/lib/worker/logger.js +48 -48
- package/lib/worker/render/diff.js +138 -138
- package/lib/worker/render/executeEngine.js +207 -200
- package/lib/worker/render/htmlRecipe.js +10 -10
- package/lib/worker/render/moduleHelper.js +43 -43
- package/lib/worker/render/noneEngine.js +12 -12
- package/lib/worker/render/profiler.js +158 -158
- package/lib/worker/render/render.js +205 -209
- package/lib/worker/render/resolveReferences.js +60 -60
- package/lib/worker/reporter.js +191 -187
- package/lib/worker/sandbox/runInSandbox.js +13 -4
- package/lib/worker/sandbox/safeSandbox.js +828 -822
- package/lib/worker/templates.js +78 -78
- package/lib/worker/workerHandler.js +54 -54
- package/package.json +92 -92
- package/test/blobStorage/common.js +21 -21
- package/test/store/common.js +1449 -1449
|
@@ -1,265 +1,264 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright(c) 2018 Jan Blaha
|
|
3
|
-
*
|
|
4
|
-
* ExtensionsManager responsible for loading and registering jsreport extensions.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
const os = require('os')
|
|
8
|
-
const path = require('path')
|
|
9
|
-
const extend = require('node.extend.without.arrays')
|
|
10
|
-
const camelCase = require('camelcase')
|
|
11
|
-
const discover = require('./discover')
|
|
12
|
-
const findVersion = require('./findVersion')
|
|
13
|
-
const validateMinimalVersion = require('./validateMinimalVersion')
|
|
14
|
-
const sorter = require('./sorter')
|
|
15
|
-
|
|
16
|
-
module.exports = (reporter) => {
|
|
17
|
-
return {
|
|
18
|
-
availableExtensions: [],
|
|
19
|
-
recipes: [],
|
|
20
|
-
engines: [],
|
|
21
|
-
usedExtensions: [],
|
|
22
|
-
get extensions () {
|
|
23
|
-
return this.availableExtensions.filter((e) => !e.options || e.options.enabled !== false)
|
|
24
|
-
},
|
|
25
|
-
|
|
26
|
-
async load (opts = {}) {
|
|
27
|
-
this.availableExtensions = []
|
|
28
|
-
|
|
29
|
-
if (reporter.options.discover || (reporter.options.discover !== false && this.usedExtensions.length === 0)) {
|
|
30
|
-
const extensions = await discover({
|
|
31
|
-
logger: reporter.logger,
|
|
32
|
-
rootDirectory: reporter.options.rootDirectory,
|
|
33
|
-
tempCoreDirectory: reporter.options.tempCoreDirectory,
|
|
34
|
-
useExtensionsLocationCache: reporter.options.useExtensionsLocationCache
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
{},
|
|
138
|
-
extension.options
|
|
139
|
-
extension.name != null ? reporter.options.extensions[
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
//
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
const
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
const
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
//
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
}
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright(c) 2018 Jan Blaha
|
|
3
|
+
*
|
|
4
|
+
* ExtensionsManager responsible for loading and registering jsreport extensions.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const os = require('os')
|
|
8
|
+
const path = require('path')
|
|
9
|
+
const extend = require('node.extend.without.arrays')
|
|
10
|
+
const camelCase = require('camelcase')
|
|
11
|
+
const discover = require('./discover')
|
|
12
|
+
const findVersion = require('./findVersion')
|
|
13
|
+
const validateMinimalVersion = require('./validateMinimalVersion')
|
|
14
|
+
const sorter = require('./sorter')
|
|
15
|
+
|
|
16
|
+
module.exports = (reporter) => {
|
|
17
|
+
return {
|
|
18
|
+
availableExtensions: [],
|
|
19
|
+
recipes: [],
|
|
20
|
+
engines: [],
|
|
21
|
+
usedExtensions: [],
|
|
22
|
+
get extensions () {
|
|
23
|
+
return this.availableExtensions.filter((e) => !e.options || e.options.enabled !== false)
|
|
24
|
+
},
|
|
25
|
+
|
|
26
|
+
async load (opts = {}) {
|
|
27
|
+
this.availableExtensions = []
|
|
28
|
+
|
|
29
|
+
if (reporter.options.discover || (reporter.options.discover !== false && this.usedExtensions.length === 0)) {
|
|
30
|
+
const extensions = await discover({
|
|
31
|
+
logger: reporter.logger,
|
|
32
|
+
rootDirectory: reporter.options.rootDirectory,
|
|
33
|
+
tempCoreDirectory: reporter.options.tempCoreDirectory,
|
|
34
|
+
useExtensionsLocationCache: reporter.options.useExtensionsLocationCache
|
|
35
|
+
})
|
|
36
|
+
reporter.logger.debug(`Discovered ${extensions.length} extensions`)
|
|
37
|
+
this.availableExtensions = this.availableExtensions.concat(extensions)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
this.availableExtensions = this.availableExtensions.concat(this.usedExtensions)
|
|
41
|
+
|
|
42
|
+
if (reporter.options.extensionsList) {
|
|
43
|
+
this.availableExtensions = this.availableExtensions.filter((e) => reporter.options.extensionsList.indexOf(e.name) !== -1)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
this.availableExtensions.sort(sorter)
|
|
47
|
+
|
|
48
|
+
// filter out duplicated extensions
|
|
49
|
+
// this can easily happen when you install jsreport and jsreport-cli into global modules
|
|
50
|
+
this.availableExtensions = this.extensions.filter((v, i) => {
|
|
51
|
+
if (!v.name) {
|
|
52
|
+
return true
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const extIndex = this.availableExtensions.findIndex(e => e.name === v.name)
|
|
56
|
+
const isUnique = extIndex === i
|
|
57
|
+
|
|
58
|
+
if (!isUnique) {
|
|
59
|
+
reporter.logger.warn(`Filtering out duplicated extension "${v.name}" from ${v.directory}, using ${this.availableExtensions[extIndex].directory}`)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return isUnique
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
if (opts.onlyLocation !== true) {
|
|
66
|
+
this.availableExtensions = await Promise.all(this.availableExtensions.map(async (e) => {
|
|
67
|
+
const { version, pkgVersion, source } = await findVersion(e)
|
|
68
|
+
return Object.assign(e, { source, version, pkgVersion })
|
|
69
|
+
}))
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
|
|
73
|
+
async init () {
|
|
74
|
+
return this._useMany(this.availableExtensions)
|
|
75
|
+
},
|
|
76
|
+
|
|
77
|
+
use (extension) {
|
|
78
|
+
if (typeof extension === 'function') {
|
|
79
|
+
this.usedExtensions.push({
|
|
80
|
+
main: extension,
|
|
81
|
+
directory: reporter.options.parentModuleDirectory,
|
|
82
|
+
dependencies: []
|
|
83
|
+
})
|
|
84
|
+
return
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (typeof extension === 'object') {
|
|
88
|
+
this.usedExtensions.push(extension)
|
|
89
|
+
return
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
throw new Error('use accepts function or object')
|
|
93
|
+
},
|
|
94
|
+
|
|
95
|
+
async _useMany (extensions) {
|
|
96
|
+
const toValidateGroups = new Map()
|
|
97
|
+
|
|
98
|
+
for (const e of extensions) {
|
|
99
|
+
const activated = await this._useOne(e)
|
|
100
|
+
|
|
101
|
+
if (!activated) {
|
|
102
|
+
continue
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const extensionRequires = Object.assign({}, e.requires)
|
|
106
|
+
// core already validated here
|
|
107
|
+
delete extensionRequires.core
|
|
108
|
+
|
|
109
|
+
for (const baseExtName of Object.keys(extensionRequires)) {
|
|
110
|
+
if (!toValidateGroups.has(baseExtName)) {
|
|
111
|
+
toValidateGroups.set(baseExtName, [])
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const deps = toValidateGroups.get(baseExtName)
|
|
115
|
+
deps.push(e)
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
for (const [baseExtName, deps] of toValidateGroups.entries()) {
|
|
120
|
+
const baseExt = extensions.find((ext) => ext.name === baseExtName)
|
|
121
|
+
|
|
122
|
+
if (baseExt == null || baseExt.pkgVersion == null) {
|
|
123
|
+
continue
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
for (const ext of deps) {
|
|
127
|
+
validateMinimalVersion({ name: baseExtName, version: baseExt.pkgVersion }, ext)
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
|
|
132
|
+
async _useOne (extension) {
|
|
133
|
+
try {
|
|
134
|
+
extension.options = extend(
|
|
135
|
+
true,
|
|
136
|
+
{},
|
|
137
|
+
extension.options || {},
|
|
138
|
+
extension.name != null ? reporter.options.extensions[camelCase(extension.name)] : {},
|
|
139
|
+
extension.name != null ? reporter.options.extensions[extension.name] : {}
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
// we need to check for string "false" to support disabling extension by env or CLI args
|
|
143
|
+
// since this option does not coerce by schema validation at this point but later
|
|
144
|
+
if (extension.options.enabled === 'false' || extension.options.enabled === '0') {
|
|
145
|
+
extension.options.enabled = false
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (extension.options.enabled === false) {
|
|
149
|
+
if (!extension.name) {
|
|
150
|
+
reporter.logger.debug(`Anonymous Extension${extension.directory != null ? ` at ${extension.directory}` : ''} is disabled, skipping`)
|
|
151
|
+
} else {
|
|
152
|
+
reporter.logger.debug(`Extension ${getExtensionDisplayName(extension)} is disabled, skipping`)
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
return false
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
validateMinimalVersion({ name: 'core', version: reporter.coreVersion }, extension)
|
|
159
|
+
|
|
160
|
+
if (!extension.name) {
|
|
161
|
+
reporter.logger.info(`Using anonymous extension${extension.directory != null ? ` at ${extension.directory}` : ''}`)
|
|
162
|
+
} else {
|
|
163
|
+
reporter.logger.info(`Using extension ${getExtensionDisplayName(extension)}`)
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
let optionsSchema
|
|
167
|
+
|
|
168
|
+
if (extension.name != null) {
|
|
169
|
+
optionsSchema = reporter.optionsValidator.getRootSchema().properties.extensions.properties[extension.name]
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if (optionsSchema != null) {
|
|
173
|
+
try {
|
|
174
|
+
reporter.optionsValidator.addSchema(extension.name, optionsSchema)
|
|
175
|
+
} catch (e) {
|
|
176
|
+
throw new Error(`schema for extension options in definition does not contain a valid json schema. ${e.message}`)
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const optionsValidationResult = reporter.optionsValidator.validate(extension.name, extension.options, { rootPrefix: 'options' })
|
|
180
|
+
|
|
181
|
+
if (!optionsValidationResult.valid) {
|
|
182
|
+
throw new Error(formatExtensionOptionsError(extension.name, optionsValidationResult.fullErrorMessage))
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const availableExtensionIndex = this.availableExtensions.indexOf(extension)
|
|
186
|
+
const usedExtensionIndex = this.usedExtensions.indexOf(extension)
|
|
187
|
+
|
|
188
|
+
extension = new Proxy(extension, {
|
|
189
|
+
set: (obj, prop, value, receiver) => {
|
|
190
|
+
let newValue
|
|
191
|
+
|
|
192
|
+
if (prop === 'options') {
|
|
193
|
+
const newData = extend(true, {}, value)
|
|
194
|
+
const result = reporter.optionsValidator.validate(extension.name, newData, { rootPrefix: 'options' })
|
|
195
|
+
|
|
196
|
+
if (!result.valid) {
|
|
197
|
+
throw new Error(formatExtensionOptionsError(extension.name, result.fullErrorMessage))
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
newValue = newData
|
|
201
|
+
} else {
|
|
202
|
+
newValue = value
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
return Reflect.set(obj, prop, newValue, receiver)
|
|
206
|
+
}
|
|
207
|
+
})
|
|
208
|
+
|
|
209
|
+
// ensure extension references in availableExtensions, usedExtensions have
|
|
210
|
+
// the proxy instance also
|
|
211
|
+
if (availableExtensionIndex !== -1) {
|
|
212
|
+
this.availableExtensions[availableExtensionIndex] = extension
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
if (usedExtensionIndex !== -1) {
|
|
216
|
+
this.usedExtensions[usedExtensionIndex] = extension
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
reporter.options.extensions[extension.name] = extension.options
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
if (typeof extension.main === 'function') {
|
|
223
|
+
await extension.main.call(this, reporter, extension)
|
|
224
|
+
} else {
|
|
225
|
+
if (extension.directory && extension.main) {
|
|
226
|
+
await require(path.join(extension.directory, extension.main)).call(this, reporter, extension)
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if (extension.options.enabled === false) {
|
|
231
|
+
if (!extension.name) {
|
|
232
|
+
reporter.logger.debug(`Anonymous Extension${extension.directory != null ? ` at ${extension.directory}` : ''} was disabled`)
|
|
233
|
+
} else {
|
|
234
|
+
reporter.logger.debug(`Extension ${getExtensionDisplayName(extension)} was disabled`)
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
return extension.options.enabled !== false
|
|
239
|
+
} catch (e) {
|
|
240
|
+
let errorMsg
|
|
241
|
+
|
|
242
|
+
if (!extension.name) {
|
|
243
|
+
errorMsg = `Error when loading anonymous extension${extension.directory != null ? ` at ${extension.directory}` : ''}${os.EOL}${e.stack}`
|
|
244
|
+
} else {
|
|
245
|
+
errorMsg = `Error when loading extension ${getExtensionDisplayName(extension)}${os.EOL}${e.stack}`
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
throw new Error(errorMsg)
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function getExtensionDisplayName (extension) {
|
|
255
|
+
if (extension.version != null) {
|
|
256
|
+
return `${extension.name}@${extension.version}`
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
return extension.name
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
function formatExtensionOptionsError (extName, fullErrorMessage) {
|
|
263
|
+
return `options of extension ${extName} contain values that does not match the defined schema. ${fullErrorMessage}`
|
|
264
|
+
}
|
|
@@ -1,55 +1,56 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright(c) 2014 Jan Blaha
|
|
3
|
-
*
|
|
4
|
-
*/
|
|
5
|
-
const fs = require('fs')
|
|
6
|
-
const path = require('path')
|
|
7
|
-
|
|
8
|
-
exports.walkSync = (rootPath, fileName,
|
|
9
|
-
const results = []
|
|
10
|
-
const queue = []
|
|
11
|
-
let next = rootPath
|
|
12
|
-
|
|
13
|
-
function dirname (f) {
|
|
14
|
-
const parts = path.dirname(f).split(path.sep)
|
|
15
|
-
return parts[parts.length - 1]
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
while (next) {
|
|
19
|
-
let list
|
|
20
|
-
try {
|
|
21
|
-
list = fs.readdirSync(next)
|
|
22
|
-
} catch (e) {
|
|
23
|
-
// no permissions to read folder for example, just skip it
|
|
24
|
-
list = []
|
|
25
|
-
}
|
|
26
|
-
list.forEach((i) => {
|
|
27
|
-
const item = path.join(next, i)
|
|
28
|
-
|
|
29
|
-
if (item.
|
|
30
|
-
return
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
try {
|
|
34
|
-
if (fs.statSync(item).isDirectory()) {
|
|
35
|
-
queue.push(item)
|
|
36
|
-
return
|
|
37
|
-
}
|
|
38
|
-
} catch (e) {
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
if (i === fileName) {
|
|
43
|
-
const extensionsDirectoryName = dirname(item)
|
|
44
|
-
const alreadyListedConfig = results.filter((f) => extensionsDirectoryName === dirname(f))
|
|
45
|
-
|
|
46
|
-
if (!alreadyListedConfig.length) {
|
|
47
|
-
results.push(item)
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright(c) 2014 Jan Blaha
|
|
3
|
+
*
|
|
4
|
+
*/
|
|
5
|
+
const fs = require('fs')
|
|
6
|
+
const path = require('path')
|
|
7
|
+
|
|
8
|
+
exports.walkSync = (rootPath, fileName, excludePath) => {
|
|
9
|
+
const results = []
|
|
10
|
+
const queue = []
|
|
11
|
+
let next = rootPath
|
|
12
|
+
|
|
13
|
+
function dirname (f) {
|
|
14
|
+
const parts = path.dirname(f).split(path.sep)
|
|
15
|
+
return parts[parts.length - 1]
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
while (next) {
|
|
19
|
+
let list
|
|
20
|
+
try {
|
|
21
|
+
list = fs.readdirSync(next)
|
|
22
|
+
} catch (e) {
|
|
23
|
+
// no permissions to read folder for example, just skip it
|
|
24
|
+
list = []
|
|
25
|
+
}
|
|
26
|
+
list.forEach((i) => {
|
|
27
|
+
const item = path.join(next, i)
|
|
28
|
+
|
|
29
|
+
if (item.startsWith(excludePath)) {
|
|
30
|
+
return
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
try {
|
|
34
|
+
if (fs.statSync(item).isDirectory()) {
|
|
35
|
+
queue.push(item)
|
|
36
|
+
return
|
|
37
|
+
}
|
|
38
|
+
} catch (e) {
|
|
39
|
+
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (i === fileName) {
|
|
43
|
+
const extensionsDirectoryName = dirname(item)
|
|
44
|
+
const alreadyListedConfig = results.filter((f) => extensionsDirectoryName === dirname(f))
|
|
45
|
+
|
|
46
|
+
if (!alreadyListedConfig.length) {
|
|
47
|
+
results.push(item)
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
next = queue.shift()
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return results
|
|
56
|
+
}
|