@backstage/backend-plugin-api 0.4.0-next.2 → 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 +29 -0
- package/README.md +5 -4
- package/alpha/package.json +1 -1
- package/dist/index.alpha.d.ts +24 -56
- package/dist/index.beta.d.ts +24 -56
- package/dist/index.cjs.js +17 -4
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +24 -56
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,34 @@
|
|
|
1
1
|
# @backstage/backend-plugin-api
|
|
2
2
|
|
|
3
|
+
## 0.4.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- e716946103: **BREAKING**: Split out the hook for both lifecycle services so that the first parameter of `addShutdownHook` is the hook function, and the second is the options.
|
|
8
|
+
- 0ff03319be: **BREAKING**: The plugin ID option passed to `createBackendPlugin` is now `pluginId`, rather than just `id`. This is to make it match `createBackendModule` more closely.
|
|
9
|
+
- 71a5ec0f06: **BREAKING**: Switched out `LogMeta` type for `JsonObject`.
|
|
10
|
+
- 5febb216fe: **BREAKING**: The `CacheService` has been changed to remove the indirection of `getClient`, instead making the `CacheClient` methods directly available on the `CacheService`. In order to allow for the creation of clients with default options, there is now a new `.withOptions` method that must be implemented as part of the service interface.
|
|
11
|
+
- b86efa2d04: Switch `ServiceFactory` to be an opaque type, keeping only the `service` field as public API, but also adding a type parameter for the service scope.
|
|
12
|
+
- 610d65e143: Switched `BackendFeature` to be an opaque type.
|
|
13
|
+
|
|
14
|
+
### Patch Changes
|
|
15
|
+
|
|
16
|
+
- 9c9456fd33: Removed the unused `TypesToServiceRef` type
|
|
17
|
+
- 181c03edb5: Aligned opaque type markers to all use a `$type` property with namespacing.
|
|
18
|
+
- 725383f69d: Tweaked messaging in the README.
|
|
19
|
+
- ae88f61e00: The `register` methods passed to `createBackendPlugin` and `createBackendModule`
|
|
20
|
+
now have dedicated `BackendPluginRegistrationPoints` and
|
|
21
|
+
`BackendModuleRegistrationPoints` arguments, respectively. This lets us make it
|
|
22
|
+
clear on a type level that it's not possible to pass in extension points as
|
|
23
|
+
dependencies to plugins (should only ever be done for modules). This has no
|
|
24
|
+
practical effect on code that was already well behaved.
|
|
25
|
+
- Updated dependencies
|
|
26
|
+
- @backstage/backend-tasks@0.4.3
|
|
27
|
+
- @backstage/config@1.0.6
|
|
28
|
+
- @backstage/types@1.0.2
|
|
29
|
+
- @backstage/plugin-auth-node@0.2.11
|
|
30
|
+
- @backstage/plugin-permission-common@0.7.3
|
|
31
|
+
|
|
3
32
|
## 0.4.0-next.2
|
|
4
33
|
|
|
5
34
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
# @backstage/backend-plugin-api
|
|
2
2
|
|
|
3
|
-
**This package is
|
|
3
|
+
**This package is EXPERIMENTAL, but we encourage use of it to add support for the new backend system in your own plugins**
|
|
4
4
|
|
|
5
|
-
This package provides the core API used by Backstage backend plugins.
|
|
5
|
+
This package provides the core API used by Backstage backend plugins and modules.
|
|
6
6
|
|
|
7
7
|
## Installation
|
|
8
8
|
|
|
9
|
-
Add the library to your backend plugin package:
|
|
9
|
+
Add the library to your backend plugin or module package:
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
12
|
# From your Backstage root directory
|
|
13
|
-
yarn add --cwd
|
|
13
|
+
yarn add --cwd plugins/<plugin>-backend @backstage/backend-plugin-api
|
|
14
14
|
```
|
|
15
15
|
|
|
16
16
|
## Documentation
|
|
17
17
|
|
|
18
18
|
- [Backstage Readme](https://github.com/backstage/backstage/blob/master/README.md)
|
|
19
19
|
- [Backstage Documentation](https://github.com/backstage/backstage/blob/master/docs/README.md)
|
|
20
|
+
- [Backstage Backend System](https://backstage.io/docs/backend-system/)
|
package/alpha/package.json
CHANGED
package/dist/index.alpha.d.ts
CHANGED
|
@@ -93,35 +93,39 @@ export declare interface BackendPluginRegistrationPoints {
|
|
|
93
93
|
}
|
|
94
94
|
|
|
95
95
|
/**
|
|
96
|
-
* A pre-configured, storage agnostic cache
|
|
96
|
+
* A pre-configured, storage agnostic cache service suitable for use by
|
|
97
97
|
* Backstage plugins.
|
|
98
98
|
*
|
|
99
99
|
* @public
|
|
100
100
|
*/
|
|
101
|
-
export declare interface
|
|
101
|
+
export declare interface CacheService {
|
|
102
102
|
/**
|
|
103
103
|
* Reads data from a cache store for the given key. If no data was found,
|
|
104
104
|
* returns undefined.
|
|
105
105
|
*/
|
|
106
|
-
get(key: string): Promise<
|
|
106
|
+
get<TValue extends JsonValue>(key: string): Promise<TValue | undefined>;
|
|
107
107
|
/**
|
|
108
108
|
* Writes the given data to a cache store, associated with the given key. An
|
|
109
109
|
* optional TTL may also be provided, otherwise it defaults to the TTL that
|
|
110
110
|
* was provided when the client was instantiated.
|
|
111
111
|
*/
|
|
112
|
-
set(key: string, value: JsonValue, options?:
|
|
112
|
+
set(key: string, value: JsonValue, options?: CacheServiceSetOptions): Promise<void>;
|
|
113
113
|
/**
|
|
114
114
|
* Removes the given key from the cache store.
|
|
115
115
|
*/
|
|
116
116
|
delete(key: string): Promise<void>;
|
|
117
|
+
/**
|
|
118
|
+
* Creates a new {@link CacheService} instance with the given options.
|
|
119
|
+
*/
|
|
120
|
+
withOptions(options: CacheServiceOptions): CacheService;
|
|
117
121
|
}
|
|
118
122
|
|
|
119
123
|
/**
|
|
120
|
-
* Options
|
|
124
|
+
* Options passed to {@link CacheService.withOptions}.
|
|
121
125
|
*
|
|
122
126
|
* @public
|
|
123
127
|
*/
|
|
124
|
-
export declare type
|
|
128
|
+
export declare type CacheServiceOptions = {
|
|
125
129
|
/**
|
|
126
130
|
* An optional default TTL (in milliseconds) to be set when getting a client
|
|
127
131
|
* instance. If not provided, data will persist indefinitely by default (or
|
|
@@ -131,11 +135,11 @@ export declare type CacheClientOptions = {
|
|
|
131
135
|
};
|
|
132
136
|
|
|
133
137
|
/**
|
|
134
|
-
* Options passed to {@link
|
|
138
|
+
* Options passed to {@link CacheService.set}.
|
|
135
139
|
*
|
|
136
140
|
* @public
|
|
137
141
|
*/
|
|
138
|
-
export declare type
|
|
142
|
+
export declare type CacheServiceSetOptions = {
|
|
139
143
|
/**
|
|
140
144
|
* Optional TTL in milliseconds. Defaults to the TTL provided when the client
|
|
141
145
|
* was set up (or no TTL if none are provided).
|
|
@@ -143,24 +147,6 @@ export declare type CacheClientSetOptions = {
|
|
|
143
147
|
ttl?: number;
|
|
144
148
|
};
|
|
145
149
|
|
|
146
|
-
/**
|
|
147
|
-
* Manages access to cache stores that plugins get.
|
|
148
|
-
*
|
|
149
|
-
* @public
|
|
150
|
-
*/
|
|
151
|
-
export declare interface CacheService {
|
|
152
|
-
/**
|
|
153
|
-
* Provides backend plugins cache connections for themselves.
|
|
154
|
-
*
|
|
155
|
-
* @remarks
|
|
156
|
-
*
|
|
157
|
-
* The purpose of this method is to allow plugins to get isolated data stores
|
|
158
|
-
* so that plugins are discouraged from cache-level integration and/or cache
|
|
159
|
-
* key collisions.
|
|
160
|
-
*/
|
|
161
|
-
getClient: (options?: CacheClientOptions) => CacheClient;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
150
|
/**
|
|
165
151
|
* @public
|
|
166
152
|
*/
|
|
@@ -305,7 +291,7 @@ export declare function createExtensionPoint<T>(config: ExtensionPointConfig): E
|
|
|
305
291
|
*/
|
|
306
292
|
export declare function createServiceFactory<TService, TImpl extends TService, TDeps extends {
|
|
307
293
|
[name in string]: ServiceRef<unknown>;
|
|
308
|
-
}, 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'>;
|
|
309
295
|
|
|
310
296
|
/**
|
|
311
297
|
* Creates a root scoped service factory with optional options.
|
|
@@ -315,7 +301,7 @@ export declare function createServiceFactory<TService, TImpl extends TService, T
|
|
|
315
301
|
*/
|
|
316
302
|
export declare function createServiceFactory<TService, TImpl extends TService, TDeps extends {
|
|
317
303
|
[name in string]: ServiceRef<unknown>;
|
|
318
|
-
}, 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'>;
|
|
319
305
|
|
|
320
306
|
/**
|
|
321
307
|
* Creates a root scoped service factory with required options.
|
|
@@ -325,7 +311,7 @@ export declare function createServiceFactory<TService, TImpl extends TService, T
|
|
|
325
311
|
*/
|
|
326
312
|
export declare function createServiceFactory<TService, TImpl extends TService, TDeps extends {
|
|
327
313
|
[name in string]: ServiceRef<unknown>;
|
|
328
|
-
}, 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'>;
|
|
329
315
|
|
|
330
316
|
/**
|
|
331
317
|
* Creates a plugin scoped service factory without options.
|
|
@@ -335,7 +321,7 @@ export declare function createServiceFactory<TService, TImpl extends TService, T
|
|
|
335
321
|
*/
|
|
336
322
|
export declare function createServiceFactory<TService, TImpl extends TService, TDeps extends {
|
|
337
323
|
[name in string]: ServiceRef<unknown>;
|
|
338
|
-
}, 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'>;
|
|
339
325
|
|
|
340
326
|
/**
|
|
341
327
|
* Creates a plugin scoped service factory with optional options.
|
|
@@ -345,7 +331,7 @@ export declare function createServiceFactory<TService, TImpl extends TService, T
|
|
|
345
331
|
*/
|
|
346
332
|
export declare function createServiceFactory<TService, TImpl extends TService, TDeps extends {
|
|
347
333
|
[name in string]: ServiceRef<unknown>;
|
|
348
|
-
}, 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'>;
|
|
349
335
|
|
|
350
336
|
/**
|
|
351
337
|
* Creates a plugin scoped service factory with required options.
|
|
@@ -355,7 +341,7 @@ export declare function createServiceFactory<TService, TImpl extends TService, T
|
|
|
355
341
|
*/
|
|
356
342
|
export declare function createServiceFactory<TService, TImpl extends TService, TDeps extends {
|
|
357
343
|
[name in string]: ServiceRef<unknown>;
|
|
358
|
-
}, 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'>;
|
|
359
345
|
|
|
360
346
|
/**
|
|
361
347
|
* Creates a new service definition. This overload is used to create plugin scoped services.
|
|
@@ -820,35 +806,17 @@ export declare type SearchResponseFile = {
|
|
|
820
806
|
};
|
|
821
807
|
|
|
822
808
|
/** @public */
|
|
823
|
-
export declare
|
|
824
|
-
|
|
825
|
-
service: ServiceRef<TService,
|
|
826
|
-
|
|
827
|
-
[key in string]: ServiceRef<unknown>;
|
|
828
|
-
};
|
|
829
|
-
factory(deps: {
|
|
830
|
-
[key in string]: unknown;
|
|
831
|
-
}): Promise<TService>;
|
|
832
|
-
} | {
|
|
833
|
-
scope: 'plugin';
|
|
834
|
-
service: ServiceRef<TService, 'plugin'>;
|
|
835
|
-
deps: {
|
|
836
|
-
[key in string]: ServiceRef<unknown>;
|
|
837
|
-
};
|
|
838
|
-
createRootContext?(deps: {
|
|
839
|
-
[key in string]: unknown;
|
|
840
|
-
}): Promise<unknown>;
|
|
841
|
-
factory(deps: {
|
|
842
|
-
[key in string]: unknown;
|
|
843
|
-
}, context: unknown): Promise<TService>;
|
|
844
|
-
};
|
|
809
|
+
export declare interface ServiceFactory<TService = unknown, TScope extends 'plugin' | 'root' = 'plugin' | 'root'> {
|
|
810
|
+
$$type: '@backstage/ServiceFactory';
|
|
811
|
+
service: ServiceRef<TService, TScope>;
|
|
812
|
+
}
|
|
845
813
|
|
|
846
814
|
/**
|
|
847
815
|
* Represents either a {@link ServiceFactory} or a function that returns one.
|
|
848
816
|
*
|
|
849
817
|
* @public
|
|
850
818
|
*/
|
|
851
|
-
export declare type ServiceFactoryOrFunction
|
|
819
|
+
export declare type ServiceFactoryOrFunction = ServiceFactory | (() => ServiceFactory);
|
|
852
820
|
|
|
853
821
|
/**
|
|
854
822
|
* TODO
|
|
@@ -880,7 +848,7 @@ export declare type ServiceRef<TService, TScope extends 'root' | 'plugin' = 'roo
|
|
|
880
848
|
export declare interface ServiceRefConfig<TService, TScope extends 'root' | 'plugin'> {
|
|
881
849
|
id: string;
|
|
882
850
|
scope?: TScope;
|
|
883
|
-
defaultFactory?: (service: ServiceRef<TService, TScope>) => Promise<ServiceFactoryOrFunction
|
|
851
|
+
defaultFactory?: (service: ServiceRef<TService, TScope>) => Promise<ServiceFactoryOrFunction>;
|
|
884
852
|
}
|
|
885
853
|
|
|
886
854
|
/** @ignore */
|
package/dist/index.beta.d.ts
CHANGED
|
@@ -93,35 +93,39 @@ export declare interface BackendPluginRegistrationPoints {
|
|
|
93
93
|
}
|
|
94
94
|
|
|
95
95
|
/**
|
|
96
|
-
* A pre-configured, storage agnostic cache
|
|
96
|
+
* A pre-configured, storage agnostic cache service suitable for use by
|
|
97
97
|
* Backstage plugins.
|
|
98
98
|
*
|
|
99
99
|
* @public
|
|
100
100
|
*/
|
|
101
|
-
export declare interface
|
|
101
|
+
export declare interface CacheService {
|
|
102
102
|
/**
|
|
103
103
|
* Reads data from a cache store for the given key. If no data was found,
|
|
104
104
|
* returns undefined.
|
|
105
105
|
*/
|
|
106
|
-
get(key: string): Promise<
|
|
106
|
+
get<TValue extends JsonValue>(key: string): Promise<TValue | undefined>;
|
|
107
107
|
/**
|
|
108
108
|
* Writes the given data to a cache store, associated with the given key. An
|
|
109
109
|
* optional TTL may also be provided, otherwise it defaults to the TTL that
|
|
110
110
|
* was provided when the client was instantiated.
|
|
111
111
|
*/
|
|
112
|
-
set(key: string, value: JsonValue, options?:
|
|
112
|
+
set(key: string, value: JsonValue, options?: CacheServiceSetOptions): Promise<void>;
|
|
113
113
|
/**
|
|
114
114
|
* Removes the given key from the cache store.
|
|
115
115
|
*/
|
|
116
116
|
delete(key: string): Promise<void>;
|
|
117
|
+
/**
|
|
118
|
+
* Creates a new {@link CacheService} instance with the given options.
|
|
119
|
+
*/
|
|
120
|
+
withOptions(options: CacheServiceOptions): CacheService;
|
|
117
121
|
}
|
|
118
122
|
|
|
119
123
|
/**
|
|
120
|
-
* Options
|
|
124
|
+
* Options passed to {@link CacheService.withOptions}.
|
|
121
125
|
*
|
|
122
126
|
* @public
|
|
123
127
|
*/
|
|
124
|
-
export declare type
|
|
128
|
+
export declare type CacheServiceOptions = {
|
|
125
129
|
/**
|
|
126
130
|
* An optional default TTL (in milliseconds) to be set when getting a client
|
|
127
131
|
* instance. If not provided, data will persist indefinitely by default (or
|
|
@@ -131,11 +135,11 @@ export declare type CacheClientOptions = {
|
|
|
131
135
|
};
|
|
132
136
|
|
|
133
137
|
/**
|
|
134
|
-
* Options passed to {@link
|
|
138
|
+
* Options passed to {@link CacheService.set}.
|
|
135
139
|
*
|
|
136
140
|
* @public
|
|
137
141
|
*/
|
|
138
|
-
export declare type
|
|
142
|
+
export declare type CacheServiceSetOptions = {
|
|
139
143
|
/**
|
|
140
144
|
* Optional TTL in milliseconds. Defaults to the TTL provided when the client
|
|
141
145
|
* was set up (or no TTL if none are provided).
|
|
@@ -143,24 +147,6 @@ export declare type CacheClientSetOptions = {
|
|
|
143
147
|
ttl?: number;
|
|
144
148
|
};
|
|
145
149
|
|
|
146
|
-
/**
|
|
147
|
-
* Manages access to cache stores that plugins get.
|
|
148
|
-
*
|
|
149
|
-
* @public
|
|
150
|
-
*/
|
|
151
|
-
export declare interface CacheService {
|
|
152
|
-
/**
|
|
153
|
-
* Provides backend plugins cache connections for themselves.
|
|
154
|
-
*
|
|
155
|
-
* @remarks
|
|
156
|
-
*
|
|
157
|
-
* The purpose of this method is to allow plugins to get isolated data stores
|
|
158
|
-
* so that plugins are discouraged from cache-level integration and/or cache
|
|
159
|
-
* key collisions.
|
|
160
|
-
*/
|
|
161
|
-
getClient: (options?: CacheClientOptions) => CacheClient;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
150
|
/**
|
|
165
151
|
* @public
|
|
166
152
|
*/
|
|
@@ -305,7 +291,7 @@ export declare function createExtensionPoint<T>(config: ExtensionPointConfig): E
|
|
|
305
291
|
*/
|
|
306
292
|
export declare function createServiceFactory<TService, TImpl extends TService, TDeps extends {
|
|
307
293
|
[name in string]: ServiceRef<unknown>;
|
|
308
|
-
}, 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'>;
|
|
309
295
|
|
|
310
296
|
/**
|
|
311
297
|
* Creates a root scoped service factory with optional options.
|
|
@@ -315,7 +301,7 @@ export declare function createServiceFactory<TService, TImpl extends TService, T
|
|
|
315
301
|
*/
|
|
316
302
|
export declare function createServiceFactory<TService, TImpl extends TService, TDeps extends {
|
|
317
303
|
[name in string]: ServiceRef<unknown>;
|
|
318
|
-
}, 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'>;
|
|
319
305
|
|
|
320
306
|
/**
|
|
321
307
|
* Creates a root scoped service factory with required options.
|
|
@@ -325,7 +311,7 @@ export declare function createServiceFactory<TService, TImpl extends TService, T
|
|
|
325
311
|
*/
|
|
326
312
|
export declare function createServiceFactory<TService, TImpl extends TService, TDeps extends {
|
|
327
313
|
[name in string]: ServiceRef<unknown>;
|
|
328
|
-
}, 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'>;
|
|
329
315
|
|
|
330
316
|
/**
|
|
331
317
|
* Creates a plugin scoped service factory without options.
|
|
@@ -335,7 +321,7 @@ export declare function createServiceFactory<TService, TImpl extends TService, T
|
|
|
335
321
|
*/
|
|
336
322
|
export declare function createServiceFactory<TService, TImpl extends TService, TDeps extends {
|
|
337
323
|
[name in string]: ServiceRef<unknown>;
|
|
338
|
-
}, 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'>;
|
|
339
325
|
|
|
340
326
|
/**
|
|
341
327
|
* Creates a plugin scoped service factory with optional options.
|
|
@@ -345,7 +331,7 @@ export declare function createServiceFactory<TService, TImpl extends TService, T
|
|
|
345
331
|
*/
|
|
346
332
|
export declare function createServiceFactory<TService, TImpl extends TService, TDeps extends {
|
|
347
333
|
[name in string]: ServiceRef<unknown>;
|
|
348
|
-
}, 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'>;
|
|
349
335
|
|
|
350
336
|
/**
|
|
351
337
|
* Creates a plugin scoped service factory with required options.
|
|
@@ -355,7 +341,7 @@ export declare function createServiceFactory<TService, TImpl extends TService, T
|
|
|
355
341
|
*/
|
|
356
342
|
export declare function createServiceFactory<TService, TImpl extends TService, TDeps extends {
|
|
357
343
|
[name in string]: ServiceRef<unknown>;
|
|
358
|
-
}, 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'>;
|
|
359
345
|
|
|
360
346
|
/**
|
|
361
347
|
* Creates a new service definition. This overload is used to create plugin scoped services.
|
|
@@ -820,35 +806,17 @@ export declare type SearchResponseFile = {
|
|
|
820
806
|
};
|
|
821
807
|
|
|
822
808
|
/** @public */
|
|
823
|
-
export declare
|
|
824
|
-
|
|
825
|
-
service: ServiceRef<TService,
|
|
826
|
-
|
|
827
|
-
[key in string]: ServiceRef<unknown>;
|
|
828
|
-
};
|
|
829
|
-
factory(deps: {
|
|
830
|
-
[key in string]: unknown;
|
|
831
|
-
}): Promise<TService>;
|
|
832
|
-
} | {
|
|
833
|
-
scope: 'plugin';
|
|
834
|
-
service: ServiceRef<TService, 'plugin'>;
|
|
835
|
-
deps: {
|
|
836
|
-
[key in string]: ServiceRef<unknown>;
|
|
837
|
-
};
|
|
838
|
-
createRootContext?(deps: {
|
|
839
|
-
[key in string]: unknown;
|
|
840
|
-
}): Promise<unknown>;
|
|
841
|
-
factory(deps: {
|
|
842
|
-
[key in string]: unknown;
|
|
843
|
-
}, context: unknown): Promise<TService>;
|
|
844
|
-
};
|
|
809
|
+
export declare interface ServiceFactory<TService = unknown, TScope extends 'plugin' | 'root' = 'plugin' | 'root'> {
|
|
810
|
+
$$type: '@backstage/ServiceFactory';
|
|
811
|
+
service: ServiceRef<TService, TScope>;
|
|
812
|
+
}
|
|
845
813
|
|
|
846
814
|
/**
|
|
847
815
|
* Represents either a {@link ServiceFactory} or a function that returns one.
|
|
848
816
|
*
|
|
849
817
|
* @public
|
|
850
818
|
*/
|
|
851
|
-
export declare type ServiceFactoryOrFunction
|
|
819
|
+
export declare type ServiceFactoryOrFunction = ServiceFactory | (() => ServiceFactory);
|
|
852
820
|
|
|
853
821
|
/**
|
|
854
822
|
* TODO
|
|
@@ -880,7 +848,7 @@ export declare type ServiceRef<TService, TScope extends 'root' | 'plugin' = 'roo
|
|
|
880
848
|
export declare interface ServiceRefConfig<TService, TScope extends 'root' | 'plugin'> {
|
|
881
849
|
id: string;
|
|
882
850
|
scope?: TScope;
|
|
883
|
-
defaultFactory?: (service: ServiceRef<TService, TScope>) => Promise<ServiceFactoryOrFunction
|
|
851
|
+
defaultFactory?: (service: ServiceRef<TService, TScope>) => Promise<ServiceFactoryOrFunction>;
|
|
884
852
|
}
|
|
885
853
|
|
|
886
854
|
/** @ignore */
|
package/dist/index.cjs.js
CHANGED
|
@@ -20,17 +20,30 @@ function createServiceRef(config) {
|
|
|
20
20
|
function createServiceFactory(config) {
|
|
21
21
|
const configCallback = typeof config === "function" ? config : () => config;
|
|
22
22
|
return (options) => {
|
|
23
|
-
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;
|
|
24
35
|
return {
|
|
25
|
-
|
|
36
|
+
$$type: "@backstage/ServiceFactory",
|
|
37
|
+
version: "v1",
|
|
38
|
+
service: c.service,
|
|
26
39
|
..."createRootContext" in c ? {
|
|
27
40
|
createRootContext: async (deps) => {
|
|
28
41
|
var _a;
|
|
29
42
|
return (_a = c == null ? void 0 : c.createRootContext) == null ? void 0 : _a.call(c, deps);
|
|
30
43
|
}
|
|
31
44
|
} : {},
|
|
32
|
-
|
|
33
|
-
|
|
45
|
+
deps: c.deps,
|
|
46
|
+
factory: async (deps, ctx) => c.factory(deps, ctx)
|
|
34
47
|
};
|
|
35
48
|
};
|
|
36
49
|
}
|
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 $$type: '@backstage/ServiceRef';\n};\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 $$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>;\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: '@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":["coreServices"],"mappings":"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"}
|
|
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":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -93,35 +93,39 @@ export declare interface BackendPluginRegistrationPoints {
|
|
|
93
93
|
}
|
|
94
94
|
|
|
95
95
|
/**
|
|
96
|
-
* A pre-configured, storage agnostic cache
|
|
96
|
+
* A pre-configured, storage agnostic cache service suitable for use by
|
|
97
97
|
* Backstage plugins.
|
|
98
98
|
*
|
|
99
99
|
* @public
|
|
100
100
|
*/
|
|
101
|
-
export declare interface
|
|
101
|
+
export declare interface CacheService {
|
|
102
102
|
/**
|
|
103
103
|
* Reads data from a cache store for the given key. If no data was found,
|
|
104
104
|
* returns undefined.
|
|
105
105
|
*/
|
|
106
|
-
get(key: string): Promise<
|
|
106
|
+
get<TValue extends JsonValue>(key: string): Promise<TValue | undefined>;
|
|
107
107
|
/**
|
|
108
108
|
* Writes the given data to a cache store, associated with the given key. An
|
|
109
109
|
* optional TTL may also be provided, otherwise it defaults to the TTL that
|
|
110
110
|
* was provided when the client was instantiated.
|
|
111
111
|
*/
|
|
112
|
-
set(key: string, value: JsonValue, options?:
|
|
112
|
+
set(key: string, value: JsonValue, options?: CacheServiceSetOptions): Promise<void>;
|
|
113
113
|
/**
|
|
114
114
|
* Removes the given key from the cache store.
|
|
115
115
|
*/
|
|
116
116
|
delete(key: string): Promise<void>;
|
|
117
|
+
/**
|
|
118
|
+
* Creates a new {@link CacheService} instance with the given options.
|
|
119
|
+
*/
|
|
120
|
+
withOptions(options: CacheServiceOptions): CacheService;
|
|
117
121
|
}
|
|
118
122
|
|
|
119
123
|
/**
|
|
120
|
-
* Options
|
|
124
|
+
* Options passed to {@link CacheService.withOptions}.
|
|
121
125
|
*
|
|
122
126
|
* @public
|
|
123
127
|
*/
|
|
124
|
-
export declare type
|
|
128
|
+
export declare type CacheServiceOptions = {
|
|
125
129
|
/**
|
|
126
130
|
* An optional default TTL (in milliseconds) to be set when getting a client
|
|
127
131
|
* instance. If not provided, data will persist indefinitely by default (or
|
|
@@ -131,11 +135,11 @@ export declare type CacheClientOptions = {
|
|
|
131
135
|
};
|
|
132
136
|
|
|
133
137
|
/**
|
|
134
|
-
* Options passed to {@link
|
|
138
|
+
* Options passed to {@link CacheService.set}.
|
|
135
139
|
*
|
|
136
140
|
* @public
|
|
137
141
|
*/
|
|
138
|
-
export declare type
|
|
142
|
+
export declare type CacheServiceSetOptions = {
|
|
139
143
|
/**
|
|
140
144
|
* Optional TTL in milliseconds. Defaults to the TTL provided when the client
|
|
141
145
|
* was set up (or no TTL if none are provided).
|
|
@@ -143,24 +147,6 @@ export declare type CacheClientSetOptions = {
|
|
|
143
147
|
ttl?: number;
|
|
144
148
|
};
|
|
145
149
|
|
|
146
|
-
/**
|
|
147
|
-
* Manages access to cache stores that plugins get.
|
|
148
|
-
*
|
|
149
|
-
* @public
|
|
150
|
-
*/
|
|
151
|
-
export declare interface CacheService {
|
|
152
|
-
/**
|
|
153
|
-
* Provides backend plugins cache connections for themselves.
|
|
154
|
-
*
|
|
155
|
-
* @remarks
|
|
156
|
-
*
|
|
157
|
-
* The purpose of this method is to allow plugins to get isolated data stores
|
|
158
|
-
* so that plugins are discouraged from cache-level integration and/or cache
|
|
159
|
-
* key collisions.
|
|
160
|
-
*/
|
|
161
|
-
getClient: (options?: CacheClientOptions) => CacheClient;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
150
|
/**
|
|
165
151
|
* @public
|
|
166
152
|
*/
|
|
@@ -305,7 +291,7 @@ export declare function createExtensionPoint<T>(config: ExtensionPointConfig): E
|
|
|
305
291
|
*/
|
|
306
292
|
export declare function createServiceFactory<TService, TImpl extends TService, TDeps extends {
|
|
307
293
|
[name in string]: ServiceRef<unknown>;
|
|
308
|
-
}, 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'>;
|
|
309
295
|
|
|
310
296
|
/**
|
|
311
297
|
* Creates a root scoped service factory with optional options.
|
|
@@ -315,7 +301,7 @@ export declare function createServiceFactory<TService, TImpl extends TService, T
|
|
|
315
301
|
*/
|
|
316
302
|
export declare function createServiceFactory<TService, TImpl extends TService, TDeps extends {
|
|
317
303
|
[name in string]: ServiceRef<unknown>;
|
|
318
|
-
}, 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'>;
|
|
319
305
|
|
|
320
306
|
/**
|
|
321
307
|
* Creates a root scoped service factory with required options.
|
|
@@ -325,7 +311,7 @@ export declare function createServiceFactory<TService, TImpl extends TService, T
|
|
|
325
311
|
*/
|
|
326
312
|
export declare function createServiceFactory<TService, TImpl extends TService, TDeps extends {
|
|
327
313
|
[name in string]: ServiceRef<unknown>;
|
|
328
|
-
}, 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'>;
|
|
329
315
|
|
|
330
316
|
/**
|
|
331
317
|
* Creates a plugin scoped service factory without options.
|
|
@@ -335,7 +321,7 @@ export declare function createServiceFactory<TService, TImpl extends TService, T
|
|
|
335
321
|
*/
|
|
336
322
|
export declare function createServiceFactory<TService, TImpl extends TService, TDeps extends {
|
|
337
323
|
[name in string]: ServiceRef<unknown>;
|
|
338
|
-
}, 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'>;
|
|
339
325
|
|
|
340
326
|
/**
|
|
341
327
|
* Creates a plugin scoped service factory with optional options.
|
|
@@ -345,7 +331,7 @@ export declare function createServiceFactory<TService, TImpl extends TService, T
|
|
|
345
331
|
*/
|
|
346
332
|
export declare function createServiceFactory<TService, TImpl extends TService, TDeps extends {
|
|
347
333
|
[name in string]: ServiceRef<unknown>;
|
|
348
|
-
}, 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'>;
|
|
349
335
|
|
|
350
336
|
/**
|
|
351
337
|
* Creates a plugin scoped service factory with required options.
|
|
@@ -355,7 +341,7 @@ export declare function createServiceFactory<TService, TImpl extends TService, T
|
|
|
355
341
|
*/
|
|
356
342
|
export declare function createServiceFactory<TService, TImpl extends TService, TDeps extends {
|
|
357
343
|
[name in string]: ServiceRef<unknown>;
|
|
358
|
-
}, 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'>;
|
|
359
345
|
|
|
360
346
|
/**
|
|
361
347
|
* Creates a new service definition. This overload is used to create plugin scoped services.
|
|
@@ -820,35 +806,17 @@ export declare type SearchResponseFile = {
|
|
|
820
806
|
};
|
|
821
807
|
|
|
822
808
|
/** @public */
|
|
823
|
-
export declare
|
|
824
|
-
|
|
825
|
-
service: ServiceRef<TService,
|
|
826
|
-
|
|
827
|
-
[key in string]: ServiceRef<unknown>;
|
|
828
|
-
};
|
|
829
|
-
factory(deps: {
|
|
830
|
-
[key in string]: unknown;
|
|
831
|
-
}): Promise<TService>;
|
|
832
|
-
} | {
|
|
833
|
-
scope: 'plugin';
|
|
834
|
-
service: ServiceRef<TService, 'plugin'>;
|
|
835
|
-
deps: {
|
|
836
|
-
[key in string]: ServiceRef<unknown>;
|
|
837
|
-
};
|
|
838
|
-
createRootContext?(deps: {
|
|
839
|
-
[key in string]: unknown;
|
|
840
|
-
}): Promise<unknown>;
|
|
841
|
-
factory(deps: {
|
|
842
|
-
[key in string]: unknown;
|
|
843
|
-
}, context: unknown): Promise<TService>;
|
|
844
|
-
};
|
|
809
|
+
export declare interface ServiceFactory<TService = unknown, TScope extends 'plugin' | 'root' = 'plugin' | 'root'> {
|
|
810
|
+
$$type: '@backstage/ServiceFactory';
|
|
811
|
+
service: ServiceRef<TService, TScope>;
|
|
812
|
+
}
|
|
845
813
|
|
|
846
814
|
/**
|
|
847
815
|
* Represents either a {@link ServiceFactory} or a function that returns one.
|
|
848
816
|
*
|
|
849
817
|
* @public
|
|
850
818
|
*/
|
|
851
|
-
export declare type ServiceFactoryOrFunction
|
|
819
|
+
export declare type ServiceFactoryOrFunction = ServiceFactory | (() => ServiceFactory);
|
|
852
820
|
|
|
853
821
|
/**
|
|
854
822
|
* TODO
|
|
@@ -880,7 +848,7 @@ export declare type ServiceRef<TService, TScope extends 'root' | 'plugin' = 'roo
|
|
|
880
848
|
export declare interface ServiceRefConfig<TService, TScope extends 'root' | 'plugin'> {
|
|
881
849
|
id: string;
|
|
882
850
|
scope?: TScope;
|
|
883
|
-
defaultFactory?: (service: ServiceRef<TService, TScope>) => Promise<ServiceFactoryOrFunction
|
|
851
|
+
defaultFactory?: (service: ServiceRef<TService, TScope>) => Promise<ServiceFactoryOrFunction>;
|
|
884
852
|
}
|
|
885
853
|
|
|
886
854
|
/** @ignore */
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/backend-plugin-api",
|
|
3
3
|
"description": "Core API used by Backstage backend plugins",
|
|
4
|
-
"version": "0.4.0
|
|
4
|
+
"version": "0.4.0",
|
|
5
5
|
"main": "dist/index.cjs.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"publishConfig": {
|
|
@@ -33,9 +33,9 @@
|
|
|
33
33
|
"start": "backstage-cli package start"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@backstage/backend-tasks": "^0.4.3
|
|
36
|
+
"@backstage/backend-tasks": "^0.4.3",
|
|
37
37
|
"@backstage/config": "^1.0.6",
|
|
38
|
-
"@backstage/plugin-auth-node": "^0.2.11
|
|
38
|
+
"@backstage/plugin-auth-node": "^0.2.11",
|
|
39
39
|
"@backstage/plugin-permission-common": "^0.7.3",
|
|
40
40
|
"@backstage/types": "^1.0.2",
|
|
41
41
|
"@types/express": "^4.17.6",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"knex": "^2.0.0"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
-
"@backstage/cli": "^0.22.2
|
|
46
|
+
"@backstage/cli": "^0.22.2"
|
|
47
47
|
},
|
|
48
48
|
"files": [
|
|
49
49
|
"dist",
|