@tsed/common 8.0.0-beta.1 → 8.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/esm/services/PlatformTest.js +9 -15
- package/lib/esm/services/PlatformTest.js.map +1 -1
- package/lib/esm/utils/createInjector.js +14 -14
- package/lib/esm/utils/createInjector.js.map +1 -1
- package/lib/types/services/PlatformTest.d.ts +1 -0
- package/lib/types/utils/createInjector.d.ts +1 -2
- package/package.json +17 -17
- package/vitest.config.mts +4 -4
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DITest } from "@tsed/di";
|
|
1
|
+
import { DITest, hasInjector, injector } from "@tsed/di";
|
|
2
2
|
import accepts from "accepts";
|
|
3
3
|
import { PlatformBuilder } from "../builder/PlatformBuilder.js";
|
|
4
4
|
import { PlatformContext } from "../domain/PlatformContext.js";
|
|
@@ -11,7 +11,7 @@ import { PlatformApplication } from "./PlatformApplication.js";
|
|
|
11
11
|
*/
|
|
12
12
|
export class PlatformTest extends DITest {
|
|
13
13
|
static async create(settings = {}) {
|
|
14
|
-
|
|
14
|
+
PlatformTest.createInjector(getConfiguration(settings));
|
|
15
15
|
await DITest.createContainer();
|
|
16
16
|
}
|
|
17
17
|
/**
|
|
@@ -42,15 +42,8 @@ export class PlatformTest extends DITest {
|
|
|
42
42
|
settings = DITest.configure(settings);
|
|
43
43
|
settings.adapter = adapter;
|
|
44
44
|
const configuration = getConfiguration(settings, mod);
|
|
45
|
-
const disableComponentsScan = configuration.disableComponentsScan || !!process.env.WEBPACK;
|
|
46
|
-
if (!disableComponentsScan) {
|
|
47
|
-
const { importProviders } = await import("@tsed/components-scan");
|
|
48
|
-
await importProviders(configuration);
|
|
49
|
-
}
|
|
50
45
|
instance = await PlatformBuilder.build(mod, configuration).bootstrap();
|
|
51
46
|
await instance.listen(!!listen);
|
|
52
|
-
// used by inject method
|
|
53
|
-
DITest.injector = instance.injector;
|
|
54
47
|
};
|
|
55
48
|
}
|
|
56
49
|
/**
|
|
@@ -61,18 +54,19 @@ export class PlatformTest extends DITest {
|
|
|
61
54
|
* * an array of Service dependency injection tokens,
|
|
62
55
|
* * a test function whose parameters correspond exactly to each item in the injection token array.
|
|
63
56
|
*
|
|
57
|
+
* @deprecated use PlatformTest.injector.invoke instead
|
|
64
58
|
* @param targets
|
|
65
59
|
* @param func
|
|
66
60
|
*/
|
|
67
61
|
static inject(targets, func) {
|
|
68
62
|
return async () => {
|
|
69
|
-
if (!
|
|
63
|
+
if (!hasInjector()) {
|
|
70
64
|
await PlatformTest.create();
|
|
71
65
|
}
|
|
72
|
-
const
|
|
66
|
+
const inj = injector();
|
|
73
67
|
const deps = [];
|
|
74
68
|
for (const target of targets) {
|
|
75
|
-
deps.push(
|
|
69
|
+
deps.push(inj.has(target) ? inj.get(target) : await inj.invoke(target));
|
|
76
70
|
}
|
|
77
71
|
return func(...deps);
|
|
78
72
|
};
|
|
@@ -94,7 +88,7 @@ export class PlatformTest extends DITest {
|
|
|
94
88
|
* ```
|
|
95
89
|
*/
|
|
96
90
|
static callback() {
|
|
97
|
-
return
|
|
91
|
+
return injector().get(PlatformApplication)?.callback();
|
|
98
92
|
}
|
|
99
93
|
static createRequest(options = {}) {
|
|
100
94
|
return {
|
|
@@ -122,8 +116,8 @@ export class PlatformTest extends DITest {
|
|
|
122
116
|
};
|
|
123
117
|
const $ctx = new PlatformContext({
|
|
124
118
|
id: "id",
|
|
125
|
-
injector:
|
|
126
|
-
logger:
|
|
119
|
+
injector: injector(),
|
|
120
|
+
logger: injector().logger,
|
|
127
121
|
url: "/",
|
|
128
122
|
...options,
|
|
129
123
|
event
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlatformTest.js","sourceRoot":"","sources":["../../../src/services/PlatformTest.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAkB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"PlatformTest.js","sourceRoot":"","sources":["../../../src/services/PlatformTest.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { toMap } from "@tsed/core";
|
|
2
|
-
import {
|
|
2
|
+
import { injector, setLoggerConfiguration } from "@tsed/di";
|
|
3
3
|
import { $log } from "@tsed/logger";
|
|
4
4
|
import { PlatformConfiguration } from "../config/services/PlatformConfiguration.js";
|
|
5
5
|
import { Platform } from "../services/Platform.js";
|
|
@@ -17,25 +17,25 @@ const DEFAULT_PROVIDERS = [
|
|
|
17
17
|
{ provide: Platform }
|
|
18
18
|
];
|
|
19
19
|
export function createInjector({ adapter, settings = {} }) {
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
const inj = injector();
|
|
21
|
+
inj.addProvider(PlatformConfiguration);
|
|
22
|
+
inj.settings = inj.invoke(PlatformConfiguration);
|
|
23
|
+
inj.logger = $log;
|
|
24
|
+
inj.settings.set(settings);
|
|
25
25
|
if (adapter) {
|
|
26
|
-
|
|
26
|
+
inj.addProvider(PlatformAdapter, {
|
|
27
27
|
useClass: adapter
|
|
28
28
|
});
|
|
29
29
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
setLoggerConfiguration(
|
|
33
|
-
const instance =
|
|
30
|
+
inj.invoke(PlatformAdapter);
|
|
31
|
+
inj.alias(PlatformAdapter, "PlatformAdapter");
|
|
32
|
+
setLoggerConfiguration(inj);
|
|
33
|
+
const instance = inj.get(PlatformAdapter);
|
|
34
34
|
instance.providers = [...DEFAULT_PROVIDERS, ...instance.providers];
|
|
35
35
|
toMap(instance.providers, "provide").forEach((provider, token) => {
|
|
36
|
-
|
|
36
|
+
inj.addProvider(token, provider);
|
|
37
37
|
});
|
|
38
|
-
|
|
39
|
-
return
|
|
38
|
+
inj.invoke(PlatformApplication);
|
|
39
|
+
return inj;
|
|
40
40
|
}
|
|
41
41
|
//# sourceMappingURL=createInjector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createInjector.js","sourceRoot":"","sources":["../../../src/utils/createInjector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAO,MAAM,YAAY,CAAC;AACvC,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"createInjector.js","sourceRoot":"","sources":["../../../src/utils/createInjector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAO,MAAM,YAAY,CAAC;AACvC,OAAO,EAAC,QAAQ,EAAgB,sBAAsB,EAAC,MAAM,UAAU,CAAC;AACxE,OAAO,EAAC,IAAI,EAAC,MAAM,cAAc,CAAC;AAElC,OAAO,EAAC,qBAAqB,EAAC,MAAM,6CAA6C,CAAC;AAClF,OAAO,EAAC,QAAQ,EAAC,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAC,eAAe,EAAC,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAC,mBAAmB,EAAC,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAC,eAAe,EAAC,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAC,eAAe,EAAC,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAC,gBAAgB,EAAC,MAAM,iCAAiC,CAAC;AAEjE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;AAEnB,MAAM,iBAAiB,GAAG;IACxB,EAAC,OAAO,EAAE,eAAe,EAAC;IAC1B,EAAC,OAAO,EAAE,gBAAgB,EAAC;IAC3B,EAAC,OAAO,EAAE,eAAe,EAAC;IAC1B,EAAC,OAAO,EAAE,mBAAmB,EAAC;IAC9B,EAAC,OAAO,EAAE,QAAQ,EAAC;CACpB,CAAC;AAOF,MAAM,UAAU,cAAc,CAAC,EAAC,OAAO,EAAE,QAAQ,GAAG,EAAE,EAAwB;IAC5E,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;IACvB,GAAG,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC;IAEvC,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACjD,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC;IAClB,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE3B,IAAI,OAAO,EAAE,CAAC;QACZ,GAAG,CAAC,WAAW,CAAC,eAAe,EAAE;YAC/B,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;IACL,CAAC;IAED,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAC5B,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;IAE9C,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAE5B,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAkB,eAAe,CAAE,CAAC;IAE5D,QAAQ,CAAC,SAAS,GAAG,CAAC,GAAG,iBAAiB,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAEnE,KAAK,CAAoB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;QAClF,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAEhC,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -33,6 +33,7 @@ export declare class PlatformTest extends DITest {
|
|
|
33
33
|
* * an array of Service dependency injection tokens,
|
|
34
34
|
* * a test function whose parameters correspond exactly to each item in the injection token array.
|
|
35
35
|
*
|
|
36
|
+
* @deprecated use PlatformTest.injector.invoke instead
|
|
36
37
|
* @param targets
|
|
37
38
|
* @param func
|
|
38
39
|
*/
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { Type } from "@tsed/core";
|
|
2
|
-
import { InjectorService } from "@tsed/di";
|
|
3
2
|
import { PlatformAdapter } from "../services/PlatformAdapter.js";
|
|
4
3
|
interface CreateInjectorOptions {
|
|
5
4
|
adapter?: Type<PlatformAdapter<any>>;
|
|
6
5
|
settings?: Partial<TsED.Configuration>;
|
|
7
6
|
}
|
|
8
|
-
export declare function createInjector({ adapter, settings }: CreateInjectorOptions): InjectorService;
|
|
7
|
+
export declare function createInjector({ adapter, settings }: CreateInjectorOptions): import("@tsed/di").InjectorService;
|
|
9
8
|
export {};
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@tsed/common",
|
|
3
3
|
"description": "A TypeScript Framework on top of Express",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"version": "8.0.0-beta.
|
|
5
|
+
"version": "8.0.0-beta.2",
|
|
6
6
|
"source": "./src/index.ts",
|
|
7
7
|
"main": "./lib/esm/index.js",
|
|
8
8
|
"module": "./lib/esm/index.js",
|
|
@@ -63,30 +63,30 @@
|
|
|
63
63
|
}
|
|
64
64
|
],
|
|
65
65
|
"dependencies": {
|
|
66
|
-
"@tsed/core": "8.0.0-beta.
|
|
67
|
-
"@tsed/di": "8.0.0-beta.
|
|
68
|
-
"@tsed/exceptions": "8.0.0-beta.
|
|
69
|
-
"@tsed/json-mapper": "8.0.0-beta.
|
|
66
|
+
"@tsed/core": "8.0.0-beta.2",
|
|
67
|
+
"@tsed/di": "8.0.0-beta.2",
|
|
68
|
+
"@tsed/exceptions": "8.0.0-beta.2",
|
|
69
|
+
"@tsed/json-mapper": "8.0.0-beta.2",
|
|
70
70
|
"@tsed/logger": "^6.7.8",
|
|
71
71
|
"@tsed/logger-file": "^6.7.8",
|
|
72
|
-
"@tsed/platform-exceptions": "8.0.0-beta.
|
|
73
|
-
"@tsed/platform-log-middleware": "8.0.0-beta.
|
|
74
|
-
"@tsed/platform-middlewares": "8.0.0-beta.
|
|
75
|
-
"@tsed/platform-params": "8.0.0-beta.
|
|
76
|
-
"@tsed/platform-response-filter": "8.0.0-beta.
|
|
77
|
-
"@tsed/platform-router": "8.0.0-beta.
|
|
78
|
-
"@tsed/platform-views": "8.0.0-beta.
|
|
79
|
-
"@tsed/schema": "8.0.0-beta.
|
|
72
|
+
"@tsed/platform-exceptions": "8.0.0-beta.2",
|
|
73
|
+
"@tsed/platform-log-middleware": "8.0.0-beta.2",
|
|
74
|
+
"@tsed/platform-middlewares": "8.0.0-beta.2",
|
|
75
|
+
"@tsed/platform-params": "8.0.0-beta.2",
|
|
76
|
+
"@tsed/platform-response-filter": "8.0.0-beta.2",
|
|
77
|
+
"@tsed/platform-router": "8.0.0-beta.2",
|
|
78
|
+
"@tsed/platform-views": "8.0.0-beta.2",
|
|
79
|
+
"@tsed/schema": "8.0.0-beta.2",
|
|
80
80
|
"@types/json-schema": "7.0.15",
|
|
81
81
|
"accepts": "^1.3.8",
|
|
82
82
|
"tslib": "2.7.0",
|
|
83
83
|
"uuid": "10.0.0"
|
|
84
84
|
},
|
|
85
85
|
"devDependencies": {
|
|
86
|
-
"@tsed/barrels": "8.0.0-beta.
|
|
87
|
-
"@tsed/components-scan": "8.0.0-beta.
|
|
88
|
-
"@tsed/engines": "8.0.0-beta.
|
|
89
|
-
"@tsed/typescript": "8.0.0-beta.
|
|
86
|
+
"@tsed/barrels": "8.0.0-beta.2",
|
|
87
|
+
"@tsed/components-scan": "8.0.0-beta.2",
|
|
88
|
+
"@tsed/engines": "8.0.0-beta.2",
|
|
89
|
+
"@tsed/typescript": "8.0.0-beta.2",
|
|
90
90
|
"cross-env": "7.0.3",
|
|
91
91
|
"eslint": "9.12.0",
|
|
92
92
|
"typescript": "5.4.5",
|
package/vitest.config.mts
CHANGED
|
@@ -10,10 +10,10 @@ export default defineConfig(
|
|
|
10
10
|
coverage: {
|
|
11
11
|
...presets.test.coverage,
|
|
12
12
|
thresholds: {
|
|
13
|
-
statements: 97.
|
|
14
|
-
branches: 95.
|
|
15
|
-
functions:
|
|
16
|
-
lines: 97.
|
|
13
|
+
statements: 97.28,
|
|
14
|
+
branches: 95.14,
|
|
15
|
+
functions: 95.31,
|
|
16
|
+
lines: 97.28
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
}
|