diff --git a/.eslintrc b/.eslintrc
deleted file mode 100644
index 03ade47fb..000000000
--- a/.eslintrc
+++ /dev/null
@@ -1,39 +0,0 @@
-{
- "parser": "@typescript-eslint/parser",
- "extends": [
- "eslint:recommended",
- "plugin:@typescript-eslint/eslint-recommended",
- "plugin:@typescript-eslint/recommended", // uses the recommended rules from the @typescript-eslint/eslint-plugin
- "plugin:jest/recommended" // enables eslint-plugin-jest
- ],
- "plugins": ["import", "import-newlines"],
- "parserOptions": {
- "ecmaVersion": 2018,
- "sourceType": "module"
- },
- "ignorePatterns": [
- "bin/",
- "lib/"
- ],
- "rules": {
- "quotes": ["error", "double"],
- "indent": ["error", 2, { "SwitchCase": 1 }],
- "linebreak-style": ["error", "unix"],
- "semi": ["error", "always"],
-
- "comma-dangle": ["error", "always-multiline"],
- "dot-notation": "error",
- "eqeqeq": ["error", "always", {"null": "ignore"}],
- "curly": ["error", "all"],
- "brace-style": ["error"],
-
- "import/order": ["warn", { "alphabetize": { "order": "asc" }, "newlines-between": "never" }],
- "import/prefer-default-export": "off",
- "import-newlines/enforce": ["error", 3],
- "@typescript-eslint/no-unused-vars": ["error", { "caughtErrors": "none" }],
-
- "@typescript-eslint/no-unsafe-declaration-merging": "off",
-
- "@typescript-eslint/no-non-null-assertion": "off" // currently disabled, hap-nodejs has some bad typing (like getCharacteristic) for this to be enabled
- }
-}
diff --git a/.github/labeler.yml b/.github/labeler.yml
index 98f259891..8ef4615df 100644
--- a/.github/labeler.yml
+++ b/.github/labeler.yml
@@ -1,11 +1,11 @@
# Add 'beta' label to any PR where the head branch name starts with `beta` or has a `beta` section in the name
beta:
- - base-branch: ['^beta', 'beta', 'beta*']
+ - base-branch: [^beta, beta, 'beta*']
# Add 'alpha' label to any PR where the head branch name starts with `alpha` or has an `alpha` section in the name
alpha:
- - base-branch: ['^alpha', 'alpha', 'alpha*']
+ - base-branch: [^alpha, alpha, 'alpha*']
# Add 'latest' label to any PR where the head branch name starts with `latest` or has a `latest` section in the name
latest:
- - base-branch: ['^latest', 'latest', 'latest*']
+ - base-branch: [^latest, latest, 'latest*']
diff --git a/.github/workflows/alpha-release.yml b/.github/workflows/alpha-release.yml
index c828339cb..9a4273715 100644
--- a/.github/workflows/alpha-release.yml
+++ b/.github/workflows/alpha-release.yml
@@ -8,12 +8,12 @@ on:
jobs:
publish:
if: ${{ github.repository == 'homebridge/homebridge' }}
- uses: homebridge/.github/.github/workflows/npm-publish.yml@latest
+ uses: homebridge/.github/.github/workflows/npm-publish-esm.yml@latest
with:
- tag: 'alpha'
+ tag: alpha
dynamically_adjust_version: true
- npm_version_command: 'pre'
- pre_id: 'alpha'
+ npm_version_command: pre
+ pre_id: alpha
secrets:
npm_auth_token: ${{ secrets.npm_token }}
@@ -22,9 +22,9 @@ jobs:
needs: [publish]
uses: homebridge/.github/.github/workflows/discord-webhooks.yml@latest
with:
- title: "Homebridge Alpha Release"
+ title: Homebridge Alpha Release
description: |
Version `v${{ needs.publish.outputs.NPM_VERSION }}`
- url: "https://github.com/homebridge/homebridge/releases/tag/v${{ needs.publish.outputs.NPM_VERSION }}"
+ url: 'https://github.com/homebridge/homebridge/releases/tag/v${{ needs.publish.outputs.NPM_VERSION }}'
secrets:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_URL_BETA }}
diff --git a/.github/workflows/beta-release.yml b/.github/workflows/beta-release.yml
index 4aca52288..1c309a417 100644
--- a/.github/workflows/beta-release.yml
+++ b/.github/workflows/beta-release.yml
@@ -21,23 +21,23 @@ jobs:
if: ${{ github.repository == 'homebridge/homebridge' }}
- uses: homebridge/.github/.github/workflows/npm-publish.yml@latest
+ uses: homebridge/.github/.github/workflows/npm-publish-esm.yml@latest
with:
- tag: 'beta'
+ tag: beta
dynamically_adjust_version: true
- npm_version_command: 'pre'
- pre_id: 'beta'
+ npm_version_command: pre
+ pre_id: beta
secrets:
npm_auth_token: ${{ secrets.npm_token }}
github-releases-to-discord:
name: Discord Webhooks
- needs: [build_and_test,publish]
+ needs: [build_and_test, publish]
uses: homebridge/.github/.github/workflows/discord-webhooks.yml@latest
with:
- title: "Homebridge Beta Release"
+ title: Homebridge Beta Release
description: |
Version `v${{ needs.publish.outputs.NPM_VERSION }}`
- url: "https://github.com/homebridge/homebridge/releases/tag/v${{ needs.publish.outputs.NPM_VERSION }}"
+ url: 'https://github.com/homebridge/homebridge/releases/tag/v${{ needs.publish.outputs.NPM_VERSION }}'
secrets:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_URL_BETA }}
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index a3faf80d9..ca3f3f004 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -1,10 +1,10 @@
-name: "CodeQL"
+name: CodeQL
on:
push:
- branches: [ latest, beta* ]
+ branches: [latest, beta*]
pull_request:
- branches: [ latest, beta* ]
+ branches: [latest, beta*]
schedule:
- cron: '17 9 * * 2'
diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml
index c35bc3ef5..e20474eb8 100644
--- a/.github/workflows/labeler.yml
+++ b/.github/workflows/labeler.yml
@@ -9,4 +9,4 @@ jobs:
stale:
uses: homebridge/.github/.github/workflows/labeler.yml@latest
secrets:
- token: ${{ secrets.GITHUB_TOKEN }}
\ No newline at end of file
+ token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 698c2b986..1046cb435 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -19,18 +19,18 @@ jobs:
if: ${{ github.repository == 'homebridge/homebridge' }}
- uses: homebridge/.github/.github/workflows/npm-publish.yml@latest
+ uses: homebridge/.github/.github/workflows/npm-publish-esm.yml@latest
secrets:
npm_auth_token: ${{ secrets.npm_token }}
github-releases-to-discord:
name: Discord Webhooks
- needs: [build_and_test,publish]
+ needs: [build_and_test, publish]
uses: homebridge/.github/.github/workflows/discord-webhooks.yml@latest
with:
- title: "Homebridge Release"
+ title: Homebridge Release
description: |
Version `v${{ needs.publish.outputs.NPM_VERSION }}`
- url: "https://github.com/homebridge/homebridge/releases/tag/v${{ needs.publish.outputs.NPM_VERSION }}"
+ url: 'https://github.com/homebridge/homebridge/releases/tag/v${{ needs.publish.outputs.NPM_VERSION }}'
secrets:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_URL_LATEST }}
diff --git a/.github/workflows/wiki-change-notification.yml b/.github/workflows/wiki-change-notification.yml
index 1089f163b..aaf9b8d70 100644
--- a/.github/workflows/wiki-change-notification.yml
+++ b/.github/workflows/wiki-change-notification.yml
@@ -7,7 +7,7 @@ jobs:
notify:
runs-on: ubuntu-latest
steps:
- - uses: 'oznu/gh-wiki-edit-discord-notification@main'
+ - uses: oznu/gh-wiki-edit-discord-notification@main
with:
discord-webhook-url: ${{ secrets.DISCORD_WEBHOOK_WIKI_EDIT }}
ignore-collaborators: true
diff --git a/.gitignore b/.gitignore
index 0dcf9fad0..7d85ca2bb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,7 +13,7 @@ coverage/
# Ignore any extra plugins in the example directory that aren't in Git already
# (this is a sandbox for the user)
example-plugins
-lib
+dist
.idea
diff --git a/.vscode/settings.json b/.vscode/settings.json
index db348fbda..3aa491f03 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,3 +1,3 @@
{
- "codeQL.githubDatabase.download": "never"
-}
\ No newline at end of file
+ "codeQL.githubDatabase.download": "never"
+}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d3f31bf1e..360ba93f4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,7 +2,7 @@
All notable changes to `homebridge` will be documented in this file. This project tries to adhere to [Semantic Versioning](http://semver.org/).
-## v1.8.4 (2024-07-19)
+## BETA
### ⚠️ Breaking Changes
@@ -23,10 +23,14 @@ All notable changes to `homebridge` will be documented in this file. This projec
- remove deprecated `--remove-orphans` flag
- Update `typedoc` and refresh documentation
- Update dependencies + lint
+- general code modernisation:
+ - move from `commonjs` to `esm` modules
+ - use lint rules from `@antfu/eslint-config`
+ - migrate from `jest` to `vitest` for testing
### Homebridge Dependencies
-- `hap-nodejs` @ `v1.1.1-beta.0`
+- `hap-nodejs` @ `v1.1.1-beta.2`
## v1.8.4 (2024-07-19)
diff --git a/README.md b/README.md
index 3509fd089..6f490bf72 100644
--- a/README.md
+++ b/README.md
@@ -16,19 +16,19 @@
-**Homebridge** is a lightweight Node.js server you can run on your home network that emulates the iOS HomeKit API. It supports Plugins, which are community-contributed modules that provide a basic bridge from HomeKit to various 3rd-party APIs provided by manufacturers of "smart home" devices.
+**Homebridge** is a lightweight Node.js server you can run on your home network to emulate the HomeKit Accessory Protocol (HAP). It supports plugins, which are community-contributed modules that provide a basic bridge from HomeKit to various 3rd-party APIs provided by manufacturers of "smart home" devices.
Since Siri supports devices added through HomeKit, this means that with Homebridge you can ask Siri to control devices that don't have any support for HomeKit at all. For instance, using just some of the available plugins, you can say:
- * _Siri, unlock the back door._ [pictured to the right]
- * _Siri, open the garage door._
- * _Siri, turn on the coffee maker._
- * _Siri, turn on the living room lights._
- * _Siri, good morning!_
+- _Siri, unlock the back door._ [pictured to the right]
+- _Siri, open the garage door._
+- _Siri, turn on the coffee maker._
+- _Siri, turn on the living room lights._
+- _Siri, good morning!_
You can explore all available plugins at the NPM website by [searching for the keyword `homebridge-plugin`](https://www.npmjs.com/search?q=homebridge-plugin).
-## Community
+## Community
The official Homebridge Discord server and Reddit community are where users can discuss Homebridge and ask for help.
@@ -79,7 +79,7 @@ HomeKit communities can also be found on both [Discord](https://discord.gg/RcV7f
### Docker
-[Install Homebridge on Docker](https://github.com/homebridge/homebridge/wiki/Install-Homebridge-on-Docker)
[Synology](https://github.com/homebridge/docker-homebridge/wiki/Homebridge-on-Synology) | [Unraid](https://github.com/homebridge/docker-homebridge/wiki/Homebridge-on-Unraid) | [QNAP](https://github.com/homebridge/docker-homebridge/wiki/Homebridge-on-QNAP) | [TrueNAS Scale](https://github.com/homebridge/docker-homebridge/wiki/Homebridge-on-TrueNAS-Scale)
+[Install Homebridge on Docker](https://github.com/homebridge/homebridge/wiki/Install-Homebridge-on-Docker)
[Synology](https://github.com/homebridge/docker-homebridge/wiki/Homebridge-on-Synology) | [Unraid](https://github.com/homebridge/docker-homebridge/wiki/Homebridge-on-Unraid) | [QNAP](https://github.com/homebridge/docker-homebridge/wiki/Homebridge-on-QNAP) | [TrueNAS Scale](https://github.com/homebridge/docker-homebridge/wiki/Homebridge-on-TrueNAS-Scale)
---
@@ -97,9 +97,9 @@ HomeKit communities can also be found on both [Discord](https://discord.gg/RcV7f
1. Open the Home
app on your device.
2. Tap the Home tab, then tap
.
-3. Tap *Add Accessory*, then scan the QR code shown in the Homebridge UI or your Homebridge logs.
+3. Tap _Add Accessory_, then scan the QR code shown in the Homebridge UI or your Homebridge logs.
-If the bridge does not have any accessories yet, you may receive a message saying *Additional Set-up Required*, this is ok, as you add plugins they will show up in the Home app without the need to pair again (except for Cameras and TVs).
+If the bridge does not have any accessories yet, you may receive a message saying _Additional Set-up Required_, this is ok, as you add plugins they will show up in the Home app without the need to pair again (except for Cameras and TVs).
Cameras and most TV devices are exposed as separate accessories and each needs to be paired separately. See [this wiki article](https://github.com/homebridge/homebridge/wiki/Connecting-Homebridge-To-HomeKit#how-to-add-homebridge-cameras--tvs) for instructions.
@@ -113,18 +113,17 @@ One final thing to remember is that Siri will almost always prefer its default p
The https://developers.homebridge.io website contains the Homebridge API reference, available service and characteristic types, and plugin examples.
-The [Homebridge Plugin Template](https://github.com/homebridge/homebridge-plugin-template) project provides a base you can use to create your own *platform* plugin.
+The [Homebridge Plugin Template](https://github.com/homebridge/homebridge-plugin-template) project provides a base you can use to create your own _platform_ plugin.
There are many existing plugins you can study; you might start with the [Homebridge Example Plugins](https://github.com/homebridge/homebridge-examples) or a plugin that already implements the device type you need.
When writing your plugin, you'll want Homebridge to load it from your development directory instead of publishing it to `npm` each time. Run this command inside your plugin project folder so your global installation of Homebridge can discover it:
-
```shell
npm link
```
-*You can undo this using the `npm unlink` command.*
+_You can undo this using the `npm unlink` command._
Then start Homebridge in debug mode:
@@ -150,13 +149,13 @@ To fix this, [Reset Homebridge](https://github.com/homebridge/homebridge/wiki/Co
Try the following:
- 1. Swap between the `Bonjour HAP` and `Ciao` mDNS Advertiser options. See [the wiki](https://github.com/homebridge/homebridge/wiki/mDNS-Options) for more details.
- 2. iOS DNS cache has gone stale or gotten misconfigured. To fix this, turn airplane mode on and back off to flush the DNS cache.
+1. Swap between the `Bonjour HAP` and `Ciao` mDNS Advertiser options. See [the wiki](https://github.com/homebridge/homebridge/wiki/mDNS-Options) for more details.
+2. iOS DNS cache has gone stale or gotten misconfigured. To fix this, turn airplane mode on and back off to flush the DNS cache.
### Limitations
- * One bridge can only expose 150 accessories due to a HomeKit limit. You can however run your plugins as a [Child Bridge](https://github.com/homebridge/homebridge/wiki/Child-Bridges) or run [Multiple Homebridge Instances](https://github.com/homebridge/homebridge-config-ui-x/wiki/Homebridge-Service-Command#multiple-instances) to get around this limitation.
- * Once an accessory has been added to the Home app, changing its name via Homebridge won't be automatically reflected in iOS. You must change it via the Home app as well.
+- One bridge can only expose 150 accessories due to a HomeKit limit. You can however run your plugins as a [Child Bridge](https://github.com/homebridge/homebridge/wiki/Child-Bridges) or run [Multiple Homebridge Instances](https://github.com/homebridge/homebridge-config-ui-x/wiki/Homebridge-Service-Command#multiple-instances) to get around this limitation.
+- Once an accessory has been added to the Home app, changing its name via Homebridge won't be automatically reflected in iOS. You must change it via the Home app as well.
## Why Homebridge?
diff --git a/bin/homebridge b/bin/homebridge
index 56dbbaecc..65300ed8c 100755
--- a/bin/homebridge
+++ b/bin/homebridge
@@ -4,14 +4,16 @@
// This executable sets up the environment and runs the HomeBridge CLI.
//
-"use strict";
+import { realpathSync } from 'node:fs'
+import { dirname, join } from 'node:path'
+import process from 'node:process'
+import { fileURLToPath } from 'node:url'
-process.title = "homebridge";
+process.title = 'homebridge'
// Find the HomeBridge lib
-const path = require("path");
-const fs = require("fs");
-const lib = path.join(path.dirname(fs.realpathSync(__filename)), "../lib");
+const __filename = fileURLToPath(import.meta.url)
+const lib = join(dirname(realpathSync(__filename)), '../dist')
// Run HomeBridge
-require(lib + '/cli')();
+import(`${lib}/cli.js`).then(({ default: run }) => run())
diff --git a/config-sample.json b/config-sample.json
index a2ac12638..390ae32e3 100644
--- a/config-sample.json
+++ b/config-sample.json
@@ -7,7 +7,7 @@
"port": 51826,
"pin": "031-45-154"
},
-
+
"description": "This is an example configuration file with one fake accessory and one fake platform. You can use this as a template for creating your own configuration file containing devices you actually own.",
"ports": {
"start": 52100,
@@ -23,8 +23,8 @@
"platforms": [
{
- "platform" : "PhilipsHue",
- "name" : "Hue"
+ "platform": "PhilipsHue",
+ "name": "Hue"
}
]
}
diff --git a/docs/assets/main.js b/docs/assets/main.js
index 35728810f..21a5d74d2 100644
--- a/docs/assets/main.js
+++ b/docs/assets/main.js
@@ -3,7 +3,7 @@ window.translations={"copy":"Copy","copied":"Copied!","normally_hidden":"This me
"use strict";(()=>{var Pe=Object.create;var ie=Object.defineProperty;var Oe=Object.getOwnPropertyDescriptor;var _e=Object.getOwnPropertyNames;var Re=Object.getPrototypeOf,Me=Object.prototype.hasOwnProperty;var Fe=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var De=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of _e(e))!Me.call(t,i)&&i!==n&&ie(t,i,{get:()=>e[i],enumerable:!(r=Oe(e,i))||r.enumerable});return t};var Ae=(t,e,n)=>(n=t!=null?Pe(Re(t)):{},De(e||!t||!t.__esModule?ie(n,"default",{value:t,enumerable:!0}):n,t));var ue=Fe((ae,le)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,u],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index.
`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ol?d+=2:a==l&&(n+=r[u+1]*i[d+1],u+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}if(s.str.length==0&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}s.str.length==1&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),m=s.str.charAt(1),p;m in s.node.edges?p=s.node.edges[m]:(p=new t.TokenSet,s.node.edges[m]=p),s.str.length==1&&(p.final=!0),i.push({node:p,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),l=0;l1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof ae=="object"?le.exports=n():e.lunr=n()}(this,function(){return t})})()});var se=[];function G(t,e){se.push({selector:e,constructor:t})}var U=class{constructor(){this.alwaysVisibleMember=null;this.createComponents(document.body),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible()),document.body.style.display||(this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}createComponents(e){se.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}showPage(){document.body.style.display&&(document.body.style.removeProperty("display"),this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}scrollToHash(){if(location.hash){let e=document.getElementById(location.hash.substring(1));if(!e)return;e.scrollIntoView({behavior:"instant",block:"start"})}}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e&&!Ve(e)){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r,document.querySelector(".col-sidebar").scrollTop=r}}updateIndexVisibility(){let e=document.querySelector(".tsd-index-content"),n=e?.open;e&&(e.open=!0),document.querySelectorAll(".tsd-index-section").forEach(r=>{r.style.display="block";let i=Array.from(r.querySelectorAll(".tsd-index-link")).every(s=>s.offsetParent==null);r.style.display=i?"none":"block"}),e&&(e.open=n)}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(!n)return;let r=n.offsetParent==null,i=n;for(;i!==document.body;)i instanceof HTMLDetailsElement&&(i.open=!0),i=i.parentElement;if(n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let s=document.createElement("p");s.classList.add("warning"),s.textContent=window.translations.normally_hidden,n.prepend(s)}r&&e.scrollIntoView()}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent=window.translations.copied,e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent=window.translations.copy},100)},1e3)})})}};function Ve(t){let e=t.getBoundingClientRect(),n=Math.max(document.documentElement.clientHeight,window.innerHeight);return!(e.bottom<0||e.top-n>=0)}var oe=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var pe=Ae(ue());async function ce(t,e){if(!window.searchData)return;let n=await fetch(window.searchData),r=new Blob([await n.arrayBuffer()]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();t.data=i,t.index=pe.Index.load(i.index),e.classList.remove("loading"),e.classList.add("ready")}function fe(){let t=document.getElementById("tsd-search");if(!t)return;let e={base:t.dataset.base+"/"},n=document.getElementById("tsd-search-script");t.classList.add("loading"),n&&(n.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),n.addEventListener("load",()=>{ce(e,t)}),ce(e,t));let r=document.querySelector("#tsd-search input"),i=document.querySelector("#tsd-search .results");if(!r||!i)throw new Error("The input field or the result list wrapper was not found");i.addEventListener("mouseup",()=>{te(t)}),r.addEventListener("focus",()=>t.classList.add("has-focus")),He(t,i,r,e)}function He(t,e,n,r){n.addEventListener("input",oe(()=>{Ne(t,e,n,r)},200)),n.addEventListener("keydown",i=>{i.key=="Enter"?Be(e,t):i.key=="ArrowUp"?(de(e,n,-1),i.preventDefault()):i.key==="ArrowDown"&&(de(e,n,1),i.preventDefault())}),document.body.addEventListener("keypress",i=>{i.altKey||i.ctrlKey||i.metaKey||!n.matches(":focus")&&i.key==="/"&&(i.preventDefault(),n.focus())}),document.body.addEventListener("keyup",i=>{t.classList.contains("has-focus")&&(i.key==="Escape"||!e.matches(":focus-within")&&!n.matches(":focus"))&&(n.blur(),te(t))})}function te(t){t.classList.remove("has-focus")}function Ne(t,e,n,r){if(!r.index||!r.data)return;e.textContent="";let i=n.value.trim(),s;if(i){let o=i.split(" ").map(a=>a.length?`*${a}*`:"").join(" ");s=r.index.search(o)}else s=[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o`,d=he(l.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(d+=` (score: ${s[o].score.toFixed(2)})`),l.parent&&(d=`
${he(l.parent,i)}.${d}`);let m=document.createElement("li");m.classList.value=l.classes??"";let p=document.createElement("a");p.href=r.base+l.url,p.innerHTML=u+d,m.append(p),p.addEventListener("focus",()=>{e.querySelector(".current")?.classList.remove("current"),m.classList.add("current")}),e.appendChild(m)}}function de(t,e,n){let r=t.querySelector(".current");if(!r)r=t.querySelector(n==1?"li:first-child":"li:last-child"),r&&r.classList.add("current");else{let i=r;if(n===1)do i=i.nextElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);else do i=i.previousElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);i?(r.classList.remove("current"),i.classList.add("current")):n===-1&&(r.classList.remove("current"),e.focus())}}function Be(t,e){let n=t.querySelector(".current");if(n||(n=t.querySelector("li:first-child")),n){let r=n.querySelector("a");r&&(window.location.href=r.href),te(e)}}function he(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(ee(t.substring(s,o)),`${ee(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(ee(t.substring(s))),i.join("")}var je={"&":"&","<":"<",">":">","'":"'",'"':"""};function ee(t){return t.replace(/[&<>"'"]/g,e=>je[e])}var I=class{constructor(e){this.el=e.el,this.app=e.app}};var F="mousedown",ye="mousemove",N="mouseup",J={x:0,y:0},me=!1,ne=!1,qe=!1,D=!1,ve=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(ve?"is-mobile":"not-mobile");ve&&"ontouchstart"in document.documentElement&&(qe=!0,F="touchstart",ye="touchmove",N="touchend");document.addEventListener(F,t=>{ne=!0,D=!1;let e=F=="touchstart"?t.targetTouches[0]:t;J.y=e.pageY||0,J.x=e.pageX||0});document.addEventListener(ye,t=>{if(ne&&!D){let e=F=="touchstart"?t.targetTouches[0]:t,n=J.x-(e.pageX||0),r=J.y-(e.pageY||0);D=Math.sqrt(n*n+r*r)>10}});document.addEventListener(N,()=>{ne=!1});document.addEventListener("click",t=>{me&&(t.preventDefault(),t.stopImmediatePropagation(),me=!1)});var X=class extends I{constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener(N,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(F,n=>this.onDocumentPointerDown(n)),document.addEventListener(N,n=>this.onDocumentPointerUp(n))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(e){D||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!D&&this.active&&e.target.closest(".col-sidebar")){let n=e.target.closest("a");if(n){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substring(0,r.indexOf("#"))),n.href.substring(0,r.length)==r&&setTimeout(()=>this.setActive(!1),250)}}}};var re;try{re=localStorage}catch{re={getItem(){return null},setItem(){}}}var Q=re;var ge=document.head.appendChild(document.createElement("style"));ge.dataset.for="filters";var Y=class extends I{constructor(e){super(e),this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),ge.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; }
-`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=Q.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){Q.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),this.app.filterChanged(),this.app.updateIndexVisibility()}};var Z=class extends I{constructor(e){super(e),this.summary=this.el.querySelector(".tsd-accordion-summary"),this.icon=this.summary.querySelector("svg"),this.key=`tsd-accordion-${this.summary.dataset.key??this.summary.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`;let n=Q.getItem(this.key);this.el.open=n?n==="true":this.el.open,this.el.addEventListener("toggle",()=>this.update());let r=this.summary.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)}),this.update()}update(){this.icon.style.transform=`rotate(${this.el.open?0:-90}deg)`,Q.setItem(this.key,this.el.open.toString())}};function Ee(t){let e=Q.getItem("tsd-theme")||"os";t.value=e,xe(e),t.addEventListener("change",()=>{Q.setItem("tsd-theme",t.value),xe(t.value)})}function xe(t){document.documentElement.dataset.theme=t}var K;function we(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",Le),Le())}async function Le(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let n=await(await fetch(window.navigationData)).arrayBuffer(),r=new Blob([n]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();K=t.dataset.base,K.endsWith("/")||(K+="/"),t.innerHTML="";for(let s of i)Se(s,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function Se(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-accordion`:"tsd-accordion";let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.dataset.key=i.join("$"),o.innerHTML='',be(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let l=a.appendChild(document.createElement("ul"));l.className="tsd-nested-navigation";for(let u of t.children)Se(u,l,i)}else be(t,r,t.class)}function be(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));r.href=K+t.path,n&&(r.className=n),location.pathname===r.pathname&&r.classList.add("current"),t.kind&&(r.innerHTML=``),r.appendChild(document.createElement("span")).textContent=t.text}else e.appendChild(document.createElement("span")).textContent=t.text}G(X,"a[data-toggle]");G(Z,".tsd-accordion");G(Y,".tsd-filter-item input[type=checkbox]");var Te=document.getElementById("tsd-theme");Te&&Ee(Te);var $e=new U;Object.defineProperty(window,"app",{value:$e});fe();we();})();
+`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=Q.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){Q.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),this.app.filterChanged(),this.app.updateIndexVisibility()}};var Z=class extends I{constructor(e){super(e),this.summary=this.el.querySelector(".tsd-accordion-summary"),this.icon=this.summary.querySelector("svg"),this.key=`tsd-accordion-${this.summary.dataset.key??this.summary.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`;let n=Q.getItem(this.key);this.el.open=n?n==="true":this.el.open,this.el.addEventListener("toggle",()=>this.update());let r=this.summary.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)}),this.update()}update(){this.icon.style.transform=`rotate(${this.el.open?0:-90}deg)`,Q.setItem(this.key,this.el.open.toString())}};function Ee(t){let e=Q.getItem("tsd-theme")||"os";t.value=e,xe(e),t.addEventListener("change",()=>{Q.setItem("tsd-theme",t.value),xe(t.value)})}function xe(t){document.documentElement.dataset.theme=t}var K;function we(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",Le),Le())}async function Le(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let n=await(await fetch(window.navigationData)).arrayBuffer(),r=new Blob([n]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();K=t.dataset.base,K.endsWith("/")||(K+="/"),t.innerHTML="";for(let s of i)Se(s,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function Se(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-accordion`:"tsd-accordion";let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.dataset.key=i.join("$"),o.innerHTML='',be(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let l=a.appendChild(document.createElement("ul"));l.className="tsd-nested-navigation";for(let u of t.children)Se(u,l,i)}else be(t,r,t.class)}function be(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));r.href=K+t.path,n&&(r.className=n),location.pathname===r.pathname&&!r.href.includes("#")&&r.classList.add("current"),t.kind&&(r.innerHTML=``),r.appendChild(document.createElement("span")).textContent=t.text}else e.appendChild(document.createElement("span")).textContent=t.text}G(X,"a[data-toggle]");G(Z,".tsd-accordion");G(Y,".tsd-filter-item input[type=checkbox]");var Te=document.getElementById("tsd-theme");Te&&Ee(Te);var $e=new U;Object.defineProperty(window,"app",{value:$e});fe();we();})();
/*! Bundled license information:
lunr/lunr.js:
diff --git a/docs/assets/search.js b/docs/assets/search.js
index 1869135ef..50068dac7 100644
--- a/docs/assets/search.js
+++ b/docs/assets/search.js
@@ -1 +1 @@
-window.searchData = "data:application/octet-stream;base64,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";
\ No newline at end of file
+window.searchData = "data:application/octet-stream;base64,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";
\ No newline at end of file
diff --git a/docs/classes/Logger.html b/docs/classes/Logger.html
index 251c4644a..a314a01b5 100644
--- a/docs/classes/Logger.html
+++ b/docs/classes/Logger.html
@@ -1,5 +1,5 @@
Codestin Search App Index
Constructors
Properties
Optional
Readonly
prefix
prefix?: string
Methods
debug
- debug(message, ...parameters): void
Parameters
- message: string
Rest
...parameters: any[]
Returns void
error
- error(message, ...parameters): void
Parameters
- message: string
Rest
...parameters: any[]
Returns void
info
- info(message, ...parameters): void
Parameters
- message: string
Rest
...parameters: any[]
Returns void
log
- log(level, message, ...parameters): void
Parameters
- level: LogLevel
- message: string
Rest
...parameters: any[]
Returns void
success
- success(message, ...parameters): void
Parameters
- message: string
Rest
...parameters: any[]
Returns void
warn
- warn(message, ...parameters): void
Parameters
- message: string
Rest
...parameters: any[]
Returns void
Static
forceColor
- forceColor(): void
Returns void
Static
setDebugEnabled
- setDebugEnabled(enabled?): void
Constructors
Properties
Optional
Readonly
prefix
prefix?: string
Methods
debug
- debug(message, ...parameters): void
Parameters
- message: string
Rest
...parameters: any[]
Returns void
error
- error(message, ...parameters): void
Parameters
- message: string
Rest
...parameters: any[]
Returns void
info
- info(message, ...parameters): void
Parameters
- message: string
Rest
...parameters: any[]
Returns void
log
- log(level, message, ...parameters): void
Parameters
- level: LogLevel
- message: string
Rest
...parameters: any[]
Returns void
success
- success(message, ...parameters): void
Parameters
- message: string
Rest
...parameters: any[]
Returns void
warn
- warn(message, ...parameters): void
Parameters
- message: string
Rest
...parameters: any[]
Returns void
Static
forceColor
- forceColor(): void
Returns void
Static
setDebugEnabled
- setDebugEnabled(enabled?): void
Returns void
Static
setTimestampEnabled
- setTimestampEnabled(enabled?): void
Returns void
Static
setTimestampEnabled
- setTimestampEnabled(enabled?): void
Returns void
Returns void
+
Logger class
-