@nexim/service-worker 1.0.3 → 2.0.0-alpha.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 CHANGED
@@ -3,6 +3,25 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [2.0.0-alpha.0](https://github.com/the-nexim/nanolib/compare/@nexim/service-worker@1.0.4...@nexim/service-worker@2.0.0-alpha.0) (2025-01-19)
7
+
8
+ ### Features
9
+
10
+ * **service-worker:** add periodic update checks for service worker ([c2b5dd9](https://github.com/the-nexim/nanolib/commit/c2b5dd971d39e484db4f2ca5e6fe9be6b5b4bd67)) by @arashagp
11
+ * **service-worker:** add support for configurable periodic update checks ([68ecd16](https://github.com/the-nexim/nanolib/commit/68ecd167b9c301570bc5daf18b1e2a2d62849003)) by @arashagp
12
+
13
+ ### Bug Fixes
14
+
15
+ * **service-worker:** correctly set redundant event ([6167dee](https://github.com/the-nexim/nanolib/commit/6167dee8d96f790d4a5dae9037feb7f55f7c2a71)) by @njfamirm
16
+
17
+ ### Code Refactoring
18
+
19
+ * **service-worker:** resolve comment ([f7bfb36](https://github.com/the-nexim/nanolib/commit/f7bfb360e3b76ee877634659a88c9beba2078766)) by @arashagp
20
+
21
+ ## [1.0.4](https://github.com/the-nexim/nanolib/compare/@nexim/service-worker@1.0.3...@nexim/service-worker@1.0.4) (2025-01-11)
22
+
23
+ **Note:** Version bump only for package @nexim/service-worker
24
+
6
25
  ## [1.0.3](https://github.com/the-nexim/nanolib/compare/@nexim/service-worker@1.0.2...@nexim/service-worker@1.0.3) (2025-01-09)
7
26
 
8
27
  ### Bug Fixes
package/README.md CHANGED
@@ -20,31 +20,6 @@ npm install @nexim/service-worker
20
20
  yarn add @nexim/service-worker
21
21
  ```
22
22
 
23
- ## Api
23
+ ## Documentation
24
24
 
25
- ### registerServiceWorker
26
-
27
- Register the service worker and handle updates.
28
-
29
- ```ts
30
- import {registerServiceWorker} from '@nexim/service-worker';
31
-
32
- const serviceWorkerPath = '/service-worker.js';
33
- registerServiceWorker(serviceWorkerPath);
34
- ```
35
-
36
- ### serviceWorkerSignal
37
-
38
- Signal for service worker events.
39
-
40
- ```ts
41
- import {serviceWorkerSignal} from '@nexim/service-worker';
42
-
43
- serviceWorkerSignal.subscribe(({event}) => {
44
- console.log('Service worker event:', event);
45
- });
46
- ```
47
-
48
- ### Type ServiceWorkerEvent
49
-
50
- The events that can be emitted by the service worker.
25
+ Read full documentation [here](./docs/README.md).
package/dist/main.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /* @nexim/service-worker v1.0.3 */
1
+ /* @nexim/service-worker v2.0.0-alpha.0 */
2
2
  "use strict";
3
3
  var __defProp = Object.defineProperty;
4
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -28,24 +28,31 @@ module.exports = __toCommonJS(main_exports);
28
28
  var import_flux = require("@alwatr/flux");
29
29
  var import_logger = require("@alwatr/logger");
30
30
  var import_package_tracer = require("@alwatr/package-tracer");
31
- __dev_mode__: import_package_tracer.packageTracer.add("@nexim/service-worker", "1.0.3");
31
+ var import_parse_duration = require("@alwatr/parse-duration");
32
+ __dev_mode__: import_package_tracer.packageTracer.add("@nexim/service-worker", "2.0.0-alpha.0");
32
33
  var logger = /* @__PURE__ */ (0, import_logger.createLogger)("@nexim/service-worker");
33
34
  var serviceWorkerSignal = /* @__PURE__ */ new import_flux.AlwatrSignal({
34
35
  name: "serviceWorker"
35
36
  });
36
- async function registerServiceWorker(serviceWorkerPath) {
37
- logger.logMethodArgs?.("registerServiceWorker", { serviceWorkerPath });
37
+ async function registerServiceWorker(options) {
38
+ logger.logMethodArgs?.("registerServiceWorker", { options });
38
39
  if ("serviceWorker" in navigator === false) {
39
40
  logger.incident?.("registerServiceWorker", "service_worker_not_supported");
40
41
  return;
41
42
  }
42
43
  try {
43
- const swRegistration = await navigator.serviceWorker.register(serviceWorkerPath);
44
+ const swRegistration = await navigator.serviceWorker.register(options.serviceWorkerPath);
44
45
  serviceWorkerSignal.notify({ event: "service_worker_registered" });
45
46
  swRegistration.addEventListener("updatefound", () => serviceWorkerUpdateFoundHandler(swRegistration.installing));
46
47
  logger.logOther?.("Service worker registered.");
48
+ if (options.timeForAutoUpdate != null) {
49
+ setInterval(async () => {
50
+ logger.logOther?.("startPeriodicUpdateChecks");
51
+ await swRegistration.update();
52
+ }, (0, import_parse_duration.parseDuration)(options.timeForAutoUpdate));
53
+ }
47
54
  } catch (error) {
48
- logger.error("registerServiceWorker", "registration_failed ", { error });
55
+ logger.error("registerServiceWorker", "registration_failed", { error });
49
56
  serviceWorkerSignal.notify({ event: "service_worker_register_failed" });
50
57
  }
51
58
  }
@@ -69,7 +76,7 @@ function serviceWorkerStateChangeHandler(serviceWorker) {
69
76
  }
70
77
  } else if (serviceWorker.state === "redundant") {
71
78
  logger.accident("serviceWorkerStateChangeHandler", "sw_redundant", "Service worker redundant");
72
- serviceWorkerSignal.notify({ event: "service_worker_installed" });
79
+ serviceWorkerSignal.notify({ event: "service_worker_update_failed" });
73
80
  }
74
81
  }
75
82
  // Annotate the CommonJS export names for ESM import in node:
package/dist/main.cjs.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/main.ts"],
4
- "sourcesContent": ["import {AlwatrSignal} from '@alwatr/flux';\nimport {createLogger} from '@alwatr/logger';\nimport {packageTracer} from '@alwatr/package-tracer';\n\n/**\n * The events that can be emitted by the service worker.\n */\nexport type ServiceWorkerEvent =\n | 'service_worker_registered'\n | 'service_worker_register_failed'\n | 'service_worker_first_install'\n | 'service_worker_updated'\n | 'service_worker_installed'\n | 'service_worker_update_found';\n\n__dev_mode__: packageTracer.add(__package_name__, __package_version__);\n\nconst logger = /* @__PURE__ */ createLogger(__package_name__);\n\n/**\n * Signal for service worker events.\n *\n * @example\n * ```\n * import {serviceWorkerSignal} from '@nexim/service-worker';\n *\n * serviceWorkerSignal.subscribe(({event}) => {\n * console.log('Service worker event:', event);\n * });\n * ```\n */\nexport const serviceWorkerSignal = /* @__PURE__ */ new AlwatrSignal<{event: ServiceWorkerEvent}>({\n name: 'serviceWorker',\n});\n\n/**\n * Register the service worker and handle updates.\n *\n * @param serviceWorkerPath - The path to the service worker.\n *\n * @example\n * ```\n * import {registerServiceWorker} from '@nexim/service-worker';\n *\n * const serviceWorkerPath = '/service-worker.js';\n * registerServiceWorker(serviceWorkerPath);\n * ```\n */\nexport async function registerServiceWorker(serviceWorkerPath: string): Promise<void> {\n logger.logMethodArgs?.('registerServiceWorker', {serviceWorkerPath});\n\n if (('serviceWorker' in navigator) === false) {\n logger.incident?.('registerServiceWorker', 'service_worker_not_supported');\n return;\n }\n\n try {\n const swRegistration = await navigator.serviceWorker.register(serviceWorkerPath);\n serviceWorkerSignal.notify({event: 'service_worker_registered'});\n swRegistration.addEventListener('updatefound', () => serviceWorkerUpdateFoundHandler(swRegistration.installing));\n logger.logOther?.('Service worker registered.');\n }\n catch (error) {\n logger.error('registerServiceWorker', 'registration_failed ', {error});\n serviceWorkerSignal.notify({event: 'service_worker_register_failed'});\n }\n}\n\n/**\n * Handle the 'updatefound' event\n *\n * @param serviceWorker - The service worker\n */\nfunction serviceWorkerUpdateFoundHandler(serviceWorker: ServiceWorker | null): void {\n if (serviceWorker == null) return;\n logger.logMethod?.('swUpdateFound');\n\n // Only notify update found if there's an existing controller\n if (navigator.serviceWorker.controller) {\n serviceWorkerSignal.notify({event: 'service_worker_update_found'});\n }\n else {\n serviceWorkerSignal.notify({event: 'service_worker_first_install'});\n }\n\n serviceWorker.addEventListener('statechange', () => serviceWorkerStateChangeHandler(serviceWorker));\n}\n\n/**\n * Handle the 'statechange' event.\n *\n * If the service worker state is 'installed' then it is either a new install or an update.\n * If the service worker state is 'redundant' then the service worker is redundant.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/state\n *\n * @param serviceWorker - The service worker.\n */\nfunction serviceWorkerStateChangeHandler(serviceWorker: ServiceWorker): void {\n logger.logMethodArgs?.('serviceWorkerStateChangeHandler', {state: serviceWorker.state});\n\n if (serviceWorker.state === 'installed') {\n // if old controller available then its update else its new install\n if (navigator.serviceWorker.controller) {\n serviceWorkerSignal.notify({event: 'service_worker_updated'});\n }\n else {\n serviceWorkerSignal.notify({event: 'service_worker_installed'});\n }\n }\n else if (serviceWorker.state === 'redundant') {\n logger.accident('serviceWorkerStateChangeHandler', 'sw_redundant', 'Service worker redundant');\n serviceWorkerSignal.notify({event: 'service_worker_installed'});\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA2B;AAC3B,oBAA2B;AAC3B,4BAA4B;AAa5B,aAAc,qCAAc,IAAI,yBAAkB,OAAmB;AAErE,IAAM,SAAyB,gDAAa,uBAAgB;AAcrD,IAAM,sBAAsC,oBAAI,yBAA0C;AAAA,EAC/F,MAAM;AACR,CAAC;AAeD,eAAsB,sBAAsB,mBAA0C;AACpF,SAAO,gBAAgB,yBAAyB,EAAC,kBAAiB,CAAC;AAEnE,MAAK,mBAAmB,cAAe,OAAO;AAC5C,WAAO,WAAW,yBAAyB,8BAA8B;AACzE;AAAA,EACF;AAEA,MAAI;AACF,UAAM,iBAAiB,MAAM,UAAU,cAAc,SAAS,iBAAiB;AAC/E,wBAAoB,OAAO,EAAC,OAAO,4BAA2B,CAAC;AAC/D,mBAAe,iBAAiB,eAAe,MAAM,gCAAgC,eAAe,UAAU,CAAC;AAC/G,WAAO,WAAW,4BAA4B;AAAA,EAChD,SACO,OAAO;AACZ,WAAO,MAAM,yBAAyB,wBAAwB,EAAC,MAAK,CAAC;AACrE,wBAAoB,OAAO,EAAC,OAAO,iCAAgC,CAAC;AAAA,EACtE;AACF;AAOA,SAAS,gCAAgC,eAA2C;AAClF,MAAI,iBAAiB,KAAM;AAC3B,SAAO,YAAY,eAAe;AAGlC,MAAI,UAAU,cAAc,YAAY;AACtC,wBAAoB,OAAO,EAAC,OAAO,8BAA6B,CAAC;AAAA,EACnE,OACK;AACH,wBAAoB,OAAO,EAAC,OAAO,+BAA8B,CAAC;AAAA,EACpE;AAEA,gBAAc,iBAAiB,eAAe,MAAM,gCAAgC,aAAa,CAAC;AACpG;AAYA,SAAS,gCAAgC,eAAoC;AAC3E,SAAO,gBAAgB,mCAAmC,EAAC,OAAO,cAAc,MAAK,CAAC;AAEtF,MAAI,cAAc,UAAU,aAAa;AAEvC,QAAI,UAAU,cAAc,YAAY;AACtC,0BAAoB,OAAO,EAAC,OAAO,yBAAwB,CAAC;AAAA,IAC9D,OACK;AACH,0BAAoB,OAAO,EAAC,OAAO,2BAA0B,CAAC;AAAA,IAChE;AAAA,EACF,WACS,cAAc,UAAU,aAAa;AAC5C,WAAO,SAAS,mCAAmC,gBAAgB,0BAA0B;AAC7F,wBAAoB,OAAO,EAAC,OAAO,2BAA0B,CAAC;AAAA,EAChE;AACF;",
4
+ "sourcesContent": ["import {AlwatrSignal} from '@alwatr/flux';\nimport {createLogger} from '@alwatr/logger';\nimport {packageTracer} from '@alwatr/package-tracer';\nimport {parseDuration, type Duration} from '@alwatr/parse-duration';\n\n/**\n * The events that can be emitted by the service worker.\n */\nexport type ServiceWorkerEvent =\n | 'service_worker_registered'\n | 'service_worker_register_failed'\n | 'service_worker_first_install'\n | 'service_worker_updated'\n | 'service_worker_installed'\n | 'service_worker_update_found'\n | 'service_worker_update_failed';\n\n__dev_mode__: packageTracer.add(__package_name__, __package_version__);\n\nconst logger = /* @__PURE__ */ createLogger(__package_name__);\n\n/**\n * Signal for service worker events.\n *\n * @example\n * ```ts\n * import {serviceWorkerSignal} from '@nexim/service-worker';\n *\n * serviceWorkerSignal.subscribe(({event}) => {\n * console.log('Service worker event:', event);\n * });\n * ```\n */\nexport const serviceWorkerSignal = /* @__PURE__ */ new AlwatrSignal<{event: ServiceWorkerEvent}>({\n name: 'serviceWorker',\n});\n\n/**\n * Register the service worker and handle updates.\n *\n * @param options - An object containing the service worker path and optional auto-update time.\n * @param serviceWorkerPath - [Options] The path to the service worker.\n * @param timeForAutoUpdate - [Options] Optional duration for automatically updating the service worker.\n *\n * @example\n * ```ts\n * import {registerServiceWorker} from '@nexim/service-worker';\n *\n * const serviceWorkerPath = '/service-worker.js';\n *\n * // without auto update\n * registerServiceWorker({ serviceWorkerPath });\n *\n * // with auto update\n * registerServiceWorker({ serviceWorkerPath, timeForAutoUpdate: '10m' });\n * ```\n */\nexport async function registerServiceWorker(options: {serviceWorkerPath: string, timeForAutoUpdate?: Duration}): Promise<void> {\n logger.logMethodArgs?.('registerServiceWorker', {options});\n if ('serviceWorker' in navigator === false) {\n logger.incident?.('registerServiceWorker', 'service_worker_not_supported');\n return;\n }\n\n try {\n const swRegistration = await navigator.serviceWorker.register(options.serviceWorkerPath);\n serviceWorkerSignal.notify({event: 'service_worker_registered'});\n swRegistration.addEventListener('updatefound', () => serviceWorkerUpdateFoundHandler(swRegistration.installing));\n logger.logOther?.('Service worker registered.');\n\n if (options.timeForAutoUpdate != null) {\n setInterval(async () => {\n logger.logOther?.('startPeriodicUpdateChecks');\n\n await swRegistration.update();\n }, parseDuration(options.timeForAutoUpdate));\n }\n }\n catch (error) {\n logger.error('registerServiceWorker', 'registration_failed', {error});\n serviceWorkerSignal.notify({event: 'service_worker_register_failed'});\n }\n}\n\n/**\n * Handle the 'updatefound' event\n *\n * @param serviceWorker - The service worker\n */\nfunction serviceWorkerUpdateFoundHandler(serviceWorker: ServiceWorker | null): void {\n if (serviceWorker == null) return;\n logger.logMethod?.('swUpdateFound');\n\n // Only notify update found if there's an existing controller\n if (navigator.serviceWorker.controller) {\n serviceWorkerSignal.notify({event: 'service_worker_update_found'});\n }\n else {\n serviceWorkerSignal.notify({event: 'service_worker_first_install'});\n }\n\n serviceWorker.addEventListener('statechange', () => serviceWorkerStateChangeHandler(serviceWorker));\n}\n\n/**\n * Handle the 'statechange' event.\n *\n * If the service worker state is 'installed' then it is either a new install or an update.\n * If the service worker state is 'redundant' then the service worker is redundant.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/state\n *\n * @param serviceWorker - The service worker.\n */\nfunction serviceWorkerStateChangeHandler(serviceWorker: ServiceWorker): void {\n logger.logMethodArgs?.('serviceWorkerStateChangeHandler', {state: serviceWorker.state});\n\n if (serviceWorker.state === 'installed') {\n // if old controller available then its update else its new install\n if (navigator.serviceWorker.controller) {\n serviceWorkerSignal.notify({event: 'service_worker_updated'});\n }\n else {\n serviceWorkerSignal.notify({event: 'service_worker_installed'});\n }\n }\n else if (serviceWorker.state === 'redundant') {\n logger.accident('serviceWorkerStateChangeHandler', 'sw_redundant', 'Service worker redundant');\n serviceWorkerSignal.notify({event: 'service_worker_update_failed'});\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA2B;AAC3B,oBAA2B;AAC3B,4BAA4B;AAC5B,4BAA2C;AAc3C,aAAc,qCAAc,IAAI,yBAAkB,eAAmB;AAErE,IAAM,SAAyB,gDAAa,uBAAgB;AAcrD,IAAM,sBAAsC,oBAAI,yBAA0C;AAAA,EAC/F,MAAM;AACR,CAAC;AAsBD,eAAsB,sBAAsB,SAAmF;AAC7H,SAAO,gBAAgB,yBAAyB,EAAC,QAAO,CAAC;AACzD,MAAI,mBAAmB,cAAc,OAAO;AAC1C,WAAO,WAAW,yBAAyB,8BAA8B;AACzE;AAAA,EACF;AAEA,MAAI;AACF,UAAM,iBAAiB,MAAM,UAAU,cAAc,SAAS,QAAQ,iBAAiB;AACvF,wBAAoB,OAAO,EAAC,OAAO,4BAA2B,CAAC;AAC/D,mBAAe,iBAAiB,eAAe,MAAM,gCAAgC,eAAe,UAAU,CAAC;AAC/G,WAAO,WAAW,4BAA4B;AAE9C,QAAI,QAAQ,qBAAqB,MAAM;AACrC,kBAAY,YAAY;AACtB,eAAO,WAAW,2BAA2B;AAE7C,cAAM,eAAe,OAAO;AAAA,MAC9B,OAAG,qCAAc,QAAQ,iBAAiB,CAAC;AAAA,IAC7C;AAAA,EACF,SACO,OAAO;AACZ,WAAO,MAAM,yBAAyB,uBAAuB,EAAC,MAAK,CAAC;AACpE,wBAAoB,OAAO,EAAC,OAAO,iCAAgC,CAAC;AAAA,EACtE;AACF;AAOA,SAAS,gCAAgC,eAA2C;AAClF,MAAI,iBAAiB,KAAM;AAC3B,SAAO,YAAY,eAAe;AAGlC,MAAI,UAAU,cAAc,YAAY;AACtC,wBAAoB,OAAO,EAAC,OAAO,8BAA6B,CAAC;AAAA,EACnE,OACK;AACH,wBAAoB,OAAO,EAAC,OAAO,+BAA8B,CAAC;AAAA,EACpE;AAEA,gBAAc,iBAAiB,eAAe,MAAM,gCAAgC,aAAa,CAAC;AACpG;AAYA,SAAS,gCAAgC,eAAoC;AAC3E,SAAO,gBAAgB,mCAAmC,EAAC,OAAO,cAAc,MAAK,CAAC;AAEtF,MAAI,cAAc,UAAU,aAAa;AAEvC,QAAI,UAAU,cAAc,YAAY;AACtC,0BAAoB,OAAO,EAAC,OAAO,yBAAwB,CAAC;AAAA,IAC9D,OACK;AACH,0BAAoB,OAAO,EAAC,OAAO,2BAA0B,CAAC;AAAA,IAChE;AAAA,EACF,WACS,cAAc,UAAU,aAAa;AAC5C,WAAO,SAAS,mCAAmC,gBAAgB,0BAA0B;AAC7F,wBAAoB,OAAO,EAAC,OAAO,+BAA8B,CAAC;AAAA,EACpE;AACF;",
6
6
  "names": []
7
7
  }
package/dist/main.d.ts CHANGED
@@ -1,13 +1,14 @@
1
1
  import { AlwatrSignal } from '@alwatr/flux';
2
+ import { type Duration } from '@alwatr/parse-duration';
2
3
  /**
3
4
  * The events that can be emitted by the service worker.
4
5
  */
5
- export type ServiceWorkerEvent = 'service_worker_registered' | 'service_worker_register_failed' | 'service_worker_first_install' | 'service_worker_updated' | 'service_worker_installed' | 'service_worker_update_found';
6
+ export type ServiceWorkerEvent = 'service_worker_registered' | 'service_worker_register_failed' | 'service_worker_first_install' | 'service_worker_updated' | 'service_worker_installed' | 'service_worker_update_found' | 'service_worker_update_failed';
6
7
  /**
7
8
  * Signal for service worker events.
8
9
  *
9
10
  * @example
10
- * ```
11
+ * ```ts
11
12
  * import {serviceWorkerSignal} from '@nexim/service-worker';
12
13
  *
13
14
  * serviceWorkerSignal.subscribe(({event}) => {
@@ -21,15 +22,25 @@ export declare const serviceWorkerSignal: AlwatrSignal<{
21
22
  /**
22
23
  * Register the service worker and handle updates.
23
24
  *
24
- * @param serviceWorkerPath - The path to the service worker.
25
+ * @param options - An object containing the service worker path and optional auto-update time.
26
+ * @param serviceWorkerPath - [Options] The path to the service worker.
27
+ * @param timeForAutoUpdate - [Options] Optional duration for automatically updating the service worker.
25
28
  *
26
29
  * @example
27
- * ```
30
+ * ```ts
28
31
  * import {registerServiceWorker} from '@nexim/service-worker';
29
32
  *
30
33
  * const serviceWorkerPath = '/service-worker.js';
31
- * registerServiceWorker(serviceWorkerPath);
34
+ *
35
+ * // without auto update
36
+ * registerServiceWorker({ serviceWorkerPath });
37
+ *
38
+ * // with auto update
39
+ * registerServiceWorker({ serviceWorkerPath, timeForAutoUpdate: '10m' });
32
40
  * ```
33
41
  */
34
- export declare function registerServiceWorker(serviceWorkerPath: string): Promise<void>;
42
+ export declare function registerServiceWorker(options: {
43
+ serviceWorkerPath: string;
44
+ timeForAutoUpdate?: Duration;
45
+ }): Promise<void>;
35
46
  //# sourceMappingURL=main.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,cAAc,CAAC;AAI1C;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAC1B,2BAA2B,GAC3B,gCAAgC,GAChC,8BAA8B,GAC9B,wBAAwB,GACxB,0BAA0B,GAC1B,6BAA6B,CAAC;AAMlC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB;WAA4C,kBAAkB;EAE5F,CAAC;AAEH;;;;;;;;;;;;GAYG;AACH,wBAAsB,qBAAqB,CAAC,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBpF"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,cAAc,CAAC;AAG1C,OAAO,EAAgB,KAAK,QAAQ,EAAC,MAAM,wBAAwB,CAAC;AAEpE;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAC1B,2BAA2B,GAC3B,gCAAgC,GAChC,8BAA8B,GAC9B,wBAAwB,GACxB,0BAA0B,GAC1B,6BAA6B,GAC7B,8BAA8B,CAAC;AAMnC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB;WAA4C,kBAAkB;EAE5F,CAAC;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,QAAQ,CAAA;CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB7H"}
package/dist/main.mjs CHANGED
@@ -1,27 +1,34 @@
1
- /* @nexim/service-worker v1.0.3 */
1
+ /* @nexim/service-worker v2.0.0-alpha.0 */
2
2
 
3
3
  // src/main.ts
4
4
  import { AlwatrSignal } from "@alwatr/flux";
5
5
  import { createLogger } from "@alwatr/logger";
6
6
  import { packageTracer } from "@alwatr/package-tracer";
7
- __dev_mode__: packageTracer.add("@nexim/service-worker", "1.0.3");
7
+ import { parseDuration } from "@alwatr/parse-duration";
8
+ __dev_mode__: packageTracer.add("@nexim/service-worker", "2.0.0-alpha.0");
8
9
  var logger = /* @__PURE__ */ createLogger("@nexim/service-worker");
9
10
  var serviceWorkerSignal = /* @__PURE__ */ new AlwatrSignal({
10
11
  name: "serviceWorker"
11
12
  });
12
- async function registerServiceWorker(serviceWorkerPath) {
13
- logger.logMethodArgs?.("registerServiceWorker", { serviceWorkerPath });
13
+ async function registerServiceWorker(options) {
14
+ logger.logMethodArgs?.("registerServiceWorker", { options });
14
15
  if ("serviceWorker" in navigator === false) {
15
16
  logger.incident?.("registerServiceWorker", "service_worker_not_supported");
16
17
  return;
17
18
  }
18
19
  try {
19
- const swRegistration = await navigator.serviceWorker.register(serviceWorkerPath);
20
+ const swRegistration = await navigator.serviceWorker.register(options.serviceWorkerPath);
20
21
  serviceWorkerSignal.notify({ event: "service_worker_registered" });
21
22
  swRegistration.addEventListener("updatefound", () => serviceWorkerUpdateFoundHandler(swRegistration.installing));
22
23
  logger.logOther?.("Service worker registered.");
24
+ if (options.timeForAutoUpdate != null) {
25
+ setInterval(async () => {
26
+ logger.logOther?.("startPeriodicUpdateChecks");
27
+ await swRegistration.update();
28
+ }, parseDuration(options.timeForAutoUpdate));
29
+ }
23
30
  } catch (error) {
24
- logger.error("registerServiceWorker", "registration_failed ", { error });
31
+ logger.error("registerServiceWorker", "registration_failed", { error });
25
32
  serviceWorkerSignal.notify({ event: "service_worker_register_failed" });
26
33
  }
27
34
  }
@@ -45,7 +52,7 @@ function serviceWorkerStateChangeHandler(serviceWorker) {
45
52
  }
46
53
  } else if (serviceWorker.state === "redundant") {
47
54
  logger.accident("serviceWorkerStateChangeHandler", "sw_redundant", "Service worker redundant");
48
- serviceWorkerSignal.notify({ event: "service_worker_installed" });
55
+ serviceWorkerSignal.notify({ event: "service_worker_update_failed" });
49
56
  }
50
57
  }
51
58
  export {
package/dist/main.mjs.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/main.ts"],
4
- "sourcesContent": ["import {AlwatrSignal} from '@alwatr/flux';\nimport {createLogger} from '@alwatr/logger';\nimport {packageTracer} from '@alwatr/package-tracer';\n\n/**\n * The events that can be emitted by the service worker.\n */\nexport type ServiceWorkerEvent =\n | 'service_worker_registered'\n | 'service_worker_register_failed'\n | 'service_worker_first_install'\n | 'service_worker_updated'\n | 'service_worker_installed'\n | 'service_worker_update_found';\n\n__dev_mode__: packageTracer.add(__package_name__, __package_version__);\n\nconst logger = /* @__PURE__ */ createLogger(__package_name__);\n\n/**\n * Signal for service worker events.\n *\n * @example\n * ```\n * import {serviceWorkerSignal} from '@nexim/service-worker';\n *\n * serviceWorkerSignal.subscribe(({event}) => {\n * console.log('Service worker event:', event);\n * });\n * ```\n */\nexport const serviceWorkerSignal = /* @__PURE__ */ new AlwatrSignal<{event: ServiceWorkerEvent}>({\n name: 'serviceWorker',\n});\n\n/**\n * Register the service worker and handle updates.\n *\n * @param serviceWorkerPath - The path to the service worker.\n *\n * @example\n * ```\n * import {registerServiceWorker} from '@nexim/service-worker';\n *\n * const serviceWorkerPath = '/service-worker.js';\n * registerServiceWorker(serviceWorkerPath);\n * ```\n */\nexport async function registerServiceWorker(serviceWorkerPath: string): Promise<void> {\n logger.logMethodArgs?.('registerServiceWorker', {serviceWorkerPath});\n\n if (('serviceWorker' in navigator) === false) {\n logger.incident?.('registerServiceWorker', 'service_worker_not_supported');\n return;\n }\n\n try {\n const swRegistration = await navigator.serviceWorker.register(serviceWorkerPath);\n serviceWorkerSignal.notify({event: 'service_worker_registered'});\n swRegistration.addEventListener('updatefound', () => serviceWorkerUpdateFoundHandler(swRegistration.installing));\n logger.logOther?.('Service worker registered.');\n }\n catch (error) {\n logger.error('registerServiceWorker', 'registration_failed ', {error});\n serviceWorkerSignal.notify({event: 'service_worker_register_failed'});\n }\n}\n\n/**\n * Handle the 'updatefound' event\n *\n * @param serviceWorker - The service worker\n */\nfunction serviceWorkerUpdateFoundHandler(serviceWorker: ServiceWorker | null): void {\n if (serviceWorker == null) return;\n logger.logMethod?.('swUpdateFound');\n\n // Only notify update found if there's an existing controller\n if (navigator.serviceWorker.controller) {\n serviceWorkerSignal.notify({event: 'service_worker_update_found'});\n }\n else {\n serviceWorkerSignal.notify({event: 'service_worker_first_install'});\n }\n\n serviceWorker.addEventListener('statechange', () => serviceWorkerStateChangeHandler(serviceWorker));\n}\n\n/**\n * Handle the 'statechange' event.\n *\n * If the service worker state is 'installed' then it is either a new install or an update.\n * If the service worker state is 'redundant' then the service worker is redundant.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/state\n *\n * @param serviceWorker - The service worker.\n */\nfunction serviceWorkerStateChangeHandler(serviceWorker: ServiceWorker): void {\n logger.logMethodArgs?.('serviceWorkerStateChangeHandler', {state: serviceWorker.state});\n\n if (serviceWorker.state === 'installed') {\n // if old controller available then its update else its new install\n if (navigator.serviceWorker.controller) {\n serviceWorkerSignal.notify({event: 'service_worker_updated'});\n }\n else {\n serviceWorkerSignal.notify({event: 'service_worker_installed'});\n }\n }\n else if (serviceWorker.state === 'redundant') {\n logger.accident('serviceWorkerStateChangeHandler', 'sw_redundant', 'Service worker redundant');\n serviceWorkerSignal.notify({event: 'service_worker_installed'});\n }\n}\n"],
5
- "mappings": ";;;AAAA,SAAQ,oBAAmB;AAC3B,SAAQ,oBAAmB;AAC3B,SAAQ,qBAAoB;AAa5B,aAAc,eAAc,IAAI,yBAAkB,OAAmB;AAErE,IAAM,SAAyB,6BAAa,uBAAgB;AAcrD,IAAM,sBAAsC,oBAAI,aAA0C;AAAA,EAC/F,MAAM;AACR,CAAC;AAeD,eAAsB,sBAAsB,mBAA0C;AACpF,SAAO,gBAAgB,yBAAyB,EAAC,kBAAiB,CAAC;AAEnE,MAAK,mBAAmB,cAAe,OAAO;AAC5C,WAAO,WAAW,yBAAyB,8BAA8B;AACzE;AAAA,EACF;AAEA,MAAI;AACF,UAAM,iBAAiB,MAAM,UAAU,cAAc,SAAS,iBAAiB;AAC/E,wBAAoB,OAAO,EAAC,OAAO,4BAA2B,CAAC;AAC/D,mBAAe,iBAAiB,eAAe,MAAM,gCAAgC,eAAe,UAAU,CAAC;AAC/G,WAAO,WAAW,4BAA4B;AAAA,EAChD,SACO,OAAO;AACZ,WAAO,MAAM,yBAAyB,wBAAwB,EAAC,MAAK,CAAC;AACrE,wBAAoB,OAAO,EAAC,OAAO,iCAAgC,CAAC;AAAA,EACtE;AACF;AAOA,SAAS,gCAAgC,eAA2C;AAClF,MAAI,iBAAiB,KAAM;AAC3B,SAAO,YAAY,eAAe;AAGlC,MAAI,UAAU,cAAc,YAAY;AACtC,wBAAoB,OAAO,EAAC,OAAO,8BAA6B,CAAC;AAAA,EACnE,OACK;AACH,wBAAoB,OAAO,EAAC,OAAO,+BAA8B,CAAC;AAAA,EACpE;AAEA,gBAAc,iBAAiB,eAAe,MAAM,gCAAgC,aAAa,CAAC;AACpG;AAYA,SAAS,gCAAgC,eAAoC;AAC3E,SAAO,gBAAgB,mCAAmC,EAAC,OAAO,cAAc,MAAK,CAAC;AAEtF,MAAI,cAAc,UAAU,aAAa;AAEvC,QAAI,UAAU,cAAc,YAAY;AACtC,0BAAoB,OAAO,EAAC,OAAO,yBAAwB,CAAC;AAAA,IAC9D,OACK;AACH,0BAAoB,OAAO,EAAC,OAAO,2BAA0B,CAAC;AAAA,IAChE;AAAA,EACF,WACS,cAAc,UAAU,aAAa;AAC5C,WAAO,SAAS,mCAAmC,gBAAgB,0BAA0B;AAC7F,wBAAoB,OAAO,EAAC,OAAO,2BAA0B,CAAC;AAAA,EAChE;AACF;",
4
+ "sourcesContent": ["import {AlwatrSignal} from '@alwatr/flux';\nimport {createLogger} from '@alwatr/logger';\nimport {packageTracer} from '@alwatr/package-tracer';\nimport {parseDuration, type Duration} from '@alwatr/parse-duration';\n\n/**\n * The events that can be emitted by the service worker.\n */\nexport type ServiceWorkerEvent =\n | 'service_worker_registered'\n | 'service_worker_register_failed'\n | 'service_worker_first_install'\n | 'service_worker_updated'\n | 'service_worker_installed'\n | 'service_worker_update_found'\n | 'service_worker_update_failed';\n\n__dev_mode__: packageTracer.add(__package_name__, __package_version__);\n\nconst logger = /* @__PURE__ */ createLogger(__package_name__);\n\n/**\n * Signal for service worker events.\n *\n * @example\n * ```ts\n * import {serviceWorkerSignal} from '@nexim/service-worker';\n *\n * serviceWorkerSignal.subscribe(({event}) => {\n * console.log('Service worker event:', event);\n * });\n * ```\n */\nexport const serviceWorkerSignal = /* @__PURE__ */ new AlwatrSignal<{event: ServiceWorkerEvent}>({\n name: 'serviceWorker',\n});\n\n/**\n * Register the service worker and handle updates.\n *\n * @param options - An object containing the service worker path and optional auto-update time.\n * @param serviceWorkerPath - [Options] The path to the service worker.\n * @param timeForAutoUpdate - [Options] Optional duration for automatically updating the service worker.\n *\n * @example\n * ```ts\n * import {registerServiceWorker} from '@nexim/service-worker';\n *\n * const serviceWorkerPath = '/service-worker.js';\n *\n * // without auto update\n * registerServiceWorker({ serviceWorkerPath });\n *\n * // with auto update\n * registerServiceWorker({ serviceWorkerPath, timeForAutoUpdate: '10m' });\n * ```\n */\nexport async function registerServiceWorker(options: {serviceWorkerPath: string, timeForAutoUpdate?: Duration}): Promise<void> {\n logger.logMethodArgs?.('registerServiceWorker', {options});\n if ('serviceWorker' in navigator === false) {\n logger.incident?.('registerServiceWorker', 'service_worker_not_supported');\n return;\n }\n\n try {\n const swRegistration = await navigator.serviceWorker.register(options.serviceWorkerPath);\n serviceWorkerSignal.notify({event: 'service_worker_registered'});\n swRegistration.addEventListener('updatefound', () => serviceWorkerUpdateFoundHandler(swRegistration.installing));\n logger.logOther?.('Service worker registered.');\n\n if (options.timeForAutoUpdate != null) {\n setInterval(async () => {\n logger.logOther?.('startPeriodicUpdateChecks');\n\n await swRegistration.update();\n }, parseDuration(options.timeForAutoUpdate));\n }\n }\n catch (error) {\n logger.error('registerServiceWorker', 'registration_failed', {error});\n serviceWorkerSignal.notify({event: 'service_worker_register_failed'});\n }\n}\n\n/**\n * Handle the 'updatefound' event\n *\n * @param serviceWorker - The service worker\n */\nfunction serviceWorkerUpdateFoundHandler(serviceWorker: ServiceWorker | null): void {\n if (serviceWorker == null) return;\n logger.logMethod?.('swUpdateFound');\n\n // Only notify update found if there's an existing controller\n if (navigator.serviceWorker.controller) {\n serviceWorkerSignal.notify({event: 'service_worker_update_found'});\n }\n else {\n serviceWorkerSignal.notify({event: 'service_worker_first_install'});\n }\n\n serviceWorker.addEventListener('statechange', () => serviceWorkerStateChangeHandler(serviceWorker));\n}\n\n/**\n * Handle the 'statechange' event.\n *\n * If the service worker state is 'installed' then it is either a new install or an update.\n * If the service worker state is 'redundant' then the service worker is redundant.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/state\n *\n * @param serviceWorker - The service worker.\n */\nfunction serviceWorkerStateChangeHandler(serviceWorker: ServiceWorker): void {\n logger.logMethodArgs?.('serviceWorkerStateChangeHandler', {state: serviceWorker.state});\n\n if (serviceWorker.state === 'installed') {\n // if old controller available then its update else its new install\n if (navigator.serviceWorker.controller) {\n serviceWorkerSignal.notify({event: 'service_worker_updated'});\n }\n else {\n serviceWorkerSignal.notify({event: 'service_worker_installed'});\n }\n }\n else if (serviceWorker.state === 'redundant') {\n logger.accident('serviceWorkerStateChangeHandler', 'sw_redundant', 'Service worker redundant');\n serviceWorkerSignal.notify({event: 'service_worker_update_failed'});\n }\n}\n"],
5
+ "mappings": ";;;AAAA,SAAQ,oBAAmB;AAC3B,SAAQ,oBAAmB;AAC3B,SAAQ,qBAAoB;AAC5B,SAAQ,qBAAmC;AAc3C,aAAc,eAAc,IAAI,yBAAkB,eAAmB;AAErE,IAAM,SAAyB,6BAAa,uBAAgB;AAcrD,IAAM,sBAAsC,oBAAI,aAA0C;AAAA,EAC/F,MAAM;AACR,CAAC;AAsBD,eAAsB,sBAAsB,SAAmF;AAC7H,SAAO,gBAAgB,yBAAyB,EAAC,QAAO,CAAC;AACzD,MAAI,mBAAmB,cAAc,OAAO;AAC1C,WAAO,WAAW,yBAAyB,8BAA8B;AACzE;AAAA,EACF;AAEA,MAAI;AACF,UAAM,iBAAiB,MAAM,UAAU,cAAc,SAAS,QAAQ,iBAAiB;AACvF,wBAAoB,OAAO,EAAC,OAAO,4BAA2B,CAAC;AAC/D,mBAAe,iBAAiB,eAAe,MAAM,gCAAgC,eAAe,UAAU,CAAC;AAC/G,WAAO,WAAW,4BAA4B;AAE9C,QAAI,QAAQ,qBAAqB,MAAM;AACrC,kBAAY,YAAY;AACtB,eAAO,WAAW,2BAA2B;AAE7C,cAAM,eAAe,OAAO;AAAA,MAC9B,GAAG,cAAc,QAAQ,iBAAiB,CAAC;AAAA,IAC7C;AAAA,EACF,SACO,OAAO;AACZ,WAAO,MAAM,yBAAyB,uBAAuB,EAAC,MAAK,CAAC;AACpE,wBAAoB,OAAO,EAAC,OAAO,iCAAgC,CAAC;AAAA,EACtE;AACF;AAOA,SAAS,gCAAgC,eAA2C;AAClF,MAAI,iBAAiB,KAAM;AAC3B,SAAO,YAAY,eAAe;AAGlC,MAAI,UAAU,cAAc,YAAY;AACtC,wBAAoB,OAAO,EAAC,OAAO,8BAA6B,CAAC;AAAA,EACnE,OACK;AACH,wBAAoB,OAAO,EAAC,OAAO,+BAA8B,CAAC;AAAA,EACpE;AAEA,gBAAc,iBAAiB,eAAe,MAAM,gCAAgC,aAAa,CAAC;AACpG;AAYA,SAAS,gCAAgC,eAAoC;AAC3E,SAAO,gBAAgB,mCAAmC,EAAC,OAAO,cAAc,MAAK,CAAC;AAEtF,MAAI,cAAc,UAAU,aAAa;AAEvC,QAAI,UAAU,cAAc,YAAY;AACtC,0BAAoB,OAAO,EAAC,OAAO,yBAAwB,CAAC;AAAA,IAC9D,OACK;AACH,0BAAoB,OAAO,EAAC,OAAO,2BAA0B,CAAC;AAAA,IAChE;AAAA,EACF,WACS,cAAc,UAAU,aAAa;AAC5C,WAAO,SAAS,mCAAmC,gBAAgB,0BAA0B;AAC7F,wBAAoB,OAAO,EAAC,OAAO,+BAA8B,CAAC;AAAA,EACpE;AACF;",
6
6
  "names": []
7
7
  }
package/docs/README.md ADDED
@@ -0,0 +1,19 @@
1
+ # @nexim/service-worker
2
+
3
+ ## Type Aliases
4
+
5
+ | Type alias | Description |
6
+ | -------------------------------------------------------- | ----------------------------------------------------- |
7
+ | [ServiceWorkerEvent](type-aliases/ServiceWorkerEvent.md) | The events that can be emitted by the service worker. |
8
+
9
+ ## Variables
10
+
11
+ | Variable | Description |
12
+ | ------------------------------------------------------- | --------------------------------- |
13
+ | [serviceWorkerSignal](variables/serviceWorkerSignal.md) | Signal for service worker events. |
14
+
15
+ ## Functions
16
+
17
+ | Function | Description |
18
+ | ----------------------------------------------------------- | ----------------------------------------------- |
19
+ | [registerServiceWorker](functions/registerServiceWorker.md) | Register the service worker and handle updates. |
@@ -0,0 +1,33 @@
1
+ [@nexim/service-worker](../README.md) / registerServiceWorker
2
+
3
+ # Function: registerServiceWorker()
4
+
5
+ > **registerServiceWorker**(`options`: `object`): `Promise`\<`void`\>
6
+
7
+ Register the service worker and handle updates.
8
+
9
+ ## Parameters
10
+
11
+ | Parameter | Type | Description |
12
+ | ---------------------------- | --------------------------------------------------------------------- | --------------------------------------------------------------------------- |
13
+ | `options` | \{ `serviceWorkerPath`: `string`; `timeForAutoUpdate`: `Duration`; \} | An object containing the service worker path and optional auto-update time. |
14
+ | `options.serviceWorkerPath` | `string` | - |
15
+ | `options.timeForAutoUpdate`? | `Duration` | - |
16
+
17
+ ## Returns
18
+
19
+ `Promise`\<`void`\>
20
+
21
+ ## Example
22
+
23
+ ```ts
24
+ import {registerServiceWorker} from '@nexim/service-worker';
25
+
26
+ const serviceWorkerPath = '/service-worker.js';
27
+
28
+ // without auto update
29
+ registerServiceWorker({serviceWorkerPath});
30
+
31
+ // with auto update
32
+ registerServiceWorker({serviceWorkerPath, timeForAutoUpdate: '10m'});
33
+ ```
@@ -0,0 +1,7 @@
1
+ [@nexim/service-worker](../README.md) / ServiceWorkerEvent
2
+
3
+ # Type Alias: ServiceWorkerEvent
4
+
5
+ > **ServiceWorkerEvent**: `"service_worker_registered"` \| `"service_worker_register_failed"` \| `"service_worker_first_install"` \| `"service_worker_updated"` \| `"service_worker_installed"` \| `"service_worker_update_found"` \| `"service_worker_update_failed"`
6
+
7
+ The events that can be emitted by the service worker.
@@ -0,0 +1,17 @@
1
+ [@nexim/service-worker](../README.md) / serviceWorkerSignal
2
+
3
+ # Variable: serviceWorkerSignal
4
+
5
+ > `const` **serviceWorkerSignal**: `AlwatrSignal`\<\{ `event`: [`ServiceWorkerEvent`](../type-aliases/ServiceWorkerEvent.md); \}\>
6
+
7
+ Signal for service worker events.
8
+
9
+ ## Example
10
+
11
+ ```ts
12
+ import {serviceWorkerSignal} from '@nexim/service-worker';
13
+
14
+ serviceWorkerSignal.subscribe(({event}) => {
15
+ console.log('Service worker event:', event);
16
+ });
17
+ ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nexim/service-worker",
3
- "version": "1.0.3",
3
+ "version": "2.0.0-alpha.0",
4
4
  "description": "Utilities to simplify the usage of service workers in your web applications.",
5
5
  "keywords": [
6
6
  "worker",
@@ -40,20 +40,25 @@
40
40
  ],
41
41
  "scripts": {
42
42
  "build": "wireit",
43
+ "doc": "wireit",
43
44
  "test": "wireit",
44
45
  "watch": "wireit"
45
46
  },
46
47
  "dependencies": {
47
48
  "@alwatr/flux": "^4.0.2",
48
49
  "@alwatr/logger": "^5.0.0",
49
- "@alwatr/package-tracer": "^5.0.0"
50
+ "@alwatr/package-tracer": "^5.0.0",
51
+ "@alwatr/parse-duration": "^5.0.0"
50
52
  },
51
53
  "devDependencies": {
52
54
  "@alwatr/nano-build": "^5.0.0",
53
55
  "@alwatr/type-helper": "^5.0.0",
54
56
  "@nexim/typescript-config": "^2.0.0",
55
57
  "ava": "^6.2.0",
56
- "typescript": "^5.7.2",
58
+ "typedoc": "^0.27.6",
59
+ "typedoc-plugin-markdown": "^4.4.1",
60
+ "typedoc-plugin-no-inherit": "^1.5.0",
61
+ "typescript": "^5.7.3",
57
62
  "wireit": "^0.14.9"
58
63
  },
59
64
  "publishConfig": {
@@ -97,7 +102,10 @@
97
102
  "watch:es": {
98
103
  "command": "nano-build --preset=module --watch",
99
104
  "service": true
105
+ },
106
+ "doc": {
107
+ "command": "typedoc"
100
108
  }
101
109
  },
102
- "gitHead": "67de35829cde30ef70d87361d7f104762f6ccfd5"
110
+ "gitHead": "5862c1b0a19bbdd7318268e3a88f20735f3f5bde"
103
111
  }