Skip to content

Commit b510b13

Browse files
committed
Merge branch 'develop'
2 parents 16893d8 + c95c832 commit b510b13

File tree

13 files changed

+251
-52
lines changed

13 files changed

+251
-52
lines changed

.github/workflows/swift.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414
matrix:
1515
image:
1616
- swift:5.9.2-focal
17-
- swift:6.0-noble
17+
- swift:6.1-noble
1818
container: ${{ matrix.image }}
1919
steps:
2020
- name: Checkout Repository

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ let package = Package(
1717

1818
dependencies: [
1919
.package(url: "https://github.com/Macro-swift/Macro.git",
20-
from: "1.0.2"),
20+
from: "1.0.4"),
2121
.package(url: "https://github.com/AlwaysRightInstitute/mustache.git",
2222
from: "1.0.2")
2323
],

Sources/express/RouteFactories.swift

Lines changed: 59 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// Noze.io / Macro
44
//
55
// Created by Helge Heß on 2023-04-16.
6-
// Copyright © 2016-2023 ZeeZide GmbH. All rights reserved.
6+
// Copyright © 2016-2025 ZeeZide GmbH. All rights reserved.
77
//
88

99
import typealias connect.Middleware
@@ -162,29 +162,33 @@ public extension RouteKeeper {
162162

163163
@discardableResult
164164
@inlinable
165-
func use(id: String? = nil, _ middleware: FinalMiddleware...) -> Self {
165+
func use(id: String? = nil, _ middleware: Middleware...,
166+
final: @escaping FinalMiddleware) -> Self
167+
{
166168
add(route: Route(id: id, pattern: nil, method: nil,
167-
middleware: middleware.map(final2middleware)))
169+
middleware: middleware + [ final2middleware(final) ]))
168170
return self
169171
}
170172

171173
@discardableResult
172174
@inlinable
173175
func use(id: String? = nil, _ pathPattern: String,
174-
_ middleware: FinalMiddleware...) -> Self
176+
_ middleware: Middleware..., final: @escaping FinalMiddleware)
177+
-> Self
175178
{
176179
add(route: Route(id: id, pattern: pathPattern, method: nil,
177-
middleware: middleware.map(final2middleware)))
180+
middleware: middleware + [ final2middleware(final) ]))
178181
return self
179182
}
180183

181184
@discardableResult
182185
@inlinable
183186
func all(id: String? = nil, _ pathPattern: String,
184-
_ middleware: FinalMiddleware...) -> Self
187+
_ middleware: Middleware..., final: @escaping FinalMiddleware)
188+
-> Self
185189
{
186190
add(route: Route(id: id, pattern: pathPattern, method: nil,
187-
middleware: middleware.map(final2middleware)))
191+
middleware: middleware + [ final2middleware(final) ]))
188192
return self
189193
}
190194

@@ -193,98 +197,122 @@ public extension RouteKeeper {
193197
@discardableResult
194198
@inlinable
195199
func get(id: String? = nil, _ pathPattern: String,
196-
_ middleware: FinalMiddleware...) -> Self
200+
_ middleware: Middleware..., final: @escaping FinalMiddleware)
201+
-> Self
197202
{
198203
add(route: Route(id: id, pattern: pathPattern, method: .GET,
199-
middleware: middleware.map(final2middleware)))
204+
middleware: middleware + [ final2middleware(final) ]))
200205
return self
201206
}
202207
@discardableResult
203208
@inlinable
204209
func post(id: String? = nil, _ pathPattern: String,
205-
_ middleware: FinalMiddleware...) -> Self
210+
_ middleware: Middleware..., final: @escaping FinalMiddleware)
211+
-> Self
206212
{
207213
add(route: Route(id: id, pattern: pathPattern, method: .POST,
208-
middleware: middleware.map(final2middleware)))
214+
middleware: middleware + [ final2middleware(final) ]))
209215
return self
210216
}
211217
@discardableResult
212218
@inlinable
213219
func head(id: String? = nil, _ pathPattern: String,
214-
_ middleware: FinalMiddleware...) -> Self
220+
_ middleware: Middleware..., final: @escaping FinalMiddleware)
221+
-> Self
215222
{
216223
add(route: Route(id: id, pattern: pathPattern, method: .HEAD,
217-
middleware: middleware.map(final2middleware)))
224+
middleware: middleware + [ final2middleware(final) ]))
218225
return self
219226
}
220227
@discardableResult
221228
@inlinable
222229
func put(id: String? = nil, _ pathPattern: String,
223-
_ middleware: FinalMiddleware...) -> Self
230+
_ middleware: Middleware..., final: @escaping FinalMiddleware)
231+
-> Self
224232
{
225233
add(route: Route(id: id, pattern: pathPattern, method: .PUT,
226-
middleware: middleware.map(final2middleware)))
234+
middleware: middleware + [ final2middleware(final) ]))
227235
return self
228236
}
229237
@discardableResult
230238
@inlinable
231239
func del(id: String? = nil, _ pathPattern: String,
232-
_ middleware: FinalMiddleware...) -> Self
240+
_ middleware: Middleware..., final: @escaping FinalMiddleware)
241+
-> Self
233242
{
234243
add(route: Route(id: id, pattern: pathPattern, method: .DELETE,
235-
middleware: middleware.map(final2middleware)))
244+
middleware: middleware + [ final2middleware(final) ]))
236245
return self
237246
}
238247
@discardableResult
239248
@inlinable
240249
func patch(id: String? = nil, _ pathPattern: String,
241-
_ middleware: FinalMiddleware...) -> Self
250+
_ middleware: Middleware..., final: @escaping FinalMiddleware)
251+
-> Self
242252
{
243253
add(route: Route(id: id, pattern: pathPattern, method: .PATCH,
244-
middleware: middleware.map(final2middleware)))
254+
middleware: middleware + [ final2middleware(final) ]))
245255
return self
246256
}
247257

248258
@discardableResult
249259
@inlinable
250-
func get(id: String? = nil, _ middleware: FinalMiddleware...) -> Self {
260+
func get(id: String? = nil,
261+
_ middleware: Middleware..., final: @escaping FinalMiddleware)
262+
-> Self
263+
{
251264
add(route: Route(id: id, pattern: nil, method: .GET,
252-
middleware: middleware.map(final2middleware)))
265+
middleware: middleware + [ final2middleware(final) ]))
253266
return self
254267
}
255268
@discardableResult
256269
@inlinable
257-
func post(id: String? = nil, _ middleware: FinalMiddleware...) -> Self {
270+
func post(id: String? = nil,
271+
_ middleware: Middleware..., final: @escaping FinalMiddleware)
272+
-> Self
273+
{
258274
add(route: Route(id: id, pattern: nil, method: .POST,
259-
middleware: middleware.map(final2middleware)))
275+
middleware: middleware + [ final2middleware(final) ]))
260276
return self
261277
}
262278
@discardableResult
263279
@inlinable
264-
func head(id: String? = nil, _ middleware: FinalMiddleware...) -> Self {
280+
func head(id: String? = nil,
281+
_ middleware: Middleware..., final: @escaping FinalMiddleware)
282+
-> Self
283+
{
265284
add(route: Route(id: id, pattern: nil, method: .HEAD,
266-
middleware: middleware.map(final2middleware)))
285+
middleware: middleware + [ final2middleware(final) ]))
267286
return self
268287
}
269288
@discardableResult
270289
@inlinable
271-
func put(id: String? = nil, _ middleware: FinalMiddleware...) -> Self {
290+
func put(id: String? = nil,
291+
_ middleware: Middleware..., final: @escaping FinalMiddleware)
292+
-> Self
293+
{
272294
add(route: Route(id: id, pattern: nil, method: .PUT,
273-
middleware: middleware.map(final2middleware)))
295+
middleware: middleware + [ final2middleware(final) ]))
274296
return self
275297
}
276298
@discardableResult
277299
@inlinable
278-
func del(id: String? = nil, _ middleware: FinalMiddleware...) -> Self {
300+
func del(id: String? = nil,
301+
_ middleware: Middleware..., final: @escaping FinalMiddleware)
302+
-> Self
303+
{
279304
add(route: Route(id: id, pattern: nil, method: .DELETE,
280-
middleware: middleware.map(final2middleware)))
305+
middleware: middleware + [ final2middleware(final) ]))
281306
return self
282307
}
283308
@discardableResult
284309
@inlinable
285-
func patch(id: String? = nil, _ middleware: FinalMiddleware...) -> Self {
310+
func patch(id: String? = nil,
311+
_ middleware: Middleware..., final: @escaping FinalMiddleware)
312+
-> Self
313+
{
286314
add(route: Route(id: id, pattern: nil, method: .PATCH,
287-
middleware: middleware.map(final2middleware)))
315+
middleware: middleware + [ final2middleware(final) ]))
288316
return self
289317
}
290318
}

Sources/multer/File.swift

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,18 @@
33
// MacroExpress / multer
44
//
55
// Created by Helge Heß on 30/05/16.
6-
// Copyright © 2021 ZeeZide GmbH. All rights reserved.
6+
// Copyright © 2021-2025 ZeeZide GmbH. All rights reserved.
77
//
88

99
import struct MacroCore.Buffer
1010

1111
public extension multer {
1212

13+
/**
14+
* Represents a file that got uploaded by ``multer``. It carries the field
15+
* name, the filename, the mime type, and if the ``MemoryStorage`` was used,
16+
* the file contents.
17+
*/
1318
final class File: Equatable {
1419

1520
/// Name in form field
@@ -39,6 +44,17 @@ public extension multer {
3944
*/
4045
public var buffer : Buffer?
4146

47+
/**
48+
* Create a new multer file object.
49+
*
50+
* - Parameters:
51+
* - fieldName: Name of the form field that contains the file
52+
* - originalName: Name of file (filename in content-disposition)
53+
* - mimeType: MIME type of the file, defaults to octet-stream if n/a.
54+
* - path: Path to stored file on the server, if used w/ disk
55+
* storage.
56+
* - buffer: Contents of file, if loaded into memory.
57+
*/
4258
@inlinable
4359
public init(fieldName : String,
4460
originalName : String,
@@ -53,6 +69,17 @@ public extension multer {
5369
self.buffer = buffer
5470
}
5571

72+
/**
73+
* Returns true if this has a nil ``path`` or ``buffer`` and no
74+
* ``originalName`` set.
75+
*
76+
* It may still have a ``mimeType`` set to `application/octet-stream`.
77+
*/
78+
@inlinable
79+
public var isEmpty: Bool {
80+
originalName.isEmpty && path == nil && buffer == nil
81+
}
82+
5683
@inlinable
5784
public static func ==(lhs: File, rhs: File) -> Bool {
5885
return lhs.fieldName == rhs.fieldName

Sources/multer/Limits.swift

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,17 @@
33
// MacroExpress / multer
44
//
55
// Created by Helge Heß on 30/05/16.
6-
// Copyright © 2021 ZeeZide GmbH. All rights reserved.
6+
// Copyright © 2021-2025 ZeeZide GmbH. All rights reserved.
77
//
88

99
public extension multer {
1010

11+
/**
12+
* Upload limits configuration for multer.
13+
*
14+
* This allows to configure file size or count limits. And various other
15+
* limits.
16+
*/
1117
struct Limits {
1218

1319
/// Maximum size of field names (100 bytes)
@@ -29,6 +35,22 @@ public extension multer {
2935
/// Note: This is not checked yet.
3036
public var headerPairs : Int? = 2000
3137

38+
/**
39+
* Create a new multer limits configuration.
40+
*
41+
* All parameters are optional, defaults:
42+
* - field name size: 100
43+
* - field size: 1MB
44+
* - header pairs: 2000
45+
*
46+
* - Parameters:
47+
* - fieldNameSize: Maximum size of field names (100 bytes)
48+
* - fieldSize: Maximum size of field value (1MB)
49+
* - fields: Maximum number of non-file fields (unlimited)
50+
* - fileSize: Max file size (unlimited)
51+
* - files: Maximum number of file fields (unlimited)
52+
* - headerPairs: Maximum number of header fields (2000)
53+
*/
3254
public init(fieldNameSize : Int? = 100,
3355
fieldSize : Int? = 1024 * 1024,
3456
fields : Int? = nil,

Sources/multer/MemoryStorage.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,19 @@
33
// MacroExpress / multer
44
//
55
// Created by Helge Heß on 30/05/16.
6-
// Copyright © 2021 ZeeZide GmbH. All rights reserved.
6+
// Copyright © 2021-2025 ZeeZide GmbH. All rights reserved.
77
//
88

99
import struct MacroCore.Buffer
1010

1111
extension multer {
1212

13+
/**
14+
* A ``MulterStorage`` that writes the file contents to the ``File/buffer``
15+
* property of the ``File`` object, i.e. stores it in-memory.
16+
*/
1317
open class MemoryStorage: MulterStorage {
18+
// TBD: does this have to be a class?
1419

1520
public init() {}
1621

Sources/multer/Middleware.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ public extension multer {
1717
*
1818
* There are multiple convenience methods to restrict the set of fields to
1919
* accept:
20-
* - `single(fieldName)` (accept just one file for the specified name)
21-
* - `array(fieldName)` (accept just multiple files for the specified name)
22-
* - `none` (accept no file, just form regular fields)
23-
* - `any` (accept all files, careful!)
20+
* - ``single(_:)``: accept just one file for the specified name
21+
* - ``array(_:_:)``: accept just multiple files for the specified name
22+
* - ``none()``: accept no file, just form regular fields
23+
* - ``any()``: accept all files, careful!
2424
*
2525
* All convenience methods call into this middleware.
2626
*

0 commit comments

Comments
 (0)