@nocobase/plugin-field-sort 1.5.0-alpha.1

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 (142) hide show
  1. package/LICENSE.txt +159 -0
  2. package/README.md +1 -0
  3. package/client.d.ts +2 -0
  4. package/client.js +1 -0
  5. package/dist/client/index.d.ts +15 -0
  6. package/dist/client/index.js +10 -0
  7. package/dist/client/locale.d.ts +10 -0
  8. package/dist/client/sort-interface.d.ts +131 -0
  9. package/dist/externalVersion.js +18 -0
  10. package/dist/index.d.ts +10 -0
  11. package/dist/index.js +48 -0
  12. package/dist/locale/en-US.json +1 -0
  13. package/dist/locale/zh-CN.json +1 -0
  14. package/dist/node_modules/@nocobase/lock-manager/LICENSE +661 -0
  15. package/dist/node_modules/@nocobase/lock-manager/lib/index.d.ts +10 -0
  16. package/dist/node_modules/@nocobase/lock-manager/lib/index.js +1 -0
  17. package/dist/node_modules/@nocobase/lock-manager/lib/lock-manager.d.ts +46 -0
  18. package/dist/node_modules/@nocobase/lock-manager/lib/lock-manager.js +171 -0
  19. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/client.js +12 -0
  20. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/assign.d.ts +17 -0
  21. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/assign.js +143 -0
  22. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/client.d.ts +30 -0
  23. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/client.js +88 -0
  24. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/collections-graph.d.ts +24 -0
  25. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/collections-graph.js +107 -0
  26. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/common.d.ts +14 -0
  27. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/common.js +87 -0
  28. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/date.d.ts +38 -0
  29. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/date.js +214 -0
  30. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/dayjs.d.ts +10 -0
  31. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/dayjs.js +72 -0
  32. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/forEach.d.ts +9 -0
  33. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/forEach.js +45 -0
  34. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/fs-exists.d.ts +9 -0
  35. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/fs-exists.js +46 -0
  36. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/getValuesByPath.d.ts +9 -0
  37. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/getValuesByPath.js +71 -0
  38. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/handlebars.d.ts +10 -0
  39. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/handlebars.js +73 -0
  40. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/i18n.d.ts +10 -0
  41. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/i18n.js +43 -0
  42. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/index.d.ts +38 -0
  43. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/index.js +105 -0
  44. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/isPortalInBody.d.ts +13 -0
  45. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/isPortalInBody.js +54 -0
  46. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/isValidFilter.d.ts +9 -0
  47. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/isValidFilter.js +63 -0
  48. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/json-templates.d.ts +9 -0
  49. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/json-templates.js +141 -0
  50. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/koa-multer.d.ts +15 -0
  51. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/koa-multer.js +92 -0
  52. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/log.d.ts +9 -0
  53. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/log.js +39 -0
  54. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/measure-execution-time.d.ts +9 -0
  55. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/measure-execution-time.js +44 -0
  56. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/merge.d.ts +9 -0
  57. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/merge.js +55 -0
  58. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/mixin/AsyncEmitter.d.ts +11 -0
  59. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/mixin/AsyncEmitter.js +80 -0
  60. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/mixin/index.d.ts +9 -0
  61. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/mixin/index.js +48 -0
  62. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/notification.d.ts +9 -0
  63. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/notification.js +43 -0
  64. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/number.d.ts +9 -0
  65. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/number.js +45 -0
  66. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/parse-date.d.ts +15 -0
  67. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/parse-date.js +262 -0
  68. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/parse-filter.d.ts +67 -0
  69. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/parse-filter.js +320 -0
  70. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/parseHTML.d.ts +15 -0
  71. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/parseHTML.js +42 -0
  72. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/perf-hooks.d.ts +14 -0
  73. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/perf-hooks.js +69 -0
  74. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/registry.d.ts +22 -0
  75. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/registry.js +69 -0
  76. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/requireModule.d.ts +12 -0
  77. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/requireModule.js +90 -0
  78. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/server.d.ts +19 -0
  79. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/server.js +50 -0
  80. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/toposort.d.ts +18 -0
  81. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/toposort.js +83 -0
  82. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/uid.d.ts +9 -0
  83. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/uid.js +44 -0
  84. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/url.d.ts +14 -0
  85. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/url.js +46 -0
  86. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/wrap-middleware.d.ts +1 -0
  87. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/lib/wrap-middleware.js +63 -0
  88. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/package.json +20 -0
  89. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/plugin-symlink.d.ts +6 -0
  90. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/plugin-symlink.js +102 -0
  91. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/server.d.ts +2 -0
  92. package/dist/node_modules/@nocobase/lock-manager/node_modules/@nocobase/utils/server.js +12 -0
  93. package/dist/node_modules/@nocobase/lock-manager/node_modules/busboy/.eslintrc.js +5 -0
  94. package/dist/node_modules/@nocobase/lock-manager/node_modules/busboy/.github/workflows/ci.yml +24 -0
  95. package/dist/node_modules/@nocobase/lock-manager/node_modules/busboy/.github/workflows/lint.yml +23 -0
  96. package/dist/node_modules/@nocobase/lock-manager/node_modules/busboy/bench/bench-multipart-fields-100mb-big.js +149 -0
  97. package/dist/node_modules/@nocobase/lock-manager/node_modules/busboy/bench/bench-multipart-fields-100mb-small.js +143 -0
  98. package/dist/node_modules/@nocobase/lock-manager/node_modules/busboy/bench/bench-multipart-files-100mb-big.js +154 -0
  99. package/dist/node_modules/@nocobase/lock-manager/node_modules/busboy/bench/bench-multipart-files-100mb-small.js +148 -0
  100. package/dist/node_modules/@nocobase/lock-manager/node_modules/busboy/bench/bench-urlencoded-fields-100pairs-small.js +101 -0
  101. package/dist/node_modules/@nocobase/lock-manager/node_modules/busboy/bench/bench-urlencoded-fields-900pairs-small-alt.js +84 -0
  102. package/dist/node_modules/@nocobase/lock-manager/node_modules/busboy/lib/index.js +57 -0
  103. package/dist/node_modules/@nocobase/lock-manager/node_modules/busboy/lib/types/multipart.js +653 -0
  104. package/dist/node_modules/@nocobase/lock-manager/node_modules/busboy/lib/types/urlencoded.js +350 -0
  105. package/dist/node_modules/@nocobase/lock-manager/node_modules/busboy/lib/utils.js +596 -0
  106. package/dist/node_modules/@nocobase/lock-manager/node_modules/busboy/package.json +22 -0
  107. package/dist/node_modules/@nocobase/lock-manager/node_modules/busboy/test/common.js +109 -0
  108. package/dist/node_modules/@nocobase/lock-manager/node_modules/busboy/test/test-types-multipart-charsets.js +94 -0
  109. package/dist/node_modules/@nocobase/lock-manager/node_modules/busboy/test/test-types-multipart-stream-pause.js +102 -0
  110. package/dist/node_modules/@nocobase/lock-manager/node_modules/busboy/test/test-types-multipart.js +1053 -0
  111. package/dist/node_modules/@nocobase/lock-manager/node_modules/busboy/test/test-types-urlencoded.js +488 -0
  112. package/dist/node_modules/@nocobase/lock-manager/node_modules/busboy/test/test.js +20 -0
  113. package/dist/node_modules/@nocobase/lock-manager/node_modules/multer/index.js +104 -0
  114. package/dist/node_modules/@nocobase/lock-manager/node_modules/multer/lib/counter.js +28 -0
  115. package/dist/node_modules/@nocobase/lock-manager/node_modules/multer/lib/file-appender.js +67 -0
  116. package/dist/node_modules/@nocobase/lock-manager/node_modules/multer/lib/make-middleware.js +173 -0
  117. package/dist/node_modules/@nocobase/lock-manager/node_modules/multer/lib/multer-error.js +24 -0
  118. package/dist/node_modules/@nocobase/lock-manager/node_modules/multer/lib/remove-uploaded-files.js +28 -0
  119. package/dist/node_modules/@nocobase/lock-manager/node_modules/multer/package.json +52 -0
  120. package/dist/node_modules/@nocobase/lock-manager/node_modules/multer/storage/disk.js +66 -0
  121. package/dist/node_modules/@nocobase/lock-manager/node_modules/multer/storage/memory.js +21 -0
  122. package/dist/node_modules/@nocobase/lock-manager/node_modules/streamsearch/.eslintrc.js +5 -0
  123. package/dist/node_modules/@nocobase/lock-manager/node_modules/streamsearch/.github/workflows/ci.yml +24 -0
  124. package/dist/node_modules/@nocobase/lock-manager/node_modules/streamsearch/.github/workflows/lint.yml +23 -0
  125. package/dist/node_modules/@nocobase/lock-manager/node_modules/streamsearch/lib/sbmh.js +267 -0
  126. package/dist/node_modules/@nocobase/lock-manager/node_modules/streamsearch/package.json +34 -0
  127. package/dist/node_modules/@nocobase/lock-manager/node_modules/streamsearch/test/test.js +70 -0
  128. package/dist/node_modules/@nocobase/lock-manager/package.json +1 -0
  129. package/dist/node_modules/@nocobase/lock-manager/src/__tests__/lock-manager.test.ts +169 -0
  130. package/dist/node_modules/@nocobase/lock-manager/src/index.ts +11 -0
  131. package/dist/node_modules/@nocobase/lock-manager/src/lock-manager.ts +169 -0
  132. package/dist/server/action.d.ts +26 -0
  133. package/dist/server/action.js +168 -0
  134. package/dist/server/index.d.ts +10 -0
  135. package/dist/server/index.js +48 -0
  136. package/dist/server/plugin.d.ts +19 -0
  137. package/dist/server/plugin.js +69 -0
  138. package/dist/server/sort-field.d.ts +24 -0
  139. package/dist/server/sort-field.js +197 -0
  140. package/package.json +16 -0
  141. package/server.d.ts +2 -0
  142. package/server.js +1 -0
@@ -0,0 +1,173 @@
1
+ var is = require('type-is')
2
+ var Busboy = require('busboy')
3
+ var extend = require('xtend')
4
+ var appendField = require('append-field')
5
+
6
+ var Counter = require('./counter')
7
+ var MulterError = require('./multer-error')
8
+ var FileAppender = require('./file-appender')
9
+ var removeUploadedFiles = require('./remove-uploaded-files')
10
+
11
+ function makeMiddleware (setup) {
12
+ return function multerMiddleware (req, res, next) {
13
+ if (!is(req, ['multipart'])) return next()
14
+
15
+ var options = setup()
16
+
17
+ var limits = options.limits
18
+ var storage = options.storage
19
+ var fileFilter = options.fileFilter
20
+ var fileStrategy = options.fileStrategy
21
+ var preservePath = options.preservePath
22
+
23
+ req.body = Object.create(null)
24
+
25
+ var busboy
26
+
27
+ try {
28
+ busboy = Busboy({ headers: req.headers, limits: limits, preservePath: preservePath })
29
+ } catch (err) {
30
+ return next(err)
31
+ }
32
+
33
+ var appender = new FileAppender(fileStrategy, req)
34
+ var isDone = false
35
+ var readFinished = false
36
+ var errorOccured = false
37
+ var pendingWrites = new Counter()
38
+ var uploadedFiles = []
39
+
40
+ function done (err) {
41
+ if (isDone) return
42
+ isDone = true
43
+ req.unpipe(busboy)
44
+ busboy.removeAllListeners()
45
+ next(err)
46
+ }
47
+
48
+ function indicateDone () {
49
+ if (readFinished && pendingWrites.isZero() && !errorOccured) done()
50
+ }
51
+
52
+ function abortWithError (uploadError) {
53
+ if (errorOccured) return
54
+ errorOccured = true
55
+
56
+ pendingWrites.onceZero(function () {
57
+ function remove (file, cb) {
58
+ storage._removeFile(req, file, cb)
59
+ }
60
+
61
+ removeUploadedFiles(uploadedFiles, remove, function (err, storageErrors) {
62
+ if (err) return done(err)
63
+
64
+ uploadError.storageErrors = storageErrors
65
+ done(uploadError)
66
+ })
67
+ })
68
+ }
69
+
70
+ function abortWithCode (code, optionalField) {
71
+ abortWithError(new MulterError(code, optionalField))
72
+ }
73
+
74
+ // handle text field data
75
+ busboy.on('field', function (fieldname, value, { nameTruncated, valueTruncated }) {
76
+ if (fieldname == null) return abortWithCode('MISSING_FIELD_NAME')
77
+ if (nameTruncated) return abortWithCode('LIMIT_FIELD_KEY')
78
+ if (valueTruncated) return abortWithCode('LIMIT_FIELD_VALUE', fieldname)
79
+
80
+ // Work around bug in Busboy (https://github.com/mscdex/busboy/issues/6)
81
+ if (limits && Object.prototype.hasOwnProperty.call(limits, 'fieldNameSize')) {
82
+ if (fieldname.length > limits.fieldNameSize) return abortWithCode('LIMIT_FIELD_KEY')
83
+ }
84
+
85
+ appendField(req.body, fieldname, value)
86
+ })
87
+
88
+ // handle files
89
+ busboy.on('file', function (fieldname, fileStream, { filename, encoding, mimeType }) {
90
+ // don't attach to the files object, if there is no file
91
+ if (!filename) return fileStream.resume()
92
+
93
+ // Work around bug in Busboy (https://github.com/mscdex/busboy/issues/6)
94
+ if (limits && Object.prototype.hasOwnProperty.call(limits, 'fieldNameSize')) {
95
+ if (fieldname.length > limits.fieldNameSize) return abortWithCode('LIMIT_FIELD_KEY')
96
+ }
97
+
98
+ var file = {
99
+ fieldname: fieldname,
100
+ originalname: filename,
101
+ encoding: encoding,
102
+ mimetype: mimeType
103
+ }
104
+
105
+ var placeholder = appender.insertPlaceholder(file)
106
+
107
+ fileFilter(req, file, function (err, includeFile) {
108
+ if (err) {
109
+ appender.removePlaceholder(placeholder)
110
+ return abortWithError(err)
111
+ }
112
+
113
+ if (!includeFile) {
114
+ appender.removePlaceholder(placeholder)
115
+ return fileStream.resume()
116
+ }
117
+
118
+ var aborting = false
119
+ pendingWrites.increment()
120
+
121
+ Object.defineProperty(file, 'stream', {
122
+ configurable: true,
123
+ enumerable: false,
124
+ value: fileStream
125
+ })
126
+
127
+ fileStream.on('error', function (err) {
128
+ pendingWrites.decrement()
129
+ abortWithError(err)
130
+ })
131
+
132
+ fileStream.on('limit', function () {
133
+ aborting = true
134
+ abortWithCode('LIMIT_FILE_SIZE', fieldname)
135
+ })
136
+
137
+ storage._handleFile(req, file, function (err, info) {
138
+ if (aborting) {
139
+ appender.removePlaceholder(placeholder)
140
+ uploadedFiles.push(extend(file, info))
141
+ return pendingWrites.decrement()
142
+ }
143
+
144
+ if (err) {
145
+ appender.removePlaceholder(placeholder)
146
+ pendingWrites.decrement()
147
+ return abortWithError(err)
148
+ }
149
+
150
+ var fileInfo = extend(file, info)
151
+
152
+ appender.replacePlaceholder(placeholder, fileInfo)
153
+ uploadedFiles.push(fileInfo)
154
+ pendingWrites.decrement()
155
+ indicateDone()
156
+ })
157
+ })
158
+ })
159
+
160
+ busboy.on('error', function (err) { abortWithError(err) })
161
+ busboy.on('partsLimit', function () { abortWithCode('LIMIT_PART_COUNT') })
162
+ busboy.on('filesLimit', function () { abortWithCode('LIMIT_FILE_COUNT') })
163
+ busboy.on('fieldsLimit', function () { abortWithCode('LIMIT_FIELD_COUNT') })
164
+ busboy.on('close', function () {
165
+ readFinished = true
166
+ indicateDone()
167
+ })
168
+
169
+ req.pipe(busboy)
170
+ }
171
+ }
172
+
173
+ module.exports = makeMiddleware
@@ -0,0 +1,24 @@
1
+ var util = require('util')
2
+
3
+ var errorMessages = {
4
+ LIMIT_PART_COUNT: 'Too many parts',
5
+ LIMIT_FILE_SIZE: 'File too large',
6
+ LIMIT_FILE_COUNT: 'Too many files',
7
+ LIMIT_FIELD_KEY: 'Field name too long',
8
+ LIMIT_FIELD_VALUE: 'Field value too long',
9
+ LIMIT_FIELD_COUNT: 'Too many fields',
10
+ LIMIT_UNEXPECTED_FILE: 'Unexpected field',
11
+ MISSING_FIELD_NAME: 'Field name missing'
12
+ }
13
+
14
+ function MulterError (code, field) {
15
+ Error.captureStackTrace(this, this.constructor)
16
+ this.name = this.constructor.name
17
+ this.message = errorMessages[code]
18
+ this.code = code
19
+ if (field) this.field = field
20
+ }
21
+
22
+ util.inherits(MulterError, Error)
23
+
24
+ module.exports = MulterError
@@ -0,0 +1,28 @@
1
+ function removeUploadedFiles (uploadedFiles, remove, cb) {
2
+ var length = uploadedFiles.length
3
+ var errors = []
4
+
5
+ if (length === 0) return cb(null, errors)
6
+
7
+ function handleFile (idx) {
8
+ var file = uploadedFiles[idx]
9
+
10
+ remove(file, function (err) {
11
+ if (err) {
12
+ err.file = file
13
+ err.field = file.fieldname
14
+ errors.push(err)
15
+ }
16
+
17
+ if (idx < length - 1) {
18
+ handleFile(idx + 1)
19
+ } else {
20
+ cb(null, errors)
21
+ }
22
+ })
23
+ }
24
+
25
+ handleFile(0)
26
+ }
27
+
28
+ module.exports = removeUploadedFiles
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "multer",
3
+ "description": "Middleware for handling `multipart/form-data`.",
4
+ "version": "1.4.5-lts.1",
5
+ "contributors": [
6
+ "Hage Yaapa <captain@hacksparrow.com> (http://www.hacksparrow.com)",
7
+ "Jaret Pfluger <https://github.com/jpfluger>",
8
+ "Linus Unnebäck <linus@folkdatorn.se>"
9
+ ],
10
+ "license": "MIT",
11
+ "repository": "expressjs/multer",
12
+ "keywords": [
13
+ "form",
14
+ "post",
15
+ "multipart",
16
+ "form-data",
17
+ "formdata",
18
+ "express",
19
+ "middleware"
20
+ ],
21
+ "dependencies": {
22
+ "append-field": "^1.0.0",
23
+ "busboy": "^1.0.0",
24
+ "concat-stream": "^1.5.2",
25
+ "mkdirp": "^0.5.4",
26
+ "object-assign": "^4.1.1",
27
+ "type-is": "^1.6.4",
28
+ "xtend": "^4.0.0"
29
+ },
30
+ "devDependencies": {
31
+ "deep-equal": "^2.0.3",
32
+ "express": "^4.13.1",
33
+ "form-data": "^1.0.0-rc1",
34
+ "fs-temp": "^1.1.2",
35
+ "mocha": "^3.5.3",
36
+ "rimraf": "^2.4.1",
37
+ "standard": "^14.3.3",
38
+ "testdata-w3c-json-form": "^1.0.0"
39
+ },
40
+ "engines": {
41
+ "node": ">= 6.0.0"
42
+ },
43
+ "files": [
44
+ "LICENSE",
45
+ "index.js",
46
+ "storage/",
47
+ "lib/"
48
+ ],
49
+ "scripts": {
50
+ "test": "standard && mocha"
51
+ }
52
+ }
@@ -0,0 +1,66 @@
1
+ var fs = require('fs')
2
+ var os = require('os')
3
+ var path = require('path')
4
+ var crypto = require('crypto')
5
+ var mkdirp = require('mkdirp')
6
+
7
+ function getFilename (req, file, cb) {
8
+ crypto.randomBytes(16, function (err, raw) {
9
+ cb(err, err ? undefined : raw.toString('hex'))
10
+ })
11
+ }
12
+
13
+ function getDestination (req, file, cb) {
14
+ cb(null, os.tmpdir())
15
+ }
16
+
17
+ function DiskStorage (opts) {
18
+ this.getFilename = (opts.filename || getFilename)
19
+
20
+ if (typeof opts.destination === 'string') {
21
+ mkdirp.sync(opts.destination)
22
+ this.getDestination = function ($0, $1, cb) { cb(null, opts.destination) }
23
+ } else {
24
+ this.getDestination = (opts.destination || getDestination)
25
+ }
26
+ }
27
+
28
+ DiskStorage.prototype._handleFile = function _handleFile (req, file, cb) {
29
+ var that = this
30
+
31
+ that.getDestination(req, file, function (err, destination) {
32
+ if (err) return cb(err)
33
+
34
+ that.getFilename(req, file, function (err, filename) {
35
+ if (err) return cb(err)
36
+
37
+ var finalPath = path.join(destination, filename)
38
+ var outStream = fs.createWriteStream(finalPath)
39
+
40
+ file.stream.pipe(outStream)
41
+ outStream.on('error', cb)
42
+ outStream.on('finish', function () {
43
+ cb(null, {
44
+ destination: destination,
45
+ filename: filename,
46
+ path: finalPath,
47
+ size: outStream.bytesWritten
48
+ })
49
+ })
50
+ })
51
+ })
52
+ }
53
+
54
+ DiskStorage.prototype._removeFile = function _removeFile (req, file, cb) {
55
+ var path = file.path
56
+
57
+ delete file.destination
58
+ delete file.filename
59
+ delete file.path
60
+
61
+ fs.unlink(path, cb)
62
+ }
63
+
64
+ module.exports = function (opts) {
65
+ return new DiskStorage(opts)
66
+ }
@@ -0,0 +1,21 @@
1
+ var concat = require('concat-stream')
2
+
3
+ function MemoryStorage (opts) {}
4
+
5
+ MemoryStorage.prototype._handleFile = function _handleFile (req, file, cb) {
6
+ file.stream.pipe(concat({ encoding: 'buffer' }, function (data) {
7
+ cb(null, {
8
+ buffer: data,
9
+ size: data.length
10
+ })
11
+ }))
12
+ }
13
+
14
+ MemoryStorage.prototype._removeFile = function _removeFile (req, file, cb) {
15
+ delete file.buffer
16
+ cb(null)
17
+ }
18
+
19
+ module.exports = function (opts) {
20
+ return new MemoryStorage(opts)
21
+ }
@@ -0,0 +1,5 @@
1
+ 'use strict';
2
+
3
+ module.exports = {
4
+ extends: '@mscdex/eslint-config',
5
+ };
@@ -0,0 +1,24 @@
1
+ name: CI
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches: [ master ]
7
+
8
+ jobs:
9
+ tests-linux:
10
+ runs-on: ubuntu-latest
11
+ strategy:
12
+ fail-fast: false
13
+ matrix:
14
+ node-version: [10.x, 12.x, 14.x, 16.x]
15
+ steps:
16
+ - uses: actions/checkout@v2
17
+ - name: Use Node.js ${{ matrix.node-version }}
18
+ uses: actions/setup-node@v1
19
+ with:
20
+ node-version: ${{ matrix.node-version }}
21
+ - name: Install module
22
+ run: npm install
23
+ - name: Run tests
24
+ run: npm test
@@ -0,0 +1,23 @@
1
+ name: lint
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches: [ master ]
7
+
8
+ env:
9
+ NODE_VERSION: 16.x
10
+
11
+ jobs:
12
+ lint-js:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: actions/checkout@v2
16
+ - name: Use Node.js ${{ env.NODE_VERSION }}
17
+ uses: actions/setup-node@v1
18
+ with:
19
+ node-version: ${{ env.NODE_VERSION }}
20
+ - name: Install ESLint + ESLint configs/plugins
21
+ run: npm install --only=dev
22
+ - name: Lint files
23
+ run: npm run lint
@@ -0,0 +1,267 @@
1
+ 'use strict';
2
+ /*
3
+ Based heavily on the Streaming Boyer-Moore-Horspool C++ implementation
4
+ by Hongli Lai at: https://github.com/FooBarWidget/boyer-moore-horspool
5
+ */
6
+ function memcmp(buf1, pos1, buf2, pos2, num) {
7
+ for (let i = 0; i < num; ++i) {
8
+ if (buf1[pos1 + i] !== buf2[pos2 + i])
9
+ return false;
10
+ }
11
+ return true;
12
+ }
13
+
14
+ class SBMH {
15
+ constructor(needle, cb) {
16
+ if (typeof cb !== 'function')
17
+ throw new Error('Missing match callback');
18
+
19
+ if (typeof needle === 'string')
20
+ needle = Buffer.from(needle);
21
+ else if (!Buffer.isBuffer(needle))
22
+ throw new Error(`Expected Buffer for needle, got ${typeof needle}`);
23
+
24
+ const needleLen = needle.length;
25
+
26
+ this.maxMatches = Infinity;
27
+ this.matches = 0;
28
+
29
+ this._cb = cb;
30
+ this._lookbehindSize = 0;
31
+ this._needle = needle;
32
+ this._bufPos = 0;
33
+
34
+ this._lookbehind = Buffer.allocUnsafe(needleLen);
35
+
36
+ // Initialize occurrence table.
37
+ this._occ = [
38
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
39
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
40
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
41
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
42
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
43
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
44
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
45
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
46
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
47
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
48
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
49
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
50
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
51
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
52
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
53
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
54
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
55
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
56
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
57
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
58
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
59
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
60
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
61
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
62
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
63
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
64
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
65
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
66
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
67
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
68
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
69
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
70
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
71
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
72
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
73
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
74
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
75
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
76
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
77
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
78
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
79
+ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen,
80
+ needleLen, needleLen, needleLen, needleLen
81
+ ];
82
+
83
+ // Populate occurrence table with analysis of the needle, ignoring the last
84
+ // letter.
85
+ if (needleLen > 1) {
86
+ for (let i = 0; i < needleLen - 1; ++i)
87
+ this._occ[needle[i]] = needleLen - 1 - i;
88
+ }
89
+ }
90
+
91
+ reset() {
92
+ this.matches = 0;
93
+ this._lookbehindSize = 0;
94
+ this._bufPos = 0;
95
+ }
96
+
97
+ push(chunk, pos) {
98
+ let result;
99
+ if (!Buffer.isBuffer(chunk))
100
+ chunk = Buffer.from(chunk, 'latin1');
101
+ const chunkLen = chunk.length;
102
+ this._bufPos = pos || 0;
103
+ while (result !== chunkLen && this.matches < this.maxMatches)
104
+ result = feed(this, chunk);
105
+ return result;
106
+ }
107
+
108
+ destroy() {
109
+ const lbSize = this._lookbehindSize;
110
+ if (lbSize)
111
+ this._cb(false, this._lookbehind, 0, lbSize, false);
112
+ this.reset();
113
+ }
114
+ }
115
+
116
+ function feed(self, data) {
117
+ const len = data.length;
118
+ const needle = self._needle;
119
+ const needleLen = needle.length;
120
+
121
+ // Positive: points to a position in `data`
122
+ // pos == 3 points to data[3]
123
+ // Negative: points to a position in the lookbehind buffer
124
+ // pos == -2 points to lookbehind[lookbehindSize - 2]
125
+ let pos = -self._lookbehindSize;
126
+ const lastNeedleCharPos = needleLen - 1;
127
+ const lastNeedleChar = needle[lastNeedleCharPos];
128
+ const end = len - needleLen;
129
+ const occ = self._occ;
130
+ const lookbehind = self._lookbehind;
131
+
132
+ if (pos < 0) {
133
+ // Lookbehind buffer is not empty. Perform Boyer-Moore-Horspool
134
+ // search with character lookup code that considers both the
135
+ // lookbehind buffer and the current round's haystack data.
136
+ //
137
+ // Loop until
138
+ // there is a match.
139
+ // or until
140
+ // we've moved past the position that requires the
141
+ // lookbehind buffer. In this case we switch to the
142
+ // optimized loop.
143
+ // or until
144
+ // the character to look at lies outside the haystack.
145
+ while (pos < 0 && pos <= end) {
146
+ const nextPos = pos + lastNeedleCharPos;
147
+ const ch = (nextPos < 0
148
+ ? lookbehind[self._lookbehindSize + nextPos]
149
+ : data[nextPos]);
150
+
151
+ if (ch === lastNeedleChar
152
+ && matchNeedle(self, data, pos, lastNeedleCharPos)) {
153
+ self._lookbehindSize = 0;
154
+ ++self.matches;
155
+ if (pos > -self._lookbehindSize)
156
+ self._cb(true, lookbehind, 0, self._lookbehindSize + pos, false);
157
+ else
158
+ self._cb(true, undefined, 0, 0, true);
159
+
160
+ return (self._bufPos = pos + needleLen);
161
+ }
162
+
163
+ pos += occ[ch];
164
+ }
165
+
166
+ // No match.
167
+
168
+ // There's too few data for Boyer-Moore-Horspool to run,
169
+ // so let's use a different algorithm to skip as much as
170
+ // we can.
171
+ // Forward pos until
172
+ // the trailing part of lookbehind + data
173
+ // looks like the beginning of the needle
174
+ // or until
175
+ // pos == 0
176
+ while (pos < 0 && !matchNeedle(self, data, pos, len - pos))
177
+ ++pos;
178
+
179
+ if (pos < 0) {
180
+ // Cut off part of the lookbehind buffer that has
181
+ // been processed and append the entire haystack
182
+ // into it.
183
+ const bytesToCutOff = self._lookbehindSize + pos;
184
+
185
+ if (bytesToCutOff > 0) {
186
+ // The cut off data is guaranteed not to contain the needle.
187
+ self._cb(false, lookbehind, 0, bytesToCutOff, false);
188
+ }
189
+
190
+ self._lookbehindSize -= bytesToCutOff;
191
+ lookbehind.copy(lookbehind, 0, bytesToCutOff, self._lookbehindSize);
192
+ lookbehind.set(data, self._lookbehindSize);
193
+ self._lookbehindSize += len;
194
+
195
+ self._bufPos = len;
196
+ return len;
197
+ }
198
+
199
+ // Discard lookbehind buffer.
200
+ self._cb(false, lookbehind, 0, self._lookbehindSize, false);
201
+ self._lookbehindSize = 0;
202
+ }
203
+
204
+ pos += self._bufPos;
205
+
206
+ const firstNeedleChar = needle[0];
207
+
208
+ // Lookbehind buffer is now empty. Perform Boyer-Moore-Horspool
209
+ // search with optimized character lookup code that only considers
210
+ // the current round's haystack data.
211
+ while (pos <= end) {
212
+ const ch = data[pos + lastNeedleCharPos];
213
+
214
+ if (ch === lastNeedleChar
215
+ && data[pos] === firstNeedleChar
216
+ && memcmp(needle, 0, data, pos, lastNeedleCharPos)) {
217
+ ++self.matches;
218
+ if (pos > 0)
219
+ self._cb(true, data, self._bufPos, pos, true);
220
+ else
221
+ self._cb(true, undefined, 0, 0, true);
222
+
223
+ return (self._bufPos = pos + needleLen);
224
+ }
225
+
226
+ pos += occ[ch];
227
+ }
228
+
229
+ // There was no match. If there's trailing haystack data that we cannot
230
+ // match yet using the Boyer-Moore-Horspool algorithm (because the trailing
231
+ // data is less than the needle size) then match using a modified
232
+ // algorithm that starts matching from the beginning instead of the end.
233
+ // Whatever trailing data is left after running this algorithm is added to
234
+ // the lookbehind buffer.
235
+ while (pos < len) {
236
+ if (data[pos] !== firstNeedleChar
237
+ || !memcmp(data, pos, needle, 0, len - pos)) {
238
+ ++pos;
239
+ continue;
240
+ }
241
+ data.copy(lookbehind, 0, pos, len);
242
+ self._lookbehindSize = len - pos;
243
+ break;
244
+ }
245
+
246
+ // Everything until `pos` is guaranteed not to contain needle data.
247
+ if (pos > 0)
248
+ self._cb(false, data, self._bufPos, pos < len ? pos : len, true);
249
+
250
+ self._bufPos = len;
251
+ return len;
252
+ }
253
+
254
+ function matchNeedle(self, data, pos, len) {
255
+ const lb = self._lookbehind;
256
+ const lbSize = self._lookbehindSize;
257
+ const needle = self._needle;
258
+
259
+ for (let i = 0; i < len; ++i, ++pos) {
260
+ const ch = (pos < 0 ? lb[lbSize + pos] : data[pos]);
261
+ if (ch !== needle[i])
262
+ return false;
263
+ }
264
+ return true;
265
+ }
266
+
267
+ module.exports = SBMH;