velocious 1.0.103 → 1.0.105
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/package.json +1 -1
- package/spec/database/record/create-spec.js +7 -0
- package/spec/dummy/dummy-directory.js +2 -0
- package/spec/dummy/index.js +5 -1
- package/spec/dummy/src/model-bases/project.js +18 -0
- package/src/application.js +1 -0
- package/src/configuration-types.js +6 -0
- package/src/controller.js +44 -24
- package/src/database/drivers/base-foreign-key.js +1 -1
- package/src/database/drivers/base.js +2 -2
- package/src/database/drivers/mssql/column.js +6 -0
- package/src/database/drivers/mssql/columns-index.js +2 -5
- package/src/database/drivers/mssql/foreign-key.js +2 -0
- package/src/database/drivers/mssql/options.js +25 -0
- package/src/database/drivers/mssql/query-parser.js +2 -0
- package/src/database/drivers/mysql/options.js +9 -0
- package/src/database/drivers/mysql/sql/alter-table.js +2 -0
- package/src/database/drivers/mysql/sql/create-database.js +2 -0
- package/src/database/drivers/mysql/sql/create-index.js +2 -0
- package/src/database/drivers/mysql/sql/create-table.js +2 -0
- package/src/database/drivers/mysql/sql/delete.js +2 -0
- package/src/database/drivers/mysql/sql/drop-table.js +2 -0
- package/src/database/drivers/mysql/sql/insert.js +2 -0
- package/src/database/drivers/mysql/sql/update.js +2 -0
- package/src/database/drivers/pgsql/column.js +6 -0
- package/src/database/drivers/pgsql/columns-index.js +2 -0
- package/src/database/drivers/pgsql/foreign-key.js +2 -0
- package/src/database/drivers/pgsql/options.js +9 -0
- package/src/database/drivers/pgsql/query-parser.js +2 -0
- package/src/database/drivers/pgsql/sql/alter-table.js +2 -0
- package/src/database/drivers/pgsql/sql/create-database.js +5 -4
- package/src/database/drivers/pgsql/sql/create-index.js +2 -0
- package/src/database/drivers/pgsql/sql/create-table.js +2 -0
- package/src/database/drivers/pgsql/sql/delete.js +2 -0
- package/src/database/drivers/pgsql/sql/drop-table.js +2 -0
- package/src/database/drivers/pgsql/sql/insert.js +2 -0
- package/src/database/drivers/pgsql/sql/update.js +2 -0
- package/src/database/drivers/pgsql/table.js +6 -0
- package/src/database/drivers/sqlite/columns-index.js +2 -6
- package/src/database/drivers/sqlite/connection-remote.js +7 -0
- package/src/database/drivers/sqlite/connection-sql-js.js +12 -2
- package/src/database/drivers/sqlite/foreign-key.js +7 -0
- package/src/database/drivers/sqlite/index.js +7 -1
- package/src/database/drivers/sqlite/index.web.js +12 -3
- package/src/database/drivers/sqlite/options.js +9 -0
- package/src/database/drivers/sqlite/query-parser.js +2 -0
- package/src/database/drivers/sqlite/query.js +19 -6
- package/src/database/drivers/sqlite/query.web.js +13 -1
- package/src/database/initializer-from-require-context.js +11 -1
- package/src/database/migrator/types.js +2 -0
- package/src/database/pool/base-methods-forward.js +7 -0
- package/src/database/query/delete-base.js +8 -0
- package/src/database/query/preloader/belongs-to.js +16 -1
- package/src/database/query/preloader/has-many.js +19 -1
- package/src/database/query/preloader/has-one.js +20 -2
- package/src/database/query/preloader.js +19 -4
- package/src/database/query/update-base.js +9 -0
- package/src/database/query-parser/limit-parser.js +7 -2
- package/src/database/query-parser/options.js +47 -6
- package/src/database/query-parser/order-parser.js +11 -6
- package/src/database/query-parser/select-parser.js +8 -5
- package/src/database/query-parser/where-parser.js +11 -5
- package/src/database/record/index.js +28 -24
- package/src/database/record/instance-relationships/base.js +10 -1
- package/src/database/record/record-not-found-error.js +2 -0
- package/src/database/record/user-module.js +13 -0
- package/src/database/record/validators/uniqueness.js +13 -2
- package/src/environment-handlers/node/cli/commands/generate/base-models.js +19 -0
- package/src/error-logger.js +17 -3
- package/src/http-client/index.js +34 -2
- package/src/http-client/request.js +1 -1
- package/src/http-server/client/params-to-object.js +28 -0
- package/src/initializer.js +2 -0
- package/src/routes/app-routes.js +3 -1
- package/src/routes/base-route.js +67 -58
- package/src/routes/basic-route.js +76 -0
- package/src/routes/get-route.js +21 -5
- package/src/routes/index.js +10 -0
- package/src/routes/namespace-route.js +21 -5
- package/src/routes/post-route.js +20 -5
- package/src/routes/resolver.js +15 -2
- package/src/routes/resource-route.js +21 -5
- package/src/routes/root-route.js +3 -3
- package/src/testing/request-client.js +19 -14
- package/src/testing/test-runner.js +16 -10
- package/src/testing/test.js +70 -22
- package/src/utils/with-tracked-stack-async-hooks.js +22 -4
- package/src/utils/with-tracked-stack.js +9 -0
package/src/routes/base-route.js
CHANGED
|
@@ -1,73 +1,82 @@
|
|
|
1
|
-
|
|
2
|
-
import NamespaceRoute from "./namespace-route.js"
|
|
3
|
-
import PostRoute from "./post-route.js"
|
|
4
|
-
import ResourceRoute from "./resource-route.js"
|
|
1
|
+
// @ts-check
|
|
5
2
|
|
|
6
|
-
|
|
3
|
+
export default class VelociousBaseRoute {
|
|
4
|
+
/** @type {typeof import("./get-route.js").default} */
|
|
5
|
+
static GetRouteType
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
/** @type {typeof import("./namespace-route.js").default} */
|
|
8
|
+
static NameSpaceRouteType
|
|
10
9
|
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
/** @type {typeof import("./post-route.js").default} */
|
|
11
|
+
static PostRouteType
|
|
13
12
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
*/
|
|
17
|
-
get(name) {
|
|
18
|
-
const route = new GetRoute({name})
|
|
13
|
+
/** @type {typeof import("./resource-route.js").default} */
|
|
14
|
+
static ResourceRouteType
|
|
19
15
|
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
/** @param {typeof import("./get-route.js").default} RouteClass */
|
|
17
|
+
static registerRouteGetType(RouteClass) {
|
|
18
|
+
this.GetRouteType = RouteClass
|
|
19
|
+
}
|
|
22
20
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
matchWithPath(_path) { // eslint-disable-line no-unused-vars
|
|
28
|
-
throw new Error(`No 'matchWithPath' implemented on ${this.constructor.name}`)
|
|
29
|
-
}
|
|
21
|
+
/** @param {typeof import("./namespace-route.js").default} RouteClass */
|
|
22
|
+
static registerRouteNamespaceType(RouteClass) {
|
|
23
|
+
this.NameSpaceRouteType = RouteClass
|
|
24
|
+
}
|
|
30
25
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
*/
|
|
36
|
-
namespace(name, callback) {
|
|
37
|
-
const route = new NamespaceRoute({name})
|
|
26
|
+
/** @param {typeof import("./post-route.js").default} RouteClass */
|
|
27
|
+
static registerRoutePostType(RouteClass) {
|
|
28
|
+
this.PostRouteType = RouteClass
|
|
29
|
+
}
|
|
38
30
|
|
|
39
|
-
|
|
31
|
+
/** @param {typeof import("./resource-route.js").default} RouteClass */
|
|
32
|
+
static registerRouteResourceType(RouteClass) {
|
|
33
|
+
this.ResourceRouteType = RouteClass
|
|
34
|
+
}
|
|
40
35
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
36
|
+
constructor() {
|
|
37
|
+
// Nothing
|
|
38
|
+
}
|
|
45
39
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
* @returns {void}
|
|
49
|
-
*/
|
|
50
|
-
post(name) {
|
|
51
|
-
const route = new PostRoute({name})
|
|
40
|
+
/** @type {Array<VelociousBaseRoute>} */
|
|
41
|
+
routes = []
|
|
52
42
|
|
|
53
|
-
|
|
54
|
-
|
|
43
|
+
/**
|
|
44
|
+
* @abstract
|
|
45
|
+
* @param {string} name
|
|
46
|
+
*/
|
|
47
|
+
get(name) { throw new Error("'get' not implemented") } // eslint-disable-line no-unused-vars
|
|
55
48
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
49
|
+
/**
|
|
50
|
+
* @param {object} args
|
|
51
|
+
* @param {Record<string, any>} args.params
|
|
52
|
+
* @param {string} args.path
|
|
53
|
+
* @param {import("../http-server/client/request.js").default} args.request
|
|
54
|
+
* @returns {{restPath: string} | undefined}
|
|
55
|
+
*/
|
|
56
|
+
matchWithPath({params, path, request}) { // eslint-disable-line no-unused-vars
|
|
57
|
+
throw new Error(`No 'matchWithPath' implemented on ${this.constructor.name}`)
|
|
58
|
+
}
|
|
63
59
|
|
|
64
|
-
|
|
60
|
+
/**
|
|
61
|
+
* @abstract
|
|
62
|
+
* @param {string} name
|
|
63
|
+
* @param {function(import("./namespace-route.js").default) : void} callback
|
|
64
|
+
* @returns {void}
|
|
65
|
+
*/
|
|
66
|
+
namespace(name, callback) { throw new Error("'namespace' not implemented") } // eslint-disable-line no-unused-vars
|
|
65
67
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
68
|
+
/**
|
|
69
|
+
* @abstract
|
|
70
|
+
* @param {string} name
|
|
71
|
+
* @returns {void}
|
|
72
|
+
*/
|
|
73
|
+
post(name) { throw new Error("'post' not implemented") } // eslint-disable-line no-unused-vars
|
|
72
74
|
|
|
73
|
-
|
|
75
|
+
/**
|
|
76
|
+
* @abstract
|
|
77
|
+
* @param {string} name
|
|
78
|
+
* @param {function(import("./resource-route.js").default) : void} callback
|
|
79
|
+
* @returns {void}
|
|
80
|
+
*/
|
|
81
|
+
resources(name, callback) { throw new Error("'resources' not implemented") } // eslint-disable-line no-unused-vars
|
|
82
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import BaseRoute from "./base-route.js"
|
|
4
|
+
|
|
5
|
+
export default class VelociousBasicRoute extends BaseRoute {
|
|
6
|
+
/** @param {string} name */
|
|
7
|
+
get(name) {
|
|
8
|
+
const GetRoute = VelociousBasicRoute.GetRouteType
|
|
9
|
+
const route = new GetRoute({name})
|
|
10
|
+
|
|
11
|
+
this.routes.push(route)
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @param {object} args
|
|
16
|
+
* @param {Record<string, any>} args.params
|
|
17
|
+
* @param {string} args.path
|
|
18
|
+
* @param {import("../http-server/client/request.js").default} args.request
|
|
19
|
+
* @returns {{restPath: string} | undefined}
|
|
20
|
+
*/
|
|
21
|
+
matchWithPath({params, path, request}) { // eslint-disable-line no-unused-vars
|
|
22
|
+
throw new Error(`No 'matchWithPath' implemented on ${this.constructor.name}`)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @param {string} name
|
|
27
|
+
* @param {function(import("./namespace-route.js").default) : void} callback
|
|
28
|
+
* @returns {void}
|
|
29
|
+
*/
|
|
30
|
+
namespace(name, callback) {
|
|
31
|
+
const NamespaceRoute = VelociousBasicRoute.NameSpaceRouteType
|
|
32
|
+
|
|
33
|
+
if (!NamespaceRoute) throw new Error("No NamespaceRoute registered")
|
|
34
|
+
|
|
35
|
+
const route = new NamespaceRoute({name})
|
|
36
|
+
|
|
37
|
+
this.routes.push(route)
|
|
38
|
+
|
|
39
|
+
if (callback) {
|
|
40
|
+
callback(route)
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @param {string} name
|
|
46
|
+
* @returns {void}
|
|
47
|
+
*/
|
|
48
|
+
post(name) {
|
|
49
|
+
const PostRoute = VelociousBasicRoute.PostRouteType
|
|
50
|
+
|
|
51
|
+
if (!PostRoute) throw new Error("No PostRoute registered")
|
|
52
|
+
|
|
53
|
+
const route = new PostRoute({name})
|
|
54
|
+
|
|
55
|
+
this.routes.push(route)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* @param {string} name
|
|
60
|
+
* @param {function(import("./resource-route.js").default) : void} callback
|
|
61
|
+
* @returns {void}
|
|
62
|
+
*/
|
|
63
|
+
resources(name, callback) {
|
|
64
|
+
const ResourceRoute = VelociousBasicRoute.ResourceRouteType
|
|
65
|
+
|
|
66
|
+
if (!ResourceRoute) throw new Error("No ResourceRoute registered")
|
|
67
|
+
|
|
68
|
+
const route = new ResourceRoute({name})
|
|
69
|
+
|
|
70
|
+
this.routes.push(route)
|
|
71
|
+
|
|
72
|
+
if (callback) {
|
|
73
|
+
callback(route)
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
package/src/routes/get-route.js
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
2
3
|
import escapeStringRegexp from "escape-string-regexp"
|
|
3
|
-
import restArgsError from "../utils/rest-args-error.js"
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
import BaseRoute from "./base-route.js"
|
|
6
|
+
import restArgsError from "../utils/rest-args-error.js"
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
class VelociousRouteGetRoute extends BaseRoute {
|
|
9
|
+
/**
|
|
10
|
+
* @param {object} args
|
|
11
|
+
* @param {string} args.name
|
|
12
|
+
*/
|
|
8
13
|
constructor({name, ...restArgs}) {
|
|
9
14
|
super()
|
|
10
15
|
restArgsError(restArgs)
|
|
@@ -12,7 +17,14 @@ export default class VelociousRouteGetRoute extends BaseRoute {
|
|
|
12
17
|
this.regExp = new RegExp(`^(${escapeStringRegexp(name)})(.*)$`)
|
|
13
18
|
}
|
|
14
19
|
|
|
15
|
-
|
|
20
|
+
/**
|
|
21
|
+
* @param {object} args
|
|
22
|
+
* @param {Record<string, any>} args.params
|
|
23
|
+
* @param {string} args.path
|
|
24
|
+
* @param {import("../http-server/client/request.js").default} args.request
|
|
25
|
+
* @returns {{restPath: string} | undefined}
|
|
26
|
+
*/
|
|
27
|
+
matchWithPath({params, path, request}) { // eslint-disable-line no-unused-vars
|
|
16
28
|
const match = path.match(this.regExp)
|
|
17
29
|
|
|
18
30
|
if (match) {
|
|
@@ -24,3 +36,7 @@ export default class VelociousRouteGetRoute extends BaseRoute {
|
|
|
24
36
|
}
|
|
25
37
|
}
|
|
26
38
|
}
|
|
39
|
+
|
|
40
|
+
BaseRoute.registerRouteGetType(VelociousRouteGetRoute)
|
|
41
|
+
|
|
42
|
+
export default VelociousRouteGetRoute
|
package/src/routes/index.js
CHANGED
|
@@ -1,8 +1,18 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import GetRoute from "./get-route.js" // eslint-disable-line no-unused-vars
|
|
4
|
+
import NameSpaceRoute from "./namespace-route.js" // eslint-disable-line no-unused-vars
|
|
5
|
+
import PostRoute from "./post-route.js" // eslint-disable-line no-unused-vars
|
|
1
6
|
import RootRoute from "./root-route.js"
|
|
7
|
+
import ResourceRoute from "./resource-route.js" // eslint-disable-line no-unused-vars
|
|
2
8
|
|
|
3
9
|
export default class VelociousRoutes {
|
|
4
10
|
rootRoute = new RootRoute()
|
|
5
11
|
|
|
12
|
+
/**
|
|
13
|
+
* @param {function(import("./root-route.js").default) : void} callback
|
|
14
|
+
* @returns {void}
|
|
15
|
+
*/
|
|
6
16
|
draw(callback) {
|
|
7
17
|
callback(this.rootRoute)
|
|
8
18
|
}
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
1
3
|
import restArgsError from "../utils/rest-args-error.js"
|
|
2
|
-
import BaseRoute
|
|
4
|
+
import BaseRoute from "./base-route.js"
|
|
5
|
+
import BasicRoute from "./base-route.js"
|
|
3
6
|
import escapeStringRegexp from "escape-string-regexp"
|
|
4
7
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
+
class VelociousRouteNamespaceRoute extends BasicRoute {
|
|
9
|
+
/**
|
|
10
|
+
* @param {object} args
|
|
11
|
+
* @param {string} args.name
|
|
12
|
+
*/
|
|
8
13
|
constructor({name, ...restArgs}) {
|
|
9
14
|
super()
|
|
10
15
|
restArgsError(restArgs)
|
|
@@ -12,7 +17,14 @@ export default class VelociousRouteNamespaceRoute extends BaseRoute {
|
|
|
12
17
|
this.regExp = new RegExp(`^(${escapeStringRegexp(name)})(.*)$`)
|
|
13
18
|
}
|
|
14
19
|
|
|
15
|
-
|
|
20
|
+
/**
|
|
21
|
+
* @param {object} args
|
|
22
|
+
* @param {Record<string, any>} args.params
|
|
23
|
+
* @param {string} args.path
|
|
24
|
+
* @param {import("../http-server/client/request.js").default} args.request
|
|
25
|
+
* @returns {{restPath: string} | undefined}
|
|
26
|
+
*/
|
|
27
|
+
matchWithPath({params, path, request}) { // eslint-disable-line no-unused-vars
|
|
16
28
|
const match = path.match(this.regExp)
|
|
17
29
|
|
|
18
30
|
if (match) {
|
|
@@ -24,3 +36,7 @@ export default class VelociousRouteNamespaceRoute extends BaseRoute {
|
|
|
24
36
|
}
|
|
25
37
|
}
|
|
26
38
|
}
|
|
39
|
+
|
|
40
|
+
BaseRoute.registerRouteNamespaceType(VelociousRouteNamespaceRoute)
|
|
41
|
+
|
|
42
|
+
export default VelociousRouteNamespaceRoute
|
package/src/routes/post-route.js
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import BaseRoute from "./base-route.js"
|
|
2
4
|
import escapeStringRegexp from "escape-string-regexp"
|
|
3
5
|
import restArgsError from "../utils/rest-args-error.js"
|
|
4
6
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
class VelociousRoutePostRoute extends BaseRoute {
|
|
8
|
+
/**
|
|
9
|
+
* @param {object} args
|
|
10
|
+
* @param {string} args.name
|
|
11
|
+
*/
|
|
8
12
|
constructor({name, ...restArgs}) {
|
|
9
13
|
super()
|
|
10
14
|
restArgsError(restArgs)
|
|
@@ -12,7 +16,14 @@ export default class VelociousRoutePostRoute extends BaseRoute {
|
|
|
12
16
|
this.regExp = new RegExp(`^(${escapeStringRegexp(name)})(.*)$`)
|
|
13
17
|
}
|
|
14
18
|
|
|
15
|
-
|
|
19
|
+
/**
|
|
20
|
+
* @param {object} args
|
|
21
|
+
* @param {Record<string, any>} args.params
|
|
22
|
+
* @param {string} args.path
|
|
23
|
+
* @param {import("../http-server/client/request.js").default} args.request
|
|
24
|
+
* @returns {{restPath: string} | undefined}
|
|
25
|
+
*/
|
|
26
|
+
matchWithPath({params, path, request}) { // eslint-disable-line no-unused-vars
|
|
16
27
|
const match = path.match(this.regExp)
|
|
17
28
|
|
|
18
29
|
if (match) {
|
|
@@ -24,3 +35,7 @@ export default class VelociousRoutePostRoute extends BaseRoute {
|
|
|
24
35
|
}
|
|
25
36
|
}
|
|
26
37
|
}
|
|
38
|
+
|
|
39
|
+
BaseRoute.registerRoutePostType(VelociousRoutePostRoute)
|
|
40
|
+
|
|
41
|
+
export default VelociousRoutePostRoute
|
package/src/routes/resolver.js
CHANGED
|
@@ -1,10 +1,18 @@
|
|
|
1
|
-
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import {digg} from "diggerize"
|
|
2
4
|
import {dirname} from "path"
|
|
3
5
|
import {fileURLToPath} from "url"
|
|
4
6
|
import fs from "fs/promises"
|
|
5
7
|
import * as inflection from "inflection"
|
|
6
8
|
|
|
7
9
|
export default class VelociousRoutesResolver {
|
|
10
|
+
/**
|
|
11
|
+
* @param {object} args
|
|
12
|
+
* @param {import("../configuration.js").default} args.configuration
|
|
13
|
+
* @param {import("../http-server/client/request.js").default} args.request
|
|
14
|
+
* @param {import("../http-server/client/response.js").default} args.response
|
|
15
|
+
*/
|
|
8
16
|
constructor({configuration, request, response}) {
|
|
9
17
|
if (!configuration) throw new Error("No configuration given")
|
|
10
18
|
if (!request) throw new Error("No request given")
|
|
@@ -65,6 +73,11 @@ export default class VelociousRoutesResolver {
|
|
|
65
73
|
})
|
|
66
74
|
}
|
|
67
75
|
|
|
76
|
+
/**
|
|
77
|
+
* @param {import("./base-route.js").default} route
|
|
78
|
+
* @param {string} path
|
|
79
|
+
* @returns {{restPath: string} | undefined}
|
|
80
|
+
*/
|
|
68
81
|
matchPathWithRoutes(route, path) {
|
|
69
82
|
const pathWithoutSlash = path.replace(/^\//, "")
|
|
70
83
|
|
|
@@ -77,7 +90,7 @@ export default class VelociousRoutesResolver {
|
|
|
77
90
|
|
|
78
91
|
if (!matchResult) continue
|
|
79
92
|
|
|
80
|
-
const {restPath} =
|
|
93
|
+
const {restPath} = matchResult
|
|
81
94
|
|
|
82
95
|
if (restPath) {
|
|
83
96
|
return this.matchPathWithRoutes(subRoute, restPath)
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import BaseRoute from "./base-route.js"
|
|
4
|
+
import BasicRoute from "./basic-route.js"
|
|
2
5
|
import escapeStringRegexp from "escape-string-regexp"
|
|
3
6
|
import restArgsError from "../utils/rest-args-error.js"
|
|
4
7
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
+
class VelociousRouteResourceRoute extends BasicRoute {
|
|
9
|
+
/**
|
|
10
|
+
* @param {object} args
|
|
11
|
+
* @param {string} args.name
|
|
12
|
+
*/
|
|
8
13
|
constructor({name, ...restArgs}) {
|
|
9
14
|
super()
|
|
10
15
|
restArgsError(restArgs)
|
|
@@ -12,6 +17,13 @@ export default class VelociousRouteResourceRoute extends BaseRoute {
|
|
|
12
17
|
this.regExp = new RegExp(`^(${escapeStringRegexp(name)})(.*)$`)
|
|
13
18
|
}
|
|
14
19
|
|
|
20
|
+
/**
|
|
21
|
+
* @param {object} args
|
|
22
|
+
* @param {Record<string, any>} args.params
|
|
23
|
+
* @param {string} args.path
|
|
24
|
+
* @param {import("../http-server/client/request.js").default} args.request
|
|
25
|
+
* @returns {{restPath: string} | undefined}
|
|
26
|
+
*/
|
|
15
27
|
matchWithPath({params, path, request}) {
|
|
16
28
|
const match = path.match(this.regExp)
|
|
17
29
|
|
|
@@ -22,7 +34,7 @@ export default class VelociousRouteResourceRoute extends BaseRoute {
|
|
|
22
34
|
let subRoutesMatchesRestPath = false
|
|
23
35
|
|
|
24
36
|
for (const route of this.routes) {
|
|
25
|
-
if (route.matchWithPath({path: restPath})) {
|
|
37
|
+
if (route.matchWithPath({params, path: restPath, request})) {
|
|
26
38
|
subRoutesMatchesRestPath = true
|
|
27
39
|
}
|
|
28
40
|
}
|
|
@@ -43,3 +55,7 @@ export default class VelociousRouteResourceRoute extends BaseRoute {
|
|
|
43
55
|
}
|
|
44
56
|
}
|
|
45
57
|
}
|
|
58
|
+
|
|
59
|
+
BaseRoute.registerRouteResourceType(VelociousRouteResourceRoute)
|
|
60
|
+
|
|
61
|
+
export default VelociousRouteResourceRoute
|
package/src/routes/root-route.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
// @ts-check
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
import BasicRoute from "./basic-route.js"
|
|
4
4
|
|
|
5
|
-
export default class VelociousRootRoute extends
|
|
5
|
+
export default class VelociousRootRoute extends BasicRoute {
|
|
6
6
|
}
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
1
3
|
class Response {
|
|
4
|
+
/**
|
|
5
|
+
* @param {globalThis.Response} fetchResponse
|
|
6
|
+
*/
|
|
2
7
|
constructor(fetchResponse) {
|
|
3
8
|
this.fetchResponse = fetchResponse
|
|
4
9
|
}
|
|
5
10
|
|
|
6
11
|
/**
|
|
7
|
-
* @returns {void}
|
|
12
|
+
* @returns {Promise<void>}
|
|
8
13
|
*/
|
|
9
14
|
async parse() {
|
|
10
15
|
this._body = await this.fetchResponse.text()
|
|
@@ -12,19 +17,19 @@ class Response {
|
|
|
12
17
|
if (this.statusCode() != 200) throw new Error(`Request failed with code ${this.statusCode()} and body: ${this.body()}`)
|
|
13
18
|
}
|
|
14
19
|
|
|
15
|
-
/**
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
body() { return this._body }
|
|
20
|
+
/** @returns {string} */
|
|
21
|
+
body() {
|
|
22
|
+
if (!this._body) throw new Error("Response body not parsed yet. Call parse() first.")
|
|
19
23
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
*/
|
|
23
|
-
contentType() { return this.fetchResponse.headers.get("content-type") }
|
|
24
|
+
return this._body
|
|
25
|
+
}
|
|
24
26
|
|
|
25
|
-
/**
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
/** @returns {string | null} */
|
|
28
|
+
contentType() {
|
|
29
|
+
return this.fetchResponse.headers.get("content-type")
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** @returns {number} */
|
|
28
33
|
statusCode() { return this.fetchResponse.status }
|
|
29
34
|
}
|
|
30
35
|
|
|
@@ -34,7 +39,7 @@ export default class RequestClient {
|
|
|
34
39
|
|
|
35
40
|
/**
|
|
36
41
|
* @param {string} path
|
|
37
|
-
* @returns {Response}
|
|
42
|
+
* @returns {Promise<Response>}
|
|
38
43
|
*/
|
|
39
44
|
async get(path) {
|
|
40
45
|
const fetchResponse = await fetch(`http://${this.host}:${this.port}${path}`)
|
|
@@ -48,7 +53,7 @@ export default class RequestClient {
|
|
|
48
53
|
/**
|
|
49
54
|
* @param {string} path
|
|
50
55
|
* @param {object} data
|
|
51
|
-
* @returns {Response}
|
|
56
|
+
* @returns {Promise<Response>}
|
|
52
57
|
*/
|
|
53
58
|
async post(path, data) {
|
|
54
59
|
const fetchResponse = await fetch(
|
|
@@ -9,10 +9,11 @@ import {tests} from "./test.js"
|
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* @typedef {object} TestArgs
|
|
12
|
-
* @property {Application} application
|
|
13
|
-
* @property {RequestClient} client
|
|
14
|
-
* @property {boolean} focus
|
|
15
|
-
* @property {
|
|
12
|
+
* @property {Application} [application]
|
|
13
|
+
* @property {RequestClient} [client]
|
|
14
|
+
* @property {boolean} [focus]
|
|
15
|
+
* @property {() => Promise<void>} [function]
|
|
16
|
+
* @property {string} [type]
|
|
16
17
|
*/
|
|
17
18
|
|
|
18
19
|
/**
|
|
@@ -22,15 +23,20 @@ import {tests} from "./test.js"
|
|
|
22
23
|
*/
|
|
23
24
|
|
|
24
25
|
/**
|
|
25
|
-
* @typedef {
|
|
26
|
-
|
|
26
|
+
* @typedef {function({configuration: import("../configuration.js").default, testArgs: TestArgs, testData: TestData}) : Promise<void>} AfterBeforeEachCallbackType
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @typedef {object} AfterBeforeEachCallbackObjectType
|
|
31
|
+
* @property {AfterBeforeEachCallbackType} callback
|
|
27
32
|
*/
|
|
28
33
|
|
|
29
34
|
/**
|
|
30
35
|
* @typedef {object} TestsArgument
|
|
36
|
+
* @property {Record<string, TestData>} args
|
|
31
37
|
* @property {boolean} [anyTestsFocussed]
|
|
32
|
-
* @property {
|
|
33
|
-
* @property {
|
|
38
|
+
* @property {AfterBeforeEachCallbackObjectType[]} afterEaches
|
|
39
|
+
* @property {AfterBeforeEachCallbackObjectType[]} beforeEaches
|
|
34
40
|
* @property {Record<string, TestData>} tests - A unique identifier for the node.
|
|
35
41
|
* @property {Record<string, TestsArgument>} subs - Optional child nodes. Each item is another `Node`, allowing recursion.
|
|
36
42
|
*/
|
|
@@ -212,8 +218,8 @@ export default class TestRunner {
|
|
|
212
218
|
|
|
213
219
|
/**
|
|
214
220
|
* @param {object} args
|
|
215
|
-
* @param {Array<
|
|
216
|
-
* @param {Array<
|
|
221
|
+
* @param {Array<AfterBeforeEachCallbackObjectType>} args.afterEaches
|
|
222
|
+
* @param {Array<AfterBeforeEachCallbackObjectType>} args.beforeEaches
|
|
217
223
|
* @param {TestsArgument} args.tests
|
|
218
224
|
* @param {string[]} args.descriptions
|
|
219
225
|
* @param {number} args.indentLevel
|