@furystack/rest-service 13.0.0 → 14.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/README.md +47 -28
- package/esm/actions/get-current-user.spec.js +10 -6
- package/esm/actions/get-current-user.spec.js.map +1 -1
- package/esm/actions/is-authenticated.spec.js +10 -6
- package/esm/actions/is-authenticated.spec.js.map +1 -1
- package/esm/actions/logout-action.spec.js +11 -9
- package/esm/actions/logout-action.spec.js.map +1 -1
- package/esm/actions/logout.js +1 -1
- package/esm/actions/logout.js.map +1 -1
- package/esm/actions/password-login-action.js +1 -1
- package/esm/actions/password-login-action.js.map +1 -1
- package/esm/actions/password-login-action.spec.js +23 -28
- package/esm/actions/password-login-action.spec.js.map +1 -1
- package/esm/authenticate.js +1 -1
- package/esm/authenticate.js.map +1 -1
- package/esm/authenticate.spec.js +41 -33
- package/esm/authenticate.spec.js.map +1 -1
- package/esm/authorize.spec.js +34 -29
- package/esm/authorize.spec.js.map +1 -1
- package/esm/endpoint-generators/create-delete-endpoint.d.ts +6 -11
- package/esm/endpoint-generators/create-delete-endpoint.d.ts.map +1 -1
- package/esm/endpoint-generators/create-delete-endpoint.js +7 -11
- package/esm/endpoint-generators/create-delete-endpoint.js.map +1 -1
- package/esm/endpoint-generators/create-delete-endpoint.spec.js +14 -21
- package/esm/endpoint-generators/create-delete-endpoint.spec.js.map +1 -1
- package/esm/endpoint-generators/create-get-collection-endpoint.d.ts +11 -11
- package/esm/endpoint-generators/create-get-collection-endpoint.d.ts.map +1 -1
- package/esm/endpoint-generators/create-get-collection-endpoint.js +13 -12
- package/esm/endpoint-generators/create-get-collection-endpoint.js.map +1 -1
- package/esm/endpoint-generators/create-get-collection-endpoint.spec.js +43 -70
- package/esm/endpoint-generators/create-get-collection-endpoint.spec.js.map +1 -1
- package/esm/endpoint-generators/create-get-entity-endpoint.d.ts +6 -11
- package/esm/endpoint-generators/create-get-entity-endpoint.d.ts.map +1 -1
- package/esm/endpoint-generators/create-get-entity-endpoint.js +7 -11
- package/esm/endpoint-generators/create-get-entity-endpoint.js.map +1 -1
- package/esm/endpoint-generators/create-get-entity-endpoint.spec.js +16 -33
- package/esm/endpoint-generators/create-get-entity-endpoint.spec.js.map +1 -1
- package/esm/endpoint-generators/create-get-openapi-document-action.d.ts +1 -1
- package/esm/endpoint-generators/create-get-openapi-document-action.d.ts.map +1 -1
- package/esm/endpoint-generators/create-get-openapi-document-action.js +1 -1
- package/esm/endpoint-generators/create-get-openapi-document-action.js.map +1 -1
- package/esm/endpoint-generators/create-get-schema-action.d.ts +1 -1
- package/esm/endpoint-generators/create-get-schema-action.d.ts.map +1 -1
- package/esm/endpoint-generators/create-get-schema-action.js.map +1 -1
- package/esm/endpoint-generators/create-patch-endpoint.d.ts +7 -13
- package/esm/endpoint-generators/create-patch-endpoint.d.ts.map +1 -1
- package/esm/endpoint-generators/create-patch-endpoint.js +8 -13
- package/esm/endpoint-generators/create-patch-endpoint.js.map +1 -1
- package/esm/endpoint-generators/create-patch-endpoint.spec.js +10 -17
- package/esm/endpoint-generators/create-patch-endpoint.spec.js.map +1 -1
- package/esm/endpoint-generators/create-post-endpoint.d.ts +7 -13
- package/esm/endpoint-generators/create-post-endpoint.d.ts.map +1 -1
- package/esm/endpoint-generators/create-post-endpoint.js +8 -13
- package/esm/endpoint-generators/create-post-endpoint.js.map +1 -1
- package/esm/endpoint-generators/create-post-endpoint.spec.js +41 -14
- package/esm/endpoint-generators/create-post-endpoint.spec.js.map +1 -1
- package/esm/endpoint-generators/utils.d.ts +17 -2
- package/esm/endpoint-generators/utils.d.ts.map +1 -1
- package/esm/endpoint-generators/utils.js +33 -20
- package/esm/endpoint-generators/utils.js.map +1 -1
- package/esm/get-schema-from-api.d.ts +1 -1
- package/esm/get-schema-from-api.d.ts.map +1 -1
- package/esm/get-schema-from-api.spec.js.map +1 -1
- package/esm/helpers.d.ts +53 -87
- package/esm/helpers.d.ts.map +1 -1
- package/esm/helpers.js +91 -92
- package/esm/helpers.js.map +1 -1
- package/esm/helpers.spec.d.ts +2 -1
- package/esm/helpers.spec.d.ts.map +1 -1
- package/esm/helpers.spec.js +41 -38
- package/esm/helpers.spec.js.map +1 -1
- package/esm/http-authentication-settings.d.ts +35 -12
- package/esm/http-authentication-settings.d.ts.map +1 -1
- package/esm/http-authentication-settings.js +21 -29
- package/esm/http-authentication-settings.js.map +1 -1
- package/esm/http-server-pool.d.ts +64 -0
- package/esm/http-server-pool.d.ts.map +1 -0
- package/esm/http-server-pool.js +95 -0
- package/esm/http-server-pool.js.map +1 -0
- package/esm/http-server-pool.spec.d.ts +2 -0
- package/esm/http-server-pool.spec.d.ts.map +1 -0
- package/esm/http-server-pool.spec.js +193 -0
- package/esm/http-server-pool.spec.js.map +1 -0
- package/esm/http-user-context.d.ts +31 -44
- package/esm/http-user-context.d.ts.map +1 -1
- package/esm/http-user-context.js +76 -95
- package/esm/http-user-context.js.map +1 -1
- package/esm/http-user-context.spec.d.ts +8 -2
- package/esm/http-user-context.spec.d.ts.map +1 -1
- package/esm/http-user-context.spec.js +189 -337
- package/esm/http-user-context.spec.js.map +1 -1
- package/esm/index.d.ts +6 -4
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +6 -4
- package/esm/index.js.map +1 -1
- package/esm/login-response-strategy.d.ts +11 -10
- package/esm/login-response-strategy.d.ts.map +1 -1
- package/esm/login-response-strategy.js +7 -6
- package/esm/login-response-strategy.js.map +1 -1
- package/esm/login-response-strategy.spec.js +25 -29
- package/esm/login-response-strategy.spec.js.map +1 -1
- package/esm/proxy-manager.spec.js +152 -176
- package/esm/proxy-manager.spec.js.map +1 -1
- package/esm/proxy-runtime.d.ts +27 -0
- package/esm/proxy-runtime.d.ts.map +1 -0
- package/esm/proxy-runtime.js +45 -0
- package/esm/proxy-runtime.js.map +1 -0
- package/esm/proxy-runtime.spec.d.ts +2 -0
- package/esm/proxy-runtime.spec.d.ts.map +1 -0
- package/esm/proxy-runtime.spec.js +39 -0
- package/esm/proxy-runtime.spec.js.map +1 -0
- package/esm/rest-api-runtime.d.ts +76 -0
- package/esm/rest-api-runtime.d.ts.map +1 -0
- package/esm/rest-api-runtime.js +131 -0
- package/esm/rest-api-runtime.js.map +1 -0
- package/esm/rest-api-runtime.spec.d.ts +2 -0
- package/esm/rest-api-runtime.spec.d.ts.map +1 -0
- package/esm/rest-api-runtime.spec.js +58 -0
- package/esm/rest-api-runtime.spec.js.map +1 -0
- package/esm/rest-service.integration.spec.d.ts +1 -1
- package/esm/rest-service.integration.spec.d.ts.map +1 -1
- package/esm/rest-service.integration.spec.js +57 -80
- package/esm/rest-service.integration.spec.js.map +1 -1
- package/esm/rest.integration.test.js +26 -84
- package/esm/rest.integration.test.js.map +1 -1
- package/esm/server-telemetry.d.ts +57 -0
- package/esm/server-telemetry.d.ts.map +1 -0
- package/esm/server-telemetry.js +26 -0
- package/esm/server-telemetry.js.map +1 -0
- package/esm/server-telemetry.spec.d.ts +2 -0
- package/esm/server-telemetry.spec.d.ts.map +1 -0
- package/esm/server-telemetry.spec.js +52 -0
- package/esm/server-telemetry.spec.js.map +1 -0
- package/esm/static-server-manager.spec.js +60 -125
- package/esm/static-server-manager.spec.js.map +1 -1
- package/esm/static-site-runtime.d.ts +21 -0
- package/esm/static-site-runtime.d.ts.map +1 -0
- package/esm/static-site-runtime.js +48 -0
- package/esm/static-site-runtime.js.map +1 -0
- package/esm/static-site-runtime.spec.d.ts +2 -0
- package/esm/static-site-runtime.spec.d.ts.map +1 -0
- package/esm/static-site-runtime.spec.js +30 -0
- package/esm/static-site-runtime.spec.js.map +1 -0
- package/esm/user-store.d.ts +39 -0
- package/esm/user-store.d.ts.map +1 -0
- package/esm/user-store.js +62 -0
- package/esm/user-store.js.map +1 -0
- package/esm/user-store.spec.d.ts +2 -0
- package/esm/user-store.spec.d.ts.map +1 -0
- package/esm/user-store.spec.js +72 -0
- package/esm/user-store.spec.js.map +1 -0
- package/esm/validate.integration.spec.js +26 -28
- package/esm/validate.integration.spec.js.map +1 -1
- package/package.json +8 -8
- package/src/actions/get-current-user.spec.ts +11 -10
- package/src/actions/is-authenticated.spec.ts +12 -7
- package/src/actions/logout-action.spec.ts +12 -12
- package/src/actions/logout.ts +1 -1
- package/src/actions/password-login-action.spec.ts +30 -30
- package/src/actions/password-login-action.ts +1 -1
- package/src/authenticate.spec.ts +45 -51
- package/src/authenticate.ts +1 -1
- package/src/authorize.spec.ts +37 -39
- package/src/endpoint-generators/create-delete-endpoint.spec.ts +16 -24
- package/src/endpoint-generators/create-delete-endpoint.ts +11 -17
- package/src/endpoint-generators/create-get-collection-endpoint.spec.ts +45 -78
- package/src/endpoint-generators/create-get-collection-endpoint.ts +17 -19
- package/src/endpoint-generators/create-get-entity-endpoint.spec.ts +17 -33
- package/src/endpoint-generators/create-get-entity-endpoint.ts +11 -17
- package/src/endpoint-generators/create-get-openapi-document-action.ts +2 -2
- package/src/endpoint-generators/create-get-schema-action.ts +1 -1
- package/src/endpoint-generators/create-patch-endpoint.spec.ts +11 -18
- package/src/endpoint-generators/create-patch-endpoint.ts +12 -23
- package/src/endpoint-generators/create-post-endpoint.spec.ts +45 -14
- package/src/endpoint-generators/create-post-endpoint.ts +13 -23
- package/src/endpoint-generators/utils.ts +36 -28
- package/src/get-schema-from-api.spec.ts +1 -1
- package/src/get-schema-from-api.ts +1 -1
- package/src/helpers.spec.ts +51 -41
- package/src/helpers.ts +140 -109
- package/src/http-authentication-settings.ts +51 -25
- package/src/http-server-pool.spec.ts +220 -0
- package/src/http-server-pool.ts +169 -0
- package/src/http-user-context.spec.ts +203 -383
- package/src/http-user-context.ts +114 -91
- package/src/index.ts +6 -4
- package/src/login-response-strategy.spec.ts +32 -31
- package/src/login-response-strategy.ts +13 -12
- package/src/proxy-manager.spec.ts +152 -182
- package/src/proxy-runtime.spec.ts +50 -0
- package/src/proxy-runtime.ts +75 -0
- package/src/rest-api-runtime.spec.ts +77 -0
- package/src/rest-api-runtime.ts +204 -0
- package/src/rest-service.integration.spec.ts +65 -85
- package/src/rest.integration.test.ts +27 -87
- package/src/server-telemetry.spec.ts +56 -0
- package/src/server-telemetry.ts +51 -0
- package/src/static-server-manager.spec.ts +63 -151
- package/src/static-site-runtime.spec.ts +39 -0
- package/src/static-site-runtime.ts +75 -0
- package/src/user-store.spec.ts +86 -0
- package/src/user-store.ts +68 -0
- package/src/validate.integration.spec.ts +39 -35
- package/esm/api-manager.d.ts +0 -104
- package/esm/api-manager.d.ts.map +0 -1
- package/esm/api-manager.js +0 -179
- package/esm/api-manager.js.map +0 -1
- package/esm/proxy-manager.d.ts +0 -53
- package/esm/proxy-manager.d.ts.map +0 -1
- package/esm/proxy-manager.js +0 -84
- package/esm/proxy-manager.js.map +0 -1
- package/esm/server-manager.d.ts +0 -48
- package/esm/server-manager.d.ts.map +0 -1
- package/esm/server-manager.js +0 -100
- package/esm/server-manager.js.map +0 -1
- package/esm/static-server-manager.d.ts +0 -19
- package/esm/static-server-manager.d.ts.map +0 -1
- package/esm/static-server-manager.js +0 -65
- package/esm/static-server-manager.js.map +0 -1
- package/src/api-manager.ts +0 -304
- package/src/proxy-manager.ts +0 -102
- package/src/server-manager.ts +0 -135
- package/src/static-server-manager.ts +0 -90
package/esm/authorize.spec.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AuthorizationError, IdentityContext } from '@furystack/core';
|
|
2
|
-
import {
|
|
2
|
+
import { createInjector } from '@furystack/inject';
|
|
3
3
|
import { usingAsync } from '@furystack/utils';
|
|
4
4
|
import { describe, expect, it, vi } from 'vitest';
|
|
5
5
|
import { Authorize } from './authorize.js';
|
|
@@ -7,43 +7,48 @@ import { EmptyResult } from './request-action-implementation.js';
|
|
|
7
7
|
describe('Authorize', () => {
|
|
8
8
|
const response = {};
|
|
9
9
|
const request = { url: 'http://google.com' };
|
|
10
|
-
it('
|
|
11
|
-
await usingAsync(
|
|
12
|
-
const
|
|
13
|
-
i.
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
it('throws AuthorizationError when the current user cannot be resolved', async () => {
|
|
11
|
+
await usingAsync(createInjector(), async (i) => {
|
|
12
|
+
const isAuthorized = vi.fn(async () => false);
|
|
13
|
+
i.bind(IdentityContext, () => ({
|
|
14
|
+
isAuthorized,
|
|
15
|
+
getCurrentUser: () => Promise.reject(new Error(':(')),
|
|
16
|
+
isAuthenticated: () => Promise.resolve(false),
|
|
17
|
+
}));
|
|
18
|
+
const exampleAction = vi.fn(async () => EmptyResult());
|
|
19
|
+
const authorized = Authorize('Role1')(exampleAction);
|
|
16
20
|
await expect(() => authorized({ injector: i, request, response })).rejects.toThrow(AuthorizationError);
|
|
17
|
-
expect(
|
|
21
|
+
expect(exampleAction).not.toHaveBeenCalled();
|
|
18
22
|
});
|
|
19
23
|
});
|
|
20
|
-
it('
|
|
21
|
-
await usingAsync(
|
|
22
|
-
const
|
|
23
|
-
i.
|
|
24
|
-
isAuthorized
|
|
25
|
-
getCurrentUser:
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const
|
|
24
|
+
it('throws AuthorizationError when the current user does not have the required role', async () => {
|
|
25
|
+
await usingAsync(createInjector(), async (i) => {
|
|
26
|
+
const isAuthorized = vi.fn(async () => false);
|
|
27
|
+
i.bind(IdentityContext, () => ({
|
|
28
|
+
isAuthorized,
|
|
29
|
+
getCurrentUser: () => Promise.resolve({ username: 'a', roles: ['Role1'] }),
|
|
30
|
+
isAuthenticated: () => Promise.resolve(true),
|
|
31
|
+
}));
|
|
32
|
+
const exampleAction = vi.fn(async () => EmptyResult());
|
|
33
|
+
const authorized = Authorize('Role2')(exampleAction);
|
|
29
34
|
await expect(() => authorized({ injector: i, request, response })).rejects.toThrow(AuthorizationError);
|
|
30
|
-
expect(
|
|
35
|
+
expect(exampleAction).not.toHaveBeenCalled();
|
|
31
36
|
});
|
|
32
37
|
});
|
|
33
|
-
it('
|
|
34
|
-
await usingAsync(
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}
|
|
40
|
-
const
|
|
41
|
-
const authorized = Authorize('Role1')(
|
|
42
|
-
const params = { injector: i,
|
|
38
|
+
it('invokes the wrapped action when the current user holds the required role', async () => {
|
|
39
|
+
await usingAsync(createInjector(), async (i) => {
|
|
40
|
+
i.bind(IdentityContext, () => ({
|
|
41
|
+
isAuthorized: () => Promise.resolve(true),
|
|
42
|
+
getCurrentUser: () => Promise.resolve({ username: 'a', roles: ['Role1'] }),
|
|
43
|
+
isAuthenticated: () => Promise.resolve(true),
|
|
44
|
+
}));
|
|
45
|
+
const exampleAction = vi.fn(async () => EmptyResult());
|
|
46
|
+
const authorized = Authorize('Role1')(exampleAction);
|
|
47
|
+
const params = { injector: i, request, response };
|
|
43
48
|
const result = await authorized(params);
|
|
44
49
|
expect(result.statusCode).toBe(200);
|
|
45
50
|
expect(result.chunk).toBe(undefined);
|
|
46
|
-
expect(
|
|
51
|
+
expect(exampleAction).toHaveBeenCalledWith(params);
|
|
47
52
|
});
|
|
48
53
|
});
|
|
49
54
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authorize.spec.js","sourceRoot":"","sources":["../src/authorize.spec.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACrE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"authorize.spec.js","sourceRoot":"","sources":["../src/authorize.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,10 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { DataSetToken } from '@furystack/repository';
|
|
2
2
|
import type { DeleteEndpoint } from '@furystack/rest';
|
|
3
|
-
import type
|
|
3
|
+
import { type RequestAction } from '../request-action-implementation.js';
|
|
4
4
|
/**
|
|
5
|
-
* Creates a DELETE endpoint
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* @param options.primaryKey The field used as primary key on the model
|
|
9
|
-
* @returns a boolean that indicates the success
|
|
5
|
+
* Creates a DELETE endpoint that removes the entity identified by the URL's
|
|
6
|
+
* `:id` parameter. Returns `204 No Content` once the removal has been
|
|
7
|
+
* persisted to the underlying store.
|
|
10
8
|
*/
|
|
11
|
-
export declare const createDeleteEndpoint: <T extends object, TPrimaryKey extends keyof T>(
|
|
12
|
-
model: Constructable<T>;
|
|
13
|
-
primaryKey: TPrimaryKey;
|
|
14
|
-
}) => RequestAction<DeleteEndpoint<T, TPrimaryKey>>;
|
|
9
|
+
export declare const createDeleteEndpoint: <T extends object, TPrimaryKey extends keyof T>(dataSet: DataSetToken<T, TPrimaryKey>) => RequestAction<DeleteEndpoint<T, TPrimaryKey>>;
|
|
15
10
|
//# sourceMappingURL=create-delete-endpoint.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-delete-endpoint.d.ts","sourceRoot":"","sources":["../../src/endpoint-generators/create-delete-endpoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"create-delete-endpoint.d.ts","sourceRoot":"","sources":["../../src/endpoint-generators/create-delete-endpoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,qCAAqC,CAAA;AAEpF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAAI,CAAC,SAAS,MAAM,EAAE,WAAW,SAAS,MAAM,CAAC,EAChF,SAAS,YAAY,CAAC,CAAC,EAAE,WAAW,CAAC,KACpC,aAAa,CAAC,cAAc,CAAC,CAAC,EAAE,WAAW,CAAC,CAO9C,CAAA"}
|
|
@@ -1,19 +1,15 @@
|
|
|
1
1
|
import { JsonResult } from '../request-action-implementation.js';
|
|
2
|
-
import { getRepository } from '@furystack/repository';
|
|
3
2
|
/**
|
|
4
|
-
* Creates a DELETE endpoint
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* @param options.primaryKey The field used as primary key on the model
|
|
8
|
-
* @returns a boolean that indicates the success
|
|
3
|
+
* Creates a DELETE endpoint that removes the entity identified by the URL's
|
|
4
|
+
* `:id` parameter. Returns `204 No Content` once the removal has been
|
|
5
|
+
* persisted to the underlying store.
|
|
9
6
|
*/
|
|
10
|
-
export const createDeleteEndpoint = (
|
|
11
|
-
|
|
7
|
+
export const createDeleteEndpoint = (dataSet) => {
|
|
8
|
+
return async ({ injector, getUrlParams }) => {
|
|
12
9
|
const { id } = getUrlParams();
|
|
13
|
-
const
|
|
14
|
-
await
|
|
10
|
+
const ds = injector.get(dataSet);
|
|
11
|
+
await ds.remove(injector, id);
|
|
15
12
|
return JsonResult({}, 204);
|
|
16
13
|
};
|
|
17
|
-
return endpoint;
|
|
18
14
|
};
|
|
19
15
|
//# sourceMappingURL=create-delete-endpoint.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-delete-endpoint.js","sourceRoot":"","sources":["../../src/endpoint-generators/create-delete-endpoint.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-delete-endpoint.js","sourceRoot":"","sources":["../../src/endpoint-generators/create-delete-endpoint.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAsB,MAAM,qCAAqC,CAAA;AAEpF;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,OAAqC,EACU,EAAE;IACjD,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE;QAC1C,MAAM,EAAE,EAAE,EAAE,GAAG,YAAY,EAAE,CAAA;QAC7B,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAChC,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;QAC7B,OAAO,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;IAC5B,CAAC,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -1,35 +1,28 @@
|
|
|
1
|
+
import { getPort } from '@furystack/core/port-generator';
|
|
2
|
+
import { createInjector } from '@furystack/inject';
|
|
1
3
|
import { usingAsync } from '@furystack/utils';
|
|
2
|
-
import {
|
|
3
|
-
import { createDeleteEndpoint } from './create-delete-endpoint.js';
|
|
4
|
-
import { MockClass, setupContext } from './utils.js';
|
|
4
|
+
import { describe, expect, it } from 'vitest';
|
|
5
5
|
import { useRestService } from '../helpers.js';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { getPort } from '@furystack/core/port-generator';
|
|
6
|
+
import { createDeleteEndpoint } from './create-delete-endpoint.js';
|
|
7
|
+
import { MockDataSet, setupContext } from './utils.js';
|
|
9
8
|
describe('createDeleteEndpoint', () => {
|
|
10
|
-
it('
|
|
11
|
-
await usingAsync(
|
|
12
|
-
const port = getPort();
|
|
9
|
+
it('deletes the entity and responds 204', async () => {
|
|
10
|
+
await usingAsync(createInjector(), async (i) => {
|
|
13
11
|
setupContext(i);
|
|
12
|
+
const port = getPort();
|
|
14
13
|
await useRestService({
|
|
15
14
|
injector: i,
|
|
16
15
|
root: '/api',
|
|
17
16
|
port,
|
|
18
|
-
api: {
|
|
19
|
-
DELETE: {
|
|
20
|
-
'/:id': createDeleteEndpoint({ model: MockClass, primaryKey: 'id' }),
|
|
21
|
-
},
|
|
22
|
-
},
|
|
17
|
+
api: { DELETE: { '/:id': createDeleteEndpoint(MockDataSet) } },
|
|
23
18
|
});
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
expect(
|
|
19
|
+
const dataSet = i.get(MockDataSet);
|
|
20
|
+
await dataSet.add(i, { id: 'mock', value: 'mock' });
|
|
21
|
+
expect(await dataSet.count(i)).toBe(1);
|
|
27
22
|
const response = await fetch(`http://127.0.0.1:${port}/api/mock`, { method: 'DELETE' });
|
|
28
23
|
expect(response.status).toBe(204);
|
|
29
|
-
|
|
30
|
-
expect(
|
|
31
|
-
const countAfterDelete = await getDataSetFor(i, MockClass, 'id').count(i);
|
|
32
|
-
expect(countAfterDelete).toBe(0);
|
|
24
|
+
expect(await response.text()).toBe('');
|
|
25
|
+
expect(await dataSet.count(i)).toBe(0);
|
|
33
26
|
});
|
|
34
27
|
});
|
|
35
28
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-delete-endpoint.spec.js","sourceRoot":"","sources":["../../src/endpoint-generators/create-delete-endpoint.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"create-delete-endpoint.spec.js","sourceRoot":"","sources":["../../src/endpoint-generators/create-delete-endpoint.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAElD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAElE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEtD,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,UAAU,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAC7C,YAAY,CAAC,CAAC,CAAC,CAAA;YACf,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;YACtB,MAAM,cAAc,CAA0D;gBAC5E,QAAQ,EAAE,CAAC;gBACX,IAAI,EAAE,MAAM;gBACZ,IAAI;gBACJ,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,oBAAoB,CAAC,WAAW,CAAC,EAAE,EAAE;aAC/D,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;YAClC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;YACnD,MAAM,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAEtC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,oBAAoB,IAAI,WAAW,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAA;YACvF,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACjC,MAAM,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACtC,MAAM,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACxC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { DataSetToken } from '@furystack/repository';
|
|
2
2
|
import type { GetCollectionEndpoint } from '@furystack/rest';
|
|
3
|
-
import type
|
|
3
|
+
import { type RequestAction } from '../request-action-implementation.js';
|
|
4
4
|
/**
|
|
5
|
-
* Creates a GetCollection endpoint
|
|
6
|
-
* @
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* @
|
|
5
|
+
* Creates a GetCollection endpoint backed by the DataSet resolved from the
|
|
6
|
+
* provided {@link DataSetToken}. The token carries the entity model and
|
|
7
|
+
* primary key, so callers no longer need to pass them separately.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* const endpoint = createGetCollectionEndpoint(UserDataSet)
|
|
12
|
+
* ```
|
|
10
13
|
*/
|
|
11
|
-
export declare const createGetCollectionEndpoint: <T, TPrimaryKey extends keyof T>(
|
|
12
|
-
model: Constructable<T>;
|
|
13
|
-
primaryKey: TPrimaryKey;
|
|
14
|
-
}) => RequestAction<GetCollectionEndpoint<T>>;
|
|
14
|
+
export declare const createGetCollectionEndpoint: <T, TPrimaryKey extends keyof T>(dataSet: DataSetToken<T, TPrimaryKey>) => RequestAction<GetCollectionEndpoint<T>>;
|
|
15
15
|
//# sourceMappingURL=create-get-collection-endpoint.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-get-collection-endpoint.d.ts","sourceRoot":"","sources":["../../src/endpoint-generators/create-get-collection-endpoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"create-get-collection-endpoint.d.ts","sourceRoot":"","sources":["../../src/endpoint-generators/create-get-collection-endpoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAC5D,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,qCAAqC,CAAA;AAEpF;;;;;;;;;GASG;AACH,eAAO,MAAM,2BAA2B,GAAI,CAAC,EAAE,WAAW,SAAS,MAAM,CAAC,EACxE,SAAS,YAAY,CAAC,CAAC,EAAE,WAAW,CAAC,KACpC,aAAa,CAAC,qBAAqB,CAAC,CAAC,CAAC,CASxC,CAAA"}
|
|
@@ -1,21 +1,22 @@
|
|
|
1
1
|
import { JsonResult } from '../request-action-implementation.js';
|
|
2
|
-
import { getRepository } from '@furystack/repository';
|
|
3
2
|
/**
|
|
4
|
-
* Creates a GetCollection endpoint
|
|
5
|
-
* @
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* @
|
|
3
|
+
* Creates a GetCollection endpoint backed by the DataSet resolved from the
|
|
4
|
+
* provided {@link DataSetToken}. The token carries the entity model and
|
|
5
|
+
* primary key, so callers no longer need to pass them separately.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* const endpoint = createGetCollectionEndpoint(UserDataSet)
|
|
10
|
+
* ```
|
|
9
11
|
*/
|
|
10
|
-
export const createGetCollectionEndpoint = (
|
|
11
|
-
|
|
12
|
+
export const createGetCollectionEndpoint = (dataSet) => {
|
|
13
|
+
return async ({ injector, getQuery }) => {
|
|
12
14
|
const { findOptions } = getQuery();
|
|
13
|
-
const
|
|
14
|
-
const entriesPromise =
|
|
15
|
-
const countPromise =
|
|
15
|
+
const ds = injector.get(dataSet);
|
|
16
|
+
const entriesPromise = ds.find(injector, findOptions || {});
|
|
17
|
+
const countPromise = ds.count(injector, findOptions?.filter);
|
|
16
18
|
const [entries, count] = await Promise.all([entriesPromise, countPromise]);
|
|
17
19
|
return JsonResult({ entries, count });
|
|
18
20
|
};
|
|
19
|
-
return endpoint;
|
|
20
21
|
};
|
|
21
22
|
//# sourceMappingURL=create-get-collection-endpoint.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-get-collection-endpoint.js","sourceRoot":"","sources":["../../src/endpoint-generators/create-get-collection-endpoint.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-get-collection-endpoint.js","sourceRoot":"","sources":["../../src/endpoint-generators/create-get-collection-endpoint.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAsB,MAAM,qCAAqC,CAAA;AAEpF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,OAAqC,EACI,EAAE;IAC3C,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE;QACtC,MAAM,EAAE,WAAW,EAAE,GAAG,QAAQ,EAAE,CAAA;QAClC,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAChC,MAAM,cAAc,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,IAAI,EAAE,CAAC,CAAA;QAC3D,MAAM,YAAY,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,CAAA;QAC5D,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC,CAAA;QAC1E,OAAO,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;IACvC,CAAC,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -1,33 +1,29 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { MockClass, setupContext } from './utils.js';
|
|
4
|
-
import { createGetCollectionEndpoint } from './create-get-collection-endpoint.js';
|
|
1
|
+
import { getPort } from '@furystack/core/port-generator';
|
|
2
|
+
import { createInjector } from '@furystack/inject';
|
|
5
3
|
import { serializeToQueryString } from '@furystack/rest';
|
|
6
|
-
import {
|
|
4
|
+
import { usingAsync } from '@furystack/utils';
|
|
5
|
+
import { describe, expect, it } from 'vitest';
|
|
7
6
|
import { useRestService } from '../helpers.js';
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
const addMockEntities = async (i) =>
|
|
11
|
-
.
|
|
7
|
+
import { createGetCollectionEndpoint } from './create-get-collection-endpoint.js';
|
|
8
|
+
import { MockDataSet, setupContext } from './utils.js';
|
|
9
|
+
const addMockEntities = async (i) => i
|
|
10
|
+
.get(MockDataSet)
|
|
12
11
|
.add(i, { id: 'mock1', value: '4' }, { id: 'mock2', value: '3' }, { id: 'mock3', value: '2' }, { id: 'mock4', value: '1' });
|
|
13
12
|
describe('createGetCollectionEndpoint', () => {
|
|
14
|
-
it('
|
|
15
|
-
await usingAsync(
|
|
13
|
+
it('returns the collection without filter / order', async () => {
|
|
14
|
+
await usingAsync(createInjector(), async (i) => {
|
|
16
15
|
setupContext(i);
|
|
17
16
|
const port = getPort();
|
|
18
17
|
await useRestService({
|
|
19
18
|
injector: i,
|
|
20
19
|
root: '/api',
|
|
21
20
|
port,
|
|
22
|
-
api: {
|
|
23
|
-
GET: {
|
|
24
|
-
'/entities': createGetCollectionEndpoint({ model: MockClass, primaryKey: 'id' }),
|
|
25
|
-
},
|
|
26
|
-
},
|
|
21
|
+
api: { GET: { '/entities': createGetCollectionEndpoint(MockDataSet) } },
|
|
27
22
|
});
|
|
28
23
|
await addMockEntities(i);
|
|
29
|
-
const
|
|
30
|
-
const
|
|
24
|
+
const dataSet = i.get(MockDataSet);
|
|
25
|
+
const count = await dataSet.count(i);
|
|
26
|
+
const allEntities = await dataSet.find(i, {});
|
|
31
27
|
const response = await fetch(`http://127.0.0.1:${port}/api/entities`, { method: 'GET' });
|
|
32
28
|
expect(response.ok).toBe(true);
|
|
33
29
|
const json = (await response.json());
|
|
@@ -36,24 +32,21 @@ describe('createGetCollectionEndpoint', () => {
|
|
|
36
32
|
expect(json.entries).toEqual(allEntities);
|
|
37
33
|
});
|
|
38
34
|
});
|
|
39
|
-
it('
|
|
40
|
-
await usingAsync(
|
|
35
|
+
it('returns entities in the requested order', async () => {
|
|
36
|
+
await usingAsync(createInjector(), async (i) => {
|
|
41
37
|
setupContext(i);
|
|
42
38
|
const port = getPort();
|
|
43
39
|
await useRestService({
|
|
44
40
|
injector: i,
|
|
45
41
|
root: '/api',
|
|
46
42
|
port,
|
|
47
|
-
api: {
|
|
48
|
-
GET: {
|
|
49
|
-
'/entities': createGetCollectionEndpoint({ model: MockClass, primaryKey: 'id' }),
|
|
50
|
-
},
|
|
51
|
-
},
|
|
43
|
+
api: { GET: { '/entities': createGetCollectionEndpoint(MockDataSet) } },
|
|
52
44
|
});
|
|
53
45
|
await addMockEntities(i);
|
|
54
46
|
const findOptions = { order: { value: 'ASC' } };
|
|
55
|
-
const
|
|
56
|
-
const
|
|
47
|
+
const dataSet = i.get(MockDataSet);
|
|
48
|
+
const count = await dataSet.count(i, findOptions.filter);
|
|
49
|
+
const orderedEntities = await dataSet.find(i, findOptions);
|
|
57
50
|
const response = await fetch(`http://127.0.0.1:${port}/api/entities?${serializeToQueryString({ findOptions })}`, {
|
|
58
51
|
method: 'GET',
|
|
59
52
|
});
|
|
@@ -64,27 +57,21 @@ describe('createGetCollectionEndpoint', () => {
|
|
|
64
57
|
expect(json.entries).toEqual(orderedEntities);
|
|
65
58
|
});
|
|
66
59
|
});
|
|
67
|
-
it('
|
|
68
|
-
await usingAsync(
|
|
60
|
+
it('applies a supplied filter', async () => {
|
|
61
|
+
await usingAsync(createInjector(), async (i) => {
|
|
69
62
|
setupContext(i);
|
|
70
63
|
const port = getPort();
|
|
71
64
|
await useRestService({
|
|
72
65
|
injector: i,
|
|
73
66
|
root: '/api',
|
|
74
67
|
port,
|
|
75
|
-
api: {
|
|
76
|
-
GET: {
|
|
77
|
-
'/entities': createGetCollectionEndpoint({ model: MockClass, primaryKey: 'id' }),
|
|
78
|
-
},
|
|
79
|
-
},
|
|
68
|
+
api: { GET: { '/entities': createGetCollectionEndpoint(MockDataSet) } },
|
|
80
69
|
});
|
|
81
70
|
await addMockEntities(i);
|
|
82
|
-
const findOptions = {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
const
|
|
86
|
-
const filteredEntities = await getDataSetFor(i, MockClass, 'id').find(i, findOptions);
|
|
87
|
-
expect(filteredEntities).not.toContainEqual({ id: 'mock2', value: '3' });
|
|
71
|
+
const findOptions = { filter: { id: { $ne: 'mock2' } } };
|
|
72
|
+
const dataSet = i.get(MockDataSet);
|
|
73
|
+
const count = await dataSet.count(i, findOptions.filter);
|
|
74
|
+
const filteredEntities = await dataSet.find(i, findOptions);
|
|
88
75
|
const response = await fetch(`http://127.0.0.1:${port}/api/entities?${serializeToQueryString({ findOptions })}`, {
|
|
89
76
|
method: 'GET',
|
|
90
77
|
});
|
|
@@ -95,27 +82,21 @@ describe('createGetCollectionEndpoint', () => {
|
|
|
95
82
|
expect(json.entries).toEqual(filteredEntities);
|
|
96
83
|
});
|
|
97
84
|
});
|
|
98
|
-
it('
|
|
99
|
-
await usingAsync(
|
|
85
|
+
it('applies select projection', async () => {
|
|
86
|
+
await usingAsync(createInjector(), async (i) => {
|
|
100
87
|
setupContext(i);
|
|
101
88
|
const port = getPort();
|
|
102
89
|
await useRestService({
|
|
103
90
|
injector: i,
|
|
104
91
|
root: '/api',
|
|
105
92
|
port,
|
|
106
|
-
api: {
|
|
107
|
-
GET: {
|
|
108
|
-
'/entities': createGetCollectionEndpoint({ model: MockClass, primaryKey: 'id' }),
|
|
109
|
-
},
|
|
110
|
-
},
|
|
93
|
+
api: { GET: { '/entities': createGetCollectionEndpoint(MockDataSet) } },
|
|
111
94
|
});
|
|
112
95
|
await addMockEntities(i);
|
|
113
|
-
const findOptions = {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
const
|
|
117
|
-
const selectedEntities = await getDataSetFor(i, MockClass, 'id').find(i, findOptions);
|
|
118
|
-
selectedEntities.forEach((e) => expect(e.value).toBeUndefined());
|
|
96
|
+
const findOptions = { select: ['id'] };
|
|
97
|
+
const dataSet = i.get(MockDataSet);
|
|
98
|
+
const count = await dataSet.count(i, findOptions.filter);
|
|
99
|
+
const selected = await dataSet.find(i, findOptions);
|
|
119
100
|
const response = await fetch(`http://127.0.0.1:${port}/api/entities?${serializeToQueryString({ findOptions })}`, {
|
|
120
101
|
method: 'GET',
|
|
121
102
|
});
|
|
@@ -123,39 +104,31 @@ describe('createGetCollectionEndpoint', () => {
|
|
|
123
104
|
const json = (await response.json());
|
|
124
105
|
expect(response.status).toBe(200);
|
|
125
106
|
expect(json.count).toBe(count);
|
|
126
|
-
expect(json.entries).toEqual(
|
|
107
|
+
expect(json.entries).toEqual(selected);
|
|
127
108
|
});
|
|
128
109
|
});
|
|
129
|
-
it('
|
|
130
|
-
await usingAsync(
|
|
110
|
+
it('honours top/skip', async () => {
|
|
111
|
+
await usingAsync(createInjector(), async (i) => {
|
|
131
112
|
setupContext(i);
|
|
132
113
|
const port = getPort();
|
|
133
114
|
await useRestService({
|
|
134
115
|
injector: i,
|
|
135
116
|
root: '/api',
|
|
136
117
|
port,
|
|
137
|
-
api: {
|
|
138
|
-
GET: {
|
|
139
|
-
'/entities': createGetCollectionEndpoint({ model: MockClass, primaryKey: 'id' }),
|
|
140
|
-
},
|
|
141
|
-
},
|
|
118
|
+
api: { GET: { '/entities': createGetCollectionEndpoint(MockDataSet) } },
|
|
142
119
|
});
|
|
143
120
|
await addMockEntities(i);
|
|
144
|
-
const findOptions = {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
const count = await getDataSetFor(i, MockClass, 'id').count(i, findOptions.filter);
|
|
149
|
-
const topSkipEntities = await getDataSetFor(i, MockClass, 'id').find(i, findOptions);
|
|
150
|
-
expect(topSkipEntities).not.toContainEqual({ id: 'mock1', value: '4' });
|
|
151
|
-
expect(topSkipEntities).not.toContainEqual({ id: 'mock4', value: '1' });
|
|
121
|
+
const findOptions = { skip: 1, top: 2 };
|
|
122
|
+
const dataSet = i.get(MockDataSet);
|
|
123
|
+
const count = await dataSet.count(i, findOptions.filter);
|
|
124
|
+
const page = await dataSet.find(i, findOptions);
|
|
152
125
|
const response = await fetch(`http://127.0.0.1:${port}/api/entities?${serializeToQueryString({ findOptions })}`, {
|
|
153
126
|
method: 'GET',
|
|
154
127
|
});
|
|
155
128
|
expect(response.status).toBe(200);
|
|
156
129
|
const json = (await response.json());
|
|
157
130
|
expect(json.count).toBe(count);
|
|
158
|
-
expect(json.entries).toEqual(
|
|
131
|
+
expect(json.entries).toEqual(page);
|
|
159
132
|
});
|
|
160
133
|
});
|
|
161
134
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-get-collection-endpoint.spec.js","sourceRoot":"","sources":["../../src/endpoint-generators/create-get-collection-endpoint.spec.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-get-collection-endpoint.spec.js","sourceRoot":"","sources":["../../src/endpoint-generators/create-get-collection-endpoint.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,10 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { DataSetToken } from '@furystack/repository';
|
|
2
2
|
import type { GetEntityEndpoint } from '@furystack/rest';
|
|
3
|
-
import type
|
|
3
|
+
import { type RequestAction } from '../request-action-implementation.js';
|
|
4
4
|
/**
|
|
5
|
-
* Creates a
|
|
6
|
-
* @
|
|
7
|
-
*
|
|
8
|
-
* @param options.primaryKey The field name used as primary key on the model
|
|
9
|
-
* @returns The generated endpoint
|
|
5
|
+
* Creates a GET entity endpoint backed by the DataSet resolved from the
|
|
6
|
+
* provided {@link DataSetToken}. Throws a 404 `RequestError` when the
|
|
7
|
+
* entity cannot be found.
|
|
10
8
|
*/
|
|
11
|
-
export declare const createGetEntityEndpoint: <T extends object, TPrimaryKey extends keyof T>(
|
|
12
|
-
model: Constructable<T>;
|
|
13
|
-
primaryKey: TPrimaryKey;
|
|
14
|
-
}) => RequestAction<GetEntityEndpoint<T, TPrimaryKey>>;
|
|
9
|
+
export declare const createGetEntityEndpoint: <T extends object, TPrimaryKey extends keyof T>(dataSet: DataSetToken<T, TPrimaryKey>) => RequestAction<GetEntityEndpoint<T, TPrimaryKey>>;
|
|
15
10
|
//# sourceMappingURL=create-get-entity-endpoint.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-get-entity-endpoint.d.ts","sourceRoot":"","sources":["../../src/endpoint-generators/create-get-entity-endpoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"create-get-entity-endpoint.d.ts","sourceRoot":"","sources":["../../src/endpoint-generators/create-get-entity-endpoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAExD,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,qCAAqC,CAAA;AAEpF;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,GAAI,CAAC,SAAS,MAAM,EAAE,WAAW,SAAS,MAAM,CAAC,EACnF,SAAS,YAAY,CAAC,CAAC,EAAE,WAAW,CAAC,KACpC,aAAa,CAAC,iBAAiB,CAAC,CAAC,EAAE,WAAW,CAAC,CAWjD,CAAA"}
|