@backstage/backend-plugin-api 0.3.2-next.1 → 0.4.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 +49 -0
- package/README.md +5 -4
- package/alpha/package.json +1 -1
- package/dist/index.alpha.d.ts +45 -104
- package/dist/index.beta.d.ts +45 -104
- package/dist/index.cjs.js +108 -29
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +45 -104
- package/package.json +4 -4
package/dist/index.beta.d.ts
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
import { Config } from '@backstage/config';
|
|
10
10
|
import { Handler } from 'express';
|
|
11
11
|
import { IdentityApi } from '@backstage/plugin-auth-node';
|
|
12
|
+
import { JsonObject } from '@backstage/types';
|
|
12
13
|
import { JsonValue } from '@backstage/types';
|
|
13
14
|
import { Knex } from 'knex';
|
|
14
15
|
import { PermissionEvaluator } from '@backstage/plugin-permission-common';
|
|
@@ -17,8 +18,7 @@ import { Readable } from 'stream';
|
|
|
17
18
|
|
|
18
19
|
/** @public */
|
|
19
20
|
export declare interface BackendFeature {
|
|
20
|
-
|
|
21
|
-
register(reg: BackendRegistrationPoints): void;
|
|
21
|
+
$$type: '@backstage/BackendFeature';
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
/**
|
|
@@ -71,7 +71,7 @@ export declare interface BackendPluginConfig {
|
|
|
71
71
|
*
|
|
72
72
|
* @see {@link https://backstage.io/docs/backend-system/architecture/naming-patterns | Recommended naming patterns}
|
|
73
73
|
*/
|
|
74
|
-
|
|
74
|
+
pluginId: string;
|
|
75
75
|
register(reg: BackendPluginRegistrationPoints): void;
|
|
76
76
|
}
|
|
77
77
|
|
|
@@ -93,54 +93,39 @@ export declare interface BackendPluginRegistrationPoints {
|
|
|
93
93
|
}
|
|
94
94
|
|
|
95
95
|
/**
|
|
96
|
-
*
|
|
97
|
-
* essentially a superset of {@link BackendPluginRegistrationPoints} and
|
|
98
|
-
* {@link BackendModuleRegistrationPoints}.
|
|
99
|
-
*
|
|
100
|
-
* @public
|
|
101
|
-
*/
|
|
102
|
-
export declare interface BackendRegistrationPoints {
|
|
103
|
-
registerExtensionPoint<TExtensionPoint>(ref: ExtensionPoint<TExtensionPoint>, impl: TExtensionPoint): void;
|
|
104
|
-
registerInit<Deps extends {
|
|
105
|
-
[name in string]: unknown;
|
|
106
|
-
}>(options: {
|
|
107
|
-
deps: {
|
|
108
|
-
[name in keyof Deps]: ServiceRef<Deps[name]> | ExtensionPoint<Deps[name]>;
|
|
109
|
-
};
|
|
110
|
-
init(deps: Deps): Promise<void>;
|
|
111
|
-
}): void;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* A pre-configured, storage agnostic cache client suitable for use by
|
|
96
|
+
* A pre-configured, storage agnostic cache service suitable for use by
|
|
116
97
|
* Backstage plugins.
|
|
117
98
|
*
|
|
118
99
|
* @public
|
|
119
100
|
*/
|
|
120
|
-
export declare interface
|
|
101
|
+
export declare interface CacheService {
|
|
121
102
|
/**
|
|
122
103
|
* Reads data from a cache store for the given key. If no data was found,
|
|
123
104
|
* returns undefined.
|
|
124
105
|
*/
|
|
125
|
-
get(key: string): Promise<
|
|
106
|
+
get<TValue extends JsonValue>(key: string): Promise<TValue | undefined>;
|
|
126
107
|
/**
|
|
127
108
|
* Writes the given data to a cache store, associated with the given key. An
|
|
128
109
|
* optional TTL may also be provided, otherwise it defaults to the TTL that
|
|
129
110
|
* was provided when the client was instantiated.
|
|
130
111
|
*/
|
|
131
|
-
set(key: string, value: JsonValue, options?:
|
|
112
|
+
set(key: string, value: JsonValue, options?: CacheServiceSetOptions): Promise<void>;
|
|
132
113
|
/**
|
|
133
114
|
* Removes the given key from the cache store.
|
|
134
115
|
*/
|
|
135
116
|
delete(key: string): Promise<void>;
|
|
117
|
+
/**
|
|
118
|
+
* Creates a new {@link CacheService} instance with the given options.
|
|
119
|
+
*/
|
|
120
|
+
withOptions(options: CacheServiceOptions): CacheService;
|
|
136
121
|
}
|
|
137
122
|
|
|
138
123
|
/**
|
|
139
|
-
* Options
|
|
124
|
+
* Options passed to {@link CacheService.withOptions}.
|
|
140
125
|
*
|
|
141
126
|
* @public
|
|
142
127
|
*/
|
|
143
|
-
export declare type
|
|
128
|
+
export declare type CacheServiceOptions = {
|
|
144
129
|
/**
|
|
145
130
|
* An optional default TTL (in milliseconds) to be set when getting a client
|
|
146
131
|
* instance. If not provided, data will persist indefinitely by default (or
|
|
@@ -150,11 +135,11 @@ export declare type CacheClientOptions = {
|
|
|
150
135
|
};
|
|
151
136
|
|
|
152
137
|
/**
|
|
153
|
-
* Options passed to {@link
|
|
138
|
+
* Options passed to {@link CacheService.set}.
|
|
154
139
|
*
|
|
155
140
|
* @public
|
|
156
141
|
*/
|
|
157
|
-
export declare type
|
|
142
|
+
export declare type CacheServiceSetOptions = {
|
|
158
143
|
/**
|
|
159
144
|
* Optional TTL in milliseconds. Defaults to the TTL provided when the client
|
|
160
145
|
* was set up (or no TTL if none are provided).
|
|
@@ -162,24 +147,6 @@ export declare type CacheClientSetOptions = {
|
|
|
162
147
|
ttl?: number;
|
|
163
148
|
};
|
|
164
149
|
|
|
165
|
-
/**
|
|
166
|
-
* Manages access to cache stores that plugins get.
|
|
167
|
-
*
|
|
168
|
-
* @public
|
|
169
|
-
*/
|
|
170
|
-
export declare interface CacheService {
|
|
171
|
-
/**
|
|
172
|
-
* Provides backend plugins cache connections for themselves.
|
|
173
|
-
*
|
|
174
|
-
* @remarks
|
|
175
|
-
*
|
|
176
|
-
* The purpose of this method is to allow plugins to get isolated data stores
|
|
177
|
-
* so that plugins are discouraged from cache-level integration and/or cache
|
|
178
|
-
* key collisions.
|
|
179
|
-
*/
|
|
180
|
-
getClient: (options?: CacheClientOptions) => CacheClient;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
150
|
/**
|
|
184
151
|
* @public
|
|
185
152
|
*/
|
|
@@ -324,7 +291,7 @@ export declare function createExtensionPoint<T>(config: ExtensionPointConfig): E
|
|
|
324
291
|
*/
|
|
325
292
|
export declare function createServiceFactory<TService, TImpl extends TService, TDeps extends {
|
|
326
293
|
[name in string]: ServiceRef<unknown>;
|
|
327
|
-
}, TOpts extends object | undefined = undefined>(config: RootServiceFactoryConfig<TService, TImpl, TDeps>): () => ServiceFactory<TService>;
|
|
294
|
+
}, TOpts extends object | undefined = undefined>(config: RootServiceFactoryConfig<TService, TImpl, TDeps>): () => ServiceFactory<TService, 'root'>;
|
|
328
295
|
|
|
329
296
|
/**
|
|
330
297
|
* Creates a root scoped service factory with optional options.
|
|
@@ -334,7 +301,7 @@ export declare function createServiceFactory<TService, TImpl extends TService, T
|
|
|
334
301
|
*/
|
|
335
302
|
export declare function createServiceFactory<TService, TImpl extends TService, TDeps extends {
|
|
336
303
|
[name in string]: ServiceRef<unknown>;
|
|
337
|
-
}, TOpts extends object | undefined = undefined>(config: (options?: TOpts) => RootServiceFactoryConfig<TService, TImpl, TDeps>): (options?: TOpts) => ServiceFactory<TService>;
|
|
304
|
+
}, TOpts extends object | undefined = undefined>(config: (options?: TOpts) => RootServiceFactoryConfig<TService, TImpl, TDeps>): (options?: TOpts) => ServiceFactory<TService, 'root'>;
|
|
338
305
|
|
|
339
306
|
/**
|
|
340
307
|
* Creates a root scoped service factory with required options.
|
|
@@ -344,7 +311,7 @@ export declare function createServiceFactory<TService, TImpl extends TService, T
|
|
|
344
311
|
*/
|
|
345
312
|
export declare function createServiceFactory<TService, TImpl extends TService, TDeps extends {
|
|
346
313
|
[name in string]: ServiceRef<unknown>;
|
|
347
|
-
}, TOpts extends object | undefined = undefined>(config: (options: TOpts) => RootServiceFactoryConfig<TService, TImpl, TDeps>): (options: TOpts) => ServiceFactory<TService>;
|
|
314
|
+
}, TOpts extends object | undefined = undefined>(config: (options: TOpts) => RootServiceFactoryConfig<TService, TImpl, TDeps>): (options: TOpts) => ServiceFactory<TService, 'root'>;
|
|
348
315
|
|
|
349
316
|
/**
|
|
350
317
|
* Creates a plugin scoped service factory without options.
|
|
@@ -354,7 +321,7 @@ export declare function createServiceFactory<TService, TImpl extends TService, T
|
|
|
354
321
|
*/
|
|
355
322
|
export declare function createServiceFactory<TService, TImpl extends TService, TDeps extends {
|
|
356
323
|
[name in string]: ServiceRef<unknown>;
|
|
357
|
-
}, TContext = undefined, TOpts extends object | undefined = undefined>(config: PluginServiceFactoryConfig<TService, TContext, TImpl, TDeps>): () => ServiceFactory<TService>;
|
|
324
|
+
}, TContext = undefined, TOpts extends object | undefined = undefined>(config: PluginServiceFactoryConfig<TService, TContext, TImpl, TDeps>): () => ServiceFactory<TService, 'plugin'>;
|
|
358
325
|
|
|
359
326
|
/**
|
|
360
327
|
* Creates a plugin scoped service factory with optional options.
|
|
@@ -364,7 +331,7 @@ export declare function createServiceFactory<TService, TImpl extends TService, T
|
|
|
364
331
|
*/
|
|
365
332
|
export declare function createServiceFactory<TService, TImpl extends TService, TDeps extends {
|
|
366
333
|
[name in string]: ServiceRef<unknown>;
|
|
367
|
-
}, TContext = undefined, TOpts extends object | undefined = undefined>(config: (options?: TOpts) => PluginServiceFactoryConfig<TService, TContext, TImpl, TDeps>): (options?: TOpts) => ServiceFactory<TService>;
|
|
334
|
+
}, TContext = undefined, TOpts extends object | undefined = undefined>(config: (options?: TOpts) => PluginServiceFactoryConfig<TService, TContext, TImpl, TDeps>): (options?: TOpts) => ServiceFactory<TService, 'plugin'>;
|
|
368
335
|
|
|
369
336
|
/**
|
|
370
337
|
* Creates a plugin scoped service factory with required options.
|
|
@@ -374,7 +341,7 @@ export declare function createServiceFactory<TService, TImpl extends TService, T
|
|
|
374
341
|
*/
|
|
375
342
|
export declare function createServiceFactory<TService, TImpl extends TService, TDeps extends {
|
|
376
343
|
[name in string]: ServiceRef<unknown>;
|
|
377
|
-
}, TContext = undefined, TOpts extends object | undefined = undefined>(config: PluginServiceFactoryConfig<TService, TContext, TImpl, TDeps> | ((options: TOpts) => PluginServiceFactoryConfig<TService, TContext, TImpl, TDeps>)): (options: TOpts) => ServiceFactory<TService>;
|
|
344
|
+
}, TContext = undefined, TOpts extends object | undefined = undefined>(config: PluginServiceFactoryConfig<TService, TContext, TImpl, TDeps> | ((options: TOpts) => PluginServiceFactoryConfig<TService, TContext, TImpl, TDeps>)): (options: TOpts) => ServiceFactory<TService, 'plugin'>;
|
|
378
345
|
|
|
379
346
|
/**
|
|
380
347
|
* Creates a new service definition. This overload is used to create plugin scoped services.
|
|
@@ -484,7 +451,7 @@ export declare type ExtensionPoint<T> = {
|
|
|
484
451
|
*/
|
|
485
452
|
T: T;
|
|
486
453
|
toString(): string;
|
|
487
|
-
$$
|
|
454
|
+
$$type: '@backstage/ExtensionPoint';
|
|
488
455
|
};
|
|
489
456
|
|
|
490
457
|
/**
|
|
@@ -516,24 +483,28 @@ export declare interface IdentityService extends IdentityApi {
|
|
|
516
483
|
|
|
517
484
|
/**
|
|
518
485
|
* @public
|
|
519
|
-
|
|
486
|
+
*/
|
|
520
487
|
export declare interface LifecycleService {
|
|
521
488
|
/**
|
|
522
489
|
* Register a function to be called when the backend is shutting down.
|
|
523
490
|
*/
|
|
524
|
-
addShutdownHook(
|
|
491
|
+
addShutdownHook(hook: LifecycleServiceShutdownHook, options?: LifecycleServiceShutdownOptions): void;
|
|
525
492
|
}
|
|
526
493
|
|
|
527
494
|
/**
|
|
528
495
|
* @public
|
|
529
|
-
|
|
530
|
-
export declare type LifecycleServiceShutdownHook =
|
|
531
|
-
|
|
496
|
+
*/
|
|
497
|
+
export declare type LifecycleServiceShutdownHook = () => void | Promise<void>;
|
|
498
|
+
|
|
499
|
+
/**
|
|
500
|
+
* @public
|
|
501
|
+
*/
|
|
502
|
+
export declare interface LifecycleServiceShutdownOptions {
|
|
532
503
|
/**
|
|
533
504
|
* Optional {@link LoggerService} that will be used for logging instead of the default logger.
|
|
534
505
|
*/
|
|
535
506
|
logger?: LoggerService;
|
|
536
|
-
}
|
|
507
|
+
}
|
|
537
508
|
|
|
538
509
|
/**
|
|
539
510
|
* A service that provides a logging facility.
|
|
@@ -541,20 +512,13 @@ export declare type LifecycleServiceShutdownHook = {
|
|
|
541
512
|
* @public
|
|
542
513
|
*/
|
|
543
514
|
export declare interface LoggerService {
|
|
544
|
-
error(message: string, meta?: Error |
|
|
545
|
-
warn(message: string, meta?: Error |
|
|
546
|
-
info(message: string, meta?: Error |
|
|
547
|
-
debug(message: string, meta?: Error |
|
|
548
|
-
child(meta:
|
|
515
|
+
error(message: string, meta?: Error | JsonObject): void;
|
|
516
|
+
warn(message: string, meta?: Error | JsonObject): void;
|
|
517
|
+
info(message: string, meta?: Error | JsonObject): void;
|
|
518
|
+
debug(message: string, meta?: Error | JsonObject): void;
|
|
519
|
+
child(meta: JsonObject): LoggerService;
|
|
549
520
|
}
|
|
550
521
|
|
|
551
|
-
/**
|
|
552
|
-
* @public
|
|
553
|
-
*/
|
|
554
|
-
export declare type LogMeta = {
|
|
555
|
-
[name: string]: unknown;
|
|
556
|
-
};
|
|
557
|
-
|
|
558
522
|
/** @public */
|
|
559
523
|
export declare interface PermissionsService extends PermissionEvaluator {
|
|
560
524
|
}
|
|
@@ -842,35 +806,17 @@ export declare type SearchResponseFile = {
|
|
|
842
806
|
};
|
|
843
807
|
|
|
844
808
|
/** @public */
|
|
845
|
-
export declare
|
|
846
|
-
|
|
847
|
-
service: ServiceRef<TService,
|
|
848
|
-
|
|
849
|
-
[key in string]: ServiceRef<unknown>;
|
|
850
|
-
};
|
|
851
|
-
factory(deps: {
|
|
852
|
-
[key in string]: unknown;
|
|
853
|
-
}): Promise<TService>;
|
|
854
|
-
} | {
|
|
855
|
-
scope: 'plugin';
|
|
856
|
-
service: ServiceRef<TService, 'plugin'>;
|
|
857
|
-
deps: {
|
|
858
|
-
[key in string]: ServiceRef<unknown>;
|
|
859
|
-
};
|
|
860
|
-
createRootContext?(deps: {
|
|
861
|
-
[key in string]: unknown;
|
|
862
|
-
}): Promise<unknown>;
|
|
863
|
-
factory(deps: {
|
|
864
|
-
[key in string]: unknown;
|
|
865
|
-
}, context: unknown): Promise<TService>;
|
|
866
|
-
};
|
|
809
|
+
export declare interface ServiceFactory<TService = unknown, TScope extends 'plugin' | 'root' = 'plugin' | 'root'> {
|
|
810
|
+
$$type: '@backstage/ServiceFactory';
|
|
811
|
+
service: ServiceRef<TService, TScope>;
|
|
812
|
+
}
|
|
867
813
|
|
|
868
814
|
/**
|
|
869
815
|
* Represents either a {@link ServiceFactory} or a function that returns one.
|
|
870
816
|
*
|
|
871
817
|
* @public
|
|
872
818
|
*/
|
|
873
|
-
export declare type ServiceFactoryOrFunction
|
|
819
|
+
export declare type ServiceFactoryOrFunction = ServiceFactory | (() => ServiceFactory);
|
|
874
820
|
|
|
875
821
|
/**
|
|
876
822
|
* TODO
|
|
@@ -895,14 +841,14 @@ export declare type ServiceRef<TService, TScope extends 'root' | 'plugin' = 'roo
|
|
|
895
841
|
*/
|
|
896
842
|
T: TService;
|
|
897
843
|
toString(): string;
|
|
898
|
-
$$
|
|
844
|
+
$$type: '@backstage/ServiceRef';
|
|
899
845
|
};
|
|
900
846
|
|
|
901
847
|
/** @public */
|
|
902
848
|
export declare interface ServiceRefConfig<TService, TScope extends 'root' | 'plugin'> {
|
|
903
849
|
id: string;
|
|
904
850
|
scope?: TScope;
|
|
905
|
-
defaultFactory?: (service: ServiceRef<TService, TScope>) => Promise<ServiceFactoryOrFunction
|
|
851
|
+
defaultFactory?: (service: ServiceRef<TService, TScope>) => Promise<ServiceFactoryOrFunction>;
|
|
906
852
|
}
|
|
907
853
|
|
|
908
854
|
/** @ignore */
|
|
@@ -918,7 +864,7 @@ declare type ServiceRefsToInstances<T extends {
|
|
|
918
864
|
* @public
|
|
919
865
|
*/
|
|
920
866
|
export declare interface SharedBackendEnvironment {
|
|
921
|
-
$$type: 'SharedBackendEnvironment';
|
|
867
|
+
$$type: '@backstage/SharedBackendEnvironment';
|
|
922
868
|
}
|
|
923
869
|
|
|
924
870
|
/**
|
|
@@ -955,11 +901,6 @@ export declare interface TokenManagerService {
|
|
|
955
901
|
authenticate(token: string): Promise<void>;
|
|
956
902
|
}
|
|
957
903
|
|
|
958
|
-
/** @public */
|
|
959
|
-
export declare type TypesToServiceRef<T> = {
|
|
960
|
-
[key in keyof T]: ServiceRef<T[key]>;
|
|
961
|
-
};
|
|
962
|
-
|
|
963
904
|
/**
|
|
964
905
|
* A generic interface for fetching plain data from URLs.
|
|
965
906
|
*
|
package/dist/index.cjs.js
CHANGED
|
@@ -13,25 +13,37 @@ function createServiceRef(config) {
|
|
|
13
13
|
toString() {
|
|
14
14
|
return `serviceRef{${config.id}}`;
|
|
15
15
|
},
|
|
16
|
-
$$
|
|
17
|
-
// TODO: declare
|
|
16
|
+
$$type: "@backstage/ServiceRef",
|
|
18
17
|
__defaultFactory: defaultFactory
|
|
19
18
|
};
|
|
20
19
|
}
|
|
21
20
|
function createServiceFactory(config) {
|
|
22
21
|
const configCallback = typeof config === "function" ? config : () => config;
|
|
23
22
|
return (options) => {
|
|
24
|
-
const
|
|
23
|
+
const anyConf = configCallback(options);
|
|
24
|
+
if (anyConf.service.scope === "root") {
|
|
25
|
+
const c2 = anyConf;
|
|
26
|
+
return {
|
|
27
|
+
$$type: "@backstage/ServiceFactory",
|
|
28
|
+
version: "v1",
|
|
29
|
+
service: c2.service,
|
|
30
|
+
deps: c2.deps,
|
|
31
|
+
factory: async (deps) => c2.factory(deps)
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const c = anyConf;
|
|
25
35
|
return {
|
|
26
|
-
|
|
36
|
+
$$type: "@backstage/ServiceFactory",
|
|
37
|
+
version: "v1",
|
|
38
|
+
service: c.service,
|
|
27
39
|
..."createRootContext" in c ? {
|
|
28
40
|
createRootContext: async (deps) => {
|
|
29
41
|
var _a;
|
|
30
42
|
return (_a = c == null ? void 0 : c.createRootContext) == null ? void 0 : _a.call(c, deps);
|
|
31
43
|
}
|
|
32
44
|
} : {},
|
|
33
|
-
|
|
34
|
-
|
|
45
|
+
deps: c.deps,
|
|
46
|
+
factory: async (deps, ctx) => c.factory(deps, ctx)
|
|
35
47
|
};
|
|
36
48
|
};
|
|
37
49
|
}
|
|
@@ -82,7 +94,7 @@ function createSharedEnvironment(config) {
|
|
|
82
94
|
);
|
|
83
95
|
}
|
|
84
96
|
const env = {
|
|
85
|
-
$$type: "SharedBackendEnvironment",
|
|
97
|
+
$$type: "@backstage/SharedBackendEnvironment",
|
|
86
98
|
version: "v1",
|
|
87
99
|
services
|
|
88
100
|
};
|
|
@@ -99,34 +111,101 @@ function createExtensionPoint(config) {
|
|
|
99
111
|
toString() {
|
|
100
112
|
return `extensionPoint{${config.id}}`;
|
|
101
113
|
},
|
|
102
|
-
$$
|
|
103
|
-
// TODO: declare
|
|
114
|
+
$$type: "@backstage/ExtensionPoint"
|
|
104
115
|
};
|
|
105
116
|
}
|
|
106
117
|
function createBackendPlugin(config) {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
118
|
+
const configCallback = typeof config === "function" ? config : () => config;
|
|
119
|
+
return (...options) => {
|
|
120
|
+
const c = configCallback(...options);
|
|
121
|
+
let registrations;
|
|
122
|
+
return {
|
|
123
|
+
$$type: "@backstage/BackendFeature",
|
|
124
|
+
version: "v1",
|
|
125
|
+
getRegistrations() {
|
|
126
|
+
if (registrations) {
|
|
127
|
+
return registrations;
|
|
128
|
+
}
|
|
129
|
+
const extensionPoints = [];
|
|
130
|
+
let init = void 0;
|
|
131
|
+
c.register({
|
|
132
|
+
registerExtensionPoint(ext, impl) {
|
|
133
|
+
if (init) {
|
|
134
|
+
throw new Error(
|
|
135
|
+
"registerExtensionPoint called after registerInit"
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
extensionPoints.push([ext, impl]);
|
|
139
|
+
},
|
|
140
|
+
registerInit(regInit) {
|
|
141
|
+
if (init) {
|
|
142
|
+
throw new Error("registerInit must only be called once");
|
|
143
|
+
}
|
|
144
|
+
init = {
|
|
145
|
+
deps: regInit.deps,
|
|
146
|
+
func: regInit.init
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
if (!init) {
|
|
151
|
+
throw new Error(
|
|
152
|
+
`registerInit was not called by register in ${c.pluginId}`
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
registrations = [
|
|
156
|
+
{
|
|
157
|
+
type: "plugin",
|
|
158
|
+
pluginId: c.pluginId,
|
|
159
|
+
extensionPoints,
|
|
160
|
+
init
|
|
161
|
+
}
|
|
162
|
+
];
|
|
163
|
+
return registrations;
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
};
|
|
111
167
|
}
|
|
112
168
|
function createBackendModule(config) {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
169
|
+
const configCallback = typeof config === "function" ? config : () => config;
|
|
170
|
+
return (...options) => {
|
|
171
|
+
const c = configCallback(...options);
|
|
172
|
+
let registrations;
|
|
173
|
+
return {
|
|
174
|
+
$$type: "@backstage/BackendFeature",
|
|
175
|
+
version: "v1",
|
|
176
|
+
getRegistrations() {
|
|
177
|
+
if (registrations) {
|
|
178
|
+
return registrations;
|
|
179
|
+
}
|
|
180
|
+
let init = void 0;
|
|
181
|
+
c.register({
|
|
182
|
+
registerInit(regInit) {
|
|
183
|
+
if (init) {
|
|
184
|
+
throw new Error("registerInit must only be called once");
|
|
185
|
+
}
|
|
186
|
+
init = {
|
|
187
|
+
deps: regInit.deps,
|
|
188
|
+
func: regInit.init
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
if (!init) {
|
|
193
|
+
throw new Error(
|
|
194
|
+
`registerInit was not called by register in ${c.moduleId} module for ${c.pluginId}`
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
registrations = [
|
|
198
|
+
{
|
|
199
|
+
type: "module",
|
|
200
|
+
pluginId: c.pluginId,
|
|
201
|
+
moduleId: c.moduleId,
|
|
202
|
+
init
|
|
203
|
+
}
|
|
204
|
+
];
|
|
205
|
+
return registrations;
|
|
206
|
+
}
|
|
120
207
|
};
|
|
121
|
-
}
|
|
122
|
-
return () => ({
|
|
123
|
-
id: `${config.pluginId}.${config.moduleId}`,
|
|
124
|
-
register(register) {
|
|
125
|
-
return config.register({
|
|
126
|
-
registerInit: register.registerInit.bind(register)
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
});
|
|
208
|
+
};
|
|
130
209
|
}
|
|
131
210
|
|
|
132
211
|
exports.createBackendModule = createBackendModule;
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../src/services/system/types.ts","../src/services/definitions/coreServices.ts","../src/wiring/createSharedEnvironment.ts","../src/wiring/factories.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * TODO\n *\n * @public\n */\nexport type ServiceRef<\n TService,\n TScope extends 'root' | 'plugin' = 'root' | 'plugin',\n> = {\n id: string;\n\n /**\n * This determines the scope at which this service is available.\n *\n * Root scoped services are available to all other services but\n * may only depend on other root scoped services.\n *\n * Plugin scoped services are only available to other plugin scoped\n * services but may depend on all other services.\n */\n scope: TScope;\n\n /**\n * Utility for getting the type of the service, using `typeof serviceRef.T`.\n * Attempting to actually read this value will result in an exception.\n */\n T: TService;\n\n toString(): string;\n\n $$ref: 'service';\n};\n\n/** @public */\nexport type TypesToServiceRef<T> = { [key in keyof T]: ServiceRef<T[key]> };\n\n/** @public */\nexport type ServiceFactory<TService = unknown> =\n | {\n // This scope prop is needed in addition to the service ref, as TypeScript\n // can't properly discriminate the two factory types otherwise.\n scope: 'root';\n service: ServiceRef<TService, 'root'>;\n deps: { [key in string]: ServiceRef<unknown> };\n factory(deps: { [key in string]: unknown }): Promise<TService>;\n }\n | {\n scope: 'plugin';\n service: ServiceRef<TService, 'plugin'>;\n deps: { [key in string]: ServiceRef<unknown> };\n createRootContext?(deps: { [key in string]: unknown }): Promise<unknown>;\n factory(\n deps: { [key in string]: unknown },\n context: unknown,\n ): Promise<TService>;\n };\n\n/**\n * Represents either a {@link ServiceFactory} or a function that returns one.\n *\n * @public\n */\nexport type ServiceFactoryOrFunction<TService = unknown> =\n | ServiceFactory<TService>\n | (() => ServiceFactory<TService>);\n\n/** @public */\nexport interface ServiceRefConfig<TService, TScope extends 'root' | 'plugin'> {\n id: string;\n scope?: TScope;\n defaultFactory?: (\n service: ServiceRef<TService, TScope>,\n ) => Promise<ServiceFactoryOrFunction<TService>>;\n}\n\n/**\n * Creates a new service definition. This overload is used to create plugin scoped services.\n *\n * @public\n */\nexport function createServiceRef<TService>(\n config: ServiceRefConfig<TService, 'plugin'>,\n): ServiceRef<TService, 'plugin'>;\n\n/**\n * Creates a new service definition. This overload is used to create root scoped services.\n *\n * @public\n */\nexport function createServiceRef<TService>(\n config: ServiceRefConfig<TService, 'root'>,\n): ServiceRef<TService, 'root'>;\nexport function createServiceRef<TService>(\n config: ServiceRefConfig<TService, any>,\n): ServiceRef<TService, any> {\n const { id, scope = 'plugin', defaultFactory } = config;\n return {\n id,\n scope,\n get T(): TService {\n throw new Error(`tried to read ServiceRef.T of ${this}`);\n },\n toString() {\n return `serviceRef{${config.id}}`;\n },\n $$ref: 'service', // TODO: declare\n __defaultFactory: defaultFactory,\n } as ServiceRef<TService, typeof scope> & {\n __defaultFactory?: (\n service: ServiceRef<TService>,\n ) => Promise<ServiceFactory<TService> | (() => ServiceFactory<TService>)>;\n };\n}\n\n/** @ignore */\ntype ServiceRefsToInstances<\n T extends { [key in string]: ServiceRef<unknown> },\n TScope extends 'root' | 'plugin' = 'root' | 'plugin',\n> = {\n [key in keyof T as T[key]['scope'] extends TScope ? key : never]: T[key]['T'];\n};\n\n/** @public */\nexport interface RootServiceFactoryConfig<\n TService,\n TImpl extends TService,\n TDeps extends { [name in string]: ServiceRef<unknown> },\n> {\n service: ServiceRef<TService, 'root'>;\n deps: TDeps;\n factory(deps: ServiceRefsToInstances<TDeps, 'root'>): TImpl | Promise<TImpl>;\n}\n\n/** @public */\nexport interface PluginServiceFactoryConfig<\n TService,\n TContext,\n TImpl extends TService,\n TDeps extends { [name in string]: ServiceRef<unknown> },\n> {\n service: ServiceRef<TService, 'plugin'>;\n deps: TDeps;\n createRootContext?(\n deps: ServiceRefsToInstances<TDeps, 'root'>,\n ): TContext | Promise<TContext>;\n factory(\n deps: ServiceRefsToInstances<TDeps>,\n context: TContext,\n ): TImpl | Promise<TImpl>;\n}\n\n/**\n * Creates a root scoped service factory without options.\n *\n * @public\n * @param config - The service factory configuration.\n */\nexport function createServiceFactory<\n TService,\n TImpl extends TService,\n TDeps extends { [name in string]: ServiceRef<unknown> },\n TOpts extends object | undefined = undefined,\n>(\n config: RootServiceFactoryConfig<TService, TImpl, TDeps>,\n): () => ServiceFactory<TService>;\n/**\n * Creates a root scoped service factory with optional options.\n *\n * @public\n * @param config - The service factory configuration.\n */\nexport function createServiceFactory<\n TService,\n TImpl extends TService,\n TDeps extends { [name in string]: ServiceRef<unknown> },\n TOpts extends object | undefined = undefined,\n>(\n config: (options?: TOpts) => RootServiceFactoryConfig<TService, TImpl, TDeps>,\n): (options?: TOpts) => ServiceFactory<TService>;\n/**\n * Creates a root scoped service factory with required options.\n *\n * @public\n * @param config - The service factory configuration.\n */\nexport function createServiceFactory<\n TService,\n TImpl extends TService,\n TDeps extends { [name in string]: ServiceRef<unknown> },\n TOpts extends object | undefined = undefined,\n>(\n config: (options: TOpts) => RootServiceFactoryConfig<TService, TImpl, TDeps>,\n): (options: TOpts) => ServiceFactory<TService>;\n/**\n * Creates a plugin scoped service factory without options.\n *\n * @public\n * @param config - The service factory configuration.\n */\nexport function createServiceFactory<\n TService,\n TImpl extends TService,\n TDeps extends { [name in string]: ServiceRef<unknown> },\n TContext = undefined,\n TOpts extends object | undefined = undefined,\n>(\n config: PluginServiceFactoryConfig<TService, TContext, TImpl, TDeps>,\n): () => ServiceFactory<TService>;\n/**\n * Creates a plugin scoped service factory with optional options.\n *\n * @public\n * @param config - The service factory configuration.\n */\nexport function createServiceFactory<\n TService,\n TImpl extends TService,\n TDeps extends { [name in string]: ServiceRef<unknown> },\n TContext = undefined,\n TOpts extends object | undefined = undefined,\n>(\n config: (\n options?: TOpts,\n ) => PluginServiceFactoryConfig<TService, TContext, TImpl, TDeps>,\n): (options?: TOpts) => ServiceFactory<TService>;\n/**\n * Creates a plugin scoped service factory with required options.\n *\n * @public\n * @param config - The service factory configuration.\n */\nexport function createServiceFactory<\n TService,\n TImpl extends TService,\n TDeps extends { [name in string]: ServiceRef<unknown> },\n TContext = undefined,\n TOpts extends object | undefined = undefined,\n>(\n config:\n | PluginServiceFactoryConfig<TService, TContext, TImpl, TDeps>\n | ((\n options: TOpts,\n ) => PluginServiceFactoryConfig<TService, TContext, TImpl, TDeps>),\n): (options: TOpts) => ServiceFactory<TService>;\nexport function createServiceFactory<\n TService,\n TImpl extends TService,\n TDeps extends { [name in string]: ServiceRef<unknown> },\n TContext,\n TOpts extends object | undefined = undefined,\n>(\n config:\n | RootServiceFactoryConfig<TService, TImpl, TDeps>\n | PluginServiceFactoryConfig<TService, TContext, TImpl, TDeps>\n | ((options: TOpts) => RootServiceFactoryConfig<TService, TImpl, TDeps>)\n | ((\n options: TOpts,\n ) => PluginServiceFactoryConfig<TService, TContext, TImpl, TDeps>)\n | (() => RootServiceFactoryConfig<TService, TImpl, TDeps>)\n | (() => PluginServiceFactoryConfig<TService, TContext, TImpl, TDeps>),\n): (options: TOpts) => ServiceFactory<TService> {\n const configCallback = typeof config === 'function' ? config : () => config;\n return (options: TOpts) => {\n const c = configCallback(options);\n return {\n ...c,\n ...('createRootContext' in c\n ? {\n createRootContext: async (deps: TDeps) =>\n c?.createRootContext?.(deps),\n }\n : {}),\n factory: async (deps: TDeps, ctx: TContext) => c.factory(deps, ctx),\n scope: c.service.scope,\n } as ServiceFactory<TService>;\n };\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createServiceRef } from '../system';\n\n/**\n * All core services references\n *\n * @public\n */\nexport namespace coreServices {\n /**\n * The service reference for the plugin scoped {@link CacheService}.\n *\n * @public\n */\n export const cache = createServiceRef<import('./CacheService').CacheService>({\n id: 'core.cache',\n });\n\n /**\n * The service reference for the root scoped {@link ConfigService}.\n *\n * @public\n */\n export const config = createServiceRef<\n import('./ConfigService').ConfigService\n >({ id: 'core.config', scope: 'root' });\n\n /**\n * The service reference for the plugin scoped {@link DatabaseService}.\n *\n * @public\n */\n export const database = createServiceRef<\n import('./DatabaseService').DatabaseService\n >({ id: 'core.database' });\n\n /**\n * The service reference for the plugin scoped {@link DiscoveryService}.\n *\n * @public\n */\n export const discovery = createServiceRef<\n import('./DiscoveryService').DiscoveryService\n >({ id: 'core.discovery' });\n\n /**\n * The service reference for the plugin scoped {@link HttpRouterService}.\n *\n * @public\n */\n export const httpRouter = createServiceRef<\n import('./HttpRouterService').HttpRouterService\n >({ id: 'core.httpRouter' });\n\n /**\n * The service reference for the plugin scoped {@link LifecycleService}.\n *\n * @public\n */\n export const lifecycle = createServiceRef<\n import('./LifecycleService').LifecycleService\n >({ id: 'core.lifecycle' });\n\n /**\n * The service reference for the plugin scoped {@link LoggerService}.\n *\n * @public\n */\n export const logger = createServiceRef<\n import('./LoggerService').LoggerService\n >({ id: 'core.logger' });\n\n /**\n * The service reference for the plugin scoped {@link PermissionsService}.\n *\n * @public\n */\n export const permissions = createServiceRef<\n import('./PermissionsService').PermissionsService\n >({ id: 'core.permissions' });\n\n /**\n * The service reference for the plugin scoped {@link PluginMetadataService}.\n *\n * @public\n */\n export const pluginMetadata = createServiceRef<\n import('./PluginMetadataService').PluginMetadataService\n >({ id: 'core.pluginMetadata' });\n\n /**\n * The service reference for the root scoped {@link RootHttpRouterService}.\n *\n * @public\n */\n export const rootHttpRouter = createServiceRef<\n import('./RootHttpRouterService').RootHttpRouterService\n >({ id: 'core.rootHttpRouter', scope: 'root' });\n\n /**\n * The service reference for the root scoped {@link RootLifecycleService}.\n *\n * @public\n */\n export const rootLifecycle = createServiceRef<\n import('./RootLifecycleService').RootLifecycleService\n >({ id: 'core.rootLifecycle', scope: 'root' });\n\n /**\n * The service reference for the root scoped {@link RootLoggerService}.\n *\n * @public\n */\n export const rootLogger = createServiceRef<\n import('./RootLoggerService').RootLoggerService\n >({ id: 'core.rootLogger', scope: 'root' });\n\n /**\n * The service reference for the plugin scoped {@link SchedulerService}.\n *\n * @public\n */\n export const scheduler = createServiceRef<\n import('./SchedulerService').SchedulerService\n >({ id: 'core.scheduler' });\n\n /**\n * The service reference for the plugin scoped {@link TokenManagerService}.\n *\n * @public\n */\n export const tokenManager = createServiceRef<\n import('./TokenManagerService').TokenManagerService\n >({ id: 'core.tokenManager' });\n\n /**\n * The service reference for the plugin scoped {@link UrlReaderService}.\n *\n * @public\n */\n export const urlReader = createServiceRef<\n import('./UrlReaderService').UrlReaderService\n >({ id: 'core.urlReader' });\n\n /**\n * The service reference for the plugin scoped {@link IdentityService}.\n *\n * @public\n */\n export const identity = createServiceRef<\n import('./IdentityService').IdentityService\n >({ id: 'core.identity' });\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ServiceFactory, ServiceFactoryOrFunction } from '../services';\n\n/**\n * The configuration options passed to {@link createSharedEnvironment}.\n *\n * @public\n */\nexport interface SharedBackendEnvironmentConfig {\n services?: ServiceFactoryOrFunction[];\n}\n\n/**\n * An opaque type that represents the contents of a shared backend environment.\n *\n * @public\n */\nexport interface SharedBackendEnvironment {\n $$type: 'SharedBackendEnvironment';\n\n // NOTE: This type is opaque in order to allow for future API evolution without\n // cluttering the external API. For example we might want to add support\n // for more powerful callback based backend modifications.\n //\n // By making this opaque we also ensure that the type doesn't become an input\n // type that we need to care about, as it would otherwise be possible to pass\n // a custom environment definition to `createBackend`, which we don't want.\n}\n\n/**\n * This type is NOT supposed to be used by anyone except internally by the\n * backend-app-api package.\n *\n * @internal\n */\nexport interface InternalSharedBackendEnvironment {\n version: 'v1';\n services?: ServiceFactory[];\n}\n\n/**\n * Creates a shared backend environment which can be used to create multiple\n * backends.\n *\n * @public\n */\nexport function createSharedEnvironment<\n TOptions extends [options?: object] = [],\n>(\n config:\n | SharedBackendEnvironmentConfig\n | ((...params: TOptions) => SharedBackendEnvironmentConfig),\n): (...options: TOptions) => SharedBackendEnvironment {\n const configCallback = typeof config === 'function' ? config : () => config;\n\n return (...options) => {\n const actualConfig = configCallback(...options);\n const services = actualConfig?.services?.map(sf =>\n typeof sf === 'function' ? sf() : sf,\n );\n\n const exists = new Set<string>();\n const duplicates = new Set<string>();\n for (const { service } of services ?? []) {\n if (exists.has(service.id)) {\n duplicates.add(service.id);\n } else {\n exists.add(service.id);\n }\n }\n\n if (duplicates.size > 0) {\n const dupStr = [...duplicates].map(id => `'${id}'`).join(', ');\n throw new Error(\n `Duplicate service implementations provided in shared environment for ${dupStr}`,\n );\n }\n\n // Here to ensure type safety in this internal implementation.\n const env: SharedBackendEnvironment & InternalSharedBackendEnvironment = {\n $$type: 'SharedBackendEnvironment',\n version: 'v1',\n services,\n };\n return env;\n };\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n BackendModuleRegistrationPoints,\n BackendPluginRegistrationPoints,\n BackendRegistrationPoints,\n BackendFeature,\n ExtensionPoint,\n} from './types';\n\n/**\n * The configuration options passed to {@link createExtensionPoint}.\n *\n * @public\n * @see {@link https://backstage.io/docs/backend-system/architecture/extension-points | The architecture of extension points}\n * @see {@link https://backstage.io/docs/backend-system/architecture/naming-patterns | Recommended naming patterns}\n */\nexport interface ExtensionPointConfig {\n /**\n * The ID of this extension point.\n *\n * @see {@link https://backstage.io/docs/backend-system/architecture/naming-patterns | Recommended naming patterns}\n */\n id: string;\n}\n\n/**\n * Creates a new backend extension point.\n *\n * @public\n * @see {@link https://backstage.io/docs/backend-system/architecture/extension-points | The architecture of extension points}\n */\nexport function createExtensionPoint<T>(\n config: ExtensionPointConfig,\n): ExtensionPoint<T> {\n return {\n id: config.id,\n get T(): T {\n throw new Error(`tried to read ExtensionPoint.T of ${this}`);\n },\n toString() {\n return `extensionPoint{${config.id}}`;\n },\n $$ref: 'extension-point', // TODO: declare\n };\n}\n\n/**\n * The configuration options passed to {@link createBackendPlugin}.\n *\n * @public\n * @see {@link https://backstage.io/docs/backend-system/architecture/plugins | The architecture of plugins}\n * @see {@link https://backstage.io/docs/backend-system/architecture/naming-patterns | Recommended naming patterns}\n */\nexport interface BackendPluginConfig {\n /**\n * The ID of this plugin.\n *\n * @see {@link https://backstage.io/docs/backend-system/architecture/naming-patterns | Recommended naming patterns}\n */\n id: string;\n register(reg: BackendPluginRegistrationPoints): void;\n}\n\n/**\n * Creates a new backend plugin.\n *\n * @public\n * @see {@link https://backstage.io/docs/backend-system/architecture/plugins | The architecture of plugins}\n * @see {@link https://backstage.io/docs/backend-system/architecture/naming-patterns | Recommended naming patterns}\n */\nexport function createBackendPlugin<TOptions extends [options?: object] = []>(\n config: BackendPluginConfig | ((...params: TOptions) => BackendPluginConfig),\n): (...params: TOptions) => BackendFeature {\n if (typeof config === 'function') {\n return config;\n }\n\n return () => config;\n}\n\n/**\n * The configuration options passed to {@link createBackendModule}.\n *\n * @public\n * @see {@link https://backstage.io/docs/backend-system/architecture/modules | The architecture of modules}\n * @see {@link https://backstage.io/docs/backend-system/architecture/naming-patterns | Recommended naming patterns}\n */\nexport interface BackendModuleConfig {\n /**\n * The ID of this plugin.\n *\n * @see {@link https://backstage.io/docs/backend-system/architecture/naming-patterns | Recommended naming patterns}\n */\n pluginId: string;\n /**\n * Should exactly match the `id` of the plugin that the module extends.\n */\n moduleId: string;\n register(reg: BackendModuleRegistrationPoints): void;\n}\n\n/**\n * Creates a new backend module for a given plugin.\n *\n * @public\n * @see {@link https://backstage.io/docs/backend-system/architecture/modules | The architecture of modules}\n * @see {@link https://backstage.io/docs/backend-system/architecture/naming-patterns | Recommended naming patterns}\n */\nexport function createBackendModule<TOptions extends [options?: object] = []>(\n config: BackendModuleConfig | ((...params: TOptions) => BackendModuleConfig),\n): (...params: TOptions) => BackendFeature {\n if (typeof config === 'function') {\n return (...options: TOptions) => {\n const c = config(...options);\n return {\n id: `${c.pluginId}.${c.moduleId}`,\n register: c.register,\n };\n };\n }\n return () => ({\n id: `${config.pluginId}.${config.moduleId}`,\n register(register: BackendRegistrationPoints) {\n return config.register({\n registerInit: register.registerInit.bind(register),\n });\n },\n });\n}\n"],"names":["coreServices"],"mappings":";;;;AA4GO,SAAS,iBACd,MAC2B,EAAA;AAC3B,EAAA,MAAM,EAAE,EAAA,EAAI,KAAQ,GAAA,QAAA,EAAU,gBAAmB,GAAA,MAAA,CAAA;AACjD,EAAO,OAAA;AAAA,IACL,EAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAI,CAAc,GAAA;AAChB,MAAM,MAAA,IAAI,KAAM,CAAA,CAAA,8BAAA,EAAiC,IAAM,CAAA,CAAA,CAAA,CAAA;AAAA,KACzD;AAAA,IACA,QAAW,GAAA;AACT,MAAA,OAAO,cAAc,MAAO,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA;AAAA,KAC9B;AAAA,IACA,KAAO,EAAA,SAAA;AAAA;AAAA,IACP,gBAAkB,EAAA,cAAA;AAAA,GACpB,CAAA;AAKF,CAAA;AAoIO,SAAS,qBAOd,MAS8C,EAAA;AAC9C,EAAA,MAAM,cAAiB,GAAA,OAAO,MAAW,KAAA,UAAA,GAAa,SAAS,MAAM,MAAA,CAAA;AACrE,EAAA,OAAO,CAAC,OAAmB,KAAA;AACzB,IAAM,MAAA,CAAA,GAAI,eAAe,OAAO,CAAA,CAAA;AAChC,IAAO,OAAA;AAAA,MACL,GAAG,CAAA;AAAA,MACH,GAAI,uBAAuB,CACvB,GAAA;AAAA,QACE,iBAAA,EAAmB,OAAO,IAAa,KAAA;AA5RnD,UAAA,IAAA,EAAA,CAAA;AA6Rc,UAAA,OAAA,CAAA,EAAA,GAAA,CAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,CAAA,CAAG,sBAAH,IAAuB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,CAAA,EAAA,IAAA,CAAA,CAAA;AAAA,SAAA;AAAA,UAE3B,EAAC;AAAA,MACL,SAAS,OAAO,IAAA,EAAa,QAAkB,CAAE,CAAA,OAAA,CAAQ,MAAM,GAAG,CAAA;AAAA,MAClE,KAAA,EAAO,EAAE,OAAQ,CAAA,KAAA;AAAA,KACnB,CAAA;AAAA,GACF,CAAA;AACF;;AC7QiBA,8BAAA;AAAA,CAAV,CAAUA,aAAV,KAAA;AAME,EAAMA,aAAAA,CAAA,QAAQ,gBAAwD,CAAA;AAAA,IAC3E,EAAI,EAAA,YAAA;AAAA,GACL,CAAA,CAAA;AAOM,EAAMA,aAAAA,CAAA,SAAS,gBAEpB,CAAA,EAAE,IAAI,aAAe,EAAA,KAAA,EAAO,QAAQ,CAAA,CAAA;AAO/B,EAAMA,cAAA,QAAW,GAAA,gBAAA,CAEtB,EAAE,EAAA,EAAI,iBAAiB,CAAA,CAAA;AAOlB,EAAMA,cAAA,SAAY,GAAA,gBAAA,CAEvB,EAAE,EAAA,EAAI,kBAAkB,CAAA,CAAA;AAOnB,EAAMA,cAAA,UAAa,GAAA,gBAAA,CAExB,EAAE,EAAA,EAAI,mBAAmB,CAAA,CAAA;AAOpB,EAAMA,cAAA,SAAY,GAAA,gBAAA,CAEvB,EAAE,EAAA,EAAI,kBAAkB,CAAA,CAAA;AAOnB,EAAMA,cAAA,MAAS,GAAA,gBAAA,CAEpB,EAAE,EAAA,EAAI,eAAe,CAAA,CAAA;AAOhB,EAAMA,cAAA,WAAc,GAAA,gBAAA,CAEzB,EAAE,EAAA,EAAI,oBAAoB,CAAA,CAAA;AAOrB,EAAMA,cAAA,cAAiB,GAAA,gBAAA,CAE5B,EAAE,EAAA,EAAI,uBAAuB,CAAA,CAAA;AAOxB,EAAMA,aAAAA,CAAA,iBAAiB,gBAE5B,CAAA,EAAE,IAAI,qBAAuB,EAAA,KAAA,EAAO,QAAQ,CAAA,CAAA;AAOvC,EAAMA,aAAAA,CAAA,gBAAgB,gBAE3B,CAAA,EAAE,IAAI,oBAAsB,EAAA,KAAA,EAAO,QAAQ,CAAA,CAAA;AAOtC,EAAMA,aAAAA,CAAA,aAAa,gBAExB,CAAA,EAAE,IAAI,iBAAmB,EAAA,KAAA,EAAO,QAAQ,CAAA,CAAA;AAOnC,EAAMA,cAAA,SAAY,GAAA,gBAAA,CAEvB,EAAE,EAAA,EAAI,kBAAkB,CAAA,CAAA;AAOnB,EAAMA,cAAA,YAAe,GAAA,gBAAA,CAE1B,EAAE,EAAA,EAAI,qBAAqB,CAAA,CAAA;AAOtB,EAAMA,cAAA,SAAY,GAAA,gBAAA,CAEvB,EAAE,EAAA,EAAI,kBAAkB,CAAA,CAAA;AAOnB,EAAMA,cAAA,QAAW,GAAA,gBAAA,CAEtB,EAAE,EAAA,EAAI,iBAAiB,CAAA,CAAA;AAAA,CA/IV,EAAAA,oBAAA,KAAAA,oBAAA,GAAA,EAAA,CAAA,CAAA;;ACsCV,SAAS,wBAGd,MAGoD,EAAA;AACpD,EAAA,MAAM,cAAiB,GAAA,OAAO,MAAW,KAAA,UAAA,GAAa,SAAS,MAAM,MAAA,CAAA;AAErE,EAAA,OAAO,IAAI,OAAY,KAAA;AAtEzB,IAAA,IAAA,EAAA,CAAA;AAuEI,IAAM,MAAA,YAAA,GAAe,cAAe,CAAA,GAAG,OAAO,CAAA,CAAA;AAC9C,IAAM,MAAA,QAAA,GAAA,CAAW,EAAc,GAAA,YAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,YAAA,CAAA,QAAA,KAAd,IAAwB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,GAAA;AAAA,MAAI,CAC3C,EAAA,KAAA,OAAO,EAAO,KAAA,UAAA,GAAa,IAAO,GAAA,EAAA;AAAA,KAAA,CAAA;AAGpC,IAAM,MAAA,MAAA,uBAAa,GAAY,EAAA,CAAA;AAC/B,IAAM,MAAA,UAAA,uBAAiB,GAAY,EAAA,CAAA;AACnC,IAAA,KAAA,MAAW,EAAE,OAAA,EAAa,IAAA,QAAA,IAAA,IAAA,GAAA,QAAA,GAAY,EAAI,EAAA;AACxC,MAAA,IAAI,MAAO,CAAA,GAAA,CAAI,OAAQ,CAAA,EAAE,CAAG,EAAA;AAC1B,QAAW,UAAA,CAAA,GAAA,CAAI,QAAQ,EAAE,CAAA,CAAA;AAAA,OACpB,MAAA;AACL,QAAO,MAAA,CAAA,GAAA,CAAI,QAAQ,EAAE,CAAA,CAAA;AAAA,OACvB;AAAA,KACF;AAEA,IAAI,IAAA,UAAA,CAAW,OAAO,CAAG,EAAA;AACvB,MAAM,MAAA,MAAA,GAAS,CAAC,GAAG,UAAU,CAAA,CAAE,GAAI,CAAA,CAAA,EAAA,KAAM,CAAI,CAAA,EAAA,EAAA,CAAA,CAAA,CAAK,CAAE,CAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AAC7D,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAwE,qEAAA,EAAA,MAAA,CAAA,CAAA;AAAA,OAC1E,CAAA;AAAA,KACF;AAGA,IAAA,MAAM,GAAmE,GAAA;AAAA,MACvE,MAAQ,EAAA,0BAAA;AAAA,MACR,OAAS,EAAA,IAAA;AAAA,MACT,QAAA;AAAA,KACF,CAAA;AACA,IAAO,OAAA,GAAA,CAAA;AAAA,GACT,CAAA;AACF;;ACvDO,SAAS,qBACd,MACmB,EAAA;AACnB,EAAO,OAAA;AAAA,IACL,IAAI,MAAO,CAAA,EAAA;AAAA,IACX,IAAI,CAAO,GAAA;AACT,MAAM,MAAA,IAAI,KAAM,CAAA,CAAA,kCAAA,EAAqC,IAAM,CAAA,CAAA,CAAA,CAAA;AAAA,KAC7D;AAAA,IACA,QAAW,GAAA;AACT,MAAA,OAAO,kBAAkB,MAAO,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA;AAAA,KAClC;AAAA,IACA,KAAO,EAAA,iBAAA;AAAA;AAAA,GACT,CAAA;AACF,CAAA;AA0BO,SAAS,oBACd,MACyC,EAAA;AACzC,EAAI,IAAA,OAAO,WAAW,UAAY,EAAA;AAChC,IAAO,OAAA,MAAA,CAAA;AAAA,GACT;AAEA,EAAA,OAAO,MAAM,MAAA,CAAA;AACf,CAAA;AA8BO,SAAS,oBACd,MACyC,EAAA;AACzC,EAAI,IAAA,OAAO,WAAW,UAAY,EAAA;AAChC,IAAA,OAAO,IAAI,OAAsB,KAAA;AAC/B,MAAM,MAAA,CAAA,GAAI,MAAO,CAAA,GAAG,OAAO,CAAA,CAAA;AAC3B,MAAO,OAAA;AAAA,QACL,EAAI,EAAA,CAAA,EAAG,CAAE,CAAA,QAAA,CAAA,CAAA,EAAY,CAAE,CAAA,QAAA,CAAA,CAAA;AAAA,QACvB,UAAU,CAAE,CAAA,QAAA;AAAA,OACd,CAAA;AAAA,KACF,CAAA;AAAA,GACF;AACA,EAAA,OAAO,OAAO;AAAA,IACZ,EAAI,EAAA,CAAA,EAAG,MAAO,CAAA,QAAA,CAAA,CAAA,EAAY,MAAO,CAAA,QAAA,CAAA,CAAA;AAAA,IACjC,SAAS,QAAqC,EAAA;AAC5C,MAAA,OAAO,OAAO,QAAS,CAAA;AAAA,QACrB,YAAc,EAAA,QAAA,CAAS,YAAa,CAAA,IAAA,CAAK,QAAQ,CAAA;AAAA,OAClD,CAAA,CAAA;AAAA,KACH;AAAA,GACF,CAAA,CAAA;AACF;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/services/system/types.ts","../src/services/definitions/coreServices.ts","../src/wiring/createSharedEnvironment.ts","../src/wiring/factories.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * TODO\n *\n * @public\n */\nexport type ServiceRef<\n TService,\n TScope extends 'root' | 'plugin' = 'root' | 'plugin',\n> = {\n id: string;\n\n /**\n * This determines the scope at which this service is available.\n *\n * Root scoped services are available to all other services but\n * may only depend on other root scoped services.\n *\n * Plugin scoped services are only available to other plugin scoped\n * services but may depend on all other services.\n */\n scope: TScope;\n\n /**\n * Utility for getting the type of the service, using `typeof serviceRef.T`.\n * Attempting to actually read this value will result in an exception.\n */\n T: TService;\n\n toString(): string;\n\n $$type: '@backstage/ServiceRef';\n};\n\n/** @public */\nexport interface ServiceFactory<\n TService = unknown,\n TScope extends 'plugin' | 'root' = 'plugin' | 'root',\n> {\n $$type: '@backstage/ServiceFactory';\n\n service: ServiceRef<TService, TScope>;\n}\n\n/** @internal */\nexport interface InternalServiceFactory<\n TService = unknown,\n TScope extends 'plugin' | 'root' = 'plugin' | 'root',\n> extends ServiceFactory<TService, TScope> {\n version: 'v1';\n deps: { [key in string]: ServiceRef<unknown> };\n createRootContext?(deps: { [key in string]: unknown }): Promise<unknown>;\n factory(\n deps: { [key in string]: unknown },\n context: unknown,\n ): Promise<TService>;\n}\n\n/**\n * Represents either a {@link ServiceFactory} or a function that returns one.\n *\n * @public\n */\nexport type ServiceFactoryOrFunction = ServiceFactory | (() => ServiceFactory);\n\n/** @public */\nexport interface ServiceRefConfig<TService, TScope extends 'root' | 'plugin'> {\n id: string;\n scope?: TScope;\n defaultFactory?: (\n service: ServiceRef<TService, TScope>,\n ) => Promise<ServiceFactoryOrFunction>;\n}\n\n/**\n * Creates a new service definition. This overload is used to create plugin scoped services.\n *\n * @public\n */\nexport function createServiceRef<TService>(\n config: ServiceRefConfig<TService, 'plugin'>,\n): ServiceRef<TService, 'plugin'>;\n\n/**\n * Creates a new service definition. This overload is used to create root scoped services.\n *\n * @public\n */\nexport function createServiceRef<TService>(\n config: ServiceRefConfig<TService, 'root'>,\n): ServiceRef<TService, 'root'>;\nexport function createServiceRef<TService>(\n config: ServiceRefConfig<TService, any>,\n): ServiceRef<TService, any> {\n const { id, scope = 'plugin', defaultFactory } = config;\n return {\n id,\n scope,\n get T(): TService {\n throw new Error(`tried to read ServiceRef.T of ${this}`);\n },\n toString() {\n return `serviceRef{${config.id}}`;\n },\n $$type: '@backstage/ServiceRef',\n __defaultFactory: defaultFactory,\n } as ServiceRef<TService, typeof scope> & {\n __defaultFactory?: (\n service: ServiceRef<TService>,\n ) => Promise<ServiceFactory<TService> | (() => ServiceFactory<TService>)>;\n };\n}\n\n/** @ignore */\ntype ServiceRefsToInstances<\n T extends { [key in string]: ServiceRef<unknown> },\n TScope extends 'root' | 'plugin' = 'root' | 'plugin',\n> = {\n [key in keyof T as T[key]['scope'] extends TScope ? key : never]: T[key]['T'];\n};\n\n/** @public */\nexport interface RootServiceFactoryConfig<\n TService,\n TImpl extends TService,\n TDeps extends { [name in string]: ServiceRef<unknown> },\n> {\n service: ServiceRef<TService, 'root'>;\n deps: TDeps;\n factory(deps: ServiceRefsToInstances<TDeps, 'root'>): TImpl | Promise<TImpl>;\n}\n\n/** @public */\nexport interface PluginServiceFactoryConfig<\n TService,\n TContext,\n TImpl extends TService,\n TDeps extends { [name in string]: ServiceRef<unknown> },\n> {\n service: ServiceRef<TService, 'plugin'>;\n deps: TDeps;\n createRootContext?(\n deps: ServiceRefsToInstances<TDeps, 'root'>,\n ): TContext | Promise<TContext>;\n factory(\n deps: ServiceRefsToInstances<TDeps>,\n context: TContext,\n ): TImpl | Promise<TImpl>;\n}\n\n/**\n * Creates a root scoped service factory without options.\n *\n * @public\n * @param config - The service factory configuration.\n */\nexport function createServiceFactory<\n TService,\n TImpl extends TService,\n TDeps extends { [name in string]: ServiceRef<unknown> },\n TOpts extends object | undefined = undefined,\n>(\n config: RootServiceFactoryConfig<TService, TImpl, TDeps>,\n): () => ServiceFactory<TService, 'root'>;\n/**\n * Creates a root scoped service factory with optional options.\n *\n * @public\n * @param config - The service factory configuration.\n */\nexport function createServiceFactory<\n TService,\n TImpl extends TService,\n TDeps extends { [name in string]: ServiceRef<unknown> },\n TOpts extends object | undefined = undefined,\n>(\n config: (options?: TOpts) => RootServiceFactoryConfig<TService, TImpl, TDeps>,\n): (options?: TOpts) => ServiceFactory<TService, 'root'>;\n/**\n * Creates a root scoped service factory with required options.\n *\n * @public\n * @param config - The service factory configuration.\n */\nexport function createServiceFactory<\n TService,\n TImpl extends TService,\n TDeps extends { [name in string]: ServiceRef<unknown> },\n TOpts extends object | undefined = undefined,\n>(\n config: (options: TOpts) => RootServiceFactoryConfig<TService, TImpl, TDeps>,\n): (options: TOpts) => ServiceFactory<TService, 'root'>;\n/**\n * Creates a plugin scoped service factory without options.\n *\n * @public\n * @param config - The service factory configuration.\n */\nexport function createServiceFactory<\n TService,\n TImpl extends TService,\n TDeps extends { [name in string]: ServiceRef<unknown> },\n TContext = undefined,\n TOpts extends object | undefined = undefined,\n>(\n config: PluginServiceFactoryConfig<TService, TContext, TImpl, TDeps>,\n): () => ServiceFactory<TService, 'plugin'>;\n/**\n * Creates a plugin scoped service factory with optional options.\n *\n * @public\n * @param config - The service factory configuration.\n */\nexport function createServiceFactory<\n TService,\n TImpl extends TService,\n TDeps extends { [name in string]: ServiceRef<unknown> },\n TContext = undefined,\n TOpts extends object | undefined = undefined,\n>(\n config: (\n options?: TOpts,\n ) => PluginServiceFactoryConfig<TService, TContext, TImpl, TDeps>,\n): (options?: TOpts) => ServiceFactory<TService, 'plugin'>;\n/**\n * Creates a plugin scoped service factory with required options.\n *\n * @public\n * @param config - The service factory configuration.\n */\nexport function createServiceFactory<\n TService,\n TImpl extends TService,\n TDeps extends { [name in string]: ServiceRef<unknown> },\n TContext = undefined,\n TOpts extends object | undefined = undefined,\n>(\n config:\n | PluginServiceFactoryConfig<TService, TContext, TImpl, TDeps>\n | ((\n options: TOpts,\n ) => PluginServiceFactoryConfig<TService, TContext, TImpl, TDeps>),\n): (options: TOpts) => ServiceFactory<TService, 'plugin'>;\nexport function createServiceFactory<\n TService,\n TImpl extends TService,\n TDeps extends { [name in string]: ServiceRef<unknown> },\n TContext,\n TOpts extends object | undefined = undefined,\n>(\n config:\n | RootServiceFactoryConfig<TService, TImpl, TDeps>\n | PluginServiceFactoryConfig<TService, TContext, TImpl, TDeps>\n | ((options: TOpts) => RootServiceFactoryConfig<TService, TImpl, TDeps>)\n | ((\n options: TOpts,\n ) => PluginServiceFactoryConfig<TService, TContext, TImpl, TDeps>)\n | (() => RootServiceFactoryConfig<TService, TImpl, TDeps>)\n | (() => PluginServiceFactoryConfig<TService, TContext, TImpl, TDeps>),\n): (options: TOpts) => ServiceFactory {\n const configCallback = typeof config === 'function' ? config : () => config;\n return (\n options: TOpts,\n ): InternalServiceFactory<TService, 'plugin' | 'root'> => {\n const anyConf = configCallback(options);\n if (anyConf.service.scope === 'root') {\n const c = anyConf as RootServiceFactoryConfig<TService, TImpl, TDeps>;\n return {\n $$type: '@backstage/ServiceFactory',\n version: 'v1',\n service: c.service,\n deps: c.deps,\n factory: async (deps: TDeps) => c.factory(deps),\n };\n }\n const c = anyConf as PluginServiceFactoryConfig<\n TService,\n TContext,\n TImpl,\n TDeps\n >;\n return {\n $$type: '@backstage/ServiceFactory',\n version: 'v1',\n service: c.service,\n ...('createRootContext' in c\n ? {\n createRootContext: async (deps: TDeps) =>\n c?.createRootContext?.(deps),\n }\n : {}),\n deps: c.deps,\n factory: async (deps: TDeps, ctx: TContext) => c.factory(deps, ctx),\n };\n };\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createServiceRef } from '../system';\n\n/**\n * All core services references\n *\n * @public\n */\nexport namespace coreServices {\n /**\n * The service reference for the plugin scoped {@link CacheService}.\n *\n * @public\n */\n export const cache = createServiceRef<import('./CacheService').CacheService>({\n id: 'core.cache',\n });\n\n /**\n * The service reference for the root scoped {@link ConfigService}.\n *\n * @public\n */\n export const config = createServiceRef<\n import('./ConfigService').ConfigService\n >({ id: 'core.config', scope: 'root' });\n\n /**\n * The service reference for the plugin scoped {@link DatabaseService}.\n *\n * @public\n */\n export const database = createServiceRef<\n import('./DatabaseService').DatabaseService\n >({ id: 'core.database' });\n\n /**\n * The service reference for the plugin scoped {@link DiscoveryService}.\n *\n * @public\n */\n export const discovery = createServiceRef<\n import('./DiscoveryService').DiscoveryService\n >({ id: 'core.discovery' });\n\n /**\n * The service reference for the plugin scoped {@link HttpRouterService}.\n *\n * @public\n */\n export const httpRouter = createServiceRef<\n import('./HttpRouterService').HttpRouterService\n >({ id: 'core.httpRouter' });\n\n /**\n * The service reference for the plugin scoped {@link LifecycleService}.\n *\n * @public\n */\n export const lifecycle = createServiceRef<\n import('./LifecycleService').LifecycleService\n >({ id: 'core.lifecycle' });\n\n /**\n * The service reference for the plugin scoped {@link LoggerService}.\n *\n * @public\n */\n export const logger = createServiceRef<\n import('./LoggerService').LoggerService\n >({ id: 'core.logger' });\n\n /**\n * The service reference for the plugin scoped {@link PermissionsService}.\n *\n * @public\n */\n export const permissions = createServiceRef<\n import('./PermissionsService').PermissionsService\n >({ id: 'core.permissions' });\n\n /**\n * The service reference for the plugin scoped {@link PluginMetadataService}.\n *\n * @public\n */\n export const pluginMetadata = createServiceRef<\n import('./PluginMetadataService').PluginMetadataService\n >({ id: 'core.pluginMetadata' });\n\n /**\n * The service reference for the root scoped {@link RootHttpRouterService}.\n *\n * @public\n */\n export const rootHttpRouter = createServiceRef<\n import('./RootHttpRouterService').RootHttpRouterService\n >({ id: 'core.rootHttpRouter', scope: 'root' });\n\n /**\n * The service reference for the root scoped {@link RootLifecycleService}.\n *\n * @public\n */\n export const rootLifecycle = createServiceRef<\n import('./RootLifecycleService').RootLifecycleService\n >({ id: 'core.rootLifecycle', scope: 'root' });\n\n /**\n * The service reference for the root scoped {@link RootLoggerService}.\n *\n * @public\n */\n export const rootLogger = createServiceRef<\n import('./RootLoggerService').RootLoggerService\n >({ id: 'core.rootLogger', scope: 'root' });\n\n /**\n * The service reference for the plugin scoped {@link SchedulerService}.\n *\n * @public\n */\n export const scheduler = createServiceRef<\n import('./SchedulerService').SchedulerService\n >({ id: 'core.scheduler' });\n\n /**\n * The service reference for the plugin scoped {@link TokenManagerService}.\n *\n * @public\n */\n export const tokenManager = createServiceRef<\n import('./TokenManagerService').TokenManagerService\n >({ id: 'core.tokenManager' });\n\n /**\n * The service reference for the plugin scoped {@link UrlReaderService}.\n *\n * @public\n */\n export const urlReader = createServiceRef<\n import('./UrlReaderService').UrlReaderService\n >({ id: 'core.urlReader' });\n\n /**\n * The service reference for the plugin scoped {@link IdentityService}.\n *\n * @public\n */\n export const identity = createServiceRef<\n import('./IdentityService').IdentityService\n >({ id: 'core.identity' });\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ServiceFactory, ServiceFactoryOrFunction } from '../services';\n\n/**\n * The configuration options passed to {@link createSharedEnvironment}.\n *\n * @public\n */\nexport interface SharedBackendEnvironmentConfig {\n services?: ServiceFactoryOrFunction[];\n}\n\n/**\n * An opaque type that represents the contents of a shared backend environment.\n *\n * @public\n */\nexport interface SharedBackendEnvironment {\n $$type: '@backstage/SharedBackendEnvironment';\n\n // NOTE: This type is opaque in order to allow for future API evolution without\n // cluttering the external API. For example we might want to add support\n // for more powerful callback based backend modifications.\n //\n // By making this opaque we also ensure that the type doesn't become an input\n // type that we need to care about, as it would otherwise be possible to pass\n // a custom environment definition to `createBackend`, which we don't want.\n}\n\n/**\n * This type is NOT supposed to be used by anyone except internally by the\n * backend-app-api package.\n *\n * @internal\n */\nexport interface InternalSharedBackendEnvironment {\n version: 'v1';\n services?: ServiceFactory[];\n}\n\n/**\n * Creates a shared backend environment which can be used to create multiple\n * backends.\n *\n * @public\n */\nexport function createSharedEnvironment<\n TOptions extends [options?: object] = [],\n>(\n config:\n | SharedBackendEnvironmentConfig\n | ((...params: TOptions) => SharedBackendEnvironmentConfig),\n): (...options: TOptions) => SharedBackendEnvironment {\n const configCallback = typeof config === 'function' ? config : () => config;\n\n return (...options) => {\n const actualConfig = configCallback(...options);\n const services = actualConfig?.services?.map(sf =>\n typeof sf === 'function' ? sf() : sf,\n );\n\n const exists = new Set<string>();\n const duplicates = new Set<string>();\n for (const { service } of services ?? []) {\n if (exists.has(service.id)) {\n duplicates.add(service.id);\n } else {\n exists.add(service.id);\n }\n }\n\n if (duplicates.size > 0) {\n const dupStr = [...duplicates].map(id => `'${id}'`).join(', ');\n throw new Error(\n `Duplicate service implementations provided in shared environment for ${dupStr}`,\n );\n }\n\n // Here to ensure type safety in this internal implementation.\n const env: SharedBackendEnvironment & InternalSharedBackendEnvironment = {\n $$type: '@backstage/SharedBackendEnvironment',\n version: 'v1',\n services,\n };\n return env;\n };\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n BackendModuleRegistrationPoints,\n BackendPluginRegistrationPoints,\n BackendFeature,\n ExtensionPoint,\n InternalBackendFeature,\n InternalBackendModuleRegistration,\n InternalBackendPluginRegistration,\n} from './types';\n\n/**\n * The configuration options passed to {@link createExtensionPoint}.\n *\n * @public\n * @see {@link https://backstage.io/docs/backend-system/architecture/extension-points | The architecture of extension points}\n * @see {@link https://backstage.io/docs/backend-system/architecture/naming-patterns | Recommended naming patterns}\n */\nexport interface ExtensionPointConfig {\n /**\n * The ID of this extension point.\n *\n * @see {@link https://backstage.io/docs/backend-system/architecture/naming-patterns | Recommended naming patterns}\n */\n id: string;\n}\n\n/**\n * Creates a new backend extension point.\n *\n * @public\n * @see {@link https://backstage.io/docs/backend-system/architecture/extension-points | The architecture of extension points}\n */\nexport function createExtensionPoint<T>(\n config: ExtensionPointConfig,\n): ExtensionPoint<T> {\n return {\n id: config.id,\n get T(): T {\n throw new Error(`tried to read ExtensionPoint.T of ${this}`);\n },\n toString() {\n return `extensionPoint{${config.id}}`;\n },\n $$type: '@backstage/ExtensionPoint',\n };\n}\n\n/**\n * The configuration options passed to {@link createBackendPlugin}.\n *\n * @public\n * @see {@link https://backstage.io/docs/backend-system/architecture/plugins | The architecture of plugins}\n * @see {@link https://backstage.io/docs/backend-system/architecture/naming-patterns | Recommended naming patterns}\n */\nexport interface BackendPluginConfig {\n /**\n * The ID of this plugin.\n *\n * @see {@link https://backstage.io/docs/backend-system/architecture/naming-patterns | Recommended naming patterns}\n */\n pluginId: string;\n register(reg: BackendPluginRegistrationPoints): void;\n}\n\n/**\n * Creates a new backend plugin.\n *\n * @public\n * @see {@link https://backstage.io/docs/backend-system/architecture/plugins | The architecture of plugins}\n * @see {@link https://backstage.io/docs/backend-system/architecture/naming-patterns | Recommended naming patterns}\n */\nexport function createBackendPlugin<TOptions extends [options?: object] = []>(\n config: BackendPluginConfig | ((...params: TOptions) => BackendPluginConfig),\n): (...params: TOptions) => BackendFeature {\n const configCallback = typeof config === 'function' ? config : () => config;\n return (...options: TOptions): InternalBackendFeature => {\n const c = configCallback(...options);\n\n let registrations: InternalBackendPluginRegistration[];\n\n return {\n $$type: '@backstage/BackendFeature',\n version: 'v1',\n getRegistrations() {\n if (registrations) {\n return registrations;\n }\n const extensionPoints: InternalBackendPluginRegistration['extensionPoints'] =\n [];\n let init: InternalBackendPluginRegistration['init'] | undefined =\n undefined;\n\n c.register({\n registerExtensionPoint(ext, impl) {\n if (init) {\n throw new Error(\n 'registerExtensionPoint called after registerInit',\n );\n }\n extensionPoints.push([ext, impl]);\n },\n registerInit(regInit) {\n if (init) {\n throw new Error('registerInit must only be called once');\n }\n init = {\n deps: regInit.deps,\n func: regInit.init,\n };\n },\n });\n\n if (!init) {\n throw new Error(\n `registerInit was not called by register in ${c.pluginId}`,\n );\n }\n\n registrations = [\n {\n type: 'plugin',\n pluginId: c.pluginId,\n extensionPoints,\n init,\n },\n ];\n return registrations;\n },\n };\n };\n}\n\n/**\n * The configuration options passed to {@link createBackendModule}.\n *\n * @public\n * @see {@link https://backstage.io/docs/backend-system/architecture/modules | The architecture of modules}\n * @see {@link https://backstage.io/docs/backend-system/architecture/naming-patterns | Recommended naming patterns}\n */\nexport interface BackendModuleConfig {\n /**\n * The ID of this plugin.\n *\n * @see {@link https://backstage.io/docs/backend-system/architecture/naming-patterns | Recommended naming patterns}\n */\n pluginId: string;\n /**\n * Should exactly match the `id` of the plugin that the module extends.\n */\n moduleId: string;\n register(reg: BackendModuleRegistrationPoints): void;\n}\n\n/**\n * Creates a new backend module for a given plugin.\n *\n * @public\n * @see {@link https://backstage.io/docs/backend-system/architecture/modules | The architecture of modules}\n * @see {@link https://backstage.io/docs/backend-system/architecture/naming-patterns | Recommended naming patterns}\n */\nexport function createBackendModule<TOptions extends [options?: object] = []>(\n config: BackendModuleConfig | ((...params: TOptions) => BackendModuleConfig),\n): (...params: TOptions) => BackendFeature {\n const configCallback = typeof config === 'function' ? config : () => config;\n return (...options: TOptions): InternalBackendFeature => {\n const c = configCallback(...options);\n\n let registrations: InternalBackendModuleRegistration[];\n\n return {\n $$type: '@backstage/BackendFeature',\n version: 'v1',\n getRegistrations() {\n if (registrations) {\n return registrations;\n }\n let init: InternalBackendModuleRegistration['init'] | undefined =\n undefined;\n\n c.register({\n registerInit(regInit) {\n if (init) {\n throw new Error('registerInit must only be called once');\n }\n init = {\n deps: regInit.deps,\n func: regInit.init,\n };\n },\n });\n\n if (!init) {\n throw new Error(\n `registerInit was not called by register in ${c.moduleId} module for ${c.pluginId}`,\n );\n }\n\n registrations = [\n {\n type: 'module',\n pluginId: c.pluginId,\n moduleId: c.moduleId,\n init,\n },\n ];\n return registrations;\n },\n };\n };\n}\n"],"names":["c","coreServices"],"mappings":";;;;AA0GO,SAAS,iBACd,MAC2B,EAAA;AAC3B,EAAA,MAAM,EAAE,EAAA,EAAI,KAAQ,GAAA,QAAA,EAAU,gBAAmB,GAAA,MAAA,CAAA;AACjD,EAAO,OAAA;AAAA,IACL,EAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAI,CAAc,GAAA;AAChB,MAAM,MAAA,IAAI,KAAM,CAAA,CAAA,8BAAA,EAAiC,IAAM,CAAA,CAAA,CAAA,CAAA;AAAA,KACzD;AAAA,IACA,QAAW,GAAA;AACT,MAAA,OAAO,cAAc,MAAO,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA;AAAA,KAC9B;AAAA,IACA,MAAQ,EAAA,uBAAA;AAAA,IACR,gBAAkB,EAAA,cAAA;AAAA,GACpB,CAAA;AAKF,CAAA;AAoIO,SAAS,qBAOd,MASoC,EAAA;AACpC,EAAA,MAAM,cAAiB,GAAA,OAAO,MAAW,KAAA,UAAA,GAAa,SAAS,MAAM,MAAA,CAAA;AACrE,EAAA,OAAO,CACL,OACwD,KAAA;AACxD,IAAM,MAAA,OAAA,GAAU,eAAe,OAAO,CAAA,CAAA;AACtC,IAAI,IAAA,OAAA,CAAQ,OAAQ,CAAA,KAAA,KAAU,MAAQ,EAAA;AACpC,MAAA,MAAMA,EAAI,GAAA,OAAA,CAAA;AACV,MAAO,OAAA;AAAA,QACL,MAAQ,EAAA,2BAAA;AAAA,QACR,OAAS,EAAA,IAAA;AAAA,QACT,SAASA,EAAE,CAAA,OAAA;AAAA,QACX,MAAMA,EAAE,CAAA,IAAA;AAAA,QACR,OAAS,EAAA,OAAO,IAAgBA,KAAAA,EAAAA,CAAE,QAAQ,IAAI,CAAA;AAAA,OAChD,CAAA;AAAA,KACF;AACA,IAAA,MAAM,CAAI,GAAA,OAAA,CAAA;AAMV,IAAO,OAAA;AAAA,MACL,MAAQ,EAAA,2BAAA;AAAA,MACR,OAAS,EAAA,IAAA;AAAA,MACT,SAAS,CAAE,CAAA,OAAA;AAAA,MACX,GAAI,uBAAuB,CACvB,GAAA;AAAA,QACE,iBAAA,EAAmB,OAAO,IAAa,KAAA;AA9SnD,UAAA,IAAA,EAAA,CAAA;AA+Sc,UAAA,OAAA,CAAA,EAAA,GAAA,CAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,CAAA,CAAG,sBAAH,IAAuB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,CAAA,EAAA,IAAA,CAAA,CAAA;AAAA,SAAA;AAAA,UAE3B,EAAC;AAAA,MACL,MAAM,CAAE,CAAA,IAAA;AAAA,MACR,SAAS,OAAO,IAAA,EAAa,QAAkB,CAAE,CAAA,OAAA,CAAQ,MAAM,GAAG,CAAA;AAAA,KACpE,CAAA;AAAA,GACF,CAAA;AACF;;AC/RiBC,8BAAA;AAAA,CAAV,CAAUA,aAAV,KAAA;AAME,EAAMA,aAAAA,CAAA,QAAQ,gBAAwD,CAAA;AAAA,IAC3E,EAAI,EAAA,YAAA;AAAA,GACL,CAAA,CAAA;AAOM,EAAMA,aAAAA,CAAA,SAAS,gBAEpB,CAAA,EAAE,IAAI,aAAe,EAAA,KAAA,EAAO,QAAQ,CAAA,CAAA;AAO/B,EAAMA,cAAA,QAAW,GAAA,gBAAA,CAEtB,EAAE,EAAA,EAAI,iBAAiB,CAAA,CAAA;AAOlB,EAAMA,cAAA,SAAY,GAAA,gBAAA,CAEvB,EAAE,EAAA,EAAI,kBAAkB,CAAA,CAAA;AAOnB,EAAMA,cAAA,UAAa,GAAA,gBAAA,CAExB,EAAE,EAAA,EAAI,mBAAmB,CAAA,CAAA;AAOpB,EAAMA,cAAA,SAAY,GAAA,gBAAA,CAEvB,EAAE,EAAA,EAAI,kBAAkB,CAAA,CAAA;AAOnB,EAAMA,cAAA,MAAS,GAAA,gBAAA,CAEpB,EAAE,EAAA,EAAI,eAAe,CAAA,CAAA;AAOhB,EAAMA,cAAA,WAAc,GAAA,gBAAA,CAEzB,EAAE,EAAA,EAAI,oBAAoB,CAAA,CAAA;AAOrB,EAAMA,cAAA,cAAiB,GAAA,gBAAA,CAE5B,EAAE,EAAA,EAAI,uBAAuB,CAAA,CAAA;AAOxB,EAAMA,aAAAA,CAAA,iBAAiB,gBAE5B,CAAA,EAAE,IAAI,qBAAuB,EAAA,KAAA,EAAO,QAAQ,CAAA,CAAA;AAOvC,EAAMA,aAAAA,CAAA,gBAAgB,gBAE3B,CAAA,EAAE,IAAI,oBAAsB,EAAA,KAAA,EAAO,QAAQ,CAAA,CAAA;AAOtC,EAAMA,aAAAA,CAAA,aAAa,gBAExB,CAAA,EAAE,IAAI,iBAAmB,EAAA,KAAA,EAAO,QAAQ,CAAA,CAAA;AAOnC,EAAMA,cAAA,SAAY,GAAA,gBAAA,CAEvB,EAAE,EAAA,EAAI,kBAAkB,CAAA,CAAA;AAOnB,EAAMA,cAAA,YAAe,GAAA,gBAAA,CAE1B,EAAE,EAAA,EAAI,qBAAqB,CAAA,CAAA;AAOtB,EAAMA,cAAA,SAAY,GAAA,gBAAA,CAEvB,EAAE,EAAA,EAAI,kBAAkB,CAAA,CAAA;AAOnB,EAAMA,cAAA,QAAW,GAAA,gBAAA,CAEtB,EAAE,EAAA,EAAI,iBAAiB,CAAA,CAAA;AAAA,CA/IV,EAAAA,oBAAA,KAAAA,oBAAA,GAAA,EAAA,CAAA,CAAA;;ACsCV,SAAS,wBAGd,MAGoD,EAAA;AACpD,EAAA,MAAM,cAAiB,GAAA,OAAO,MAAW,KAAA,UAAA,GAAa,SAAS,MAAM,MAAA,CAAA;AAErE,EAAA,OAAO,IAAI,OAAY,KAAA;AAtEzB,IAAA,IAAA,EAAA,CAAA;AAuEI,IAAM,MAAA,YAAA,GAAe,cAAe,CAAA,GAAG,OAAO,CAAA,CAAA;AAC9C,IAAM,MAAA,QAAA,GAAA,CAAW,EAAc,GAAA,YAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,YAAA,CAAA,QAAA,KAAd,IAAwB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,GAAA;AAAA,MAAI,CAC3C,EAAA,KAAA,OAAO,EAAO,KAAA,UAAA,GAAa,IAAO,GAAA,EAAA;AAAA,KAAA,CAAA;AAGpC,IAAM,MAAA,MAAA,uBAAa,GAAY,EAAA,CAAA;AAC/B,IAAM,MAAA,UAAA,uBAAiB,GAAY,EAAA,CAAA;AACnC,IAAA,KAAA,MAAW,EAAE,OAAA,EAAa,IAAA,QAAA,IAAA,IAAA,GAAA,QAAA,GAAY,EAAI,EAAA;AACxC,MAAA,IAAI,MAAO,CAAA,GAAA,CAAI,OAAQ,CAAA,EAAE,CAAG,EAAA;AAC1B,QAAW,UAAA,CAAA,GAAA,CAAI,QAAQ,EAAE,CAAA,CAAA;AAAA,OACpB,MAAA;AACL,QAAO,MAAA,CAAA,GAAA,CAAI,QAAQ,EAAE,CAAA,CAAA;AAAA,OACvB;AAAA,KACF;AAEA,IAAI,IAAA,UAAA,CAAW,OAAO,CAAG,EAAA;AACvB,MAAM,MAAA,MAAA,GAAS,CAAC,GAAG,UAAU,CAAA,CAAE,GAAI,CAAA,CAAA,EAAA,KAAM,CAAI,CAAA,EAAA,EAAA,CAAA,CAAA,CAAK,CAAE,CAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AAC7D,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAwE,qEAAA,EAAA,MAAA,CAAA,CAAA;AAAA,OAC1E,CAAA;AAAA,KACF;AAGA,IAAA,MAAM,GAAmE,GAAA;AAAA,MACvE,MAAQ,EAAA,qCAAA;AAAA,MACR,OAAS,EAAA,IAAA;AAAA,MACT,QAAA;AAAA,KACF,CAAA;AACA,IAAO,OAAA,GAAA,CAAA;AAAA,GACT,CAAA;AACF;;ACrDO,SAAS,qBACd,MACmB,EAAA;AACnB,EAAO,OAAA;AAAA,IACL,IAAI,MAAO,CAAA,EAAA;AAAA,IACX,IAAI,CAAO,GAAA;AACT,MAAM,MAAA,IAAI,KAAM,CAAA,CAAA,kCAAA,EAAqC,IAAM,CAAA,CAAA,CAAA,CAAA;AAAA,KAC7D;AAAA,IACA,QAAW,GAAA;AACT,MAAA,OAAO,kBAAkB,MAAO,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA;AAAA,KAClC;AAAA,IACA,MAAQ,EAAA,2BAAA;AAAA,GACV,CAAA;AACF,CAAA;AA0BO,SAAS,oBACd,MACyC,EAAA;AACzC,EAAA,MAAM,cAAiB,GAAA,OAAO,MAAW,KAAA,UAAA,GAAa,SAAS,MAAM,MAAA,CAAA;AACrE,EAAA,OAAO,IAAI,OAA8C,KAAA;AACvD,IAAM,MAAA,CAAA,GAAI,cAAe,CAAA,GAAG,OAAO,CAAA,CAAA;AAEnC,IAAI,IAAA,aAAA,CAAA;AAEJ,IAAO,OAAA;AAAA,MACL,MAAQ,EAAA,2BAAA;AAAA,MACR,OAAS,EAAA,IAAA;AAAA,MACT,gBAAmB,GAAA;AACjB,QAAA,IAAI,aAAe,EAAA;AACjB,UAAO,OAAA,aAAA,CAAA;AAAA,SACT;AACA,QAAA,MAAM,kBACJ,EAAC,CAAA;AACH,QAAA,IAAI,IACF,GAAA,KAAA,CAAA,CAAA;AAEF,QAAA,CAAA,CAAE,QAAS,CAAA;AAAA,UACT,sBAAA,CAAuB,KAAK,IAAM,EAAA;AAChC,YAAA,IAAI,IAAM,EAAA;AACR,cAAA,MAAM,IAAI,KAAA;AAAA,gBACR,kDAAA;AAAA,eACF,CAAA;AAAA,aACF;AACA,YAAA,eAAA,CAAgB,IAAK,CAAA,CAAC,GAAK,EAAA,IAAI,CAAC,CAAA,CAAA;AAAA,WAClC;AAAA,UACA,aAAa,OAAS,EAAA;AACpB,YAAA,IAAI,IAAM,EAAA;AACR,cAAM,MAAA,IAAI,MAAM,uCAAuC,CAAA,CAAA;AAAA,aACzD;AACA,YAAO,IAAA,GAAA;AAAA,cACL,MAAM,OAAQ,CAAA,IAAA;AAAA,cACd,MAAM,OAAQ,CAAA,IAAA;AAAA,aAChB,CAAA;AAAA,WACF;AAAA,SACD,CAAA,CAAA;AAED,QAAA,IAAI,CAAC,IAAM,EAAA;AACT,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,8CAA8C,CAAE,CAAA,QAAA,CAAA,CAAA;AAAA,WAClD,CAAA;AAAA,SACF;AAEA,QAAgB,aAAA,GAAA;AAAA,UACd;AAAA,YACE,IAAM,EAAA,QAAA;AAAA,YACN,UAAU,CAAE,CAAA,QAAA;AAAA,YACZ,eAAA;AAAA,YACA,IAAA;AAAA,WACF;AAAA,SACF,CAAA;AACA,QAAO,OAAA,aAAA,CAAA;AAAA,OACT;AAAA,KACF,CAAA;AAAA,GACF,CAAA;AACF,CAAA;AA8BO,SAAS,oBACd,MACyC,EAAA;AACzC,EAAA,MAAM,cAAiB,GAAA,OAAO,MAAW,KAAA,UAAA,GAAa,SAAS,MAAM,MAAA,CAAA;AACrE,EAAA,OAAO,IAAI,OAA8C,KAAA;AACvD,IAAM,MAAA,CAAA,GAAI,cAAe,CAAA,GAAG,OAAO,CAAA,CAAA;AAEnC,IAAI,IAAA,aAAA,CAAA;AAEJ,IAAO,OAAA;AAAA,MACL,MAAQ,EAAA,2BAAA;AAAA,MACR,OAAS,EAAA,IAAA;AAAA,MACT,gBAAmB,GAAA;AACjB,QAAA,IAAI,aAAe,EAAA;AACjB,UAAO,OAAA,aAAA,CAAA;AAAA,SACT;AACA,QAAA,IAAI,IACF,GAAA,KAAA,CAAA,CAAA;AAEF,QAAA,CAAA,CAAE,QAAS,CAAA;AAAA,UACT,aAAa,OAAS,EAAA;AACpB,YAAA,IAAI,IAAM,EAAA;AACR,cAAM,MAAA,IAAI,MAAM,uCAAuC,CAAA,CAAA;AAAA,aACzD;AACA,YAAO,IAAA,GAAA;AAAA,cACL,MAAM,OAAQ,CAAA,IAAA;AAAA,cACd,MAAM,OAAQ,CAAA,IAAA;AAAA,aAChB,CAAA;AAAA,WACF;AAAA,SACD,CAAA,CAAA;AAED,QAAA,IAAI,CAAC,IAAM,EAAA;AACT,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,2CAAA,EAA8C,CAAE,CAAA,QAAA,CAAA,YAAA,EAAuB,CAAE,CAAA,QAAA,CAAA,CAAA;AAAA,WAC3E,CAAA;AAAA,SACF;AAEA,QAAgB,aAAA,GAAA;AAAA,UACd;AAAA,YACE,IAAM,EAAA,QAAA;AAAA,YACN,UAAU,CAAE,CAAA,QAAA;AAAA,YACZ,UAAU,CAAE,CAAA,QAAA;AAAA,YACZ,IAAA;AAAA,WACF;AAAA,SACF,CAAA;AACA,QAAO,OAAA,aAAA,CAAA;AAAA,OACT;AAAA,KACF,CAAA;AAAA,GACF,CAAA;AACF;;;;;;;;;"}
|