@kosdev-code/kos-api-levels 3.0.26 → 3.0.27
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/index.cjs.map +1 -1
- package/index.js.map +1 -1
- package/package.json +2 -2
- package/registry.d.ts +2 -3
- package/registry.d.ts.map +1 -1
- package/types.d.ts +1 -1
package/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../packages/kos-api-levels/src/deprecation.ts","../../../packages/kos-api-levels/src/registry.ts","../../../packages/kos-api-levels/src/runtime.ts"],"sourcesContent":["const _warned = new Set<string>();\n\n/**\n * Emits a one-time console warning in non-production environments when a\n * deprecated API is used.\n *\n * @param apiName - The name of the deprecated API (e.g. `@kosSubscribe`)\n * @param serviceId - The service the API belongs to (e.g. `core.subscribe`)\n * @param deprecatedAtLevel - The API level at which this API was deprecated\n * @param replacement - The recommended replacement (e.g. `@kosTopicHandler`)\n * @param removeAtLevel - The API level at which this API will be removed\n */\nexport function warnDeprecated(\n apiName: string,\n serviceId: string,\n deprecatedAtLevel: number,\n replacement: string,\n removeAtLevel: number\n): void {\n if (\n typeof process !== \"undefined\" &&\n process.env[\"NODE_ENV\"] === \"production\"\n ) {\n return;\n }\n if (_warned.has(apiName)) return;\n _warned.add(apiName);\n console.warn(\n `[KOS] \"${apiName}\" is deprecated since ${serviceId} level ${deprecatedAtLevel}. ` +\n `Use \"${replacement}\" instead. Will be removed at level ${removeAtLevel}.`\n );\n}\n","import type { ApiLevelMap } from \"./types\";\n\nconst _registry: ApiLevelMap = {};\n\n/**\n * Registers API levels for an SDK package. Each SDK package calls this on\n * import to populate the in-memory registry. Works in browser and Node.js.\n
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../packages/kos-api-levels/src/deprecation.ts","../../../packages/kos-api-levels/src/registry.ts","../../../packages/kos-api-levels/src/runtime.ts"],"sourcesContent":["const _warned = new Set<string>();\n\n/**\n * Emits a one-time console warning in non-production environments when a\n * deprecated API is used.\n *\n * @param apiName - The name of the deprecated API (e.g. `@kosSubscribe`)\n * @param serviceId - The service the API belongs to (e.g. `core.subscribe`)\n * @param deprecatedAtLevel - The API level at which this API was deprecated\n * @param replacement - The recommended replacement (e.g. `@kosTopicHandler`)\n * @param removeAtLevel - The API level at which this API will be removed\n */\nexport function warnDeprecated(\n apiName: string,\n serviceId: string,\n deprecatedAtLevel: number,\n replacement: string,\n removeAtLevel: number\n): void {\n if (\n typeof process !== \"undefined\" &&\n process.env[\"NODE_ENV\"] === \"production\"\n ) {\n return;\n }\n if (_warned.has(apiName)) return;\n _warned.add(apiName);\n console.warn(\n `[KOS] \"${apiName}\" is deprecated since ${serviceId} level ${deprecatedAtLevel}. ` +\n `Use \"${replacement}\" instead. Will be removed at level ${removeAtLevel}.`\n );\n}\n","import type { ApiLevelMap } from \"./types\";\n\nconst _registry: ApiLevelMap = {};\n\n/**\n * Registers API levels for an SDK package. Each SDK package calls this on\n * import to populate the in-memory registry. Works in browser and Node.js.\n * The call lives in each package's index.ts; the release scanner\n * (`scanner/generate-release.ts`) updates its level number.\n */\nexport function registerApiLevels(levels: ApiLevelMap): void {\n Object.assign(_registry, levels);\n}\n\nexport function getRegistry(): Readonly<ApiLevelMap> {\n return _registry;\n}\n","import type {\n ServiceId,\n ApiLevelMap,\n CheckResult,\n PluginCompatRequirements,\n CompatResult,\n} from \"./types\";\nimport { getRegistry } from \"./registry\";\n\n/**\n * Returns the current API level for a service.\n * Returns 0 if the service has not been registered.\n */\nexport function getApiLevel(service: ServiceId): number {\n return getRegistry()[service] ?? 0;\n}\n\n/**\n * Returns true if the registered level for a service meets the minimum requirement.\n */\nexport function hasApiLevel(service: ServiceId, minLevel: number): boolean {\n return getApiLevel(service) >= minLevel;\n}\n\n/**\n * Throws if the registered level for a service does not meet the minimum requirement.\n */\nexport function requireApiLevel(service: ServiceId, minLevel: number): void {\n const actual = getApiLevel(service);\n if (actual < minLevel) {\n const actualLabel = actual === 0 ? \"not registered\" : String(actual);\n throw new Error(\n `[KOS] API level requirement not met for \"${service}\": required ${minLevel}, actual ${actualLabel}`\n );\n }\n}\n\n/**\n * Returns all registered API levels. Useful for diagnostics and logging.\n */\nexport function getAllApiLevels(): Readonly<ApiLevelMap> {\n return getRegistry();\n}\n\n/**\n * Checks multiple service requirements in a single call.\n */\nexport function checkApiLevels(\n requirements: Partial<ApiLevelMap>\n): CheckResult {\n const details: CheckResult[\"details\"] = {};\n let satisfied = true;\n\n for (const [service, required] of Object.entries(requirements)) {\n if (required === undefined) continue;\n const actual = getApiLevel(service);\n const ok = actual >= required;\n details[service] = { required, actual, ok };\n if (!ok) satisfied = false;\n }\n\n return { satisfied, details };\n}\n\n/**\n * Checks whether a DDK plugin is compatible with the current DDK host.\n *\n * The DDK host registers two services at startup:\n * - `ddk.compat` — the current DDK API level (what it provides)\n * - `ddk.compat.min-plugin` — the oldest plugin level this host still accepts\n *\n * A plugin passes its own requirements:\n * - `pluginRequiresDdkLevel` — minimum DDK level the plugin needs\n * - `pluginLevel` — the API level of the plugin itself\n *\n * Both directions are checked:\n * - Plugin too new for host: `pluginRequiresDdkLevel > ddk.compat`\n * - Plugin too old for host: `pluginLevel < ddk.compat.min-plugin`\n */\nexport function checkCompatibility(\n requirements: PluginCompatRequirements\n): CompatResult {\n const ddkLevel = getApiLevel(\"ddk.compat\");\n const minPluginLevel = getApiLevel(\"ddk.compat.min-plugin\");\n\n if (requirements.pluginRequiresDdkLevel > ddkLevel) {\n const ddkLabel = ddkLevel === 0 ? \"not registered\" : String(ddkLevel);\n return {\n ok: false,\n reason: \"too-new-plugin\",\n message:\n `[KOS] Plugin requires DDK level ${requirements.pluginRequiresDdkLevel}, ` +\n `but host provides level ${ddkLabel}.`,\n };\n }\n\n if (minPluginLevel > 0 && requirements.pluginLevel < minPluginLevel) {\n return {\n ok: false,\n reason: \"too-old-plugin\",\n message:\n `[KOS] Plugin level ${requirements.pluginLevel} is below the host's minimum ` +\n `accepted plugin level ${minPluginLevel}.`,\n };\n }\n\n return { ok: true, reason: \"ok\" };\n}\n"],"names":[],"mappings":";;AAAA,MAAM,8BAAc,IAAA;AAYb,SAAS,eACd,SACA,WACA,mBACA,aACA,eACM;AACN,MACE,OAAO,YAAY,eACnB,QAAQ,IAAI,UAAU,MAAM,cAC5B;AACA;AAAA,EACF;AACA,MAAI,QAAQ,IAAI,OAAO,EAAG;AAC1B,UAAQ,IAAI,OAAO;AACnB,UAAQ;AAAA,IACN,UAAU,OAAO,yBAAyB,SAAS,UAAU,iBAAiB,UACpE,WAAW,uCAAuC,aAAa;AAAA,EAAA;AAE7E;AC7BA,MAAM,YAAyB,CAAA;AAQxB,SAAS,kBAAkB,QAA2B;AAC3D,SAAO,OAAO,WAAW,MAAM;AACjC;AAEO,SAAS,cAAqC;AACnD,SAAO;AACT;ACHO,SAAS,YAAY,SAA4B;AACtD,SAAO,YAAA,EAAc,OAAO,KAAK;AACnC;AAKO,SAAS,YAAY,SAAoB,UAA2B;AACzE,SAAO,YAAY,OAAO,KAAK;AACjC;AAKO,SAAS,gBAAgB,SAAoB,UAAwB;AAC1E,QAAM,SAAS,YAAY,OAAO;AAClC,MAAI,SAAS,UAAU;AACrB,UAAM,cAAc,WAAW,IAAI,mBAAmB,OAAO,MAAM;AACnE,UAAM,IAAI;AAAA,MACR,4CAA4C,OAAO,eAAe,QAAQ,YAAY,WAAW;AAAA,IAAA;AAAA,EAErG;AACF;AAKO,SAAS,kBAAyC;AACvD,SAAO,YAAA;AACT;AAKO,SAAS,eACd,cACa;AACb,QAAM,UAAkC,CAAA;AACxC,MAAI,YAAY;AAEhB,aAAW,CAAC,SAAS,QAAQ,KAAK,OAAO,QAAQ,YAAY,GAAG;AAC9D,QAAI,aAAa,OAAW;AAC5B,UAAM,SAAS,YAAY,OAAO;AAClC,UAAM,KAAK,UAAU;AACrB,YAAQ,OAAO,IAAI,EAAE,UAAU,QAAQ,GAAA;AACvC,QAAI,CAAC,GAAI,aAAY;AAAA,EACvB;AAEA,SAAO,EAAE,WAAW,QAAA;AACtB;AAiBO,SAAS,mBACd,cACc;AACd,QAAM,WAAW,YAAY,YAAY;AACzC,QAAM,iBAAiB,YAAY,uBAAuB;AAE1D,MAAI,aAAa,yBAAyB,UAAU;AAClD,UAAM,WAAW,aAAa,IAAI,mBAAmB,OAAO,QAAQ;AACpE,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SACE,mCAAmC,aAAa,sBAAsB,6BAC3C,QAAQ;AAAA,IAAA;AAAA,EAEzC;AAEA,MAAI,iBAAiB,KAAK,aAAa,cAAc,gBAAgB;AACnE,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SACE,sBAAsB,aAAa,WAAW,sDACrB,cAAc;AAAA,IAAA;AAAA,EAE7C;AAEA,SAAO,EAAE,IAAI,MAAM,QAAQ,KAAA;AAC7B;;;;;;;;;"}
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../packages/kos-api-levels/src/deprecation.ts","../../../packages/kos-api-levels/src/registry.ts","../../../packages/kos-api-levels/src/runtime.ts"],"sourcesContent":["const _warned = new Set<string>();\n\n/**\n * Emits a one-time console warning in non-production environments when a\n * deprecated API is used.\n *\n * @param apiName - The name of the deprecated API (e.g. `@kosSubscribe`)\n * @param serviceId - The service the API belongs to (e.g. `core.subscribe`)\n * @param deprecatedAtLevel - The API level at which this API was deprecated\n * @param replacement - The recommended replacement (e.g. `@kosTopicHandler`)\n * @param removeAtLevel - The API level at which this API will be removed\n */\nexport function warnDeprecated(\n apiName: string,\n serviceId: string,\n deprecatedAtLevel: number,\n replacement: string,\n removeAtLevel: number\n): void {\n if (\n typeof process !== \"undefined\" &&\n process.env[\"NODE_ENV\"] === \"production\"\n ) {\n return;\n }\n if (_warned.has(apiName)) return;\n _warned.add(apiName);\n console.warn(\n `[KOS] \"${apiName}\" is deprecated since ${serviceId} level ${deprecatedAtLevel}. ` +\n `Use \"${replacement}\" instead. Will be removed at level ${removeAtLevel}.`\n );\n}\n","import type { ApiLevelMap } from \"./types\";\n\nconst _registry: ApiLevelMap = {};\n\n/**\n * Registers API levels for an SDK package. Each SDK package calls this on\n * import to populate the in-memory registry. Works in browser and Node.js.\n
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../packages/kos-api-levels/src/deprecation.ts","../../../packages/kos-api-levels/src/registry.ts","../../../packages/kos-api-levels/src/runtime.ts"],"sourcesContent":["const _warned = new Set<string>();\n\n/**\n * Emits a one-time console warning in non-production environments when a\n * deprecated API is used.\n *\n * @param apiName - The name of the deprecated API (e.g. `@kosSubscribe`)\n * @param serviceId - The service the API belongs to (e.g. `core.subscribe`)\n * @param deprecatedAtLevel - The API level at which this API was deprecated\n * @param replacement - The recommended replacement (e.g. `@kosTopicHandler`)\n * @param removeAtLevel - The API level at which this API will be removed\n */\nexport function warnDeprecated(\n apiName: string,\n serviceId: string,\n deprecatedAtLevel: number,\n replacement: string,\n removeAtLevel: number\n): void {\n if (\n typeof process !== \"undefined\" &&\n process.env[\"NODE_ENV\"] === \"production\"\n ) {\n return;\n }\n if (_warned.has(apiName)) return;\n _warned.add(apiName);\n console.warn(\n `[KOS] \"${apiName}\" is deprecated since ${serviceId} level ${deprecatedAtLevel}. ` +\n `Use \"${replacement}\" instead. Will be removed at level ${removeAtLevel}.`\n );\n}\n","import type { ApiLevelMap } from \"./types\";\n\nconst _registry: ApiLevelMap = {};\n\n/**\n * Registers API levels for an SDK package. Each SDK package calls this on\n * import to populate the in-memory registry. Works in browser and Node.js.\n * The call lives in each package's index.ts; the release scanner\n * (`scanner/generate-release.ts`) updates its level number.\n */\nexport function registerApiLevels(levels: ApiLevelMap): void {\n Object.assign(_registry, levels);\n}\n\nexport function getRegistry(): Readonly<ApiLevelMap> {\n return _registry;\n}\n","import type {\n ServiceId,\n ApiLevelMap,\n CheckResult,\n PluginCompatRequirements,\n CompatResult,\n} from \"./types\";\nimport { getRegistry } from \"./registry\";\n\n/**\n * Returns the current API level for a service.\n * Returns 0 if the service has not been registered.\n */\nexport function getApiLevel(service: ServiceId): number {\n return getRegistry()[service] ?? 0;\n}\n\n/**\n * Returns true if the registered level for a service meets the minimum requirement.\n */\nexport function hasApiLevel(service: ServiceId, minLevel: number): boolean {\n return getApiLevel(service) >= minLevel;\n}\n\n/**\n * Throws if the registered level for a service does not meet the minimum requirement.\n */\nexport function requireApiLevel(service: ServiceId, minLevel: number): void {\n const actual = getApiLevel(service);\n if (actual < minLevel) {\n const actualLabel = actual === 0 ? \"not registered\" : String(actual);\n throw new Error(\n `[KOS] API level requirement not met for \"${service}\": required ${minLevel}, actual ${actualLabel}`\n );\n }\n}\n\n/**\n * Returns all registered API levels. Useful for diagnostics and logging.\n */\nexport function getAllApiLevels(): Readonly<ApiLevelMap> {\n return getRegistry();\n}\n\n/**\n * Checks multiple service requirements in a single call.\n */\nexport function checkApiLevels(\n requirements: Partial<ApiLevelMap>\n): CheckResult {\n const details: CheckResult[\"details\"] = {};\n let satisfied = true;\n\n for (const [service, required] of Object.entries(requirements)) {\n if (required === undefined) continue;\n const actual = getApiLevel(service);\n const ok = actual >= required;\n details[service] = { required, actual, ok };\n if (!ok) satisfied = false;\n }\n\n return { satisfied, details };\n}\n\n/**\n * Checks whether a DDK plugin is compatible with the current DDK host.\n *\n * The DDK host registers two services at startup:\n * - `ddk.compat` — the current DDK API level (what it provides)\n * - `ddk.compat.min-plugin` — the oldest plugin level this host still accepts\n *\n * A plugin passes its own requirements:\n * - `pluginRequiresDdkLevel` — minimum DDK level the plugin needs\n * - `pluginLevel` — the API level of the plugin itself\n *\n * Both directions are checked:\n * - Plugin too new for host: `pluginRequiresDdkLevel > ddk.compat`\n * - Plugin too old for host: `pluginLevel < ddk.compat.min-plugin`\n */\nexport function checkCompatibility(\n requirements: PluginCompatRequirements\n): CompatResult {\n const ddkLevel = getApiLevel(\"ddk.compat\");\n const minPluginLevel = getApiLevel(\"ddk.compat.min-plugin\");\n\n if (requirements.pluginRequiresDdkLevel > ddkLevel) {\n const ddkLabel = ddkLevel === 0 ? \"not registered\" : String(ddkLevel);\n return {\n ok: false,\n reason: \"too-new-plugin\",\n message:\n `[KOS] Plugin requires DDK level ${requirements.pluginRequiresDdkLevel}, ` +\n `but host provides level ${ddkLabel}.`,\n };\n }\n\n if (minPluginLevel > 0 && requirements.pluginLevel < minPluginLevel) {\n return {\n ok: false,\n reason: \"too-old-plugin\",\n message:\n `[KOS] Plugin level ${requirements.pluginLevel} is below the host's minimum ` +\n `accepted plugin level ${minPluginLevel}.`,\n };\n }\n\n return { ok: true, reason: \"ok\" };\n}\n"],"names":[],"mappings":"AAAA,MAAM,8BAAc,IAAA;AAYb,SAAS,eACd,SACA,WACA,mBACA,aACA,eACM;AACN,MACE,OAAO,YAAY,eACnB,QAAQ,IAAI,UAAU,MAAM,cAC5B;AACA;AAAA,EACF;AACA,MAAI,QAAQ,IAAI,OAAO,EAAG;AAC1B,UAAQ,IAAI,OAAO;AACnB,UAAQ;AAAA,IACN,UAAU,OAAO,yBAAyB,SAAS,UAAU,iBAAiB,UACpE,WAAW,uCAAuC,aAAa;AAAA,EAAA;AAE7E;AC7BA,MAAM,YAAyB,CAAA;AAQxB,SAAS,kBAAkB,QAA2B;AAC3D,SAAO,OAAO,WAAW,MAAM;AACjC;AAEO,SAAS,cAAqC;AACnD,SAAO;AACT;ACHO,SAAS,YAAY,SAA4B;AACtD,SAAO,YAAA,EAAc,OAAO,KAAK;AACnC;AAKO,SAAS,YAAY,SAAoB,UAA2B;AACzE,SAAO,YAAY,OAAO,KAAK;AACjC;AAKO,SAAS,gBAAgB,SAAoB,UAAwB;AAC1E,QAAM,SAAS,YAAY,OAAO;AAClC,MAAI,SAAS,UAAU;AACrB,UAAM,cAAc,WAAW,IAAI,mBAAmB,OAAO,MAAM;AACnE,UAAM,IAAI;AAAA,MACR,4CAA4C,OAAO,eAAe,QAAQ,YAAY,WAAW;AAAA,IAAA;AAAA,EAErG;AACF;AAKO,SAAS,kBAAyC;AACvD,SAAO,YAAA;AACT;AAKO,SAAS,eACd,cACa;AACb,QAAM,UAAkC,CAAA;AACxC,MAAI,YAAY;AAEhB,aAAW,CAAC,SAAS,QAAQ,KAAK,OAAO,QAAQ,YAAY,GAAG;AAC9D,QAAI,aAAa,OAAW;AAC5B,UAAM,SAAS,YAAY,OAAO;AAClC,UAAM,KAAK,UAAU;AACrB,YAAQ,OAAO,IAAI,EAAE,UAAU,QAAQ,GAAA;AACvC,QAAI,CAAC,GAAI,aAAY;AAAA,EACvB;AAEA,SAAO,EAAE,WAAW,QAAA;AACtB;AAiBO,SAAS,mBACd,cACc;AACd,QAAM,WAAW,YAAY,YAAY;AACzC,QAAM,iBAAiB,YAAY,uBAAuB;AAE1D,MAAI,aAAa,yBAAyB,UAAU;AAClD,UAAM,WAAW,aAAa,IAAI,mBAAmB,OAAO,QAAQ;AACpE,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SACE,mCAAmC,aAAa,sBAAsB,6BAC3C,QAAQ;AAAA,IAAA;AAAA,EAEzC;AAEA,MAAI,iBAAiB,KAAK,aAAa,cAAc,gBAAgB;AACnE,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SACE,sBAAsB,aAAa,WAAW,sDACrB,cAAc;AAAA,IAAA;AAAA,EAE7C;AAEA,SAAO,EAAE,IAAI,MAAM,QAAQ,KAAA;AAC7B;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kosdev-code/kos-api-levels",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.27",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./index.cjs",
|
|
6
6
|
"module": "./index.js",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
},
|
|
23
23
|
"kos": {
|
|
24
24
|
"build": {
|
|
25
|
-
"gitHash": "
|
|
25
|
+
"gitHash": "d5940a35064adbc3194fd9eca2be1831bb8614c2"
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
}
|
package/registry.d.ts
CHANGED
|
@@ -2,9 +2,8 @@ import { ApiLevelMap } from './types';
|
|
|
2
2
|
/**
|
|
3
3
|
* Registers API levels for an SDK package. Each SDK package calls this on
|
|
4
4
|
* import to populate the in-memory registry. Works in browser and Node.js.
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* Phase 2: generated automatically by the JSDoc scanner at build time.
|
|
5
|
+
* The call lives in each package's index.ts; the release scanner
|
|
6
|
+
* (`scanner/generate-release.ts`) updates its level number.
|
|
8
7
|
*/
|
|
9
8
|
export declare function registerApiLevels(levels: ApiLevelMap): void;
|
|
10
9
|
export declare function getRegistry(): Readonly<ApiLevelMap>;
|
package/registry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../packages/kos-api-levels/src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAI3C
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../packages/kos-api-levels/src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAI3C;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAE3D;AAED,wBAAgB,WAAW,IAAI,QAAQ,CAAC,WAAW,CAAC,CAEnD"}
|
package/types.d.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*
|
|
10
10
|
* Per-service IDs (`core.topic-handler`, `dispense.nozzle`, etc.) exist in
|
|
11
11
|
* the scanner catalog (`generated/catalog.json`) for changelog and documentation
|
|
12
|
-
* purposes but are
|
|
12
|
+
* purposes but are not registered at runtime.
|
|
13
13
|
*/
|
|
14
14
|
export type ServiceId = string;
|
|
15
15
|
/**
|