Browse Source

chore: adds `isServiceContainer` utility

e22m4u 5 months ago
parent
commit
1b4af22883

+ 13 - 3
dist/cjs/index.cjs

@@ -25,7 +25,8 @@ __export(index_exports, {
   SERVICE_CLASS_NAME: () => SERVICE_CLASS_NAME,
   SERVICE_CLASS_NAME: () => SERVICE_CLASS_NAME,
   SERVICE_CONTAINER_CLASS_NAME: () => SERVICE_CONTAINER_CLASS_NAME,
   SERVICE_CONTAINER_CLASS_NAME: () => SERVICE_CONTAINER_CLASS_NAME,
   Service: () => Service,
   Service: () => Service,
-  ServiceContainer: () => ServiceContainer
+  ServiceContainer: () => ServiceContainer,
+  isServiceContainer: () => isServiceContainer
 });
 });
 module.exports = __toCommonJS(index_exports);
 module.exports = __toCommonJS(index_exports);
 
 
@@ -181,6 +182,14 @@ __name(_ServiceContainer, "ServiceContainer");
 __publicField(_ServiceContainer, "kinds", [SERVICE_CONTAINER_CLASS_NAME]);
 __publicField(_ServiceContainer, "kinds", [SERVICE_CONTAINER_CLASS_NAME]);
 var ServiceContainer = _ServiceContainer;
 var ServiceContainer = _ServiceContainer;
 
 
+// src/utils/is-service-container.js
+function isServiceContainer(container) {
+  return Boolean(
+    container && typeof container === "object" && typeof container.constructor === "function" && Array.isArray(container.constructor.kinds) && container.constructor.kinds.includes(SERVICE_CONTAINER_CLASS_NAME)
+  );
+}
+__name(isServiceContainer, "isServiceContainer");
+
 // src/service.js
 // src/service.js
 var SERVICE_CLASS_NAME = "Service";
 var SERVICE_CLASS_NAME = "Service";
 var _Service = class _Service {
 var _Service = class _Service {
@@ -196,7 +205,7 @@ var _Service = class _Service {
    * @param {ServiceContainer|undefined} container
    * @param {ServiceContainer|undefined} container
    */
    */
   constructor(container = void 0) {
   constructor(container = void 0) {
-    this.container = container && typeof container === "object" && typeof container.constructor === "function" && Array.isArray(container.constructor.kinds) && container.constructor.kinds.includes(SERVICE_CONTAINER_CLASS_NAME) ? container : new ServiceContainer();
+    this.container = isServiceContainer(container) ? container : new ServiceContainer();
   }
   }
   /**
   /**
    * Получить существующий или новый экземпляр.
    * Получить существующий или новый экземпляр.
@@ -264,5 +273,6 @@ var Service = _Service;
   SERVICE_CLASS_NAME,
   SERVICE_CLASS_NAME,
   SERVICE_CONTAINER_CLASS_NAME,
   SERVICE_CONTAINER_CLASS_NAME,
   Service,
   Service,
-  ServiceContainer
+  ServiceContainer,
+  isServiceContainer
 });
 });

+ 1 - 0
src/index.d.ts

@@ -1,3 +1,4 @@
 export * from './types.js';
 export * from './types.js';
 export * from './service.js';
 export * from './service.js';
 export * from './service-container.js';
 export * from './service-container.js';
+export * from './utils/is-service-container.js';

+ 1 - 0
src/index.js

@@ -1,2 +1,3 @@
 export * from './service.js';
 export * from './service.js';
 export * from './service-container.js';
 export * from './service-container.js';
+export * from './utils/is-service-container.js';

+ 4 - 9
src/service.js

@@ -1,5 +1,5 @@
+import {isServiceContainer} from './utils/index.js';
 import {ServiceContainer} from './service-container.js';
 import {ServiceContainer} from './service-container.js';
-import {SERVICE_CONTAINER_CLASS_NAME} from './service-container.js';
 
 
 /**
 /**
  * Service class name.
  * Service class name.
@@ -32,14 +32,9 @@ export class Service {
    * @param {ServiceContainer|undefined} container
    * @param {ServiceContainer|undefined} container
    */
    */
   constructor(container = undefined) {
   constructor(container = undefined) {
-    this.container =
-      container &&
-      typeof container === 'object' &&
-      typeof container.constructor === 'function' &&
-      Array.isArray(container.constructor.kinds) &&
-      container.constructor.kinds.includes(SERVICE_CONTAINER_CLASS_NAME)
-        ? container
-        : new ServiceContainer();
+    this.container = isServiceContainer(container)
+      ? container
+      : new ServiceContainer();
   }
   }
 
 
   /**
   /**

+ 1 - 0
src/utils/index.d.ts

@@ -0,0 +1 @@
+export * from './is-service-container.js';

+ 1 - 0
src/utils/index.js

@@ -0,0 +1 @@
+export * from './is-service-container.js';

+ 6 - 0
src/utils/is-service-container.d.ts

@@ -0,0 +1,6 @@
+/**
+ * Определяет, является ли аргумент сервис-контейнером.
+ *
+ * @param container
+ */
+export declare function isServiceContainer(container: unknown): boolean;

+ 17 - 0
src/utils/is-service-container.js

@@ -0,0 +1,17 @@
+import {SERVICE_CONTAINER_CLASS_NAME} from '../service-container.js';
+
+/**
+ * Определяет, является ли аргумент сервис-контейнером.
+ *
+ * @param container
+ * @returns {false|*}
+ */
+export function isServiceContainer(container) {
+  return Boolean(
+    container &&
+      typeof container === 'object' &&
+      typeof container.constructor === 'function' &&
+      Array.isArray(container.constructor.kinds) &&
+      container.constructor.kinds.includes(SERVICE_CONTAINER_CLASS_NAME),
+  );
+}

+ 32 - 0
src/utils/is-service-container.spec.js

@@ -0,0 +1,32 @@
+import {expect} from 'chai';
+import {ServiceContainer} from '../service-container.js';
+import {isServiceContainer} from './is-service-container.js';
+import {SERVICE_CONTAINER_CLASS_NAME} from '../service-container.js';
+
+describe('isServiceContainer', function () {
+  it('returns true for ServiceContainer instance', function () {
+    const container = new ServiceContainer();
+    const res = isServiceContainer(container);
+    expect(res).to.be.true;
+  });
+
+  it('returns true if the given object has the kinds property of its constructor', function () {
+    class CustomContainer {
+      static kinds = [SERVICE_CONTAINER_CLASS_NAME];
+    }
+    const container = new CustomContainer();
+    const res = isServiceContainer(container);
+    expect(res).to.be.true;
+  });
+
+  it('returns false for not-container values', function () {
+    expect(isServiceContainer('str')).to.be.false;
+    expect(isServiceContainer(10)).to.be.false;
+    expect(isServiceContainer(true)).to.be.false;
+    expect(isServiceContainer(false)).to.be.false;
+    expect(isServiceContainer({foo: 'bar'})).to.be.false;
+    expect(isServiceContainer([])).to.be.false;
+    expect(isServiceContainer(null)).to.be.false;
+    expect(isServiceContainer(undefined)).to.be.false;
+  });
+});