@armoury/fivem-framework-common 1.0.15 → 1.0.17

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.
@@ -35,6 +35,32 @@ const decorator_utils_2 = require("../decorators/decorator.utils");
35
35
  const config_decorator_2 = require("./config.decorator");
36
36
  const resource_decorator_2 = require("./resource.decorator");
37
37
  exports.APP_INITIALIZER = new injection_js_1.InjectionToken('APP_INITIALIZER');
38
+ function flattenProviders(providers) {
39
+ const flattened = [];
40
+ for (const provider of providers) {
41
+ if (Array.isArray(provider)) {
42
+ flattened.push(...flattenProviders(provider));
43
+ }
44
+ else {
45
+ flattened.push(provider);
46
+ }
47
+ }
48
+ return flattened;
49
+ }
50
+ function getProviderToken(provider) {
51
+ if (typeof provider === 'function') {
52
+ return provider;
53
+ }
54
+ if (provider && typeof provider === 'object' && 'provide' in provider) {
55
+ return provider.provide;
56
+ }
57
+ return undefined;
58
+ }
59
+ function getProviderTokens(providers) {
60
+ return flattenProviders(providers)
61
+ .map(getProviderToken)
62
+ .filter((token) => token !== undefined);
63
+ }
38
64
  function getProviderClasses(providers) {
39
65
  const classes = [];
40
66
  for (const provider of providers) {
@@ -52,13 +78,32 @@ function getProviderClasses(providers) {
52
78
  }
53
79
  return classes;
54
80
  }
55
- async function bootstrapWithProviders(entryPoint, parentProviders, options = {}, decorationType = decorator_utils_2.DecorationType.SERVER, readConfigValue, readResourceExports) {
81
+ function hasProviderForToken(providers, token) {
82
+ for (const provider of providers) {
83
+ if (Array.isArray(provider)) {
84
+ if (hasProviderForToken(provider, token)) {
85
+ return true;
86
+ }
87
+ continue;
88
+ }
89
+ if (provider === token || (provider && typeof provider === 'object' && 'provide' in provider && provider.provide === token)) {
90
+ return true;
91
+ }
92
+ }
93
+ return false;
94
+ }
95
+ async function bootstrapWithProviders(entryPoint, parentProviders, options = {}, decorationType = decorator_utils_2.DecorationType.SERVER, readConfigValue, readResourceExports, defaultEagerProviders = []) {
56
96
  var _a, _b;
57
97
  const eagerProviders = (_a = options.eager) !== null && _a !== void 0 ? _a : [];
58
- const providers = [
59
- ...((_b = options.providers) !== null && _b !== void 0 ? _b : []),
60
- ...eagerProviders,
61
- ];
98
+ const optionProviders = (_b = options.providers) !== null && _b !== void 0 ? _b : [];
99
+ const platformDefaultProviders = flattenProviders(defaultEagerProviders);
100
+ const activeDefaultEagerProviders = platformDefaultProviders.filter((defaultProvider) => {
101
+ const token = getProviderToken(defaultProvider);
102
+ return token === undefined || !hasProviderForToken([...parentProviders, ...optionProviders], token);
103
+ });
104
+ const eagerRegistrations = eagerProviders.filter((eagerProvider) => !hasProviderForToken([...parentProviders, ...optionProviders], eagerProvider));
105
+ const providers = [...activeDefaultEagerProviders, ...optionProviders, ...eagerRegistrations];
106
+ const eagerTokens = [...new Set([...getProviderTokens(platformDefaultProviders), ...eagerProviders])];
62
107
  const configTargets = [entryPoint, ...getProviderClasses(parentProviders), ...getProviderClasses(providers)];
63
108
  const configProviders = (0, config_decorator_2.createConfigProviders)(configTargets, readConfigValue);
64
109
  const resourceProviders = (0, resource_decorator_2.createResourceProviders)(configTargets, readResourceExports);
@@ -66,7 +111,7 @@ async function bootstrapWithProviders(entryPoint, parentProviders, options = {},
66
111
  const injector = injection_js_1.ReflectiveInjector.resolveAndCreate([...configProviders, ...resourceProviders, ...providers, entryPoint], parentInjector);
67
112
  const instance = injector.get(entryPoint);
68
113
  (0, decorator_utils_2.Decorate)(instance, entryPoint.prototype, [...parentProviders, ...providers], decorationType);
69
- eagerProviders.forEach((provider) => injector.get(provider));
114
+ eagerTokens.forEach((token) => injector.get(token));
70
115
  const initializers = injector.get(exports.APP_INITIALIZER, []);
71
116
  await Promise.all(initializers.map((initializer) => initializer()));
72
117
  return instance;
@@ -12,6 +12,32 @@ import { Decorate, DecorationType } from '../decorators/decorator.utils';
12
12
  import { createConfigProviders } from './config.decorator';
13
13
  import { createResourceProviders } from './resource.decorator';
14
14
  export const APP_INITIALIZER = new InjectionToken('APP_INITIALIZER');
15
+ function flattenProviders(providers) {
16
+ const flattened = [];
17
+ for (const provider of providers) {
18
+ if (Array.isArray(provider)) {
19
+ flattened.push(...flattenProviders(provider));
20
+ }
21
+ else {
22
+ flattened.push(provider);
23
+ }
24
+ }
25
+ return flattened;
26
+ }
27
+ function getProviderToken(provider) {
28
+ if (typeof provider === 'function') {
29
+ return provider;
30
+ }
31
+ if (provider && typeof provider === 'object' && 'provide' in provider) {
32
+ return provider.provide;
33
+ }
34
+ return undefined;
35
+ }
36
+ function getProviderTokens(providers) {
37
+ return flattenProviders(providers)
38
+ .map(getProviderToken)
39
+ .filter((token) => token !== undefined);
40
+ }
15
41
  function getProviderClasses(providers) {
16
42
  const classes = [];
17
43
  for (const provider of providers) {
@@ -29,13 +55,32 @@ function getProviderClasses(providers) {
29
55
  }
30
56
  return classes;
31
57
  }
32
- export async function bootstrapWithProviders(entryPoint, parentProviders, options = {}, decorationType = DecorationType.SERVER, readConfigValue, readResourceExports) {
58
+ function hasProviderForToken(providers, token) {
59
+ for (const provider of providers) {
60
+ if (Array.isArray(provider)) {
61
+ if (hasProviderForToken(provider, token)) {
62
+ return true;
63
+ }
64
+ continue;
65
+ }
66
+ if (provider === token || (provider && typeof provider === 'object' && 'provide' in provider && provider.provide === token)) {
67
+ return true;
68
+ }
69
+ }
70
+ return false;
71
+ }
72
+ export async function bootstrapWithProviders(entryPoint, parentProviders, options = {}, decorationType = DecorationType.SERVER, readConfigValue, readResourceExports, defaultEagerProviders = []) {
33
73
  var _a, _b;
34
74
  const eagerProviders = (_a = options.eager) !== null && _a !== void 0 ? _a : [];
35
- const providers = [
36
- ...((_b = options.providers) !== null && _b !== void 0 ? _b : []),
37
- ...eagerProviders,
38
- ];
75
+ const optionProviders = (_b = options.providers) !== null && _b !== void 0 ? _b : [];
76
+ const platformDefaultProviders = flattenProviders(defaultEagerProviders);
77
+ const activeDefaultEagerProviders = platformDefaultProviders.filter((defaultProvider) => {
78
+ const token = getProviderToken(defaultProvider);
79
+ return token === undefined || !hasProviderForToken([...parentProviders, ...optionProviders], token);
80
+ });
81
+ const eagerRegistrations = eagerProviders.filter((eagerProvider) => !hasProviderForToken([...parentProviders, ...optionProviders], eagerProvider));
82
+ const providers = [...activeDefaultEagerProviders, ...optionProviders, ...eagerRegistrations];
83
+ const eagerTokens = [...new Set([...getProviderTokens(platformDefaultProviders), ...eagerProviders])];
39
84
  const configTargets = [entryPoint, ...getProviderClasses(parentProviders), ...getProviderClasses(providers)];
40
85
  const configProviders = createConfigProviders(configTargets, readConfigValue);
41
86
  const resourceProviders = createResourceProviders(configTargets, readResourceExports);
@@ -43,7 +88,7 @@ export async function bootstrapWithProviders(entryPoint, parentProviders, option
43
88
  const injector = ReflectiveInjector.resolveAndCreate([...configProviders, ...resourceProviders, ...providers, entryPoint], parentInjector);
44
89
  const instance = injector.get(entryPoint);
45
90
  Decorate(instance, entryPoint.prototype, [...parentProviders, ...providers], decorationType);
46
- eagerProviders.forEach((provider) => injector.get(provider));
91
+ eagerTokens.forEach((token) => injector.get(token));
47
92
  const initializers = injector.get(APP_INITIALIZER, []);
48
93
  await Promise.all(initializers.map((initializer) => initializer()));
49
94
  return instance;
@@ -20,4 +20,4 @@ export interface BootstrapOptions {
20
20
  }
21
21
  export declare function bootstrapWithProviders<T extends {
22
22
  new (...args: any[]): any;
23
- } & Provider>(entryPoint: T, parentProviders: Provider[], options: BootstrapOptions | undefined, decorationType: DecorationType | undefined, readConfigValue: ConfigValueReader, readResourceExports: ResourceExportsReader): Promise<InstanceType<T>>;
23
+ } & Provider>(entryPoint: T, parentProviders: Provider[], options: BootstrapOptions | undefined, decorationType: DecorationType | undefined, readConfigValue: ConfigValueReader, readResourceExports: ResourceExportsReader, defaultEagerProviders?: Provider[]): Promise<InstanceType<T>>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@armoury/fivem-framework-common",
3
- "version": "1.0.15",
3
+ "version": "1.0.17",
4
4
  "description": "Shared APIs for the Armoury FiveM framework",
5
5
  "main": "dist/cjs/common/index.js",
6
6
  "module": "dist/esm/common/index.js",