@wix/services-manager 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/build/core-services/signals/definition.d.ts +13 -0
- package/cjs/build/core-services/signals/definition.js +5 -0
- package/cjs/build/core-services/signals/service.d.ts +8 -0
- package/cjs/build/core-services/signals/service.js +30 -0
- package/cjs/build/helpers.d.ts +6 -0
- package/cjs/build/helpers.js +15 -0
- package/cjs/build/services-manager.d.ts +12 -0
- package/cjs/build/services-manager.js +54 -0
- package/cjs/build/types.d.ts +18 -0
- package/cjs/build/types.js +2 -0
- package/cjs/package.json +3 -0
- package/core-services/signals/package.json +3 -0
- package/helpers/package.json +3 -0
- package/package.json +26 -9
- package/types/package.json +3 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { effect as peffect } from '@preact/signals-core';
|
|
2
|
+
export type ReadableSignal<T> = {
|
|
3
|
+
get: () => T;
|
|
4
|
+
};
|
|
5
|
+
export type Signal<T> = ReadableSignal<T> & {
|
|
6
|
+
set: (newValue: T) => void;
|
|
7
|
+
};
|
|
8
|
+
export declare const SignalsServiceDefinition: import("../../types.js").ServiceDefinition<{
|
|
9
|
+
signal: <T>(initialValue: T) => Signal<T>;
|
|
10
|
+
computed: <T>(fn: () => T) => ReadableSignal<T>;
|
|
11
|
+
effect: typeof peffect;
|
|
12
|
+
getSignalsRegistry: () => ReadableSignal<any>[];
|
|
13
|
+
}, {}>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { effect as peffect } from '@preact/signals-core';
|
|
2
|
+
import { ReadableSignal, Signal } from './definition.js';
|
|
3
|
+
export declare const SignalsServiceFactory: import("../../types.js").ServiceFactory<import("../../types.js").ServiceDefinition<{
|
|
4
|
+
signal: <T>(initialValue: T) => Signal<T>;
|
|
5
|
+
computed: <T>(fn: () => T) => ReadableSignal<T>;
|
|
6
|
+
effect: typeof peffect;
|
|
7
|
+
getSignalsRegistry: () => ReadableSignal<any>[];
|
|
8
|
+
}, {}>, unknown>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SignalsServiceFactory = void 0;
|
|
4
|
+
const signals_core_1 = require("@preact/signals-core");
|
|
5
|
+
const helpers_js_1 = require("../../helpers.js");
|
|
6
|
+
const definition_js_1 = require("./definition.js");
|
|
7
|
+
exports.SignalsServiceFactory = (0, helpers_js_1.implementService)(definition_js_1.SignalsServiceDefinition, () => {
|
|
8
|
+
const signalsRegistry = [];
|
|
9
|
+
return {
|
|
10
|
+
signal: (initialValue) => {
|
|
11
|
+
const sig = (0, signals_core_1.signal)(initialValue);
|
|
12
|
+
const signal = {
|
|
13
|
+
get: () => sig.value,
|
|
14
|
+
set: (newValue) => (sig.value = newValue),
|
|
15
|
+
};
|
|
16
|
+
signalsRegistry.push(signal);
|
|
17
|
+
return signal;
|
|
18
|
+
},
|
|
19
|
+
computed: (fn) => {
|
|
20
|
+
const sig = (0, signals_core_1.computed)(fn);
|
|
21
|
+
const signal = {
|
|
22
|
+
get: () => sig.value,
|
|
23
|
+
};
|
|
24
|
+
signalsRegistry.push(signal);
|
|
25
|
+
return signal;
|
|
26
|
+
},
|
|
27
|
+
effect: signals_core_1.effect,
|
|
28
|
+
getSignalsRegistry: () => signalsRegistry,
|
|
29
|
+
};
|
|
30
|
+
});
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ServiceDefinition, ServiceFactory } from './types.js';
|
|
2
|
+
export declare function defineService<TAPI, TConfig = {}>(id: string): ServiceDefinition<TAPI, TConfig>;
|
|
3
|
+
export declare function implementService<T extends ServiceDefinition<any, any>, ImplConfig>(_: T, factory: ServiceFactory<T, ImplConfig>): ServiceFactory<T, ImplConfig>;
|
|
4
|
+
export declare namespace implementService {
|
|
5
|
+
var withConfig: <TConfig>() => <T extends ServiceDefinition<any, any>>(_: T, factory: ServiceFactory<T, TConfig>) => ServiceFactory<T, TConfig>;
|
|
6
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.defineService = defineService;
|
|
4
|
+
exports.implementService = implementService;
|
|
5
|
+
function defineService(id) {
|
|
6
|
+
return id;
|
|
7
|
+
}
|
|
8
|
+
function implementService(_, factory) {
|
|
9
|
+
return factory;
|
|
10
|
+
}
|
|
11
|
+
implementService.withConfig = function () {
|
|
12
|
+
return function (_, factory) {
|
|
13
|
+
return factory;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ServiceAPI, ServiceBinding, ServiceDefinition, ServiceFactory, ServiceFactoryConfig } from './types.js';
|
|
2
|
+
export type ServicesManager = {
|
|
3
|
+
getService<T extends ServiceDefinition<any, any>>(definition: T): ServiceAPI<T>;
|
|
4
|
+
hasService<T extends ServiceDefinition<any, any>>(definition: T): boolean;
|
|
5
|
+
addService<T extends ServiceDefinition<any, any>, Impl extends ServiceFactory<T, any>>(definition: T, impl: Impl, config: ServiceFactoryConfig<Impl>): void;
|
|
6
|
+
};
|
|
7
|
+
export declare function createServicesManager(servicesBindings: ServicesRegistrar): ServicesManager;
|
|
8
|
+
export type ServicesRegistrar = {
|
|
9
|
+
registeredServices: ServiceBinding<any, any>[];
|
|
10
|
+
addService<T extends ServiceDefinition<any, any>, Impl extends ServiceFactory<T, any>>(definition: T, impl: Impl, config: ServiceFactoryConfig<Impl>): ServicesRegistrar;
|
|
11
|
+
};
|
|
12
|
+
export declare function createServicesMap(registeredServices?: ServiceBinding<any, any>[]): ServicesRegistrar;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createServicesManager = createServicesManager;
|
|
4
|
+
exports.createServicesMap = createServicesMap;
|
|
5
|
+
const definition_js_1 = require("./core-services/signals/definition.js");
|
|
6
|
+
const service_js_1 = require("./core-services/signals/service.js");
|
|
7
|
+
const coreRegisgteredServices = createServicesMap().addService(definition_js_1.SignalsServiceDefinition, service_js_1.SignalsServiceFactory, {});
|
|
8
|
+
function createServicesManager(servicesBindings) {
|
|
9
|
+
const bindingsByDefinition = new Map([
|
|
10
|
+
...servicesBindings.registeredServices,
|
|
11
|
+
...coreRegisgteredServices.registeredServices,
|
|
12
|
+
].map((service) => [service.definition, service]));
|
|
13
|
+
const initializedServices = new Map();
|
|
14
|
+
const manager = {
|
|
15
|
+
getService(definition) {
|
|
16
|
+
if (!initializedServices.has(definition)) {
|
|
17
|
+
const service = bindingsByDefinition.get(definition);
|
|
18
|
+
if (!service) {
|
|
19
|
+
// this needs meaningful error message
|
|
20
|
+
throw new Error(`Service ${definition} is not provided`);
|
|
21
|
+
}
|
|
22
|
+
initializedServices.set(definition, service.impl({
|
|
23
|
+
config: service.config,
|
|
24
|
+
getService: manager.getService,
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
return initializedServices.get(definition);
|
|
28
|
+
},
|
|
29
|
+
hasService(definition) {
|
|
30
|
+
return bindingsByDefinition.has(definition);
|
|
31
|
+
},
|
|
32
|
+
addService(definition, impl, config) {
|
|
33
|
+
if (!manager.hasService(definition)) {
|
|
34
|
+
bindingsByDefinition.set(definition, { definition, impl, config });
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
// this needs meaningful error message
|
|
38
|
+
throw new Error(`Service ${definition} is already provided`);
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
return manager;
|
|
43
|
+
}
|
|
44
|
+
function createServicesMap(registeredServices = []) {
|
|
45
|
+
return {
|
|
46
|
+
registeredServices,
|
|
47
|
+
addService(definition, impl, config) {
|
|
48
|
+
return createServicesMap([
|
|
49
|
+
...registeredServices,
|
|
50
|
+
{ definition, impl, config },
|
|
51
|
+
]);
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ServicesManager } from './services-manager.js';
|
|
2
|
+
export type ServiceDefinition<TAPI, TConfig> = string & {
|
|
3
|
+
__api: TAPI;
|
|
4
|
+
__config: TConfig;
|
|
5
|
+
};
|
|
6
|
+
export type ServiceConfig<T extends ServiceDefinition<any, any>> = T extends ServiceDefinition<any, infer TConfig> ? TConfig : never;
|
|
7
|
+
export type ServiceAPI<T extends ServiceDefinition<any, any>> = T extends ServiceDefinition<infer TAPI, any> ? TAPI : never;
|
|
8
|
+
export type ServiceFactoryOpts<TConfig = {}> = {
|
|
9
|
+
config: TConfig;
|
|
10
|
+
getService: ServicesManager['getService'];
|
|
11
|
+
};
|
|
12
|
+
export type ServiceFactory<T extends ServiceDefinition<any, any>, TConfig = {}> = (opts: ServiceFactoryOpts<TConfig>) => ServiceAPI<T>;
|
|
13
|
+
export type ServiceFactoryConfig<T extends ServiceFactory<any, any>> = T extends ServiceFactory<any, infer TConfig> ? TConfig : never;
|
|
14
|
+
export type ServiceBinding<T extends ServiceDefinition<any, any>, Impl extends ServiceFactory<T, any>> = {
|
|
15
|
+
definition: T;
|
|
16
|
+
impl: Impl;
|
|
17
|
+
config: ServiceConfig<T> & ServiceFactoryConfig<Impl>;
|
|
18
|
+
};
|
package/cjs/package.json
ADDED
package/package.json
CHANGED
|
@@ -1,24 +1,41 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wix/services-manager",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"type": "module",
|
|
5
|
+
"main": "./cjs/build/services-manager.js",
|
|
5
6
|
"exports": {
|
|
6
|
-
".":
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
".": {
|
|
8
|
+
"import": "./build/services-manager.js",
|
|
9
|
+
"require": "./cjs/build/services-manager.js"
|
|
10
|
+
},
|
|
11
|
+
"./types": {
|
|
12
|
+
"import": "./build/types.js",
|
|
13
|
+
"require": "./cjs/build/types.js"
|
|
14
|
+
},
|
|
15
|
+
"./helpers": {
|
|
16
|
+
"import": "./build/helpers.js",
|
|
17
|
+
"require": "./cjs/build/helpers.js"
|
|
18
|
+
},
|
|
9
19
|
"./package.json": "./package.json",
|
|
10
|
-
"./core-services/signals":
|
|
20
|
+
"./core-services/signals": {
|
|
21
|
+
"import": "./build/core-services/signals/definition.js",
|
|
22
|
+
"require": "./cjs/build/core-services/signals/definition.js"
|
|
23
|
+
}
|
|
11
24
|
},
|
|
12
25
|
"sideEffects": false,
|
|
13
26
|
"files": [
|
|
14
|
-
"build"
|
|
27
|
+
"build",
|
|
28
|
+
"cjs",
|
|
29
|
+
"core-services",
|
|
30
|
+
"helpers",
|
|
31
|
+
"types"
|
|
15
32
|
],
|
|
16
33
|
"publishConfig": {
|
|
17
34
|
"registry": "https://registry.npmjs.org/",
|
|
18
35
|
"access": "public"
|
|
19
36
|
},
|
|
20
37
|
"scripts": {
|
|
21
|
-
"build": "tsc",
|
|
38
|
+
"build": "tsc && tsc --project tsconfig.cjs.json",
|
|
22
39
|
"test": "vitest",
|
|
23
40
|
"lint": "eslint --max-warnings=0 .",
|
|
24
41
|
"lint:fix": "eslint --max-warnings=0 . --fix",
|
|
@@ -38,7 +55,7 @@
|
|
|
38
55
|
"eslint-config-sdk": "0.0.0",
|
|
39
56
|
"is-ci": "^3.0.1",
|
|
40
57
|
"jsdom": "^22.1.0",
|
|
41
|
-
"msw": "^2.
|
|
58
|
+
"msw": "^2.7.0",
|
|
42
59
|
"typescript": "^5.7.2",
|
|
43
60
|
"vitest": "^1.6.0",
|
|
44
61
|
"vitest-teamcity-reporter": "^0.3.1"
|
|
@@ -60,5 +77,5 @@
|
|
|
60
77
|
]
|
|
61
78
|
}
|
|
62
79
|
},
|
|
63
|
-
"falconPackageHash": "
|
|
80
|
+
"falconPackageHash": "e970ac7b063185517c088456e82400038672061895a99d1a8279865b"
|
|
64
81
|
}
|