diff --git a/.editorconfig b/.editorconfig index 9c73aba..4e0b0da 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,7 +1,17 @@ +root = true + [*] -charset=utf-8 -end_of_line=lf -trim_trailing_whitespace=true -insert_final_newline=true -indent_style=space -indent_size=2 +indent_style = tab +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = false + +[*.yml] +indent_style = space +indent_size = 2 + +[*.{js,ts,cjs,mjs}] +indent_style = space +indent_size = 2 \ No newline at end of file diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index 1c9f435..0000000 --- a/.eslintrc.cjs +++ /dev/null @@ -1,25 +0,0 @@ -module.exports = { - root: true, - extends: ['@hokify'], - parserOptions: { - project: './tsconfig.eslint.json' - }, - overrides: [ - { - files: ['*ts'], - rules: { - '@typescript-eslint/ban-ts-comment': 'off', - }, - }, - { - files: ['*.test.ts'], - env: { - mocha: true - }, - rules: { - '@typescript-eslint/no-unused-expressions': 'off', - 'import/no-relative-packages': 'off' - } - } - ] -}; diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..6313b56 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/.github/renovate.json b/.github/renovate.json new file mode 100644 index 0000000..36e148f --- /dev/null +++ b/.github/renovate.json @@ -0,0 +1,24 @@ +{ + "extends": ["config:recommended", ":semanticCommits"], + "timezone": "Europe/Paris", + "schedule": ["before 4:00 am on the first day of the month"], + "rangeStrategy": "bump", + "packageRules": [ + { + "matchDatasources": ["npm"], + "minimumReleaseAge": "3 days" + }, + { + "matchDatasources": ["npm"], + "matchPackageNames": ["*"], + "matchUpdateTypes": ["minor", "patch"], + "groupName": "all non-major dependencies", + "groupSlug": "all-minor-patch", + "automerge": true, + "automergeType": "pr", + "automergeStrategy": "squash" + } + ], + "ignoreDeps": [], + "ignorePaths": [] +} diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 0000000..c7be3b4 --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,70 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [main] + pull_request: + # The branches below must be a subset of the branches above + branches: [main] + schedule: + - cron: "20 18 * * 0" + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: ["javascript"] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] + # Learn more about CodeQL language support at https://git.io/codeql-language-support + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v3 + + # ℹ️ Command-line programs to run using the OS shell. + # πŸ“š https://git.io/JvXDl + + # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + #- run: | + # make bootstrap + # make release + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/gh-publish.yml b/.github/workflows/gh-publish.yml new file mode 100644 index 0000000..1c279c3 --- /dev/null +++ b/.github/workflows/gh-publish.yml @@ -0,0 +1,32 @@ +name: Publish Package to GitHub Packages + +on: + release: + types: [created] + +jobs: + publish: + name: Publish Package to GitHub Packages + runs-on: ubuntu-latest + + permissions: + contents: read + packages: write + + steps: + - uses: actions/checkout@v4 + + - name: Use Node.js 20 + uses: actions/setup-node@v4 + with: + node-version: "20" + registry-url: "https://npm.pkg.github.com" + scope: "@lesjoursfr" + + - run: npm install + + - run: npm run build + + - run: npm publish + env: + NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml index ea56add..1c91740 100644 --- a/.github/workflows/npm-publish.yml +++ b/.github/workflows/npm-publish.yml @@ -1,34 +1,27 @@ -name: Node.js package +name: Publish Package to npmjs on: release: types: [created] jobs: - publish-npm: - name: Publish to npm + publish: + name: Publish Package to npmjs runs-on: ubuntu-latest - permissions: - contents: read - id-token: write + steps: - uses: actions/checkout@v4 - - uses: actions/setup-node@v3 - with: - node-version: 20 - registry-url: https://registry.npmjs.org/ - cache: npm - - name: Installing dependencies - run: npm ci + - name: Use Node.js 20 + uses: actions/setup-node@v4 + with: + node-version: "20" + registry-url: "https://registry.npmjs.org" - - run: npm version ${TAG_NAME} --git-tag-version=false - env: - TAG_NAME: ${{ github.event.release.tag_name }} + - run: npm install - - name: Build - run: npm run build + - run: npm run build - - run: npm whoami; npm --ignore-scripts publish --provenance --access public + - run: npm publish env: - NODE_AUTH_TOKEN: ${{secrets.npm_token}} + NODE_AUTH_TOKEN: ${{ secrets.NPM_LESJOURS_TOKEN }} diff --git a/.github/workflows/quality-control.yml b/.github/workflows/quality-control.yml new file mode 100644 index 0000000..4f1c849 --- /dev/null +++ b/.github/workflows/quality-control.yml @@ -0,0 +1,32 @@ +name: QC Checks + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + checks: + name: QC Checks + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Use Node.js 20 + uses: actions/setup-node@v4 + with: + node-version: "20" + + - name: Install + run: npm install + + - name: ESLint checks + run: npm run check-lint + + - name: Prettier checks + run: npm run check-format + + - name: TSC checks + run: npm run check-tsc diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index 657b671..0000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,50 +0,0 @@ -name: Run tests -on: [push, pull_request, workflow_dispatch] - -jobs: - test: - runs-on: ubuntu-latest - strategy: - matrix: - node-version: [18, 20, 21] - mongodb-version: [6.0, 7.0] - steps: - - name: Git checkout - uses: actions/checkout@v4 - - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v4 - with: - node-version: ${{ matrix.node-version }} - - - name: Start MongoDB - uses: supercharge/mongodb-github-action@1.6.0 - with: - mongodb-version: ${{ matrix.mongodb-version }} - - - name: Cache node modules - uses: actions/cache@v4 - env: - cache-name: cache-node-modules - with: - # npm cache files are stored in `~/.npm` on Linux/macOS - path: ~/.npm - key: ${{ runner.os }}-build-agenda-${{ hashFiles('**/package-lock.lock') }} - restore-keys: | - ${{ runner.os }}-build-agenda- - - - name: Install Packages - run: npm ci - - - name: Run Lint - run: npm run lint - - - name: Build - run: npm run build - env: - CI: true - - - name: Test - run: npm test - env: - CI: true diff --git a/.gitignore b/.gitignore index bd4da41..23d3869 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,15 @@ -node_modules -coverage.html -.idea -.DS_Store -docs/agenda/* -!docs/agenda/1.0.3/ -!docs/agenda/2.0.0/ -!docs/agenda/2.2.0/ -!docs/agenda/3.1.0/ -!docs/agenda/4.x/ -!docs/agenda/6.x/ -dist -.nyc_output -coverage -*.tsbuildinfo +# Generated files +lib + +# Yarn lockfile +yarn.lock + +# Yarn & node.js dependencies +node_modules/ +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions \ No newline at end of file diff --git a/.mocharc.json b/.mocharc.json new file mode 100644 index 0000000..849166f --- /dev/null +++ b/.mocharc.json @@ -0,0 +1,6 @@ +{ + "extension": ["ts"], + "spec": "tests/**/*.spec.ts", + "require": "ts-node/register", + "timeout": 25000 +} diff --git a/.mocharc.jsonc b/.mocharc.jsonc deleted file mode 100644 index 4ce8368..0000000 --- a/.mocharc.jsonc +++ /dev/null @@ -1,13 +0,0 @@ -{ - "diff": true, - "spec": "./test/*.test.ts", - "import": ["tsx/esm"], - "extension": ["js", "ts"], - "package": "./package.json", - "recursive": true, - "reporter": "spec", - "slow": 75, - "timeout": 25000, - "ui": "bdd", - "exit": true -} diff --git a/.npmignore b/.npmignore index 100e236..fb312d8 100644 --- a/.npmignore +++ b/.npmignore @@ -1,12 +1,12 @@ +.github +.vscode +.yarn +node_modules .editorconfig -.idea -.jsdoc.json +.eslintignore +.eslintrc.json +.gitattributes .travis.yml -agenda.svg -docs -.nyc_output -coverage -History.md -Makefile -renovate.json -test +.yarnrc.yml +tsconfig.json +.whitesource \ No newline at end of file diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..43c97e7 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +package-lock=false diff --git a/.nycrc b/.nycrc deleted file mode 100644 index 0dfbc82..0000000 --- a/.nycrc +++ /dev/null @@ -1,19 +0,0 @@ -{ - "extends": "@istanbuljs/nyc-config-typescript", - "all": false, - "include": [ - "src" - ], - "exclude": [ - ".eslintrc.js", - "index.js", - "docs", - "coverage", - "test" - ], - "reporter": [ - "text", - "lcov", - "text-summary" - ] -} \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..8e420b7 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,9 @@ +# Generated files +lib +docs + +# Yarn & node.js dependencies +package.json +node_modules/ +.pnp.* +.yarn/* \ No newline at end of file diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 9cd30a9..0000000 --- a/.prettierrc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "printWidth": 100, - "singleQuote": true, - "useTabs": true, - "trailingComma": "none", - "arrowParens": "avoid" -} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..508a6f7 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Tests", + "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/mocha", + "runtimeArgs": [], + "outputCapture": "std", + "skipFiles": ["/**/*.js"] + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..6c56f76 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,41 @@ +{ + "search.exclude": { + "**/.git/**": true, + "**/node_modules/**": true, + "**/.yarn/**": true, + "**/lib/**": true + }, + "files.exclude": { + "**/.git/**": true, + "**/node_modules/**": true, + "**/.yarn/**": true, + "**/lib/**": true + }, + "files.watcherExclude": { + "**/.git/**": true, + "**/node_modules/**": true, + "**/.yarn/**": true, + "**/lib/**": true + }, + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.codeActionsOnSave": { + "source.fixAll": "explicit", + "source.organizeImports": "explicit" + }, + "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "eslint.enable": true, + "eslint.validate": [ + "javascript", + "javascriptreact", + "typescript", + "typescriptreact" + ], + "prettier.configPath": "prettier.config.mjs", + "prettier.ignorePath": ".prettierignore" +} diff --git a/.whitesource b/.whitesource new file mode 100644 index 0000000..55b922e --- /dev/null +++ b/.whitesource @@ -0,0 +1,12 @@ +{ + "scanSettings": { + "baseBranches": [] + }, + "checkRunSettings": { + "vulnerableCheckRunConclusionLevel": "failure", + "displayMode": "diff" + }, + "issueSettings": { + "minSeverityLevel": "LOW" + } +} \ No newline at end of file diff --git a/.yarnrc.yml b/.yarnrc.yml new file mode 100644 index 0000000..e16af01 --- /dev/null +++ b/.yarnrc.yml @@ -0,0 +1,7 @@ +compressionLevel: mixed + +enableGlobalCache: true + +enableScripts: true + +nodeLinker: node-modules diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 3cbddf5..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,975 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. - -## [6.3.0](https://github.com/hokify/agenda/compare/v6.2.13...v6.3.0) (2022-12-09) - - -### Features - -* add localLockLimitReached ([af90bcb](https://github.com/hokify/agenda/commit/af90bcb333902e0699361dace4c680b9c57ebd7c)) - - -### Bug Fixes - -* add error message to forked child and give it a chance to die ([7cf3c57](https://github.com/hokify/agenda/commit/7cf3c57c618ce8f3ae47571724fe6d087418fa5e)) - -### [6.2.13](https://github.com/hokify/agenda/compare/v6.2.12...v6.2.13) (2022-11-17) - - -### Bug Fixes - -* ready and error events are allowed wihtin sub workers ([cb4228c](https://github.com/hokify/agenda/commit/cb4228c21c4d96be8425c420650671de6b518b8d)) -* use definition keys for status list ([485060a](https://github.com/hokify/agenda/commit/485060a2813cbfd231e709495db52a0879bd057c)) - -### [6.2.12](https://github.com/hokify/agenda/compare/v6.2.11...v6.2.12) (2022-08-02) - - -### Bug Fixes - -* improve error message for on handler ([92d42ca](https://github.com/hokify/agenda/commit/92d42ca1e0e0267855c613348ec06a281204dc4b)) - -### [6.2.11](https://github.com/hokify/agenda/compare/v6.2.10...v6.2.11) (2022-05-23) - - -### Bug Fixes - -* bind correct context to process ([cf70739](https://github.com/hokify/agenda/commit/cf707396707b36d293eb99a79fbc618b75a54900)) - -### [6.2.10](https://github.com/hokify/agenda/compare/v6.2.9...v6.2.10) (2022-05-23) - - -### Bug Fixes - -* check if lockedAt has been resetted in the meantime ([aa5323b](https://github.com/hokify/agenda/commit/aa5323b5669453761e8a1ddd146df828e6b2b410)) -* improve errors for childs ([8e3b827](https://github.com/hokify/agenda/commit/8e3b8277d839c935e69f31a57177c7f79dbec836)) - -### [6.2.9](https://github.com/hokify/agenda/compare/v6.2.8...v6.2.9) (2022-05-20) - - -### Bug Fixes - -* job timeout check and improve error handling for childs ([b365957](https://github.com/hokify/agenda/commit/b36595745e8b43939f9938b78af8d5a2e033b8fb)) - -### [6.2.8](https://github.com/hokify/agenda/compare/v6.2.7...v6.2.8) (2022-05-11) - - -### Bug Fixes - -* use message bus instead of signal to cancel child ([fcec3a9](https://github.com/hokify/agenda/commit/fcec3a9bf43e36d4d3d81319ac71d1b3b01e16be)) - -### [6.2.7](https://github.com/hokify/agenda/compare/v6.2.6...v6.2.7) (2022-05-11) - - -### Bug Fixes - -* use different appraoch to find definition file ([9d4c60e](https://github.com/hokify/agenda/commit/9d4c60ef7583a3bd27e4ed626624b684079f06bc)) - -### [6.2.6](https://github.com/hokify/agenda/compare/v6.2.5...v6.2.6) (2022-05-10) - - -### Bug Fixes - -* add fork paramters to console ([9f2e7fd](https://github.com/hokify/agenda/commit/9f2e7fd5351dd42a060059fcb03234afb1dd9d8a)) - -### [6.2.5](https://github.com/hokify/agenda/compare/v6.2.4...v6.2.5) (2022-05-10) - - -### Bug Fixes - -* improve exit code error message ([f1a5eb8](https://github.com/hokify/agenda/commit/f1a5eb816de789c64a65a44f9443f286c794caf6)) - -### [6.2.4](https://github.com/hokify/agenda/compare/v6.2.3...v6.2.4) (2022-05-10) - - -### Bug Fixes - -* check if abort controller is supported ([a00d611](https://github.com/hokify/agenda/commit/a00d611839e69318fe5e71cfa600a344c3dc6746)) - -### [6.2.3](https://github.com/hokify/agenda/compare/v6.2.2...v6.2.3) (2022-05-10) - -### [6.2.2](https://github.com/hokify/agenda/compare/v6.2.1...v6.2.2) (2022-05-10) - - -### Bug Fixes - -* allow passing forkMode to every ([ff274ba](https://github.com/hokify/agenda/commit/ff274babb98ed859625986a174bcc27d36346820)) - -### [6.2.1](https://github.com/hokify/agenda/compare/v6.2.0...v6.2.1) (2022-05-10) - - -### Bug Fixes - -* small code cleanups and new flag to toggle ([2a6e5fe](https://github.com/hokify/agenda/commit/2a6e5fe12e40447f1e30f1d53deb99c47ae92e68)) - -## [6.2.0](https://github.com/hokify/agenda/compare/v6.1.1...v6.2.0) (2022-05-09) - - -### Features - -* allow to fork jobs in isolated sub process ([2a68c95](https://github.com/hokify/agenda/commit/2a68c9574e888b8b91196f6b237d901d944340a4)) - -### [6.1.1](https://github.com/hokify/agenda/compare/v6.1.0...v6.1.1) (2022-04-05) - -## [6.1.0](https://github.com/hokify/agenda/compare/v6.0.9...v6.1.0) (2022-03-21) - - -### Features - -* check if job state update was successful before running a job ([606e141](https://github.com/hokify/agenda/commit/606e1413ec939d1e368db4a1af67c86d867b48d5)) - -### [6.0.9](https://github.com/hokify/agenda/compare/v6.0.8...v6.0.9) (2022-03-18) - -### [6.0.8](https://github.com/hokify/agenda/compare/v6.0.7...v6.0.8) (2022-01-10) - -### [6.0.7](https://github.com/hokify/agenda/compare/v6.0.6...v6.0.7) (2021-12-12) - -### [6.0.6](https://github.com/hokify/agenda/compare/v6.0.5...v6.0.6) (2021-12-10) - - -### Bug Fixes - -* ensure locked at is processed as date ([3a5a0c4](https://github.com/hokify/agenda/commit/3a5a0c4123506001c4898020aa489eb8fd20c311)) - -### [6.0.5](https://github.com/hokify/agenda/compare/v6.0.4...v6.0.5) (2021-12-10) - - -### Bug Fixes - -* give the test some more time ([e2cacb5](https://github.com/hokify/agenda/commit/e2cacb533b211ae28a3d4ee278918be4d0f897e9)) -* only update job state fields during job processing ([be8e51b](https://github.com/hokify/agenda/commit/be8e51b197f46d6bf2bf6d36ce7cdcbe6df72cfd)) - -### [6.0.4](https://github.com/hokify/agenda/compare/v6.0.3...v6.0.4) (2021-12-05) - - -### Bug Fixes - -* nextRunAt value can be null ([e39cfd0](https://github.com/hokify/agenda/commit/e39cfd089248a7a235cf69888c9714a99988a75f)) - -### [6.0.3](https://github.com/hokify/agenda/compare/v6.0.2...v6.0.3) (2021-12-03) - - -### Bug Fixes - -* check if job has expired before we run it ([e301511](https://github.com/hokify/agenda/commit/e3015112ad1eb3d4852bae6686494e1316f02267)) - -### [6.0.2](https://github.com/hokify/agenda/compare/v6.0.0...v6.0.2) (2021-10-28) - - -### Bug Fixes - -* changelog for v4 ([dd8b569](https://github.com/hokify/agenda/commit/dd8b569cf8df753d29b6913d6bc8d45403355860)) -* too greedy locking ([26ad106](https://github.com/hokify/agenda/commit/26ad1067d715cd113079f207cc489cbf0adff706)) - -## [6.0.0](https://github.com/hokify/agenda/compare/v5.0.1...v6.0.0) (2021-08-27) - -### ⚠ BREAKING CHANGES -* Upgrade to mongo driver 4 - -### [5.0.1](https://github.com/hokify/agenda/compare/v5.0.0...v5.0.1) (2021-02-12) - - -### Bug Fixes - -* update deps and switch moment-timezone to luxon ([e5eb973](https://github.com/hokify/agenda/commit/e5eb973deaa3e02bc071b26e57edd6735928bb70)) - -## [5.0.0](https://github.com/hokify/agenda/compare/v4.1.6...v5.0.0) (2020-12-06) - - -### ⚠ BREAKING CHANGES - -* Switching from [ncb000gt/node-cron](https://www.npmjs.com/package/cron) to [harrisiirak/cron-parser](https://www.npmjs.com/package/cron-parser) for cron-pattern parsing. - - Previously month was 0-based (0=January). Going forward standard Unix pattern is used, which is 1-based (1=January). - - Please update existing cron-patterns that specify a month (4th position of a pattern). The month is now 1 - 12 - - 1 = January - - 2 = February - - 3... - - | Example | Execute on 1st of January | - |---------|---------------------------| - | Old | 0 0 1 **0** * | - | New | 0 0 1 **1** * | - - old Cron patterns - - ``` - * * * * * * - | | | | | | - | | | | | +-- Year (range: 1900-3000) - | | | | +---- Day of the Week (range: 1-7, 1 standing for Monday) - | | | +------ Month of the Year (range: 0-11) NOTE: Difference here - | | +-------- Day of the Month (range: 1-31) - | +---------- Hour (range: 0-23) - +------------ Minute (range: 0-59) - ``` - - new cron patterns - - ``` - * * * * * * - | | | | | | - | | | | | +-- Year (range: 1900-3000) - | | | | +---- Day of the Week (range: 1-7, 1 standing for Monday) - | | | +------ Month of the Year (range: 1-12) NOTE: Difference here - | | +-------- Day of the Month (range: 1-31) - | +---------- Hour (range: 0-23) - +------------ Minute (range: 0-59) - ``` - -Co-authored-by: Aras Abbasi - -* switching from cron to cron-parser ([#16](https://github.com/hokify/agenda/issues/16)) ([e5c3bf1](https://github.com/hokify/agenda/commit/e5c3bf12d4b5db8ec846b0c9c332e247077d3485)) - -### [4.1.6](https://github.com/hokify/agenda/compare/v4.1.5...v4.1.6) (2020-11-19) - - -### Bug Fixes - -* only unlock jobs with a next run at date on shutdown ([a458aea](https://github.com/hokify/agenda/commit/a458aea0017bf9ddde44f587e6e7da99b456663b)) - -### [4.1.5](https://github.com/hokify/agenda/compare/v4.1.4...v4.1.5) (2020-11-19) - - -### Bug Fixes - -* **jobprocessor:** ensure set timeout is only called once for each job in the queue ([1590224](https://github.com/hokify/agenda/commit/159022495a83980aad82a5244313b8c0e7db9942)) - -### [4.1.4](https://github.com/hokify/agenda/compare/v4.1.3...v4.1.4) (2020-11-18) - - -### Bug Fixes - -* **jobprocessor:** check if set timeout value is valid ([2afaaa3](https://github.com/hokify/agenda/commit/2afaaa3227bf78978024c914dbc4be0c29dff7a9)) - -### [4.1.3](https://github.com/hokify/agenda/compare/v4.1.2...v4.1.3) (2020-10-30) - - -### Bug Fixes - -* only unlock jobs which have a nextRunAt jobs on shutdown ([291f16e](https://github.com/hokify/agenda/commit/291f16e7a32e92d44263ad4399237bef1a2168cb)) -* simplify default values ([35d5424](https://github.com/hokify/agenda/commit/35d5424eb58e6237bac79db6dc81a82eef640f79)) - -### [4.1.2](https://github.com/hokify/agenda/compare/v4.1.1...v4.1.2) (2020-10-25) - - -### Bug Fixes - -* isRunning for non job processor calls ([a5bb965](https://github.com/hokify/agenda/commit/a5bb965a57ffe28db8eae40311e0c102210509fa)) -* wait for start of test job ([413f797](https://github.com/hokify/agenda/commit/413f79753a63f74b6c7a5bb3acf5e2e54e934fab)) - -### [4.1.1](https://github.com/hokify/agenda/compare/v4.1.0...v4.1.1) (2020-10-25) - - -### Bug Fixes - -* isRunning, check if db returns a result ([e6ea7e2](https://github.com/hokify/agenda/commit/e6ea7e2817d7d5a113de80f68c33c62b75a8602a)) - -## [4.1.0](https://github.com/hokify/agenda/compare/v4.0.33...v4.1.0) (2020-10-25) - - -### Features - -* isRunning querys database again if called by client ([1aaaa61](https://github.com/hokify/agenda/commit/1aaaa61f0a009563a84cb81036427c187076f190)) - - -### Bug Fixes - -* job processor handling for recurring jobs could fill up queue and block processing ([54bc53c](https://github.com/hokify/agenda/commit/54bc53c5ab995671e1b38e78f3afb06c82f9a830)) -* job processor localQueueProcessing flag ([413f673](https://github.com/hokify/agenda/commit/413f673ce0cd8a73132853f14feb8ed9f300c4e4)) -* rename err to error, fix typing of DefinitionProcessor, use debug ins… ([#9](https://github.com/hokify/agenda/issues/9)) ([39b598e](https://github.com/hokify/agenda/commit/39b598e24784da6cf640a29c2ce02732786e62fa)) -* use isNaN check in isValidDate ([#10](https://github.com/hokify/agenda/issues/10)) ([3bc2e30](https://github.com/hokify/agenda/commit/3bc2e303d280c19899beacf7c7a732e4a6b08724)) - -### [4.0.33](https://github.com/hokify/agenda/compare/v4.0.32...v4.0.33) (2020-10-24) - - -### Bug Fixes - -* fix outpout of agenda job status details ([82ab1a8](https://github.com/hokify/agenda/commit/82ab1a8bd41eee6e4050c852f05c3fcb0b2d0c4f)) -* fix outpout of agenda job status details ([7b24f88](https://github.com/hokify/agenda/commit/7b24f8872bcbf9179c9905508defffdc01d95373)) -* fix outpout of agenda job status details ([3dc0709](https://github.com/hokify/agenda/commit/3dc0709a9c320175f8f455ef6f00dfb51ae6328a)) - -### [4.0.32](https://github.com/hokify/agenda/compare/v4.0.31...v4.0.32) (2020-10-24) - - -### Bug Fixes - -* logic for datbase connection ([7ee64c1](https://github.com/hokify/agenda/commit/7ee64c1ea6fd2b1f157917a0bdaed2b286510092)) - -### [4.0.31](https://github.com/hokify/agenda/compare/v4.0.30...v4.0.31) (2020-10-23) - - -### Bug Fixes - -* **job-processor:** emit error when db query fails ([9bfabd3](https://github.com/hokify/agenda/commit/9bfabd3359051d04d4664b7821248cab7708b82a)) - -### [4.0.30](https://github.com/hokify/agenda/compare/v4.0.29...v4.0.30) (2020-10-23) - - -### Bug Fixes - -* **job-processor:** emit error when db query fails ([eff80aa](https://github.com/hokify/agenda/commit/eff80aa60de38644235653ab81860915a1e32b17)) - -### [4.0.29](https://github.com/hokify/agenda/compare/v4.0.28...v4.0.29) (2020-10-22) - - -### Bug Fixes - -* more typings ([#5](https://github.com/hokify/agenda/issues/5)) ([8d6e137](https://github.com/hokify/agenda/commit/8d6e13702bc1ce427ddc4cf6d5e7f7502af8db8c)) - -### [4.0.28](https://github.com/hokify/agenda/compare/v4.0.27...v4.0.28) (2020-10-20) - - -### Bug Fixes - -* **tests:** rm console log from debugging ([b211c8e](https://github.com/hokify/agenda/commit/b211c8e7a30c731a3f2c3c9f01603f904bb52660)) - -### [4.0.27](https://github.com/hokify/agenda/compare/v4.0.26...v4.0.27) (2020-10-20) - - -### Bug Fixes - -* **define:** warning if job definition exists already ([3fe9a6d](https://github.com/hokify/agenda/commit/3fe9a6d69e5dd177d513e54f1386980280201369)) -* **job:** ensure agenda is ready before calling save job ([be4c026](https://github.com/hokify/agenda/commit/be4c0268c829676e61a9ad45fcf66d714d8923ca)) -* **test:** cleanup tests ([c5d081a](https://github.com/hokify/agenda/commit/c5d081a5c4be45b44ffc4aba56c0be4b9dcdd714)) -* **test:** debug failed lock expire test ([7d69680](https://github.com/hokify/agenda/commit/7d69680f4d69663037ee238480d96e2788e1f572)) -* **test:** debug failed priority test ([924287c](https://github.com/hokify/agenda/commit/924287c4419a19dfc16ba756e3e064e163b1b048)) -* **test:** fix timeout check ([e92cd85](https://github.com/hokify/agenda/commit/e92cd85c80a1e092405f00066359d595be03ad2f)) -* **typings:** names -> name ([c2ca928](https://github.com/hokify/agenda/commit/c2ca9286abdc46b7aa22024170bf9e73f142a9e9)) - -### [4.0.26](https://github.com/hokify/agenda/compare/v4.0.25...v4.0.26) (2020-10-20) - - -### Bug Fixes - -* **test:** just check if there are almost all jobs running ([b2a5e6e](https://github.com/hokify/agenda/commit/b2a5e6ebf99aa3b1749b671eeadf0c6e08e4bae8)) - -### [4.0.25](https://github.com/hokify/agenda/compare/v4.0.24...v4.0.25) (2020-10-20) - - -### Bug Fixes - -* **jobprocessor:** check for object.fromEntries for node 10 support ([#3](https://github.com/hokify/agenda/issues/3)) ([b8cc61f](https://github.com/hokify/agenda/commit/b8cc61fe1e4199437d65014bff03cab65e6e077f)) -* **jobprocessor:** ensure returnNextConcurrencyFreeJob is not returning same job each time ([11d6606](https://github.com/hokify/agenda/commit/11d6606706d70416a6d28a95dd65ab11576f8e51)) -* **jobprocessor:** set job enqueud to true for future jobs ([a3d4203](https://github.com/hokify/agenda/commit/a3d42032011f868628862942737cdfc1594bb02b)) -* **test:** unlock job test fix ([6446b64](https://github.com/hokify/agenda/commit/6446b64c9f22bbbb2ec098cec5c55ca9d659d439)) -* more typings, minor functionality changes ([#2](https://github.com/hokify/agenda/issues/2)) ([b13d054](https://github.com/hokify/agenda/commit/b13d054889638e218a2706f05512340e764c395b)) - -### [4.0.24](https://github.com/hokify/agenda/compare/v4.0.22...v4.0.24) (2020-10-20) - - -### Bug Fixes - -* **jobprocessor:** improve checkIfJobIsStillAlive ([2919083](https://github.com/hokify/agenda/commit/29190836cdc917eea6dd1f58d650c1d29c29514f)) -* **jobprocessor:** prevent overloading of job queue processing ([9854007](https://github.com/hokify/agenda/commit/98540074fc76c1f8cbed269e239bd2e615629421)) - -### [4.0.22](https://github.com/hokify/agenda/compare/v4.0.21...v4.0.22) (2020-10-16) - - -### Bug Fixes - -* **jobprocessor:** introduce a canceled property to check if job is still alive ([55b63d7](https://github.com/hokify/agenda/commit/55b63d787a3252adca316c97b7b6156ecb45853d)) - -### [4.0.21](https://github.com/hokify/agenda/compare/v2.0.0...v4.0.21) (2020-10-15) - - -### Features - -* add queue size to running stats ([6271781](https://github.com/hokify/agenda/commit/6271781ea564d2d7d58b58b21c4bbc84ac793df1)) -* added [@breejs](https://github.com/breejs) to README ([68ade1d](https://github.com/hokify/agenda/commit/68ade1daa07fa2045e7fbd1be5260b7b43094234)) - - -### Bug Fixes - -* add job name again stats output ([1aa2d4a](https://github.com/hokify/agenda/commit/1aa2d4a916ea3a1b0f573e935f435f7ebcf31cb1)) -* Add try/catch block to agenda#now method ([#876](https://github.com/hokify/agenda/issues/876)) ([8e1fe23](https://github.com/hokify/agenda/commit/8e1fe2336638401f94fdc9ff497b0aec6fb422c4)) -* add types for chai and fix expect in agenda.test.ts ([7d508a9](https://github.com/hokify/agenda/commit/7d508a91219be5a668ce346a277c922a6538128d)) -* add typings for events ([a6c0356](https://github.com/hokify/agenda/commit/a6c0356964eee103299bbee4f8ec3d0f40f5129d)) -* allow data type defintions for jobs ([ef85fc5](https://github.com/hokify/agenda/commit/ef85fc5ab8438539c009e964047a9bc60b984fb6)) -* allow returing details for status ([7a8a5bf](https://github.com/hokify/agenda/commit/7a8a5bf87266eacd84f0e6b5fd1457a7a6b99def)) -* check if job is still alive ([a39c809](https://github.com/hokify/agenda/commit/a39c809b9efff79696b5d7c6f15b726df62dbbe9)) -* ensure check if job is dead is ending sometime :-) ([39950f3](https://github.com/hokify/agenda/commit/39950f38835dd501083d2075a788f176c61e52d9)) -* ensure jobs are filled up till concurrency reached ([1a8bb31](https://github.com/hokify/agenda/commit/1a8bb31fde08b80ba41078930467ab18e82cf386)) -* ensure new jobs are put on the left side of the job processing queue ([30e68ba](https://github.com/hokify/agenda/commit/30e68bad188cf55d34fb0c82f214de50eb997021)) -* export all kind of types ([3bd90dc](https://github.com/hokify/agenda/commit/3bd90dcb1f2a1f50e630f56cd4ba150608dd77af)) -* improve locking and ensure locks are released ([3160f0d](https://github.com/hokify/agenda/commit/3160f0dde049984d4ffaf721c38032376b281edb)) -* make `touch` promise-based ([#667](https://github.com/hokify/agenda/issues/667)) ([0840588](https://github.com/hokify/agenda/commit/0840588935edfb79c49b8f47f3d76083d7836f8d)), closes [/github.com/agenda/agenda/blob/ff94c8a4c9bc564a0bed9eaa79de1c4fdbed0fde/lib/job/touch.js#L10-L13](https://github.com/hokify//github.com/agenda/agenda/blob/ff94c8a4c9bc564a0bed9eaa79de1c4fdbed0fde/lib/job/touch.js/issues/L10-L13) [/github.com/agenda/agenda/blob/bd8a8e003cd09d6e9826accbf6c30be75212a9a9/test/job.js#L352-L364](https://github.com/hokify//github.com/agenda/agenda/blob/bd8a8e003cd09d6e9826accbf6c30be75212a9a9/test/job.js/issues/L352-L364) -* not running jobs even though concurrency is not reached ([0e82025](https://github.com/hokify/agenda/commit/0e82025678679d9c0d083824df955409c04f3956)) -* simplified verbiage ([ee3ce39](https://github.com/hokify/agenda/commit/ee3ce393cbe31318dffc2f3701fd68045bf28a46)) -* simplify unlocking and improve logging ([a70f500](https://github.com/hokify/agenda/commit/a70f5009edd4d689305da6381caa08fec9c37036)) -* skip index creation ([5242736](https://github.com/hokify/agenda/commit/5242736d8e9dd0834d8eee2277f2de7223f52551)) -* tests, agenda-instance should have a smaller processEvery ([b248a2b](https://github.com/hokify/agenda/commit/b248a2b6c0403e6e355da88c96fda7b62e2e08db)) -* try to solve the locking issue ([d2f3b20](https://github.com/hokify/agenda/commit/d2f3b207ee643b804d19226b70e8b0abd0695b06)) -* use new mongo stack ([a2e74a9](https://github.com/hokify/agenda/commit/a2e74a9d86b978d6179a9fcbcf25728c8391175d)) -* **locking:** ensure jobs are not locked too greedy ([5bc123a](https://github.com/hokify/agenda/commit/5bc123a494703ea03108a0ed256aa207f02465bb)) -* **process-jobs:** also add name to lock call ([481ea77](https://github.com/hokify/agenda/commit/481ea77bebbd9cea2966b0cb8f4e401650147633)) -* **update:** when saving a job via _id add job name ([24f6a84](https://github.com/hokify/agenda/commit/24f6a84451e8e4b995a5dcc418f0c1dd26fe8674)) - -3.1.0 / 2020-04-07 -================== - -_Stay safe!_ - -* Fix for skipImmediate resetting nextRunAt to current date ([#860](https://github.com/agenda/agenda/pull/860)) (Thanks @AshlinDuncan!) -* Fix deprecated reconnect options ([#948](https://github.com/agenda/agenda/pull/948)) (Thanks @ekegodigital!) -* Add ability to set a skip when querying jobs. ([#898](https://github.com/agenda/agenda/pull/898)) (Thanks @cjolif!) - -Internal: -* Fixed deprecated MongoDB functions in tests ([#928](https://github.com/agenda/agenda/pull/928)) (Thanks @MichielDeMey!) -* Updated devDependencies - -Thank you @koresar, @sampathBlam, and @MichielDeMey helping to review PRs for this release! πŸ‘ - - -3.0.0 / 2020-02-13 -================== - -* Support MongoDB's Unified Topology Design ([#921](https://github.com/agenda/agenda/pull/921)) (Thanks @viktorzavadil!) -* Fix: check that the new nextRunAt is different that the previous nextRunAt ([#863](https://github.com/agenda/agenda/pull/863)) (Thanks @RaphaelRheault!) -* Update dependencies. Most notably MongoDB driver 3.4 β†’ 3.5 ([#899](https://github.com/agenda/agenda/pull/899), [#900](https://github.com/agenda/agenda/pull/900), [#903](https://github.com/agenda/agenda/pull/903), [#906](https://github.com/agenda/agenda/pull/906), [#908](https://github.com/agenda/agenda/pull/908), [#910](https://github.com/agenda/agenda/pull/910), [#912](https://github.com/agenda/agenda/pull/912), [#913](https://github.com/agenda/agenda/pull/913), [#920](https://github.com/agenda/agenda/pull/920), [#922](https://github.com/agenda/agenda/pull/922)) -* Documentation updates, thanks @MichielDeMey and @Sunghee2. ([#923](https://github.com/agenda/agenda/pull/923) & [#907](https://github.com/agenda/agenda/pull/907)) - -BREAKING --------- - -* Stop testing for Node.js 8. This might still work but we're no longer actively testing for it. ([#925](https://github.com/agenda/agenda/pull/925)) - -2.3.0 / 2019-12-16 -================== - -* Improved performance in situations when there are many "expired" jobs in the database ([#869](https://github.com/agenda/agenda/pull/869)) (Thanks @mfred488!) -* Fix periodic node.js process unhandledRejection ([#887](https://github.com/agenda/agenda/pull/887)) (Thanks @koresar and @Scorpil) -* Update dependencies - -2.2.0 / 2019-11-24 -================== - - * Fix `skipImmediate` option in `.every` ([#861](https://github.com/agenda/agenda/pull/861)) (Thanks @erics2783!) - * Add try/catch block to agenda#now method ([#876](https://github.com/agenda/agenda/pull/876)) (Thanks @sampathBlam!) - * Refactor job queuing mechanism. Agenda n ow guarantees priority when executing jobs scheduled the same datetime. Fixes also some tests. ([#852](https://github.com/agenda/agenda/pull/852)) (Thank you @dmbarreiro!) - * Update dependencies (Kudos @simison!) - Most notably `mongodb` ~3.2.7 -> ~3.3.0 ([changelog](https://github.com/mongodb/node-mongodb-native/tree/v3.3.0)) β€” highlights: - - Mongo DB Server Version 4.2 feature support - - Merged `mongodb-core` into `node-mongodb-native` - - Beta support for MongoDB Client-Side Encryption - - SRV Polling for Sharded Clusters - * Updates to documentation (Thank you @lautarobock, @sampathBlam, @indatawetrust) - -2.1.0 / 2019-09-09 -================== - * Support async functions in job processing ([#653](https://github.com/agenda/agenda/pull/653)) (thanks @princjef!) - * Allow sorting and limiting jobs when searching ([#665](https://github.com/agenda/agenda/pull/665)) (thank you @edwin-jones) - * Update MongoClient connection settings with `useNewUrlParser: true` to remove the deprecation warning. ([#806](https://github.com/agenda/agenda/pull/806)) (thanks @dpawson905!) - * Allow valid date strings when scheduling ([#808](https://github.com/agenda/agenda/pull/808)) (Thanks @wingsbob!) - * Update dependencies ([#820](https://github.com/agenda/agenda/pull/820)) - * Update documentation (kudos @dandv, @pedruino and many others!) - * Fix linting errors ([#847](https://github.com/agenda/agenda/pull/847)) (thanks @dmbarreiro!) - -2.0.2 / 2018-09-15 -================== - * Fixes a MongoDB connection string issue with Atlas ([#674]( -https://github.com/agenda/agenda/pull/674) - -2.0.1 / 2018-08-30 -================== - * Fix a bug where `job.touch()` wasn't promise based, as it should've been ([#667](https://github.com/agenda/agenda/pull/667) - -2.0.0 / 2018-07-19 -================== - * Rewrite tests: replace `mocha` and `blanket` with `ava` and `nyc` ([#506](https://github.com/agenda/agenda/pull/506)) - * Optimization: don't try and unlock jobs when `_lockedJobs` is empty ([#509](https://github.com/agenda/agenda/pull/509)) - * Code cleanup ([#503](https://github.com/agenda/agenda/pull/503)) - * Ensure tests pass for Node.js version 10 [#608](https://github.com/agenda/agenda/pull/608)) - * Add `skipImmediate` to `repeatEvery()` options to skip immediate run of repeated jobs when Agenda starts. See [documentation](https://github.com/agenda/agenda/blob/202c9e95b40115dc763641f55180db9a4f358272/README.md#repeateveryinterval-options) ([#594](https://github.com/agenda/agenda/pull/594)) - * Fixes some flaky tests - * Adds docs generator (`npm run docs` to generate `/docs`) - -BREAKING --------- - * Rewrite Agenda API support promises! ([#557](https://github.com/agenda/agenda/pull/557)) - - No more callbacks! Instead of: - - ```js - function graceful() { - agenda.stop(function() { - process.exit(0); - }); - } - ``` - - You need to: - ```js - async function graceful() { - await agenda.stop(); - process.exit(0); - } - ``` - - You don't anymore have to listen for `start` event. Instead you can do: - ```js - await agenda.start(); - agenda.every('10 minutes', 'example'); - ``` - - However, this will still work: - ```js - agenda.on('ready', function () { - agenda.every('10 minutes', 'example'); - agenda.start(); - }); - ``` - - See the documentation for more! - - * Drop support for Node.js versions 4, 5 and 6 ([#557](https://github.com/agenda/agenda/pull/557) / [#608](https://github.com/agenda/agenda/pull/608)) - * Drop support for MongoDB 2.4 ([#497](https://github.com/agenda/agenda/pull/497)) - * Update Native MongoDB driver to 3.1 from 2.2 ([#616](https://github.com/agenda/agenda/pull/616)) - * Jobs _emit_ errors instead of throwing them - -1.0.3 / 2017-10-17 -================== - * Update dependencies ([2854c7e](https://github.com/agenda/agenda/commit/65159172b34b9a1344814619c117474bcc323f8d)) - -1.0.2 / 2017-10-17 -================== - * Update dependencies ([2854c7e](https://github.com/agenda/agenda/commit/2854c7e3847cc8aecea702df8532789c51b1ed30)) - -1.0.1 / 2017-10-10 -================== - * Update dependencies `cron` and `debug` ([#505](https://github.com/agenda/agenda/pull/505)) - -1.0.0 / 2017-08-12 -================== - -* Gracefully recover from losing connection to MongoDB ([#472](https://github.com/agenda/agenda/pull/472)) -* Code cleanup ([#492](https://github.com/agenda/agenda/pull/492)) - -BREAKING --------- - * Fix jobs not running in order of them being queued ([#464](https://github.com/agenda/agenda/pull/464)) - - * Changes in Cron string parsing, changed parsing library from [ncb000gt/node-cron](https://www.npmjs.com/package/cron) to [harrisiirak/cron-parser](https://www.npmjs.com/package/cron-parser) ([#475](https://github.com/agenda/agenda/pull/475)) - -Previously Agenda would treat months as 0-11 where as normally, cron months are parsed as 1-12. - -``` -* * * * * * -| | | | | | -| | | | | +-- Year (range: 1900-3000) -| | | | +---- Day of the Week (range: 1-7, 1 standing for Monday) -| | | +------ Month of the Year (range: 0-11) NOTE: Difference here -| | +-------- Day of the Month (range: 1-31) -| +---------- Hour (range: 0-23) -+------------ Minute (range: 0-59) -``` - -Starting in version `1.0.0`, cron will be parsed in the standard UNIX style: -``` -* * * * * * -| | | | | | -| | | | | +-- Year (range: 1900-3000) -| | | | +---- Day of the Week (range: 1-7, 1 standing for Monday) -| | | +------ Month of the Year (range: 1-12) NOTE: Difference here -| | +-------- Day of the Month (range: 1-31) -| +---------- Hour (range: 0-23) -+------------ Minute (range: 0-59) -``` - - -0.10.2 / 2017-08-10 -=================== - * Adds debugging, [see instructions from README.md](https://github.com/agenda/agenda#to-turn-on-logging-please-set-your-debug-env-variable-like-so). - -0.10.1 / 2017-08-10 -=================== - * Unpublished and re-published as v0.10.2 - -0.10.0 / 2017-08-08 -================== - * Replace the deprecated `findAndModify` method from native MongoDB driver to `findOneAndUpdate` ([#448](https://github.com/agenda/agenda/pull/448)) - * Going forward, we won't ensure Node.js v0.10 and v0.11 compatibility anymore ([#449](https://github.com/agenda/agenda/pull/449)) - * Code cleanup ([#491](https://github.com/agenda/agenda/pull/491), [#489](https://github.com/agenda/agenda/pull/489), [#488](https://github.com/agenda/agenda/pull/488), [#487](https://github.com/agenda/agenda/pull/487)) - -0.9.1 / 2017-03-22 -================== - -Republish release for NPM. Includes fixes from 0.9.0 release: - - * add support for `mongoose.connection` for `agenda.mongo()`, fixes #156 - * Fix for race condition in the afterEach clean up code (#355) - * Fixes + protects against concurrency not being honored (#379) - - -0.9.0 / 2016-12-28 -================== - * add support for `mongoose.connection` for `agenda.mongo()`, fixes #156 - * Fix for race condition in the afterEach clean up code (#355) - * Fixes + protects against concurrency not being honored (#379) - * Bump mongodb dep version to support ssl conns (#368) - * Increase Mongo compatability to 2.4 - -0.8.1 / 2016-05-08 -================== - - * Add Node v6 to CI - * 1. Update dev dependencies for out of date. 2. Small fix to job.js for invalid repeatAt - * Update .npmignore - * Fix doc: cb not marked as optional (closes #279) - * Including nextRunAt check in query for on the fly lock. - * Picking up any job with an expired lock (not just recurring or queued). - * Fixed failing test - * throw on processJobResult error - * Requeuing concurrency blocked jobs wrt priority. - * Processing the next job that is not blocked by concurrency. - * Fix test which fails only sometimes - * Add agendash as alternative ui - * Merge pull request #288 from diesal11/master - -0.8.0 / 2016-02-21 -================== - - * Implementing lock limit - * Use callback to handle errors if we can. - -0.7.9 / 2016-02-05 -================== - - * fix: ReferenceError: MongoError is not defined - -0.7.8 / 2016-02-03 -================== - - * fix: computeNextRunAt timezone bug - -0.7.7 / 2016-01-25 -================== - - * feat: add timezone option for repeatAt. - * fix: job locking logic - * fix: bug with jobs expiring and being enqueued anyway - * fix: bug where jobs wouldn't run concurrently - * fix: agenda throwing an exception when starting a job defined on another instance - * fix: possible bug when using extended Array.prototype - -0.7.6 / 2016-01-04 -================== - - * feat: Add failCount attribute to jobs - * fix: job priority for on the fly job lock and queueing is now respected - * fix: make agenda.cancel no longer require a callback - * fix: stale jobs running after a more up-to-date job has completed - * fix: fail/success event emit after jobs have been saved in the database - * fix: ready event when using config.mongo - -0.7.5 / 2015-12-05 -================== - - * Adds options.insertOnly to job.unique that prevents the job from being updated multiple times on multiple runs - -0.7.4 / 2015-11-26 -================== - - * fix job priority scheduling - -0.7.3 / 2015-11-22 -================== - - * add support for success callbacks on schedule, every and now (@mgregson) - * using self for reference to collection (@3choBoomer) - * emit ready from db_init (@jdiamond) - -0.7.2 / 2015-10-22 -================== - - * Rollback job completion callback to pre-0.7.0 - * Emit events when Agenda init is ready or has failed - -0.7.0 / 2015-09-29 -================== - - * Switch from mongoskin to mongodb native. Big thanks to the - [classdojo](http://classdojo.com) team for this. Shoutouts to @liamdon, - @jetzhou and @byronmwong for the help! - -0.6.28 / 2015-02-13 -================== - - * Fix for when _findAndLockNextJob returns multiple jobs. - -0.6.27 / 2015-02-04 -================== - - * code cleanup, fix leaking ignoreErrors - -0.6.26 / 2014-11-30 -================== - - * fix double run bug - -0.6.25 / 2014-11-20 -================== - - * Allow specifying mongo config (optionally) - -0.6.24 / 2014-10-31 -================== - - * Fix .every() running when using cron strings. - -0.6.23 / 2014-10-25 -================== - - * Remove debugger - -0.6.22 / 2014-10-22 -================== - - * add job.unique (@nwkeeley) - -0.6.21 / 2014-10-20 -================== - - * Re-add tests for those who use the `npat` option. - -0.6.20 / 2014-10-14 -================== - - * add job.disable() and job.enable() - * Added .npmignore for test/ build scripts. - -0.6.19 / 2014-09-03 -================== - - * Create database indexes when initializing Agenda instance (@andyneville) - -0.6.18 / 2014-08-16 -================== - - * Implemented job.isRunning() - * Fixed issue where jobs would continue being processed after agenda is explicitly stopped - * Fixed complete event being emitted before asynchronous jobs are finished - -0.6.17 / 2014-08-11 -================== - - * add job.repeatAt - -0.6.16 / 2014-06-16 -================== - - * fix job queue being processed even when agenda was stopped - * fix agenda.every method - -0.6.15 / 2014-06-11 -================== - - * fix agenda.every overwriting nextRunAt [closes #70] - -0.6.14 / 2014-06-06 -================== - - * Added agenda.cancel function - * Fix more circumstances where jobs re-create after remove - -0.6.13 / 2014-06-01 -================== - - * fix jobs resaving after remove [closes #66] - * fix jobs skipping in line from database querying - -0.6.12/ 2014-05-22 -================== - - * update saveJob to allow for pre-set Ids [closes #64] - -0.6.11/ 2014-05-19 -================== - - * add job.touch to reset lock lifetime [references #63] - -0.6.10 / 2014-05-13 -================== - - * make job saving use agenda._name - -0.6.9 / 2014-05-13 -================== - - * add agenda.name config method - * fix agenda.mongo not being chainable - -0.6.8 / 2014-05-06 -================== - - * add graceful job unlocking to stop - -0.6.7 / 2014-04-21 -================== - - * Implement, document, and test defaultLockLifetime [@shakefu] - -0.6.6 / 2014-04-21 -================== - - * Bump date.js version [@psema4] - -0.6.5 / 2014-04-17 -================== - - * mongoskin version bump (better support for mongodb 2.6) [@loginx] - -0.6.4 / 2014-04-09 -================== - - * fix $setOnInsert with empty obj cause mongodb 2.6 complain [@inetfuture] - -0.6.3 / 2014-04-07 -================== - - * fix cron-jobs executing multiple times - * fail the job if repeat interval is wrong - -0.6.2 / 2014-03-25 -================== - - * fix bug that resulted in jobs scheduled in memory to always re-run - * Update mongoskin to 1.3 - -0.6.1 / 2014-03-24 -================== - - * allow every and schedule to take array of job names - -0.6.0 / 2014-03-21 (NO BREAKING CHANGES) -================== - - * convert to using setTimeout for precise job scheduling [closes #6] - -0.5.10/ 2014-03-20 -================== - - * fix agenda.every not properly saving jobs - * improve instantiating jobs, fixes bug where certain attrs weren't loaded in - -0.5.9 / 2014-03-10 -================== - - * add job#remove method - -0.5.8 / 2014-03-07 -================== - - * Fixed single jobs not being saved properly [closes #38] - -0.5.7 / 2014-03-06 -================== - - * fix every re-running jobs out of queue at load - -0.5.6 / 2014-02-18 -================== - - * Added failing for jobs with undefined definitions - * Added agenda.purge() to remove old jobs - -0.5.5 / 2014-01-28 -================== - - * added support to directly give mongoskin object, to help minimize connections - -0.5.4 / 2014-01-09 -================== - - * Added start event to jobs. (@clayzermki) - -0.5.3 / 2014-01-06 -================== - - * Added agenda.now method - -0.5.2 / 2014-01-06 -================== - - * Added ability for job.fail to take an error - -0.5.1 / 2013-01-04 (Backwards compatible!) -================== - * Updated version of humanInterval, adding weeks and months support - -0.5.0 / 2013-12-19 (Backwards compatible!) -================== - - * Added job locking mechanism, enabling support for multiple works / agenda instances (@bars3s) - -0.4.4 / 2013-12-13 -================== - - * fix job.toJson method: add failReason & failedAt attrs (Broken in 0.4.3 and 0.4.2) - * fix job cb for working with 'q' promises - -0.4.3 / 2013-12-13 -================== - - * fix job.schedule's taking Date object as 'when' argument [@bars3s] - -0.4.2 / 2013-12-11 -================== - - * Refactored Job to ensure that everything is stored as an ISODate in the Database. [Closes #14] [@raisch] - -0.4.1 / 2013-12-10 -================== - - * Added support for synchronous job definitions - -0.4.0 / 2013-12-04 -================== - - * Added Cron Support [Closes #2] - * removed modella dependency - -0.3.1 / 2013-11-19 -================== - - * Fix for setImmediate on Node 0.8 - -0.3.0 / 2013-11-19 -================== - - * Added Events to the Event Queue [References #7] - -0.2.1 / 2013-11-14 -================== - - * Fixed a bug where mongo wasn't giving updated document - -0.2.0 / 2013-11-07 -================== - - * Added error for running undefined job. [Closes #4] - * Fixed critical error where new jobs are not correctly saved. - -0.1.3 / 2013-11-06 -================== - - * Small Bug fix for global-namespace pollution - -0.1.2 / 2013-10-31 -================== - - * Updated write concern to avoid annoying notices - -0.1.1 / 2013-10-28 -================== - - * Removed unecessary UUID code - -0.1.0 / 2013-10-28 -================== - - * Initial Release diff --git a/docs/_config.yml b/docs/_config.yml deleted file mode 100644 index 2f7efbe..0000000 --- a/docs/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-minimal \ No newline at end of file diff --git a/docs/agenda/1.0.3/Agenda.html b/docs/agenda/1.0.3/Agenda.html deleted file mode 100644 index 30feccd..0000000 --- a/docs/agenda/1.0.3/Agenda.html +++ /dev/null @@ -1,4498 +0,0 @@ - - - - - - - - - Agenda - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- Agenda -

- - - - -
-
- -

- - Agenda - -

- - - -
- -
-
- - - - - - - - - - - - -

- new Agenda(config, cb) -

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
config - - - - Object - - - - - - - - - -
cb - - - - function - - - - - - - - - -
- - - - - -
Properties:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
_name - - - - Object - - - - - - - -

Name of the current Agenda queue

-
_processEvery - - - - Number - - - - - - - - -
_defaultConcurrency - - - - Number - - - - - - - - -
_maxConcurrency - - - - Number - - - - - - - - -
_defaultLockLimit - - - - Number - - - - - - - - -
_lockLimit - - - - Number - - - - - - - - -
_definitions - - - - Object - - - - - - - - -
_runningJobs - - - - Object - - - - - - - - -
_lockedJobs - - - - Object - - - - - - - - -
_jobQueue - - - - Object - - - - - - - - -
_defaultLockLifetime - - - - Number - - - - - - - - -
_sort - - - - Object - - - - - - - - -
_indices - - - - Object - - - - - - - - -
_isLockingOnTheFly - - - - Boolean - - - - - - - - -
_jobsToLock - - - - Array - - - - - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - -

Methods

- - - - - - - - - - - - - -

- cancel(query) → {Promise.<Number>} -

-
- - - - - -
-

Cancels any jobs matching the passed MongoDB query, and removes them from the database.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
query - - - - Object - - - - - - - -

MongoDB query to use when cancelling

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- create(name, data) → {Job} -

-
- - - - - -
-

Given a name and some data, create a new job

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - - - String - - - - - - - -

name of job

- -
data - - - - Object - - - - - - - -

data to set for job

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- database(url, collection, options, cb) → {exports} -

-
- - - - - -
-

Connect to the spec'd MongoDB server and database.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
url - - - - String - - - - - - - -

MongoDB server URI

- -
collection - - - - String - - - - - - - -

name of collection to use

- -
options - - - - Object - - - - - - - -

options for connecting

- -
cb - - - - function - - - - - - - -

callback of MongoDB connection

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- dbInit(collection, cb) → {undefined} -

-
- - - - - -
-

Setup and initialize the collection used to manage Jobs.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
collection - - - - String - - - - - - - -

name or undefined for default 'agendaJobs'

- -
cb - - - - function - - - - - - - -

called when the db is initialized

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- defaultConcurrency(num) → {exports} -

-
- - - - - -
-

Set the default concurrency for each job

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
num - - - - Number - - - - - - - -

default concurrency

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- defaultLockLifetime(ms) → {Agenda} -

-
- - - - - -
-

Set the default lock time (in ms) -Default is 10 60 1000 ms (10 minutes)

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
ms - - - - Number - - - - - - - -

time in ms to set default lock

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- defaultLockLimit(num) → {Agenda} -

-
- - - - - -
-

Set default lock limit per job type

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
num - - - - Number - - - - - - - -

Lock limit per job

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- define(name, options, processor) → {undefined} -

-
- - - - - -
-

Setup definition for job -Method is used by consumers of lib to setup their functions

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - - - String - - - - - - - -

name of job

- -
options - - - - Object - - - - - - - -

options for job to run

- -
processor - - - - function - - - - - - - -

function to be called to run actual job

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- every(interval, names, data, options) → {Promise} -

-
- - - - - -
-

Creates a scheduled job with given interval and name/names of the job to run

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
interval - - - - Number - - - - - - - -

run every X interval

- -
names - - - - * - - - - - - - -

String or strings of jobs to schedule

- -
data - - - - Object - - - - - - - -

data to run for job

- -
options - - - - Object - - - - - - - -

options to run job for

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- (protected) findAndLockNextJob(jobName, definition, cb) → {undefined} -

-
- - - - - -
-

Find and lock jobs

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
jobName - - - - String - - - - - - - -

name of job to try to lock

- -
definition - - - - Object - - - - - - - -

definition used to tell how job is run

- -
cb - - - - function - - - - - - - -

called when job lock fails or passes

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- jobs(query) → {Promise} -

-
- - - - - -
-

Finds all jobs matching 'query'

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
query - - - - Object - - - - - - - -

object for MongoDB

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- locklimit(num) → {exports} -

-
- - - - - -
-

Set the default amount jobs that are allowed to be locked at one time (GLOBAL)

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
num - - - - Number - - - - - - - -

Lock limit

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- maxConcurrency(num) → {exports} -

-
- - - - - -
-

Set the concurrency for jobs (globally), type does not matter

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
num - - - - Number - - - - - - - -

max concurrency value

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- mongo(mdb, collection, cb) → {exports} -

-
- - - - - -
-

Build method used to add MongoDB connection details

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
mdb - - - - MongoClient - - - - - - - -

instance of MongoClient to use

- -
collection - - - - String - - - - - - - -

name collection we want to use ('agendaJobs')

- -
cb - - - - function - - - - - - - -

called when MongoDB connection fails or passes

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- name(name) → {exports} -

-
- - - - - -
-

Set name of queue

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - - - String - - - - - - - -

name of agenda instance

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- now(name, data, cb) → {Job} -

-
- - - - - -
-

Create a job for this exact moment

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - - - String - - - - - - - -

name of job to schedule

- -
data - - - - Object - - - - - - - -

data to pass to job

- -
cb - - - - function - - - - - - - -

called when job scheduling fails or passes

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- processEvery(time) → {exports} -

-
- - - - - -
-

Set the default process interval

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
time - - - - Number - - - - - - - -

time to process

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- purge() → {Promise} -

-
- - - - - -
-

Removes all jobs from queue

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- saveJob(job) → {Promise} -

-
- - - - - -
-

Save the properties on a job to MongoDB

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
job - - - - Job - - - - - - - -

job to save into MongoDB

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- schedule(when, names, data) → {Promise.<Job>} -

-
- - - - - -
-

Schedule a job or jobs at a specific time

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
when - - - - String - - - - - - - -

when the job gets run

- -
names - - - - Array.<String> - - - - - - - -

array of job names to run

- -
data - - - - Object - - - - - - - -

data to send to job

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- sort(query) → {exports} -

-
- - - - - -
-

Set the sort query for finding next job -Default is { nextRunAt: 1, priority: -1 }

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
query - - - - Object - - - - - - - -

sort query object for MongoDB

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- start() → {Promise} -

-
- - - - - -
-

Starts processing jobs using processJobs() methods, storing an interval ID -This method will only resolve if a db has been set up beforehand.

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- stop() → {Promise} -

-
- - - - - -
-

Clear the interval that processes the jobs

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - -
-
- - - - -
- -
- - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/1.0.3/Job.html b/docs/agenda/1.0.3/Job.html deleted file mode 100644 index bd657be..0000000 --- a/docs/agenda/1.0.3/Job.html +++ /dev/null @@ -1,2105 +0,0 @@ - - - - - - - - - Job - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- Job -

- - - - -
-
- -

- - Job - -

- - - -
- -
-
- - - - - - - - - - - - -

- new Job(args) -

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
args - - - - Object - - - - - - - - - -
- - - - - -
Properties:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
agenda - - - - Object - - - - - - - -

The Agenda instance

-
attrs - - - - Object - - - - - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - -

Methods

- - - - - - - - - - - - - -

- computeNextRunAt() → {exports} -

-
- - - - - -
-

Internal method used to compute next time a job should run and sets the proper values

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- disable() → {exports} -

-
- - - - - -
-

Prevents the job type from running

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- enable() → {Job} -

-
- - - - - -
-

Allows job type to run

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- fail(reason) → {exports} -

-
- - - - - -
-

Fails the job with a reason (error) specified

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
reason - - - - Error - - - | - - - String - - - - - - - -

reason job failed

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- isRunning() → {Boolean} -

-
- - - - - -
-

A job is running if: -(lastRunAt exists AND lastFinishedAt does not exist) -OR -(lastRunAt exists AND lastFinishedAt exists but the lastRunAt is newer [in time] than lastFinishedAt)

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- priority(priority) → {Number} -

-
- - - - - -
-

Internal method to turn priority into a number

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
priority - - - - String - - - | - - - Number - - - - - - - -

string to parse into number

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- remove() → {Promise} -

-
- - - - - -
-

Remove the job from MongoDB

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- repeatAt(time) → {exports} -

-
- - - - - -
-

Sets a job to repeat at a specific time

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
time - - - - String - - - - - - - -

time to repeat job at (human readable or number)

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- repeatEvery(interval, options) → {Job} -

-
- - - - - -
-

Sets a job to repeat every X amount of time

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
interval - - - - String - - - - - - - -

repeat every X

- -
options - - - - Object - - - - - - - -

options to use for job

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- run() → {Promise} -

-
- - - - - -
-

Internal method (RUN)

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- schedule(time) → {exports} -

-
- - - - - -
-

Schedules a job to run at specified time

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
time - - - - String - - - - - - - -

schedule a job to run "then"

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- toJSON() → {Object} -

-
- - - - - -
-

Given a job, turn it into an object we can store in Mongo

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- touch(cb) → {undefined} -

-
- - - - - -
-

Updates "lockedAt" time so the job does not get picked up again

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
cb - - - - function - - - - - - - -

called when job "touch" fails or passes

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- unique(unique, opts) → {exports} -

-
- - - - - -
-

Data to ensure is unique for job to be created

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
unique - - - - Object - - - - - - - -

mongo data query for unique

- -
opts - - - - Object - - - - - - - -

unique options

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - -
-
- - - - -
- -
- - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/1.0.3/agenda_cancel.js.html b/docs/agenda/1.0.3/agenda_cancel.js.html deleted file mode 100644 index 9be379f..0000000 --- a/docs/agenda/1.0.3/agenda_cancel.js.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - agenda/cancel.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/cancel.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:cancel');
-
-/**
- * Cancels any jobs matching the passed MongoDB query, and removes them from the database.
- * @name Agenda#cancel
- * @function
- * @param {Object} query MongoDB query to use when cancelling
- * @caller client code, Agenda.purge(), Job.remove()
- * @returns {Promise<Number>} A promise that contains the number of removed documents when fulfilled.
- */
-module.exports = function(query) {
-  debug('attempting to cancel all Agenda jobs', query);
-  return this._collection.deleteMany(query).then(({result}) => {
-    debug('%s jobs cancelled', result.n);
-    return result.n;
-  }).catch(err => {
-    debug('error trying to delete jobs from MongoDB');
-    throw err;
-  });
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/agenda_create.js.html b/docs/agenda/1.0.3/agenda_create.js.html deleted file mode 100644 index 97f788c..0000000 --- a/docs/agenda/1.0.3/agenda_create.js.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - agenda/create.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/create.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:create');
-const Job = require('../job');
-
-/**
- * Given a name and some data, create a new job
- * @name Agenda#create
- * @function
- * @param {String} name name of job
- * @param {Object} data data to set for job
- * @returns {Job} instance of new job
- */
-module.exports = function(name, data) {
-  debug('Agenda.create(%s, [Object])', name);
-  const priority = this._definitions[name] ? this._definitions[name].priority : 0;
-  const job = new Job({name, data, type: 'normal', priority, agenda: this});
-  return job;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/agenda_database.js.html b/docs/agenda/1.0.3/agenda_database.js.html deleted file mode 100644 index 57f8dbd..0000000 --- a/docs/agenda/1.0.3/agenda_database.js.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - - - - agenda/database.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/database.js -

- - - - - -
-
-
'use strict';
-const MongoClient = require('mongodb').MongoClient;
-const debug = require('debug')('agenda:database');
-
-/**
- * Connect to the spec'd MongoDB server and database.
- * @name Agenda#database
- * @function
- * @param {String} url MongoDB server URI
- * @param {String} collection name of collection to use
- * @param {Object} options options for connecting
- * @param {Function} cb callback of MongoDB connection
- * @returns {exports}
- * NOTE:
- * If `url` includes auth details then `options` must specify: { 'uri_decode_auth': true }. This does Auth on
- * the specified database, not the Admin database. If you are using Auth on the Admin DB and not on the Agenda DB,
- * then you need to authenticate against the Admin DB and then pass the MongoDB instance into the constructor
- * or use Agenda.mongo(). If your app already has a MongoDB connection then use that. ie. specify config.mongo in
- * the constructor or use Agenda.mongo().
- */
-module.exports = function(url, collection, options, cb) {
-  const self = this;
-  if (!url.match(/^mongodb:\/\/.*/)) {
-    url = 'mongodb://' + url;
-  }
-
-  collection = collection || 'agendaJobs';
-  options = Object.assign({autoReconnect: true, reconnectTries: Number.MAX_SAFE_INTEGER, reconnectInterval: this._processEvery}, options);
-  MongoClient.connect(url, options, (error, db) => {
-    if (error) {
-      debug('error connecting to MongoDB using collection: [%s]', collection);
-      if (cb) {
-        cb(error, null);
-      } else {
-        throw error;
-      }
-      return;
-    }
-    debug('successful connection to MongoDB using collection: [%s]', collection);
-    self._mdb = db;
-    self.db_init(collection, cb);
-  });
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/agenda_db-init.js.html b/docs/agenda/1.0.3/agenda_db-init.js.html deleted file mode 100644 index f7437a6..0000000 --- a/docs/agenda/1.0.3/agenda_db-init.js.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - - - - agenda/db-init.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/db-init.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:db_init');
-
-/**
- * Setup and initialize the collection used to manage Jobs.
- * @name Agenda#dbInit
- * @function
- * @param {String} collection name or undefined for default 'agendaJobs'
- * @param {Function} cb called when the db is initialized
- * @returns {undefined}
- */
-module.exports = function(collection, cb) {
-  const self = this;
-  debug('init database collection using name [%s]', collection);
-  this._collection = this._mdb.collection(collection || 'agendaJobs');
-  debug('attempting index creation');
-  this._collection.createIndex(
-    this._indices,
-    {name: 'findAndLockNextJobIndex'},
-    err => {
-      if (err) {
-        debug('index creation failed');
-        self.emit('error', err);
-      } else {
-        debug('index creation success');
-        self.emit('ready');
-      }
-
-      if (cb) {
-        cb(err, self._collection);
-      }
-    }
-  );
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/agenda_default-concurrency.js.html b/docs/agenda/1.0.3/agenda_default-concurrency.js.html deleted file mode 100644 index 0994203..0000000 --- a/docs/agenda/1.0.3/agenda_default-concurrency.js.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - agenda/default-concurrency.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/default-concurrency.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:defaultConcurrency');
-
-/**
- * Set the default concurrency for each job
- * @name Agenda#defaultConcurrency
- * @function
- * @param {Number} num default concurrency
- * @returns {exports} agenda instance
- */
-module.exports = function(num) {
-  debug('Agenda.defaultConcurrency(%d)', num);
-  this._defaultConcurrency = num;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/agenda_default-lock-lifetime.js.html b/docs/agenda/1.0.3/agenda_default-lock-lifetime.js.html deleted file mode 100644 index 872e9cf..0000000 --- a/docs/agenda/1.0.3/agenda_default-lock-lifetime.js.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - agenda/default-lock-lifetime.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/default-lock-lifetime.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:defaultLockLifetime');
-
-/**
- * Set the default lock time (in ms)
- * Default is 10 * 60 * 1000 ms (10 minutes)
- * @name Agenda#defaultLockLifetime
- * @function
- * @param {Number} ms time in ms to set default lock
- * @returns {Agenda} agenda instance
- */
-module.exports = function(ms) {
-  debug('Agenda.defaultLockLifetime(%d)', ms);
-  this._defaultLockLifetime = ms;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/agenda_default-lock-limit.js.html b/docs/agenda/1.0.3/agenda_default-lock-limit.js.html deleted file mode 100644 index c384d93..0000000 --- a/docs/agenda/1.0.3/agenda_default-lock-limit.js.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - agenda/default-lock-limit.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/default-lock-limit.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:defaultLockLimit');
-
-/**
- * Set default lock limit per job type
- * @name Agenda#defaultLockLimit
- * @function
- * @param {Number} num Lock limit per job
- * @returns {Agenda} agenda instance
- */
-module.exports = function(num) {
-  debug('Agenda.defaultLockLimit(%d)', num);
-  this._defaultLockLimit = num;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/agenda_define.js.html b/docs/agenda/1.0.3/agenda_define.js.html deleted file mode 100644 index 3dde043..0000000 --- a/docs/agenda/1.0.3/agenda_define.js.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - - - - - - agenda/define.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/define.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:define');
-
-/**
- * Setup definition for job
- * Method is used by consumers of lib to setup their functions
- * @name Agenda#define
- * @function
- * @param {String} name name of job
- * @param {Object} options options for job to run
- * @param {Function} processor function to be called to run actual job
- * @returns {undefined}
- */
-module.exports = function(name, options, processor) {
-  if (!processor) {
-    processor = options;
-    options = {};
-  }
-  this._definitions[name] = {
-    fn: processor,
-    concurrency: options.concurrency || this._defaultConcurrency,
-    lockLimit: options.lockLimit || this._defaultLockLimit,
-    priority: options.priority || 0,
-    lockLifetime: options.lockLifetime || this._defaultLockLifetime,
-    running: 0,
-    locked: 0
-  };
-  debug('job [%s] defined with following options: \n%O', name, this._definitions[name]);
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/agenda_every.js.html b/docs/agenda/1.0.3/agenda_every.js.html deleted file mode 100644 index 5b8b8e1..0000000 --- a/docs/agenda/1.0.3/agenda_every.js.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - - - - agenda/every.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/every.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:every');
-
-/**
- * Creates a scheduled job with given interval and name/names of the job to run
- * @name Agenda#every
- * @function
- * @param {Number} interval run every X interval
- * @param {*} names String or strings of jobs to schedule
- * @param {Object} data data to run for job
- * @param {Object} options options to run job for
- * @returns {Promise} Job/s created. Resolves when schedule fails or passes
- */
-module.exports = async function(interval, names, data, options) {
-  /**
-   * Internal method to setup job that gets run every interval
-   * @param {Number} interval run every X interval
-   * @param {String} name String job to schedule
-   * @param {Object} data data to run for job
-   * @param {Object} options options to run job for
-   * @returns {Job} instance of job
-   */
-  const createJob = async (interval, name, data, options) => {
-    const job = this.create(name, data);
-
-    job.attrs.type = 'single';
-    job.repeatEvery(interval, options);
-    job.computeNextRunAt();
-    await job.save();
-
-    return job;
-  };
-
-  /**
-   * Internal helper method that uses createJob to create jobs for an array of names
-   * @param {Number} interval run every X interval
-   * @param {Array<String>} names Strings of jobs to schedule
-   * @param {Object} data data to run for job
-   * @param {Object} options options to run job for
-   * @returns {Array<Job>} array of jobs created
-   */
-  const createJobs = (interval, names, data, options) => {
-    try {
-      const jobs = names.map(name => createJob(interval, name, data, options));
-
-      debug('every() -> all jobs created successfully');
-
-      return Promise.all(jobs);
-    } catch (err) { // @TODO: catch - ignore :O
-      debug('every() -> error creating one or more of the jobs');
-    }
-  };
-
-  if (typeof names === 'string' || names instanceof String) {
-    debug('Agenda.every(%s, %O, %O)', interval, names, options);
-    const jobs = await createJob(interval, names, data, options);
-
-    return jobs;
-  } else if (Array.isArray(names)) {
-    debug('Agenda.every(%s, %s, %O)', interval, names, options);
-    const jobs = await createJobs(interval, names, data, options);
-
-    return jobs;
-  }
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/agenda_find-and-lock-next-job.js.html b/docs/agenda/1.0.3/agenda_find-and-lock-next-job.js.html deleted file mode 100644 index dad678d..0000000 --- a/docs/agenda/1.0.3/agenda_find-and-lock-next-job.js.html +++ /dev/null @@ -1,197 +0,0 @@ - - - - - - - - - - - agenda/find-and-lock-next-job.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/find-and-lock-next-job.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:internal:_findAndLockNextJob');
-const utils = require('../utils');
-
-const createJob = utils.createJob;
-
-/**
- * Find and lock jobs
- * @name Agenda#findAndLockNextJob
- * @function
- * @param {String} jobName name of job to try to lock
- * @param {Object} definition definition used to tell how job is run
- * @param {Function} cb called when job lock fails or passes
- * @access protected
- * @caller jobQueueFilling() only
- * @returns {undefined}
- */
-module.exports = function(jobName, definition, cb) {
-  const self = this;
-  const now = new Date();
-  const lockDeadline = new Date(Date.now().valueOf() - definition.lockLifetime);
-  debug('_findAndLockNextJob(%s, [Function], cb)', jobName);
-
-  // Don't try and access MongoDB if we've lost connection to it.
-  // Trying to resolve crash on Dev PC when it resumes from sleep. NOTE: Does this still happen?
-  const s = this._mdb.s || this._mdb.db.s;
-  if (s.topology.connections().length === 0) {
-    if (s.topology.autoReconnect && !s.topology.isDestroyed()) {
-      // Continue processing but notify that Agenda has lost the connection
-      debug('Missing MongoDB connection, not attempting to find and lock a job');
-      self.emit('error', new Error('Lost MongoDB connection'));
-      cb();
-    } else {
-      // No longer recoverable
-      debug('topology.autoReconnect: %s, topology.isDestroyed(): %s', s.topology.autoReconnect, s.topology.isDestroyed());
-      cb(new Error('MongoDB connection is not recoverable, application restart required'));
-    }
-  } else {
-    // /**
-    // * Query used to find job to run
-    // * @type {{$or: [*]}}
-    // */
-    const JOB_PROCESS_WHERE_QUERY = {
-      $or: [{
-        name: jobName,
-        lockedAt: null,
-        nextRunAt: {$lte: this._nextScanAt},
-        disabled: {$ne: true}
-      }, {
-        name: jobName,
-        lockedAt: {$exists: false},
-        nextRunAt: {$lte: this._nextScanAt},
-        disabled: {$ne: true}
-      }, {
-        name: jobName,
-        lockedAt: {$lte: lockDeadline},
-        disabled: {$ne: true}
-      }]
-    };
-
-    /**
-    * Query used to set a job as locked
-    * @type {{$set: {lockedAt: Date}}}
-    */
-    const JOB_PROCESS_SET_QUERY = {$set: {lockedAt: now}};
-
-    /**
-    * Query used to affect what gets returned
-    * @type {{returnOriginal: boolean, sort: object}}
-    */
-    const JOB_RETURN_QUERY = {returnDocument: 'after', sort: this._sort};
-
-    // Find ONE and ONLY ONE job and set the 'lockedAt' time so that job begins to be processed
-    this._collection.findOneAndUpdate(JOB_PROCESS_WHERE_QUERY, JOB_PROCESS_SET_QUERY, JOB_RETURN_QUERY, (err, result) => {
-      let job;
-      if (!err && result.value) {
-        debug('found a job available to lock, creating a new job on Agenda with id [%s]', result.value._id);
-        job = createJob(self, result.value);
-      }
-      if (err) {
-        debug('error occurred when running query to find and lock job');
-      }
-      cb(err, job);
-    });
-  }
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/agenda_index.js.html b/docs/agenda/1.0.3/agenda_index.js.html deleted file mode 100644 index caec05e..0000000 --- a/docs/agenda/1.0.3/agenda_index.js.html +++ /dev/null @@ -1,197 +0,0 @@ - - - - - - - - - - - agenda/index.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/index.js -

- - - - - -
-
-
/**
- * @TODO: Refactor remaining deprecated MongoDB Native Driver methods: findAndModify()
- */
-
-const {EventEmitter} = require('events');
-const humanInterval = require('human-interval');
-
-/**
- * @class Agenda
- * @param {Object} config
- * @param {Function} cb
- * @property {Object} _name - Name of the current Agenda queue
- * @property {Number} _processEvery
- * @property {Number} _defaultConcurrency
- * @property {Number} _maxConcurrency
- * @property {Number} _defaultLockLimit
- * @property {Number} _lockLimit
- * @property {Object} _definitions
- * @property {Object} _runningJobs
- * @property {Object} _lockedJobs
- * @property {Object} _jobQueue
- * @property {Number} _defaultLockLifetime
- * @property {Object} _sort
- * @property {Object} _indices
- * @property {Boolean} _isLockingOnTheFly
- * @property {Array} _jobsToLock
- */
-class Agenda extends EventEmitter {
-  constructor(config = {}, cb) {
-    super();
-
-    if (!(this instanceof Agenda)) {
-      return new Agenda(config);
-    }
-
-    this._name = config.name;
-    this._processEvery = humanInterval(config.processEvery) || humanInterval('5 seconds');
-    this._defaultConcurrency = config.defaultConcurrency || 5;
-    this._maxConcurrency = config.maxConcurrency || 20;
-    this._defaultLockLimit = config.defaultLockLimit || 0;
-    this._lockLimit = config.lockLimit || 0;
-    this._definitions = {};
-    this._runningJobs = [];
-    this._lockedJobs = [];
-    this._jobQueue = [];
-    this._defaultLockLifetime = config.defaultLockLifetime || 10 * 60 * 1000; // 10 minute default lockLifetime
-    this._sort = config.sort || {nextRunAt: 1, priority: -1};
-    this._indices = Object.assign({name: 1}, this._sort, {priority: -1, lockedAt: 1, nextRunAt: 1, disabled: 1});
-
-    this._isLockingOnTheFly = false;
-    this._jobsToLock = [];
-    this._ready = new Promise(resolve => this.once('ready', resolve));
-
-    if (config.mongo) {
-      this.mongo(config.mongo, config.db ? config.db.collection : undefined, cb);
-    } else if (config.db) {
-      this.database(config.db.address, config.db.collection, config.db.options, cb);
-    }
-  }
-}
-
-Agenda.prototype.mongo = require('./mongo');
-Agenda.prototype.database = require('./database');
-Agenda.prototype.db_init = require('./db-init'); // eslint-disable-line camelcase
-Agenda.prototype.name = require('./name');
-Agenda.prototype.processEvery = require('./process-every');
-Agenda.prototype.maxConcurrency = require('./max-concurrency');
-Agenda.prototype.defaultConcurrency = require('./default-concurrency');
-Agenda.prototype.lockLimit = require('./locklimit');
-Agenda.prototype.defaultLockLimit = require('./default-lock-limit');
-Agenda.prototype.defaultLockLifetime = require('./default-lock-lifetime');
-Agenda.prototype.sort = require('./sort');
-Agenda.prototype.create = require('./create');
-Agenda.prototype.jobs = require('./jobs');
-Agenda.prototype.purge = require('./purge');
-Agenda.prototype.define = require('./define');
-Agenda.prototype.every = require('./every');
-Agenda.prototype.schedule = require('./schedule');
-Agenda.prototype.now = require('./now');
-Agenda.prototype.cancel = require('./cancel');
-Agenda.prototype.saveJob = require('./save-job');
-Agenda.prototype.start = require('./start');
-Agenda.prototype.stop = require('./stop');
-Agenda.prototype._findAndLockNextJob = require('./find-and-lock-next-job');
-
-module.exports = Agenda;
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/agenda_jobs.js.html b/docs/agenda/1.0.3/agenda_jobs.js.html deleted file mode 100644 index 62301c6..0000000 --- a/docs/agenda/1.0.3/agenda_jobs.js.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - agenda/jobs.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/jobs.js -

- - - - - -
-
-
'use strict';
-const {createJob} = require('../utils');
-
-/**
- * Finds all jobs matching 'query'
- * @name Agenda#jobs
- * @function
- * @param {Object} query object for MongoDB
- * @returns {Promise} resolves when fails or passes
- */
-module.exports = async function(query) {
-  const result = await this._collection.find(query).toArray();
-
-  return result.map(job => createJob(this, job));
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/agenda_locklimit.js.html b/docs/agenda/1.0.3/agenda_locklimit.js.html deleted file mode 100644 index 870b734..0000000 --- a/docs/agenda/1.0.3/agenda_locklimit.js.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - agenda/locklimit.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/locklimit.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:locklimit');
-
-/**
- * Set the default amount jobs that are allowed to be locked at one time (GLOBAL)
- * @name Agenda#locklimit
- * @function
- * @param {Number} num Lock limit
- * @returns {exports} agenda instance
- */
-module.exports = function(num) {
-   // @NOTE: Is this different than max concurrency?
-  debug('Agenda.lockLimit(%d)', num);
-  this._lockLimit = num;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/agenda_max-concurrency.js.html b/docs/agenda/1.0.3/agenda_max-concurrency.js.html deleted file mode 100644 index 9f6d4e8..0000000 --- a/docs/agenda/1.0.3/agenda_max-concurrency.js.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - agenda/max-concurrency.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/max-concurrency.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:maxConcurrency');
-
-/**
- * Set the concurrency for jobs (globally), type does not matter
- * @name Agenda#maxConcurrency
- * @function
- * @param {Number} num max concurrency value
- * @returns {exports} agenda instance
- */
-module.exports = function(num) {
-  debug('Agenda.maxConcurrency(%d)', num);
-  this._maxConcurrency = num;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/agenda_mongo.js.html b/docs/agenda/1.0.3/agenda_mongo.js.html deleted file mode 100644 index c9aa9f0..0000000 --- a/docs/agenda/1.0.3/agenda_mongo.js.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - agenda/mongo.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/mongo.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Build method used to add MongoDB connection details
- * @name Agenda#mongo
- * @function
- * @param {MongoClient} mdb instance of MongoClient to use
- * @param {String} collection name collection we want to use ('agendaJobs')
- * @param {Function} cb called when MongoDB connection fails or passes
- * @returns {exports} instance of Agenda
- */
-module.exports = function(mdb, collection, cb) {
-  this._mdb = mdb;
-  this.db_init(collection, cb);
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/agenda_name.js.html b/docs/agenda/1.0.3/agenda_name.js.html deleted file mode 100644 index 24ba54b..0000000 --- a/docs/agenda/1.0.3/agenda_name.js.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - agenda/name.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/name.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:name');
-
-/**
- * Set name of queue
- * @name Agenda#name
- * @function
- * @param {String} name name of agenda instance
- * @returns {exports} agenda instance
- */
-module.exports = function(name) {
-  debug('Agenda.name(%s)', name);
-  this._name = name;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/agenda_now.js.html b/docs/agenda/1.0.3/agenda_now.js.html deleted file mode 100644 index bbe81df..0000000 --- a/docs/agenda/1.0.3/agenda_now.js.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - agenda/now.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/now.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:now');
-const noCallback = require('../no-callback');
-
-/**
- * Create a job for this exact moment
- * @name Agenda#now
- * @function
- * @param {String} name name of job to schedule
- * @param {Object} data data to pass to job
- * @param {Function} cb called when job scheduling fails or passes
- * @returns {Job} new job instance created
- */
-module.exports = async function(name, data) {
-  noCallback(arguments, 2);
-  debug('Agenda.now(%s, [Object])', name);
-  const job = this.create(name, data);
-
-  job.schedule(new Date());
-  await job.save();
-
-  return job;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/agenda_process-every.js.html b/docs/agenda/1.0.3/agenda_process-every.js.html deleted file mode 100644 index 1b689bb..0000000 --- a/docs/agenda/1.0.3/agenda_process-every.js.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - agenda/process-every.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/process-every.js -

- - - - - -
-
-
'use strict';
-const humanInterval = require('human-interval');
-const debug = require('debug')('agenda:processEvery');
-
-/**
- * Set the default process interval
- * @name Agenda#processEvery
- * @function
- * @param {Number} time time to process
- * @returns {exports} agenda instance
- */
-module.exports = function(time) {
-  debug('Agenda.processEvery(%d)', time);
-  this._processEvery = humanInterval(time);
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/agenda_purge.js.html b/docs/agenda/1.0.3/agenda_purge.js.html deleted file mode 100644 index e3c10d0..0000000 --- a/docs/agenda/1.0.3/agenda_purge.js.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - agenda/purge.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/purge.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:purge');
-
-/**
- * Removes all jobs from queue
- * @name Agenda#purge
- * @function
- * @returns {Promise}
- */
-module.exports = async function() {
-  // @NOTE: Only use after defining your jobs
-  const definedNames = Object.keys(this._definitions);
-  debug('Agenda.purge(%o)', definedNames);
-  return this.cancel({name: {$not: {$in: definedNames}}});
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/agenda_save-job.js.html b/docs/agenda/1.0.3/agenda_save-job.js.html deleted file mode 100644 index 115e0b7..0000000 --- a/docs/agenda/1.0.3/agenda_save-job.js.html +++ /dev/null @@ -1,247 +0,0 @@ - - - - - - - - - - - agenda/save-job.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/save-job.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:saveJob');
-const utils = require('../utils');
-
-const processJobs = utils.processJobs;
-
-/**
- * Given a result for findOneAndUpdate() or insert() above, determine whether to process
- * the job immediately or to let the processJobs() interval pick it up later
- * @param {Error} err error passed in via MongoDB call as to whether modify call failed or passed
- * @param {*} result the data returned from the findOneAndUpdate() call or insertOne() call
- * @access private
- * @returns {undefined}
- */
-const processDbResult = (job, result) => {
-  debug('processDbResult() called with success, checking whether to process job immediately or not');
-
-  // We have a result from the above calls
-  // findAndModify() returns different results than insertOne() so check for that
-  let res = result.ops ? result.ops : result.value;
-  if (res) {
-    // If it is an array, grab the first job
-    if (Array.isArray(res)) {
-      res = res[0];
-    }
-
-    // Grab ID and nextRunAt from MongoDB and store it as an attribute on Job
-    job.attrs._id = res._id;
-    job.attrs.nextRunAt = res.nextRunAt;
-
-    // If the current job would have been processed in an older scan, process the job immediately
-    if (job.attrs.nextRunAt && job.attrs.nextRunAt < this._nextScanAt) {
-      debug('[%s:%s] job would have ran by nextScanAt, processing the job immediately', job.attrs.name, res._id);
-      processJobs.call(this, job);
-    }
-  }
-
-  // Return the Job instance
-  return job;
-};
-
-/**
- * Save the properties on a job to MongoDB
- * @name Agenda#saveJob
- * @function
- * @param {Job} job job to save into MongoDB
- * @returns {Promise} resolves when job is saved or errors
- */
-module.exports = async function(job) {
-  try {
-    debug('attempting to save a job into Agenda instance');
-
-    // Grab information needed to save job but that we don't want to persist in MongoDB
-    const id = job.attrs._id;
-    const unique = job.attrs.unique;
-    const uniqueOpts = job.attrs.uniqueOpts;
-
-    // Store job as JSON and remove props we don't want to store from object
-    const props = job.toJSON();
-    delete props._id;
-    delete props.unique;
-    delete props.uniqueOpts;
-
-    // Store name of agenda queue as last modifier in job data
-    props.lastModifiedBy = this._name;
-    debug('[job %s] set job props: \n%O', id, props);
-
-    // Grab current time and set default query options for MongoDB
-    const now = new Date();
-    const protect = {};
-    let update = {$set: props};
-    debug('current time stored as %s', now.toISOString());
-
-    // If the job already had an ID, then update the properties of the job
-    // i.e, who last modified it, etc
-    if (id) {
-      // Update the job and process the resulting data'
-      debug('job already has _id, calling findOneAndUpdate() using _id as query');
-      const result = await this._collection.findOneAndUpdate(
-        {_id: id},
-        update,
-        {returnDocument: 'after'}
-      );
-      return processDbResult(job, result);
-    } else if (props.type === 'single') {
-      // Job type set to 'single' so...
-      // NOTE: Again, not sure about difference between 'single' here and 'once' in job.js
-      debug('job with type of "single" found');
-
-      // If the nextRunAt time is older than the current time, "protect" that property, meaning, don't change
-      // a scheduled job's next run time!
-      if (props.nextRunAt && props.nextRunAt <= now) {
-        debug('job has a scheduled nextRunAt time, protecting that field from upsert');
-        protect.nextRunAt = props.nextRunAt;
-        delete props.nextRunAt;
-      }
-
-      // If we have things to protect, set them in MongoDB using $setOnInsert
-      if (Object.keys(protect).length > 0) {
-        update.$setOnInsert = protect;
-      }
-
-      // Try an upsert
-      // NOTE: 'single' again, not exactly sure what it means
-      debug('calling findOneAndUpdate() with job name and type of "single" as query');
-      const result = await this._collection.findOneAndUpdate({
-        name: props.name,
-        type: 'single'
-      },
-      update, {
-        upsert: true,
-        returnDocument: 'after'
-      });
-      return processDbResult(job, result);
-    } else if (unique) {
-      // If we want the job to be unique, then we can upsert based on the 'unique' query object that was passed in
-      const query = job.attrs.unique;
-      query.name = props.name;
-      if (uniqueOpts && uniqueOpts.insertOnly) {
-        update = {$setOnInsert: props};
-      }
-
-      // Use the 'unique' query object to find an existing job or create a new one
-      debug('calling findOneAndUpdate() with unique object as query: \n%O', query);
-      const result = await this._collection.findOneAndUpdate(query, update, {upsert: true, returnDocument: 'after'});
-      return processDbResult(job, result);
-    }
-      // If all else fails, the job does not exist yet so we just insert it into MongoDB
-    debug('using default behavior, inserting new job via insertOne() with props that were set: \n%O', props);
-    const result = await this._collection.insertOne(props);
-    return processDbResult(job, result);
-  } catch (err) {
-    debug('processDbResult() received an error, job was not updated/created');
-    throw err;
-  }
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/agenda_schedule.js.html b/docs/agenda/1.0.3/agenda_schedule.js.html deleted file mode 100644 index 15aaf40..0000000 --- a/docs/agenda/1.0.3/agenda_schedule.js.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - - - - agenda/schedule.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/schedule.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:schedule');
-
-/**
- * Schedule a job or jobs at a specific time
- * @name Agenda#schedule
- * @function
- * @param {String} when when the job gets run
- * @param {Array<String>} names array of job names to run
- * @param {Object} data data to send to job
- * @returns {Promise<Job>} job or jobs created
- */
-module.exports = function(when, names, data) {
-  const self = this;
-
-  /**
-   * Internal method that creates a job with given date
-   * @param {String} when when the job gets run
-   * @param {String} name of job to run
-   * @param {Object} data data to send to job
-   * @returns {Job} instance of new job
-   */
-  const createJob = async (when, name, data) => {
-    const job = self.create(name, data);
-
-    await job.schedule(when).save();
-
-    return job;
-  };
-
-  /**
-   * Internal helper method that calls createJob on a names array
-   * @param {String} when when the job gets run
-   * @param {*} names of jobs to run
-   * @param {Object} data data to send to job
-   * @returns {Array<Job>} jobs that were created
-   */
-  const createJobs = async (when, names, data) => {
-    try {
-      const jobs = await Promise.all(names.map(name => createJob(when, name, data)));
-      debug('Agenda.schedule()::createJobs() -> all jobs created successfully');
-      return jobs;
-    } catch (err) {
-      debug('Agenda.schedule()::createJobs() -> error creating one or more of the jobs');
-      throw err;
-    }
-  };
-
-  if (typeof names === 'string' || names instanceof String) {
-    debug('Agenda.schedule(%s, %O, [%O], cb)', when, names);
-    return createJob(when, names, data);
-  } else if (Array.isArray(names)) {
-    debug('Agenda.schedule(%s, %O, [%O])', when, names);
-    return createJobs(when, names, data);
-  }
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/agenda_sort.js.html b/docs/agenda/1.0.3/agenda_sort.js.html deleted file mode 100644 index aa0f90a..0000000 --- a/docs/agenda/1.0.3/agenda_sort.js.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - agenda/sort.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/sort.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:sort');
-
-/**
- * Set the sort query for finding next job
- * Default is { nextRunAt: 1, priority: -1 }
- * @name Agenda#sort
- * @function
- * @param {Object} query sort query object for MongoDB
- * @returns {exports} agenda instance
- */
-module.exports = function(query) {
-  debug('Agenda.sort([Object])');
-  this._sort = query;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/agenda_start.js.html b/docs/agenda/1.0.3/agenda_start.js.html deleted file mode 100644 index b3573e8..0000000 --- a/docs/agenda/1.0.3/agenda_start.js.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - agenda/start.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/start.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:start');
-const utils = require('../utils');
-
-const processJobs = utils.processJobs;
-
-/**
- * Starts processing jobs using processJobs() methods, storing an interval ID
- * This method will only resolve if a db has been set up beforehand.
- * @name Agenda#start
- * @function
- * @returns {Promise}
- */
-module.exports = async function() {
-  if (this._processInterval) {
-    debug('Agenda.start was already called, ignoring');
-    return this._ready;
-  }
-  await this._ready;
-  debug('Agenda.start called, creating interval to call processJobs every [%dms]', this._processEvery);
-  this._processInterval = setInterval(processJobs.bind(this), this._processEvery);
-  process.nextTick(processJobs.bind(this));
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/agenda_stop.js.html b/docs/agenda/1.0.3/agenda_stop.js.html deleted file mode 100644 index 1667d57..0000000 --- a/docs/agenda/1.0.3/agenda_stop.js.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - - - - agenda/stop.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/stop.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:stop');
-
-/**
- * Clear the interval that processes the jobs
- * @name Agenda#stop
- * @function
- * @returns {Promise} resolves when job unlocking fails or passes
- */
-module.exports = function() {
-  const self = this;
-  /**
-   * Internal method to unlock jobs so that they can be re-run
-   * NOTE: May need to update what properties get set here, since job unlocking seems to fail
-   * @access private
-   * @returns {Promise} resolves when job unlocking fails or passes
-   */
-  const _unlockJobs = function() {
-    return new Promise((resolve, reject) => {
-      debug('Agenda._unlockJobs()');
-      const jobIds = self._lockedJobs.map(job => job.attrs._id);
-
-      if (jobIds.length === 0) {
-        debug('no jobs to unlock');
-        return resolve();
-      }
-
-      debug('about to unlock jobs with ids: %O', jobIds);
-      self._collection.updateMany({_id: {$in: jobIds}}, {$set: {lockedAt: null}}, err => {
-        if (err) {
-          return reject(err);
-        }
-
-        self._lockedJobs = [];
-        return resolve();
-      });
-    });
-  };
-
-  debug('Agenda.stop called, clearing interval for processJobs()');
-  clearInterval(this._processInterval);
-  this._processInterval = undefined;
-  return _unlockJobs();
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/fonts/OpenSans-Bold-webfont.eot b/docs/agenda/1.0.3/fonts/OpenSans-Bold-webfont.eot deleted file mode 100644 index 5d20d91..0000000 Binary files a/docs/agenda/1.0.3/fonts/OpenSans-Bold-webfont.eot and /dev/null differ diff --git a/docs/agenda/1.0.3/fonts/OpenSans-Bold-webfont.svg b/docs/agenda/1.0.3/fonts/OpenSans-Bold-webfont.svg deleted file mode 100644 index 3ed7be4..0000000 --- a/docs/agenda/1.0.3/fonts/OpenSans-Bold-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/1.0.3/fonts/OpenSans-Bold-webfont.woff b/docs/agenda/1.0.3/fonts/OpenSans-Bold-webfont.woff deleted file mode 100644 index 1205787..0000000 Binary files a/docs/agenda/1.0.3/fonts/OpenSans-Bold-webfont.woff and /dev/null differ diff --git a/docs/agenda/1.0.3/fonts/OpenSans-BoldItalic-webfont.eot b/docs/agenda/1.0.3/fonts/OpenSans-BoldItalic-webfont.eot deleted file mode 100644 index 1f639a1..0000000 Binary files a/docs/agenda/1.0.3/fonts/OpenSans-BoldItalic-webfont.eot and /dev/null differ diff --git a/docs/agenda/1.0.3/fonts/OpenSans-BoldItalic-webfont.svg b/docs/agenda/1.0.3/fonts/OpenSans-BoldItalic-webfont.svg deleted file mode 100644 index 6a2607b..0000000 --- a/docs/agenda/1.0.3/fonts/OpenSans-BoldItalic-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/1.0.3/fonts/OpenSans-BoldItalic-webfont.woff b/docs/agenda/1.0.3/fonts/OpenSans-BoldItalic-webfont.woff deleted file mode 100644 index ed760c0..0000000 Binary files a/docs/agenda/1.0.3/fonts/OpenSans-BoldItalic-webfont.woff and /dev/null differ diff --git a/docs/agenda/1.0.3/fonts/OpenSans-Italic-webfont.eot b/docs/agenda/1.0.3/fonts/OpenSans-Italic-webfont.eot deleted file mode 100644 index 0c8a0ae..0000000 Binary files a/docs/agenda/1.0.3/fonts/OpenSans-Italic-webfont.eot and /dev/null differ diff --git a/docs/agenda/1.0.3/fonts/OpenSans-Italic-webfont.svg b/docs/agenda/1.0.3/fonts/OpenSans-Italic-webfont.svg deleted file mode 100644 index e1075dc..0000000 --- a/docs/agenda/1.0.3/fonts/OpenSans-Italic-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/1.0.3/fonts/OpenSans-Italic-webfont.woff b/docs/agenda/1.0.3/fonts/OpenSans-Italic-webfont.woff deleted file mode 100644 index ff652e6..0000000 Binary files a/docs/agenda/1.0.3/fonts/OpenSans-Italic-webfont.woff and /dev/null differ diff --git a/docs/agenda/1.0.3/fonts/OpenSans-Light-webfont.eot b/docs/agenda/1.0.3/fonts/OpenSans-Light-webfont.eot deleted file mode 100644 index 1486840..0000000 Binary files a/docs/agenda/1.0.3/fonts/OpenSans-Light-webfont.eot and /dev/null differ diff --git a/docs/agenda/1.0.3/fonts/OpenSans-Light-webfont.svg b/docs/agenda/1.0.3/fonts/OpenSans-Light-webfont.svg deleted file mode 100644 index 11a472c..0000000 --- a/docs/agenda/1.0.3/fonts/OpenSans-Light-webfont.svg +++ /dev/null @@ -1,1831 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/1.0.3/fonts/OpenSans-Light-webfont.woff b/docs/agenda/1.0.3/fonts/OpenSans-Light-webfont.woff deleted file mode 100644 index e786074..0000000 Binary files a/docs/agenda/1.0.3/fonts/OpenSans-Light-webfont.woff and /dev/null differ diff --git a/docs/agenda/1.0.3/fonts/OpenSans-LightItalic-webfont.eot b/docs/agenda/1.0.3/fonts/OpenSans-LightItalic-webfont.eot deleted file mode 100644 index 8f44592..0000000 Binary files a/docs/agenda/1.0.3/fonts/OpenSans-LightItalic-webfont.eot and /dev/null differ diff --git a/docs/agenda/1.0.3/fonts/OpenSans-LightItalic-webfont.svg b/docs/agenda/1.0.3/fonts/OpenSans-LightItalic-webfont.svg deleted file mode 100644 index 431d7e3..0000000 --- a/docs/agenda/1.0.3/fonts/OpenSans-LightItalic-webfont.svg +++ /dev/null @@ -1,1835 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/1.0.3/fonts/OpenSans-LightItalic-webfont.woff b/docs/agenda/1.0.3/fonts/OpenSans-LightItalic-webfont.woff deleted file mode 100644 index 43e8b9e..0000000 Binary files a/docs/agenda/1.0.3/fonts/OpenSans-LightItalic-webfont.woff and /dev/null differ diff --git a/docs/agenda/1.0.3/fonts/OpenSans-Regular-webfont.eot b/docs/agenda/1.0.3/fonts/OpenSans-Regular-webfont.eot deleted file mode 100644 index 6bbc3cf..0000000 Binary files a/docs/agenda/1.0.3/fonts/OpenSans-Regular-webfont.eot and /dev/null differ diff --git a/docs/agenda/1.0.3/fonts/OpenSans-Regular-webfont.svg b/docs/agenda/1.0.3/fonts/OpenSans-Regular-webfont.svg deleted file mode 100644 index 25a3952..0000000 --- a/docs/agenda/1.0.3/fonts/OpenSans-Regular-webfont.svg +++ /dev/null @@ -1,1831 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/1.0.3/fonts/OpenSans-Regular-webfont.woff b/docs/agenda/1.0.3/fonts/OpenSans-Regular-webfont.woff deleted file mode 100644 index e231183..0000000 Binary files a/docs/agenda/1.0.3/fonts/OpenSans-Regular-webfont.woff and /dev/null differ diff --git a/docs/agenda/1.0.3/fonts/OpenSans-Semibold-webfont.eot b/docs/agenda/1.0.3/fonts/OpenSans-Semibold-webfont.eot deleted file mode 100644 index d8375dd..0000000 Binary files a/docs/agenda/1.0.3/fonts/OpenSans-Semibold-webfont.eot and /dev/null differ diff --git a/docs/agenda/1.0.3/fonts/OpenSans-Semibold-webfont.svg b/docs/agenda/1.0.3/fonts/OpenSans-Semibold-webfont.svg deleted file mode 100644 index eec4db8..0000000 --- a/docs/agenda/1.0.3/fonts/OpenSans-Semibold-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/1.0.3/fonts/OpenSans-Semibold-webfont.ttf b/docs/agenda/1.0.3/fonts/OpenSans-Semibold-webfont.ttf deleted file mode 100644 index b329084..0000000 Binary files a/docs/agenda/1.0.3/fonts/OpenSans-Semibold-webfont.ttf and /dev/null differ diff --git a/docs/agenda/1.0.3/fonts/OpenSans-Semibold-webfont.woff b/docs/agenda/1.0.3/fonts/OpenSans-Semibold-webfont.woff deleted file mode 100644 index 28d6ade..0000000 Binary files a/docs/agenda/1.0.3/fonts/OpenSans-Semibold-webfont.woff and /dev/null differ diff --git a/docs/agenda/1.0.3/fonts/OpenSans-SemiboldItalic-webfont.eot b/docs/agenda/1.0.3/fonts/OpenSans-SemiboldItalic-webfont.eot deleted file mode 100644 index 0ab1db2..0000000 Binary files a/docs/agenda/1.0.3/fonts/OpenSans-SemiboldItalic-webfont.eot and /dev/null differ diff --git a/docs/agenda/1.0.3/fonts/OpenSans-SemiboldItalic-webfont.svg b/docs/agenda/1.0.3/fonts/OpenSans-SemiboldItalic-webfont.svg deleted file mode 100644 index 7166ec1..0000000 --- a/docs/agenda/1.0.3/fonts/OpenSans-SemiboldItalic-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/1.0.3/fonts/OpenSans-SemiboldItalic-webfont.ttf b/docs/agenda/1.0.3/fonts/OpenSans-SemiboldItalic-webfont.ttf deleted file mode 100644 index d2d6318..0000000 Binary files a/docs/agenda/1.0.3/fonts/OpenSans-SemiboldItalic-webfont.ttf and /dev/null differ diff --git a/docs/agenda/1.0.3/fonts/OpenSans-SemiboldItalic-webfont.woff b/docs/agenda/1.0.3/fonts/OpenSans-SemiboldItalic-webfont.woff deleted file mode 100644 index d4dfca4..0000000 Binary files a/docs/agenda/1.0.3/fonts/OpenSans-SemiboldItalic-webfont.woff and /dev/null differ diff --git a/docs/agenda/1.0.3/global.html b/docs/agenda/1.0.3/global.html deleted file mode 100644 index 7c8a5ec..0000000 --- a/docs/agenda/1.0.3/global.html +++ /dev/null @@ -1,338 +0,0 @@ - - - - - - - - - Global - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- Global -

- - - - -
-
- -

- - - -

- - - -
- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - - - - - - - - - -

Methods

- - - - - - - - - - - - - -

- parsePriority(priority) → {Number} -

-
- - - - - -
-

Internal method to turn priority into a number

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
priority - - - - String - - - | - - - Number - - - - - - - -

string to parse into number

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - -
-
- - - - -
- -
- - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/1.0.3/icons/home.svg b/docs/agenda/1.0.3/icons/home.svg deleted file mode 100644 index 676d2d3..0000000 --- a/docs/agenda/1.0.3/icons/home.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/docs/agenda/1.0.3/icons/search.svg b/docs/agenda/1.0.3/icons/search.svg deleted file mode 100644 index ccc84b6..0000000 --- a/docs/agenda/1.0.3/icons/search.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/docs/agenda/1.0.3/index.html b/docs/agenda/1.0.3/index.html deleted file mode 100644 index 1a4bff7..0000000 --- a/docs/agenda/1.0.3/index.html +++ /dev/null @@ -1,682 +0,0 @@ - - - - - - - - - Home - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- - - - - - - - - - - - -
-
-

- Agenda -

-

- A light-weight job scheduling library for Node.js -

-

- Slack Status - Build Status - dependencies Status - devDependencies Status - Coverage Status -
-
-
-

- -

Agenda offers

    -
  • Minimal overhead. Agenda aims to keep its code base small.
  • -
  • Mongo backed persistence layer.
  • -
  • Scheduling with configurable priority, concurrency, and repeating
  • -
  • Scheduling via cron or human readable syntax.
  • -
  • Event backed job queue that you can hook into.
  • -
  • Agendash: optional standalone web-interface
  • -
  • Agenda-rest: optional standalone REST API
  • -
-

Installation

Install via NPM

-
npm install agenda

You will also need a working Mongo database (v3) to point it to.

-

Example Usage


-var mongoConnectionString = 'mongodb://127.0.0.1/agenda';
-
-var agenda = new Agenda({db: {address: mongoConnectionString}});
-
-// or override the default collection name:
-// var agenda = new Agenda({db: {address: mongoConnectionString, collection: 'jobCollectionName'}});
-
-// or pass additional connection options:
-// var agenda = new Agenda({db: {address: mongoConnectionString, collection: 'jobCollectionName', options: {ssl: true}}});
-
-// or pass in an existing mongodb-native MongoClient instance
-// var agenda = new Agenda({mongo: myMongoClient});
-
-agenda.define('delete old users', function(job, done) {
-  User.remove({lastLogIn: { $lt: twoDaysAgo }}, done);
-});
-
-(async function() { // IIFE to give access to async/await
-  await agenda.start();
-
-  await agenda.every('3 minutes', 'delete old users');
-
-  // Alternatively, you could also do:
-  await agenda.every('*/3 * * * *', 'delete old users');
-})();
-
agenda.define('send email report', {priority: 'high', concurrency: 10}, function(job, done) {
-  var data = job.attrs.data;
-  emailClient.send({
-    to: data.to,
-    from: 'example@example.com',
-    subject: 'Email Report',
-    body: '...'
-  }, done);
-});
-
-(async function() {
-  await agenda.start();
-  await agenda.schedule('in 20 minutes', 'send email report', {to: 'admin@example.com'});
-})();
(async function() {
-  var weeklyReport = agenda.create('send email report', {to: 'another-guy@example.com'})
-  await agenda.start();
-  await weeklyReport.repeatEvery('1 week').save();
-})();

Full documentation

Agenda's basic control structure is an instance of an agenda. Agenda's are -mapped to a database collection and load the jobs from within.

-

Table of Contents

-

Configuring an agenda

All configuration methods are chainable, meaning you can do something like:

-
var agenda = new Agenda();
-agenda
-  .database(...)
-  .processEvery('3 minutes')
-  ...;

Agenda uses Human Interval for specifying the intervals. It supports the following units:

-

seconds, minutes, hours, days,weeks, months -- assumes 30 days, years -- assumes 365 days

-

More sophisticated examples

-
agenda.processEvery('one minute');
-agenda.processEvery('1.5 minutes');
-agenda.processEvery('3 days and 4 hours');
-agenda.processEvery('3 days, 4 hours and 36 seconds');

database(url, [collectionName])

Specifies the database at the url specified. If no collection name is given, -agendaJobs is used.

-
agenda.database('localhost:27017/agenda-test', 'agendaJobs');

You can also specify it during instantiation.

-
var agenda = new Agenda({db: { address: 'localhost:27017/agenda-test', collection: 'agendaJobs' }});

Agenda will emit a ready event (see Agenda Events) when properly connected to the database. -It is safe to call agenda.start() without waiting for this event, as this is handled internally. -If you're using the db options, or call database, then you may still need to listen for ready before saving jobs.

-

mongo(mongoClientInstance)

Use an existing mongodb-native MongoClient instance. This can help consolidate connections to a -database. You can instead use .database to have agenda handle connecting for -you.

-

Please note that this must be a collection. Also, you will want to run the following -afterwards to ensure the database has the proper indexes:

-
(async () => {
-  await agenda._ready;
-
-  try {
-    agenda._collection.createIndex({
-      disabled: 1,
-      lockedAt: 1,
-      name: 1,
-      nextRunAt: 1,
-      priority: -1
-    }, {
-      name: 'findAndLockNextJobIndex'
-    });
-  } catch (err) {
-    console.log('Failed to create Agenda index!');
-    console.error(err);
-
-    throw err;
-  }
-
-  console.log('Agenda index created.');
-
-})();

You can also specify it during instantiation.

-
var agenda = new Agenda({mongo: mongoClientInstance});

name(name)

Takes a string name and sets lastModifiedBy to it in the job database. -Useful for if you have multiple job processors (agendas) and want to see which -job queue last ran the job.

-
agenda.name(os.hostname + '-' + process.pid);

You can also specify it during instantiation

-
var agenda = new Agenda({name: 'test queue'});

processEvery(interval)

Takes a string interval which can be either a traditional javascript number, -or a string such as 3 minutes

-

Specifies the frequency at which agenda will query the database looking for jobs -that need to be processed. Agenda internally uses setTimeout to guarantee that -jobs run at (close to ~3ms) the right time.

-

Decreasing the frequency will result in fewer database queries, but more jobs -being stored in memory.

-

Also worth noting is that if the job queue is shutdown, any jobs stored in memory -that haven't run will still be locked, meaning that you may have to wait for the -lock to expire.

-
agenda.processEvery('1 minute');

You can also specify it during instantiation

-
var agenda = new Agenda({processEvery: '30 seconds'});

maxConcurrency(number)

Takes a number which specifies the max number of jobs that can be running at -any given moment. By default it is 20.

-
agenda.maxConcurrency(20);

You can also specify it during instantiation

-
var agenda = new Agenda({maxConcurrency: 20});

defaultConcurrency(number)

Takes a number which specifies the default number of a specific job that can be running at -any given moment. By default it is 5.

-
agenda.defaultConcurrency(5);

You can also specify it during instantiation

-
var agenda = new Agenda({defaultConcurrency: 5});

lockLimit(number)

Takes a number which specifies the max number jobs that can be locked at any given moment. By default it is 0 for no max.

-
agenda.lockLimit(0);

You can also specify it during instantiation

-
var agenda = new Agenda({lockLimit: 0});

defaultLockLimit(number)

Takes a number which specifies the default number of a specific job that can be locked at any given moment. By default it is 0 for no max.

-
agenda.defaultLockLimit(0);

You can also specify it during instantiation

-
var agenda = new Agenda({defaultLockLimit: 0});

defaultLockLifetime(number)

Takes a number which specifies the default lock lifetime in milliseconds. By -default it is 10 minutes. This can be overridden by specifying the -lockLifetime option to a defined job.

-

A job will unlock if it is finished (ie. done is called) before the lockLifetime. -The lock is useful if the job crashes or times out.

-
agenda.defaultLockLifetime(10000);

You can also specify it during instantiation

-
var agenda = new Agenda({defaultLockLifetime: 10000});

sort(query)

Takes a query which specifies the sort query to be used for finding and locking the next job.

-

By default it is { nextRunAt: 1, priority: -1 }, which obeys a first in first out approach, with respect to priority.

-

Agenda Events

An instance of an agenda will emit the following events:

-
    -
  • ready - called when Agenda mongo connection is successfully opened and indeces created.
      If you're passing agenda an existing connection, ou shouldn't need to listen for this, as `agenda.start()` will not resolve until indeces have been created.
    -  If you're using the `db` options, or call `database`, then you may still need to listen for `ready` before saving jobs. `agenda.start()` will still wait for the connection to be opened.
  • -
  • error - called when Agenda mongo connection process has thrown an error
  • -
-
  await agenda.start();

Defining Job Processors

Before you can use a job, you must define its processing behavior.

-

define(jobName, [options], fn)

Defines a job with the name of jobName. When a job of jobName gets run, it -will be passed to fn(job, done). To maintain asynchronous behavior, you must -call done() when you are processing the job. If your function is synchronous, -you may omit done from the signature.

-

options is an optional argument which can overwrite the defaults. It can take -the following:

-
    -
  • concurrency: number maximum number of that job that can be running at once (per instance of agenda)
  • -
  • lockLimit: number maximum number of that job that can be locked at once (per instance of agenda)
  • -
  • lockLifetime: number interval in ms of how long the job stays locked for (see multiple job processors for more info). -A job will automatically unlock if done() is called.
  • -
  • priority: (lowest|low|normal|high|highest|number) specifies the priority -of the job. Higher priority jobs will run first. See the priority mapping -below
  • -
-

Priority mapping:

-
{
-  highest: 20,
-  high: 10,
-  normal: 0,
-  low: -10,
-  lowest: -20
-}

Async Job:

-
agenda.define('some long running job', function(job, done) {
-  doSomelengthyTask(function(data) {
-    formatThatData(data);
-    sendThatData(data);
-    done();
-  });
-});

Sync Job:

-
agenda.define('say hello', function(job) {
-  console.log('Hello!');
-});

Creating Jobs

every(interval, name, [data], [options], [cb])

Runs job name at the given interval. Optionally, data and options can be passed in. -Every creates a job of type single, which means that it will only create one -job in the database, even if that line is run multiple times. This lets you put -it in a file that may get run multiple times, such as webserver.js which may -reboot from time to time.

-

interval can be a human-readable format String, a cron format String, or a Number.

-

data is an optional argument that will be passed to the processing function -under job.attrs.data.

-

options is an optional argument that will be passed to job.repeatEvery. In order to use -this argument, data must also be specified.

-

cb is an optional callback function which will be called when the job has been -persisted in the database.

-

Returns the job.

-
agenda.define('printAnalyticsReport', function(job, done) {
-  User.doSomethingReallyIntensive(function(err, users) {
-    processUserData();
-    console.log('I print a report!');
-    done();
-  });
-});
-
-agenda.every('15 minutes', 'printAnalyticsReport');

Optionally, name could be array of job names, which is convenient for scheduling -different jobs for same interval.

-
agenda.every('15 minutes', ['printAnalyticsReport', 'sendNotifications', 'updateUserRecords']);

In this case, every returns array of jobs.

-

schedule(when, name, [data], [cb])

Schedules a job to run name once at a given time. when can be a Date or a -String such as tomorrow at 5pm.

-

data is an optional argument that will be passed to the processing function -under job.attrs.data.

-

cb is an optional callback function which will be called when the job has been -persisted in the database.

-

Returns the job.

-
agenda.schedule('tomorrow at noon', 'printAnalyticsReport', {userCount: 100});

Optionally, name could be array of job names, similar to every method.

-
agenda.schedule('tomorrow at noon', ['printAnalyticsReport', 'sendNotifications', 'updateUserRecords']);

In this case, schedule returns array of jobs.

-

now(name, [data], [cb])

Schedules a job to run name once immediately.

-

data is an optional argument that will be passed to the processing function -under job.attrs.data.

-

cb is an optional callback function which will be called when the job has been -persisted in the database.

-

Returns the job.

-
agenda.now('do the hokey pokey');

create(jobName, data)

Returns an instance of a jobName with data. This does NOT save the job in -the database. See below to learn how to manually work with jobs.

-
var job = agenda.create('printAnalyticsReport', {userCount: 100});
-job.save(function(err) {
-  console.log('Job successfully saved');
-});

Managing Jobs

jobs(mongodb-native query)

Lets you query all of the jobs in the agenda job's database. This is a full mongodb-native -find query. See mongodb-native's documentation for details.

-
agenda.jobs({name: 'printAnalyticsReport'}, function(err, jobs) {
-  // Work with jobs (see below)
-});

cancel(mongodb-native query, cb)

Cancels any jobs matching the passed mongodb-native query, and removes them from the database.

-
agenda.cancel({name: 'printAnalyticsReport'}, function(err, numRemoved) {
-});

This functionality can also be achieved by first retrieving all the jobs from the database using agenda.jobs(), looping through the resulting array and calling job.remove() on each. It is however preferable to use agenda.cancel() for this use case, as this ensures the operation is atomic.

-

purge(cb)

Removes all jobs in the database without defined behaviors. Useful if you change a definition name and want to remove old jobs.

-

IMPORTANT: Do not run this before you finish defining all of your jobs. If you do, you will nuke your database of jobs.

-
agenda.purge(function(err, numRemoved) {
-});

Starting the job processor

To get agenda to start processing jobs from the database you must start it. This -will schedule an interval (based on processEvery) to check for new jobs and -run them. You can also stop the queue.

-

start

Starts the job queue processing, checking processEvery time to see if there -are new jobs.

-

stop

Stops the job queue processing. Unlocks currently running jobs.

-

This can be very useful for graceful shutdowns so that currently running/grabbed jobs are abandoned so that other -job queues can grab them / they are unlocked should the job queue start again. Here is an example of how to do a graceful -shutdown.

-
async function graceful() {
-  await agenda.stop();
-  process.exit(0);
-}
-
-process.on('SIGTERM', graceful);
-process.on('SIGINT' , graceful);

Multiple job processors

Sometimes you may want to have multiple node instances / machines process from -the same queue. Agenda supports a locking mechanism to ensure that multiple -queues don't process the same job.

-

You can configure the locking mechanism by specifying lockLifetime as an -interval when defining the job.

-
agenda.define('someJob', {lockLifetime: 10000}, function(job, cb) {
-  //Do something in 10 seconds or less...
-});

This will ensure that no other job processor (this one included) attempts to run the job again -for the next 10 seconds. If you have a particularly long running job, you will want to -specify a longer lockLifetime.

-

By default it is 10 minutes. Typically you shouldn't have a job that runs for 10 minutes, -so this is really insurance should the job queue crash before the job is unlocked.

-

When a job is finished (ie. done is called), it will automatically unlock.

-

Manually working with a job

A job instance has many instance methods. All mutating methods must be followed -with a call to job.save() in order to persist the changes to the database.

-

repeatEvery(interval, [options])

Specifies an interval on which the job should repeat. The job runs at the time of defining as well in configured intervals, that is "run now and in intervals".

-

interval can be a human-readable format String, a cron format String, or a Number.

-

options is an optional argument containing:

-

options.timezone: should be a string as accepted by moment-timezone and is considered when using an interval in the cron string format.

-

options.skipImmediate: true | false (default) Setting this true will skip the immediate run. The first run will occur only in configured interval.

-
job.repeatEvery('10 minutes');
-job.save();
job.repeatEvery('3 minutes', {
-  skipImmediate: true
-});
-job.save();
job.repeatEvery('0 6 * * *', {
-  timezone: 'America/New_York'
-});
-job.save();

repeatAt(time)

Specifies a time when the job should repeat. Possible values

-
job.repeatAt('3:30pm');
-job.save();

schedule(time)

Specifies the next time at which the job should run.

-
job.schedule('tomorrow at 6pm');
-job.save();

priority(priority)

Specifies the priority weighting of the job. Can be a number or a string from -the above priority table.

-
job.priority('low');
-job.save();

unique(properties, [options])

Ensure that only one instance of this job exists with the specified properties

-

options is an optional argument which can overwrite the defaults. It can take -the following:

-
    -
  • insertOnly: boolean will prevent any properties from persisting if job already exists. Defaults to false.
  • -
-
job.unique({'data.type': 'active', 'data.userId': '123', nextRunAt(date)});
-job.save();

IMPORTANT: To avoid high CPU usage by MongoDB, Make sure to create an index on the used fields, like: data.type and data.userId for the example above.

-

fail(reason)

Sets job.attrs.failedAt to now, and sets job.attrs.failReason -to reason.

-

Optionally, reason can be an error, in which case job.attrs.failReason will -be set to error.message

-
job.fail('insuficient disk space');
-// or
-job.fail(new Error('insufficient disk space'));
-job.save();

run(callback)

Runs the given job and calls callback(err, job) upon completion. Normally -you never need to call this manually.

-
job.run(function(err, job) {
-  console.log('I don\'t know why you would need to do this...');
-});

save(callback)

Saves the job.attrs into the database.

-
job.save(function(err) {
-    if(!err) console.log('Successfully saved job to collection');
-})

remove(callback)

Removes the job from the database.

-
job.remove(function(err) {
-    if(!err) console.log('Successfully removed job from collection');
-})

disable()

Disables the job. Upcoming runs won't execute.

-

enable()

Enables the job if it got disabled before. Upcoming runs will execute.

-

touch(callback)

Resets the lock on the job. Useful to indicate that the job hasn't timed out -when you have very long running jobs.

-
agenda.define('super long job', function(job, done) {
-  doSomeLongTask(function() {
-    job.touch(function() {
-      doAnotherLongTask(function() {
-        job.touch(function() {
-          finishOurLongTasks(done);
-        });
-      });
-    });
-  });
-});

Job Queue Events

An instance of an agenda will emit the following events:

-
    -
  • start - called just before a job starts
  • -
  • start:job name - called just before the specified job starts
  • -
-
agenda.on('start', function(job) {
-  console.log('Job %s starting', job.attrs.name);
-});
    -
  • complete - called when a job finishes, regardless of if it succeeds or fails
  • -
  • complete:job name - called when a job finishes, regardless of if it succeeds or fails
  • -
-
agenda.on('complete', function(job) {
-  console.log('Job %s finished', job.attrs.name);
-});
    -
  • success - called when a job finishes successfully
  • -
  • success:job name - called when a job finishes successfully
  • -
-
agenda.on('success:send email', function(job) {
-  console.log('Sent Email Successfully to: %s', job.attrs.data.to);
-});
    -
  • fail - called when a job throws an error
  • -
  • fail:job name - called when a job throws an error
  • -
-
agenda.on('fail:send email', function(err, job) {
-  console.log('Job failed with error: %s', err.message);
-});

Frequently Asked Questions

What is the order in which jobs run?

Jobs are run with priority in a first in first out order (so they will be run in the order they were scheduled AND with respect to highest priority).

-

For example, if we have two jobs named "send-email" queued (both with the same priority), and the first job is queued at 3:00 PM and second job is queued at 3:05 PM with the same priority value, then the first job will run first if we start to send "send-email" jobs at 3:10 PM. However if the first job has a priority of 5 and the second job has a priority of 10, then the second will run first (priority takes precedence) at 3:10 PM.

-

The default MongoDB sort object is { nextRunAt: 1, priority: -1 } and can be changed through the option sort when configuring Agenda.

-

What is the difference between lockLimit and maxConcurrency?

Agenda will lock jobs 1 by one, setting the lockedAt property in mongoDB, and creating an instance of the Job class which it caches into the _lockedJobs array. This defaults to having no limit, but can be managed using lockLimit. If all jobs will need to be run before agenda's next interval (set via agenda.processEvery), then agenda will attempt to lock all jobs.

-

Agenda will also pull jobs from _lockedJobs and into _runningJobs. These jobs are actively being worked on by user code, and this is limited by maxConcurrency (defaults to 20).

-

If you have multiple instances of agenda processing the same job definition with a fast repeat time you may find they get unevenly loaded. This is because they will compete to lock as many jobs as possible, even if they don't have enough concurrency to process them. This can be resolved by tweaking the maxConcurrency and lockLimit properties.

-

Sample Project Structure?

Agenda doesn't have a preferred project structure and leaves it to the user to -choose how they would like to use it. That being said, you can check out the -example project structure below.

-

Can I Donate?

Thanks! I'm flattered, but it's really not necessary. If you really want to, you can find my gittip here.

-

Web Interface?

Agenda itself does not have a web interface built in but we do offer stand-alone web interface Agendash:

-

Agendash interface

-

Mongo vs Redis

The decision to use Mongo instead of Redis is intentional. Redis is often used for -non-essential data (such as sessions) and without configuration doesn't -guarantee the same level of persistence as Mongo (should the server need to be -restarted/crash).

-

Agenda decides to focus on persistence without requiring special configuration -of Redis (thereby degrading the performance of the Redis server on non-critical -data, such as sessions).

-

Ultimately if enough people want a Redis driver instead of Mongo, I will write -one. (Please open an issue requesting it). For now, Agenda decided to focus on -guaranteed persistence.

-

Spawning / forking processes.

Ultimately Agenda can work from a single job queue across multiple machines, node processes, or forks. If you are interested in having more than one worker, Bars3s has written up a fantastic example of how one might do it:

-
var cluster = require('cluster'),
-    cpuCount = require('os').cpus().length,
-    jobWorkers = [],
-    webWorkers = [];
-
-if (cluster.isMaster) {
-
-    // Create a worker for each CPU
-    for (var i = 0; i < cpuCount; i += 1) {
-        addJobWorker();
-        addWebWorker();
-    }
-
-    cluster.on('exit', function (worker, code, signal) {
-
-        if (jobWorkers.indexOf(worker.id) != -1) {
-            console.log('job worker ' + worker.process.pid + ' died. Trying to respawn...');
-            removeJobWorker(worker.id);
-            addJobWorker();
-        }
-
-        if (webWorkers.indexOf(worker.id) != -1) {
-            console.log('http worker ' + worker.process.pid + ' died. Trying to respawn...');
-            removeWebWorker(worker.id);
-            addWebWorker();
-        }
-    });
-
-} else {
-    if (process.env.web) {
-        console.log('start http server: ' + cluster.worker.id);
-        require('./app/web-http');//initialize the http server here
-    }
-
-    if (process.env.job) {
-        console.log('start job server: ' + cluster.worker.id);
-        require('./app/job-worker');//initialize the agenda here
-    }
-}
-
-function addWebWorker() {
-    webWorkers.push(cluster.fork({web: 1}).id);
-}
-
-function addJobWorker() {
-    jobWorkers.push(cluster.fork({job: 1}).id);
-}
-
-function removeWebWorker(id) {
-    webWorkers.splice(webWorkers.indexOf(id), 1);
-}
-
-function removeJobWorker(id) {
-    jobWorkers.splice(jobWorkers.indexOf(id), 1);
-}

Recovering lost Mongo connections ("auto_reconnect")

Agenda is configured by default to automatically reconnect indefinitely, emitting an error event -when no connection is available on each process tick, allowing you to restore the Mongo -instance without having to restart the application.

-

However, if you are using an existing Mongo client -you'll need to configure the reconnectTries and reconnectInterval connection settings -manually, otherwise you'll find that Agenda will throw an error with the message "MongoDB connection is not recoverable, -application restart required" if the connection cannot be recovered within 30 seconds.

-

Example Project Structure

Agenda will only process jobs that it has definitions for. This allows you to -selectively choose which jobs a given agenda will process.

-

Consider the following project structure, which allows us to share models with -the rest of our code base, and specify which jobs a worker processes, if any at -all.

-
- server.js
-- worker.js
-lib/
-  - agenda.js
-  controllers/
-    - user-controller.js
-  jobs/
-    - email.js
-    - video-processing.js
-    - image-processing.js
-   models/
-     - user-model.js
-     - blog-post.model.js

Sample job processor (eg. jobs/email.js)

-
var email = require('some-email-lib'),
-    User = require('../models/user-model.js');
-
-module.exports = function(agenda) {
-  agenda.define('registration email', function(job, done) {
-    User.get(job.attrs.data.userId, function(err, user) {
-       if(err) return done(err);
-       email(user.email(), 'Thanks for registering', 'Thanks for registering ' + user.name(), done);
-     });
-  });
-
-  agenda.define('reset password', function(job, done) {
-    // etc etc
-  })
-
-  // More email related jobs
-}

lib/agenda.js

-
var Agenda = require('agenda');
-
-
-var agenda = new Agenda(connectionOpts);
-
-
-var jobTypes = process.env.JOB_TYPES ? process.env.JOB_TYPES.split(',') : [];
-
-jobTypes.forEach(function(type) {
-  require('./lib/jobs/' + type)(agenda);
-})
-
-if (jobTypes.length) {
-  agenda.start(); // Returns a promise, which should be handled appropriately
-}
-
-module.exports = agenda;

lib/controllers/user-controller.js

-
var app = express(),
-    User = require('../models/user-model'),
-    agenda = require('../worker.js');
-
-app.post('/users', function(req, res, next) {
-  var user = new User(req.body);
-  user.save(function(err) {
-    if(err) return next(err);
-    agenda.now('registration email', { userId: user.primary() });
-    res.send(201, user.toJson());
-  });
-});

worker.js

-
require('./lib/agenda.js');

Now you can do the following in your project:

-
node server.js

Fire up an instance with no JOB_TYPES, giving you the ability to process jobs, -but not wasting resources processing jobs.

-
JOB_TYPES=email node server.js

Allow your http server to process email jobs.

-
JOB_TYPES=email node worker.js

Fire up an instance that processes email jobs.

-
JOB_TYPES=video-processing,image-processing node worker.js

Fire up an instance that processes video-processing/image-processing jobs. Good -for a heavy hitting server.

-

Known Issues

Versions <= 0.9.1

Cron string parsing (PR)

The current versions of Agenda parse cron dates as follows using this library: -node-cron

-

This library treats months as 0-11 where as normally, cron months are parsed as 1-12.

-
* * * * * *
-| | | | | |
-| | | | | +-- Year              (range: 1900-3000)
-| | | | +---- Day of the Week   (range: 1-7, 1 standing for Monday)
-| | | +------ Month of the Year (range: 0-11) NOTE: Difference here
-| | +-------- Day of the Month  (range: 1-31)
-| +---------- Hour              (range: 0-23)
-+------------ Minute            (range: 0-59)

Starting in version 1.0.0, cron will be parsed in the standard UNIX style:

-
* * * * * *
-| | | | | |
-| | | | | +-- Year              (range: 1900-3000)
-| | | | +---- Day of the Week   (range: 1-7, 1 standing for Monday)
-| | | +------ Month of the Year (range: 1-12) NOTE: Difference here
-| | +-------- Day of the Month  (range: 1-31)
-| +---------- Hour              (range: 0-23)
-+------------ Minute            (range: 0-59)

Debugging Issues

If you think you have encountered a bug, please feel free to report it here:

-

Submit Issue

-

Please provide us with as much details as possible such as:

-
    -
  • Agenda version
  • -
  • Environment (OSX, Linux, Windows, etc)
  • -
  • Small description of what happened
  • -
  • Any relevant stack track
  • -
  • Agenda logs (see below)
  • -
-

To turn on logging, please set your DEBUG env variable like so:

    -
  • OSX: DEBUG="agenda:*" node index.js
  • -
  • Linux: DEBUG="agenda:*" node index.js
  • -
  • Windows CMD: set DEBUG=agenda:*
  • -
  • Windows PowerShell: $env:DEBUG = "agenda:*"
  • -
-

While not necessary, attaching a text file with this debug information would -be extremely useful in debugging certain issues and is encouraged.

-

Acknowledgements

-

License

The MIT License

-
-
- - - - - -
- -
- - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/1.0.3/job_compute-next-run-at.js.html b/docs/agenda/1.0.3/job_compute-next-run-at.js.html deleted file mode 100644 index 4b41bee..0000000 --- a/docs/agenda/1.0.3/job_compute-next-run-at.js.html +++ /dev/null @@ -1,205 +0,0 @@ - - - - - - - - - - - job/compute-next-run-at.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/compute-next-run-at.js -

- - - - - -
-
-
'use strict';
-const humanInterval = require('human-interval');
-const CronTime = require('cron').CronTime;
-const moment = require('moment-timezone');
-const date = require('date.js');
-const debug = require('debug')('agenda:job');
-
-/**
- * Internal method used to compute next time a job should run and sets the proper values
- * @name Job#computeNextRunAt
- * @function
- * @returns {exports} instance of Job instance
- */
-module.exports = function() {
-  const interval = this.attrs.repeatInterval;
-  const timezone = this.attrs.repeatTimezone;
-  const repeatAt = this.attrs.repeatAt;
-  this.attrs.nextRunAt = undefined;
-
-  const dateForTimezone = date => {
-    date = moment(date);
-    if (timezone !== null) {
-      date.tz(timezone);
-    }
-    return date;
-  };
-
-  /**
-   * Internal method that computes the interval
-   * @returns {undefined}
-   */
-  const computeFromInterval = () => {
-    debug('[%s:%s] computing next run via interval [%s]', this.attrs.name, this.attrs._id, interval);
-    let lastRun = this.attrs.lastRunAt || new Date();
-    lastRun = dateForTimezone(lastRun);
-    try {
-      const cronTime = new CronTime(interval);
-      let nextDate = cronTime._getNextDateFrom(lastRun);
-      if (nextDate.valueOf() === lastRun.valueOf()) {
-        // Handle cronTime giving back the same date for the next run time
-        nextDate = cronTime._getNextDateFrom(dateForTimezone(new Date(lastRun.valueOf() + 1000)));
-      }
-      this.attrs.nextRunAt = nextDate;
-      debug('[%s:%s] nextRunAt set to [%s]', this.attrs.name, this.attrs._id, this.attrs.nextRunAt.toISOString());
-    } catch (e) {
-      // Nope, humanInterval then!
-      try {
-        if (!this.attrs.lastRunAt && humanInterval(interval)) {
-          this.attrs.nextRunAt = lastRun.valueOf();
-          debug('[%s:%s] nextRunAt set to [%s]', this.attrs.name, this.attrs._id, this.attrs.nextRunAt.toISOString());
-        } else {
-          this.attrs.nextRunAt = lastRun.valueOf() + humanInterval(interval);
-          debug('[%s:%s] nextRunAt set to [%s]', this.attrs.name, this.attrs._id, this.attrs.nextRunAt.toISOString());
-        }
-      } catch (e) {}
-    } finally {
-      if (isNaN(this.attrs.nextRunAt)) {
-        this.attrs.nextRunAt = undefined;
-        debug('[%s:%s] failed to calculate nextRunAt due to invalid repeat interval', this.attrs.name, this.attrs._id);
-        this.fail('failed to calculate nextRunAt due to invalid repeat interval');
-      }
-    }
-  };
-
-  /**
-   * Internal method to compute next run time from the repeat string
-   * @returns {undefined}
-   */
-  function computeFromRepeatAt() {
-    const lastRun = this.attrs.lastRunAt || new Date();
-    const nextDate = date(repeatAt).valueOf();
-
-    // If you do not specify offset date for below test it will fail for ms
-    const offset = Date.now();
-    if (offset === date(repeatAt, offset).valueOf()) {
-      this.attrs.nextRunAt = undefined;
-      debug('[%s:%s] failed to calculate repeatAt due to invalid format', this.attrs.name, this.attrs._id);
-      this.fail('failed to calculate repeatAt time due to invalid format');
-    } else if (nextDate.valueOf() === lastRun.valueOf()) {
-      this.attrs.nextRunAt = date('tomorrow at ', repeatAt);
-      debug('[%s:%s] nextRunAt set to [%s]', this.attrs.name, this.attrs._id, this.attrs.nextRunAt.toISOString());
-    } else {
-      this.attrs.nextRunAt = date(repeatAt);
-      debug('[%s:%s] nextRunAt set to [%s]', this.attrs.name, this.attrs._id, this.attrs.nextRunAt.toISOString());
-    }
-  }
-
-  if (interval) {
-    computeFromInterval.call(this);
-  } else if (repeatAt) {
-    computeFromRepeatAt.call(this);
-  }
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/job_disable.js.html b/docs/agenda/1.0.3/job_disable.js.html deleted file mode 100644 index 4dbe2df..0000000 --- a/docs/agenda/1.0.3/job_disable.js.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - job/disable.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/disable.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Prevents the job type from running
- * @name Job#disable
- * @function
- * @returns {exports} instance of Job
- */
-module.exports = function() {
-  this.attrs.disabled = true;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/job_enable.js.html b/docs/agenda/1.0.3/job_enable.js.html deleted file mode 100644 index 48c705b..0000000 --- a/docs/agenda/1.0.3/job_enable.js.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - job/enable.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/enable.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Allows job type to run
- * @name Job#enable
- * @function
- * @returns {Job} instance of Job
- */
-module.exports = function() {
-  this.attrs.disabled = false;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/job_fail.js.html b/docs/agenda/1.0.3/job_fail.js.html deleted file mode 100644 index 3efe1c2..0000000 --- a/docs/agenda/1.0.3/job_fail.js.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - - - - - job/fail.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/fail.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:job');
-
-/**
- * Fails the job with a reason (error) specified
- * @name Job#fail
- * @function
- * @param {Error|String} reason reason job failed
- * @returns {exports} instance of Job
- */
-module.exports = function(reason) {
-  if (reason instanceof Error) {
-    reason = reason.message;
-  }
-  this.attrs.failReason = reason;
-  this.attrs.failCount = (this.attrs.failCount || 0) + 1;
-  const now = new Date();
-  this.attrs.failedAt = now;
-  this.attrs.lastFinishedAt = now;
-  debug('[%s:%s] fail() called [%d] times so far', this.attrs.name, this.attrs._id, this.attrs.failCount);
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/job_index.js.html b/docs/agenda/1.0.3/job_index.js.html deleted file mode 100644 index 954cce2..0000000 --- a/docs/agenda/1.0.3/job_index.js.html +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - - - - - job/index.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/index.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Internal method to turn priority into a number
- * @param {String|Number} priority string to parse into number
- * @returns {Number} priority that was parsed
- */
-const parsePriority = priority => {
-  const priorityMap = {
-    lowest: -20,
-    low: -10,
-    normal: 0,
-    high: 10,
-    highest: 20
-  };
-  if (typeof priority === 'number' || priority instanceof Number) {
-    return priority;
-  }
-  return priorityMap[priority];
-};
-
-/**
- * @class
- * @param {Object} args
- * @property {Object} agenda - The Agenda instance
- * @property {Object} attrs
- */
-class Job {
-  constructor(args) {
-    args = args || {};
-
-    // Remove special args
-    this.agenda = args.agenda;
-    delete args.agenda;
-
-    // Process args
-    args.priority = parsePriority(args.priority) || 0;
-
-    // Set attrs to args
-    const attrs = {};
-    for (const key in args) {
-      if ({}.hasOwnProperty.call(args, key)) {
-        attrs[key] = args[key];
-      }
-    }
-
-    // Set defaults if undefined
-    // NOTE: What is the difference between 'once' here and 'single' in agenda/index.js?
-    attrs.nextRunAt = attrs.nextRunAt || new Date();
-    attrs.type = attrs.type || 'once';
-    this.attrs = attrs;
-  }
-}
-
-Job.prototype.toJSON = require('./to-json');
-Job.prototype.computeNextRunAt = require('./compute-next-run-at');
-Job.prototype.repeatEvery = require('./repeat-every');
-Job.prototype.repeatAt = require('./repeat-at');
-Job.prototype.disable = require('./disable');
-Job.prototype.enable = require('./enable');
-Job.prototype.unique = require('./unique');
-Job.prototype.schedule = require('./schedule');
-Job.prototype.priority = require('./priority');
-Job.prototype.fail = require('./fail');
-Job.prototype.run = require('./run');
-Job.prototype.isRunning = require('./is-running');
-Job.prototype.save = require('./save');
-Job.prototype.remove = require('./remove');
-Job.prototype.touch = require('./touch');
-
-module.exports = Job;
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/job_is-running.js.html b/docs/agenda/1.0.3/job_is-running.js.html deleted file mode 100644 index 8518f81..0000000 --- a/docs/agenda/1.0.3/job_is-running.js.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - job/is-running.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/is-running.js -

- - - - - -
-
-
'use strict';
-
-/**
- * A job is running if:
- * (lastRunAt exists AND lastFinishedAt does not exist)
- * OR
- * (lastRunAt exists AND lastFinishedAt exists but the lastRunAt is newer [in time] than lastFinishedAt)
- * @name Job#isRunning
- * @function
- * @returns {Boolean} Whether or not job is running at the moment (true for running)
- */
-module.exports = function() {
-  if (!this.attrs.lastRunAt) {
-    return false;
-  }
-  if (!this.attrs.lastFinishedAt) {
-    return true;
-  }
-  if (this.attrs.lockedAt && this.attrs.lastRunAt.getTime() > this.attrs.lastFinishedAt.getTime()) {
-    return true;
-  }
-  return false;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/job_priority.js.html b/docs/agenda/1.0.3/job_priority.js.html deleted file mode 100644 index 82309df..0000000 --- a/docs/agenda/1.0.3/job_priority.js.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - - - - - - job/priority.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/priority.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Internal method to turn priority into a number
- * @name Job#priority
- * @function
- * @param {String|Number} priority string to parse into number
- * @returns {Number} priority that was parsed
- */
-const parsePriority = priority => {
-  const priorityMap = {
-    lowest: -20,
-    low: -10,
-    normal: 0,
-    high: 10,
-    highest: 20
-  };
-  if (typeof priority === 'number' || priority instanceof Number) {
-    return priority;
-  }
-  return priorityMap[priority];
-};
-
-/**
- * Sets priority of the job
- * @param {String} priority priority of when job should be queued
- * @returns {exports} instance of Job
- */
-module.exports = function(priority) {
-  this.attrs.priority = parsePriority(priority);
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/job_remove.js.html b/docs/agenda/1.0.3/job_remove.js.html deleted file mode 100644 index cd9e8aa..0000000 --- a/docs/agenda/1.0.3/job_remove.js.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - - - - job/remove.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/remove.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Remove the job from MongoDB
- * @name Job#remove
- * @function
- * @returns {Promise} resolves when job removal fails or passes
- */
-module.exports = function() {
-  return this.agenda.cancel({_id: this.attrs._id});
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/job_repeat-at.js.html b/docs/agenda/1.0.3/job_repeat-at.js.html deleted file mode 100644 index 783ff5e..0000000 --- a/docs/agenda/1.0.3/job_repeat-at.js.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - job/repeat-at.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/repeat-at.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Sets a job to repeat at a specific time
- * @name Job#repeatAt
- * @function
- * @param {String} time time to repeat job at (human readable or number)
- * @returns {exports} instance of Job
- */
-module.exports = function(time) {
-  this.attrs.repeatAt = time;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/job_repeat-every.js.html b/docs/agenda/1.0.3/job_repeat-every.js.html deleted file mode 100644 index 9cc9cfd..0000000 --- a/docs/agenda/1.0.3/job_repeat-every.js.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - job/repeat-every.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/repeat-every.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Sets a job to repeat every X amount of time
- * @name Job#repeatEvery
- * @function
- * @param {String} interval repeat every X
- * @param {Object} options options to use for job
- * @returns {Job} instance of Job
- */
-module.exports = function(interval, options) {
-  options = options || {};
-  this.attrs.repeatInterval = interval;
-  this.attrs.repeatTimezone = options.timezone ? options.timezone : null;
-  if (options.skipImmediate) {
-    this.attrs.lastRunAt = new Date();
-    this.computeNextRunAt();
-    this.attrs.lastRunAt = undefined;
-  }
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/job_run.js.html b/docs/agenda/1.0.3/job_run.js.html deleted file mode 100644 index 953a3f9..0000000 --- a/docs/agenda/1.0.3/job_run.js.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - - - - - job/run.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/run.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:job');
-
-/**
- * Internal method (RUN)
- * @name Job#run
- * @function
- * @returns {Promise} Resolves when job persistence in MongoDB fails or passes
- */
-module.exports = function() {
-  const self = this;
-  const agenda = self.agenda;
-  const definition = agenda._definitions[self.attrs.name];
-
-  return new Promise(async (resolve, reject) => {
-    self.attrs.lastRunAt = new Date();
-    debug('[%s:%s] setting lastRunAt to: %s', self.attrs.name, self.attrs._id, self.attrs.lastRunAt.toISOString());
-    self.computeNextRunAt();
-    await self.save();
-
-    const jobCallback = async err => {
-      if (err) {
-        self.fail(err);
-      } else {
-        self.attrs.lastFinishedAt = new Date();
-      }
-
-      self.attrs.lockedAt = null;
-
-      await self.save().catch(err => {
-        debug('[%s:%s] failed to be saved to MongoDB', self.attrs.name, self.attrs._id);
-        reject(err);
-      });
-      debug('[%s:%s] was saved successfully to MongoDB', self.attrs.name, self.attrs._id);
-
-      if (err) {
-        agenda.emit('fail', err, self);
-        agenda.emit('fail:' + self.attrs.name, err, self);
-        debug('[%s:%s] has failed [%s]', self.attrs.name, self.attrs._id, err.message);
-      } else {
-        agenda.emit('success', self);
-        agenda.emit('success:' + self.attrs.name, self);
-        debug('[%s:%s] has succeeded', self.attrs.name, self.attrs._id);
-      }
-      agenda.emit('complete', self);
-      agenda.emit('complete:' + self.attrs.name, self);
-      debug('[%s:%s] job finished at [%s] and was unlocked', self.attrs.name, self.attrs._id, self.attrs.lastFinishedAt);
-      // Curiously, we still resolve successfully if the job processor failed.
-      // Agenda is not equipped to handle errors originating in user code, so, we leave them to inspect the side-effects of job.fail()
-      resolve(self);
-    };
-
-    try {
-      agenda.emit('start', self);
-      agenda.emit('start:' + self.attrs.name, self);
-      debug('[%s:%s] starting job', self.attrs.name, self.attrs._id);
-      if (!definition) {
-        debug('[%s:%s] has no definition, can not run', self.attrs.name, self.attrs._id);
-        throw new Error('Undefined job');
-      }
-      if (definition.fn.length === 2) {
-        debug('[%s:%s] process function being called', self.attrs.name, self.attrs._id);
-        definition.fn(self, jobCallback);
-      } else {
-        debug('[%s:%s] process function being called', self.attrs.name, self.attrs._id);
-        definition.fn(self);
-        await jobCallback();
-      }
-    } catch (err) {
-      debug('[%s:%s] unknown error occurred', self.attrs.name, self.attrs._id);
-      await jobCallback(err);
-    }
-  });
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/job_schedule.js.html b/docs/agenda/1.0.3/job_schedule.js.html deleted file mode 100644 index 59282a6..0000000 --- a/docs/agenda/1.0.3/job_schedule.js.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - job/schedule.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/schedule.js -

- - - - - -
-
-
'use strict';
-const date = require('date.js');
-
-/**
- * Schedules a job to run at specified time
- * @name Job#schedule
- * @function
- * @param {String} time schedule a job to run "then"
- * @returns {exports} instance of Job
- */
-module.exports = function(time) {
-  this.attrs.nextRunAt = (time instanceof Date) ? time : date(time);
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/job_to-json.js.html b/docs/agenda/1.0.3/job_to-json.js.html deleted file mode 100644 index 38f0924..0000000 --- a/docs/agenda/1.0.3/job_to-json.js.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - - - - - job/to-json.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/to-json.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Given a job, turn it into an object we can store in Mongo
- * @name Job#toJSON
- * @function
- * @returns {Object} json object from Job
- */
-module.exports = function() {
-  const self = this;
-  const attrs = self.attrs || {};
-  const result = {};
-
-  for (const prop in attrs) {
-    if ({}.hasOwnProperty.call(attrs, prop)) {
-      result[prop] = attrs[prop];
-    }
-  }
-
-  const dates = ['lastRunAt', 'lastFinishedAt', 'nextRunAt', 'failedAt', 'lockedAt'];
-  dates.forEach(d => {
-    if (result[d]) {
-      result[d] = new Date(result[d]);
-    }
-  });
-
-  return result;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/job_touch.js.html b/docs/agenda/1.0.3/job_touch.js.html deleted file mode 100644 index 8080ed4..0000000 --- a/docs/agenda/1.0.3/job_touch.js.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - job/touch.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/touch.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Updates "lockedAt" time so the job does not get picked up again
- * @name Job#touch
- * @function
- * @param {Function} cb called when job "touch" fails or passes
- * @returns {undefined}
- */
-module.exports = function(cb) {
-  this.attrs.lockedAt = new Date();
-  this.save(cb);
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/job_unique.js.html b/docs/agenda/1.0.3/job_unique.js.html deleted file mode 100644 index c944c4b..0000000 --- a/docs/agenda/1.0.3/job_unique.js.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - job/unique.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/unique.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Data to ensure is unique for job to be created
- * @name Job#unique
- * @function
- * @param {Object} unique mongo data query for unique
- * @param {Object} opts unique options
- * @returns {exports} instance of Job
- */
-module.exports = function(unique, opts) {
-  this.attrs.unique = unique;
-  this.attrs.uniqueOpts = opts;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/scripts/linenumber.js b/docs/agenda/1.0.3/scripts/linenumber.js deleted file mode 100644 index ff6c069..0000000 --- a/docs/agenda/1.0.3/scripts/linenumber.js +++ /dev/null @@ -1,24 +0,0 @@ -'use strict'; - -/* global document */ -(function () { - var lineId, lines, totalLines, anchorHash; - var source = document.getElementsByClassName('prettyprint source linenums'); - var i = 0; - var lineNumber = 0; - - if (source && source[0]) { - anchorHash = document.location.hash.substring(1); - lines = source[0].getElementsByTagName('li'); - totalLines = lines.length; - - for (; i < totalLines; i++) { - lineNumber++; - lineId = 'line' + lineNumber; - lines[i].id = lineId; - if (lineId === anchorHash) { - lines[i].className += ' selected'; - } - } - } -})(); diff --git a/docs/agenda/1.0.3/scripts/pagelocation.js b/docs/agenda/1.0.3/scripts/pagelocation.js deleted file mode 100644 index e138368..0000000 --- a/docs/agenda/1.0.3/scripts/pagelocation.js +++ /dev/null @@ -1,89 +0,0 @@ -'use strict'; - -$(document).ready(function () { - var currentSectionNav, target; - - // If an anchor hash is in the URL highlight the menu item - highlightActiveHash(); - // If a specific page section is in the URL highlight the menu item - highlightActiveSection(); - - // If a specific page section is in the URL scroll that section up to the top - currentSectionNav = $('#' + getCurrentSectionName() + '-nav'); - - if (currentSectionNav.position()) { - $('nav').scrollTop(currentSectionNav.position().top); - } - - // function to scroll to anchor when clicking an anchor linl - $('a[href*="#"]:not([href="#"])').click(function () { - /* eslint-disable no-invalid-this */ - if (location.pathname.replace(/^\//, '') === this.pathname.replace(/^\//, '') && location.hostname === this.hostname) { - target = $(this.hash); - target = target.length ? target : $('[name=' + this.hash.slice(1) + ']'); - if (target.length) { - $('html, body').animate({ - scrollTop: target.offset().top - }, 1000); - } - } - /* eslint-enable no-invalid-this */ - }); -}); - -// If a new anchor section is selected, change the hightlighted menu item -$(window).bind('hashchange', function (event) { - highlightActiveHash(event); -}); - -function highlightActiveHash(event) { - var oldUrl, oldSubSectionElement; - - // check for and remove old hash active state - if (event && event.originalEvent.oldURL) { - oldUrl = event.originalEvent.oldURL; - - if (oldUrl.indexOf('#') > -1) { - oldSubSectionElement = $('#' + getCurrentSectionName() + '-' + oldUrl.substring(oldUrl.indexOf('#') + 1) + '-nav'); - - if (oldSubSectionElement) { - oldSubSectionElement.removeClass('active'); - } - } - } - - if (getCurrentHashName()) { - $('#' + getCurrentSectionName() + '-' + getCurrentHashName() + '-nav').addClass('active'); - } -} - -function highlightActiveSection() { - var pageId = getCurrentSectionName(); - - $('#' + pageId + '-nav').addClass('active'); -} - -function getCurrentSectionName() { - var path = window.location.pathname; - var pageUrl = path.split('/').pop(); - - var sectionName = pageUrl.substring(0, pageUrl.indexOf('.')); - - // remove the wodr module- if its in the url - sectionName = sectionName.replace('module-', ''); - - return sectionName; -} - -function getCurrentHashName() { - var pageSubSectionId; - var pageSubSectionHash = window.location.hash; - - if (pageSubSectionHash) { - pageSubSectionId = pageSubSectionHash.substring(1).replace('.', ''); - - return pageSubSectionId; - } - - return false; -} diff --git a/docs/agenda/1.0.3/styles/jsdoc-default.css b/docs/agenda/1.0.3/styles/jsdoc-default.css deleted file mode 100644 index f2bc6a9..0000000 --- a/docs/agenda/1.0.3/styles/jsdoc-default.css +++ /dev/null @@ -1,957 +0,0 @@ -@font-face { - font-family: "Avenir Next W01"; - font-style: normal; - font-weight: 600; - src: url("https://fast.fonts.net/dv2/14/14c73713-e4df-4dba-933b-057feeac8dd1.woff2?d44f19a684109620e484167ba790e8180fd9e29df91d80ce3d096f014db863074e1ea706cf5ed4e1c042492e76df291ce1d24ec684d3d9da9684f55406b9f22bce02f0f30f556681593dafea074d7bd44e28a680d083ccfd44ed4f8a3087a20c56147c11f917ed1dbd85c4a18cf38da25e6ac78f008f472262304d50e7e0cb7541ef1642c676db6e4bde4924846f5daf486fbde9335e98f6a20f6664bc4525253d1d4fca42cf1c490483c8daf0237f6a0fd292563417ad80ca3e69321417747bdc6f0969f34b2a0401b5e2b9a4dfd5b06d9710850900c66b34870aef&projectId=f750d5c7-baa2-4767-afd7-45484f47fe17") format('woff2'); -} - -@font-face { - font-family: "Avenir Next W01"; - font-style: normal; - font-weight: 500; - src: url("https://fast.fonts.net/dv2/14/627fbb5a-3bae-4cd9-b617-2f923e29d55e.woff2?d44f19a684109620e484167ba790e8180fd9e29df91d80ce3d096f014db863074e1ea706cf5ed4e1c042492e76df291ce1d24ec684d3d9da9684f55406b9f22bce02f0f30f556681593dafea074d7bd44e28a680d083ccfd44ed4f8a3087a20c56147c11f917ed1dbd85c4a18cf38da25e6ac78f008f472262304d50e7e0cb7541ef1642c676db6e4bde4924846f5daf486fbde9335e98f6a20f6664bc4525253d1d4fca42cf1c490483c8daf0237f6a0fd292563417ad80ca3e69321417747bdc6f0969f34b2a0401b5e2b9a4dfd5b06d9710850900c66b34870aef&projectId=f750d5c7-baa2-4767-afd7-45484f47fe17") format('woff2'); -} - -@font-face { - font-family: "Avenir Next W01"; - font-style: normal; - font-weight: 400; - src: url("https://fast.fonts.net/dv2/14/2cd55546-ec00-4af9-aeca-4a3cd186da53.woff2?d44f19a684109620e484167ba790e8180fd9e29df91d80ce3d096f014db863074e1ea706cf5ed4e1c042492e76df291ce1d24ec684d3d9da9684f55406b9f22bce02f0f30f556681593dafea074d7bd44e28a680d083ccfd44ed4f8a3087a20c56147c11f917ed1dbd85c4a18cf38da25e6ac78f008f472262304d50e7e0cb7541ef1642c676db6e4bde4924846f5daf486fbde9335e98f6a20f6664bc4525253d1d4fca42cf1c490483c8daf0237f6a0fd292563417ad80ca3e69321417747bdc6f0969f34b2a0401b5e2b9a4dfd5b06d9710850900c66b34870aef&projectId=f750d5c7-baa2-4767-afd7-45484f47fe17") format('woff2'); -} - -@font-face { - font-family: 'bt_mono'; - font-style: normal; - font-weight: 400; - src: url('https://assets.braintreegateway.com/fonts/bt_mono_regular-webfont.eot'); - src: url('https://assets.braintreegateway.com/fonts/bt_mono_regular-webfont.woff2') format('woff2'), url('https://assets.braintreegateway.com/fonts/bt_mono_regular-webfont.woff') format('woff'), url('https://assets.braintreegateway.com/fonts/bt_mono_regular-webfont.ttf') format('truetype'), url('https://assets.braintreegateway.com/fonts/bt_mono_regular-webfont.svg#bt_mono_reqular-webfont') format('svg'); -} - -@font-face { - font-family: 'bt_mono'; - font-style: normal; - font-weight: 500; - src: url('https://assets.braintreegateway.com/fonts/bt_mono_medium-webfont.eot'); - src: url('https://assets.braintreegateway.com/fonts/bt_mono_medium-webfont.woff2') format('woff2'), url('https://assets.braintreegateway.com/fonts/bt_mono_medium-webfont.woff') format('woff'), url('https://assets.braintreegateway.com/fonts/bt_mono_medium-webfont.ttf') format('truetype'), url('https://assets.braintreegateway.com/fonts/bt_mono_medium-webfont.svg#bt_mono_medium-webfont') format('svg'); -} - -@font-face { - font-family: 'bt_mono'; - font-style: normal; - font-weight: 600; - src: url('https://assets.braintreegateway.com/fonts/bt_mono_bold-webfont.eot'); - src: url('https://assets.braintreegateway.com/fonts/bt_mono_bold-webfont.woff2') format('woff2'), url('https://assets.braintreegateway.com/fonts/bt_mono_bold-webfont.woff') format('woff'), url('https://assets.braintreegateway.com/fonts/bt_mono_bold-webfont.ttf') format('truetype'), url('https://assets.braintreegateway.com/fonts/bt_mono_bold-webfont.svg#bt_mono_bold-webfont') format('svg'); -} - -@font-face { - font-family: 'bt_mono'; - font-style: normal; - font-weight: 900; - src: url('https://assets.braintreegateway.com/fonts/bt_mono_heavy-webfont.eot'); - src: url('https://assets.braintreegateway.com/fonts/bt_mono_heavy-webfont.woff2') format('woff2'), url('https://assets.braintreegateway.com/fonts/bt_mono_heavy-webfont.woff') format('woff'), url('https://assets.braintreegateway.com/fonts/bt_mono_heavy-webfont.ttf') format('truetype'), url('https://assets.braintreegateway.com/fonts/bt_mono_heavy-webfont.svg#bt_mono_heavy-webfont') format('svg'); -} - -* { - box-sizing: border-box -} - -html, body { - height: 100%; - width: 100%; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - color: #3e3c42; - text-rendering: optimizeLegibility; - margin: 0; -} - -body { - color: #3e3c42; - background-color: #f3f3f3; - width: 100%; - font: 16px/1.875 "Avenir Next W01", "Avenir Next", "Helvetica Neue", Helvetica, sans-serif; - font-size: 16px; - line-height: 160%; -} - -a, a:active { - color: #0095dd; - text-decoration: none; -} - -a:hover { - text-decoration: underline -} - -p, ul, ol, blockquote { - margin-bottom: 1em; -} - -p { - max-width: 800px; -} - -h1, h2, h3, h4, h5, h6 { - color: #706d77; - font-weight: 500; - margin: 0; - line-height: 1; -} - -h1 { - color: #4b484f; - font-weight: 500; - font-size: 40px; - display: block; -} - -h1 span { - color: #999; - font-size: 32px; - display: block; - line-height: 1.5; -} - -h1.page-title { - border-bottom: 1px dashed #ccc; - margin-bottom: 20px; - padding-bottom: 30px; -} - -h2 { - font-size: 30px; - margin: 1.5em 0 0; -} - -h3 { - font-size: 20px; - margin: 1.5em 0 0; - text-transform: uppercase; -} - -h3.reference-title { - display: block; - font-weight: 400; - margin-top: 2em; - max-width: 200px; -} - -h3.reference-title small { - display: inline-block; - color: #0095dd; - margin-left: 5px; - font-weight: 500; -} - -h3.subsection-title { - border-bottom: 1px solid #ececec; - padding-bottom: 20px; - margin-top: 3em; - margin-bottom: 1em; -} - -h4 { - font-size: 16px; - margin: 1em 0 0; - font-weight: bold; -} - -h4.name { - font-size: 20px; - margin-top: 0; - font-weight: 500; -} - -h5 { - margin: 2em 0 0.5em 0; - font-size: 14px; - font-weight: 500; - text-transform: uppercase; -} - -.container-overview .subsection-title { - font-size: 14px; - text-transform: uppercase; - margin: 8px 0 15px 0; - font-weight: bold; - color: #4D4E53; - padding-top: 10px; -} - -h6 { - font-size: 100%; - letter-spacing: -0.01em; - margin: 6px 0 3px 0; - font-style: italic; - text-transform: uppercase; - font-weight: 500; -} - -tt, code, kbd, samp { - font-family: "Source Code Pro", monospace; - background: #f4f4f4; - padding: 1px 5px; - border-radius: 5px; -} - -.class-description { - margin-bottom: 1em; - margin-top: 1em; - padding: 10px 20px; - background-color: rgba(26, 159, 224, 0.1); -} - -.class-description:empty { - margin: 0 -} - -#main { - background-color: white; - float: right; - min-width: 360px; - width: calc(100% - 300px); - padding: 30px; - z-index: 100; -} - -header { - display: block; - max-width: 1400px; -} - -section { - display: block; - max-width: 1400px; - background-color: #fff; -} - -.variation { - display: none -} - -.signature-attributes { - font-size: 60%; - color: #aaa; - font-style: italic; - font-weight: lighter; -} - -.rule { - width: 100%; - margin-top: 20px; - display: block; - border-top: 1px solid #ccc; -} - -ul { - list-style-type: none; - padding-left: 0; -} - -ul li a { - font-weight: 500; -} - -ul ul { - padding-top: 5px; -} - -ul li ul { - padding-left: 20px; -} - -ul li ul li a { - font-weight: normal; -} - -nav { - float: left; - display: block; - width: 300px; - background: #f7f7f7; - overflow-x: visible; - overflow-y: auto; - height: 100%; - padding: 0px 30px 100px 30px; - height: 100%; - position: fixed; - transition: left 0.2s; - z-index: 998; - margin-top: 0px; - top: 43px; -} - -.navicon-button { - display: inline-block; - position: fixed; - bottom: 1.5em; - right: 1.5em; - z-index: 2; -} - -nav h3 { - font-size: 13px; - text-transform: uppercase; - letter-spacing: 1px; - font-weight: bold; - line-height: 24px; - margin: 40px 0 10px 0; - padding: 0; -} - -nav ul { - font-size: 100%; - line-height: 17px; - padding: 0; - margin: 0; - list-style-type: none; - border: none; - padding-left: 0; -} - -nav ul a { - font-size: 16px; -} - -nav ul a, nav ul a:active { - display: block; -} - -nav ul a:hover, nav ul a:active { - color: hsl(200, 100%, 43%); - text-decoration: none; -} - -nav>ul { - padding: 0 10px; -} - -nav>ul li:first-child { - padding-top: 0; -} - -nav ul li ul { - padding-left: 0; -} - -nav>ul>li { - border-bottom: 1px solid #e2e2e2; - padding: 10px 0 20px 0; -} - -nav>ul>li.active ul { - border-left: 3px solid #0095dd; - padding-left: 15px; -} - -nav>ul>li.active ul li.active a { - font-weight: bold; -} - -nav>ul>li.active a { - color: #0095dd; -} - -nav>ul>li>a { - color: #706d77; - padding: 20px 0; - font-size: 18px; -} - -nav ul ul { - margin-bottom: 10px padding-left: 0; -} - -nav ul ul a { - color: #5f5c63; -} - -nav ul ul a, nav ul ul a:active { - font-family: 'bt_mono', monospace; - font-size: 14px; - padding-left: 20px; - padding-top: 3px; - padding-bottom: 9px; -} - -nav h2 { - font-size: 12px; - margin: 0; - padding: 0; -} - -nav>h2>a { - color: hsl(202, 71%, 50%); - border-bottom: 1px solid hsl(202, 71%, 50%); - padding-bottom: 5px; -} - -nav>h2>a:hover { - font-weight: 500; - text-decoration: none; -} - -footer { - background-color: #fff; - color: hsl(0, 0%, 28%); - margin-left: 300px; - display: block; - font-style: italic; - font-size: 12px; - padding: 30px; - text-align: center; -} - -.ancestors { - color: #999; -} - -.ancestors a { - color: #999 !important; - text-decoration: none; -} - -.clear { - clear: both; -} - -.important { - font-weight: bold; - color: #950B02; -} - -.yes-def { - text-indent: -1000px; -} - -.type-signature { - color: #aaa; -} - -.name, .signature { - font-family: 'bt_mono', monospace; - word-wrap: break-word; -} - -.details { - margin-top: 14px; - font-size: 13px; - text-align: right; - background: #ffffff; - /* Old browsers */ - background: -moz-linear-gradient(left, #ffffff 0%, #fafafa 100%); - /* FF3.6-15 */ - background: -webkit-linear-gradient(left, #ffffff 0%, #fafafa 100%); - /* Chrome10-25,Safari5.1-6 */ - background: linear-gradient(to right, #ffffff 0%, #fafafa 100%); - /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ - filter: progid: DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#fafafa', GradientType=1); - padding-right: 5px; -} - -.details dt { - display: inline-block; -} - -.details dd { - display: inline-block; - margin: 0; -} - -.details dd a { - font-style: italic; - font-weight: normal; - line-height: 1; -} - -.details ul { - margin: 0 -} - -.details ul { - list-style-type: none -} - -.details li {} - -.details pre.prettyprint { - margin: 0 -} - -.details .object-value { - padding-top: 0 -} - -.description { - margin-bottom: 1em; - margin-top: 1em; -} - -.code-caption { - font-style: italic; - margin: 0; - font-size: 16px; - color: #545454; -} - -.prettyprint { - font-size: 13px; - border: 1px solid #ddd; - border-radius: 3px; - overflow: auto; - background-color: #fbfbfb; -} - -.prettyprint.source { - width: inherit; -} - -.prettyprint code { - font-size: 100%; - line-height: 18px; - display: block; - margin: 0 30px; - background-color: #fbfbfb; - color: #4D4E53; -} - -.prettyprint>code { - padding: 30px 15px; -} - -.prettyprint .linenums code { - padding: 0 15px; -} - -.prettyprint .linenums li:first-of-type code { - padding-top: 15px; -} - -.prettyprint code span.line { - display: inline-block; -} - -.prettyprint.linenums { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.prettyprint.linenums ol { - padding-left: 0 -} - -.prettyprint.linenums li { - border-left: 3px #ddd solid -} - -.prettyprint.linenums li.selected, .prettyprint.linenums li.selected * { - background-color: lightyellow -} - -.prettyprint.linenums li * { - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; -} - -.readme .prettyprint { - max-width: 800px; -} - -.params, .props { - border-spacing: 0; - border: 1px solid #ddd; - border-radius: 3px; - width: 100%; - font-size: 14px; -} - -.params .name, .props .name, .name code { - color: #4D4E53; - font-family: 'bt_mono', monospace; - font-size: 100%; -} - -.params td, .params th, .props td, .props th { - margin: 0px; - text-align: left; - vertical-align: top; - padding: 10px; - display: table-cell; -} - -.params td { - border-top: 1px solid #eee; -} - -.params thead tr, .props thead tr { - background-color: #fff; - font-weight: bold; -} - -.params .params thead tr, .props .props thead tr { - background-color: #fff; - font-weight: bold; -} - -.params td.description>p:first-child, .props td.description>p:first-child { - margin-top: 0; - padding-top: 0; -} - -.params td.description>p:last-child, .props td.description>p:last-child { - margin-bottom: 0; - padding-bottom: 0; -} - -dl.param-type { - margin-top: 5px; -} - -.param-type dt, .param-type dd { - display: inline-block -} - -.param-type dd { - font-family: Consolas, Monaco, 'Andale Mono', monospace -} - -.disabled { - color: #454545 -} - - -/* tag source style */ - -.tag-deprecated { - padding-right: 5px; -} - -.tag-source { - border-bottom: 1px solid rgba(28, 160, 224, 0.35); -} - -.tag-source:first-child { - border-bottom: 1px solid rgba(28, 160, 224, 1); -} - - -/* navicon button */ - -.navicon-button { - position: relative; - transition: 0.25s; - cursor: pointer; - user-select: none; - opacity: .8; - background-color: white; - border-radius: 100%; - width: 50px; - height: 50px; - -webkit-box-shadow: 0px 2px 9px 0px rgba(0, 0, 0, 0.31); - -moz-box-shadow: 0px 2px 9px 0px rgba(0, 0, 0, 0.31); - box-shadow: 0px 2px 9px 0px rgba(0, 0, 0, 0.31); -} - -.navicon-button .navicon:before, .navicon-button .navicon:after { - transition: 0.25s; -} - -.navicon-button:hover { - transition: 0.5s; - opacity: 1; -} - -.navicon-button:hover .navicon:before, .navicon-button:hover .navicon:after { - transition: 0.25s; -} - -.navicon-button:hover .navicon:before { - top: .425rem; -} - -.navicon-button:hover .navicon:after { - top: -.425rem; -} - - -/* navicon */ - -.navicon { - position: relative; - width: 1.5em; - height: .195rem; - background: #000; - top: calc(50% - .09rem); - left: calc(50% - .75rem); - transition: 0.3s; - border-radius: 5px; -} - -.navicon:before, .navicon:after { - display: block; - content: ""; - height: .195rem; - width: 1.5rem; - background: #000; - position: absolute; - z-index: -1; - transition: 0.3s 0.25s; -} - -.navicon:before { - top: 0.425rem; - height: .195rem; - border-radius: 5px; -} - -.navicon:after { - top: -0.425rem; - border-radius: 5px; -} - - -/* open */ - -.nav-trigger:checked+label:not(.steps) .navicon:before, .nav-trigger:checked+label:not(.steps) .navicon:after { - top: 0 !important; -} - -.nav-trigger:checked+label .navicon:before, .nav-trigger:checked+label .navicon:after { - transition: 0.5s; -} - - -/* Minus */ - -.nav-trigger:checked+label { - transform: scale(0.75); -} - - -/* Γ— and + */ - -.nav-trigger:checked+label.plus .navicon, .nav-trigger:checked+label.x .navicon { - background: transparent; -} - -.nav-trigger:checked+label.plus .navicon:before, .nav-trigger:checked+label.x .navicon:before { - transform: rotate(-45deg); - background: #000; -} - -.nav-trigger:checked+label.plus .navicon:after, .nav-trigger:checked+label.x .navicon:after { - transform: rotate(45deg); - background: #000; -} - -.nav-trigger:checked+label.plus { - transform: scale(0.75) rotate(45deg); -} - -.nav-trigger:checked~nav { - left: 0 !important; -} - -.nav-trigger:checked~.overlay { - display: block; -} - -.nav-trigger { - position: fixed; - top: 0; - clip: rect(0, 0, 0, 0); -} - -.overlay { - display: none; - position: fixed; - top: 0; - bottom: 0; - left: 0; - right: 0; - width: 100%; - height: 100%; - background: hsla(0, 0%, 0%, 0.5); - z-index: 1; -} - -table { - border-collapse: separate; - ; - display: block; - overflow-x: auto; - /*table-layout:fixed;*/ -} - -table tbody td { - border-top: 1px solid hsl(207, 10%, 86%); - border-right: 1px solid #eee; - padding: 5px; - /*word-wrap: break-word;*/ -} - -td table.params, td table.props { - border: 0; -} - -@media only screen and (min-width: 320px) and (max-width: 680px) { - body { - overflow-x: hidden; - } - #main { - padding: 30px 30px; - width: 100%; - min-width: 360px; - } - nav { - background: #FFF; - width: 300px; - height: 100%; - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: -300px; - z-index: 3; - padding: 0 10px; - transition: left 0.2s; - margin-top: 0; - } - .navicon-button { - display: inline-block; - position: fixed; - bottom: 1.5em; - right: 20px; - z-index: 1000; - } - .top-nav-wrapper { - display: none; - } - #main h1.page-title { - margin: 0.5em 0; - } - footer { - margin-left: 0; - margin-bottom: 30px; - } -} - -.top-nav-wrapper { - background-color: #ececec; - position: fixed; - top: 0px; - left: 0px; - padding: 10px 10px 0 10px; - z-index: 999; - width: 300px; -} - -.top-nav-wrapper ul { - margin: 0; -} - -.top-nav-wrapper ul li { - display: inline-block; - padding: 0 10px; - vertical-align: top; -} - -.top-nav-wrapper ul li.active { - border-bottom: 2px solid rgba(28, 160, 224, 1); -} - -.search-wrapper { - display: inline-block; - position: relative; -} - -.search-wrapper svg { - position: absolute; - left: 0px; -} - -input.search-input { - background: transparent; - box-shadow: 0; - border: 0; - border-bottom: 1px solid #c7c7c7; - padding: 7px 15px 12px 35px; - margin: 0 auto; -} - - -/* Smooth outline with box-shadow: */ - -input.search-input:focus { - border-bottom: 2px solid rgba(28, 160, 224, 1); - outline: none; -} - - -/* Hightlight JS Paradiso Light Theme */ - -.hljs-comment, .hljs-quote { - color: #776e71 -} - -.hljs-variable, .hljs-template-variable, .hljs-tag, .hljs-name, .hljs-selector-id, .hljs-selector-class, .hljs-regexp, .hljs-link, .hljs-meta { - color: #ef6155 -} - -.hljs-number, .hljs-built_in, .hljs-builtin-name, .hljs-literal, .hljs-type, .hljs-params, .hljs-deletion { - color: #f99b15 -} - -.hljs-title, .hljs-section, .hljs-attribute { - color: #fec418 -} - -.hljs-string, .hljs-symbol, .hljs-bullet, .hljs-addition { - color: #48b685 -} - -.hljs-keyword, .hljs-selector-tag { - color: #815ba4 -} - -.hljs { - display: block; - overflow-x: auto; - background: #e7e9db; - color: #4f424c; - padding: 0.5em -} - -.hljs-emphasis { - font-style: italic -} - -.hljs-strong { - font-weight: bold -} - -.link-icon { - opacity: 0; - position: absolute; - margin-left: -25px; - padding-right: 5px; - padding-top: 2px; -} - -.example-container .link-icon { - margin-top: -6px; -} - -.example-container:hover .link-icon, -.name-container:hover .link-icon { - opacity: .5; -} - -.name-container { - display: flex; - padding-top: 1em; -} diff --git a/docs/agenda/1.0.3/styles/prettify-jsdoc.css b/docs/agenda/1.0.3/styles/prettify-jsdoc.css deleted file mode 100644 index 834a866..0000000 --- a/docs/agenda/1.0.3/styles/prettify-jsdoc.css +++ /dev/null @@ -1,111 +0,0 @@ -/* JSDoc prettify.js theme */ - -/* plain text */ -.pln { - color: #000000; - font-weight: normal; - font-style: normal; -} - -/* string content */ -.str { - color: hsl(104, 100%, 24%); - font-weight: normal; - font-style: normal; -} - -/* a keyword */ -.kwd { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* a comment */ -.com { - font-weight: normal; - font-style: italic; -} - -/* a type name */ -.typ { - color: #000000; - font-weight: normal; - font-style: normal; -} - -/* a literal value */ -.lit { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* punctuation */ -.pun { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* lisp open bracket */ -.opn { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* lisp close bracket */ -.clo { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* a markup tag name */ -.tag { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a markup attribute name */ -.atn { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a markup attribute value */ -.atv { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a declaration */ -.dec { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* a variable name */ -.var { - color: #000000; - font-weight: normal; - font-style: normal; -} - -/* a function name */ -.fun { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* Specify class=linenums on a pre to get line numbering */ -ol.linenums { - margin-top: 0; - margin-bottom: 0; -} diff --git a/docs/agenda/1.0.3/styles/prettify-tomorrow.css b/docs/agenda/1.0.3/styles/prettify-tomorrow.css deleted file mode 100644 index eaf1251..0000000 --- a/docs/agenda/1.0.3/styles/prettify-tomorrow.css +++ /dev/null @@ -1,138 +0,0 @@ -/* Tomorrow Theme */ -/* Original theme - https://github.com/chriskempson/tomorrow-theme */ -/* Pretty printing styles. Used with prettify.js. */ -/* SPAN elements with the classes below are added by prettyprint. */ -/* plain text */ -.pln { - color: #4d4d4c; } - -@media screen { - /* string content */ - .str { - color: hsl(104, 100%, 24%); } - - /* a keyword */ - .kwd { - color: hsl(240, 100%, 50%); } - - /* a comment */ - .com { - color: hsl(0, 0%, 60%); } - - /* a type name */ - .typ { - color: hsl(240, 100%, 32%); } - - /* a literal value */ - .lit { - color: hsl(240, 100%, 40%); } - - /* punctuation */ - .pun { - color: #000000; } - - /* lisp open bracket */ - .opn { - color: #000000; } - - /* lisp close bracket */ - .clo { - color: #000000; } - - /* a markup tag name */ - .tag { - color: #c82829; } - - /* a markup attribute name */ - .atn { - color: #f5871f; } - - /* a markup attribute value */ - .atv { - color: #3e999f; } - - /* a declaration */ - .dec { - color: #f5871f; } - - /* a variable name */ - .var { - color: #c82829; } - - /* a function name */ - .fun { - color: #4271ae; } } -/* Use higher contrast and text-weight for printable form. */ -@media print, projection { - .str { - color: #060; } - - .kwd { - color: #006; - font-weight: bold; } - - .com { - color: #600; - font-style: italic; } - - .typ { - color: #404; - font-weight: bold; } - - .lit { - color: #044; } - - .pun, .opn, .clo { - color: #440; } - - .tag { - color: #006; - font-weight: bold; } - - .atn { - color: #404; } - - .atv { - color: #060; } } -/* Style */ -/* -pre.prettyprint { - background: white; - font-family: Consolas, Monaco, 'Andale Mono', monospace; - font-size: 12px; - line-height: 1.5; - border: 1px solid #ccc; - padding: 10px; } -*/ - -/* Get LI elements to show when they are in the main article */ -article ul li { - list-style-type: circle; - margin-left: 25px; -} - -/* Specify class=linenums on a pre to get line numbering */ -ol.linenums { - margin-top: 0; - margin-bottom: 0; } - -/* IE indents via margin-left */ -li.L0, -li.L1, -li.L2, -li.L3, -li.L4, -li.L5, -li.L6, -li.L7, -li.L8, -li.L9 { - /* */ } - -/* Alternate shading for lines */ -li.L1, -li.L3, -li.L5, -li.L7, -li.L9 { - /* */ } diff --git a/docs/agenda/1.0.3/utils_create-job.js.html b/docs/agenda/1.0.3/utils_create-job.js.html deleted file mode 100644 index 14c94fd..0000000 --- a/docs/agenda/1.0.3/utils_create-job.js.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - utils/create-job.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- utils/create-job.js -

- - - - - -
-
-
'use strict';
-const Job = require('../job');
-
-/**
- * Create Job object from data
- * @param {Object} agenda instance of Agenda
- * @param {Object} jobData job data
- * @returns {Job} returns created job
- */
-module.exports = (agenda, jobData) => {
-  jobData.agenda = agenda;
-  return new Job(jobData);
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/1.0.3/utils_process-jobs.js.html b/docs/agenda/1.0.3/utils_process-jobs.js.html deleted file mode 100644 index 2d88b9b..0000000 --- a/docs/agenda/1.0.3/utils_process-jobs.js.html +++ /dev/null @@ -1,447 +0,0 @@ - - - - - - - - - - - utils/process-jobs.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- utils/process-jobs.js -

- - - - - -
-
-
'use strict';
-// @TODO: What should we use for internal util functions?
-//        Maybe we should use agenda:util:processJobs which would move agenda:* to agenda:agenda;*
-const debug = require('debug')('agenda:internal:processJobs');
-const createJob = require('./create-job');
-
-/**
- * Process methods for jobs
- * @param {Job} extraJob job to run immediately
- * @returns {undefined}
- */
-module.exports = function(extraJob) {
-  debug('starting to process jobs');
-  // Make sure an interval has actually been set
-  // Prevents race condition with 'Agenda.stop' and already scheduled run
-  if (!this._processInterval) {
-    debug('no _processInterval set when calling processJobs, returning');
-    return;
-  }
-
-  const self = this;
-  const definitions = this._definitions;
-  const jobQueue = this._jobQueue;
-  let jobName;
-
-  // Determine whether or not we have a direct process call!
-  if (!extraJob) {
-    // Go through each jobName set in 'Agenda.process' and fill the queue with the next jobs
-    for (jobName in definitions) {
-      if ({}.hasOwnProperty.call(definitions, jobName)) {
-        debug('queuing up job to process: [%s]', jobName);
-        jobQueueFilling(jobName);
-      }
-    }
-  } else if (definitions[extraJob.attrs.name]) {
-    // Add the job to list of jobs to lock and then lock it immediately!
-    debug('job [%s] was passed directly to processJobs(), locking and running immediately', extraJob.attrs.name);
-    self._jobsToLock.push(extraJob);
-    lockOnTheFly();
-  }
-
-  /**
-   * Returns true if a job of the specified name can be locked.
-   * Considers maximum locked jobs at any time if self._lockLimit is > 0
-   * Considers maximum locked jobs of the specified name at any time if jobDefinition.lockLimit is > 0
-   * @param {String} name name of job to check if we should lock or not
-   * @returns {boolean} whether or not you should lock job
-   */
-  function shouldLock(name) {
-    const jobDefinition = definitions[name];
-    let shouldLock = true;
-    if (self._lockLimit && self._lockLimit <= self._lockedJobs.length) {
-      shouldLock = false;
-    }
-    if (jobDefinition.lockLimit && jobDefinition.lockLimit <= jobDefinition.locked) {
-      shouldLock = false;
-    }
-    debug('job [%s] lock status: shouldLock = %s', name, shouldLock);
-    return shouldLock;
-  }
-
-  /**
-   * Internal method that adds jobs to be processed to the local queue
-   * @param {*} jobs Jobs to queue
-   * @param {boolean} inFront puts the job in front of queue if true
-   * @returns {undefined}
-   */
-  function enqueueJobs(jobs, inFront) {
-    if (!Array.isArray(jobs)) {
-      jobs = [jobs];
-    }
-
-    jobs.forEach(job => {
-      let jobIndex;
-      let start;
-      let loopCondition;
-      let endCondition;
-      let inc;
-
-      if (inFront) {
-        start = jobQueue.length ? jobQueue.length - 1 : 0;
-        inc = -1;
-        loopCondition = function() {
-          return jobIndex >= 0;
-        };
-        endCondition = function(queuedJob) {
-          return !queuedJob || queuedJob.attrs.priority < job.attrs.priority;
-        };
-      } else {
-        start = 0;
-        inc = 1;
-        loopCondition = function() {
-          return jobIndex < jobQueue.length;
-        };
-        endCondition = function(queuedJob) {
-          return queuedJob.attrs.priority >= job.attrs.priority;
-        };
-      }
-
-      for (jobIndex = start; loopCondition(); jobIndex += inc) {
-        if (endCondition(jobQueue[jobIndex])) {
-          break;
-        }
-      }
-
-      // Insert the job to the queue at its prioritized position for processing
-      jobQueue.splice(jobIndex, 0, job);
-    });
-  }
-
-  /**
-   * Internal method that will lock a job and store it on MongoDB
-   * This method is called when we immediately start to process a job without using the process interval
-   * We do this because sometimes jobs are scheduled but will be run before the next process time
-   * @returns {undefined}
-   */
-  function lockOnTheFly() {
-    // Already running this? Return
-    if (self._isLockingOnTheFly) {
-      debug('lockOnTheFly() already running, returning');
-      return;
-    }
-
-    // Don't have any jobs to run? Return
-    if (self._jobsToLock.length === 0) {
-      debug('no jobs to current lock on the fly, returning');
-      self._isLockingOnTheFly = false;
-      return;
-    }
-
-    // Set that we are running this
-    self._isLockingOnTheFly = true;
-
-    // Grab a job that needs to be locked
-    const now = new Date();
-    const job = self._jobsToLock.pop();
-
-    // If locking limits have been hit, stop locking on the fly.
-    // Jobs that were waiting to be locked will be picked up during a
-    // future locking interval.
-    if (!shouldLock(job.attrs.name)) {
-      debug('lock limit hit for: [%s]', job.attrs.name);
-      self._jobsToLock = [];
-      self._isLockingOnTheFly = false;
-      return;
-    }
-
-    // Query to run against collection to see if we need to lock it
-    const criteria = {
-      _id: job.attrs._id,
-      lockedAt: null,
-      nextRunAt: job.attrs.nextRunAt,
-      disabled: {$ne: true}
-    };
-
-    // Update / options for the MongoDB query
-    const update = {$set: {lockedAt: now}};
-    const options = {returnDocument: 'after'};
-
-    // Lock the job in MongoDB!
-    self._collection.findOneAndUpdate(criteria, update, options, (err, resp) => {
-      if (err) {
-        throw err;
-      }
-      // Did the "job" get locked? Create a job object and run
-      if (resp.value) {
-        const job = createJob(self, resp.value);
-        debug('found job [%s] that can be locked on the fly', job.attrs.name);
-        self._lockedJobs.push(job);
-        definitions[job.attrs.name].locked++;
-        enqueueJobs(job);
-        jobProcessing();
-      }
-
-      // Mark lock on fly is done for now
-      self._isLockingOnTheFly = false;
-
-      // Re-run in case anything is in the queue
-      lockOnTheFly();
-    });
-  }
-
-  /**
-   * Internal method used to fill a queue with jobs that can be run
-   * @param {String} name fill a queue with specific job name
-   * @returns {undefined}
-   */
-  function jobQueueFilling(name) {
-    // Don't lock because of a limit we have set (lockLimit, etc)
-    if (!shouldLock(name)) {
-      debug('lock limit reached in queue filling for [%s]', name);
-      return;
-    }
-
-    // Set the date of the next time we are going to run _processEvery function
-    const now = new Date();
-    self._nextScanAt = new Date(now.valueOf() + self._processEvery);
-
-    // For this job name, find the next job to run and lock it!
-    self._findAndLockNextJob(name, definitions[name], (err, job) => {
-      if (err) {
-        debug('[%s] job lock failed while filling queue', name);
-        throw err;
-      }
-
-      // Still have the job?
-      // 1. Add it to lock list
-      // 2. Add count of locked jobs
-      // 3. Queue the job to actually be run now that it is locked
-      // 4. Recursively run this same method we are in to check for more available jobs of same type!
-      if (job) {
-        debug('[%s:%s] job locked while filling queue', name, job.attrs._id);
-        self._lockedJobs.push(job);
-        definitions[job.attrs.name].locked++;
-        enqueueJobs(job);
-        jobQueueFilling(name);
-        jobProcessing();
-      }
-    });
-  }
-
-  /**
-   * Internal method that processes any jobs in the local queue (array)
-   * @returns {undefined}
-   */
-  function jobProcessing() {
-    // Ensure we have jobs
-    if (jobQueue.length === 0) {
-      return;
-    }
-
-    // Store for all sorts of things
-    const now = new Date();
-
-    // Get the next job that is not blocked by concurrency
-    let next;
-    for (next = jobQueue.length - 1; next > 0; next -= 1) {
-      const def = definitions[jobQueue[next].attrs.name];
-      if (def.concurrency > def.running) {
-        break;
-      }
-    }
-
-    // We now have the job we are going to process and its definition
-    const job = jobQueue.splice(next, 1)[0];
-    const jobDefinition = definitions[job.attrs.name];
-
-    debug('[%s:%s] about to process job', job.attrs.name, job.attrs._id);
-
-    // If the 'nextRunAt' time is older than the current time, run the job
-    // Otherwise, setTimeout that gets called at the time of 'nextRunAt'
-    if (job.attrs.nextRunAt < now) {
-      debug('[%s:%s] nextRunAt is in the past, run the job immediately', job.attrs.name, job.attrs._id);
-      runOrRetry();
-    } else {
-      const runIn = job.attrs.nextRunAt - now;
-      debug('[%s:%s] nextRunAt is in the future, calling setTimeout(%d)', job.attrs.name, job.attrs._id, runIn);
-      setTimeout(runOrRetry, runIn);
-    }
-
-    /**
-     * Internal method that tries to run a job and if it fails, retries again!
-     * @returns {undefined}
-     */
-    function runOrRetry() {
-      if (self._processInterval) {
-        if (jobDefinition.concurrency > jobDefinition.running && self._runningJobs.length < self._maxConcurrency) {
-          // Get the deadline of when the job is not supposed to go past for locking
-          const lockDeadline = new Date(Date.now() - jobDefinition.lockLifetime);
-
-          // This means a job has "expired", as in it has not been "touched" within the lockoutTime
-          // Remove from local lock
-          // NOTE: Shouldn't we update the 'lockedAt' value in MongoDB so it can be picked up on restart?
-          if (job.attrs.lockedAt < lockDeadline) {
-            debug('[%s:%s] job lock has expired, freeing it up', job.attrs.name, job.attrs._id);
-            self._lockedJobs.splice(self._lockedJobs.indexOf(job), 1);
-            jobDefinition.locked--;
-            jobProcessing();
-            return;
-          }
-
-          // Add to local "running" queue
-          self._runningJobs.push(job);
-          jobDefinition.running++;
-
-          // CALL THE ACTUAL METHOD TO PROCESS THE JOB!!!
-          debug('[%s:%s] processing job', job.attrs.name, job.attrs._id);
-          job.run()
-            .catch(err => [err, job])
-            .then(job => processJobResult(...Array.isArray(job) ? job : [null, job]));
-
-          // Re-run the loop to check for more jobs to process (locally)
-          jobProcessing();
-        } else {
-          // Run the job immediately by putting it on the top of the queue
-          debug('[%s:%s] concurrency preventing immediate run, pushing job to top of queue', job.attrs.name, job.attrs._id);
-          enqueueJobs(job, true);
-        }
-      }
-    }
-  }
-
-  /**
-   * Internal method used to run the job definition
-   * @param {Error} err thrown if can't process job
-   * @param {module.Job} job job to process
-   * @returns {undefined}
-   */
-  function processJobResult(err, job) {
-    if (err) {
-      return job.agenda.emit('error', err);
-    }
-    const name = job.attrs.name;
-
-    // Job isn't in running jobs so throw an error
-    if (self._runningJobs.indexOf(job) === -1) {
-      debug('[%s] callback was called, job must have been marked as complete already', job.attrs._id);
-      throw new Error('callback already called - job ' + name + ' already marked complete');
-    }
-
-    // Remove the job from the running queue
-    self._runningJobs.splice(self._runningJobs.indexOf(job), 1);
-    if (definitions[name].running > 0) {
-      definitions[name].running--;
-    }
-
-    // Remove the job from the locked queue
-    self._lockedJobs.splice(self._lockedJobs.indexOf(job), 1);
-    if (definitions[name].locked > 0) {
-      definitions[name].locked--;
-    }
-
-    // Re-process jobs now that one has finished
-    jobProcessing();
-  }
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/Agenda.html b/docs/agenda/2.0.0/Agenda.html deleted file mode 100644 index f1b5706..0000000 --- a/docs/agenda/2.0.0/Agenda.html +++ /dev/null @@ -1,4498 +0,0 @@ - - - - - - - - - Agenda - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- Agenda -

- - - - -
-
- -

- - Agenda - -

- - - -
- -
-
- - - - - - - - - - - - -

- new Agenda(config, cb) -

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
config - - - - Object - - - - - - - - - -
cb - - - - function - - - - - - - - - -
- - - - - -
Properties:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
_name - - - - Object - - - - - - - -

Name of the current Agenda queue

-
_processEvery - - - - Number - - - - - - - - -
_defaultConcurrency - - - - Number - - - - - - - - -
_maxConcurrency - - - - Number - - - - - - - - -
_defaultLockLimit - - - - Number - - - - - - - - -
_lockLimit - - - - Number - - - - - - - - -
_definitions - - - - Object - - - - - - - - -
_runningJobs - - - - Object - - - - - - - - -
_lockedJobs - - - - Object - - - - - - - - -
_jobQueue - - - - Object - - - - - - - - -
_defaultLockLifetime - - - - Number - - - - - - - - -
_sort - - - - Object - - - - - - - - -
_indices - - - - Object - - - - - - - - -
_isLockingOnTheFly - - - - Boolean - - - - - - - - -
_jobsToLock - - - - Array - - - - - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - -

Methods

- - - - - - - - - - - - - -

- cancel(query) → {Promise.<Number>} -

-
- - - - - -
-

Cancels any jobs matching the passed MongoDB query, and removes them from the database.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
query - - - - Object - - - - - - - -

MongoDB query to use when cancelling

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- create(name, data) → {Job} -

-
- - - - - -
-

Given a name and some data, create a new job

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - - - String - - - - - - - -

name of job

- -
data - - - - Object - - - - - - - -

data to set for job

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- database(url, collection, options, cb) → {exports} -

-
- - - - - -
-

Connect to the spec'd MongoDB server and database.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
url - - - - String - - - - - - - -

MongoDB server URI

- -
collection - - - - String - - - - - - - -

name of collection to use. Defaults to agendaJobs

- -
options - - - - Object - - - - - - - -

options for connecting

- -
cb - - - - function - - - - - - - -

callback of MongoDB connection

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- dbInit(collection, cb) → {undefined} -

-
- - - - - -
-

Setup and initialize the collection used to manage Jobs.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
collection - - - - String - - - - - - - -

name or undefined for default 'agendaJobs'

- -
cb - - - - function - - - - - - - -

called when the db is initialized

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- defaultConcurrency(num) → {exports} -

-
- - - - - -
-

Set the default concurrency for each job

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
num - - - - Number - - - - - - - -

default concurrency

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- defaultLockLifetime(ms) → {Agenda} -

-
- - - - - -
-

Set the default lock time (in ms) -Default is 10 60 1000 ms (10 minutes)

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
ms - - - - Number - - - - - - - -

time in ms to set default lock

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- defaultLockLimit(num) → {Agenda} -

-
- - - - - -
-

Set default lock limit per job type

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
num - - - - Number - - - - - - - -

Lock limit per job

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- define(name, options, processor) → {undefined} -

-
- - - - - -
-

Setup definition for job -Method is used by consumers of lib to setup their functions

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - - - String - - - - - - - -

name of job

- -
options - - - - Object - - - - - - - -

options for job to run

- -
processor - - - - function - - - - - - - -

function to be called to run actual job

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- every(interval, names, data, options) → {Promise} -

-
- - - - - -
-

Creates a scheduled job with given interval and name/names of the job to run

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
interval - - - - Number - - - - - - - -

run every X interval

- -
names - - - - * - - - - - - - -

String or strings of jobs to schedule

- -
data - - - - Object - - - - - - - -

data to run for job

- -
options - - - - Object - - - - - - - -

options to run job for

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- (protected) findAndLockNextJob(jobName, definition, cb) → {undefined} -

-
- - - - - -
-

Find and lock jobs

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
jobName - - - - String - - - - - - - -

name of job to try to lock

- -
definition - - - - Object - - - - - - - -

definition used to tell how job is run

- -
cb - - - - function - - - - - - - -

called when job lock fails or passes

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- jobs(query) → {Promise} -

-
- - - - - -
-

Finds all jobs matching 'query'

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
query - - - - Object - - - - - - - -

object for MongoDB

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- locklimit(num) → {exports} -

-
- - - - - -
-

Set the default amount jobs that are allowed to be locked at one time (GLOBAL)

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
num - - - - Number - - - - - - - -

Lock limit

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- maxConcurrency(num) → {exports} -

-
- - - - - -
-

Set the concurrency for jobs (globally), type does not matter

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
num - - - - Number - - - - - - - -

max concurrency value

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- mongo(mdb, collection, cb) → {exports} -

-
- - - - - -
-

Build method used to add MongoDB connection details

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
mdb - - - - MongoClient - - - - - - - -

instance of MongoClient to use

- -
collection - - - - String - - - - - - - -

name collection we want to use ('agendaJobs')

- -
cb - - - - function - - - - - - - -

called when MongoDB connection fails or passes

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- name(name) → {exports} -

-
- - - - - -
-

Set name of queue

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - - - String - - - - - - - -

name of agenda instance

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- now(name, data, cb) → {Job} -

-
- - - - - -
-

Create a job for this exact moment

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - - - String - - - - - - - -

name of job to schedule

- -
data - - - - Object - - - - - - - -

data to pass to job

- -
cb - - - - function - - - - - - - -

called when job scheduling fails or passes

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- processEvery(time) → {exports} -

-
- - - - - -
-

Set the default process interval

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
time - - - - Number - - - - - - - -

time to process

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- purge() → {Promise} -

-
- - - - - -
-

Removes all jobs from queue

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- saveJob(job) → {Promise} -

-
- - - - - -
-

Save the properties on a job to MongoDB

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
job - - - - Job - - - - - - - -

job to save into MongoDB

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- schedule(when, names, data) → {Promise.<(Job|Array.<Job>)>} -

-
- - - - - -
-

Schedule a job or jobs at a specific time

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
when - - - - String - - - - - - - -

when the job gets run

- -
names - - - - Array.<String> - - - - - - - -

array of job names to run

- -
data - - - - Object - - - - - - - -

data to send to job

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- sort(query) → {exports} -

-
- - - - - -
-

Set the sort query for finding next job -Default is { nextRunAt: 1, priority: -1 }

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
query - - - - Object - - - - - - - -

sort query object for MongoDB

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- start() → {Promise} -

-
- - - - - -
-

Starts processing jobs using processJobs() methods, storing an interval ID -This method will only resolve if a db has been set up beforehand.

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- stop() → {Promise} -

-
- - - - - -
-

Clear the interval that processes the jobs

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - -
-
- - - - -
- -
- - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/2.0.0/Job.html b/docs/agenda/2.0.0/Job.html deleted file mode 100644 index bd657be..0000000 --- a/docs/agenda/2.0.0/Job.html +++ /dev/null @@ -1,2105 +0,0 @@ - - - - - - - - - Job - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- Job -

- - - - -
-
- -

- - Job - -

- - - -
- -
-
- - - - - - - - - - - - -

- new Job(args) -

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
args - - - - Object - - - - - - - - - -
- - - - - -
Properties:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
agenda - - - - Object - - - - - - - -

The Agenda instance

-
attrs - - - - Object - - - - - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - -

Methods

- - - - - - - - - - - - - -

- computeNextRunAt() → {exports} -

-
- - - - - -
-

Internal method used to compute next time a job should run and sets the proper values

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- disable() → {exports} -

-
- - - - - -
-

Prevents the job type from running

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- enable() → {Job} -

-
- - - - - -
-

Allows job type to run

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- fail(reason) → {exports} -

-
- - - - - -
-

Fails the job with a reason (error) specified

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
reason - - - - Error - - - | - - - String - - - - - - - -

reason job failed

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- isRunning() → {Boolean} -

-
- - - - - -
-

A job is running if: -(lastRunAt exists AND lastFinishedAt does not exist) -OR -(lastRunAt exists AND lastFinishedAt exists but the lastRunAt is newer [in time] than lastFinishedAt)

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- priority(priority) → {Number} -

-
- - - - - -
-

Internal method to turn priority into a number

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
priority - - - - String - - - | - - - Number - - - - - - - -

string to parse into number

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- remove() → {Promise} -

-
- - - - - -
-

Remove the job from MongoDB

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- repeatAt(time) → {exports} -

-
- - - - - -
-

Sets a job to repeat at a specific time

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
time - - - - String - - - - - - - -

time to repeat job at (human readable or number)

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- repeatEvery(interval, options) → {Job} -

-
- - - - - -
-

Sets a job to repeat every X amount of time

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
interval - - - - String - - - - - - - -

repeat every X

- -
options - - - - Object - - - - - - - -

options to use for job

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- run() → {Promise} -

-
- - - - - -
-

Internal method (RUN)

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- schedule(time) → {exports} -

-
- - - - - -
-

Schedules a job to run at specified time

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
time - - - - String - - - - - - - -

schedule a job to run "then"

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- toJSON() → {Object} -

-
- - - - - -
-

Given a job, turn it into an object we can store in Mongo

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- touch(cb) → {undefined} -

-
- - - - - -
-

Updates "lockedAt" time so the job does not get picked up again

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
cb - - - - function - - - - - - - -

called when job "touch" fails or passes

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- unique(unique, opts) → {exports} -

-
- - - - - -
-

Data to ensure is unique for job to be created

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
unique - - - - Object - - - - - - - -

mongo data query for unique

- -
opts - - - - Object - - - - - - - -

unique options

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - -
-
- - - - -
- -
- - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/2.0.0/agenda_cancel.js.html b/docs/agenda/2.0.0/agenda_cancel.js.html deleted file mode 100644 index 9be379f..0000000 --- a/docs/agenda/2.0.0/agenda_cancel.js.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - agenda/cancel.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/cancel.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:cancel');
-
-/**
- * Cancels any jobs matching the passed MongoDB query, and removes them from the database.
- * @name Agenda#cancel
- * @function
- * @param {Object} query MongoDB query to use when cancelling
- * @caller client code, Agenda.purge(), Job.remove()
- * @returns {Promise<Number>} A promise that contains the number of removed documents when fulfilled.
- */
-module.exports = function(query) {
-  debug('attempting to cancel all Agenda jobs', query);
-  return this._collection.deleteMany(query).then(({result}) => {
-    debug('%s jobs cancelled', result.n);
-    return result.n;
-  }).catch(err => {
-    debug('error trying to delete jobs from MongoDB');
-    throw err;
-  });
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/agenda_create.js.html b/docs/agenda/2.0.0/agenda_create.js.html deleted file mode 100644 index 97f788c..0000000 --- a/docs/agenda/2.0.0/agenda_create.js.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - agenda/create.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/create.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:create');
-const Job = require('../job');
-
-/**
- * Given a name and some data, create a new job
- * @name Agenda#create
- * @function
- * @param {String} name name of job
- * @param {Object} data data to set for job
- * @returns {Job} instance of new job
- */
-module.exports = function(name, data) {
-  debug('Agenda.create(%s, [Object])', name);
-  const priority = this._definitions[name] ? this._definitions[name].priority : 0;
-  const job = new Job({name, data, type: 'normal', priority, agenda: this});
-  return job;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/agenda_database.js.html b/docs/agenda/2.0.0/agenda_database.js.html deleted file mode 100644 index 686342b..0000000 --- a/docs/agenda/2.0.0/agenda_database.js.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - - - - agenda/database.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/database.js -

- - - - - -
-
-
'use strict';
-const MongoClient = require('mongodb').MongoClient;
-const debug = require('debug')('agenda:database');
-
-/**
- * Connect to the spec'd MongoDB server and database.
- * @name Agenda#database
- * @function
- * @param {String} url MongoDB server URI
- * @param {String} collection name of collection to use. Defaults to `agendaJobs`
- * @param {Object} options options for connecting
- * @param {Function} cb callback of MongoDB connection
- * @returns {exports}
- * NOTE:
- * If `url` includes auth details then `options` must specify: { 'uri_decode_auth': true }. This does Auth on
- * the specified database, not the Admin database. If you are using Auth on the Admin DB and not on the Agenda DB,
- * then you need to authenticate against the Admin DB and then pass the MongoDB instance into the constructor
- * or use Agenda.mongo(). If your app already has a MongoDB connection then use that. ie. specify config.mongo in
- * the constructor or use Agenda.mongo().
- */
-module.exports = function(url, collection, options, cb) {
-  const self = this;
-  if (!url.match(/^mongodb:\/\/.*/)) {
-    url = 'mongodb://' + url;
-  }
-
-  collection = collection || 'agendaJobs';
-  options = Object.assign({autoReconnect: true, reconnectTries: Number.MAX_SAFE_INTEGER, reconnectInterval: this._processEvery}, options);
-  MongoClient.connect(url, options, (error, client) => {
-    if (error) {
-      debug('error connecting to MongoDB using collection: [%s]', collection);
-      if (cb) {
-        cb(error, null);
-      } else {
-        throw error;
-      }
-      return;
-    }
-    debug('successful connection to MongoDB using collection: [%s]', collection);
-    self._db = client;
-    self._mdb = client.db();
-    self.db_init(collection, cb);
-  });
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/agenda_db-init.js.html b/docs/agenda/2.0.0/agenda_db-init.js.html deleted file mode 100644 index f7437a6..0000000 --- a/docs/agenda/2.0.0/agenda_db-init.js.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - - - - agenda/db-init.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/db-init.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:db_init');
-
-/**
- * Setup and initialize the collection used to manage Jobs.
- * @name Agenda#dbInit
- * @function
- * @param {String} collection name or undefined for default 'agendaJobs'
- * @param {Function} cb called when the db is initialized
- * @returns {undefined}
- */
-module.exports = function(collection, cb) {
-  const self = this;
-  debug('init database collection using name [%s]', collection);
-  this._collection = this._mdb.collection(collection || 'agendaJobs');
-  debug('attempting index creation');
-  this._collection.createIndex(
-    this._indices,
-    {name: 'findAndLockNextJobIndex'},
-    err => {
-      if (err) {
-        debug('index creation failed');
-        self.emit('error', err);
-      } else {
-        debug('index creation success');
-        self.emit('ready');
-      }
-
-      if (cb) {
-        cb(err, self._collection);
-      }
-    }
-  );
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/agenda_default-concurrency.js.html b/docs/agenda/2.0.0/agenda_default-concurrency.js.html deleted file mode 100644 index 0994203..0000000 --- a/docs/agenda/2.0.0/agenda_default-concurrency.js.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - agenda/default-concurrency.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/default-concurrency.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:defaultConcurrency');
-
-/**
- * Set the default concurrency for each job
- * @name Agenda#defaultConcurrency
- * @function
- * @param {Number} num default concurrency
- * @returns {exports} agenda instance
- */
-module.exports = function(num) {
-  debug('Agenda.defaultConcurrency(%d)', num);
-  this._defaultConcurrency = num;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/agenda_default-lock-lifetime.js.html b/docs/agenda/2.0.0/agenda_default-lock-lifetime.js.html deleted file mode 100644 index 872e9cf..0000000 --- a/docs/agenda/2.0.0/agenda_default-lock-lifetime.js.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - agenda/default-lock-lifetime.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/default-lock-lifetime.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:defaultLockLifetime');
-
-/**
- * Set the default lock time (in ms)
- * Default is 10 * 60 * 1000 ms (10 minutes)
- * @name Agenda#defaultLockLifetime
- * @function
- * @param {Number} ms time in ms to set default lock
- * @returns {Agenda} agenda instance
- */
-module.exports = function(ms) {
-  debug('Agenda.defaultLockLifetime(%d)', ms);
-  this._defaultLockLifetime = ms;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/agenda_default-lock-limit.js.html b/docs/agenda/2.0.0/agenda_default-lock-limit.js.html deleted file mode 100644 index c384d93..0000000 --- a/docs/agenda/2.0.0/agenda_default-lock-limit.js.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - agenda/default-lock-limit.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/default-lock-limit.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:defaultLockLimit');
-
-/**
- * Set default lock limit per job type
- * @name Agenda#defaultLockLimit
- * @function
- * @param {Number} num Lock limit per job
- * @returns {Agenda} agenda instance
- */
-module.exports = function(num) {
-  debug('Agenda.defaultLockLimit(%d)', num);
-  this._defaultLockLimit = num;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/agenda_define.js.html b/docs/agenda/2.0.0/agenda_define.js.html deleted file mode 100644 index 3dde043..0000000 --- a/docs/agenda/2.0.0/agenda_define.js.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - - - - - - agenda/define.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/define.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:define');
-
-/**
- * Setup definition for job
- * Method is used by consumers of lib to setup their functions
- * @name Agenda#define
- * @function
- * @param {String} name name of job
- * @param {Object} options options for job to run
- * @param {Function} processor function to be called to run actual job
- * @returns {undefined}
- */
-module.exports = function(name, options, processor) {
-  if (!processor) {
-    processor = options;
-    options = {};
-  }
-  this._definitions[name] = {
-    fn: processor,
-    concurrency: options.concurrency || this._defaultConcurrency,
-    lockLimit: options.lockLimit || this._defaultLockLimit,
-    priority: options.priority || 0,
-    lockLifetime: options.lockLifetime || this._defaultLockLifetime,
-    running: 0,
-    locked: 0
-  };
-  debug('job [%s] defined with following options: \n%O', name, this._definitions[name]);
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/agenda_every.js.html b/docs/agenda/2.0.0/agenda_every.js.html deleted file mode 100644 index 5b8b8e1..0000000 --- a/docs/agenda/2.0.0/agenda_every.js.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - - - - agenda/every.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/every.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:every');
-
-/**
- * Creates a scheduled job with given interval and name/names of the job to run
- * @name Agenda#every
- * @function
- * @param {Number} interval run every X interval
- * @param {*} names String or strings of jobs to schedule
- * @param {Object} data data to run for job
- * @param {Object} options options to run job for
- * @returns {Promise} Job/s created. Resolves when schedule fails or passes
- */
-module.exports = async function(interval, names, data, options) {
-  /**
-   * Internal method to setup job that gets run every interval
-   * @param {Number} interval run every X interval
-   * @param {String} name String job to schedule
-   * @param {Object} data data to run for job
-   * @param {Object} options options to run job for
-   * @returns {Job} instance of job
-   */
-  const createJob = async (interval, name, data, options) => {
-    const job = this.create(name, data);
-
-    job.attrs.type = 'single';
-    job.repeatEvery(interval, options);
-    job.computeNextRunAt();
-    await job.save();
-
-    return job;
-  };
-
-  /**
-   * Internal helper method that uses createJob to create jobs for an array of names
-   * @param {Number} interval run every X interval
-   * @param {Array<String>} names Strings of jobs to schedule
-   * @param {Object} data data to run for job
-   * @param {Object} options options to run job for
-   * @returns {Array<Job>} array of jobs created
-   */
-  const createJobs = (interval, names, data, options) => {
-    try {
-      const jobs = names.map(name => createJob(interval, name, data, options));
-
-      debug('every() -> all jobs created successfully');
-
-      return Promise.all(jobs);
-    } catch (err) { // @TODO: catch - ignore :O
-      debug('every() -> error creating one or more of the jobs');
-    }
-  };
-
-  if (typeof names === 'string' || names instanceof String) {
-    debug('Agenda.every(%s, %O, %O)', interval, names, options);
-    const jobs = await createJob(interval, names, data, options);
-
-    return jobs;
-  } else if (Array.isArray(names)) {
-    debug('Agenda.every(%s, %s, %O)', interval, names, options);
-    const jobs = await createJobs(interval, names, data, options);
-
-    return jobs;
-  }
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/agenda_find-and-lock-next-job.js.html b/docs/agenda/2.0.0/agenda_find-and-lock-next-job.js.html deleted file mode 100644 index dad678d..0000000 --- a/docs/agenda/2.0.0/agenda_find-and-lock-next-job.js.html +++ /dev/null @@ -1,197 +0,0 @@ - - - - - - - - - - - agenda/find-and-lock-next-job.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/find-and-lock-next-job.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:internal:_findAndLockNextJob');
-const utils = require('../utils');
-
-const createJob = utils.createJob;
-
-/**
- * Find and lock jobs
- * @name Agenda#findAndLockNextJob
- * @function
- * @param {String} jobName name of job to try to lock
- * @param {Object} definition definition used to tell how job is run
- * @param {Function} cb called when job lock fails or passes
- * @access protected
- * @caller jobQueueFilling() only
- * @returns {undefined}
- */
-module.exports = function(jobName, definition, cb) {
-  const self = this;
-  const now = new Date();
-  const lockDeadline = new Date(Date.now().valueOf() - definition.lockLifetime);
-  debug('_findAndLockNextJob(%s, [Function], cb)', jobName);
-
-  // Don't try and access MongoDB if we've lost connection to it.
-  // Trying to resolve crash on Dev PC when it resumes from sleep. NOTE: Does this still happen?
-  const s = this._mdb.s || this._mdb.db.s;
-  if (s.topology.connections().length === 0) {
-    if (s.topology.autoReconnect && !s.topology.isDestroyed()) {
-      // Continue processing but notify that Agenda has lost the connection
-      debug('Missing MongoDB connection, not attempting to find and lock a job');
-      self.emit('error', new Error('Lost MongoDB connection'));
-      cb();
-    } else {
-      // No longer recoverable
-      debug('topology.autoReconnect: %s, topology.isDestroyed(): %s', s.topology.autoReconnect, s.topology.isDestroyed());
-      cb(new Error('MongoDB connection is not recoverable, application restart required'));
-    }
-  } else {
-    // /**
-    // * Query used to find job to run
-    // * @type {{$or: [*]}}
-    // */
-    const JOB_PROCESS_WHERE_QUERY = {
-      $or: [{
-        name: jobName,
-        lockedAt: null,
-        nextRunAt: {$lte: this._nextScanAt},
-        disabled: {$ne: true}
-      }, {
-        name: jobName,
-        lockedAt: {$exists: false},
-        nextRunAt: {$lte: this._nextScanAt},
-        disabled: {$ne: true}
-      }, {
-        name: jobName,
-        lockedAt: {$lte: lockDeadline},
-        disabled: {$ne: true}
-      }]
-    };
-
-    /**
-    * Query used to set a job as locked
-    * @type {{$set: {lockedAt: Date}}}
-    */
-    const JOB_PROCESS_SET_QUERY = {$set: {lockedAt: now}};
-
-    /**
-    * Query used to affect what gets returned
-    * @type {{returnOriginal: boolean, sort: object}}
-    */
-    const JOB_RETURN_QUERY = {returnDocument: 'after', sort: this._sort};
-
-    // Find ONE and ONLY ONE job and set the 'lockedAt' time so that job begins to be processed
-    this._collection.findOneAndUpdate(JOB_PROCESS_WHERE_QUERY, JOB_PROCESS_SET_QUERY, JOB_RETURN_QUERY, (err, result) => {
-      let job;
-      if (!err && result.value) {
-        debug('found a job available to lock, creating a new job on Agenda with id [%s]', result.value._id);
-        job = createJob(self, result.value);
-      }
-      if (err) {
-        debug('error occurred when running query to find and lock job');
-      }
-      cb(err, job);
-    });
-  }
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/agenda_index.js.html b/docs/agenda/2.0.0/agenda_index.js.html deleted file mode 100644 index a14b5e4..0000000 --- a/docs/agenda/2.0.0/agenda_index.js.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - - - - agenda/index.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/index.js -

- - - - - -
-
-
const {EventEmitter} = require('events');
-const humanInterval = require('human-interval');
-
-/**
- * @class Agenda
- * @param {Object} config
- * @param {Function} cb
- * @property {Object} _name - Name of the current Agenda queue
- * @property {Number} _processEvery
- * @property {Number} _defaultConcurrency
- * @property {Number} _maxConcurrency
- * @property {Number} _defaultLockLimit
- * @property {Number} _lockLimit
- * @property {Object} _definitions
- * @property {Object} _runningJobs
- * @property {Object} _lockedJobs
- * @property {Object} _jobQueue
- * @property {Number} _defaultLockLifetime
- * @property {Object} _sort
- * @property {Object} _indices
- * @property {Boolean} _isLockingOnTheFly
- * @property {Array} _jobsToLock
- */
-class Agenda extends EventEmitter {
-  constructor(config = {}, cb) {
-    super();
-
-    if (!(this instanceof Agenda)) {
-      return new Agenda(config);
-    }
-
-    this._name = config.name;
-    this._processEvery = humanInterval(config.processEvery) || humanInterval('5 seconds');
-    this._defaultConcurrency = config.defaultConcurrency || 5;
-    this._maxConcurrency = config.maxConcurrency || 20;
-    this._defaultLockLimit = config.defaultLockLimit || 0;
-    this._lockLimit = config.lockLimit || 0;
-    this._definitions = {};
-    this._runningJobs = [];
-    this._lockedJobs = [];
-    this._jobQueue = [];
-    this._defaultLockLifetime = config.defaultLockLifetime || 10 * 60 * 1000; // 10 minute default lockLifetime
-    this._sort = config.sort || {nextRunAt: 1, priority: -1};
-    this._indices = Object.assign({name: 1}, this._sort, {priority: -1, lockedAt: 1, nextRunAt: 1, disabled: 1});
-
-    this._isLockingOnTheFly = false;
-    this._jobsToLock = [];
-    this._ready = new Promise(resolve => this.once('ready', resolve));
-
-    if (config.mongo) {
-      this.mongo(config.mongo, config.db ? config.db.collection : undefined, cb);
-    } else if (config.db) {
-      this.database(config.db.address, config.db.collection, config.db.options, cb);
-    }
-  }
-}
-
-Agenda.prototype.mongo = require('./mongo');
-Agenda.prototype.database = require('./database');
-Agenda.prototype.db_init = require('./db-init'); // eslint-disable-line camelcase
-Agenda.prototype.name = require('./name');
-Agenda.prototype.processEvery = require('./process-every');
-Agenda.prototype.maxConcurrency = require('./max-concurrency');
-Agenda.prototype.defaultConcurrency = require('./default-concurrency');
-Agenda.prototype.lockLimit = require('./locklimit');
-Agenda.prototype.defaultLockLimit = require('./default-lock-limit');
-Agenda.prototype.defaultLockLifetime = require('./default-lock-lifetime');
-Agenda.prototype.sort = require('./sort');
-Agenda.prototype.create = require('./create');
-Agenda.prototype.jobs = require('./jobs');
-Agenda.prototype.purge = require('./purge');
-Agenda.prototype.define = require('./define');
-Agenda.prototype.every = require('./every');
-Agenda.prototype.schedule = require('./schedule');
-Agenda.prototype.now = require('./now');
-Agenda.prototype.cancel = require('./cancel');
-Agenda.prototype.saveJob = require('./save-job');
-Agenda.prototype.start = require('./start');
-Agenda.prototype.stop = require('./stop');
-Agenda.prototype._findAndLockNextJob = require('./find-and-lock-next-job');
-
-module.exports = Agenda;
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/agenda_jobs.js.html b/docs/agenda/2.0.0/agenda_jobs.js.html deleted file mode 100644 index 62301c6..0000000 --- a/docs/agenda/2.0.0/agenda_jobs.js.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - agenda/jobs.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/jobs.js -

- - - - - -
-
-
'use strict';
-const {createJob} = require('../utils');
-
-/**
- * Finds all jobs matching 'query'
- * @name Agenda#jobs
- * @function
- * @param {Object} query object for MongoDB
- * @returns {Promise} resolves when fails or passes
- */
-module.exports = async function(query) {
-  const result = await this._collection.find(query).toArray();
-
-  return result.map(job => createJob(this, job));
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/agenda_locklimit.js.html b/docs/agenda/2.0.0/agenda_locklimit.js.html deleted file mode 100644 index 870b734..0000000 --- a/docs/agenda/2.0.0/agenda_locklimit.js.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - agenda/locklimit.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/locklimit.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:locklimit');
-
-/**
- * Set the default amount jobs that are allowed to be locked at one time (GLOBAL)
- * @name Agenda#locklimit
- * @function
- * @param {Number} num Lock limit
- * @returns {exports} agenda instance
- */
-module.exports = function(num) {
-   // @NOTE: Is this different than max concurrency?
-  debug('Agenda.lockLimit(%d)', num);
-  this._lockLimit = num;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/agenda_max-concurrency.js.html b/docs/agenda/2.0.0/agenda_max-concurrency.js.html deleted file mode 100644 index 9f6d4e8..0000000 --- a/docs/agenda/2.0.0/agenda_max-concurrency.js.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - agenda/max-concurrency.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/max-concurrency.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:maxConcurrency');
-
-/**
- * Set the concurrency for jobs (globally), type does not matter
- * @name Agenda#maxConcurrency
- * @function
- * @param {Number} num max concurrency value
- * @returns {exports} agenda instance
- */
-module.exports = function(num) {
-  debug('Agenda.maxConcurrency(%d)', num);
-  this._maxConcurrency = num;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/agenda_mongo.js.html b/docs/agenda/2.0.0/agenda_mongo.js.html deleted file mode 100644 index c9aa9f0..0000000 --- a/docs/agenda/2.0.0/agenda_mongo.js.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - agenda/mongo.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/mongo.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Build method used to add MongoDB connection details
- * @name Agenda#mongo
- * @function
- * @param {MongoClient} mdb instance of MongoClient to use
- * @param {String} collection name collection we want to use ('agendaJobs')
- * @param {Function} cb called when MongoDB connection fails or passes
- * @returns {exports} instance of Agenda
- */
-module.exports = function(mdb, collection, cb) {
-  this._mdb = mdb;
-  this.db_init(collection, cb);
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/agenda_name.js.html b/docs/agenda/2.0.0/agenda_name.js.html deleted file mode 100644 index 24ba54b..0000000 --- a/docs/agenda/2.0.0/agenda_name.js.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - agenda/name.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/name.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:name');
-
-/**
- * Set name of queue
- * @name Agenda#name
- * @function
- * @param {String} name name of agenda instance
- * @returns {exports} agenda instance
- */
-module.exports = function(name) {
-  debug('Agenda.name(%s)', name);
-  this._name = name;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/agenda_now.js.html b/docs/agenda/2.0.0/agenda_now.js.html deleted file mode 100644 index bbe81df..0000000 --- a/docs/agenda/2.0.0/agenda_now.js.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - agenda/now.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/now.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:now');
-const noCallback = require('../no-callback');
-
-/**
- * Create a job for this exact moment
- * @name Agenda#now
- * @function
- * @param {String} name name of job to schedule
- * @param {Object} data data to pass to job
- * @param {Function} cb called when job scheduling fails or passes
- * @returns {Job} new job instance created
- */
-module.exports = async function(name, data) {
-  noCallback(arguments, 2);
-  debug('Agenda.now(%s, [Object])', name);
-  const job = this.create(name, data);
-
-  job.schedule(new Date());
-  await job.save();
-
-  return job;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/agenda_process-every.js.html b/docs/agenda/2.0.0/agenda_process-every.js.html deleted file mode 100644 index 1b689bb..0000000 --- a/docs/agenda/2.0.0/agenda_process-every.js.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - agenda/process-every.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/process-every.js -

- - - - - -
-
-
'use strict';
-const humanInterval = require('human-interval');
-const debug = require('debug')('agenda:processEvery');
-
-/**
- * Set the default process interval
- * @name Agenda#processEvery
- * @function
- * @param {Number} time time to process
- * @returns {exports} agenda instance
- */
-module.exports = function(time) {
-  debug('Agenda.processEvery(%d)', time);
-  this._processEvery = humanInterval(time);
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/agenda_purge.js.html b/docs/agenda/2.0.0/agenda_purge.js.html deleted file mode 100644 index e3c10d0..0000000 --- a/docs/agenda/2.0.0/agenda_purge.js.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - agenda/purge.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/purge.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:purge');
-
-/**
- * Removes all jobs from queue
- * @name Agenda#purge
- * @function
- * @returns {Promise}
- */
-module.exports = async function() {
-  // @NOTE: Only use after defining your jobs
-  const definedNames = Object.keys(this._definitions);
-  debug('Agenda.purge(%o)', definedNames);
-  return this.cancel({name: {$not: {$in: definedNames}}});
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/agenda_save-job.js.html b/docs/agenda/2.0.0/agenda_save-job.js.html deleted file mode 100644 index 05884ff..0000000 --- a/docs/agenda/2.0.0/agenda_save-job.js.html +++ /dev/null @@ -1,247 +0,0 @@ - - - - - - - - - - - agenda/save-job.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/save-job.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:saveJob');
-const utils = require('../utils');
-
-const processJobs = utils.processJobs;
-
-/**
- * Given a result for findOneAndUpdate() or insert() above, determine whether to process
- * the job immediately or to let the processJobs() interval pick it up later
- * @param {Error} err error passed in via MongoDB call as to whether modify call failed or passed
- * @param {*} result the data returned from the findOneAndUpdate() call or insertOne() call
- * @access private
- * @returns {undefined}
- */
-const processDbResult = (job, result) => {
-  debug('processDbResult() called with success, checking whether to process job immediately or not');
-
-  // We have a result from the above calls
-  // findOneAndUpdate() returns different results than insertOne() so check for that
-  let res = result.ops ? result.ops : result.value;
-  if (res) {
-    // If it is an array, grab the first job
-    if (Array.isArray(res)) {
-      res = res[0];
-    }
-
-    // Grab ID and nextRunAt from MongoDB and store it as an attribute on Job
-    job.attrs._id = res._id;
-    job.attrs.nextRunAt = res.nextRunAt;
-
-    // If the current job would have been processed in an older scan, process the job immediately
-    if (job.attrs.nextRunAt && job.attrs.nextRunAt < this._nextScanAt) {
-      debug('[%s:%s] job would have ran by nextScanAt, processing the job immediately', job.attrs.name, res._id);
-      processJobs.call(this, job);
-    }
-  }
-
-  // Return the Job instance
-  return job;
-};
-
-/**
- * Save the properties on a job to MongoDB
- * @name Agenda#saveJob
- * @function
- * @param {Job} job job to save into MongoDB
- * @returns {Promise} resolves when job is saved or errors
- */
-module.exports = async function(job) {
-  try {
-    debug('attempting to save a job into Agenda instance');
-
-    // Grab information needed to save job but that we don't want to persist in MongoDB
-    const id = job.attrs._id;
-    const unique = job.attrs.unique;
-    const uniqueOpts = job.attrs.uniqueOpts;
-
-    // Store job as JSON and remove props we don't want to store from object
-    const props = job.toJSON();
-    delete props._id;
-    delete props.unique;
-    delete props.uniqueOpts;
-
-    // Store name of agenda queue as last modifier in job data
-    props.lastModifiedBy = this._name;
-    debug('[job %s] set job props: \n%O', id, props);
-
-    // Grab current time and set default query options for MongoDB
-    const now = new Date();
-    const protect = {};
-    let update = {$set: props};
-    debug('current time stored as %s', now.toISOString());
-
-    // If the job already had an ID, then update the properties of the job
-    // i.e, who last modified it, etc
-    if (id) {
-      // Update the job and process the resulting data'
-      debug('job already has _id, calling findOneAndUpdate() using _id as query');
-      const result = await this._collection.findOneAndUpdate(
-        {_id: id},
-        update,
-        {returnDocument: 'after'}
-      );
-      return processDbResult(job, result);
-    } else if (props.type === 'single') {
-      // Job type set to 'single' so...
-      // NOTE: Again, not sure about difference between 'single' here and 'once' in job.js
-      debug('job with type of "single" found');
-
-      // If the nextRunAt time is older than the current time, "protect" that property, meaning, don't change
-      // a scheduled job's next run time!
-      if (props.nextRunAt && props.nextRunAt <= now) {
-        debug('job has a scheduled nextRunAt time, protecting that field from upsert');
-        protect.nextRunAt = props.nextRunAt;
-        delete props.nextRunAt;
-      }
-
-      // If we have things to protect, set them in MongoDB using $setOnInsert
-      if (Object.keys(protect).length > 0) {
-        update.$setOnInsert = protect;
-      }
-
-      // Try an upsert
-      // NOTE: 'single' again, not exactly sure what it means
-      debug('calling findOneAndUpdate() with job name and type of "single" as query');
-      const result = await this._collection.findOneAndUpdate({
-        name: props.name,
-        type: 'single'
-      },
-      update, {
-        upsert: true,
-        returnDocument: 'after'
-      });
-      return processDbResult(job, result);
-    } else if (unique) {
-      // If we want the job to be unique, then we can upsert based on the 'unique' query object that was passed in
-      const query = job.attrs.unique;
-      query.name = props.name;
-      if (uniqueOpts && uniqueOpts.insertOnly) {
-        update = {$setOnInsert: props};
-      }
-
-      // Use the 'unique' query object to find an existing job or create a new one
-      debug('calling findOneAndUpdate() with unique object as query: \n%O', query);
-      const result = await this._collection.findOneAndUpdate(query, update, {upsert: true, returnDocument: 'after'});
-      return processDbResult(job, result);
-    }
-      // If all else fails, the job does not exist yet so we just insert it into MongoDB
-    debug('using default behavior, inserting new job via insertOne() with props that were set: \n%O', props);
-    const result = await this._collection.insertOne(props);
-    return processDbResult(job, result);
-  } catch (err) {
-    debug('processDbResult() received an error, job was not updated/created');
-    throw err;
-  }
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/agenda_schedule.js.html b/docs/agenda/2.0.0/agenda_schedule.js.html deleted file mode 100644 index d8dbbff..0000000 --- a/docs/agenda/2.0.0/agenda_schedule.js.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - - - - agenda/schedule.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/schedule.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:schedule');
-
-/**
- * Schedule a job or jobs at a specific time
- * @name Agenda#schedule
- * @function
- * @param {String} when when the job gets run
- * @param {Array<String>} names array of job names to run
- * @param {Object} data data to send to job
- * @returns {Promise<Job|Job[]>} job or jobs created
- */
-module.exports = function(when, names, data) {
-  const self = this;
-
-  /**
-   * Internal method that creates a job with given date
-   * @param {String} when when the job gets run
-   * @param {String} name of job to run
-   * @param {Object} data data to send to job
-   * @returns {Job} instance of new job
-   */
-  const createJob = async (when, name, data) => {
-    const job = self.create(name, data);
-
-    await job.schedule(when).save();
-
-    return job;
-  };
-
-  /**
-   * Internal helper method that calls createJob on a names array
-   * @param {String} when when the job gets run
-   * @param {*} names of jobs to run
-   * @param {Object} data data to send to job
-   * @returns {Array<Job>} jobs that were created
-   */
-  const createJobs = async (when, names, data) => {
-    try {
-      const jobs = await Promise.all(names.map(name => createJob(when, name, data)));
-      debug('Agenda.schedule()::createJobs() -> all jobs created successfully');
-      return jobs;
-    } catch (err) {
-      debug('Agenda.schedule()::createJobs() -> error creating one or more of the jobs');
-      throw err;
-    }
-  };
-
-  if (typeof names === 'string' || names instanceof String) {
-    debug('Agenda.schedule(%s, %O, [%O], cb)', when, names);
-    return createJob(when, names, data);
-  } else if (Array.isArray(names)) {
-    debug('Agenda.schedule(%s, %O, [%O])', when, names);
-    return createJobs(when, names, data);
-  }
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/agenda_sort.js.html b/docs/agenda/2.0.0/agenda_sort.js.html deleted file mode 100644 index aa0f90a..0000000 --- a/docs/agenda/2.0.0/agenda_sort.js.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - agenda/sort.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/sort.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:sort');
-
-/**
- * Set the sort query for finding next job
- * Default is { nextRunAt: 1, priority: -1 }
- * @name Agenda#sort
- * @function
- * @param {Object} query sort query object for MongoDB
- * @returns {exports} agenda instance
- */
-module.exports = function(query) {
-  debug('Agenda.sort([Object])');
-  this._sort = query;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/agenda_start.js.html b/docs/agenda/2.0.0/agenda_start.js.html deleted file mode 100644 index b3573e8..0000000 --- a/docs/agenda/2.0.0/agenda_start.js.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - agenda/start.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/start.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:start');
-const utils = require('../utils');
-
-const processJobs = utils.processJobs;
-
-/**
- * Starts processing jobs using processJobs() methods, storing an interval ID
- * This method will only resolve if a db has been set up beforehand.
- * @name Agenda#start
- * @function
- * @returns {Promise}
- */
-module.exports = async function() {
-  if (this._processInterval) {
-    debug('Agenda.start was already called, ignoring');
-    return this._ready;
-  }
-  await this._ready;
-  debug('Agenda.start called, creating interval to call processJobs every [%dms]', this._processEvery);
-  this._processInterval = setInterval(processJobs.bind(this), this._processEvery);
-  process.nextTick(processJobs.bind(this));
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/agenda_stop.js.html b/docs/agenda/2.0.0/agenda_stop.js.html deleted file mode 100644 index 1667d57..0000000 --- a/docs/agenda/2.0.0/agenda_stop.js.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - - - - agenda/stop.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/stop.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:stop');
-
-/**
- * Clear the interval that processes the jobs
- * @name Agenda#stop
- * @function
- * @returns {Promise} resolves when job unlocking fails or passes
- */
-module.exports = function() {
-  const self = this;
-  /**
-   * Internal method to unlock jobs so that they can be re-run
-   * NOTE: May need to update what properties get set here, since job unlocking seems to fail
-   * @access private
-   * @returns {Promise} resolves when job unlocking fails or passes
-   */
-  const _unlockJobs = function() {
-    return new Promise((resolve, reject) => {
-      debug('Agenda._unlockJobs()');
-      const jobIds = self._lockedJobs.map(job => job.attrs._id);
-
-      if (jobIds.length === 0) {
-        debug('no jobs to unlock');
-        return resolve();
-      }
-
-      debug('about to unlock jobs with ids: %O', jobIds);
-      self._collection.updateMany({_id: {$in: jobIds}}, {$set: {lockedAt: null}}, err => {
-        if (err) {
-          return reject(err);
-        }
-
-        self._lockedJobs = [];
-        return resolve();
-      });
-    });
-  };
-
-  debug('Agenda.stop called, clearing interval for processJobs()');
-  clearInterval(this._processInterval);
-  this._processInterval = undefined;
-  return _unlockJobs();
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/fonts/OpenSans-Bold-webfont.eot b/docs/agenda/2.0.0/fonts/OpenSans-Bold-webfont.eot deleted file mode 100644 index 5d20d91..0000000 Binary files a/docs/agenda/2.0.0/fonts/OpenSans-Bold-webfont.eot and /dev/null differ diff --git a/docs/agenda/2.0.0/fonts/OpenSans-Bold-webfont.svg b/docs/agenda/2.0.0/fonts/OpenSans-Bold-webfont.svg deleted file mode 100644 index 3ed7be4..0000000 --- a/docs/agenda/2.0.0/fonts/OpenSans-Bold-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/2.0.0/fonts/OpenSans-Bold-webfont.woff b/docs/agenda/2.0.0/fonts/OpenSans-Bold-webfont.woff deleted file mode 100644 index 1205787..0000000 Binary files a/docs/agenda/2.0.0/fonts/OpenSans-Bold-webfont.woff and /dev/null differ diff --git a/docs/agenda/2.0.0/fonts/OpenSans-BoldItalic-webfont.eot b/docs/agenda/2.0.0/fonts/OpenSans-BoldItalic-webfont.eot deleted file mode 100644 index 1f639a1..0000000 Binary files a/docs/agenda/2.0.0/fonts/OpenSans-BoldItalic-webfont.eot and /dev/null differ diff --git a/docs/agenda/2.0.0/fonts/OpenSans-BoldItalic-webfont.svg b/docs/agenda/2.0.0/fonts/OpenSans-BoldItalic-webfont.svg deleted file mode 100644 index 6a2607b..0000000 --- a/docs/agenda/2.0.0/fonts/OpenSans-BoldItalic-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/2.0.0/fonts/OpenSans-BoldItalic-webfont.woff b/docs/agenda/2.0.0/fonts/OpenSans-BoldItalic-webfont.woff deleted file mode 100644 index ed760c0..0000000 Binary files a/docs/agenda/2.0.0/fonts/OpenSans-BoldItalic-webfont.woff and /dev/null differ diff --git a/docs/agenda/2.0.0/fonts/OpenSans-Italic-webfont.eot b/docs/agenda/2.0.0/fonts/OpenSans-Italic-webfont.eot deleted file mode 100644 index 0c8a0ae..0000000 Binary files a/docs/agenda/2.0.0/fonts/OpenSans-Italic-webfont.eot and /dev/null differ diff --git a/docs/agenda/2.0.0/fonts/OpenSans-Italic-webfont.svg b/docs/agenda/2.0.0/fonts/OpenSans-Italic-webfont.svg deleted file mode 100644 index e1075dc..0000000 --- a/docs/agenda/2.0.0/fonts/OpenSans-Italic-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/2.0.0/fonts/OpenSans-Italic-webfont.woff b/docs/agenda/2.0.0/fonts/OpenSans-Italic-webfont.woff deleted file mode 100644 index ff652e6..0000000 Binary files a/docs/agenda/2.0.0/fonts/OpenSans-Italic-webfont.woff and /dev/null differ diff --git a/docs/agenda/2.0.0/fonts/OpenSans-Light-webfont.eot b/docs/agenda/2.0.0/fonts/OpenSans-Light-webfont.eot deleted file mode 100644 index 1486840..0000000 Binary files a/docs/agenda/2.0.0/fonts/OpenSans-Light-webfont.eot and /dev/null differ diff --git a/docs/agenda/2.0.0/fonts/OpenSans-Light-webfont.svg b/docs/agenda/2.0.0/fonts/OpenSans-Light-webfont.svg deleted file mode 100644 index 11a472c..0000000 --- a/docs/agenda/2.0.0/fonts/OpenSans-Light-webfont.svg +++ /dev/null @@ -1,1831 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/2.0.0/fonts/OpenSans-Light-webfont.woff b/docs/agenda/2.0.0/fonts/OpenSans-Light-webfont.woff deleted file mode 100644 index e786074..0000000 Binary files a/docs/agenda/2.0.0/fonts/OpenSans-Light-webfont.woff and /dev/null differ diff --git a/docs/agenda/2.0.0/fonts/OpenSans-LightItalic-webfont.eot b/docs/agenda/2.0.0/fonts/OpenSans-LightItalic-webfont.eot deleted file mode 100644 index 8f44592..0000000 Binary files a/docs/agenda/2.0.0/fonts/OpenSans-LightItalic-webfont.eot and /dev/null differ diff --git a/docs/agenda/2.0.0/fonts/OpenSans-LightItalic-webfont.svg b/docs/agenda/2.0.0/fonts/OpenSans-LightItalic-webfont.svg deleted file mode 100644 index 431d7e3..0000000 --- a/docs/agenda/2.0.0/fonts/OpenSans-LightItalic-webfont.svg +++ /dev/null @@ -1,1835 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/2.0.0/fonts/OpenSans-LightItalic-webfont.woff b/docs/agenda/2.0.0/fonts/OpenSans-LightItalic-webfont.woff deleted file mode 100644 index 43e8b9e..0000000 Binary files a/docs/agenda/2.0.0/fonts/OpenSans-LightItalic-webfont.woff and /dev/null differ diff --git a/docs/agenda/2.0.0/fonts/OpenSans-Regular-webfont.eot b/docs/agenda/2.0.0/fonts/OpenSans-Regular-webfont.eot deleted file mode 100644 index 6bbc3cf..0000000 Binary files a/docs/agenda/2.0.0/fonts/OpenSans-Regular-webfont.eot and /dev/null differ diff --git a/docs/agenda/2.0.0/fonts/OpenSans-Regular-webfont.svg b/docs/agenda/2.0.0/fonts/OpenSans-Regular-webfont.svg deleted file mode 100644 index 25a3952..0000000 --- a/docs/agenda/2.0.0/fonts/OpenSans-Regular-webfont.svg +++ /dev/null @@ -1,1831 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/2.0.0/fonts/OpenSans-Regular-webfont.woff b/docs/agenda/2.0.0/fonts/OpenSans-Regular-webfont.woff deleted file mode 100644 index e231183..0000000 Binary files a/docs/agenda/2.0.0/fonts/OpenSans-Regular-webfont.woff and /dev/null differ diff --git a/docs/agenda/2.0.0/fonts/OpenSans-Semibold-webfont.eot b/docs/agenda/2.0.0/fonts/OpenSans-Semibold-webfont.eot deleted file mode 100644 index d8375dd..0000000 Binary files a/docs/agenda/2.0.0/fonts/OpenSans-Semibold-webfont.eot and /dev/null differ diff --git a/docs/agenda/2.0.0/fonts/OpenSans-Semibold-webfont.svg b/docs/agenda/2.0.0/fonts/OpenSans-Semibold-webfont.svg deleted file mode 100644 index eec4db8..0000000 --- a/docs/agenda/2.0.0/fonts/OpenSans-Semibold-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/2.0.0/fonts/OpenSans-Semibold-webfont.ttf b/docs/agenda/2.0.0/fonts/OpenSans-Semibold-webfont.ttf deleted file mode 100644 index b329084..0000000 Binary files a/docs/agenda/2.0.0/fonts/OpenSans-Semibold-webfont.ttf and /dev/null differ diff --git a/docs/agenda/2.0.0/fonts/OpenSans-Semibold-webfont.woff b/docs/agenda/2.0.0/fonts/OpenSans-Semibold-webfont.woff deleted file mode 100644 index 28d6ade..0000000 Binary files a/docs/agenda/2.0.0/fonts/OpenSans-Semibold-webfont.woff and /dev/null differ diff --git a/docs/agenda/2.0.0/fonts/OpenSans-SemiboldItalic-webfont.eot b/docs/agenda/2.0.0/fonts/OpenSans-SemiboldItalic-webfont.eot deleted file mode 100644 index 0ab1db2..0000000 Binary files a/docs/agenda/2.0.0/fonts/OpenSans-SemiboldItalic-webfont.eot and /dev/null differ diff --git a/docs/agenda/2.0.0/fonts/OpenSans-SemiboldItalic-webfont.svg b/docs/agenda/2.0.0/fonts/OpenSans-SemiboldItalic-webfont.svg deleted file mode 100644 index 7166ec1..0000000 --- a/docs/agenda/2.0.0/fonts/OpenSans-SemiboldItalic-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/2.0.0/fonts/OpenSans-SemiboldItalic-webfont.ttf b/docs/agenda/2.0.0/fonts/OpenSans-SemiboldItalic-webfont.ttf deleted file mode 100644 index d2d6318..0000000 Binary files a/docs/agenda/2.0.0/fonts/OpenSans-SemiboldItalic-webfont.ttf and /dev/null differ diff --git a/docs/agenda/2.0.0/fonts/OpenSans-SemiboldItalic-webfont.woff b/docs/agenda/2.0.0/fonts/OpenSans-SemiboldItalic-webfont.woff deleted file mode 100644 index d4dfca4..0000000 Binary files a/docs/agenda/2.0.0/fonts/OpenSans-SemiboldItalic-webfont.woff and /dev/null differ diff --git a/docs/agenda/2.0.0/global.html b/docs/agenda/2.0.0/global.html deleted file mode 100644 index 7c8a5ec..0000000 --- a/docs/agenda/2.0.0/global.html +++ /dev/null @@ -1,338 +0,0 @@ - - - - - - - - - Global - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- Global -

- - - - -
-
- -

- - - -

- - - -
- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - - - - - - - - - -

Methods

- - - - - - - - - - - - - -

- parsePriority(priority) → {Number} -

-
- - - - - -
-

Internal method to turn priority into a number

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
priority - - - - String - - - | - - - Number - - - - - - - -

string to parse into number

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - -
-
- - - - -
- -
- - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/2.0.0/icons/home.svg b/docs/agenda/2.0.0/icons/home.svg deleted file mode 100644 index 676d2d3..0000000 --- a/docs/agenda/2.0.0/icons/home.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/docs/agenda/2.0.0/icons/search.svg b/docs/agenda/2.0.0/icons/search.svg deleted file mode 100644 index ccc84b6..0000000 --- a/docs/agenda/2.0.0/icons/search.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/docs/agenda/2.0.0/index.html b/docs/agenda/2.0.0/index.html deleted file mode 100644 index 5f10255..0000000 --- a/docs/agenda/2.0.0/index.html +++ /dev/null @@ -1,693 +0,0 @@ - - - - - - - - - Home - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- - - - - - - - - - - - -
-
-

- Agenda -

-

- A light-weight job scheduling library for Node.js -

-

- Slack Status - Build Status - dependencies Status - devDependencies Status - Coverage Status -
-
-
-

- -

Agenda offers

    -
  • Minimal overhead. Agenda aims to keep its code base small.
  • -
  • Mongo backed persistence layer.
  • -
  • Scheduling with configurable priority, concurrency, and repeating
  • -
  • Scheduling via cron or human readable syntax.
  • -
  • Event backed job queue that you can hook into.
  • -
  • Agendash: optional standalone web-interface
  • -
  • Agenda-rest: optional standalone REST API
  • -
-

Installation

Install via NPM

-
npm install agenda

You will also need a working Mongo database (v3) to point it to.

-

Example Usage

const mongoConnectionString = 'mongodb://127.0.0.1/agenda';
-
-const agenda = new Agenda({db: {address: mongoConnectionString}});
-
-// Or override the default collection name:
-// const agenda = new Agenda({db: {address: mongoConnectionString, collection: 'jobCollectionName'}});
-
-// or pass additional connection options:
-// const agenda = new Agenda({db: {address: mongoConnectionString, collection: 'jobCollectionName', options: {ssl: true}}});
-
-// or pass in an existing mongodb-native MongoClient instance
-// const agenda = new Agenda({mongo: myMongoClient});
-
-agenda.define('delete old users', (job, done) => {
-  User.remove({lastLogIn: {$lt: twoDaysAgo}}, done);
-});
-
-(async function() { // IIFE to give access to async/await
-  await agenda.start();
-
-  await agenda.every('3 minutes', 'delete old users');
-
-  // Alternatively, you could also do:
-  await agenda.every('*/3 * * * *', 'delete old users');
-})();
agenda.define('send email report', {priority: 'high', concurrency: 10}, (job, done) => {
-  const {to} = job.attrs.data;
-  emailClient.send({
-    to,
-    from: 'example@example.com',
-    subject: 'Email Report',
-    body: '...'
-  }, done);
-});
-
-(async function() {
-  await agenda.start();
-  await agenda.schedule('in 20 minutes', 'send email report', {to: 'admin@example.com'});
-})();
(async function() {
-  const weeklyReport = agenda.create('send email report', {to: 'example@example.com'});
-  await agenda.start();
-  await weeklyReport.repeatEvery('1 week').save();
-})();

Full documentation

Agenda's basic control structure is an instance of an agenda. Agenda's are -mapped to a database collection and load the jobs from within.

-

Table of Contents

-

Configuring an agenda

All configuration methods are chainable, meaning you can do something like:

-
const agenda = new Agenda();
-agenda
-  .database(...)
-  .processEvery('3 minutes')
-  ...;

Agenda uses Human Interval for specifying the intervals. It supports the following units:

-

seconds, minutes, hours, days,weeks, months -- assumes 30 days, years -- assumes 365 days

-

More sophisticated examples

-
agenda.processEvery('one minute');
-agenda.processEvery('1.5 minutes');
-agenda.processEvery('3 days and 4 hours');
-agenda.processEvery('3 days, 4 hours and 36 seconds');

database(url, [collectionName])

Specifies the database at the url specified. If no collection name is given, -agendaJobs is used.

-
agenda.database('localhost:27017/agenda-test', 'agendaJobs');

You can also specify it during instantiation.

-
const agenda = new Agenda({db: {address: 'localhost:27017/agenda-test', collection: 'agendaJobs'}});

Agenda will emit a ready event (see Agenda Events) when properly connected to the database. -It is safe to call agenda.start() without waiting for this event, as this is handled internally. -If you're using the db options, or call database, then you may still need to listen for ready before saving jobs.

-

mongo(mongoClientInstance)

Use an existing mongodb-native MongoClient instance. This can help consolidate connections to a -database. You can instead use .database to have agenda handle connecting for -you.

-

Please note that this must be a collection. Also, you will want to run the following -afterwards to ensure the database has the proper indexes:

-
(async () => {
-  await agenda._ready;
-
-  try {
-    agenda._collection.createIndex({
-      disabled: 1,
-      lockedAt: 1,
-      name: 1,
-      nextRunAt: 1,
-      priority: -1
-    }, {
-      name: 'findAndLockNextJobIndex'
-    });
-  } catch (err) {
-    console.log('Failed to create Agenda index!');
-    console.error(err);
-
-    throw err;
-  }
-
-  console.log('Agenda index created.');
-})();

You can also specify it during instantiation.

-
const agenda = new Agenda({mongo: mongoClientInstance});

name(name)

Takes a string name and sets lastModifiedBy to it in the job database. -Useful for if you have multiple job processors (agendas) and want to see which -job queue last ran the job.

-
agenda.name(os.hostname + '-' + process.pid);

You can also specify it during instantiation

-
const agenda = new Agenda({name: 'test queue'});

processEvery(interval)

Takes a string interval which can be either a traditional javascript number, -or a string such as 3 minutes

-

Specifies the frequency at which agenda will query the database looking for jobs -that need to be processed. Agenda internally uses setTimeout to guarantee that -jobs run at (close to ~3ms) the right time.

-

Decreasing the frequency will result in fewer database queries, but more jobs -being stored in memory.

-

Also worth noting is that if the job queue is shutdown, any jobs stored in memory -that haven't run will still be locked, meaning that you may have to wait for the -lock to expire.

-
agenda.processEvery('1 minute');

You can also specify it during instantiation

-
const agenda = new Agenda({processEvery: '30 seconds'});

maxConcurrency(number)

Takes a number which specifies the max number of jobs that can be running at -any given moment. By default it is 20.

-
agenda.maxConcurrency(20);

You can also specify it during instantiation

-
const agenda = new Agenda({maxConcurrency: 20});

defaultConcurrency(number)

Takes a number which specifies the default number of a specific job that can be running at -any given moment. By default it is 5.

-
agenda.defaultConcurrency(5);

You can also specify it during instantiation

-
const agenda = new Agenda({defaultConcurrency: 5});

lockLimit(number)

Takes a number which specifies the max number jobs that can be locked at any given moment. By default it is 0 for no max.

-
agenda.lockLimit(0);

You can also specify it during instantiation

-
const agenda = new Agenda({lockLimit: 0});

defaultLockLimit(number)

Takes a number which specifies the default number of a specific job that can be locked at any given moment. By default it is 0 for no max.

-
agenda.defaultLockLimit(0);

You can also specify it during instantiation

-
const agenda = new Agenda({defaultLockLimit: 0});

defaultLockLifetime(number)

Takes a number which specifies the default lock lifetime in milliseconds. By -default it is 10 minutes. This can be overridden by specifying the -lockLifetime option to a defined job.

-

A job will unlock if it is finished (ie. done is called) before the lockLifetime. -The lock is useful if the job crashes or times out.

-
agenda.defaultLockLifetime(10000);

You can also specify it during instantiation

-
const agenda = new Agenda({defaultLockLifetime: 10000});

sort(query)

Takes a query which specifies the sort query to be used for finding and locking the next job.

-

By default it is { nextRunAt: 1, priority: -1 }, which obeys a first in first out approach, with respect to priority.

-

Agenda Events

An instance of an agenda will emit the following events:

-
    -
  • ready - called when Agenda mongo connection is successfully opened and indices created.
      If you're passing agenda an existing connection, you shouldn't need to listen for this, as `agenda.start()` will not resolve until indices have been created.
    -  If you're using the `db` options, or call `database`, then you may still need to listen for the `ready` event before saving jobs. `agenda.start()` will still wait for the connection to be opened.
  • -
  • error - called when Agenda mongo connection process has thrown an error
  • -
-
await agenda.start();

Defining Job Processors

Before you can use a job, you must define its processing behavior.

-

define(jobName, [options], fn)

Defines a job with the name of jobName. When a job of jobName gets run, it -will be passed to fn(job, done). To maintain asynchronous behavior, you must -call done() when you are processing the job. If your function is synchronous, -you may omit done from the signature.

-

options is an optional argument which can overwrite the defaults. It can take -the following:

-
    -
  • concurrency: number maximum number of that job that can be running at once (per instance of agenda)
  • -
  • lockLimit: number maximum number of that job that can be locked at once (per instance of agenda)
  • -
  • lockLifetime: number interval in ms of how long the job stays locked for (see multiple job processors for more info). -A job will automatically unlock if done() is called.
  • -
  • priority: (lowest|low|normal|high|highest|number) specifies the priority -of the job. Higher priority jobs will run first. See the priority mapping -below
  • -
-

Priority mapping:

-
{
-  highest: 20,
-  high: 10,
-  normal: 0,
-  low: -10,
-  lowest: -20
-}

Async Job:

-
agenda.define('some long running job', (job, done) => {
-  doSomelengthyTask(data => {
-    formatThatData(data);
-    sendThatData(data);
-    done();
-  });
-});

Sync Job:

-
agenda.define('say hello', job => {
-  console.log('Hello!');
-});

Creating Jobs

every(interval, name, [data], [options], [cb])

Runs job name at the given interval. Optionally, data and options can be passed in. -Every creates a job of type single, which means that it will only create one -job in the database, even if that line is run multiple times. This lets you put -it in a file that may get run multiple times, such as webserver.js which may -reboot from time to time.

-

interval can be a human-readable format String, a cron format String, or a Number.

-

data is an optional argument that will be passed to the processing function -under job.attrs.data.

-

options is an optional argument that will be passed to job.repeatEvery. In order to use -this argument, data must also be specified.

-

cb is an optional callback function which will be called when the job has been -persisted in the database.

-

Returns the job.

-
agenda.define('printAnalyticsReport', (job, done) => {
-  User.doSomethingReallyIntensive((err, users) => {
-    processUserData();
-    console.log('I print a report!');
-    done();
-  });
-});
-
-agenda.every('15 minutes', 'printAnalyticsReport');

Optionally, name could be array of job names, which is convenient for scheduling -different jobs for same interval.

-
agenda.every('15 minutes', ['printAnalyticsReport', 'sendNotifications', 'updateUserRecords']);

In this case, every returns array of jobs.

-

schedule(when, name, [data], [cb])

Schedules a job to run name once at a given time. when can be a Date or a -String such as tomorrow at 5pm.

-

data is an optional argument that will be passed to the processing function -under job.attrs.data.

-

cb is an optional callback function which will be called when the job has been -persisted in the database.

-

Returns the job.

-
agenda.schedule('tomorrow at noon', 'printAnalyticsReport', {userCount: 100});

Optionally, name could be array of job names, similar to every method.

-
agenda.schedule('tomorrow at noon', ['printAnalyticsReport', 'sendNotifications', 'updateUserRecords']);

In this case, schedule returns array of jobs.

-

now(name, [data], [cb])

Schedules a job to run name once immediately.

-

data is an optional argument that will be passed to the processing function -under job.attrs.data.

-

cb is an optional callback function which will be called when the job has been -persisted in the database.

-

Returns the job.

-
agenda.now('do the hokey pokey');

create(jobName, data)

Returns an instance of a jobName with data. This does NOT save the job in -the database. See below to learn how to manually work with jobs.

-
const job = agenda.create('printAnalyticsReport', {userCount: 100});
-job.save(err => {
-  console.log('Job successfully saved');
-});

Managing Jobs

jobs(mongodb-native query)

Lets you query all of the jobs in the agenda job's database. This is a full mongodb-native -find query. See mongodb-native's documentation for details.

-
agenda.jobs({name: 'printAnalyticsReport'}, (err, jobs) => {
-  // Work with jobs (see below)
-});

cancel(mongodb-native query, cb)

Cancels any jobs matching the passed mongodb-native query, and removes them from the database.

-
agenda.cancel({name: 'printAnalyticsReport'}, (err, numRemoved) => {
-  // ...
-});

This functionality can also be achieved by first retrieving all the jobs from the database using agenda.jobs(), looping through the resulting array and calling job.remove() on each. It is however preferable to use agenda.cancel() for this use case, as this ensures the operation is atomic.

-

purge(cb)

Removes all jobs in the database without defined behaviors. Useful if you change a definition name and want to remove old jobs.

-

IMPORTANT: Do not run this before you finish defining all of your jobs. If you do, you will nuke your database of jobs.

-
agenda.purge((err, numRemoved) => {
-  // ...
-});

Starting the job processor

To get agenda to start processing jobs from the database you must start it. This -will schedule an interval (based on processEvery) to check for new jobs and -run them. You can also stop the queue.

-

start

Starts the job queue processing, checking processEvery time to see if there -are new jobs.

-

stop

Stops the job queue processing. Unlocks currently running jobs.

-

This can be very useful for graceful shutdowns so that currently running/grabbed jobs are abandoned so that other -job queues can grab them / they are unlocked should the job queue start again. Here is an example of how to do a graceful -shutdown.

-
async function graceful() {
-  await agenda.stop();
-  process.exit(0);
-}
-
-process.on('SIGTERM', graceful);
-process.on('SIGINT' , graceful);

Multiple job processors

Sometimes you may want to have multiple node instances / machines process from -the same queue. Agenda supports a locking mechanism to ensure that multiple -queues don't process the same job.

-

You can configure the locking mechanism by specifying lockLifetime as an -interval when defining the job.

-
agenda.define('someJob', {lockLifetime: 10000}, (job, cb) => {
-  // Do something in 10 seconds or less...
-});

This will ensure that no other job processor (this one included) attempts to run the job again -for the next 10 seconds. If you have a particularly long running job, you will want to -specify a longer lockLifetime.

-

By default it is 10 minutes. Typically you shouldn't have a job that runs for 10 minutes, -so this is really insurance should the job queue crash before the job is unlocked.

-

When a job is finished (ie. done is called), it will automatically unlock.

-

Manually working with a job

A job instance has many instance methods. All mutating methods must be followed -with a call to job.save() in order to persist the changes to the database.

-

repeatEvery(interval, [options])

Specifies an interval on which the job should repeat. The job runs at the time of defining as well in configured intervals, that is "run now and in intervals".

-

interval can be a human-readable format String, a cron format String, or a Number.

-

options is an optional argument containing:

-

options.timezone: should be a string as accepted by moment-timezone and is considered when using an interval in the cron string format.

-

options.skipImmediate: true | false (default) Setting this true will skip the immediate run. The first run will occur only in configured interval.

-
job.repeatEvery('10 minutes');
-job.save();
job.repeatEvery('3 minutes', {
-  skipImmediate: true
-});
-job.save();
job.repeatEvery('0 6 * * *', {
-  timezone: 'America/New_York'
-});
-job.save();

repeatAt(time)

Specifies a time when the job should repeat. Possible values

-
job.repeatAt('3:30pm');
-job.save();

schedule(time)

Specifies the next time at which the job should run.

-
job.schedule('tomorrow at 6pm');
-job.save();

priority(priority)

Specifies the priority weighting of the job. Can be a number or a string from -the above priority table.

-
job.priority('low');
-job.save();

unique(properties, [options])

Ensure that only one instance of this job exists with the specified properties

-

options is an optional argument which can overwrite the defaults. It can take -the following:

-
    -
  • insertOnly: boolean will prevent any properties from persisting if job already exists. Defaults to false.
  • -
-
job.unique({'data.type': 'active', 'data.userId': '123', nextRunAt(date)});
-job.save();

IMPORTANT: To avoid high CPU usage by MongoDB, Make sure to create an index on the used fields, like: data.type and data.userId for the example above.

-

fail(reason)

Sets job.attrs.failedAt to now, and sets job.attrs.failReason -to reason.

-

Optionally, reason can be an error, in which case job.attrs.failReason will -be set to error.message

-
job.fail('insuficient disk space');
-// or
-job.fail(new Error('insufficient disk space'));
-job.save();

run(callback)

Runs the given job and calls callback(err, job) upon completion. Normally -you never need to call this manually.

-
job.run((err, job) => {
-  console.log('I don\'t know why you would need to do this...');
-});

save(callback)

Saves the job.attrs into the database.

-
job.save(err => {
-  if (!err) {
-    console.log('Successfully saved job to collection');
-  }
-});

remove(callback)

Removes the job from the database.

-
job.remove(err => {
-  if (!err) {
-    console.log('Successfully removed job from collection');
-  }
-});

disable()

Disables the job. Upcoming runs won't execute.

-

enable()

Enables the job if it got disabled before. Upcoming runs will execute.

-

touch(callback)

Resets the lock on the job. Useful to indicate that the job hasn't timed out -when you have very long running jobs.

-
agenda.define('super long job', (job, done) => {
-  doSomeLongTask(() => {
-    job.touch(() => {
-      doAnotherLongTask(() => {
-        job.touch(() => {
-          finishOurLongTasks(done);
-        });
-      });
-    });
-  });
-});

Job Queue Events

An instance of an agenda will emit the following events:

-
    -
  • start - called just before a job starts
  • -
  • start:job name - called just before the specified job starts
  • -
-
agenda.on('start', job => {
-  console.log('Job %s starting', job.attrs.name);
-});
    -
  • complete - called when a job finishes, regardless of if it succeeds or fails
  • -
  • complete:job name - called when a job finishes, regardless of if it succeeds or fails
  • -
-
agenda.on('complete', job => {
-  console.log(`Job ${job.attrs.name} finished`);
-});
    -
  • success - called when a job finishes successfully
  • -
  • success:job name - called when a job finishes successfully
  • -
-
agenda.on('success:send email', job => {
-  console.log(`Sent Email Successfully to ${job.attrs.data.to}`);
-});
    -
  • fail - called when a job throws an error
  • -
  • fail:job name - called when a job throws an error
  • -
-
agenda.on('fail:send email', (err, job) => {
-  console.log('Job failed with error: ${err.message}');
-});

Frequently Asked Questions

What is the order in which jobs run?

Jobs are run with priority in a first in first out order (so they will be run in the order they were scheduled AND with respect to highest priority).

-

For example, if we have two jobs named "send-email" queued (both with the same priority), and the first job is queued at 3:00 PM and second job is queued at 3:05 PM with the same priority value, then the first job will run first if we start to send "send-email" jobs at 3:10 PM. However if the first job has a priority of 5 and the second job has a priority of 10, then the second will run first (priority takes precedence) at 3:10 PM.

-

The default MongoDB sort object is { nextRunAt: 1, priority: -1 } and can be changed through the option sort when configuring Agenda.

-

What is the difference between lockLimit and maxConcurrency?

Agenda will lock jobs 1 by one, setting the lockedAt property in mongoDB, and creating an instance of the Job class which it caches into the _lockedJobs array. This defaults to having no limit, but can be managed using lockLimit. If all jobs will need to be run before agenda's next interval (set via agenda.processEvery), then agenda will attempt to lock all jobs.

-

Agenda will also pull jobs from _lockedJobs and into _runningJobs. These jobs are actively being worked on by user code, and this is limited by maxConcurrency (defaults to 20).

-

If you have multiple instances of agenda processing the same job definition with a fast repeat time you may find they get unevenly loaded. This is because they will compete to lock as many jobs as possible, even if they don't have enough concurrency to process them. This can be resolved by tweaking the maxConcurrency and lockLimit properties.

-

Sample Project Structure?

Agenda doesn't have a preferred project structure and leaves it to the user to -choose how they would like to use it. That being said, you can check out the -example project structure below.

-

Can I Donate?

Thanks! I'm flattered, but it's really not necessary. If you really want to, you can find my gittip here.

-

Web Interface?

Agenda itself does not have a web interface built in but we do offer stand-alone web interface Agendash:

-

Agendash interface

-

Mongo vs Redis

The decision to use Mongo instead of Redis is intentional. Redis is often used for -non-essential data (such as sessions) and without configuration doesn't -guarantee the same level of persistence as Mongo (should the server need to be -restarted/crash).

-

Agenda decides to focus on persistence without requiring special configuration -of Redis (thereby degrading the performance of the Redis server on non-critical -data, such as sessions).

-

Ultimately if enough people want a Redis driver instead of Mongo, I will write -one. (Please open an issue requesting it). For now, Agenda decided to focus on -guaranteed persistence.

-

Spawning / forking processes.

Ultimately Agenda can work from a single job queue across multiple machines, node processes, or forks. If you are interested in having more than one worker, Bars3s has written up a fantastic example of how one might do it:

-
const cluster = require('cluster');
-const os = require('os');
-
-const httpServer = require('./app/http-server');
-const jobWorker = require('./app/job-worker');
-
-const jobWorkers = [];
-const webWorkers = [];
-
-if (cluster.isMaster) {
-  const cpuCount = os.cpus().length;
-  // Create a worker for each CPU
-  for (let i = 0; i < cpuCount; i += 1) {
-    addJobWorker();
-    addWebWorker();
-  }
-
-  cluster.on('exit', (worker, code, signal) => {
-    if (jobWorkers.indexOf(worker.id) !== -1) {
-      console.log(`job worker ${worker.process.pid} exited (signal: ${signal}). Trying to respawn...`);
-      removeJobWorker(worker.id);
-      addJobWorker();
-    }
-
-    if (webWorkers.indexOf(worker.id) !== -1) {
-      console.log(`http worker ${worker.process.pid} exited (signal: ${signal}). Trying to respawn...`);
-      removeWebWorker(worker.id);
-      addWebWorker();
-    }
-  });
-} else {
-  if (process.env.web) {
-    console.log(`start http server: ${cluster.worker.id}`);
-    // Initialize the http server here
-    httpServer.start();
-  }
-
-  if (process.env.job) {
-    console.log(`start job server: ${cluster.worker.id}`);
-    // Initialize the Agenda here
-    jobWorker.start();
-  }
-}
-
-function addWebWorker() {
-  webWorkers.push(cluster.fork({web: 1}).id);
-}
-
-function addJobWorker() {
-  jobWorkers.push(cluster.fork({job: 1}).id);
-}
-
-function removeWebWorker(id) {
-  webWorkers.splice(webWorkers.indexOf(id), 1);
-}
-
-function removeJobWorker(id) {
-  jobWorkers.splice(jobWorkers.indexOf(id), 1);
-}

Recovering lost Mongo connections ("auto_reconnect")

Agenda is configured by default to automatically reconnect indefinitely, emitting an error event -when no connection is available on each process tick, allowing you to restore the Mongo -instance without having to restart the application.

-

However, if you are using an existing Mongo client -you'll need to configure the reconnectTries and reconnectInterval connection settings -manually, otherwise you'll find that Agenda will throw an error with the message "MongoDB connection is not recoverable, -application restart required" if the connection cannot be recovered within 30 seconds.

-

Example Project Structure

Agenda will only process jobs that it has definitions for. This allows you to -selectively choose which jobs a given agenda will process.

-

Consider the following project structure, which allows us to share models with -the rest of our code base, and specify which jobs a worker processes, if any at -all.

-
- server.js
-- worker.js
-lib/
-  - agenda.js
-  controllers/
-    - user-controller.js
-  jobs/
-    - email.js
-    - video-processing.js
-    - image-processing.js
-   models/
-     - user-model.js
-     - blog-post.model.js

Sample job processor (eg. jobs/email.js)

-
let email = require('some-email-lib'),
-  User = require('../models/user-model.js');
-
-module.exports = function(agenda) {
-  agenda.define('registration email', (job, done) => {
-    User.get(job.attrs.data.userId, (err, user) => {
-      if (err) {
-        return done(err);
-      }
-      email(user.email(), 'Thanks for registering', 'Thanks for registering ' + user.name(), done);
-    });
-  });
-
-  agenda.define('reset password', (job, done) => {
-    // Etc
-  });
-
-  // More email related jobs
-};

lib/agenda.js

-
const Agenda = require('agenda');
-
-const connectionOpts = {db: {address: 'localhost:27017/agenda-test', collection: 'agendaJobs'}};
-
-const agenda = new Agenda(connectionOpts);
-
-const jobTypes = process.env.JOB_TYPES ? process.env.JOB_TYPES.split(',') : [];
-
-jobTypes.forEach(type => {
-  require('./lib/jobs/' + type)(agenda);
-});
-
-if (jobTypes.length) {
-  agenda.start(); // Returns a promise, which should be handled appropriately
-}
-
-module.exports = agenda;

lib/controllers/user-controller.js

-
let app = express(),
-  User = require('../models/user-model'),
-  agenda = require('../worker.js');
-
-app.post('/users', (req, res, next) => {
-  const user = new User(req.body);
-  user.save(err => {
-    if (err) {
-      return next(err);
-    }
-    agenda.now('registration email', {userId: user.primary()});
-    res.send(201, user.toJson());
-  });
-});

worker.js

-
require('./lib/agenda.js');

Now you can do the following in your project:

-
node server.js

Fire up an instance with no JOB_TYPES, giving you the ability to process jobs, -but not wasting resources processing jobs.

-
JOB_TYPES=email node server.js

Allow your http server to process email jobs.

-
JOB_TYPES=email node worker.js

Fire up an instance that processes email jobs.

-
JOB_TYPES=video-processing,image-processing node worker.js

Fire up an instance that processes video-processing/image-processing jobs. Good for a heavy hitting server.

-

Known Issues

"Multiple order-by items are not supported. Please specify a single order-by item."

When running Agenda on Azure cosmosDB, you might run into this issue caused by Agenda's sort query used for finding and locking the next job. To fix this, you can pass custom sort option: sort: { nextRunAt: 1 }

-

Versions <= 0.9.1

Cron string parsing (PR)

The current versions of Agenda parse cron dates as follows using this library: -node-cron

-

This library treats months as 0-11 where as normally, cron months are parsed as 1-12.

-
* * * * * *
-| | | | | |
-| | | | | +-- Year              (range: 1900-3000)
-| | | | +---- Day of the Week   (range: 1-7, 1 standing for Monday)
-| | | +------ Month of the Year (range: 0-11) NOTE: Difference here
-| | +-------- Day of the Month  (range: 1-31)
-| +---------- Hour              (range: 0-23)
-+------------ Minute            (range: 0-59)

Starting in version 1.0.0, cron will be parsed in the standard UNIX style:

-
* * * * * *
-| | | | | |
-| | | | | +-- Year              (range: 1900-3000)
-| | | | +---- Day of the Week   (range: 1-7, 1 standing for Monday)
-| | | +------ Month of the Year (range: 1-12) NOTE: Difference here
-| | +-------- Day of the Month  (range: 1-31)
-| +---------- Hour              (range: 0-23)
-+------------ Minute            (range: 0-59)

Debugging Issues

If you think you have encountered a bug, please feel free to report it here:

-

Submit Issue

-

Please provide us with as much details as possible such as:

-
    -
  • Agenda version
  • -
  • Environment (OSX, Linux, Windows, etc)
  • -
  • Small description of what happened
  • -
  • Any relevant stack track
  • -
  • Agenda logs (see below)
  • -
-

To turn on logging, please set your DEBUG env variable like so:

    -
  • OSX: DEBUG="agenda:*" node index.js
  • -
  • Linux: DEBUG="agenda:*" node index.js
  • -
  • Windows CMD: set DEBUG=agenda:*
  • -
  • Windows PowerShell: $env:DEBUG = "agenda:*"
  • -
-

While not necessary, attaching a text file with this debug information would -be extremely useful in debugging certain issues and is encouraged.

-

Acknowledgements

-

License

The MIT License

-
-
- - - - - -
- -
- - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/2.0.0/job_compute-next-run-at.js.html b/docs/agenda/2.0.0/job_compute-next-run-at.js.html deleted file mode 100644 index 4b41bee..0000000 --- a/docs/agenda/2.0.0/job_compute-next-run-at.js.html +++ /dev/null @@ -1,205 +0,0 @@ - - - - - - - - - - - job/compute-next-run-at.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/compute-next-run-at.js -

- - - - - -
-
-
'use strict';
-const humanInterval = require('human-interval');
-const CronTime = require('cron').CronTime;
-const moment = require('moment-timezone');
-const date = require('date.js');
-const debug = require('debug')('agenda:job');
-
-/**
- * Internal method used to compute next time a job should run and sets the proper values
- * @name Job#computeNextRunAt
- * @function
- * @returns {exports} instance of Job instance
- */
-module.exports = function() {
-  const interval = this.attrs.repeatInterval;
-  const timezone = this.attrs.repeatTimezone;
-  const repeatAt = this.attrs.repeatAt;
-  this.attrs.nextRunAt = undefined;
-
-  const dateForTimezone = date => {
-    date = moment(date);
-    if (timezone !== null) {
-      date.tz(timezone);
-    }
-    return date;
-  };
-
-  /**
-   * Internal method that computes the interval
-   * @returns {undefined}
-   */
-  const computeFromInterval = () => {
-    debug('[%s:%s] computing next run via interval [%s]', this.attrs.name, this.attrs._id, interval);
-    let lastRun = this.attrs.lastRunAt || new Date();
-    lastRun = dateForTimezone(lastRun);
-    try {
-      const cronTime = new CronTime(interval);
-      let nextDate = cronTime._getNextDateFrom(lastRun);
-      if (nextDate.valueOf() === lastRun.valueOf()) {
-        // Handle cronTime giving back the same date for the next run time
-        nextDate = cronTime._getNextDateFrom(dateForTimezone(new Date(lastRun.valueOf() + 1000)));
-      }
-      this.attrs.nextRunAt = nextDate;
-      debug('[%s:%s] nextRunAt set to [%s]', this.attrs.name, this.attrs._id, this.attrs.nextRunAt.toISOString());
-    } catch (e) {
-      // Nope, humanInterval then!
-      try {
-        if (!this.attrs.lastRunAt && humanInterval(interval)) {
-          this.attrs.nextRunAt = lastRun.valueOf();
-          debug('[%s:%s] nextRunAt set to [%s]', this.attrs.name, this.attrs._id, this.attrs.nextRunAt.toISOString());
-        } else {
-          this.attrs.nextRunAt = lastRun.valueOf() + humanInterval(interval);
-          debug('[%s:%s] nextRunAt set to [%s]', this.attrs.name, this.attrs._id, this.attrs.nextRunAt.toISOString());
-        }
-      } catch (e) {}
-    } finally {
-      if (isNaN(this.attrs.nextRunAt)) {
-        this.attrs.nextRunAt = undefined;
-        debug('[%s:%s] failed to calculate nextRunAt due to invalid repeat interval', this.attrs.name, this.attrs._id);
-        this.fail('failed to calculate nextRunAt due to invalid repeat interval');
-      }
-    }
-  };
-
-  /**
-   * Internal method to compute next run time from the repeat string
-   * @returns {undefined}
-   */
-  function computeFromRepeatAt() {
-    const lastRun = this.attrs.lastRunAt || new Date();
-    const nextDate = date(repeatAt).valueOf();
-
-    // If you do not specify offset date for below test it will fail for ms
-    const offset = Date.now();
-    if (offset === date(repeatAt, offset).valueOf()) {
-      this.attrs.nextRunAt = undefined;
-      debug('[%s:%s] failed to calculate repeatAt due to invalid format', this.attrs.name, this.attrs._id);
-      this.fail('failed to calculate repeatAt time due to invalid format');
-    } else if (nextDate.valueOf() === lastRun.valueOf()) {
-      this.attrs.nextRunAt = date('tomorrow at ', repeatAt);
-      debug('[%s:%s] nextRunAt set to [%s]', this.attrs.name, this.attrs._id, this.attrs.nextRunAt.toISOString());
-    } else {
-      this.attrs.nextRunAt = date(repeatAt);
-      debug('[%s:%s] nextRunAt set to [%s]', this.attrs.name, this.attrs._id, this.attrs.nextRunAt.toISOString());
-    }
-  }
-
-  if (interval) {
-    computeFromInterval.call(this);
-  } else if (repeatAt) {
-    computeFromRepeatAt.call(this);
-  }
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/job_disable.js.html b/docs/agenda/2.0.0/job_disable.js.html deleted file mode 100644 index 4dbe2df..0000000 --- a/docs/agenda/2.0.0/job_disable.js.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - job/disable.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/disable.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Prevents the job type from running
- * @name Job#disable
- * @function
- * @returns {exports} instance of Job
- */
-module.exports = function() {
-  this.attrs.disabled = true;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/job_enable.js.html b/docs/agenda/2.0.0/job_enable.js.html deleted file mode 100644 index 48c705b..0000000 --- a/docs/agenda/2.0.0/job_enable.js.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - job/enable.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/enable.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Allows job type to run
- * @name Job#enable
- * @function
- * @returns {Job} instance of Job
- */
-module.exports = function() {
-  this.attrs.disabled = false;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/job_fail.js.html b/docs/agenda/2.0.0/job_fail.js.html deleted file mode 100644 index 3efe1c2..0000000 --- a/docs/agenda/2.0.0/job_fail.js.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - - - - - job/fail.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/fail.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:job');
-
-/**
- * Fails the job with a reason (error) specified
- * @name Job#fail
- * @function
- * @param {Error|String} reason reason job failed
- * @returns {exports} instance of Job
- */
-module.exports = function(reason) {
-  if (reason instanceof Error) {
-    reason = reason.message;
-  }
-  this.attrs.failReason = reason;
-  this.attrs.failCount = (this.attrs.failCount || 0) + 1;
-  const now = new Date();
-  this.attrs.failedAt = now;
-  this.attrs.lastFinishedAt = now;
-  debug('[%s:%s] fail() called [%d] times so far', this.attrs.name, this.attrs._id, this.attrs.failCount);
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/job_index.js.html b/docs/agenda/2.0.0/job_index.js.html deleted file mode 100644 index 954cce2..0000000 --- a/docs/agenda/2.0.0/job_index.js.html +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - - - - - job/index.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/index.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Internal method to turn priority into a number
- * @param {String|Number} priority string to parse into number
- * @returns {Number} priority that was parsed
- */
-const parsePriority = priority => {
-  const priorityMap = {
-    lowest: -20,
-    low: -10,
-    normal: 0,
-    high: 10,
-    highest: 20
-  };
-  if (typeof priority === 'number' || priority instanceof Number) {
-    return priority;
-  }
-  return priorityMap[priority];
-};
-
-/**
- * @class
- * @param {Object} args
- * @property {Object} agenda - The Agenda instance
- * @property {Object} attrs
- */
-class Job {
-  constructor(args) {
-    args = args || {};
-
-    // Remove special args
-    this.agenda = args.agenda;
-    delete args.agenda;
-
-    // Process args
-    args.priority = parsePriority(args.priority) || 0;
-
-    // Set attrs to args
-    const attrs = {};
-    for (const key in args) {
-      if ({}.hasOwnProperty.call(args, key)) {
-        attrs[key] = args[key];
-      }
-    }
-
-    // Set defaults if undefined
-    // NOTE: What is the difference between 'once' here and 'single' in agenda/index.js?
-    attrs.nextRunAt = attrs.nextRunAt || new Date();
-    attrs.type = attrs.type || 'once';
-    this.attrs = attrs;
-  }
-}
-
-Job.prototype.toJSON = require('./to-json');
-Job.prototype.computeNextRunAt = require('./compute-next-run-at');
-Job.prototype.repeatEvery = require('./repeat-every');
-Job.prototype.repeatAt = require('./repeat-at');
-Job.prototype.disable = require('./disable');
-Job.prototype.enable = require('./enable');
-Job.prototype.unique = require('./unique');
-Job.prototype.schedule = require('./schedule');
-Job.prototype.priority = require('./priority');
-Job.prototype.fail = require('./fail');
-Job.prototype.run = require('./run');
-Job.prototype.isRunning = require('./is-running');
-Job.prototype.save = require('./save');
-Job.prototype.remove = require('./remove');
-Job.prototype.touch = require('./touch');
-
-module.exports = Job;
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/job_is-running.js.html b/docs/agenda/2.0.0/job_is-running.js.html deleted file mode 100644 index 8518f81..0000000 --- a/docs/agenda/2.0.0/job_is-running.js.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - job/is-running.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/is-running.js -

- - - - - -
-
-
'use strict';
-
-/**
- * A job is running if:
- * (lastRunAt exists AND lastFinishedAt does not exist)
- * OR
- * (lastRunAt exists AND lastFinishedAt exists but the lastRunAt is newer [in time] than lastFinishedAt)
- * @name Job#isRunning
- * @function
- * @returns {Boolean} Whether or not job is running at the moment (true for running)
- */
-module.exports = function() {
-  if (!this.attrs.lastRunAt) {
-    return false;
-  }
-  if (!this.attrs.lastFinishedAt) {
-    return true;
-  }
-  if (this.attrs.lockedAt && this.attrs.lastRunAt.getTime() > this.attrs.lastFinishedAt.getTime()) {
-    return true;
-  }
-  return false;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/job_priority.js.html b/docs/agenda/2.0.0/job_priority.js.html deleted file mode 100644 index 82309df..0000000 --- a/docs/agenda/2.0.0/job_priority.js.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - - - - - - job/priority.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/priority.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Internal method to turn priority into a number
- * @name Job#priority
- * @function
- * @param {String|Number} priority string to parse into number
- * @returns {Number} priority that was parsed
- */
-const parsePriority = priority => {
-  const priorityMap = {
-    lowest: -20,
-    low: -10,
-    normal: 0,
-    high: 10,
-    highest: 20
-  };
-  if (typeof priority === 'number' || priority instanceof Number) {
-    return priority;
-  }
-  return priorityMap[priority];
-};
-
-/**
- * Sets priority of the job
- * @param {String} priority priority of when job should be queued
- * @returns {exports} instance of Job
- */
-module.exports = function(priority) {
-  this.attrs.priority = parsePriority(priority);
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/job_remove.js.html b/docs/agenda/2.0.0/job_remove.js.html deleted file mode 100644 index cd9e8aa..0000000 --- a/docs/agenda/2.0.0/job_remove.js.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - - - - job/remove.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/remove.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Remove the job from MongoDB
- * @name Job#remove
- * @function
- * @returns {Promise} resolves when job removal fails or passes
- */
-module.exports = function() {
-  return this.agenda.cancel({_id: this.attrs._id});
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/job_repeat-at.js.html b/docs/agenda/2.0.0/job_repeat-at.js.html deleted file mode 100644 index 783ff5e..0000000 --- a/docs/agenda/2.0.0/job_repeat-at.js.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - job/repeat-at.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/repeat-at.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Sets a job to repeat at a specific time
- * @name Job#repeatAt
- * @function
- * @param {String} time time to repeat job at (human readable or number)
- * @returns {exports} instance of Job
- */
-module.exports = function(time) {
-  this.attrs.repeatAt = time;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/job_repeat-every.js.html b/docs/agenda/2.0.0/job_repeat-every.js.html deleted file mode 100644 index 9cc9cfd..0000000 --- a/docs/agenda/2.0.0/job_repeat-every.js.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - job/repeat-every.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/repeat-every.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Sets a job to repeat every X amount of time
- * @name Job#repeatEvery
- * @function
- * @param {String} interval repeat every X
- * @param {Object} options options to use for job
- * @returns {Job} instance of Job
- */
-module.exports = function(interval, options) {
-  options = options || {};
-  this.attrs.repeatInterval = interval;
-  this.attrs.repeatTimezone = options.timezone ? options.timezone : null;
-  if (options.skipImmediate) {
-    this.attrs.lastRunAt = new Date();
-    this.computeNextRunAt();
-    this.attrs.lastRunAt = undefined;
-  }
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/job_run.js.html b/docs/agenda/2.0.0/job_run.js.html deleted file mode 100644 index 953a3f9..0000000 --- a/docs/agenda/2.0.0/job_run.js.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - - - - - job/run.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/run.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:job');
-
-/**
- * Internal method (RUN)
- * @name Job#run
- * @function
- * @returns {Promise} Resolves when job persistence in MongoDB fails or passes
- */
-module.exports = function() {
-  const self = this;
-  const agenda = self.agenda;
-  const definition = agenda._definitions[self.attrs.name];
-
-  return new Promise(async (resolve, reject) => {
-    self.attrs.lastRunAt = new Date();
-    debug('[%s:%s] setting lastRunAt to: %s', self.attrs.name, self.attrs._id, self.attrs.lastRunAt.toISOString());
-    self.computeNextRunAt();
-    await self.save();
-
-    const jobCallback = async err => {
-      if (err) {
-        self.fail(err);
-      } else {
-        self.attrs.lastFinishedAt = new Date();
-      }
-
-      self.attrs.lockedAt = null;
-
-      await self.save().catch(err => {
-        debug('[%s:%s] failed to be saved to MongoDB', self.attrs.name, self.attrs._id);
-        reject(err);
-      });
-      debug('[%s:%s] was saved successfully to MongoDB', self.attrs.name, self.attrs._id);
-
-      if (err) {
-        agenda.emit('fail', err, self);
-        agenda.emit('fail:' + self.attrs.name, err, self);
-        debug('[%s:%s] has failed [%s]', self.attrs.name, self.attrs._id, err.message);
-      } else {
-        agenda.emit('success', self);
-        agenda.emit('success:' + self.attrs.name, self);
-        debug('[%s:%s] has succeeded', self.attrs.name, self.attrs._id);
-      }
-      agenda.emit('complete', self);
-      agenda.emit('complete:' + self.attrs.name, self);
-      debug('[%s:%s] job finished at [%s] and was unlocked', self.attrs.name, self.attrs._id, self.attrs.lastFinishedAt);
-      // Curiously, we still resolve successfully if the job processor failed.
-      // Agenda is not equipped to handle errors originating in user code, so, we leave them to inspect the side-effects of job.fail()
-      resolve(self);
-    };
-
-    try {
-      agenda.emit('start', self);
-      agenda.emit('start:' + self.attrs.name, self);
-      debug('[%s:%s] starting job', self.attrs.name, self.attrs._id);
-      if (!definition) {
-        debug('[%s:%s] has no definition, can not run', self.attrs.name, self.attrs._id);
-        throw new Error('Undefined job');
-      }
-      if (definition.fn.length === 2) {
-        debug('[%s:%s] process function being called', self.attrs.name, self.attrs._id);
-        definition.fn(self, jobCallback);
-      } else {
-        debug('[%s:%s] process function being called', self.attrs.name, self.attrs._id);
-        definition.fn(self);
-        await jobCallback();
-      }
-    } catch (err) {
-      debug('[%s:%s] unknown error occurred', self.attrs.name, self.attrs._id);
-      await jobCallback(err);
-    }
-  });
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/job_schedule.js.html b/docs/agenda/2.0.0/job_schedule.js.html deleted file mode 100644 index 59282a6..0000000 --- a/docs/agenda/2.0.0/job_schedule.js.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - job/schedule.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/schedule.js -

- - - - - -
-
-
'use strict';
-const date = require('date.js');
-
-/**
- * Schedules a job to run at specified time
- * @name Job#schedule
- * @function
- * @param {String} time schedule a job to run "then"
- * @returns {exports} instance of Job
- */
-module.exports = function(time) {
-  this.attrs.nextRunAt = (time instanceof Date) ? time : date(time);
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/job_to-json.js.html b/docs/agenda/2.0.0/job_to-json.js.html deleted file mode 100644 index 38f0924..0000000 --- a/docs/agenda/2.0.0/job_to-json.js.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - - - - - job/to-json.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/to-json.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Given a job, turn it into an object we can store in Mongo
- * @name Job#toJSON
- * @function
- * @returns {Object} json object from Job
- */
-module.exports = function() {
-  const self = this;
-  const attrs = self.attrs || {};
-  const result = {};
-
-  for (const prop in attrs) {
-    if ({}.hasOwnProperty.call(attrs, prop)) {
-      result[prop] = attrs[prop];
-    }
-  }
-
-  const dates = ['lastRunAt', 'lastFinishedAt', 'nextRunAt', 'failedAt', 'lockedAt'];
-  dates.forEach(d => {
-    if (result[d]) {
-      result[d] = new Date(result[d]);
-    }
-  });
-
-  return result;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/job_touch.js.html b/docs/agenda/2.0.0/job_touch.js.html deleted file mode 100644 index 8080ed4..0000000 --- a/docs/agenda/2.0.0/job_touch.js.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - job/touch.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/touch.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Updates "lockedAt" time so the job does not get picked up again
- * @name Job#touch
- * @function
- * @param {Function} cb called when job "touch" fails or passes
- * @returns {undefined}
- */
-module.exports = function(cb) {
-  this.attrs.lockedAt = new Date();
-  this.save(cb);
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/job_unique.js.html b/docs/agenda/2.0.0/job_unique.js.html deleted file mode 100644 index c944c4b..0000000 --- a/docs/agenda/2.0.0/job_unique.js.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - job/unique.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/unique.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Data to ensure is unique for job to be created
- * @name Job#unique
- * @function
- * @param {Object} unique mongo data query for unique
- * @param {Object} opts unique options
- * @returns {exports} instance of Job
- */
-module.exports = function(unique, opts) {
-  this.attrs.unique = unique;
-  this.attrs.uniqueOpts = opts;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/scripts/linenumber.js b/docs/agenda/2.0.0/scripts/linenumber.js deleted file mode 100644 index ff6c069..0000000 --- a/docs/agenda/2.0.0/scripts/linenumber.js +++ /dev/null @@ -1,24 +0,0 @@ -'use strict'; - -/* global document */ -(function () { - var lineId, lines, totalLines, anchorHash; - var source = document.getElementsByClassName('prettyprint source linenums'); - var i = 0; - var lineNumber = 0; - - if (source && source[0]) { - anchorHash = document.location.hash.substring(1); - lines = source[0].getElementsByTagName('li'); - totalLines = lines.length; - - for (; i < totalLines; i++) { - lineNumber++; - lineId = 'line' + lineNumber; - lines[i].id = lineId; - if (lineId === anchorHash) { - lines[i].className += ' selected'; - } - } - } -})(); diff --git a/docs/agenda/2.0.0/scripts/pagelocation.js b/docs/agenda/2.0.0/scripts/pagelocation.js deleted file mode 100644 index e138368..0000000 --- a/docs/agenda/2.0.0/scripts/pagelocation.js +++ /dev/null @@ -1,89 +0,0 @@ -'use strict'; - -$(document).ready(function () { - var currentSectionNav, target; - - // If an anchor hash is in the URL highlight the menu item - highlightActiveHash(); - // If a specific page section is in the URL highlight the menu item - highlightActiveSection(); - - // If a specific page section is in the URL scroll that section up to the top - currentSectionNav = $('#' + getCurrentSectionName() + '-nav'); - - if (currentSectionNav.position()) { - $('nav').scrollTop(currentSectionNav.position().top); - } - - // function to scroll to anchor when clicking an anchor linl - $('a[href*="#"]:not([href="#"])').click(function () { - /* eslint-disable no-invalid-this */ - if (location.pathname.replace(/^\//, '') === this.pathname.replace(/^\//, '') && location.hostname === this.hostname) { - target = $(this.hash); - target = target.length ? target : $('[name=' + this.hash.slice(1) + ']'); - if (target.length) { - $('html, body').animate({ - scrollTop: target.offset().top - }, 1000); - } - } - /* eslint-enable no-invalid-this */ - }); -}); - -// If a new anchor section is selected, change the hightlighted menu item -$(window).bind('hashchange', function (event) { - highlightActiveHash(event); -}); - -function highlightActiveHash(event) { - var oldUrl, oldSubSectionElement; - - // check for and remove old hash active state - if (event && event.originalEvent.oldURL) { - oldUrl = event.originalEvent.oldURL; - - if (oldUrl.indexOf('#') > -1) { - oldSubSectionElement = $('#' + getCurrentSectionName() + '-' + oldUrl.substring(oldUrl.indexOf('#') + 1) + '-nav'); - - if (oldSubSectionElement) { - oldSubSectionElement.removeClass('active'); - } - } - } - - if (getCurrentHashName()) { - $('#' + getCurrentSectionName() + '-' + getCurrentHashName() + '-nav').addClass('active'); - } -} - -function highlightActiveSection() { - var pageId = getCurrentSectionName(); - - $('#' + pageId + '-nav').addClass('active'); -} - -function getCurrentSectionName() { - var path = window.location.pathname; - var pageUrl = path.split('/').pop(); - - var sectionName = pageUrl.substring(0, pageUrl.indexOf('.')); - - // remove the wodr module- if its in the url - sectionName = sectionName.replace('module-', ''); - - return sectionName; -} - -function getCurrentHashName() { - var pageSubSectionId; - var pageSubSectionHash = window.location.hash; - - if (pageSubSectionHash) { - pageSubSectionId = pageSubSectionHash.substring(1).replace('.', ''); - - return pageSubSectionId; - } - - return false; -} diff --git a/docs/agenda/2.0.0/styles/jsdoc-default.css b/docs/agenda/2.0.0/styles/jsdoc-default.css deleted file mode 100644 index f2bc6a9..0000000 --- a/docs/agenda/2.0.0/styles/jsdoc-default.css +++ /dev/null @@ -1,957 +0,0 @@ -@font-face { - font-family: "Avenir Next W01"; - font-style: normal; - font-weight: 600; - src: url("https://fast.fonts.net/dv2/14/14c73713-e4df-4dba-933b-057feeac8dd1.woff2?d44f19a684109620e484167ba790e8180fd9e29df91d80ce3d096f014db863074e1ea706cf5ed4e1c042492e76df291ce1d24ec684d3d9da9684f55406b9f22bce02f0f30f556681593dafea074d7bd44e28a680d083ccfd44ed4f8a3087a20c56147c11f917ed1dbd85c4a18cf38da25e6ac78f008f472262304d50e7e0cb7541ef1642c676db6e4bde4924846f5daf486fbde9335e98f6a20f6664bc4525253d1d4fca42cf1c490483c8daf0237f6a0fd292563417ad80ca3e69321417747bdc6f0969f34b2a0401b5e2b9a4dfd5b06d9710850900c66b34870aef&projectId=f750d5c7-baa2-4767-afd7-45484f47fe17") format('woff2'); -} - -@font-face { - font-family: "Avenir Next W01"; - font-style: normal; - font-weight: 500; - src: url("https://fast.fonts.net/dv2/14/627fbb5a-3bae-4cd9-b617-2f923e29d55e.woff2?d44f19a684109620e484167ba790e8180fd9e29df91d80ce3d096f014db863074e1ea706cf5ed4e1c042492e76df291ce1d24ec684d3d9da9684f55406b9f22bce02f0f30f556681593dafea074d7bd44e28a680d083ccfd44ed4f8a3087a20c56147c11f917ed1dbd85c4a18cf38da25e6ac78f008f472262304d50e7e0cb7541ef1642c676db6e4bde4924846f5daf486fbde9335e98f6a20f6664bc4525253d1d4fca42cf1c490483c8daf0237f6a0fd292563417ad80ca3e69321417747bdc6f0969f34b2a0401b5e2b9a4dfd5b06d9710850900c66b34870aef&projectId=f750d5c7-baa2-4767-afd7-45484f47fe17") format('woff2'); -} - -@font-face { - font-family: "Avenir Next W01"; - font-style: normal; - font-weight: 400; - src: url("https://fast.fonts.net/dv2/14/2cd55546-ec00-4af9-aeca-4a3cd186da53.woff2?d44f19a684109620e484167ba790e8180fd9e29df91d80ce3d096f014db863074e1ea706cf5ed4e1c042492e76df291ce1d24ec684d3d9da9684f55406b9f22bce02f0f30f556681593dafea074d7bd44e28a680d083ccfd44ed4f8a3087a20c56147c11f917ed1dbd85c4a18cf38da25e6ac78f008f472262304d50e7e0cb7541ef1642c676db6e4bde4924846f5daf486fbde9335e98f6a20f6664bc4525253d1d4fca42cf1c490483c8daf0237f6a0fd292563417ad80ca3e69321417747bdc6f0969f34b2a0401b5e2b9a4dfd5b06d9710850900c66b34870aef&projectId=f750d5c7-baa2-4767-afd7-45484f47fe17") format('woff2'); -} - -@font-face { - font-family: 'bt_mono'; - font-style: normal; - font-weight: 400; - src: url('https://assets.braintreegateway.com/fonts/bt_mono_regular-webfont.eot'); - src: url('https://assets.braintreegateway.com/fonts/bt_mono_regular-webfont.woff2') format('woff2'), url('https://assets.braintreegateway.com/fonts/bt_mono_regular-webfont.woff') format('woff'), url('https://assets.braintreegateway.com/fonts/bt_mono_regular-webfont.ttf') format('truetype'), url('https://assets.braintreegateway.com/fonts/bt_mono_regular-webfont.svg#bt_mono_reqular-webfont') format('svg'); -} - -@font-face { - font-family: 'bt_mono'; - font-style: normal; - font-weight: 500; - src: url('https://assets.braintreegateway.com/fonts/bt_mono_medium-webfont.eot'); - src: url('https://assets.braintreegateway.com/fonts/bt_mono_medium-webfont.woff2') format('woff2'), url('https://assets.braintreegateway.com/fonts/bt_mono_medium-webfont.woff') format('woff'), url('https://assets.braintreegateway.com/fonts/bt_mono_medium-webfont.ttf') format('truetype'), url('https://assets.braintreegateway.com/fonts/bt_mono_medium-webfont.svg#bt_mono_medium-webfont') format('svg'); -} - -@font-face { - font-family: 'bt_mono'; - font-style: normal; - font-weight: 600; - src: url('https://assets.braintreegateway.com/fonts/bt_mono_bold-webfont.eot'); - src: url('https://assets.braintreegateway.com/fonts/bt_mono_bold-webfont.woff2') format('woff2'), url('https://assets.braintreegateway.com/fonts/bt_mono_bold-webfont.woff') format('woff'), url('https://assets.braintreegateway.com/fonts/bt_mono_bold-webfont.ttf') format('truetype'), url('https://assets.braintreegateway.com/fonts/bt_mono_bold-webfont.svg#bt_mono_bold-webfont') format('svg'); -} - -@font-face { - font-family: 'bt_mono'; - font-style: normal; - font-weight: 900; - src: url('https://assets.braintreegateway.com/fonts/bt_mono_heavy-webfont.eot'); - src: url('https://assets.braintreegateway.com/fonts/bt_mono_heavy-webfont.woff2') format('woff2'), url('https://assets.braintreegateway.com/fonts/bt_mono_heavy-webfont.woff') format('woff'), url('https://assets.braintreegateway.com/fonts/bt_mono_heavy-webfont.ttf') format('truetype'), url('https://assets.braintreegateway.com/fonts/bt_mono_heavy-webfont.svg#bt_mono_heavy-webfont') format('svg'); -} - -* { - box-sizing: border-box -} - -html, body { - height: 100%; - width: 100%; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - color: #3e3c42; - text-rendering: optimizeLegibility; - margin: 0; -} - -body { - color: #3e3c42; - background-color: #f3f3f3; - width: 100%; - font: 16px/1.875 "Avenir Next W01", "Avenir Next", "Helvetica Neue", Helvetica, sans-serif; - font-size: 16px; - line-height: 160%; -} - -a, a:active { - color: #0095dd; - text-decoration: none; -} - -a:hover { - text-decoration: underline -} - -p, ul, ol, blockquote { - margin-bottom: 1em; -} - -p { - max-width: 800px; -} - -h1, h2, h3, h4, h5, h6 { - color: #706d77; - font-weight: 500; - margin: 0; - line-height: 1; -} - -h1 { - color: #4b484f; - font-weight: 500; - font-size: 40px; - display: block; -} - -h1 span { - color: #999; - font-size: 32px; - display: block; - line-height: 1.5; -} - -h1.page-title { - border-bottom: 1px dashed #ccc; - margin-bottom: 20px; - padding-bottom: 30px; -} - -h2 { - font-size: 30px; - margin: 1.5em 0 0; -} - -h3 { - font-size: 20px; - margin: 1.5em 0 0; - text-transform: uppercase; -} - -h3.reference-title { - display: block; - font-weight: 400; - margin-top: 2em; - max-width: 200px; -} - -h3.reference-title small { - display: inline-block; - color: #0095dd; - margin-left: 5px; - font-weight: 500; -} - -h3.subsection-title { - border-bottom: 1px solid #ececec; - padding-bottom: 20px; - margin-top: 3em; - margin-bottom: 1em; -} - -h4 { - font-size: 16px; - margin: 1em 0 0; - font-weight: bold; -} - -h4.name { - font-size: 20px; - margin-top: 0; - font-weight: 500; -} - -h5 { - margin: 2em 0 0.5em 0; - font-size: 14px; - font-weight: 500; - text-transform: uppercase; -} - -.container-overview .subsection-title { - font-size: 14px; - text-transform: uppercase; - margin: 8px 0 15px 0; - font-weight: bold; - color: #4D4E53; - padding-top: 10px; -} - -h6 { - font-size: 100%; - letter-spacing: -0.01em; - margin: 6px 0 3px 0; - font-style: italic; - text-transform: uppercase; - font-weight: 500; -} - -tt, code, kbd, samp { - font-family: "Source Code Pro", monospace; - background: #f4f4f4; - padding: 1px 5px; - border-radius: 5px; -} - -.class-description { - margin-bottom: 1em; - margin-top: 1em; - padding: 10px 20px; - background-color: rgba(26, 159, 224, 0.1); -} - -.class-description:empty { - margin: 0 -} - -#main { - background-color: white; - float: right; - min-width: 360px; - width: calc(100% - 300px); - padding: 30px; - z-index: 100; -} - -header { - display: block; - max-width: 1400px; -} - -section { - display: block; - max-width: 1400px; - background-color: #fff; -} - -.variation { - display: none -} - -.signature-attributes { - font-size: 60%; - color: #aaa; - font-style: italic; - font-weight: lighter; -} - -.rule { - width: 100%; - margin-top: 20px; - display: block; - border-top: 1px solid #ccc; -} - -ul { - list-style-type: none; - padding-left: 0; -} - -ul li a { - font-weight: 500; -} - -ul ul { - padding-top: 5px; -} - -ul li ul { - padding-left: 20px; -} - -ul li ul li a { - font-weight: normal; -} - -nav { - float: left; - display: block; - width: 300px; - background: #f7f7f7; - overflow-x: visible; - overflow-y: auto; - height: 100%; - padding: 0px 30px 100px 30px; - height: 100%; - position: fixed; - transition: left 0.2s; - z-index: 998; - margin-top: 0px; - top: 43px; -} - -.navicon-button { - display: inline-block; - position: fixed; - bottom: 1.5em; - right: 1.5em; - z-index: 2; -} - -nav h3 { - font-size: 13px; - text-transform: uppercase; - letter-spacing: 1px; - font-weight: bold; - line-height: 24px; - margin: 40px 0 10px 0; - padding: 0; -} - -nav ul { - font-size: 100%; - line-height: 17px; - padding: 0; - margin: 0; - list-style-type: none; - border: none; - padding-left: 0; -} - -nav ul a { - font-size: 16px; -} - -nav ul a, nav ul a:active { - display: block; -} - -nav ul a:hover, nav ul a:active { - color: hsl(200, 100%, 43%); - text-decoration: none; -} - -nav>ul { - padding: 0 10px; -} - -nav>ul li:first-child { - padding-top: 0; -} - -nav ul li ul { - padding-left: 0; -} - -nav>ul>li { - border-bottom: 1px solid #e2e2e2; - padding: 10px 0 20px 0; -} - -nav>ul>li.active ul { - border-left: 3px solid #0095dd; - padding-left: 15px; -} - -nav>ul>li.active ul li.active a { - font-weight: bold; -} - -nav>ul>li.active a { - color: #0095dd; -} - -nav>ul>li>a { - color: #706d77; - padding: 20px 0; - font-size: 18px; -} - -nav ul ul { - margin-bottom: 10px padding-left: 0; -} - -nav ul ul a { - color: #5f5c63; -} - -nav ul ul a, nav ul ul a:active { - font-family: 'bt_mono', monospace; - font-size: 14px; - padding-left: 20px; - padding-top: 3px; - padding-bottom: 9px; -} - -nav h2 { - font-size: 12px; - margin: 0; - padding: 0; -} - -nav>h2>a { - color: hsl(202, 71%, 50%); - border-bottom: 1px solid hsl(202, 71%, 50%); - padding-bottom: 5px; -} - -nav>h2>a:hover { - font-weight: 500; - text-decoration: none; -} - -footer { - background-color: #fff; - color: hsl(0, 0%, 28%); - margin-left: 300px; - display: block; - font-style: italic; - font-size: 12px; - padding: 30px; - text-align: center; -} - -.ancestors { - color: #999; -} - -.ancestors a { - color: #999 !important; - text-decoration: none; -} - -.clear { - clear: both; -} - -.important { - font-weight: bold; - color: #950B02; -} - -.yes-def { - text-indent: -1000px; -} - -.type-signature { - color: #aaa; -} - -.name, .signature { - font-family: 'bt_mono', monospace; - word-wrap: break-word; -} - -.details { - margin-top: 14px; - font-size: 13px; - text-align: right; - background: #ffffff; - /* Old browsers */ - background: -moz-linear-gradient(left, #ffffff 0%, #fafafa 100%); - /* FF3.6-15 */ - background: -webkit-linear-gradient(left, #ffffff 0%, #fafafa 100%); - /* Chrome10-25,Safari5.1-6 */ - background: linear-gradient(to right, #ffffff 0%, #fafafa 100%); - /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ - filter: progid: DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#fafafa', GradientType=1); - padding-right: 5px; -} - -.details dt { - display: inline-block; -} - -.details dd { - display: inline-block; - margin: 0; -} - -.details dd a { - font-style: italic; - font-weight: normal; - line-height: 1; -} - -.details ul { - margin: 0 -} - -.details ul { - list-style-type: none -} - -.details li {} - -.details pre.prettyprint { - margin: 0 -} - -.details .object-value { - padding-top: 0 -} - -.description { - margin-bottom: 1em; - margin-top: 1em; -} - -.code-caption { - font-style: italic; - margin: 0; - font-size: 16px; - color: #545454; -} - -.prettyprint { - font-size: 13px; - border: 1px solid #ddd; - border-radius: 3px; - overflow: auto; - background-color: #fbfbfb; -} - -.prettyprint.source { - width: inherit; -} - -.prettyprint code { - font-size: 100%; - line-height: 18px; - display: block; - margin: 0 30px; - background-color: #fbfbfb; - color: #4D4E53; -} - -.prettyprint>code { - padding: 30px 15px; -} - -.prettyprint .linenums code { - padding: 0 15px; -} - -.prettyprint .linenums li:first-of-type code { - padding-top: 15px; -} - -.prettyprint code span.line { - display: inline-block; -} - -.prettyprint.linenums { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.prettyprint.linenums ol { - padding-left: 0 -} - -.prettyprint.linenums li { - border-left: 3px #ddd solid -} - -.prettyprint.linenums li.selected, .prettyprint.linenums li.selected * { - background-color: lightyellow -} - -.prettyprint.linenums li * { - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; -} - -.readme .prettyprint { - max-width: 800px; -} - -.params, .props { - border-spacing: 0; - border: 1px solid #ddd; - border-radius: 3px; - width: 100%; - font-size: 14px; -} - -.params .name, .props .name, .name code { - color: #4D4E53; - font-family: 'bt_mono', monospace; - font-size: 100%; -} - -.params td, .params th, .props td, .props th { - margin: 0px; - text-align: left; - vertical-align: top; - padding: 10px; - display: table-cell; -} - -.params td { - border-top: 1px solid #eee; -} - -.params thead tr, .props thead tr { - background-color: #fff; - font-weight: bold; -} - -.params .params thead tr, .props .props thead tr { - background-color: #fff; - font-weight: bold; -} - -.params td.description>p:first-child, .props td.description>p:first-child { - margin-top: 0; - padding-top: 0; -} - -.params td.description>p:last-child, .props td.description>p:last-child { - margin-bottom: 0; - padding-bottom: 0; -} - -dl.param-type { - margin-top: 5px; -} - -.param-type dt, .param-type dd { - display: inline-block -} - -.param-type dd { - font-family: Consolas, Monaco, 'Andale Mono', monospace -} - -.disabled { - color: #454545 -} - - -/* tag source style */ - -.tag-deprecated { - padding-right: 5px; -} - -.tag-source { - border-bottom: 1px solid rgba(28, 160, 224, 0.35); -} - -.tag-source:first-child { - border-bottom: 1px solid rgba(28, 160, 224, 1); -} - - -/* navicon button */ - -.navicon-button { - position: relative; - transition: 0.25s; - cursor: pointer; - user-select: none; - opacity: .8; - background-color: white; - border-radius: 100%; - width: 50px; - height: 50px; - -webkit-box-shadow: 0px 2px 9px 0px rgba(0, 0, 0, 0.31); - -moz-box-shadow: 0px 2px 9px 0px rgba(0, 0, 0, 0.31); - box-shadow: 0px 2px 9px 0px rgba(0, 0, 0, 0.31); -} - -.navicon-button .navicon:before, .navicon-button .navicon:after { - transition: 0.25s; -} - -.navicon-button:hover { - transition: 0.5s; - opacity: 1; -} - -.navicon-button:hover .navicon:before, .navicon-button:hover .navicon:after { - transition: 0.25s; -} - -.navicon-button:hover .navicon:before { - top: .425rem; -} - -.navicon-button:hover .navicon:after { - top: -.425rem; -} - - -/* navicon */ - -.navicon { - position: relative; - width: 1.5em; - height: .195rem; - background: #000; - top: calc(50% - .09rem); - left: calc(50% - .75rem); - transition: 0.3s; - border-radius: 5px; -} - -.navicon:before, .navicon:after { - display: block; - content: ""; - height: .195rem; - width: 1.5rem; - background: #000; - position: absolute; - z-index: -1; - transition: 0.3s 0.25s; -} - -.navicon:before { - top: 0.425rem; - height: .195rem; - border-radius: 5px; -} - -.navicon:after { - top: -0.425rem; - border-radius: 5px; -} - - -/* open */ - -.nav-trigger:checked+label:not(.steps) .navicon:before, .nav-trigger:checked+label:not(.steps) .navicon:after { - top: 0 !important; -} - -.nav-trigger:checked+label .navicon:before, .nav-trigger:checked+label .navicon:after { - transition: 0.5s; -} - - -/* Minus */ - -.nav-trigger:checked+label { - transform: scale(0.75); -} - - -/* Γ— and + */ - -.nav-trigger:checked+label.plus .navicon, .nav-trigger:checked+label.x .navicon { - background: transparent; -} - -.nav-trigger:checked+label.plus .navicon:before, .nav-trigger:checked+label.x .navicon:before { - transform: rotate(-45deg); - background: #000; -} - -.nav-trigger:checked+label.plus .navicon:after, .nav-trigger:checked+label.x .navicon:after { - transform: rotate(45deg); - background: #000; -} - -.nav-trigger:checked+label.plus { - transform: scale(0.75) rotate(45deg); -} - -.nav-trigger:checked~nav { - left: 0 !important; -} - -.nav-trigger:checked~.overlay { - display: block; -} - -.nav-trigger { - position: fixed; - top: 0; - clip: rect(0, 0, 0, 0); -} - -.overlay { - display: none; - position: fixed; - top: 0; - bottom: 0; - left: 0; - right: 0; - width: 100%; - height: 100%; - background: hsla(0, 0%, 0%, 0.5); - z-index: 1; -} - -table { - border-collapse: separate; - ; - display: block; - overflow-x: auto; - /*table-layout:fixed;*/ -} - -table tbody td { - border-top: 1px solid hsl(207, 10%, 86%); - border-right: 1px solid #eee; - padding: 5px; - /*word-wrap: break-word;*/ -} - -td table.params, td table.props { - border: 0; -} - -@media only screen and (min-width: 320px) and (max-width: 680px) { - body { - overflow-x: hidden; - } - #main { - padding: 30px 30px; - width: 100%; - min-width: 360px; - } - nav { - background: #FFF; - width: 300px; - height: 100%; - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: -300px; - z-index: 3; - padding: 0 10px; - transition: left 0.2s; - margin-top: 0; - } - .navicon-button { - display: inline-block; - position: fixed; - bottom: 1.5em; - right: 20px; - z-index: 1000; - } - .top-nav-wrapper { - display: none; - } - #main h1.page-title { - margin: 0.5em 0; - } - footer { - margin-left: 0; - margin-bottom: 30px; - } -} - -.top-nav-wrapper { - background-color: #ececec; - position: fixed; - top: 0px; - left: 0px; - padding: 10px 10px 0 10px; - z-index: 999; - width: 300px; -} - -.top-nav-wrapper ul { - margin: 0; -} - -.top-nav-wrapper ul li { - display: inline-block; - padding: 0 10px; - vertical-align: top; -} - -.top-nav-wrapper ul li.active { - border-bottom: 2px solid rgba(28, 160, 224, 1); -} - -.search-wrapper { - display: inline-block; - position: relative; -} - -.search-wrapper svg { - position: absolute; - left: 0px; -} - -input.search-input { - background: transparent; - box-shadow: 0; - border: 0; - border-bottom: 1px solid #c7c7c7; - padding: 7px 15px 12px 35px; - margin: 0 auto; -} - - -/* Smooth outline with box-shadow: */ - -input.search-input:focus { - border-bottom: 2px solid rgba(28, 160, 224, 1); - outline: none; -} - - -/* Hightlight JS Paradiso Light Theme */ - -.hljs-comment, .hljs-quote { - color: #776e71 -} - -.hljs-variable, .hljs-template-variable, .hljs-tag, .hljs-name, .hljs-selector-id, .hljs-selector-class, .hljs-regexp, .hljs-link, .hljs-meta { - color: #ef6155 -} - -.hljs-number, .hljs-built_in, .hljs-builtin-name, .hljs-literal, .hljs-type, .hljs-params, .hljs-deletion { - color: #f99b15 -} - -.hljs-title, .hljs-section, .hljs-attribute { - color: #fec418 -} - -.hljs-string, .hljs-symbol, .hljs-bullet, .hljs-addition { - color: #48b685 -} - -.hljs-keyword, .hljs-selector-tag { - color: #815ba4 -} - -.hljs { - display: block; - overflow-x: auto; - background: #e7e9db; - color: #4f424c; - padding: 0.5em -} - -.hljs-emphasis { - font-style: italic -} - -.hljs-strong { - font-weight: bold -} - -.link-icon { - opacity: 0; - position: absolute; - margin-left: -25px; - padding-right: 5px; - padding-top: 2px; -} - -.example-container .link-icon { - margin-top: -6px; -} - -.example-container:hover .link-icon, -.name-container:hover .link-icon { - opacity: .5; -} - -.name-container { - display: flex; - padding-top: 1em; -} diff --git a/docs/agenda/2.0.0/styles/prettify-jsdoc.css b/docs/agenda/2.0.0/styles/prettify-jsdoc.css deleted file mode 100644 index 834a866..0000000 --- a/docs/agenda/2.0.0/styles/prettify-jsdoc.css +++ /dev/null @@ -1,111 +0,0 @@ -/* JSDoc prettify.js theme */ - -/* plain text */ -.pln { - color: #000000; - font-weight: normal; - font-style: normal; -} - -/* string content */ -.str { - color: hsl(104, 100%, 24%); - font-weight: normal; - font-style: normal; -} - -/* a keyword */ -.kwd { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* a comment */ -.com { - font-weight: normal; - font-style: italic; -} - -/* a type name */ -.typ { - color: #000000; - font-weight: normal; - font-style: normal; -} - -/* a literal value */ -.lit { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* punctuation */ -.pun { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* lisp open bracket */ -.opn { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* lisp close bracket */ -.clo { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* a markup tag name */ -.tag { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a markup attribute name */ -.atn { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a markup attribute value */ -.atv { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a declaration */ -.dec { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* a variable name */ -.var { - color: #000000; - font-weight: normal; - font-style: normal; -} - -/* a function name */ -.fun { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* Specify class=linenums on a pre to get line numbering */ -ol.linenums { - margin-top: 0; - margin-bottom: 0; -} diff --git a/docs/agenda/2.0.0/styles/prettify-tomorrow.css b/docs/agenda/2.0.0/styles/prettify-tomorrow.css deleted file mode 100644 index 81e74d1..0000000 --- a/docs/agenda/2.0.0/styles/prettify-tomorrow.css +++ /dev/null @@ -1,132 +0,0 @@ -/* Tomorrow Theme */ -/* Original theme - https://github.com/chriskempson/tomorrow-theme */ -/* Pretty printing styles. Used with prettify.js. */ -/* SPAN elements with the classes below are added by prettyprint. */ -/* plain text */ -.pln { - color: #4d4d4c; } - -@media screen { - /* string content */ - .str { - color: hsl(104, 100%, 24%); } - - /* a keyword */ - .kwd { - color: hsl(240, 100%, 50%); } - - /* a comment */ - .com { - color: hsl(0, 0%, 60%); } - - /* a type name */ - .typ { - color: hsl(240, 100%, 32%); } - - /* a literal value */ - .lit { - color: hsl(240, 100%, 40%); } - - /* punctuation */ - .pun { - color: #000000; } - - /* lisp open bracket */ - .opn { - color: #000000; } - - /* lisp close bracket */ - .clo { - color: #000000; } - - /* a markup tag name */ - .tag { - color: #c82829; } - - /* a markup attribute name */ - .atn { - color: #f5871f; } - - /* a markup attribute value */ - .atv { - color: #3e999f; } - - /* a declaration */ - .dec { - color: #f5871f; } - - /* a variable name */ - .var { - color: #c82829; } - - /* a function name */ - .fun { - color: #4271ae; } } -/* Use higher contrast and text-weight for printable form. */ -@media print, projection { - .str { - color: #060; } - - .kwd { - color: #006; - font-weight: bold; } - - .com { - color: #600; - font-style: italic; } - - .typ { - color: #404; - font-weight: bold; } - - .lit { - color: #044; } - - .pun, .opn, .clo { - color: #440; } - - .tag { - color: #006; - font-weight: bold; } - - .atn { - color: #404; } - - .atv { - color: #060; } } -/* Style */ -/* -pre.prettyprint { - background: white; - font-family: Consolas, Monaco, 'Andale Mono', monospace; - font-size: 12px; - line-height: 1.5; - border: 1px solid #ccc; - padding: 10px; } -*/ - -/* Specify class=linenums on a pre to get line numbering */ -ol.linenums { - margin-top: 0; - margin-bottom: 0; } - -/* IE indents via margin-left */ -li.L0, -li.L1, -li.L2, -li.L3, -li.L4, -li.L5, -li.L6, -li.L7, -li.L8, -li.L9 { - /* */ } - -/* Alternate shading for lines */ -li.L1, -li.L3, -li.L5, -li.L7, -li.L9 { - /* */ } diff --git a/docs/agenda/2.0.0/utils_create-job.js.html b/docs/agenda/2.0.0/utils_create-job.js.html deleted file mode 100644 index 14c94fd..0000000 --- a/docs/agenda/2.0.0/utils_create-job.js.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - utils/create-job.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- utils/create-job.js -

- - - - - -
-
-
'use strict';
-const Job = require('../job');
-
-/**
- * Create Job object from data
- * @param {Object} agenda instance of Agenda
- * @param {Object} jobData job data
- * @returns {Job} returns created job
- */
-module.exports = (agenda, jobData) => {
-  jobData.agenda = agenda;
-  return new Job(jobData);
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.0.0/utils_process-jobs.js.html b/docs/agenda/2.0.0/utils_process-jobs.js.html deleted file mode 100644 index 2d88b9b..0000000 --- a/docs/agenda/2.0.0/utils_process-jobs.js.html +++ /dev/null @@ -1,447 +0,0 @@ - - - - - - - - - - - utils/process-jobs.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- utils/process-jobs.js -

- - - - - -
-
-
'use strict';
-// @TODO: What should we use for internal util functions?
-//        Maybe we should use agenda:util:processJobs which would move agenda:* to agenda:agenda;*
-const debug = require('debug')('agenda:internal:processJobs');
-const createJob = require('./create-job');
-
-/**
- * Process methods for jobs
- * @param {Job} extraJob job to run immediately
- * @returns {undefined}
- */
-module.exports = function(extraJob) {
-  debug('starting to process jobs');
-  // Make sure an interval has actually been set
-  // Prevents race condition with 'Agenda.stop' and already scheduled run
-  if (!this._processInterval) {
-    debug('no _processInterval set when calling processJobs, returning');
-    return;
-  }
-
-  const self = this;
-  const definitions = this._definitions;
-  const jobQueue = this._jobQueue;
-  let jobName;
-
-  // Determine whether or not we have a direct process call!
-  if (!extraJob) {
-    // Go through each jobName set in 'Agenda.process' and fill the queue with the next jobs
-    for (jobName in definitions) {
-      if ({}.hasOwnProperty.call(definitions, jobName)) {
-        debug('queuing up job to process: [%s]', jobName);
-        jobQueueFilling(jobName);
-      }
-    }
-  } else if (definitions[extraJob.attrs.name]) {
-    // Add the job to list of jobs to lock and then lock it immediately!
-    debug('job [%s] was passed directly to processJobs(), locking and running immediately', extraJob.attrs.name);
-    self._jobsToLock.push(extraJob);
-    lockOnTheFly();
-  }
-
-  /**
-   * Returns true if a job of the specified name can be locked.
-   * Considers maximum locked jobs at any time if self._lockLimit is > 0
-   * Considers maximum locked jobs of the specified name at any time if jobDefinition.lockLimit is > 0
-   * @param {String} name name of job to check if we should lock or not
-   * @returns {boolean} whether or not you should lock job
-   */
-  function shouldLock(name) {
-    const jobDefinition = definitions[name];
-    let shouldLock = true;
-    if (self._lockLimit && self._lockLimit <= self._lockedJobs.length) {
-      shouldLock = false;
-    }
-    if (jobDefinition.lockLimit && jobDefinition.lockLimit <= jobDefinition.locked) {
-      shouldLock = false;
-    }
-    debug('job [%s] lock status: shouldLock = %s', name, shouldLock);
-    return shouldLock;
-  }
-
-  /**
-   * Internal method that adds jobs to be processed to the local queue
-   * @param {*} jobs Jobs to queue
-   * @param {boolean} inFront puts the job in front of queue if true
-   * @returns {undefined}
-   */
-  function enqueueJobs(jobs, inFront) {
-    if (!Array.isArray(jobs)) {
-      jobs = [jobs];
-    }
-
-    jobs.forEach(job => {
-      let jobIndex;
-      let start;
-      let loopCondition;
-      let endCondition;
-      let inc;
-
-      if (inFront) {
-        start = jobQueue.length ? jobQueue.length - 1 : 0;
-        inc = -1;
-        loopCondition = function() {
-          return jobIndex >= 0;
-        };
-        endCondition = function(queuedJob) {
-          return !queuedJob || queuedJob.attrs.priority < job.attrs.priority;
-        };
-      } else {
-        start = 0;
-        inc = 1;
-        loopCondition = function() {
-          return jobIndex < jobQueue.length;
-        };
-        endCondition = function(queuedJob) {
-          return queuedJob.attrs.priority >= job.attrs.priority;
-        };
-      }
-
-      for (jobIndex = start; loopCondition(); jobIndex += inc) {
-        if (endCondition(jobQueue[jobIndex])) {
-          break;
-        }
-      }
-
-      // Insert the job to the queue at its prioritized position for processing
-      jobQueue.splice(jobIndex, 0, job);
-    });
-  }
-
-  /**
-   * Internal method that will lock a job and store it on MongoDB
-   * This method is called when we immediately start to process a job without using the process interval
-   * We do this because sometimes jobs are scheduled but will be run before the next process time
-   * @returns {undefined}
-   */
-  function lockOnTheFly() {
-    // Already running this? Return
-    if (self._isLockingOnTheFly) {
-      debug('lockOnTheFly() already running, returning');
-      return;
-    }
-
-    // Don't have any jobs to run? Return
-    if (self._jobsToLock.length === 0) {
-      debug('no jobs to current lock on the fly, returning');
-      self._isLockingOnTheFly = false;
-      return;
-    }
-
-    // Set that we are running this
-    self._isLockingOnTheFly = true;
-
-    // Grab a job that needs to be locked
-    const now = new Date();
-    const job = self._jobsToLock.pop();
-
-    // If locking limits have been hit, stop locking on the fly.
-    // Jobs that were waiting to be locked will be picked up during a
-    // future locking interval.
-    if (!shouldLock(job.attrs.name)) {
-      debug('lock limit hit for: [%s]', job.attrs.name);
-      self._jobsToLock = [];
-      self._isLockingOnTheFly = false;
-      return;
-    }
-
-    // Query to run against collection to see if we need to lock it
-    const criteria = {
-      _id: job.attrs._id,
-      lockedAt: null,
-      nextRunAt: job.attrs.nextRunAt,
-      disabled: {$ne: true}
-    };
-
-    // Update / options for the MongoDB query
-    const update = {$set: {lockedAt: now}};
-    const options = {returnDocument: 'after'};
-
-    // Lock the job in MongoDB!
-    self._collection.findOneAndUpdate(criteria, update, options, (err, resp) => {
-      if (err) {
-        throw err;
-      }
-      // Did the "job" get locked? Create a job object and run
-      if (resp.value) {
-        const job = createJob(self, resp.value);
-        debug('found job [%s] that can be locked on the fly', job.attrs.name);
-        self._lockedJobs.push(job);
-        definitions[job.attrs.name].locked++;
-        enqueueJobs(job);
-        jobProcessing();
-      }
-
-      // Mark lock on fly is done for now
-      self._isLockingOnTheFly = false;
-
-      // Re-run in case anything is in the queue
-      lockOnTheFly();
-    });
-  }
-
-  /**
-   * Internal method used to fill a queue with jobs that can be run
-   * @param {String} name fill a queue with specific job name
-   * @returns {undefined}
-   */
-  function jobQueueFilling(name) {
-    // Don't lock because of a limit we have set (lockLimit, etc)
-    if (!shouldLock(name)) {
-      debug('lock limit reached in queue filling for [%s]', name);
-      return;
-    }
-
-    // Set the date of the next time we are going to run _processEvery function
-    const now = new Date();
-    self._nextScanAt = new Date(now.valueOf() + self._processEvery);
-
-    // For this job name, find the next job to run and lock it!
-    self._findAndLockNextJob(name, definitions[name], (err, job) => {
-      if (err) {
-        debug('[%s] job lock failed while filling queue', name);
-        throw err;
-      }
-
-      // Still have the job?
-      // 1. Add it to lock list
-      // 2. Add count of locked jobs
-      // 3. Queue the job to actually be run now that it is locked
-      // 4. Recursively run this same method we are in to check for more available jobs of same type!
-      if (job) {
-        debug('[%s:%s] job locked while filling queue', name, job.attrs._id);
-        self._lockedJobs.push(job);
-        definitions[job.attrs.name].locked++;
-        enqueueJobs(job);
-        jobQueueFilling(name);
-        jobProcessing();
-      }
-    });
-  }
-
-  /**
-   * Internal method that processes any jobs in the local queue (array)
-   * @returns {undefined}
-   */
-  function jobProcessing() {
-    // Ensure we have jobs
-    if (jobQueue.length === 0) {
-      return;
-    }
-
-    // Store for all sorts of things
-    const now = new Date();
-
-    // Get the next job that is not blocked by concurrency
-    let next;
-    for (next = jobQueue.length - 1; next > 0; next -= 1) {
-      const def = definitions[jobQueue[next].attrs.name];
-      if (def.concurrency > def.running) {
-        break;
-      }
-    }
-
-    // We now have the job we are going to process and its definition
-    const job = jobQueue.splice(next, 1)[0];
-    const jobDefinition = definitions[job.attrs.name];
-
-    debug('[%s:%s] about to process job', job.attrs.name, job.attrs._id);
-
-    // If the 'nextRunAt' time is older than the current time, run the job
-    // Otherwise, setTimeout that gets called at the time of 'nextRunAt'
-    if (job.attrs.nextRunAt < now) {
-      debug('[%s:%s] nextRunAt is in the past, run the job immediately', job.attrs.name, job.attrs._id);
-      runOrRetry();
-    } else {
-      const runIn = job.attrs.nextRunAt - now;
-      debug('[%s:%s] nextRunAt is in the future, calling setTimeout(%d)', job.attrs.name, job.attrs._id, runIn);
-      setTimeout(runOrRetry, runIn);
-    }
-
-    /**
-     * Internal method that tries to run a job and if it fails, retries again!
-     * @returns {undefined}
-     */
-    function runOrRetry() {
-      if (self._processInterval) {
-        if (jobDefinition.concurrency > jobDefinition.running && self._runningJobs.length < self._maxConcurrency) {
-          // Get the deadline of when the job is not supposed to go past for locking
-          const lockDeadline = new Date(Date.now() - jobDefinition.lockLifetime);
-
-          // This means a job has "expired", as in it has not been "touched" within the lockoutTime
-          // Remove from local lock
-          // NOTE: Shouldn't we update the 'lockedAt' value in MongoDB so it can be picked up on restart?
-          if (job.attrs.lockedAt < lockDeadline) {
-            debug('[%s:%s] job lock has expired, freeing it up', job.attrs.name, job.attrs._id);
-            self._lockedJobs.splice(self._lockedJobs.indexOf(job), 1);
-            jobDefinition.locked--;
-            jobProcessing();
-            return;
-          }
-
-          // Add to local "running" queue
-          self._runningJobs.push(job);
-          jobDefinition.running++;
-
-          // CALL THE ACTUAL METHOD TO PROCESS THE JOB!!!
-          debug('[%s:%s] processing job', job.attrs.name, job.attrs._id);
-          job.run()
-            .catch(err => [err, job])
-            .then(job => processJobResult(...Array.isArray(job) ? job : [null, job]));
-
-          // Re-run the loop to check for more jobs to process (locally)
-          jobProcessing();
-        } else {
-          // Run the job immediately by putting it on the top of the queue
-          debug('[%s:%s] concurrency preventing immediate run, pushing job to top of queue', job.attrs.name, job.attrs._id);
-          enqueueJobs(job, true);
-        }
-      }
-    }
-  }
-
-  /**
-   * Internal method used to run the job definition
-   * @param {Error} err thrown if can't process job
-   * @param {module.Job} job job to process
-   * @returns {undefined}
-   */
-  function processJobResult(err, job) {
-    if (err) {
-      return job.agenda.emit('error', err);
-    }
-    const name = job.attrs.name;
-
-    // Job isn't in running jobs so throw an error
-    if (self._runningJobs.indexOf(job) === -1) {
-      debug('[%s] callback was called, job must have been marked as complete already', job.attrs._id);
-      throw new Error('callback already called - job ' + name + ' already marked complete');
-    }
-
-    // Remove the job from the running queue
-    self._runningJobs.splice(self._runningJobs.indexOf(job), 1);
-    if (definitions[name].running > 0) {
-      definitions[name].running--;
-    }
-
-    // Remove the job from the locked queue
-    self._lockedJobs.splice(self._lockedJobs.indexOf(job), 1);
-    if (definitions[name].locked > 0) {
-      definitions[name].locked--;
-    }
-
-    // Re-process jobs now that one has finished
-    jobProcessing();
-  }
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/Agenda.html b/docs/agenda/2.2.0/Agenda.html deleted file mode 100644 index ef0dce5..0000000 --- a/docs/agenda/2.2.0/Agenda.html +++ /dev/null @@ -1,4583 +0,0 @@ - - - - - - - - - Agenda - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- Agenda -

- - - - -
-
- -

- - Agenda - -

- - - -
- -
-
- - - - - - - - - - - - -

- new Agenda(config, cb) -

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
config - - - - Object - - - - - - - -

Agenda Config

- -
cb - - - - function - - - - - - - -

Callback after Agenda has started and connected to mongo

- -
- - - - - -
Properties:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
_name - - - - Object - - - - - - - -

Name of the current Agenda queue

-
_processEvery - - - - Number - - - - - - - - -
_defaultConcurrency - - - - Number - - - - - - - - -
_maxConcurrency - - - - Number - - - - - - - - -
_defaultLockLimit - - - - Number - - - - - - - - -
_lockLimit - - - - Number - - - - - - - - -
_definitions - - - - Object - - - - - - - - -
_runningJobs - - - - Object - - - - - - - - -
_lockedJobs - - - - Object - - - - - - - - -
_jobQueue - - - - Object - - - - - - - - -
_defaultLockLifetime - - - - Number - - - - - - - - -
_sort - - - - Object - - - - - - - - -
_indices - - - - Object - - - - - - - - -
_isLockingOnTheFly - - - - Boolean - - - - - - - - -
_jobsToLock - - - - Array - - - - - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - -

Methods

- - - - - - - - - - - - - -

- cancel(query) → {Promise.<Number>} -

-
- - - - - -
-

Cancels any jobs matching the passed MongoDB query, and removes them from the database.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
query - - - - Object - - - - - - - -

MongoDB query to use when cancelling

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- create(name, data) → {Job} -

-
- - - - - -
-

Given a name and some data, create a new job

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - - - String - - - - - - - -

name of job

- -
data - - - - Object - - - - - - - -

data to set for job

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- database(url, collection, options, cb) → {exports} -

-
- - - - - -
-

Connect to the spec'd MongoDB server and database.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
url - - - - String - - - - - - - -

MongoDB server URI

- -
collection - - - - String - - - - - - - -

name of collection to use. Defaults to agendaJobs

- -
options - - - - Object - - - - - - - -

options for connecting

- -
cb - - - - function - - - - - - - -

callback of MongoDB connection

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- dbInit(collection, cb) → {undefined} -

-
- - - - - -
-

Setup and initialize the collection used to manage Jobs.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
collection - - - - String - - - - - - - -

name or undefined for default 'agendaJobs'

- -
cb - - - - function - - - - - - - -

called when the db is initialized

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- defaultConcurrency(num) → {exports} -

-
- - - - - -
-

Set the default concurrency for each job

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
num - - - - Number - - - - - - - -

default concurrency

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- defaultLockLifetime(ms) → {Agenda} -

-
- - - - - -
-

Set the default lock time (in ms) -Default is 10 * 60 * 1000 ms (10 minutes)

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
ms - - - - Number - - - - - - - -

time in ms to set default lock

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- defaultLockLimit(num) → {Agenda} -

-
- - - - - -
-

Set default lock limit per job type

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
num - - - - Number - - - - - - - -

Lock limit per job

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- define(name, options, processor) → {undefined} -

-
- - - - - -
-

Setup definition for job -Method is used by consumers of lib to setup their functions

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - - - String - - - - - - - -

name of job

- -
options - - - - Object - - - - - - - -

options for job to run

- -
processor - - - - function - - - - - - - -

function to be called to run actual job

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- every(interval, names, dataopt, optionsopt) → {Promise} -

-
- - - - - -
-

Creates a scheduled job with given interval and name/names of the job to run

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
interval - - - - String - - - | - - - Number - - - - - - - - - - - - - -

run every X interval

- -
names - - - - String - - - | - - - Array.<String> - - - - - - - - - - - - - -

String or strings of jobs to schedule

- -
data - - - - Object - - - - - - - - - <optional>
- - - - - -
-

data to run for job

- -
options - - - - Object - - - - - - - - - <optional>
- - - - - -
-

options to run job for

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- (protected) findAndLockNextJob(jobName, definition, cb) → {undefined} -

-
- - - - - -
-

Find and lock jobs

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
jobName - - - - String - - - - - - - -

name of job to try to lock

- -
definition - - - - Object - - - - - - - -

definition used to tell how job is run

- -
cb - - - - function - - - - - - - -

called when job lock fails or passes

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- jobs(query, sort, limit) → {Promise} -

-
- - - - - -
-

Finds all jobs matching 'query'

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
query - - - - Object - - - - - - - -

object for MongoDB

- -
sort - - - - Object - - - - - - - -

object for MongoDB

- -
limit - - - - Number - - - - - - - -

number of documents to return from MongoDB

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- locklimit(num) → {exports} -

-
- - - - - -
-

Set the default amount jobs that are allowed to be locked at one time (GLOBAL)

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
num - - - - Number - - - - - - - -

Lock limit

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- maxConcurrency(num) → {exports} -

-
- - - - - -
-

Set the concurrency for jobs (globally), type does not matter

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
num - - - - Number - - - - - - - -

max concurrency value

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- mongo(mdb, collection, cb) → {exports} -

-
- - - - - -
-

Build method used to add MongoDB connection details

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
mdb - - - - MongoClient - - - - - - - -

instance of MongoClient to use

- -
collection - - - - String - - - - - - - -

name collection we want to use ('agendaJobs')

- -
cb - - - - function - - - - - - - -

called when MongoDB connection fails or passes

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- name(name) → {exports} -

-
- - - - - -
-

Set name of queue

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - - - String - - - - - - - -

name of agenda instance

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- now(name, data) → {Promise} -

-
- - - - - -
-

Create a job for this exact moment

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - - - String - - - - - - - -

name of job to schedule

- -
data - - - - Object - - - - - - - -

data to pass to job

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- processEvery(time) → {exports} -

-
- - - - - -
-

Set the default process interval

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
time - - - - Number - - - | - - - String - - - - - - - -

time to process, expressed in human interval

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- purge() → {Promise} -

-
- - - - - -
-

Removes all jobs from queue

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- saveJob(job) → {Promise} -

-
- - - - - -
-

Save the properties on a job to MongoDB

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
job - - - - Job - - - - - - - -

job to save into MongoDB

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- schedule(when, names, data) → {Promise.<(Job|Array.<Job>)>} -

-
- - - - - -
-

Schedule a job or jobs at a specific time

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
when - - - - String - - - - - - - -

when the job gets run

- -
names - - - - Array.<String> - - - - - - - -

array of job names to run

- -
data - - - - Object - - - - - - - -

data to send to job

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- sort(query) → {exports} -

-
- - - - - -
-

Set the sort query for finding next job -Default is { nextRunAt: 1, priority: -1 }

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
query - - - - Object - - - - - - - -

sort query object for MongoDB

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- start() → {Promise} -

-
- - - - - -
-

Starts processing jobs using processJobs() methods, storing an interval ID -This method will only resolve if a db has been set up beforehand.

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- stop() → {Promise} -

-
- - - - - -
-

Clear the interval that processes the jobs

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - -
-
- - - - -
- -
- - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/2.2.0/Job.html b/docs/agenda/2.2.0/Job.html deleted file mode 100644 index a6217a2..0000000 --- a/docs/agenda/2.2.0/Job.html +++ /dev/null @@ -1,2050 +0,0 @@ - - - - - - - - - Job - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- Job -

- - - - -
-
- -

- - Job - -

- - - -
- -
-
- - - - - - - - - - - - -

- new Job(args) -

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
args - - - - Object - - - - - - - -

Job Options

- -
- - - - - -
Properties:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
agenda - - - - Object - - - - - - - -

The Agenda instance

-
attrs - - - - Object - - - - - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - -

Methods

- - - - - - - - - - - - - -

- computeNextRunAt() → {exports} -

-
- - - - - -
-

Internal method used to compute next time a job should run and sets the proper values

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- disable() → {exports} -

-
- - - - - -
-

Prevents the job type from running

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- enable() → {Job} -

-
- - - - - -
-

Allows job type to run

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- fail(reason) → {exports} -

-
- - - - - -
-

Fails the job with a reason (error) specified

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
reason - - - - Error - - - | - - - String - - - - - - - -

reason job failed

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- isRunning() → {Boolean} -

-
- - - - - -
-

A job is running if: -(lastRunAt exists AND lastFinishedAt does not exist) -OR -(lastRunAt exists AND lastFinishedAt exists but the lastRunAt is newer [in time] than lastFinishedAt)

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- priority(priority) → {Number} -

-
- - - - - -
-

Internal method to turn priority into a number

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
priority - - - - String - - - | - - - Number - - - - - - - -

string to parse into number

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- remove() → {Promise} -

-
- - - - - -
-

Remove the job from MongoDB

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- repeatAt(time) → {exports} -

-
- - - - - -
-

Sets a job to repeat at a specific time

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
time - - - - String - - - - - - - -

time to repeat job at (human readable or number)

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- repeatEvery(interval, options) → {Job} -

-
- - - - - -
-

Sets a job to repeat every X amount of time

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
interval - - - - String - - - - - - - -

repeat every X

- -
options - - - - Object - - - - - - - -

options to use for job

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- run() → {Promise} -

-
- - - - - -
-

Internal method (RUN)

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- schedule(time) → {exports} -

-
- - - - - -
-

Schedules a job to run at specified time

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
time - - - - String - - - - - - - -

schedule a job to run "then"

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- toJSON() → {Object} -

-
- - - - - -
-

Given a job, turn it into an object we can store in Mongo

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- touch() → {undefined} -

-
- - - - - -
-

Updates "lockedAt" time so the job does not get picked up again

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- unique(unique, opts) → {exports} -

-
- - - - - -
-

Data to ensure is unique for job to be created

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
unique - - - - Object - - - - - - - -

mongo data query for unique

- -
opts - - - - Object - - - - - - - -

unique options

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - -
-
- - - - -
- -
- - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/2.2.0/JobProcessingQueue.html b/docs/agenda/2.2.0/JobProcessingQueue.html deleted file mode 100644 index 34cc579..0000000 --- a/docs/agenda/2.2.0/JobProcessingQueue.html +++ /dev/null @@ -1,905 +0,0 @@ - - - - - - - - - JobProcessingQueue - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- JobProcessingQueue -

- - - - -
-
- -

- - JobProcessingQueue - -

- - - -
- -
-
- - - - - - - - - - - - -

- new JobProcessingQueue(args) -

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
args - - - - Object - - - - - - - -

Job Options

- -
- - - - - -
Properties:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
agenda - - - - Object - - - - - - - -

The Agenda instance

-
attrs - - - - Object - - - - - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - -

Methods

- - - - - - - - - - - - - -

- insert(job) → {undefined} -

-
- - - - - -
-

Inserts job in queue where it will be order from left to right in decreasing -order of nextRunAt and priority (in case of same nextRunAt), if all values -are even the first jobs to be introduced will have priority

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
job - - - - Job - - - - - - - -

job to add to queue

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- pop() → {Job} -

-
- - - - - -
-

Pops and returns last queue element (next job to be processed) without checking concurrency.

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- push(job) → {undefined} -

-
- - - - - -
-

Inserts job in first queue position

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
job - - - - Job - - - - - - - -

job to add to queue

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- returnNextConcurrencyFreeJob(agendaDefinitions) → {Job} -

-
- - - - - -
-

Returns (does not pop, element remains in queue) first element (always from the right) -that can be processed (not blocked by concurrency execution)

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
agendaDefinitions - - - - Object - - - - - - - -

job to add to queue

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - -
-
- - - - -
- -
- - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/2.2.0/agenda_cancel.js.html b/docs/agenda/2.2.0/agenda_cancel.js.html deleted file mode 100644 index 5ce6488..0000000 --- a/docs/agenda/2.2.0/agenda_cancel.js.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - - - - - agenda/cancel.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/cancel.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:cancel');
-
-/**
- * Cancels any jobs matching the passed MongoDB query, and removes them from the database.
- * @name Agenda#cancel
- * @function
- * @param {Object} query MongoDB query to use when cancelling
- * @caller client code, Agenda.purge(), Job.remove()
- * @returns {Promise<Number>} A promise that contains the number of removed documents when fulfilled.
- */
-module.exports = async function(query) {
-  debug('attempting to cancel all Agenda jobs', query);
-  try {
-    const {result} = await this._collection.deleteMany(query);
-    debug('%s jobs cancelled', result.n);
-    return result.n;
-  } catch (error) {
-    debug('error trying to delete jobs from MongoDB');
-    throw error;
-  }
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/agenda_create.js.html b/docs/agenda/2.2.0/agenda_create.js.html deleted file mode 100644 index a46629f..0000000 --- a/docs/agenda/2.2.0/agenda_create.js.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - agenda/create.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/create.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:create');
-const Job = require('../job');
-
-/**
- * Given a name and some data, create a new job
- * @name Agenda#create
- * @function
- * @param {String} name name of job
- * @param {Object} data data to set for job
- * @returns {Job} instance of new job
- */
-module.exports = function(name, data) {
-  debug('Agenda.create(%s, [Object])', name);
-  const priority = this._definitions[name] ? this._definitions[name].priority : 0;
-  const job = new Job({name, data, type: 'normal', priority, agenda: this});
-  return job;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/agenda_database.js.html b/docs/agenda/2.2.0/agenda_database.js.html deleted file mode 100644 index 03035f8..0000000 --- a/docs/agenda/2.2.0/agenda_database.js.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - - - - agenda/database.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/database.js -

- - - - - -
-
-
'use strict';
-const {MongoClient} = require('mongodb');
-const debug = require('debug')('agenda:database');
-const hasMongoProtocol = require('./has-mongo-protocol');
-
-/**
- * Connect to the spec'd MongoDB server and database.
- * @name Agenda#database
- * @function
- * @param {String} url MongoDB server URI
- * @param {String} collection name of collection to use. Defaults to `agendaJobs`
- * @param {Object} options options for connecting
- * @param {Function} cb callback of MongoDB connection
- * @returns {exports}
- * NOTE:
- * If `url` includes auth details then `options` must specify: { 'uri_decode_auth': true }. This does Auth on
- * the specified database, not the Admin database. If you are using Auth on the Admin DB and not on the Agenda DB,
- * then you need to authenticate against the Admin DB and then pass the MongoDB instance into the constructor
- * or use Agenda.mongo(). If your app already has a MongoDB connection then use that. ie. specify config.mongo in
- * the constructor or use Agenda.mongo().
- */
-module.exports = function(url, collection, options, cb) {
-  const self = this;
-  if (!hasMongoProtocol(url)) {
-    url = 'mongodb://' + url;
-  }
-
-  collection = collection || 'agendaJobs';
-  options = {autoReconnect: true, reconnectTries: Number.MAX_SAFE_INTEGER, reconnectInterval: this._processEvery, useNewUrlParser: true, ...options};
-  MongoClient.connect(url, options, (error, client) => {
-    if (error) {
-      debug('error connecting to MongoDB using collection: [%s]', collection);
-      if (cb) {
-        cb(error, null);
-      } else {
-        throw error;
-      }
-
-      return;
-    }
-
-    debug('successful connection to MongoDB using collection: [%s]', collection);
-    self._db = client;
-    self._mdb = client.db();
-    self.db_init(collection, cb);
-  });
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/agenda_db-init.js.html b/docs/agenda/2.2.0/agenda_db-init.js.html deleted file mode 100644 index 23704d7..0000000 --- a/docs/agenda/2.2.0/agenda_db-init.js.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - - - - agenda/db-init.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/db-init.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:db_init');
-
-/**
- * Setup and initialize the collection used to manage Jobs.
- * @name Agenda#dbInit
- * @function
- * @param {String} collection name or undefined for default 'agendaJobs'
- * @param {Function} cb called when the db is initialized
- * @returns {undefined}
- */
-module.exports = function(collection, cb) {
-  const self = this;
-  debug('init database collection using name [%s]', collection);
-  this._collection = this._mdb.collection(collection || 'agendaJobs');
-  debug('attempting index creation');
-  this._collection.createIndex(
-    this._indices,
-    {name: 'findAndLockNextJobIndex'},
-    err => {
-      if (err) {
-        debug('index creation failed');
-        self.emit('error', err);
-      } else {
-        debug('index creation success');
-        self.emit('ready');
-      }
-
-      if (cb) {
-        cb(err, self._collection);
-      }
-    }
-  );
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/agenda_default-concurrency.js.html b/docs/agenda/2.2.0/agenda_default-concurrency.js.html deleted file mode 100644 index 14211b5..0000000 --- a/docs/agenda/2.2.0/agenda_default-concurrency.js.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - agenda/default-concurrency.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/default-concurrency.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:defaultConcurrency');
-
-/**
- * Set the default concurrency for each job
- * @name Agenda#defaultConcurrency
- * @function
- * @param {Number} num default concurrency
- * @returns {exports} agenda instance
- */
-module.exports = function(num) {
-  debug('Agenda.defaultConcurrency(%d)', num);
-  this._defaultConcurrency = num;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/agenda_default-lock-lifetime.js.html b/docs/agenda/2.2.0/agenda_default-lock-lifetime.js.html deleted file mode 100644 index aa123ba..0000000 --- a/docs/agenda/2.2.0/agenda_default-lock-lifetime.js.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - agenda/default-lock-lifetime.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/default-lock-lifetime.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:defaultLockLifetime');
-
-/**
- * Set the default lock time (in ms)
- * Default is 10 * 60 * 1000 ms (10 minutes)
- * @name Agenda#defaultLockLifetime
- * @function
- * @param {Number} ms time in ms to set default lock
- * @returns {Agenda} agenda instance
- */
-module.exports = function(ms) {
-  debug('Agenda.defaultLockLifetime(%d)', ms);
-  this._defaultLockLifetime = ms;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/agenda_default-lock-limit.js.html b/docs/agenda/2.2.0/agenda_default-lock-limit.js.html deleted file mode 100644 index 76f0812..0000000 --- a/docs/agenda/2.2.0/agenda_default-lock-limit.js.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - agenda/default-lock-limit.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/default-lock-limit.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:defaultLockLimit');
-
-/**
- * Set default lock limit per job type
- * @name Agenda#defaultLockLimit
- * @function
- * @param {Number} num Lock limit per job
- * @returns {Agenda} agenda instance
- */
-module.exports = function(num) {
-  debug('Agenda.defaultLockLimit(%d)', num);
-  this._defaultLockLimit = num;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/agenda_define.js.html b/docs/agenda/2.2.0/agenda_define.js.html deleted file mode 100644 index 403a9f6..0000000 --- a/docs/agenda/2.2.0/agenda_define.js.html +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - - - - - agenda/define.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/define.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:define');
-
-/**
- * Setup definition for job
- * Method is used by consumers of lib to setup their functions
- * @name Agenda#define
- * @function
- * @param {String} name name of job
- * @param {Object} options options for job to run
- * @param {Function} processor function to be called to run actual job
- * @returns {undefined}
- */
-module.exports = function(name, options, processor) {
-  if (!processor) {
-    processor = options;
-    options = {};
-  }
-
-  this._definitions[name] = {
-    fn: processor,
-    concurrency: options.concurrency || this._defaultConcurrency,
-    lockLimit: options.lockLimit || this._defaultLockLimit,
-    priority: options.priority || 0,
-    lockLifetime: options.lockLifetime || this._defaultLockLifetime,
-    running: 0,
-    locked: 0
-  };
-  debug('job [%s] defined with following options: \n%O', name, this._definitions[name]);
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/agenda_every.js.html b/docs/agenda/2.2.0/agenda_every.js.html deleted file mode 100644 index e40a2b6..0000000 --- a/docs/agenda/2.2.0/agenda_every.js.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - - - - - agenda/every.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/every.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:every');
-
-/**
- * Creates a scheduled job with given interval and name/names of the job to run
- * @name Agenda#every
- * @function
- * @param {String|Number} interval - run every X interval
- * @param {String|Array<String>} names - String or strings of jobs to schedule
- * @param {Object} [data] - data to run for job
- * @param {Object} [options] - options to run job for
- * @returns {Promise} Job/s created. Resolves when schedule fails or passes
- */
-module.exports = async function(interval, names, data, options) {
-  /**
-   * Internal method to setup job that gets run every interval
-   * @param {Number} interval run every X interval
-   * @param {String} name String job to schedule
-   * @param {Object} data data to run for job
-   * @param {Object} options options to run job for
-   * @returns {Job} instance of job
-   */
-  const createJob = async(interval, name, data, options) => {
-    const job = this.create(name, data);
-
-    job.attrs.type = 'single';
-    job.repeatEvery(interval, options);
-    await job.save();
-
-    return job;
-  };
-
-  /**
-   * Internal helper method that uses createJob to create jobs for an array of names
-   * @param {Number} interval run every X interval
-   * @param {Array<String>} names Strings of jobs to schedule
-   * @param {Object} data data to run for job
-   * @param {Object} options options to run job for
-   * @returns {Array<Job>} array of jobs created
-   */
-  const createJobs = (interval, names, data, options) => {
-    try {
-      const jobs = names.map(name => createJob(interval, name, data, options));
-
-      debug('every() -> all jobs created successfully');
-
-      return Promise.all(jobs);
-    } catch (error) { // @TODO: catch - ignore :O
-      debug('every() -> error creating one or more of the jobs', error);
-    }
-  };
-
-  if (typeof names === 'string' || names instanceof String) {
-    debug('Agenda.every(%s, %O, %O)', interval, names, options);
-    const jobs = await createJob(interval, names, data, options);
-
-    return jobs;
-  }
-
-  if (Array.isArray(names)) {
-    debug('Agenda.every(%s, %s, %O)', interval, names, options);
-    const jobs = await createJobs(interval, names, data, options);
-
-    return jobs;
-  }
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/agenda_find-and-lock-next-job.js.html b/docs/agenda/2.2.0/agenda_find-and-lock-next-job.js.html deleted file mode 100644 index 1f199ed..0000000 --- a/docs/agenda/2.2.0/agenda_find-and-lock-next-job.js.html +++ /dev/null @@ -1,197 +0,0 @@ - - - - - - - - - - - agenda/find-and-lock-next-job.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/find-and-lock-next-job.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:internal:_findAndLockNextJob');
-const {createJob} = require('../utils');
-
-/**
- * Find and lock jobs
- * @name Agenda#findAndLockNextJob
- * @function
- * @param {String} jobName name of job to try to lock
- * @param {Object} definition definition used to tell how job is run
- * @param {Function} cb called when job lock fails or passes
- * @access protected
- * @caller jobQueueFilling() only
- * @returns {undefined}
- */
-module.exports = function(jobName, definition, cb) {
-  const self = this;
-  const now = new Date();
-  const lockDeadline = new Date(Date.now().valueOf() - definition.lockLifetime);
-  debug('_findAndLockNextJob(%s, [Function], cb)', jobName);
-
-  // Don't try and access MongoDB if we've lost connection to it.
-  // Trying to resolve crash on Dev PC when it resumes from sleep. NOTE: Does this still happen?
-  const s = this._mdb.s || this._mdb.db.s;
-  if (s.topology.connections().length === 0) {
-    if (s.topology.autoReconnect && !s.topology.isDestroyed()) {
-      // Continue processing but notify that Agenda has lost the connection
-      debug('Missing MongoDB connection, not attempting to find and lock a job');
-      self.emit('error', new Error('Lost MongoDB connection'));
-      cb();
-    } else {
-      // No longer recoverable
-      debug('topology.autoReconnect: %s, topology.isDestroyed(): %s', s.topology.autoReconnect, s.topology.isDestroyed());
-      cb(new Error('MongoDB connection is not recoverable, application restart required'));
-    }
-  } else {
-    // /**
-    // * Query used to find job to run
-    // * @type {{$or: [*]}}
-    // */
-    const JOB_PROCESS_WHERE_QUERY = {
-      $or: [{
-        name: jobName,
-        lockedAt: null,
-        nextRunAt: {$lte: this._nextScanAt},
-        disabled: {$ne: true}
-      }, {
-        name: jobName,
-        lockedAt: {$exists: false},
-        nextRunAt: {$lte: this._nextScanAt},
-        disabled: {$ne: true}
-      }, {
-        name: jobName,
-        lockedAt: {$lte: lockDeadline},
-        disabled: {$ne: true}
-      }]
-    };
-
-    /**
-    * Query used to set a job as locked
-    * @type {{$set: {lockedAt: Date}}}
-    */
-    const JOB_PROCESS_SET_QUERY = {$set: {lockedAt: now}};
-
-    /**
-    * Query used to affect what gets returned
-    * @type {{returnOriginal: boolean, sort: object}}
-    */
-    const JOB_RETURN_QUERY = {returnDocument: 'after', sort: this._sort};
-
-    // Find ONE and ONLY ONE job and set the 'lockedAt' time so that job begins to be processed
-    this._collection.findOneAndUpdate(JOB_PROCESS_WHERE_QUERY, JOB_PROCESS_SET_QUERY, JOB_RETURN_QUERY, (err, result) => {
-      let job;
-      if (!err && result.value) {
-        debug('found a job available to lock, creating a new job on Agenda with id [%s]', result.value._id);
-        job = createJob(self, result.value);
-      }
-
-      if (err) {
-        debug('error occurred when running query to find and lock job');
-      }
-
-      cb(err, job);
-    });
-  }
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/agenda_has-mongo-protocol.js.html b/docs/agenda/2.2.0/agenda_has-mongo-protocol.js.html deleted file mode 100644 index 3fe533d..0000000 --- a/docs/agenda/2.2.0/agenda_has-mongo-protocol.js.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - agenda/has-mongo-protocol.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/has-mongo-protocol.js -

- - - - - -
-
-
'use strict';
-/**
- * Given a mongo connection url will check if it contains the mongo
- * @param {string} url URL to be tested
- * @returns {boolean} whether or not the url is a valid mongo URL
- */
-module.exports = function(url) {
-  return url.match(/mongodb(?:\+srv)?:\/\/.*/) !== null;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/agenda_index.js.html b/docs/agenda/2.2.0/agenda_index.js.html deleted file mode 100644 index 6319b5b..0000000 --- a/docs/agenda/2.2.0/agenda_index.js.html +++ /dev/null @@ -1,195 +0,0 @@ - - - - - - - - - - - agenda/index.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/index.js -

- - - - - -
-
-
const {EventEmitter} = require('events');
-const humanInterval = require('human-interval');
-const JobProcessingQueue = require('./job-processing-queue');
-
-/**
- * @class Agenda
- * @param {Object} config - Agenda Config
- * @param {Function} cb - Callback after Agenda has started and connected to mongo
- * @property {Object} _name - Name of the current Agenda queue
- * @property {Number} _processEvery
- * @property {Number} _defaultConcurrency
- * @property {Number} _maxConcurrency
- * @property {Number} _defaultLockLimit
- * @property {Number} _lockLimit
- * @property {Object} _definitions
- * @property {Object} _runningJobs
- * @property {Object} _lockedJobs
- * @property {Object} _jobQueue
- * @property {Number} _defaultLockLifetime
- * @property {Object} _sort
- * @property {Object} _indices
- * @property {Boolean} _isLockingOnTheFly
- * @property {Array} _jobsToLock
- */
-class Agenda extends EventEmitter {
-  // eslint-disable-next-line default-param-last
-  constructor(config = {}, cb) {
-    super();
-
-    if (!(this instanceof Agenda)) {
-      return new Agenda(config);
-    }
-
-    this._name = config.name;
-    this._processEvery = humanInterval(config.processEvery) || humanInterval('5 seconds');
-    this._defaultConcurrency = config.defaultConcurrency || 5;
-    this._maxConcurrency = config.maxConcurrency || 20;
-    this._defaultLockLimit = config.defaultLockLimit || 0;
-    this._lockLimit = config.lockLimit || 0;
-    this._definitions = {};
-    this._runningJobs = [];
-    this._lockedJobs = [];
-    this._jobQueue = new JobProcessingQueue();
-    this._defaultLockLifetime = config.defaultLockLifetime || 10 * 60 * 1000; // 10 minute default lockLifetime
-    this._sort = config.sort || {nextRunAt: 1, priority: -1};
-    this._indices = {name: 1, ...this._sort, priority: -1, lockedAt: 1, nextRunAt: 1, disabled: 1};
-
-    this._isLockingOnTheFly = false;
-    this._jobsToLock = [];
-    this._ready = new Promise(resolve => this.once('ready', resolve));
-
-    if (config.mongo) {
-      this.mongo(config.mongo, config.db ? config.db.collection : undefined, cb);
-    } else if (config.db) {
-      this.database(config.db.address, config.db.collection, config.db.options, cb);
-    }
-  }
-}
-
-Agenda.prototype.mongo = require('./mongo');
-Agenda.prototype.database = require('./database');
-Agenda.prototype.db_init = require('./db-init'); // eslint-disable-line camelcase
-Agenda.prototype.name = require('./name');
-Agenda.prototype.processEvery = require('./process-every');
-Agenda.prototype.maxConcurrency = require('./max-concurrency');
-Agenda.prototype.defaultConcurrency = require('./default-concurrency');
-Agenda.prototype.lockLimit = require('./locklimit');
-Agenda.prototype.defaultLockLimit = require('./default-lock-limit');
-Agenda.prototype.defaultLockLifetime = require('./default-lock-lifetime');
-Agenda.prototype.sort = require('./sort');
-Agenda.prototype.create = require('./create');
-Agenda.prototype.jobs = require('./jobs');
-Agenda.prototype.purge = require('./purge');
-Agenda.prototype.define = require('./define');
-Agenda.prototype.every = require('./every');
-Agenda.prototype.schedule = require('./schedule');
-Agenda.prototype.now = require('./now');
-Agenda.prototype.cancel = require('./cancel');
-Agenda.prototype.saveJob = require('./save-job');
-Agenda.prototype.start = require('./start');
-Agenda.prototype.stop = require('./stop');
-Agenda.prototype._findAndLockNextJob = require('./find-and-lock-next-job');
-
-module.exports = Agenda;
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/agenda_job-processing-queue.js.html b/docs/agenda/2.2.0/agenda_job-processing-queue.js.html deleted file mode 100644 index 0a45c75..0000000 --- a/docs/agenda/2.2.0/agenda_job-processing-queue.js.html +++ /dev/null @@ -1,192 +0,0 @@ - - - - - - - - - - - agenda/job-processing-queue.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/job-processing-queue.js -

- - - - - -
-
-
/**
- * @class
- * @param {Object} args - Job Options
- * @property {Object} agenda - The Agenda instance
- * @property {Object} attrs
- */
-class JobProcessingQueue {
-  constructor() {
-    this._queue = [];
-  }
-
-  get length() {
-    return this._queue.length;
-  }
-}
-
-/**
- * Pops and returns last queue element (next job to be processed) without checking concurrency.
- * @returns {Job} Next Job to be processed
- */
-JobProcessingQueue.prototype.pop = function() {
-  return this._queue.pop();
-};
-
-/**
- * Inserts job in first queue position
- * @param {Job} job job to add to queue
- * @returns {undefined}
- */
-JobProcessingQueue.prototype.push = function(job) {
-  this._queue.push(job);
-};
-
-/**
- * Inserts job in queue where it will be order from left to right in decreasing
- * order of nextRunAt and priority (in case of same nextRunAt), if all values
- * are even the first jobs to be introduced will have priority
- * @param {Job} job job to add to queue
- * @returns {undefined}
- */
-JobProcessingQueue.prototype.insert = function(job) {
-  const matchIndex = this._queue.findIndex(element => {
-    if (element.attrs.nextRunAt.getTime() <= job.attrs.nextRunAt.getTime()) {
-      if (element.attrs.nextRunAt.getTime() === job.attrs.nextRunAt.getTime()) {
-        if (element.attrs.priority >= job.attrs.priority) {
-          return true;
-        }
-      } else {
-        return true;
-      }
-    }
-
-    return false;
-  });
-
-  if (matchIndex === -1) {
-    this._queue.push(job);
-  } else {
-    this._queue.splice(matchIndex, 0, job);
-  }
-};
-
-/**
- * Returns (does not pop, element remains in queue) first element (always from the right)
- * that can be processed (not blocked by concurrency execution)
- * @param {Object} agendaDefinitions job to add to queue
- * @returns {Job} Next Job to be processed
- */
-JobProcessingQueue.prototype.returnNextConcurrencyFreeJob = function(agendaDefinitions) {
-  let next;
-  for (next = this._queue.length - 1; next > 0; next -= 1) {
-    const def = agendaDefinitions[this._queue[next].attrs.name];
-    if (def.concurrency > def.running) {
-      break;
-    }
-  }
-
-  return this._queue[next];
-};
-
-module.exports = JobProcessingQueue;
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/agenda_jobs.js.html b/docs/agenda/2.2.0/agenda_jobs.js.html deleted file mode 100644 index 1f778cd..0000000 --- a/docs/agenda/2.2.0/agenda_jobs.js.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - agenda/jobs.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/jobs.js -

- - - - - -
-
-
'use strict';
-const {createJob} = require('../utils');
-
-/**
- * Finds all jobs matching 'query'
- * @name Agenda#jobs
- * @function
- * @param {Object} query object for MongoDB
- * @param {Object} sort object for MongoDB
- * @param {Number} limit number of documents to return from MongoDB
- * @returns {Promise} resolves when fails or passes
- */
-module.exports = async function(query = {}, sort = {}, limit = 0) {
-  const result = await this._collection
-    .find(query)
-    .sort(sort)
-    .limit(limit)
-    .toArray();
-
-  return result.map(job => createJob(this, job));
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/agenda_locklimit.js.html b/docs/agenda/2.2.0/agenda_locklimit.js.html deleted file mode 100644 index 81e9c61..0000000 --- a/docs/agenda/2.2.0/agenda_locklimit.js.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - agenda/locklimit.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/locklimit.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:locklimit');
-
-/**
- * Set the default amount jobs that are allowed to be locked at one time (GLOBAL)
- * @name Agenda#locklimit
- * @function
- * @param {Number} num Lock limit
- * @returns {exports} agenda instance
- */
-module.exports = function(num) {
-  // @NOTE: Is this different than max concurrency?
-  debug('Agenda.lockLimit(%d)', num);
-  this._lockLimit = num;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/agenda_max-concurrency.js.html b/docs/agenda/2.2.0/agenda_max-concurrency.js.html deleted file mode 100644 index 51a3142..0000000 --- a/docs/agenda/2.2.0/agenda_max-concurrency.js.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - agenda/max-concurrency.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/max-concurrency.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:maxConcurrency');
-
-/**
- * Set the concurrency for jobs (globally), type does not matter
- * @name Agenda#maxConcurrency
- * @function
- * @param {Number} num max concurrency value
- * @returns {exports} agenda instance
- */
-module.exports = function(num) {
-  debug('Agenda.maxConcurrency(%d)', num);
-  this._maxConcurrency = num;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/agenda_mongo.js.html b/docs/agenda/2.2.0/agenda_mongo.js.html deleted file mode 100644 index 534784f..0000000 --- a/docs/agenda/2.2.0/agenda_mongo.js.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - agenda/mongo.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/mongo.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Build method used to add MongoDB connection details
- * @name Agenda#mongo
- * @function
- * @param {MongoClient} mdb instance of MongoClient to use
- * @param {String} collection name collection we want to use ('agendaJobs')
- * @param {Function} cb called when MongoDB connection fails or passes
- * @returns {exports} instance of Agenda
- */
-module.exports = function(mdb, collection, cb) {
-  this._mdb = mdb;
-  this.db_init(collection, cb);
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/agenda_name.js.html b/docs/agenda/2.2.0/agenda_name.js.html deleted file mode 100644 index 9c9f22a..0000000 --- a/docs/agenda/2.2.0/agenda_name.js.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - agenda/name.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/name.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:name');
-
-/**
- * Set name of queue
- * @name Agenda#name
- * @function
- * @param {String} name name of agenda instance
- * @returns {exports} agenda instance
- */
-module.exports = function(name) {
-  debug('Agenda.name(%s)', name);
-  this._name = name;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/agenda_now.js.html b/docs/agenda/2.2.0/agenda_now.js.html deleted file mode 100644 index ab6a8dd..0000000 --- a/docs/agenda/2.2.0/agenda_now.js.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - - - - - agenda/now.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/now.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:now');
-const noCallback = require('../no-callback');
-
-/**
- * Create a job for this exact moment
- * @name Agenda#now
- * @function
- * @param {String} name name of job to schedule
- * @param {Object} data data to pass to job
- * @returns {Promise} resolves with the new job instance created
- */
-module.exports = async function(name, data) {
-  debug('Agenda.now(%s, [Object])', name);
-  try {
-    // eslint-disable-next-line prefer-rest-params
-    noCallback(arguments, 2);
-    const job = this.create(name, data);
-
-    job.schedule(new Date());
-    await job.save();
-
-    return job;
-  } catch (error) {
-    debug('error trying to create a job for this exact moment');
-    throw error;
-  }
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/agenda_process-every.js.html b/docs/agenda/2.2.0/agenda_process-every.js.html deleted file mode 100644 index 663294c..0000000 --- a/docs/agenda/2.2.0/agenda_process-every.js.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - agenda/process-every.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/process-every.js -

- - - - - -
-
-
'use strict';
-const humanInterval = require('human-interval');
-const debug = require('debug')('agenda:processEvery');
-
-/**
- * Set the default process interval
- * @name Agenda#processEvery
- * @function
- * @param {Number|String} time - time to process, expressed in human interval
- * @returns {exports} agenda instance
- */
-module.exports = function(time) {
-  debug('Agenda.processEvery(%d)', time);
-  this._processEvery = humanInterval(time);
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/agenda_purge.js.html b/docs/agenda/2.2.0/agenda_purge.js.html deleted file mode 100644 index 89b50f4..0000000 --- a/docs/agenda/2.2.0/agenda_purge.js.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - agenda/purge.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/purge.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:purge');
-
-/**
- * Removes all jobs from queue
- * @name Agenda#purge
- * @function
- * @returns {Promise} resolved when job cancelling fails or passes
- */
-module.exports = async function() {
-  // @NOTE: Only use after defining your jobs
-  const definedNames = Object.keys(this._definitions);
-  debug('Agenda.purge(%o)', definedNames);
-  return this.cancel({name: {$not: {$in: definedNames}}});
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/agenda_save-job.js.html b/docs/agenda/2.2.0/agenda_save-job.js.html deleted file mode 100644 index 0bc8087..0000000 --- a/docs/agenda/2.2.0/agenda_save-job.js.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - - - - - - agenda/save-job.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/save-job.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:saveJob');
-const {processJobs} = require('../utils');
-
-/**
- * Given a result for findOneAndUpdate() or insert() above, determine whether to process
- * the job immediately or to let the processJobs() interval pick it up later
- * @param {Job} job job instance
- * @param {*} result the data returned from the findOneAndUpdate() call or insertOne() call
- * @access private
- * @returns {undefined}
- */
-const processDbResult = (job, result) => {
-  debug('processDbResult() called with success, checking whether to process job immediately or not');
-
-  // We have a result from the above calls
-  // findOneAndUpdate() returns different results than insertOne() so check for that
-  let res = result.ops ? result.ops : result.value;
-  if (res) {
-    // If it is an array, grab the first job
-    if (Array.isArray(res)) {
-      res = res[0];
-    }
-
-    // Grab ID and nextRunAt from MongoDB and store it as an attribute on Job
-    job.attrs._id = res._id;
-    job.attrs.nextRunAt = res.nextRunAt;
-
-    // If the current job would have been processed in an older scan, process the job immediately
-    if (job.attrs.nextRunAt && job.attrs.nextRunAt < this._nextScanAt) {
-      debug('[%s:%s] job would have ran by nextScanAt, processing the job immediately', job.attrs.name, res._id);
-      processJobs.call(this, job);
-    }
-  }
-
-  // Return the Job instance
-  return job;
-};
-
-/**
- * Save the properties on a job to MongoDB
- * @name Agenda#saveJob
- * @function
- * @param {Job} job job to save into MongoDB
- * @returns {Promise} resolves when job is saved or errors
- */
-module.exports = async function(job) {
-  try {
-    debug('attempting to save a job into Agenda instance');
-
-    // Grab information needed to save job but that we don't want to persist in MongoDB
-    const id = job.attrs._id;
-    const {unique, uniqueOpts} = job.attrs;
-
-    // Store job as JSON and remove props we don't want to store from object
-    const props = job.toJSON();
-    delete props._id;
-    delete props.unique;
-    delete props.uniqueOpts;
-
-    // Store name of agenda queue as last modifier in job data
-    props.lastModifiedBy = this._name;
-    debug('[job %s] set job props: \n%O', id, props);
-
-    // Grab current time and set default query options for MongoDB
-    const now = new Date();
-    const protect = {};
-    let update = {$set: props};
-    debug('current time stored as %s', now.toISOString());
-
-    // If the job already had an ID, then update the properties of the job
-    // i.e, who last modified it, etc
-    if (id) {
-      // Update the job and process the resulting data'
-      debug('job already has _id, calling findOneAndUpdate() using _id as query');
-      const result = await this._collection.findOneAndUpdate(
-        {_id: id},
-        update,
-        {returnDocument: 'after'}
-      );
-      return processDbResult(job, result);
-    }
-
-    if (props.type === 'single') {
-      // Job type set to 'single' so...
-      // NOTE: Again, not sure about difference between 'single' here and 'once' in job.js
-      debug('job with type of "single" found');
-
-      // If the nextRunAt time is older than the current time, "protect" that property, meaning, don't change
-      // a scheduled job's next run time!
-      if (props.nextRunAt && props.nextRunAt <= now) {
-        debug('job has a scheduled nextRunAt time, protecting that field from upsert');
-        protect.nextRunAt = props.nextRunAt;
-        delete props.nextRunAt;
-      }
-
-      // If we have things to protect, set them in MongoDB using $setOnInsert
-      if (Object.keys(protect).length > 0) {
-        update.$setOnInsert = protect;
-      }
-
-      // Try an upsert
-      // NOTE: 'single' again, not exactly sure what it means
-      debug('calling findOneAndUpdate() with job name and type of "single" as query');
-      const result = await this._collection.findOneAndUpdate({
-        name: props.name,
-        type: 'single'
-      },
-      update, {
-        upsert: true,
-        returnDocument: 'after'
-      });
-      return processDbResult(job, result);
-    }
-
-    if (unique) {
-      // If we want the job to be unique, then we can upsert based on the 'unique' query object that was passed in
-      const query = job.attrs.unique;
-      query.name = props.name;
-      if (uniqueOpts && uniqueOpts.insertOnly) {
-        update = {$setOnInsert: props};
-      }
-
-      // Use the 'unique' query object to find an existing job or create a new one
-      debug('calling findOneAndUpdate() with unique object as query: \n%O', query);
-      const result = await this._collection.findOneAndUpdate(query, update, {upsert: true, returnDocument: 'after'});
-      return processDbResult(job, result);
-    }
-
-    // If all else fails, the job does not exist yet so we just insert it into MongoDB
-    debug('using default behavior, inserting new job via insertOne() with props that were set: \n%O', props);
-    const result = await this._collection.insertOne(props);
-    return processDbResult(job, result);
-  } catch (error) {
-    debug('processDbResult() received an error, job was not updated/created');
-    throw error;
-  }
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/agenda_schedule.js.html b/docs/agenda/2.2.0/agenda_schedule.js.html deleted file mode 100644 index 14cc7a9..0000000 --- a/docs/agenda/2.2.0/agenda_schedule.js.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - - - - agenda/schedule.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/schedule.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:schedule');
-
-/**
- * Schedule a job or jobs at a specific time
- * @name Agenda#schedule
- * @function
- * @param {String} when when the job gets run
- * @param {Array<String>} names array of job names to run
- * @param {Object} data data to send to job
- * @returns {Promise<Job|Job[]>} job or jobs created
- */
-module.exports = function(when, names, data) {
-  const self = this;
-
-  /**
-   * Internal method that creates a job with given date
-   * @param {String} when when the job gets run
-   * @param {String} name of job to run
-   * @param {Object} data data to send to job
-   * @returns {Job} instance of new job
-   */
-  const createJob = async(when, name, data) => {
-    const job = self.create(name, data);
-
-    await job.schedule(when).save();
-
-    return job;
-  };
-
-  /**
-   * Internal helper method that calls createJob on a names array
-   * @param {String} when when the job gets run
-   * @param {*} names of jobs to run
-   * @param {Object} data data to send to job
-   * @returns {Array<Job>} jobs that were created
-   */
-  const createJobs = async(when, names, data) => {
-    try {
-      const jobs = await Promise.all(names.map(name => createJob(when, name, data)));
-      debug('Agenda.schedule()::createJobs() -> all jobs created successfully');
-      return jobs;
-    } catch (error) {
-      debug('Agenda.schedule()::createJobs() -> error creating one or more of the jobs');
-      throw error;
-    }
-  };
-
-  if (typeof names === 'string' || names instanceof String) {
-    debug('Agenda.schedule(%s, %O, [%O], cb)', when, names);
-    return createJob(when, names, data);
-  }
-
-  if (Array.isArray(names)) {
-    debug('Agenda.schedule(%s, %O, [%O])', when, names);
-    return createJobs(when, names, data);
-  }
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/agenda_sort.js.html b/docs/agenda/2.2.0/agenda_sort.js.html deleted file mode 100644 index 08821f8..0000000 --- a/docs/agenda/2.2.0/agenda_sort.js.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - agenda/sort.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/sort.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:sort');
-
-/**
- * Set the sort query for finding next job
- * Default is { nextRunAt: 1, priority: -1 }
- * @name Agenda#sort
- * @function
- * @param {Object} query sort query object for MongoDB
- * @returns {exports} agenda instance
- */
-module.exports = function(query) {
-  debug('Agenda.sort([Object])');
-  this._sort = query;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/agenda_start.js.html b/docs/agenda/2.2.0/agenda_start.js.html deleted file mode 100644 index 39586d3..0000000 --- a/docs/agenda/2.2.0/agenda_start.js.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - - - - - agenda/start.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/start.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:start');
-const {processJobs} = require('../utils');
-
-/**
- * Starts processing jobs using processJobs() methods, storing an interval ID
- * This method will only resolve if a db has been set up beforehand.
- * @name Agenda#start
- * @function
- * @returns {Promise} resolves if db set beforehand, returns undefined otherwise
- */
-module.exports = async function() {
-  if (this._processInterval) {
-    debug('Agenda.start was already called, ignoring');
-    return this._ready;
-  }
-
-  await this._ready;
-  debug('Agenda.start called, creating interval to call processJobs every [%dms]', this._processEvery);
-  this._processInterval = setInterval(processJobs.bind(this), this._processEvery);
-  process.nextTick(processJobs.bind(this));
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/agenda_stop.js.html b/docs/agenda/2.2.0/agenda_stop.js.html deleted file mode 100644 index ba52ba5..0000000 --- a/docs/agenda/2.2.0/agenda_stop.js.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - - - - agenda/stop.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/stop.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:stop');
-
-/**
- * Clear the interval that processes the jobs
- * @name Agenda#stop
- * @function
- * @returns {Promise} resolves when job unlocking fails or passes
- */
-module.exports = function() {
-  const self = this;
-  /**
-   * Internal method to unlock jobs so that they can be re-run
-   * NOTE: May need to update what properties get set here, since job unlocking seems to fail
-   * @access private
-   * @returns {Promise} resolves when job unlocking fails or passes
-   */
-  const _unlockJobs = function() {
-    return new Promise((resolve, reject) => {
-      debug('Agenda._unlockJobs()');
-      const jobIds = self._lockedJobs.map(job => job.attrs._id);
-
-      if (jobIds.length === 0) {
-        debug('no jobs to unlock');
-        return resolve();
-      }
-
-      debug('about to unlock jobs with ids: %O', jobIds);
-      self._collection.updateMany({_id: {$in: jobIds}}, {$set: {lockedAt: null}}, err => {
-        if (err) {
-          return reject(err);
-        }
-
-        self._lockedJobs = [];
-        return resolve();
-      });
-    });
-  };
-
-  debug('Agenda.stop called, clearing interval for processJobs()');
-  clearInterval(this._processInterval);
-  this._processInterval = undefined;
-  return _unlockJobs();
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/fonts/OpenSans-Bold-webfont.eot b/docs/agenda/2.2.0/fonts/OpenSans-Bold-webfont.eot deleted file mode 100644 index 5d20d91..0000000 Binary files a/docs/agenda/2.2.0/fonts/OpenSans-Bold-webfont.eot and /dev/null differ diff --git a/docs/agenda/2.2.0/fonts/OpenSans-Bold-webfont.svg b/docs/agenda/2.2.0/fonts/OpenSans-Bold-webfont.svg deleted file mode 100644 index 3ed7be4..0000000 --- a/docs/agenda/2.2.0/fonts/OpenSans-Bold-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/2.2.0/fonts/OpenSans-Bold-webfont.woff b/docs/agenda/2.2.0/fonts/OpenSans-Bold-webfont.woff deleted file mode 100644 index 1205787..0000000 Binary files a/docs/agenda/2.2.0/fonts/OpenSans-Bold-webfont.woff and /dev/null differ diff --git a/docs/agenda/2.2.0/fonts/OpenSans-BoldItalic-webfont.eot b/docs/agenda/2.2.0/fonts/OpenSans-BoldItalic-webfont.eot deleted file mode 100644 index 1f639a1..0000000 Binary files a/docs/agenda/2.2.0/fonts/OpenSans-BoldItalic-webfont.eot and /dev/null differ diff --git a/docs/agenda/2.2.0/fonts/OpenSans-BoldItalic-webfont.svg b/docs/agenda/2.2.0/fonts/OpenSans-BoldItalic-webfont.svg deleted file mode 100644 index 6a2607b..0000000 --- a/docs/agenda/2.2.0/fonts/OpenSans-BoldItalic-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/2.2.0/fonts/OpenSans-BoldItalic-webfont.woff b/docs/agenda/2.2.0/fonts/OpenSans-BoldItalic-webfont.woff deleted file mode 100644 index ed760c0..0000000 Binary files a/docs/agenda/2.2.0/fonts/OpenSans-BoldItalic-webfont.woff and /dev/null differ diff --git a/docs/agenda/2.2.0/fonts/OpenSans-Italic-webfont.eot b/docs/agenda/2.2.0/fonts/OpenSans-Italic-webfont.eot deleted file mode 100644 index 0c8a0ae..0000000 Binary files a/docs/agenda/2.2.0/fonts/OpenSans-Italic-webfont.eot and /dev/null differ diff --git a/docs/agenda/2.2.0/fonts/OpenSans-Italic-webfont.svg b/docs/agenda/2.2.0/fonts/OpenSans-Italic-webfont.svg deleted file mode 100644 index e1075dc..0000000 --- a/docs/agenda/2.2.0/fonts/OpenSans-Italic-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/2.2.0/fonts/OpenSans-Italic-webfont.woff b/docs/agenda/2.2.0/fonts/OpenSans-Italic-webfont.woff deleted file mode 100644 index ff652e6..0000000 Binary files a/docs/agenda/2.2.0/fonts/OpenSans-Italic-webfont.woff and /dev/null differ diff --git a/docs/agenda/2.2.0/fonts/OpenSans-Light-webfont.eot b/docs/agenda/2.2.0/fonts/OpenSans-Light-webfont.eot deleted file mode 100644 index 1486840..0000000 Binary files a/docs/agenda/2.2.0/fonts/OpenSans-Light-webfont.eot and /dev/null differ diff --git a/docs/agenda/2.2.0/fonts/OpenSans-Light-webfont.svg b/docs/agenda/2.2.0/fonts/OpenSans-Light-webfont.svg deleted file mode 100644 index 11a472c..0000000 --- a/docs/agenda/2.2.0/fonts/OpenSans-Light-webfont.svg +++ /dev/null @@ -1,1831 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/2.2.0/fonts/OpenSans-Light-webfont.woff b/docs/agenda/2.2.0/fonts/OpenSans-Light-webfont.woff deleted file mode 100644 index e786074..0000000 Binary files a/docs/agenda/2.2.0/fonts/OpenSans-Light-webfont.woff and /dev/null differ diff --git a/docs/agenda/2.2.0/fonts/OpenSans-LightItalic-webfont.eot b/docs/agenda/2.2.0/fonts/OpenSans-LightItalic-webfont.eot deleted file mode 100644 index 8f44592..0000000 Binary files a/docs/agenda/2.2.0/fonts/OpenSans-LightItalic-webfont.eot and /dev/null differ diff --git a/docs/agenda/2.2.0/fonts/OpenSans-LightItalic-webfont.svg b/docs/agenda/2.2.0/fonts/OpenSans-LightItalic-webfont.svg deleted file mode 100644 index 431d7e3..0000000 --- a/docs/agenda/2.2.0/fonts/OpenSans-LightItalic-webfont.svg +++ /dev/null @@ -1,1835 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/2.2.0/fonts/OpenSans-LightItalic-webfont.woff b/docs/agenda/2.2.0/fonts/OpenSans-LightItalic-webfont.woff deleted file mode 100644 index 43e8b9e..0000000 Binary files a/docs/agenda/2.2.0/fonts/OpenSans-LightItalic-webfont.woff and /dev/null differ diff --git a/docs/agenda/2.2.0/fonts/OpenSans-Regular-webfont.eot b/docs/agenda/2.2.0/fonts/OpenSans-Regular-webfont.eot deleted file mode 100644 index 6bbc3cf..0000000 Binary files a/docs/agenda/2.2.0/fonts/OpenSans-Regular-webfont.eot and /dev/null differ diff --git a/docs/agenda/2.2.0/fonts/OpenSans-Regular-webfont.svg b/docs/agenda/2.2.0/fonts/OpenSans-Regular-webfont.svg deleted file mode 100644 index 25a3952..0000000 --- a/docs/agenda/2.2.0/fonts/OpenSans-Regular-webfont.svg +++ /dev/null @@ -1,1831 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/2.2.0/fonts/OpenSans-Regular-webfont.woff b/docs/agenda/2.2.0/fonts/OpenSans-Regular-webfont.woff deleted file mode 100644 index e231183..0000000 Binary files a/docs/agenda/2.2.0/fonts/OpenSans-Regular-webfont.woff and /dev/null differ diff --git a/docs/agenda/2.2.0/fonts/OpenSans-Semibold-webfont.eot b/docs/agenda/2.2.0/fonts/OpenSans-Semibold-webfont.eot deleted file mode 100755 index d8375dd..0000000 Binary files a/docs/agenda/2.2.0/fonts/OpenSans-Semibold-webfont.eot and /dev/null differ diff --git a/docs/agenda/2.2.0/fonts/OpenSans-Semibold-webfont.svg b/docs/agenda/2.2.0/fonts/OpenSans-Semibold-webfont.svg deleted file mode 100755 index eec4db8..0000000 --- a/docs/agenda/2.2.0/fonts/OpenSans-Semibold-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/2.2.0/fonts/OpenSans-Semibold-webfont.ttf b/docs/agenda/2.2.0/fonts/OpenSans-Semibold-webfont.ttf deleted file mode 100755 index b329084..0000000 Binary files a/docs/agenda/2.2.0/fonts/OpenSans-Semibold-webfont.ttf and /dev/null differ diff --git a/docs/agenda/2.2.0/fonts/OpenSans-Semibold-webfont.woff b/docs/agenda/2.2.0/fonts/OpenSans-Semibold-webfont.woff deleted file mode 100755 index 28d6ade..0000000 Binary files a/docs/agenda/2.2.0/fonts/OpenSans-Semibold-webfont.woff and /dev/null differ diff --git a/docs/agenda/2.2.0/fonts/OpenSans-SemiboldItalic-webfont.eot b/docs/agenda/2.2.0/fonts/OpenSans-SemiboldItalic-webfont.eot deleted file mode 100755 index 0ab1db2..0000000 Binary files a/docs/agenda/2.2.0/fonts/OpenSans-SemiboldItalic-webfont.eot and /dev/null differ diff --git a/docs/agenda/2.2.0/fonts/OpenSans-SemiboldItalic-webfont.svg b/docs/agenda/2.2.0/fonts/OpenSans-SemiboldItalic-webfont.svg deleted file mode 100755 index 7166ec1..0000000 --- a/docs/agenda/2.2.0/fonts/OpenSans-SemiboldItalic-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/2.2.0/fonts/OpenSans-SemiboldItalic-webfont.ttf b/docs/agenda/2.2.0/fonts/OpenSans-SemiboldItalic-webfont.ttf deleted file mode 100755 index d2d6318..0000000 Binary files a/docs/agenda/2.2.0/fonts/OpenSans-SemiboldItalic-webfont.ttf and /dev/null differ diff --git a/docs/agenda/2.2.0/fonts/OpenSans-SemiboldItalic-webfont.woff b/docs/agenda/2.2.0/fonts/OpenSans-SemiboldItalic-webfont.woff deleted file mode 100755 index d4dfca4..0000000 Binary files a/docs/agenda/2.2.0/fonts/OpenSans-SemiboldItalic-webfont.woff and /dev/null differ diff --git a/docs/agenda/2.2.0/global.html b/docs/agenda/2.2.0/global.html deleted file mode 100644 index 7e20600..0000000 --- a/docs/agenda/2.2.0/global.html +++ /dev/null @@ -1,338 +0,0 @@ - - - - - - - - - Global - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- Global -

- - - - -
-
- -

- - - -

- - - -
- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - - - - - - - - - -

Methods

- - - - - - - - - - - - - -

- parsePriority(priority) → {Number} -

-
- - - - - -
-

Internal method to turn priority into a number

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
priority - - - - String - - - | - - - Number - - - - - - - -

string to parse into number

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - -
-
- - - - -
- -
- - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/2.2.0/icons/home.svg b/docs/agenda/2.2.0/icons/home.svg deleted file mode 100644 index 676d2d3..0000000 --- a/docs/agenda/2.2.0/icons/home.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/docs/agenda/2.2.0/icons/search.svg b/docs/agenda/2.2.0/icons/search.svg deleted file mode 100644 index ccc84b6..0000000 --- a/docs/agenda/2.2.0/icons/search.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/docs/agenda/2.2.0/index.html b/docs/agenda/2.2.0/index.html deleted file mode 100644 index 87a3b27..0000000 --- a/docs/agenda/2.2.0/index.html +++ /dev/null @@ -1,936 +0,0 @@ - - - - - - - - - Home - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- - - - - - - - - - - - -
-
-

- Agenda -

-

- A light-weight job scheduling library for Node.js -

-

- Slack Status - Build Status - dependencies Status - devDependencies Status - Coverage Status -
-
-
-

-

Agenda offers

-
    -
  • Minimal overhead. Agenda aims to keep its code base small.
  • -
  • Mongo backed persistence layer.
  • -
  • Promises based API.
  • -
  • Scheduling with configurable priority, concurrency, and repeating.
  • -
  • Scheduling via cron or human readable syntax.
  • -
  • Event backed job queue that you can hook into.
  • -
  • Agendash: optional standalone web-interface.
  • -
  • Agenda-rest: optional standalone REST API.
  • -
  • inversify-agenda - Some utilities for the development of agenda workers with Inversify
  • -
-

Feature Comparison

-

Since there are a few job queue solutions, here a table comparing them to help you use the one that -better suits your needs.

-

Agenda is great if you need something that is simple and backed by MongoDB.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FeatureBullBeeAgenda
Backendredisredismongo
Prioritiesβœ“βœ“
Concurrencyβœ“βœ“βœ“
Delayed jobsβœ“βœ“
Global eventsβœ“
Rate Limiterβœ“
Pause/Resumeβœ“
Sandboxed workerβœ“
Repeatable jobsβœ“βœ“
Atomic opsβœ“βœ“
Persistenceβœ“βœ“βœ“
UIβœ“βœ“
REST APIβœ“
Optimized forJobs / MessagesJobsMessages
-

Kudos for making the comparison chart goes to Bull maintainers.

-

Installation

-

Install via NPM

-
npm install agenda
-
-

You will also need a working Mongo database (v3) to point it to.

-

Example Usage

-
const mongoConnectionString = 'mongodb://127.0.0.1/agenda';
-
-const agenda = new Agenda({db: {address: mongoConnectionString}});
-
-// Or override the default collection name:
-// const agenda = new Agenda({db: {address: mongoConnectionString, collection: 'jobCollectionName'}});
-
-// or pass additional connection options:
-// const agenda = new Agenda({db: {address: mongoConnectionString, collection: 'jobCollectionName', options: {ssl: true}}});
-
-// or pass in an existing mongodb-native MongoClient instance
-// const agenda = new Agenda({mongo: myMongoClient});
-
-agenda.define('delete old users', async job => {
-  await User.remove({lastLogIn: {$lt: twoDaysAgo}});
-});
-
-(async function() { // IIFE to give access to async/await
-  await agenda.start();
-
-  await agenda.every('3 minutes', 'delete old users');
-
-  // Alternatively, you could also do:
-  await agenda.every('*/3 * * * *', 'delete old users');
-})();
-
-
agenda.define('send email report', {priority: 'high', concurrency: 10}, async job => {
-  const {to} = job.attrs.data;
-  await emailClient.send({
-    to,
-    from: 'example@example.com',
-    subject: 'Email Report',
-    body: '...'
-  });
-});
-
-(async function() {
-  await agenda.start();
-  await agenda.schedule('in 20 minutes', 'send email report', {to: 'admin@example.com'});
-})();
-
-
(async function() {
-  const weeklyReport = agenda.create('send email report', {to: 'example@example.com'});
-  await agenda.start();
-  await weeklyReport.repeatEvery('1 week').save();
-})();
-
-

Full documentation

-

Agenda's basic control structure is an instance of an agenda. Agenda's are -mapped to a database collection and load the jobs from within.

-

Table of Contents

- -

Configuring an agenda

-

All configuration methods are chainable, meaning you can do something like:

-
const agenda = new Agenda();
-agenda
-  .database(...)
-  .processEvery('3 minutes')
-  ...;
-
-

Agenda uses Human Interval for specifying the intervals. It supports the following units:

-

seconds, minutes, hours, days,weeks, months -- assumes 30 days, years -- assumes 365 days

-

More sophisticated examples

-
agenda.processEvery('one minute');
-agenda.processEvery('1.5 minutes');
-agenda.processEvery('3 days and 4 hours');
-agenda.processEvery('3 days, 4 hours and 36 seconds');
-
-

database(url, [collectionName])

-

Specifies the database at the url specified. If no collection name is given, -agendaJobs is used.

-
agenda.database('localhost:27017/agenda-test', 'agendaJobs');
-
-

You can also specify it during instantiation.

-
const agenda = new Agenda({db: {address: 'localhost:27017/agenda-test', collection: 'agendaJobs'}});
-
-

Agenda will emit a ready event (see Agenda Events) when properly connected to the database. -It is safe to call agenda.start() without waiting for this event, as this is handled internally. -If you're using the db options, or call database, then you may still need to listen for ready before saving jobs.

-

mongo(dbInstance)

-

Use an existing mongodb-native MongoClient/Db instance. This can help consolidate connections to a -database. You can instead use .database to have agenda handle connecting for you.

-

You can also specify it during instantiation:

-
const agenda = new Agenda({mongo: mongoClientInstance.db('agenda-test')});
-
-

Note that MongoClient.connect() returns a mongoClientInstance since node-mongodb-native 3.0.0, while it used to return a dbInstance that could then be directly passed to agenda.

-

name(name)

-

Takes a string name and sets lastModifiedBy to it in the job database. -Useful for if you have multiple job processors (agendas) and want to see which -job queue last ran the job.

-
agenda.name(os.hostname + '-' + process.pid);
-
-

You can also specify it during instantiation

-
const agenda = new Agenda({name: 'test queue'});
-
-

processEvery(interval)

-

Takes a string interval which can be either a traditional javascript number, -or a string such as 3 minutes

-

Specifies the frequency at which agenda will query the database looking for jobs -that need to be processed. Agenda internally uses setTimeout to guarantee that -jobs run at (close to ~3ms) the right time.

-

Decreasing the frequency will result in fewer database queries, but more jobs -being stored in memory.

-

Also worth noting is that if the job queue is shutdown, any jobs stored in memory -that haven't run will still be locked, meaning that you may have to wait for the -lock to expire. By default it is '5 seconds'.

-
agenda.processEvery('1 minute');
-
-

You can also specify it during instantiation

-
const agenda = new Agenda({processEvery: '30 seconds'});
-
-

maxConcurrency(number)

-

Takes a number which specifies the max number of jobs that can be running at -any given moment. By default it is 20.

-
agenda.maxConcurrency(20);
-
-

You can also specify it during instantiation

-
const agenda = new Agenda({maxConcurrency: 20});
-
-

defaultConcurrency(number)

-

Takes a number which specifies the default number of a specific job that can be running at -any given moment. By default it is 5.

-
agenda.defaultConcurrency(5);
-
-

You can also specify it during instantiation

-
const agenda = new Agenda({defaultConcurrency: 5});
-
-

lockLimit(number)

-

Takes a number which specifies the max number jobs that can be locked at any given moment. By default it is 0 for no max.

-
agenda.lockLimit(0);
-
-

You can also specify it during instantiation

-
const agenda = new Agenda({lockLimit: 0});
-
-

defaultLockLimit(number)

-

Takes a number which specifies the default number of a specific job that can be locked at any given moment. By default it is 0 for no max.

-
agenda.defaultLockLimit(0);
-
-

You can also specify it during instantiation

-
const agenda = new Agenda({defaultLockLimit: 0});
-
-

defaultLockLifetime(number)

-

Takes a number which specifies the default lock lifetime in milliseconds. By -default it is 10 minutes. This can be overridden by specifying the -lockLifetime option to a defined job.

-

A job will unlock if it is finished (ie. the returned Promise resolves/rejects -or done is specified in the params and done() is called) before the -lockLifetime. The lock is useful if the job crashes or times out.

-
agenda.defaultLockLifetime(10000);
-
-

You can also specify it during instantiation

-
const agenda = new Agenda({defaultLockLifetime: 10000});
-
-

sort(query)

-

Takes a query which specifies the sort query to be used for finding and locking the next job.

-

By default it is { nextRunAt: 1, priority: -1 }, which obeys a first in first out approach, with respect to priority.

-

Agenda Events

-

An instance of an agenda will emit the following events:

-
    -
  • ready - called when Agenda mongo connection is successfully opened and indices created. -If you're passing agenda an existing connection, you shouldn't need to listen for this, as agenda.start() will not resolve until indices have been created. -If you're using the db options, or call database, then you may still need to listen for the ready event before saving jobs. agenda.start() will still wait for the connection to be opened.
  • -
  • error - called when Agenda mongo connection process has thrown an error
  • -
-
await agenda.start();
-
-

Defining Job Processors

-

Before you can use a job, you must define its processing behavior.

-

define(jobName, [options], fn)

-

Defines a job with the name of jobName. When a job of jobName gets run, it -will be passed to fn(job, done). To maintain asynchronous behavior, you may -either provide a Promise-returning function in fn or provide done as a -second parameter to fn. If done is specified in the function signature, you -must call done() when you are processing the job. If your function is -synchronous or returns a Promise, you may omit done from the signature.

-

options is an optional argument which can overwrite the defaults. It can take -the following:

-
    -
  • concurrency: number maximum number of that job that can be running at once (per instance of agenda)
  • -
  • lockLimit: number maximum number of that job that can be locked at once (per instance of agenda)
  • -
  • lockLifetime: number interval in ms of how long the job stays locked for (see multiple job processors for more info). -A job will automatically unlock once a returned promise resolves/rejects (or if done is specified in the signature and done() is called).
  • -
  • priority: (lowest|low|normal|high|highest|number) specifies the priority -of the job. Higher priority jobs will run first. See the priority mapping -below
  • -
-

Priority mapping:

-
{
-  highest: 20,
-  high: 10,
-  normal: 0,
-  low: -10,
-  lowest: -20
-}
-
-

Async Job:

-
agenda.define('some long running job', async job => {
-  const data = await doSomelengthyTask();
-  await formatThatData(data);
-  await sendThatData(data);
-});
-
-

Async Job (using done):

-
agenda.define('some long running job', (job, done) => {
-  doSomelengthyTask(data => {
-    formatThatData(data);
-    sendThatData(data);
-    done();
-  });
-});
-
-

Sync Job:

-
agenda.define('say hello', job => {
-  console.log('Hello!');
-});
-
-

define() acts like an assignment: if define(jobName, ...) is called multiple times (e.g. every time your script starts), the definition in the last call will overwrite the previous one. Thus, if you define the jobName only once in your code, it's safe for that call to execute multiple times.

-

Creating Jobs

-

every(interval, name, [data], [options])

-

Runs job name at the given interval. Optionally, data and options can be passed in. -Every creates a job of type single, which means that it will only create one -job in the database, even if that line is run multiple times. This lets you put -it in a file that may get run multiple times, such as webserver.js which may -reboot from time to time.

-

interval can be a human-readable format String, a cron format String, or a Number.

-

data is an optional argument that will be passed to the processing function -under job.attrs.data.

-

options is an optional argument that will be passed to job.repeatEvery. -In order to use this argument, data must also be specified.

-

Returns the job.

-
agenda.define('printAnalyticsReport', async job => {
-  const users = await User.doSomethingReallyIntensive();
-  processUserData(users);
-  console.log('I print a report!');
-});
-
-agenda.every('15 minutes', 'printAnalyticsReport');
-
-

Optionally, name could be array of job names, which is convenient for scheduling -different jobs for same interval.

-
agenda.every('15 minutes', ['printAnalyticsReport', 'sendNotifications', 'updateUserRecords']);
-
-

In this case, every returns array of jobs.

-

schedule(when, name, [data])

-

Schedules a job to run name once at a given time. when can be a Date or a -String such as tomorrow at 5pm.

-

data is an optional argument that will be passed to the processing function -under job.attrs.data.

-

Returns the job.

-
agenda.schedule('tomorrow at noon', 'printAnalyticsReport', {userCount: 100});
-
-

Optionally, name could be array of job names, similar to the every method.

-
agenda.schedule('tomorrow at noon', ['printAnalyticsReport', 'sendNotifications', 'updateUserRecords']);
-
-

In this case, schedule returns array of jobs.

-

now(name, [data])

-

Schedules a job to run name once immediately.

-

data is an optional argument that will be passed to the processing function -under job.attrs.data.

-

Returns the job.

-
agenda.now('do the hokey pokey');
-
-

create(jobName, data)

-

Returns an instance of a jobName with data. This does NOT save the job in -the database. See below to learn how to manually work with jobs.

-
const job = agenda.create('printAnalyticsReport', {userCount: 100});
-await job.save();
-console.log('Job successfully saved');
-
-

Managing Jobs

-

jobs(mongodb-native query, mongodb-native sort, mongodb-native limit)

-

Lets you query (then sort and limit the result) all of the jobs in the agenda job's database. These are full mongodb-native find, sort and limit commands. See mongodb-native's documentation for details.

-
const jobs = await agenda.jobs({name: 'printAnalyticsReport'}, {data:-1}, 3);
-// Work with jobs (see below)
-
-

cancel(mongodb-native query)

-

Cancels any jobs matching the passed mongodb-native query, and removes them from the database. Returns a Promise resolving to the number of cancelled jobs, or rejecting on error.

-
const numRemoved = await agenda.cancel({name: 'printAnalyticsReport'});
-
-

This functionality can also be achieved by first retrieving all the jobs from the database using agenda.jobs(), looping through the resulting array and calling job.remove() on each. It is however preferable to use agenda.cancel() for this use case, as this ensures the operation is atomic.

-

purge()

-

Removes all jobs in the database without defined behaviors. Useful if you change a definition name and want to remove old jobs. Returns a Promise resolving to the number of removed jobs, or rejecting on error.

-

IMPORTANT: Do not run this before you finish defining all of your jobs. If you do, you will nuke your database of jobs.

-
const numRemoved = await agenda.purge();
-
-

Starting the job processor

-

To get agenda to start processing jobs from the database you must start it. This -will schedule an interval (based on processEvery) to check for new jobs and -run them. You can also stop the queue.

-

start

-

Starts the job queue processing, checking processEvery time to see if there -are new jobs. Must be called after processEvery, and before any job scheduling (e.g. every).

-

stop

-

Stops the job queue processing. Unlocks currently running jobs.

-

This can be very useful for graceful shutdowns so that currently running/grabbed jobs are abandoned so that other -job queues can grab them / they are unlocked should the job queue start again. Here is an example of how to do a graceful -shutdown.

-
async function graceful() {
-  await agenda.stop();
-  process.exit(0);
-}
-
-process.on('SIGTERM', graceful);
-process.on('SIGINT' , graceful);
-
-

Multiple job processors

-

Sometimes you may want to have multiple node instances / machines process from -the same queue. Agenda supports a locking mechanism to ensure that multiple -queues don't process the same job.

-

You can configure the locking mechanism by specifying lockLifetime as an -interval when defining the job.

-
agenda.define('someJob', {lockLifetime: 10000}, (job, cb) => {
-  // Do something in 10 seconds or less...
-});
-
-

This will ensure that no other job processor (this one included) attempts to run the job again -for the next 10 seconds. If you have a particularly long running job, you will want to -specify a longer lockLifetime.

-

By default it is 10 minutes. Typically you shouldn't have a job that runs for 10 minutes, -so this is really insurance should the job queue crash before the job is unlocked.

-

When a job is finished (i.e. the returned promise resolves/rejects or done is -specified in the signature and done() is called), it will automatically unlock.

-

Manually working with a job

-

A job instance has many instance methods. All mutating methods must be followed -with a call to await job.save() in order to persist the changes to the database.

-

repeatEvery(interval, [options])

-

Specifies an interval on which the job should repeat. The job runs at the time of defining as well in configured intervals, that is "run now and in intervals".

-

interval can be a human-readable format String, a cron format String, or a Number.

-

options is an optional argument containing:

-

options.timezone: should be a string as accepted by moment-timezone and is considered when using an interval in the cron string format.

-

options.skipImmediate: true | false (default) Setting this true will skip the immediate run. The first run will occur only in configured interval.

-
job.repeatEvery('10 minutes');
-await job.save();
-
-
job.repeatEvery('3 minutes', {
-  skipImmediate: true
-});
-await job.save();
-
-
job.repeatEvery('0 6 * * *', {
-  timezone: 'America/New_York'
-});
-await job.save();
-
-

repeatAt(time)

-

Specifies a time when the job should repeat. Possible values

-
job.repeatAt('3:30pm');
-await job.save();
-
-

schedule(time)

-

Specifies the next time at which the job should run.

-
job.schedule('tomorrow at 6pm');
-await job.save();
-
-

priority(priority)

-

Specifies the priority weighting of the job. Can be a number or a string from -the above priority table.

-
job.priority('low');
-await job.save();
-
-

unique(properties, [options])

-

Ensure that only one instance of this job exists with the specified properties

-

options is an optional argument which can overwrite the defaults. It can take -the following:

-
    -
  • insertOnly: boolean will prevent any properties from persisting if the job already exists. Defaults to false.
  • -
-
job.unique({'data.type': 'active', 'data.userId': '123', nextRunAt(date)});
-await job.save();
-
-

IMPORTANT: To avoid high CPU usage by MongoDB, make sure to create an index on the used fields, like data.type and data.userId for the example above.

-

fail(reason)

-

Sets job.attrs.failedAt to now, and sets job.attrs.failReason to reason.

-

Optionally, reason can be an error, in which case job.attrs.failReason will -be set to error.message

-
job.fail('insufficient disk space');
-// or
-job.fail(new Error('insufficient disk space'));
-await job.save();
-
-

run(callback)

-

Runs the given job and calls callback(err, job) upon completion. Normally -you never need to call this manually.

-
job.run((err, job) => {
-  console.log('I don\'t know why you would need to do this...');
-});
-
-

save()

-

Saves the job.attrs into the database. Returns a Promise resolving to a Job instance, or rejecting on error.

-
try {
-  await job.save();
-  cosole.log('Successfully saved job to collection');
-} catch (e) {
-  console.error('Error saving job to collection');
-}
-
-

remove()

-

Removes the job from the database. Returns a Promise resolving to the number of jobs removed, or rejecting on error.

-
try {
-  await job.remove();
-  console.log('Successfully removed job from collection');
-} catch (e) {
-  console.error('Error removing job from collection');
-}
-
-

disable()

-

Disables the job. Upcoming runs won't execute.

-

enable()

-

Enables the job if it got disabled before. Upcoming runs will execute.

-

touch()

-

Resets the lock on the job. Useful to indicate that the job hasn't timed out -when you have very long running jobs. The call returns a promise that resolves -when the job's lock has been renewed.

-
agenda.define('super long job', async job => {
-  await doSomeLongTask();
-  await job.touch();
-  await doAnotherLongTask();
-  await job.touch();
-  await finishOurLongTasks();
-});
-
-

Job Queue Events

-

An instance of an agenda will emit the following events:

-
    -
  • start - called just before a job starts
  • -
  • start:job name - called just before the specified job starts
  • -
-
agenda.on('start', job => {
-  console.log('Job %s starting', job.attrs.name);
-});
-
-
    -
  • complete - called when a job finishes, regardless of if it succeeds or fails
  • -
  • complete:job name - called when a job finishes, regardless of if it succeeds or fails
  • -
-
agenda.on('complete', job => {
-  console.log(`Job ${job.attrs.name} finished`);
-});
-
-
    -
  • success - called when a job finishes successfully
  • -
  • success:job name - called when a job finishes successfully
  • -
-
agenda.on('success:send email', job => {
-  console.log(`Sent Email Successfully to ${job.attrs.data.to}`);
-});
-
-
    -
  • fail - called when a job throws an error
  • -
  • fail:job name - called when a job throws an error
  • -
-
agenda.on('fail:send email', (err, job) => {
-  console.log(`Job failed with error: ${err.message}`);
-});
-
-

Frequently Asked Questions

-

What is the order in which jobs run?

-

Jobs are run with priority in a first in first out order (so they will be run in the order they were scheduled AND with respect to highest priority).

-

For example, if we have two jobs named "send-email" queued (both with the same priority), and the first job is queued at 3:00 PM and second job is queued at 3:05 PM with the same priority value, then the first job will run first if we start to send "send-email" jobs at 3:10 PM. However if the first job has a priority of 5 and the second job has a priority of 10, then the second will run first (priority takes precedence) at 3:10 PM.

-

The default MongoDB sort object is { nextRunAt: 1, priority: -1 } and can be changed through the option sort when configuring Agenda.

-

What is the difference between lockLimit and maxConcurrency?

-

Agenda will lock jobs 1 by one, setting the lockedAt property in mongoDB, and creating an instance of the Job class which it caches into the _lockedJobs array. This defaults to having no limit, but can be managed using lockLimit. If all jobs will need to be run before agenda's next interval (set via agenda.processEvery), then agenda will attempt to lock all jobs.

-

Agenda will also pull jobs from _lockedJobs and into _runningJobs. These jobs are actively being worked on by user code, and this is limited by maxConcurrency (defaults to 20).

-

If you have multiple instances of agenda processing the same job definition with a fast repeat time you may find they get unevenly loaded. This is because they will compete to lock as many jobs as possible, even if they don't have enough concurrency to process them. This can be resolved by tweaking the maxConcurrency and lockLimit properties.

-

Sample Project Structure?

-

Agenda doesn't have a preferred project structure and leaves it to the user to -choose how they would like to use it. That being said, you can check out the -example project structure below.

-

Can I Donate?

-

Thanks! I'm flattered, but it's really not necessary. If you really want to, you can find my gittip here.

-

Web Interface?

-

Agenda itself does not have a web interface built in but we do offer stand-alone web interface Agendash:

-

Agendash interface

-

Mongo vs Redis

-

The decision to use Mongo instead of Redis is intentional. Redis is often used for -non-essential data (such as sessions) and without configuration doesn't -guarantee the same level of persistence as Mongo (should the server need to be -restarted/crash).

-

Agenda decides to focus on persistence without requiring special configuration -of Redis (thereby degrading the performance of the Redis server on non-critical -data, such as sessions).

-

Ultimately if enough people want a Redis driver instead of Mongo, I will write -one. (Please open an issue requesting it). For now, Agenda decided to focus on -guaranteed persistence.

-

Spawning / forking processes

-

Ultimately Agenda can work from a single job queue across multiple machines, node processes, or forks. If you are interested in having more than one worker, Bars3s has written up a fantastic example of how one might do it:

-
const cluster = require('cluster');
-const os = require('os');
-
-const httpServer = require('./app/http-server');
-const jobWorker = require('./app/job-worker');
-
-const jobWorkers = [];
-const webWorkers = [];
-
-if (cluster.isMaster) {
-  const cpuCount = os.cpus().length;
-  // Create a worker for each CPU
-  for (let i = 0; i < cpuCount; i += 1) {
-    addJobWorker();
-    addWebWorker();
-  }
-
-  cluster.on('exit', (worker, code, signal) => {
-    if (jobWorkers.indexOf(worker.id) !== -1) {
-      console.log(`job worker ${worker.process.pid} exited (signal: ${signal}). Trying to respawn...`);
-      removeJobWorker(worker.id);
-      addJobWorker();
-    }
-
-    if (webWorkers.indexOf(worker.id) !== -1) {
-      console.log(`http worker ${worker.process.pid} exited (signal: ${signal}). Trying to respawn...`);
-      removeWebWorker(worker.id);
-      addWebWorker();
-    }
-  });
-} else {
-  if (process.env.web) {
-    console.log(`start http server: ${cluster.worker.id}`);
-    // Initialize the http server here
-    httpServer.start();
-  }
-
-  if (process.env.job) {
-    console.log(`start job server: ${cluster.worker.id}`);
-    // Initialize the Agenda here
-    jobWorker.start();
-  }
-}
-
-function addWebWorker() {
-  webWorkers.push(cluster.fork({web: 1}).id);
-}
-
-function addJobWorker() {
-  jobWorkers.push(cluster.fork({job: 1}).id);
-}
-
-function removeWebWorker(id) {
-  webWorkers.splice(webWorkers.indexOf(id), 1);
-}
-
-function removeJobWorker(id) {
-  jobWorkers.splice(jobWorkers.indexOf(id), 1);
-}
-
-

Recovering lost Mongo connections ("auto_reconnect")

-

Agenda is configured by default to automatically reconnect indefinitely, emitting an error event -when no connection is available on each process tick, allowing you to restore the Mongo -instance without having to restart the application.

-

However, if you are using an existing Mongo client -you'll need to configure the reconnectTries and reconnectInterval connection settings -manually, otherwise you'll find that Agenda will throw an error with the message "MongoDB connection is not recoverable, -application restart required" if the connection cannot be recovered within 30 seconds.

-

Example Project Structure

-

Agenda will only process jobs that it has definitions for. This allows you to -selectively choose which jobs a given agenda will process.

-

Consider the following project structure, which allows us to share models with -the rest of our code base, and specify which jobs a worker processes, if any at -all.

-
- server.js
-- worker.js
-lib/
-  - agenda.js
-  controllers/
-    - user-controller.js
-  jobs/
-    - email.js
-    - video-processing.js
-    - image-processing.js
-   models/
-     - user-model.js
-     - blog-post.model.js
-
-

Sample job processor (eg. jobs/email.js)

-
let email = require('some-email-lib'),
-  User = require('../models/user-model.js');
-
-module.exports = function(agenda) {
-  agenda.define('registration email', async job => {
-    const user = await User.get(job.attrs.data.userId);
-    await email(user.email(), 'Thanks for registering', 'Thanks for registering ' + user.name());
-  });
-
-  agenda.define('reset password', async job => {
-    // Etc
-  });
-
-  // More email related jobs
-};
-
-

lib/agenda.js

-
const Agenda = require('agenda');
-
-const connectionOpts = {db: {address: 'localhost:27017/agenda-test', collection: 'agendaJobs'}};
-
-const agenda = new Agenda(connectionOpts);
-
-const jobTypes = process.env.JOB_TYPES ? process.env.JOB_TYPES.split(',') : [];
-
-jobTypes.forEach(type => {
-  require('./lib/jobs/' + type)(agenda);
-});
-
-if (jobTypes.length) {
-  agenda.start(); // Returns a promise, which should be handled appropriately
-}
-
-module.exports = agenda;
-
-

lib/controllers/user-controller.js

-
let app = express(),
-  User = require('../models/user-model'),
-  agenda = require('../worker.js');
-
-app.post('/users', (req, res, next) => {
-  const user = new User(req.body);
-  user.save(err => {
-    if (err) {
-      return next(err);
-    }
-    agenda.now('registration email', {userId: user.primary()});
-    res.send(201, user.toJson());
-  });
-});
-
-

worker.js

-
require('./lib/agenda.js');
-
-

Now you can do the following in your project:

-
node server.js
-
-

Fire up an instance with no JOB_TYPES, giving you the ability to process jobs, -but not wasting resources processing jobs.

-
JOB_TYPES=email node server.js
-
-

Allow your http server to process email jobs.

-
JOB_TYPES=email node worker.js
-
-

Fire up an instance that processes email jobs.

-
JOB_TYPES=video-processing,image-processing node worker.js
-
-

Fire up an instance that processes video-processing/image-processing jobs. Good for a heavy hitting server.

-

Debugging Issues

-

If you think you have encountered a bug, please feel free to report it here:

-

Submit Issue

-

Please provide us with as much details as possible such as:

-
    -
  • Agenda version
  • -
  • Environment (OSX, Linux, Windows, etc)
  • -
  • Small description of what happened
  • -
  • Any relevant stack track
  • -
  • Agenda logs (see below)
  • -
-

To turn on logging, please set your DEBUG env variable like so:

-
    -
  • OSX: DEBUG="agenda:*" node index.js
  • -
  • Linux: DEBUG="agenda:*" node index.js
  • -
  • Windows CMD: set DEBUG=agenda:*
  • -
  • Windows PowerShell: $env:DEBUG = "agenda:*"
  • -
-

While not necessary, attaching a text file with this debug information would -be extremely useful in debugging certain issues and is encouraged.

-

Known Issues

-

"Multiple order-by items are not supported. Please specify a single order-by item."

-

When running Agenda on Azure cosmosDB, you might run into this issue caused by Agenda's sort query used for finding and locking the next job. To fix this, you can pass custom sort option: sort: { nextRunAt: 1 }

-

Acknowledgements

- -

License

-

The MIT License

-
-
- - - - - -
- -
- - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/2.2.0/job_compute-next-run-at.js.html b/docs/agenda/2.2.0/job_compute-next-run-at.js.html deleted file mode 100644 index 99024e4..0000000 --- a/docs/agenda/2.2.0/job_compute-next-run-at.js.html +++ /dev/null @@ -1,210 +0,0 @@ - - - - - - - - - - - job/compute-next-run-at.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/compute-next-run-at.js -

- - - - - -
-
-
'use strict';
-const humanInterval = require('human-interval');
-const {CronTime} = require('cron');
-const moment = require('moment-timezone');
-const date = require('date.js');
-const debug = require('debug')('agenda:job');
-
-/**
- * Internal method used to compute next time a job should run and sets the proper values
- * @name Job#computeNextRunAt
- * @function
- * @returns {exports} instance of Job instance
- */
-module.exports = function() {
-  const interval = this.attrs.repeatInterval;
-  const timezone = this.attrs.repeatTimezone;
-  const {repeatAt} = this.attrs;
-  this.attrs.nextRunAt = undefined;
-
-  const dateForTimezone = date => {
-    date = moment(date);
-    if (timezone !== null) {
-      date.tz(timezone);
-    }
-
-    return date;
-  };
-
-  /**
-   * Internal method that computes the interval
-   * @returns {undefined}
-   */
-  const computeFromInterval = () => {
-    debug('[%s:%s] computing next run via interval [%s]', this.attrs.name, this.attrs._id, interval);
-    let lastRun = this.attrs.lastRunAt || new Date();
-    lastRun = dateForTimezone(lastRun);
-    try {
-      const cronTime = new CronTime(interval);
-      let nextDate = cronTime._getNextDateFrom(lastRun);
-      if (nextDate.valueOf() === lastRun.valueOf()) {
-        // Handle cronTime giving back the same date for the next run time
-        nextDate = cronTime._getNextDateFrom(dateForTimezone(new Date(lastRun.valueOf() + 1000)));
-      }
-
-      this.attrs.nextRunAt = nextDate;
-      debug('[%s:%s] nextRunAt set to [%s]', this.attrs.name, this.attrs._id, new Date(this.attrs.nextRunAt).toISOString());
-    // Either `xo` linter or Node.js 8 stumble on this line if it isn't just ignored
-    } catch (error) { // eslint-disable-line no-unused-vars
-      // Nope, humanInterval then!
-      try {
-        if (!this.attrs.lastRunAt && humanInterval(interval)) {
-          this.attrs.nextRunAt = lastRun.valueOf();
-          debug('[%s:%s] nextRunAt set to [%s]', this.attrs.name, this.attrs._id, new Date(this.attrs.nextRunAt).toISOString());
-        } else {
-          this.attrs.nextRunAt = lastRun.valueOf() + humanInterval(interval);
-          debug('[%s:%s] nextRunAt set to [%s]', this.attrs.name, this.attrs._id, new Date(this.attrs.nextRunAt).toISOString());
-        }
-      // Either `xo` linter or Node.js 8 stumble on this line if it isn't just ignored
-      } catch (error) {} // eslint-disable-line no-unused-vars
-    } finally {
-      if (isNaN(this.attrs.nextRunAt)) {
-        this.attrs.nextRunAt = undefined;
-        debug('[%s:%s] failed to calculate nextRunAt due to invalid repeat interval', this.attrs.name, this.attrs._id);
-        this.fail('failed to calculate nextRunAt due to invalid repeat interval');
-      }
-    }
-  };
-
-  /**
-   * Internal method to compute next run time from the repeat string
-   * @returns {undefined}
-   */
-  function computeFromRepeatAt() {
-    const lastRun = this.attrs.lastRunAt || new Date();
-    const nextDate = date(repeatAt).valueOf();
-
-    // If you do not specify offset date for below test it will fail for ms
-    const offset = Date.now();
-    if (offset === date(repeatAt, offset).valueOf()) {
-      this.attrs.nextRunAt = undefined;
-      debug('[%s:%s] failed to calculate repeatAt due to invalid format', this.attrs.name, this.attrs._id);
-      this.fail('failed to calculate repeatAt time due to invalid format');
-    } else if (nextDate.valueOf() === lastRun.valueOf()) {
-      this.attrs.nextRunAt = date('tomorrow at ', repeatAt);
-      debug('[%s:%s] nextRunAt set to [%s]', this.attrs.name, this.attrs._id, this.attrs.nextRunAt.toISOString());
-    } else {
-      this.attrs.nextRunAt = date(repeatAt);
-      debug('[%s:%s] nextRunAt set to [%s]', this.attrs.name, this.attrs._id, this.attrs.nextRunAt.toISOString());
-    }
-  }
-
-  if (interval) {
-    computeFromInterval.call(this);
-  } else if (repeatAt) {
-    computeFromRepeatAt.call(this);
-  }
-
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/job_disable.js.html b/docs/agenda/2.2.0/job_disable.js.html deleted file mode 100644 index 676fac0..0000000 --- a/docs/agenda/2.2.0/job_disable.js.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - job/disable.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/disable.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Prevents the job type from running
- * @name Job#disable
- * @function
- * @returns {exports} instance of Job
- */
-module.exports = function() {
-  this.attrs.disabled = true;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/job_enable.js.html b/docs/agenda/2.2.0/job_enable.js.html deleted file mode 100644 index 73e0215..0000000 --- a/docs/agenda/2.2.0/job_enable.js.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - job/enable.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/enable.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Allows job type to run
- * @name Job#enable
- * @function
- * @returns {Job} instance of Job
- */
-module.exports = function() {
-  this.attrs.disabled = false;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/job_fail.js.html b/docs/agenda/2.2.0/job_fail.js.html deleted file mode 100644 index f787e19..0000000 --- a/docs/agenda/2.2.0/job_fail.js.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - job/fail.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/fail.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:job');
-
-/**
- * Fails the job with a reason (error) specified
- * @name Job#fail
- * @function
- * @param {Error|String} reason reason job failed
- * @returns {exports} instance of Job
- */
-module.exports = function(reason) {
-  if (reason instanceof Error) {
-    reason = reason.message;
-  }
-
-  this.attrs.failReason = reason;
-  this.attrs.failCount = (this.attrs.failCount || 0) + 1;
-  const now = new Date();
-  this.attrs.failedAt = now;
-  this.attrs.lastFinishedAt = now;
-  debug('[%s:%s] fail() called [%d] times so far', this.attrs.name, this.attrs._id, this.attrs.failCount);
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/job_index.js.html b/docs/agenda/2.2.0/job_index.js.html deleted file mode 100644 index be33118..0000000 --- a/docs/agenda/2.2.0/job_index.js.html +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - - - - - - job/index.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/index.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Internal method to turn priority into a number
- * @param {String|Number} priority string to parse into number
- * @returns {Number} priority that was parsed
- */
-const parsePriority = priority => {
-  const priorityMap = {
-    lowest: -20,
-    low: -10,
-    normal: 0,
-    high: 10,
-    highest: 20
-  };
-  if (typeof priority === 'number' || priority instanceof Number) {
-    return priority;
-  }
-
-  return priorityMap[priority];
-};
-
-/**
- * @class
- * @param {Object} args - Job Options
- * @property {Object} agenda - The Agenda instance
- * @property {Object} attrs
- */
-class Job {
-  constructor(args) {
-    args = args || {};
-
-    // Remove special args
-    this.agenda = args.agenda;
-    delete args.agenda;
-
-    // Process args
-    args.priority = parsePriority(args.priority) || 0;
-
-    // Set attrs to args
-    const attrs = {};
-    for (const key in args) {
-      if ({}.hasOwnProperty.call(args, key)) {
-        attrs[key] = args[key];
-      }
-    }
-
-    // Set defaults if undefined
-    // NOTE: What is the difference between 'once' here and 'single' in agenda/index.js?
-    attrs.nextRunAt = attrs.nextRunAt || new Date();
-    attrs.type = attrs.type || 'once';
-    this.attrs = attrs;
-  }
-}
-
-Job.prototype.toJSON = require('./to-json');
-Job.prototype.computeNextRunAt = require('./compute-next-run-at');
-Job.prototype.repeatEvery = require('./repeat-every');
-Job.prototype.repeatAt = require('./repeat-at');
-Job.prototype.disable = require('./disable');
-Job.prototype.enable = require('./enable');
-Job.prototype.unique = require('./unique');
-Job.prototype.schedule = require('./schedule');
-Job.prototype.priority = require('./priority');
-Job.prototype.fail = require('./fail');
-Job.prototype.run = require('./run');
-Job.prototype.isRunning = require('./is-running');
-Job.prototype.save = require('./save');
-Job.prototype.remove = require('./remove');
-Job.prototype.touch = require('./touch');
-
-module.exports = Job;
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/job_is-running.js.html b/docs/agenda/2.2.0/job_is-running.js.html deleted file mode 100644 index 9340d6f..0000000 --- a/docs/agenda/2.2.0/job_is-running.js.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - - - - - job/is-running.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/is-running.js -

- - - - - -
-
-
'use strict';
-
-/**
- * A job is running if:
- * (lastRunAt exists AND lastFinishedAt does not exist)
- * OR
- * (lastRunAt exists AND lastFinishedAt exists but the lastRunAt is newer [in time] than lastFinishedAt)
- * @name Job#isRunning
- * @function
- * @returns {Boolean} Whether or not job is running at the moment (true for running)
- */
-module.exports = function() {
-  if (!this.attrs.lastRunAt) {
-    return false;
-  }
-
-  if (!this.attrs.lastFinishedAt) {
-    return true;
-  }
-
-  if (this.attrs.lockedAt && this.attrs.lastRunAt.getTime() > this.attrs.lastFinishedAt.getTime()) {
-    return true;
-  }
-
-  return false;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/job_priority.js.html b/docs/agenda/2.2.0/job_priority.js.html deleted file mode 100644 index 1ccf077..0000000 --- a/docs/agenda/2.2.0/job_priority.js.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - - - - job/priority.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/priority.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Internal method to turn priority into a number
- * @name Job#priority
- * @function
- * @param {String|Number} priority string to parse into number
- * @returns {Number} priority that was parsed
- */
-const parsePriority = priority => {
-  const priorityMap = {
-    lowest: -20,
-    low: -10,
-    normal: 0,
-    high: 10,
-    highest: 20
-  };
-  if (typeof priority === 'number' || priority instanceof Number) {
-    return priority;
-  }
-
-  return priorityMap[priority];
-};
-
-/**
- * Sets priority of the job
- * @param {String} priority priority of when job should be queued
- * @returns {exports} instance of Job
- */
-module.exports = function(priority) {
-  this.attrs.priority = parsePriority(priority);
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/job_remove.js.html b/docs/agenda/2.2.0/job_remove.js.html deleted file mode 100644 index 9dd1bdf..0000000 --- a/docs/agenda/2.2.0/job_remove.js.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - - - - job/remove.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/remove.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Remove the job from MongoDB
- * @name Job#remove
- * @function
- * @returns {Promise} resolves when job removal fails or passes
- */
-module.exports = function() {
-  return this.agenda.cancel({_id: this.attrs._id});
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/job_repeat-at.js.html b/docs/agenda/2.2.0/job_repeat-at.js.html deleted file mode 100644 index 188a4ef..0000000 --- a/docs/agenda/2.2.0/job_repeat-at.js.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - job/repeat-at.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/repeat-at.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Sets a job to repeat at a specific time
- * @name Job#repeatAt
- * @function
- * @param {String} time time to repeat job at (human readable or number)
- * @returns {exports} instance of Job
- */
-module.exports = function(time) {
-  this.attrs.repeatAt = time;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/job_repeat-every.js.html b/docs/agenda/2.2.0/job_repeat-every.js.html deleted file mode 100644 index 1c55dd2..0000000 --- a/docs/agenda/2.2.0/job_repeat-every.js.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - - job/repeat-every.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/repeat-every.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Sets a job to repeat every X amount of time
- * @name Job#repeatEvery
- * @function
- * @param {String} interval repeat every X
- * @param {Object} options options to use for job
- * @returns {Job} instance of Job
- */
-module.exports = function(interval, options) {
-  options = options || {};
-  this.attrs.repeatInterval = interval;
-  this.attrs.repeatTimezone = options.timezone ? options.timezone : null;
-  if (options.skipImmediate) {
-    this.attrs.lastRunAt = new Date();
-    this.computeNextRunAt();
-    this.attrs.lastRunAt = undefined;
-  } else {
-    this.computeNextRunAt();
-  }
-
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/job_run.js.html b/docs/agenda/2.2.0/job_run.js.html deleted file mode 100644 index f5eb039..0000000 --- a/docs/agenda/2.2.0/job_run.js.html +++ /dev/null @@ -1,197 +0,0 @@ - - - - - - - - - - - job/run.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/run.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:job');
-
-/**
- * Internal method (RUN)
- * @name Job#run
- * @function
- * @returns {Promise} Resolves when job persistence in MongoDB fails or passes
- */
-module.exports = function() {
-  const self = this;
-  const {agenda} = self;
-  const definition = agenda._definitions[self.attrs.name];
-
-  // @TODO: this lint issue should be looked into: https://eslint.org/docs/rules/no-async-promise-executor
-  // eslint-disable-next-line no-async-promise-executor
-  return new Promise(async(resolve, reject) => {
-    self.attrs.lastRunAt = new Date();
-    debug('[%s:%s] setting lastRunAt to: %s', self.attrs.name, self.attrs._id, self.attrs.lastRunAt.toISOString());
-    self.computeNextRunAt();
-    await self.save();
-
-    let finished = false;
-    const jobCallback = async err => {
-      // We don't want to complete the job multiple times
-      if (finished) {
-        return;
-      }
-
-      finished = true;
-
-      if (err) {
-        self.fail(err);
-      } else {
-        self.attrs.lastFinishedAt = new Date();
-      }
-
-      self.attrs.lockedAt = null;
-
-      await self.save().catch(error => {
-        debug('[%s:%s] failed to be saved to MongoDB', self.attrs.name, self.attrs._id);
-        reject(error);
-      });
-      debug('[%s:%s] was saved successfully to MongoDB', self.attrs.name, self.attrs._id);
-
-      if (err) {
-        agenda.emit('fail', err, self);
-        agenda.emit('fail:' + self.attrs.name, err, self);
-        debug('[%s:%s] has failed [%s]', self.attrs.name, self.attrs._id, err.message);
-      } else {
-        agenda.emit('success', self);
-        agenda.emit('success:' + self.attrs.name, self);
-        debug('[%s:%s] has succeeded', self.attrs.name, self.attrs._id);
-      }
-
-      agenda.emit('complete', self);
-      agenda.emit('complete:' + self.attrs.name, self);
-      debug('[%s:%s] job finished at [%s] and was unlocked', self.attrs.name, self.attrs._id, self.attrs.lastFinishedAt);
-      // Curiously, we still resolve successfully if the job processor failed.
-      // Agenda is not equipped to handle errors originating in user code, so, we leave them to inspect the side-effects of job.fail()
-      resolve(self);
-    };
-
-    try {
-      agenda.emit('start', self);
-      agenda.emit('start:' + self.attrs.name, self);
-      debug('[%s:%s] starting job', self.attrs.name, self.attrs._id);
-      if (!definition) {
-        debug('[%s:%s] has no definition, can not run', self.attrs.name, self.attrs._id);
-        throw new Error('Undefined job');
-      }
-
-      if (definition.fn.length === 2) {
-        debug('[%s:%s] process function being called', self.attrs.name, self.attrs._id);
-        await definition.fn(self, jobCallback);
-      } else {
-        debug('[%s:%s] process function being called', self.attrs.name, self.attrs._id);
-        await definition.fn(self);
-        await jobCallback();
-      }
-    } catch (error) {
-      debug('[%s:%s] unknown error occurred', self.attrs.name, self.attrs._id);
-      await jobCallback(error);
-    }
-  });
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/job_schedule.js.html b/docs/agenda/2.2.0/job_schedule.js.html deleted file mode 100644 index 473f257..0000000 --- a/docs/agenda/2.2.0/job_schedule.js.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - job/schedule.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/schedule.js -

- - - - - -
-
-
'use strict';
-const date = require('date.js');
-
-/**
- * Schedules a job to run at specified time
- * @name Job#schedule
- * @function
- * @param {String} time schedule a job to run "then"
- * @returns {exports} instance of Job
- */
-module.exports = function(time) {
-  const d = new Date(time);
-
-  this.attrs.nextRunAt = Number.isNaN(d.getTime()) ? date(time) : d;
-
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/job_to-json.js.html b/docs/agenda/2.2.0/job_to-json.js.html deleted file mode 100644 index 3104c6e..0000000 --- a/docs/agenda/2.2.0/job_to-json.js.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - - - - - job/to-json.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/to-json.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Given a job, turn it into an object we can store in Mongo
- * @name Job#toJSON
- * @function
- * @returns {Object} json object from Job
- */
-module.exports = function() {
-  const self = this;
-  const attrs = self.attrs || {};
-  const result = {};
-
-  for (const prop in attrs) {
-    if ({}.hasOwnProperty.call(attrs, prop)) {
-      result[prop] = attrs[prop];
-    }
-  }
-
-  const dates = ['lastRunAt', 'lastFinishedAt', 'nextRunAt', 'failedAt', 'lockedAt'];
-  dates.forEach(d => {
-    if (result[d]) {
-      result[d] = new Date(result[d]);
-    }
-  });
-
-  return result;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/job_touch.js.html b/docs/agenda/2.2.0/job_touch.js.html deleted file mode 100644 index 076c8c6..0000000 --- a/docs/agenda/2.2.0/job_touch.js.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - job/touch.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/touch.js -

- - - - - -
-
-
'use strict';
-
-const noCallback = require('../no-callback');
-
-/**
- * Updates "lockedAt" time so the job does not get picked up again
- * @name Job#touch
- * @function
- * @returns {undefined}
- */
-module.exports = async function() {
-  // eslint-disable-next-line prefer-rest-params
-  noCallback(arguments);
-  this.attrs.lockedAt = new Date();
-  return this.save();
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/job_unique.js.html b/docs/agenda/2.2.0/job_unique.js.html deleted file mode 100644 index ea520f5..0000000 --- a/docs/agenda/2.2.0/job_unique.js.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - job/unique.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/unique.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Data to ensure is unique for job to be created
- * @name Job#unique
- * @function
- * @param {Object} unique mongo data query for unique
- * @param {Object} opts unique options
- * @returns {exports} instance of Job
- */
-module.exports = function(unique, opts) {
-  this.attrs.unique = unique;
-  this.attrs.uniqueOpts = opts;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/scripts/linenumber.js b/docs/agenda/2.2.0/scripts/linenumber.js deleted file mode 100644 index ff6c069..0000000 --- a/docs/agenda/2.2.0/scripts/linenumber.js +++ /dev/null @@ -1,24 +0,0 @@ -'use strict'; - -/* global document */ -(function () { - var lineId, lines, totalLines, anchorHash; - var source = document.getElementsByClassName('prettyprint source linenums'); - var i = 0; - var lineNumber = 0; - - if (source && source[0]) { - anchorHash = document.location.hash.substring(1); - lines = source[0].getElementsByTagName('li'); - totalLines = lines.length; - - for (; i < totalLines; i++) { - lineNumber++; - lineId = 'line' + lineNumber; - lines[i].id = lineId; - if (lineId === anchorHash) { - lines[i].className += ' selected'; - } - } - } -})(); diff --git a/docs/agenda/2.2.0/scripts/pagelocation.js b/docs/agenda/2.2.0/scripts/pagelocation.js deleted file mode 100644 index e138368..0000000 --- a/docs/agenda/2.2.0/scripts/pagelocation.js +++ /dev/null @@ -1,89 +0,0 @@ -'use strict'; - -$(document).ready(function () { - var currentSectionNav, target; - - // If an anchor hash is in the URL highlight the menu item - highlightActiveHash(); - // If a specific page section is in the URL highlight the menu item - highlightActiveSection(); - - // If a specific page section is in the URL scroll that section up to the top - currentSectionNav = $('#' + getCurrentSectionName() + '-nav'); - - if (currentSectionNav.position()) { - $('nav').scrollTop(currentSectionNav.position().top); - } - - // function to scroll to anchor when clicking an anchor linl - $('a[href*="#"]:not([href="#"])').click(function () { - /* eslint-disable no-invalid-this */ - if (location.pathname.replace(/^\//, '') === this.pathname.replace(/^\//, '') && location.hostname === this.hostname) { - target = $(this.hash); - target = target.length ? target : $('[name=' + this.hash.slice(1) + ']'); - if (target.length) { - $('html, body').animate({ - scrollTop: target.offset().top - }, 1000); - } - } - /* eslint-enable no-invalid-this */ - }); -}); - -// If a new anchor section is selected, change the hightlighted menu item -$(window).bind('hashchange', function (event) { - highlightActiveHash(event); -}); - -function highlightActiveHash(event) { - var oldUrl, oldSubSectionElement; - - // check for and remove old hash active state - if (event && event.originalEvent.oldURL) { - oldUrl = event.originalEvent.oldURL; - - if (oldUrl.indexOf('#') > -1) { - oldSubSectionElement = $('#' + getCurrentSectionName() + '-' + oldUrl.substring(oldUrl.indexOf('#') + 1) + '-nav'); - - if (oldSubSectionElement) { - oldSubSectionElement.removeClass('active'); - } - } - } - - if (getCurrentHashName()) { - $('#' + getCurrentSectionName() + '-' + getCurrentHashName() + '-nav').addClass('active'); - } -} - -function highlightActiveSection() { - var pageId = getCurrentSectionName(); - - $('#' + pageId + '-nav').addClass('active'); -} - -function getCurrentSectionName() { - var path = window.location.pathname; - var pageUrl = path.split('/').pop(); - - var sectionName = pageUrl.substring(0, pageUrl.indexOf('.')); - - // remove the wodr module- if its in the url - sectionName = sectionName.replace('module-', ''); - - return sectionName; -} - -function getCurrentHashName() { - var pageSubSectionId; - var pageSubSectionHash = window.location.hash; - - if (pageSubSectionHash) { - pageSubSectionId = pageSubSectionHash.substring(1).replace('.', ''); - - return pageSubSectionId; - } - - return false; -} diff --git a/docs/agenda/2.2.0/styles/jsdoc-default.css b/docs/agenda/2.2.0/styles/jsdoc-default.css deleted file mode 100644 index f2bc6a9..0000000 --- a/docs/agenda/2.2.0/styles/jsdoc-default.css +++ /dev/null @@ -1,957 +0,0 @@ -@font-face { - font-family: "Avenir Next W01"; - font-style: normal; - font-weight: 600; - src: url("https://fast.fonts.net/dv2/14/14c73713-e4df-4dba-933b-057feeac8dd1.woff2?d44f19a684109620e484167ba790e8180fd9e29df91d80ce3d096f014db863074e1ea706cf5ed4e1c042492e76df291ce1d24ec684d3d9da9684f55406b9f22bce02f0f30f556681593dafea074d7bd44e28a680d083ccfd44ed4f8a3087a20c56147c11f917ed1dbd85c4a18cf38da25e6ac78f008f472262304d50e7e0cb7541ef1642c676db6e4bde4924846f5daf486fbde9335e98f6a20f6664bc4525253d1d4fca42cf1c490483c8daf0237f6a0fd292563417ad80ca3e69321417747bdc6f0969f34b2a0401b5e2b9a4dfd5b06d9710850900c66b34870aef&projectId=f750d5c7-baa2-4767-afd7-45484f47fe17") format('woff2'); -} - -@font-face { - font-family: "Avenir Next W01"; - font-style: normal; - font-weight: 500; - src: url("https://fast.fonts.net/dv2/14/627fbb5a-3bae-4cd9-b617-2f923e29d55e.woff2?d44f19a684109620e484167ba790e8180fd9e29df91d80ce3d096f014db863074e1ea706cf5ed4e1c042492e76df291ce1d24ec684d3d9da9684f55406b9f22bce02f0f30f556681593dafea074d7bd44e28a680d083ccfd44ed4f8a3087a20c56147c11f917ed1dbd85c4a18cf38da25e6ac78f008f472262304d50e7e0cb7541ef1642c676db6e4bde4924846f5daf486fbde9335e98f6a20f6664bc4525253d1d4fca42cf1c490483c8daf0237f6a0fd292563417ad80ca3e69321417747bdc6f0969f34b2a0401b5e2b9a4dfd5b06d9710850900c66b34870aef&projectId=f750d5c7-baa2-4767-afd7-45484f47fe17") format('woff2'); -} - -@font-face { - font-family: "Avenir Next W01"; - font-style: normal; - font-weight: 400; - src: url("https://fast.fonts.net/dv2/14/2cd55546-ec00-4af9-aeca-4a3cd186da53.woff2?d44f19a684109620e484167ba790e8180fd9e29df91d80ce3d096f014db863074e1ea706cf5ed4e1c042492e76df291ce1d24ec684d3d9da9684f55406b9f22bce02f0f30f556681593dafea074d7bd44e28a680d083ccfd44ed4f8a3087a20c56147c11f917ed1dbd85c4a18cf38da25e6ac78f008f472262304d50e7e0cb7541ef1642c676db6e4bde4924846f5daf486fbde9335e98f6a20f6664bc4525253d1d4fca42cf1c490483c8daf0237f6a0fd292563417ad80ca3e69321417747bdc6f0969f34b2a0401b5e2b9a4dfd5b06d9710850900c66b34870aef&projectId=f750d5c7-baa2-4767-afd7-45484f47fe17") format('woff2'); -} - -@font-face { - font-family: 'bt_mono'; - font-style: normal; - font-weight: 400; - src: url('https://assets.braintreegateway.com/fonts/bt_mono_regular-webfont.eot'); - src: url('https://assets.braintreegateway.com/fonts/bt_mono_regular-webfont.woff2') format('woff2'), url('https://assets.braintreegateway.com/fonts/bt_mono_regular-webfont.woff') format('woff'), url('https://assets.braintreegateway.com/fonts/bt_mono_regular-webfont.ttf') format('truetype'), url('https://assets.braintreegateway.com/fonts/bt_mono_regular-webfont.svg#bt_mono_reqular-webfont') format('svg'); -} - -@font-face { - font-family: 'bt_mono'; - font-style: normal; - font-weight: 500; - src: url('https://assets.braintreegateway.com/fonts/bt_mono_medium-webfont.eot'); - src: url('https://assets.braintreegateway.com/fonts/bt_mono_medium-webfont.woff2') format('woff2'), url('https://assets.braintreegateway.com/fonts/bt_mono_medium-webfont.woff') format('woff'), url('https://assets.braintreegateway.com/fonts/bt_mono_medium-webfont.ttf') format('truetype'), url('https://assets.braintreegateway.com/fonts/bt_mono_medium-webfont.svg#bt_mono_medium-webfont') format('svg'); -} - -@font-face { - font-family: 'bt_mono'; - font-style: normal; - font-weight: 600; - src: url('https://assets.braintreegateway.com/fonts/bt_mono_bold-webfont.eot'); - src: url('https://assets.braintreegateway.com/fonts/bt_mono_bold-webfont.woff2') format('woff2'), url('https://assets.braintreegateway.com/fonts/bt_mono_bold-webfont.woff') format('woff'), url('https://assets.braintreegateway.com/fonts/bt_mono_bold-webfont.ttf') format('truetype'), url('https://assets.braintreegateway.com/fonts/bt_mono_bold-webfont.svg#bt_mono_bold-webfont') format('svg'); -} - -@font-face { - font-family: 'bt_mono'; - font-style: normal; - font-weight: 900; - src: url('https://assets.braintreegateway.com/fonts/bt_mono_heavy-webfont.eot'); - src: url('https://assets.braintreegateway.com/fonts/bt_mono_heavy-webfont.woff2') format('woff2'), url('https://assets.braintreegateway.com/fonts/bt_mono_heavy-webfont.woff') format('woff'), url('https://assets.braintreegateway.com/fonts/bt_mono_heavy-webfont.ttf') format('truetype'), url('https://assets.braintreegateway.com/fonts/bt_mono_heavy-webfont.svg#bt_mono_heavy-webfont') format('svg'); -} - -* { - box-sizing: border-box -} - -html, body { - height: 100%; - width: 100%; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - color: #3e3c42; - text-rendering: optimizeLegibility; - margin: 0; -} - -body { - color: #3e3c42; - background-color: #f3f3f3; - width: 100%; - font: 16px/1.875 "Avenir Next W01", "Avenir Next", "Helvetica Neue", Helvetica, sans-serif; - font-size: 16px; - line-height: 160%; -} - -a, a:active { - color: #0095dd; - text-decoration: none; -} - -a:hover { - text-decoration: underline -} - -p, ul, ol, blockquote { - margin-bottom: 1em; -} - -p { - max-width: 800px; -} - -h1, h2, h3, h4, h5, h6 { - color: #706d77; - font-weight: 500; - margin: 0; - line-height: 1; -} - -h1 { - color: #4b484f; - font-weight: 500; - font-size: 40px; - display: block; -} - -h1 span { - color: #999; - font-size: 32px; - display: block; - line-height: 1.5; -} - -h1.page-title { - border-bottom: 1px dashed #ccc; - margin-bottom: 20px; - padding-bottom: 30px; -} - -h2 { - font-size: 30px; - margin: 1.5em 0 0; -} - -h3 { - font-size: 20px; - margin: 1.5em 0 0; - text-transform: uppercase; -} - -h3.reference-title { - display: block; - font-weight: 400; - margin-top: 2em; - max-width: 200px; -} - -h3.reference-title small { - display: inline-block; - color: #0095dd; - margin-left: 5px; - font-weight: 500; -} - -h3.subsection-title { - border-bottom: 1px solid #ececec; - padding-bottom: 20px; - margin-top: 3em; - margin-bottom: 1em; -} - -h4 { - font-size: 16px; - margin: 1em 0 0; - font-weight: bold; -} - -h4.name { - font-size: 20px; - margin-top: 0; - font-weight: 500; -} - -h5 { - margin: 2em 0 0.5em 0; - font-size: 14px; - font-weight: 500; - text-transform: uppercase; -} - -.container-overview .subsection-title { - font-size: 14px; - text-transform: uppercase; - margin: 8px 0 15px 0; - font-weight: bold; - color: #4D4E53; - padding-top: 10px; -} - -h6 { - font-size: 100%; - letter-spacing: -0.01em; - margin: 6px 0 3px 0; - font-style: italic; - text-transform: uppercase; - font-weight: 500; -} - -tt, code, kbd, samp { - font-family: "Source Code Pro", monospace; - background: #f4f4f4; - padding: 1px 5px; - border-radius: 5px; -} - -.class-description { - margin-bottom: 1em; - margin-top: 1em; - padding: 10px 20px; - background-color: rgba(26, 159, 224, 0.1); -} - -.class-description:empty { - margin: 0 -} - -#main { - background-color: white; - float: right; - min-width: 360px; - width: calc(100% - 300px); - padding: 30px; - z-index: 100; -} - -header { - display: block; - max-width: 1400px; -} - -section { - display: block; - max-width: 1400px; - background-color: #fff; -} - -.variation { - display: none -} - -.signature-attributes { - font-size: 60%; - color: #aaa; - font-style: italic; - font-weight: lighter; -} - -.rule { - width: 100%; - margin-top: 20px; - display: block; - border-top: 1px solid #ccc; -} - -ul { - list-style-type: none; - padding-left: 0; -} - -ul li a { - font-weight: 500; -} - -ul ul { - padding-top: 5px; -} - -ul li ul { - padding-left: 20px; -} - -ul li ul li a { - font-weight: normal; -} - -nav { - float: left; - display: block; - width: 300px; - background: #f7f7f7; - overflow-x: visible; - overflow-y: auto; - height: 100%; - padding: 0px 30px 100px 30px; - height: 100%; - position: fixed; - transition: left 0.2s; - z-index: 998; - margin-top: 0px; - top: 43px; -} - -.navicon-button { - display: inline-block; - position: fixed; - bottom: 1.5em; - right: 1.5em; - z-index: 2; -} - -nav h3 { - font-size: 13px; - text-transform: uppercase; - letter-spacing: 1px; - font-weight: bold; - line-height: 24px; - margin: 40px 0 10px 0; - padding: 0; -} - -nav ul { - font-size: 100%; - line-height: 17px; - padding: 0; - margin: 0; - list-style-type: none; - border: none; - padding-left: 0; -} - -nav ul a { - font-size: 16px; -} - -nav ul a, nav ul a:active { - display: block; -} - -nav ul a:hover, nav ul a:active { - color: hsl(200, 100%, 43%); - text-decoration: none; -} - -nav>ul { - padding: 0 10px; -} - -nav>ul li:first-child { - padding-top: 0; -} - -nav ul li ul { - padding-left: 0; -} - -nav>ul>li { - border-bottom: 1px solid #e2e2e2; - padding: 10px 0 20px 0; -} - -nav>ul>li.active ul { - border-left: 3px solid #0095dd; - padding-left: 15px; -} - -nav>ul>li.active ul li.active a { - font-weight: bold; -} - -nav>ul>li.active a { - color: #0095dd; -} - -nav>ul>li>a { - color: #706d77; - padding: 20px 0; - font-size: 18px; -} - -nav ul ul { - margin-bottom: 10px padding-left: 0; -} - -nav ul ul a { - color: #5f5c63; -} - -nav ul ul a, nav ul ul a:active { - font-family: 'bt_mono', monospace; - font-size: 14px; - padding-left: 20px; - padding-top: 3px; - padding-bottom: 9px; -} - -nav h2 { - font-size: 12px; - margin: 0; - padding: 0; -} - -nav>h2>a { - color: hsl(202, 71%, 50%); - border-bottom: 1px solid hsl(202, 71%, 50%); - padding-bottom: 5px; -} - -nav>h2>a:hover { - font-weight: 500; - text-decoration: none; -} - -footer { - background-color: #fff; - color: hsl(0, 0%, 28%); - margin-left: 300px; - display: block; - font-style: italic; - font-size: 12px; - padding: 30px; - text-align: center; -} - -.ancestors { - color: #999; -} - -.ancestors a { - color: #999 !important; - text-decoration: none; -} - -.clear { - clear: both; -} - -.important { - font-weight: bold; - color: #950B02; -} - -.yes-def { - text-indent: -1000px; -} - -.type-signature { - color: #aaa; -} - -.name, .signature { - font-family: 'bt_mono', monospace; - word-wrap: break-word; -} - -.details { - margin-top: 14px; - font-size: 13px; - text-align: right; - background: #ffffff; - /* Old browsers */ - background: -moz-linear-gradient(left, #ffffff 0%, #fafafa 100%); - /* FF3.6-15 */ - background: -webkit-linear-gradient(left, #ffffff 0%, #fafafa 100%); - /* Chrome10-25,Safari5.1-6 */ - background: linear-gradient(to right, #ffffff 0%, #fafafa 100%); - /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ - filter: progid: DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#fafafa', GradientType=1); - padding-right: 5px; -} - -.details dt { - display: inline-block; -} - -.details dd { - display: inline-block; - margin: 0; -} - -.details dd a { - font-style: italic; - font-weight: normal; - line-height: 1; -} - -.details ul { - margin: 0 -} - -.details ul { - list-style-type: none -} - -.details li {} - -.details pre.prettyprint { - margin: 0 -} - -.details .object-value { - padding-top: 0 -} - -.description { - margin-bottom: 1em; - margin-top: 1em; -} - -.code-caption { - font-style: italic; - margin: 0; - font-size: 16px; - color: #545454; -} - -.prettyprint { - font-size: 13px; - border: 1px solid #ddd; - border-radius: 3px; - overflow: auto; - background-color: #fbfbfb; -} - -.prettyprint.source { - width: inherit; -} - -.prettyprint code { - font-size: 100%; - line-height: 18px; - display: block; - margin: 0 30px; - background-color: #fbfbfb; - color: #4D4E53; -} - -.prettyprint>code { - padding: 30px 15px; -} - -.prettyprint .linenums code { - padding: 0 15px; -} - -.prettyprint .linenums li:first-of-type code { - padding-top: 15px; -} - -.prettyprint code span.line { - display: inline-block; -} - -.prettyprint.linenums { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.prettyprint.linenums ol { - padding-left: 0 -} - -.prettyprint.linenums li { - border-left: 3px #ddd solid -} - -.prettyprint.linenums li.selected, .prettyprint.linenums li.selected * { - background-color: lightyellow -} - -.prettyprint.linenums li * { - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; -} - -.readme .prettyprint { - max-width: 800px; -} - -.params, .props { - border-spacing: 0; - border: 1px solid #ddd; - border-radius: 3px; - width: 100%; - font-size: 14px; -} - -.params .name, .props .name, .name code { - color: #4D4E53; - font-family: 'bt_mono', monospace; - font-size: 100%; -} - -.params td, .params th, .props td, .props th { - margin: 0px; - text-align: left; - vertical-align: top; - padding: 10px; - display: table-cell; -} - -.params td { - border-top: 1px solid #eee; -} - -.params thead tr, .props thead tr { - background-color: #fff; - font-weight: bold; -} - -.params .params thead tr, .props .props thead tr { - background-color: #fff; - font-weight: bold; -} - -.params td.description>p:first-child, .props td.description>p:first-child { - margin-top: 0; - padding-top: 0; -} - -.params td.description>p:last-child, .props td.description>p:last-child { - margin-bottom: 0; - padding-bottom: 0; -} - -dl.param-type { - margin-top: 5px; -} - -.param-type dt, .param-type dd { - display: inline-block -} - -.param-type dd { - font-family: Consolas, Monaco, 'Andale Mono', monospace -} - -.disabled { - color: #454545 -} - - -/* tag source style */ - -.tag-deprecated { - padding-right: 5px; -} - -.tag-source { - border-bottom: 1px solid rgba(28, 160, 224, 0.35); -} - -.tag-source:first-child { - border-bottom: 1px solid rgba(28, 160, 224, 1); -} - - -/* navicon button */ - -.navicon-button { - position: relative; - transition: 0.25s; - cursor: pointer; - user-select: none; - opacity: .8; - background-color: white; - border-radius: 100%; - width: 50px; - height: 50px; - -webkit-box-shadow: 0px 2px 9px 0px rgba(0, 0, 0, 0.31); - -moz-box-shadow: 0px 2px 9px 0px rgba(0, 0, 0, 0.31); - box-shadow: 0px 2px 9px 0px rgba(0, 0, 0, 0.31); -} - -.navicon-button .navicon:before, .navicon-button .navicon:after { - transition: 0.25s; -} - -.navicon-button:hover { - transition: 0.5s; - opacity: 1; -} - -.navicon-button:hover .navicon:before, .navicon-button:hover .navicon:after { - transition: 0.25s; -} - -.navicon-button:hover .navicon:before { - top: .425rem; -} - -.navicon-button:hover .navicon:after { - top: -.425rem; -} - - -/* navicon */ - -.navicon { - position: relative; - width: 1.5em; - height: .195rem; - background: #000; - top: calc(50% - .09rem); - left: calc(50% - .75rem); - transition: 0.3s; - border-radius: 5px; -} - -.navicon:before, .navicon:after { - display: block; - content: ""; - height: .195rem; - width: 1.5rem; - background: #000; - position: absolute; - z-index: -1; - transition: 0.3s 0.25s; -} - -.navicon:before { - top: 0.425rem; - height: .195rem; - border-radius: 5px; -} - -.navicon:after { - top: -0.425rem; - border-radius: 5px; -} - - -/* open */ - -.nav-trigger:checked+label:not(.steps) .navicon:before, .nav-trigger:checked+label:not(.steps) .navicon:after { - top: 0 !important; -} - -.nav-trigger:checked+label .navicon:before, .nav-trigger:checked+label .navicon:after { - transition: 0.5s; -} - - -/* Minus */ - -.nav-trigger:checked+label { - transform: scale(0.75); -} - - -/* Γ— and + */ - -.nav-trigger:checked+label.plus .navicon, .nav-trigger:checked+label.x .navicon { - background: transparent; -} - -.nav-trigger:checked+label.plus .navicon:before, .nav-trigger:checked+label.x .navicon:before { - transform: rotate(-45deg); - background: #000; -} - -.nav-trigger:checked+label.plus .navicon:after, .nav-trigger:checked+label.x .navicon:after { - transform: rotate(45deg); - background: #000; -} - -.nav-trigger:checked+label.plus { - transform: scale(0.75) rotate(45deg); -} - -.nav-trigger:checked~nav { - left: 0 !important; -} - -.nav-trigger:checked~.overlay { - display: block; -} - -.nav-trigger { - position: fixed; - top: 0; - clip: rect(0, 0, 0, 0); -} - -.overlay { - display: none; - position: fixed; - top: 0; - bottom: 0; - left: 0; - right: 0; - width: 100%; - height: 100%; - background: hsla(0, 0%, 0%, 0.5); - z-index: 1; -} - -table { - border-collapse: separate; - ; - display: block; - overflow-x: auto; - /*table-layout:fixed;*/ -} - -table tbody td { - border-top: 1px solid hsl(207, 10%, 86%); - border-right: 1px solid #eee; - padding: 5px; - /*word-wrap: break-word;*/ -} - -td table.params, td table.props { - border: 0; -} - -@media only screen and (min-width: 320px) and (max-width: 680px) { - body { - overflow-x: hidden; - } - #main { - padding: 30px 30px; - width: 100%; - min-width: 360px; - } - nav { - background: #FFF; - width: 300px; - height: 100%; - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: -300px; - z-index: 3; - padding: 0 10px; - transition: left 0.2s; - margin-top: 0; - } - .navicon-button { - display: inline-block; - position: fixed; - bottom: 1.5em; - right: 20px; - z-index: 1000; - } - .top-nav-wrapper { - display: none; - } - #main h1.page-title { - margin: 0.5em 0; - } - footer { - margin-left: 0; - margin-bottom: 30px; - } -} - -.top-nav-wrapper { - background-color: #ececec; - position: fixed; - top: 0px; - left: 0px; - padding: 10px 10px 0 10px; - z-index: 999; - width: 300px; -} - -.top-nav-wrapper ul { - margin: 0; -} - -.top-nav-wrapper ul li { - display: inline-block; - padding: 0 10px; - vertical-align: top; -} - -.top-nav-wrapper ul li.active { - border-bottom: 2px solid rgba(28, 160, 224, 1); -} - -.search-wrapper { - display: inline-block; - position: relative; -} - -.search-wrapper svg { - position: absolute; - left: 0px; -} - -input.search-input { - background: transparent; - box-shadow: 0; - border: 0; - border-bottom: 1px solid #c7c7c7; - padding: 7px 15px 12px 35px; - margin: 0 auto; -} - - -/* Smooth outline with box-shadow: */ - -input.search-input:focus { - border-bottom: 2px solid rgba(28, 160, 224, 1); - outline: none; -} - - -/* Hightlight JS Paradiso Light Theme */ - -.hljs-comment, .hljs-quote { - color: #776e71 -} - -.hljs-variable, .hljs-template-variable, .hljs-tag, .hljs-name, .hljs-selector-id, .hljs-selector-class, .hljs-regexp, .hljs-link, .hljs-meta { - color: #ef6155 -} - -.hljs-number, .hljs-built_in, .hljs-builtin-name, .hljs-literal, .hljs-type, .hljs-params, .hljs-deletion { - color: #f99b15 -} - -.hljs-title, .hljs-section, .hljs-attribute { - color: #fec418 -} - -.hljs-string, .hljs-symbol, .hljs-bullet, .hljs-addition { - color: #48b685 -} - -.hljs-keyword, .hljs-selector-tag { - color: #815ba4 -} - -.hljs { - display: block; - overflow-x: auto; - background: #e7e9db; - color: #4f424c; - padding: 0.5em -} - -.hljs-emphasis { - font-style: italic -} - -.hljs-strong { - font-weight: bold -} - -.link-icon { - opacity: 0; - position: absolute; - margin-left: -25px; - padding-right: 5px; - padding-top: 2px; -} - -.example-container .link-icon { - margin-top: -6px; -} - -.example-container:hover .link-icon, -.name-container:hover .link-icon { - opacity: .5; -} - -.name-container { - display: flex; - padding-top: 1em; -} diff --git a/docs/agenda/2.2.0/styles/prettify-jsdoc.css b/docs/agenda/2.2.0/styles/prettify-jsdoc.css deleted file mode 100644 index 834a866..0000000 --- a/docs/agenda/2.2.0/styles/prettify-jsdoc.css +++ /dev/null @@ -1,111 +0,0 @@ -/* JSDoc prettify.js theme */ - -/* plain text */ -.pln { - color: #000000; - font-weight: normal; - font-style: normal; -} - -/* string content */ -.str { - color: hsl(104, 100%, 24%); - font-weight: normal; - font-style: normal; -} - -/* a keyword */ -.kwd { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* a comment */ -.com { - font-weight: normal; - font-style: italic; -} - -/* a type name */ -.typ { - color: #000000; - font-weight: normal; - font-style: normal; -} - -/* a literal value */ -.lit { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* punctuation */ -.pun { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* lisp open bracket */ -.opn { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* lisp close bracket */ -.clo { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* a markup tag name */ -.tag { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a markup attribute name */ -.atn { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a markup attribute value */ -.atv { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a declaration */ -.dec { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* a variable name */ -.var { - color: #000000; - font-weight: normal; - font-style: normal; -} - -/* a function name */ -.fun { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* Specify class=linenums on a pre to get line numbering */ -ol.linenums { - margin-top: 0; - margin-bottom: 0; -} diff --git a/docs/agenda/2.2.0/styles/prettify-tomorrow.css b/docs/agenda/2.2.0/styles/prettify-tomorrow.css deleted file mode 100644 index eaf1251..0000000 --- a/docs/agenda/2.2.0/styles/prettify-tomorrow.css +++ /dev/null @@ -1,138 +0,0 @@ -/* Tomorrow Theme */ -/* Original theme - https://github.com/chriskempson/tomorrow-theme */ -/* Pretty printing styles. Used with prettify.js. */ -/* SPAN elements with the classes below are added by prettyprint. */ -/* plain text */ -.pln { - color: #4d4d4c; } - -@media screen { - /* string content */ - .str { - color: hsl(104, 100%, 24%); } - - /* a keyword */ - .kwd { - color: hsl(240, 100%, 50%); } - - /* a comment */ - .com { - color: hsl(0, 0%, 60%); } - - /* a type name */ - .typ { - color: hsl(240, 100%, 32%); } - - /* a literal value */ - .lit { - color: hsl(240, 100%, 40%); } - - /* punctuation */ - .pun { - color: #000000; } - - /* lisp open bracket */ - .opn { - color: #000000; } - - /* lisp close bracket */ - .clo { - color: #000000; } - - /* a markup tag name */ - .tag { - color: #c82829; } - - /* a markup attribute name */ - .atn { - color: #f5871f; } - - /* a markup attribute value */ - .atv { - color: #3e999f; } - - /* a declaration */ - .dec { - color: #f5871f; } - - /* a variable name */ - .var { - color: #c82829; } - - /* a function name */ - .fun { - color: #4271ae; } } -/* Use higher contrast and text-weight for printable form. */ -@media print, projection { - .str { - color: #060; } - - .kwd { - color: #006; - font-weight: bold; } - - .com { - color: #600; - font-style: italic; } - - .typ { - color: #404; - font-weight: bold; } - - .lit { - color: #044; } - - .pun, .opn, .clo { - color: #440; } - - .tag { - color: #006; - font-weight: bold; } - - .atn { - color: #404; } - - .atv { - color: #060; } } -/* Style */ -/* -pre.prettyprint { - background: white; - font-family: Consolas, Monaco, 'Andale Mono', monospace; - font-size: 12px; - line-height: 1.5; - border: 1px solid #ccc; - padding: 10px; } -*/ - -/* Get LI elements to show when they are in the main article */ -article ul li { - list-style-type: circle; - margin-left: 25px; -} - -/* Specify class=linenums on a pre to get line numbering */ -ol.linenums { - margin-top: 0; - margin-bottom: 0; } - -/* IE indents via margin-left */ -li.L0, -li.L1, -li.L2, -li.L3, -li.L4, -li.L5, -li.L6, -li.L7, -li.L8, -li.L9 { - /* */ } - -/* Alternate shading for lines */ -li.L1, -li.L3, -li.L5, -li.L7, -li.L9 { - /* */ } diff --git a/docs/agenda/2.2.0/utils_create-job.js.html b/docs/agenda/2.2.0/utils_create-job.js.html deleted file mode 100644 index 1f2c164..0000000 --- a/docs/agenda/2.2.0/utils_create-job.js.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - utils/create-job.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- utils/create-job.js -

- - - - - -
-
-
'use strict';
-const Job = require('../job');
-
-/**
- * Create Job object from data
- * @param {Object} agenda instance of Agenda
- * @param {Object} jobData job data
- * @returns {Job} returns created job
- */
-module.exports = (agenda, jobData) => {
-  jobData.agenda = agenda;
-  return new Job(jobData);
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/2.2.0/utils_process-jobs.js.html b/docs/agenda/2.2.0/utils_process-jobs.js.html deleted file mode 100644 index 0bcd453..0000000 --- a/docs/agenda/2.2.0/utils_process-jobs.js.html +++ /dev/null @@ -1,411 +0,0 @@ - - - - - - - - - - - utils/process-jobs.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- utils/process-jobs.js -

- - - - - -
-
-
'use strict';
-// @TODO: What should we use for internal util functions?
-//        Maybe we should use agenda:util:processJobs which would move agenda:* to agenda:agenda;*
-const debug = require('debug')('agenda:internal:processJobs');
-const createJob = require('./create-job');
-
-/**
- * Process methods for jobs
- * @param {Job} extraJob job to run immediately
- * @returns {undefined}
- */
-module.exports = function(extraJob) {
-  debug('starting to process jobs');
-  // Make sure an interval has actually been set
-  // Prevents race condition with 'Agenda.stop' and already scheduled run
-  if (!this._processInterval) {
-    debug('no _processInterval set when calling processJobs, returning');
-    return;
-  }
-
-  const self = this;
-  const definitions = this._definitions;
-  const jobQueue = this._jobQueue;
-  let jobName;
-
-  // Determine whether or not we have a direct process call!
-  if (!extraJob) {
-    // Go through each jobName set in 'Agenda.process' and fill the queue with the next jobs
-    for (jobName in definitions) {
-      if ({}.hasOwnProperty.call(definitions, jobName)) {
-        debug('queuing up job to process: [%s]', jobName);
-        jobQueueFilling(jobName);
-      }
-    }
-  } else if (definitions[extraJob.attrs.name]) {
-    // Add the job to list of jobs to lock and then lock it immediately!
-    debug('job [%s] was passed directly to processJobs(), locking and running immediately', extraJob.attrs.name);
-    self._jobsToLock.push(extraJob);
-    lockOnTheFly();
-  }
-
-  /**
-   * Returns true if a job of the specified name can be locked.
-   * Considers maximum locked jobs at any time if self._lockLimit is > 0
-   * Considers maximum locked jobs of the specified name at any time if jobDefinition.lockLimit is > 0
-   * @param {String} name name of job to check if we should lock or not
-   * @returns {boolean} whether or not you should lock job
-   */
-  function shouldLock(name) {
-    const jobDefinition = definitions[name];
-    let shouldLock = true;
-    if (self._lockLimit && self._lockLimit <= self._lockedJobs.length) {
-      shouldLock = false;
-    }
-
-    if (jobDefinition.lockLimit && jobDefinition.lockLimit <= jobDefinition.locked) {
-      shouldLock = false;
-    }
-
-    debug('job [%s] lock status: shouldLock = %s', name, shouldLock);
-    return shouldLock;
-  }
-
-  /**
-   * Internal method that adds jobs to be processed to the local queue
-   * @param {*} jobs Jobs to queue
-   * @param {boolean} inFront puts the job in front of queue if true
-   * @returns {undefined}
-   */
-  function enqueueJobs(jobs) {
-    if (!Array.isArray(jobs)) {
-      jobs = [jobs];
-    }
-
-    jobs.forEach(job => {
-      jobQueue.insert(job);
-    });
-  }
-
-  /**
-   * Internal method that will lock a job and store it on MongoDB
-   * This method is called when we immediately start to process a job without using the process interval
-   * We do this because sometimes jobs are scheduled but will be run before the next process time
-   * @returns {undefined}
-   */
-  function lockOnTheFly() {
-    // Already running this? Return
-    if (self._isLockingOnTheFly) {
-      debug('lockOnTheFly() already running, returning');
-      return;
-    }
-
-    // Don't have any jobs to run? Return
-    if (self._jobsToLock.length === 0) {
-      debug('no jobs to current lock on the fly, returning');
-      self._isLockingOnTheFly = false;
-      return;
-    }
-
-    // Set that we are running this
-    self._isLockingOnTheFly = true;
-
-    // Grab a job that needs to be locked
-    const now = new Date();
-    const job = self._jobsToLock.pop();
-
-    // If locking limits have been hit, stop locking on the fly.
-    // Jobs that were waiting to be locked will be picked up during a
-    // future locking interval.
-    if (!shouldLock(job.attrs.name)) {
-      debug('lock limit hit for: [%s]', job.attrs.name);
-      self._jobsToLock = [];
-      self._isLockingOnTheFly = false;
-      return;
-    }
-
-    // Query to run against collection to see if we need to lock it
-    const criteria = {
-      _id: job.attrs._id,
-      lockedAt: null,
-      nextRunAt: job.attrs.nextRunAt,
-      disabled: {$ne: true}
-    };
-
-    // Update / options for the MongoDB query
-    const update = {$set: {lockedAt: now}};
-    const options = {returnDocument: 'after'};
-
-    // Lock the job in MongoDB!
-    self._collection.findOneAndUpdate(criteria, update, options, (err, resp) => {
-      if (err) {
-        throw err;
-      }
-
-      // Did the "job" get locked? Create a job object and run
-      if (resp.value) {
-        const job = createJob(self, resp.value);
-        debug('found job [%s] that can be locked on the fly', job.attrs.name);
-        self._lockedJobs.push(job);
-        definitions[job.attrs.name].locked++;
-        enqueueJobs(job);
-        jobProcessing();
-      }
-
-      // Mark lock on fly is done for now
-      self._isLockingOnTheFly = false;
-
-      // Re-run in case anything is in the queue
-      lockOnTheFly();
-    });
-  }
-
-  /**
-   * Internal method used to fill a queue with jobs that can be run
-   * @param {String} name fill a queue with specific job name
-   * @returns {undefined}
-   */
-  function jobQueueFilling(name) {
-    // Don't lock because of a limit we have set (lockLimit, etc)
-    if (!shouldLock(name)) {
-      debug('lock limit reached in queue filling for [%s]', name);
-      return;
-    }
-
-    // Set the date of the next time we are going to run _processEvery function
-    const now = new Date();
-    self._nextScanAt = new Date(now.valueOf() + self._processEvery);
-
-    // For this job name, find the next job to run and lock it!
-    self._findAndLockNextJob(name, definitions[name], (err, job) => {
-      if (err) {
-        debug('[%s] job lock failed while filling queue', name);
-        throw err;
-      }
-
-      // Still have the job?
-      // 1. Add it to lock list
-      // 2. Add count of locked jobs
-      // 3. Queue the job to actually be run now that it is locked
-      // 4. Recursively run this same method we are in to check for more available jobs of same type!
-      if (job) {
-        debug('[%s:%s] job locked while filling queue', name, job.attrs._id);
-        self._lockedJobs.push(job);
-        definitions[job.attrs.name].locked++;
-        enqueueJobs(job);
-        jobQueueFilling(name);
-        jobProcessing();
-      }
-    });
-  }
-
-  /**
-   * Internal method that processes any jobs in the local queue (array)
-   * @returns {undefined}
-   */
-  function jobProcessing() {
-    // Ensure we have jobs
-    if (jobQueue.length === 0) {
-      return;
-    }
-
-    // Store for all sorts of things
-    const now = new Date();
-
-    // Get the next job that is not blocked by concurrency
-    const job = jobQueue.returnNextConcurrencyFreeJob(definitions);
-
-    debug('[%s:%s] about to process job', job.attrs.name, job.attrs._id);
-
-    // If the 'nextRunAt' time is older than the current time, run the job
-    // Otherwise, setTimeout that gets called at the time of 'nextRunAt'
-    if (job.attrs.nextRunAt < now) {
-      debug('[%s:%s] nextRunAt is in the past, run the job immediately', job.attrs.name, job.attrs._id);
-      runOrRetry();
-    } else {
-      const runIn = job.attrs.nextRunAt - now;
-      debug('[%s:%s] nextRunAt is in the future, calling setTimeout(%d)', job.attrs.name, job.attrs._id, runIn);
-      setTimeout(runOrRetry, runIn);
-    }
-
-    /**
-     * Internal method that tries to run a job and if it fails, retries again!
-     * @returns {undefined}
-     */
-    async function runOrRetry() {
-      if (self._processInterval) {
-        const job = jobQueue.pop();
-        const jobDefinition = definitions[job.attrs.name];
-        if (jobDefinition.concurrency > jobDefinition.running && self._runningJobs.length < self._maxConcurrency) {
-          // Get the deadline of when the job is not supposed to go past for locking
-          const lockDeadline = new Date(Date.now() - jobDefinition.lockLifetime);
-
-          // This means a job has "expired", as in it has not been "touched" within the lockoutTime
-          // Remove from local lock
-          // NOTE: Shouldn't we update the 'lockedAt' value in MongoDB so it can be picked up on restart?
-          if (job.attrs.lockedAt < lockDeadline) {
-            debug('[%s:%s] job lock has expired, freeing it up', job.attrs.name, job.attrs._id);
-            self._lockedJobs.splice(self._lockedJobs.indexOf(job), 1);
-            jobDefinition.locked--;
-            jobProcessing();
-            return;
-          }
-
-          // Add to local "running" queue
-          self._runningJobs.push(job);
-          jobDefinition.running++;
-
-          // CALL THE ACTUAL METHOD TO PROCESS THE JOB!!!
-          debug('[%s:%s] processing job', job.attrs.name, job.attrs._id);
-
-          job.run()
-            .catch(error => [error, job])
-            .then(job => processJobResult(...Array.isArray(job) ? job : [null, job])); // eslint-disable-line promise/prefer-await-to-then
-
-          // Re-run the loop to check for more jobs to process (locally)
-          jobProcessing();
-        } else {
-          // Run the job immediately by putting it on the top of the queue
-          debug('[%s:%s] concurrency preventing immediate run, pushing job to top of queue', job.attrs.name, job.attrs._id);
-          enqueueJobs(job);
-        }
-      }
-    }
-  }
-
-  /**
-   * Internal method used to run the job definition
-   * @param {Error} err thrown if can't process job
-   * @param {module.Job} job job to process
-   * @returns {undefined}
-   */
-  function processJobResult(err, job) {
-    if (err) {
-      return job.agenda.emit('error', err);
-    }
-
-    const {name} = job.attrs;
-
-    // Job isn't in running jobs so throw an error
-    if (!self._runningJobs.includes(job)) {
-      debug('[%s] callback was called, job must have been marked as complete already', job.attrs._id);
-      throw new Error('callback already called - job ' + name + ' already marked complete');
-    }
-
-    // Remove the job from the running queue
-    self._runningJobs.splice(self._runningJobs.indexOf(job), 1);
-    if (definitions[name].running > 0) {
-      definitions[name].running--;
-    }
-
-    // Remove the job from the locked queue
-    self._lockedJobs.splice(self._lockedJobs.indexOf(job), 1);
-    if (definitions[name].locked > 0) {
-      definitions[name].locked--;
-    }
-
-    // Re-process jobs now that one has finished
-    jobProcessing();
-  }
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/Agenda.html b/docs/agenda/3.1.0/Agenda.html deleted file mode 100644 index 3bf6768..0000000 --- a/docs/agenda/3.1.0/Agenda.html +++ /dev/null @@ -1,4583 +0,0 @@ - - - - - - - - - Agenda - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- Agenda -

- - - - -
-
- -

- - Agenda - -

- - - -
- -
-
- - - - - - - - - - - - -

- new Agenda(config, cb) -

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
config - - - - Object - - - - - - - -

Agenda Config

- -
cb - - - - function - - - - - - - -

Callback after Agenda has started and connected to mongo

- -
- - - - - -
Properties:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
_name - - - - Object - - - - - - - -

Name of the current Agenda queue

-
_processEvery - - - - Number - - - - - - - - -
_defaultConcurrency - - - - Number - - - - - - - - -
_maxConcurrency - - - - Number - - - - - - - - -
_defaultLockLimit - - - - Number - - - - - - - - -
_lockLimit - - - - Number - - - - - - - - -
_definitions - - - - Object - - - - - - - - -
_runningJobs - - - - Object - - - - - - - - -
_lockedJobs - - - - Object - - - - - - - - -
_jobQueue - - - - Object - - - - - - - - -
_defaultLockLifetime - - - - Number - - - - - - - - -
_sort - - - - Object - - - - - - - - -
_indices - - - - Object - - - - - - - - -
_isLockingOnTheFly - - - - Boolean - - - - - - - - -
_jobsToLock - - - - Array - - - - - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - -

Methods

- - - - - - - - - - - - - -

- cancel(query) → {Promise.<Number>} -

-
- - - - - -
-

Cancels any jobs matching the passed MongoDB query, and removes them from the database.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
query - - - - Object - - - - - - - -

MongoDB query to use when cancelling

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- create(name, data) → {Job} -

-
- - - - - -
-

Given a name and some data, create a new job

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - - - String - - - - - - - -

name of job

- -
data - - - - Object - - - - - - - -

data to set for job

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- database(url, collection, options, cb) → {exports} -

-
- - - - - -
-

Connect to the spec'd MongoDB server and database.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
url - - - - String - - - - - - - -

MongoDB server URI

- -
collection - - - - String - - - - - - - -

name of collection to use. Defaults to agendaJobs

- -
options - - - - Object - - - - - - - -

options for connecting

- -
cb - - - - function - - - - - - - -

callback of MongoDB connection

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- dbInit(collection, cb) → {undefined} -

-
- - - - - -
-

Setup and initialize the collection used to manage Jobs.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
collection - - - - String - - - - - - - -

name or undefined for default 'agendaJobs'

- -
cb - - - - function - - - - - - - -

called when the db is initialized

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- defaultConcurrency(num) → {exports} -

-
- - - - - -
-

Set the default concurrency for each job

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
num - - - - Number - - - - - - - -

default concurrency

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- defaultLockLifetime(ms) → {Agenda} -

-
- - - - - -
-

Set the default lock time (in ms) -Default is 10 * 60 * 1000 ms (10 minutes)

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
ms - - - - Number - - - - - - - -

time in ms to set default lock

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- defaultLockLimit(num) → {Agenda} -

-
- - - - - -
-

Set default lock limit per job type

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
num - - - - Number - - - - - - - -

Lock limit per job

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- define(name, options, processor) → {undefined} -

-
- - - - - -
-

Setup definition for job -Method is used by consumers of lib to setup their functions

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - - - String - - - - - - - -

name of job

- -
options - - - - Object - - - - - - - -

options for job to run

- -
processor - - - - function - - - - - - - -

function to be called to run actual job

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- every(interval, names, dataopt, optionsopt) → {Promise} -

-
- - - - - -
-

Creates a scheduled job with given interval and name/names of the job to run

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
interval - - - - String - - - | - - - Number - - - - - - - - - - - - - -

run every X interval

- -
names - - - - String - - - | - - - Array.<String> - - - - - - - - - - - - - -

String or strings of jobs to schedule

- -
data - - - - Object - - - - - - - - - <optional>
- - - - - -
-

data to run for job

- -
options - - - - Object - - - - - - - - - <optional>
- - - - - -
-

options to run job for

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- (protected) findAndLockNextJob(jobName, definition) -

-
- - - - - -
-

Find and lock jobs

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
jobName - - - - String - - - - - - - -

name of job to try to lock

- -
definition - - - - Object - - - - - - - -

definition used to tell how job is run

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- jobs(query, sort, limit, number) → {Promise} -

-
- - - - - -
-

Finds all jobs matching 'query'

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
query - - - - Object - - - - - - - -

object for MongoDB

- -
sort - - - - Object - - - - - - - -

object for MongoDB

- -
limit - - - - Number - - - - - - - -

number of documents to return from MongoDB

- -
number - - - - Number - - - - - - - -

of documents to skip in MongoDB

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- locklimit(num) → {exports} -

-
- - - - - -
-

Set the default amount jobs that are allowed to be locked at one time (GLOBAL)

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
num - - - - Number - - - - - - - -

Lock limit

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- maxConcurrency(num) → {exports} -

-
- - - - - -
-

Set the concurrency for jobs (globally), type does not matter

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
num - - - - Number - - - - - - - -

max concurrency value

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- mongo(mdb, collection, cb) → {exports} -

-
- - - - - -
-

Build method used to add MongoDB connection details

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
mdb - - - - MongoClient - - - - - - - -

instance of MongoClient to use

- -
collection - - - - String - - - - - - - -

name collection we want to use ('agendaJobs')

- -
cb - - - - function - - - - - - - -

called when MongoDB connection fails or passes

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- name(name) → {exports} -

-
- - - - - -
-

Set name of queue

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - - - String - - - - - - - -

name of agenda instance

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- now(name, data) → {Promise} -

-
- - - - - -
-

Create a job for this exact moment

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - - - String - - - - - - - -

name of job to schedule

- -
data - - - - Object - - - - - - - -

data to pass to job

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- processEvery(time) → {exports} -

-
- - - - - -
-

Set the default process interval

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
time - - - - Number - - - | - - - String - - - - - - - -

time to process, expressed in human interval

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- purge() → {Promise} -

-
- - - - - -
-

Removes all jobs from queue

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- saveJob(job) → {Promise} -

-
- - - - - -
-

Save the properties on a job to MongoDB

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
job - - - - Job - - - - - - - -

job to save into MongoDB

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- schedule(when, names, data) → {Promise.<(Job|Array.<Job>)>} -

-
- - - - - -
-

Schedule a job or jobs at a specific time

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
when - - - - String - - - - - - - -

when the job gets run

- -
names - - - - Array.<String> - - - - - - - -

array of job names to run

- -
data - - - - Object - - - - - - - -

data to send to job

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- sort(query) → {exports} -

-
- - - - - -
-

Set the sort query for finding next job -Default is { nextRunAt: 1, priority: -1 }

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
query - - - - Object - - - - - - - -

sort query object for MongoDB

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- start() → {Promise} -

-
- - - - - -
-

Starts processing jobs using processJobs() methods, storing an interval ID -This method will only resolve if a db has been set up beforehand.

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- stop() → {Promise} -

-
- - - - - -
-

Clear the interval that processes the jobs

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - -
-
- - - - -
- -
- - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/3.1.0/Job.html b/docs/agenda/3.1.0/Job.html deleted file mode 100644 index 2bff19b..0000000 --- a/docs/agenda/3.1.0/Job.html +++ /dev/null @@ -1,2050 +0,0 @@ - - - - - - - - - Job - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- Job -

- - - - -
-
- -

- - Job - -

- - - -
- -
-
- - - - - - - - - - - - -

- new Job(args) -

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
args - - - - Object - - - - - - - -

Job Options

- -
- - - - - -
Properties:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
agenda - - - - Object - - - - - - - -

The Agenda instance

-
attrs - - - - Object - - - - - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - -

Methods

- - - - - - - - - - - - - -

- computeNextRunAt() → {exports} -

-
- - - - - -
-

Internal method used to compute next time a job should run and sets the proper values

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- disable() → {exports} -

-
- - - - - -
-

Prevents the job type from running

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- enable() → {Job} -

-
- - - - - -
-

Allows job type to run

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- fail(reason) → {exports} -

-
- - - - - -
-

Fails the job with a reason (error) specified

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
reason - - - - Error - - - | - - - String - - - - - - - -

reason job failed

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- isRunning() → {Boolean} -

-
- - - - - -
-

A job is running if: -(lastRunAt exists AND lastFinishedAt does not exist) -OR -(lastRunAt exists AND lastFinishedAt exists but the lastRunAt is newer [in time] than lastFinishedAt)

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- priority(priority) → {Number} -

-
- - - - - -
-

Internal method to turn priority into a number

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
priority - - - - String - - - | - - - Number - - - - - - - -

string to parse into number

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- remove() → {Promise} -

-
- - - - - -
-

Remove the job from MongoDB

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- repeatAt(time) → {exports} -

-
- - - - - -
-

Sets a job to repeat at a specific time

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
time - - - - String - - - - - - - -

time to repeat job at (human readable or number)

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- repeatEvery(interval, options) → {Job} -

-
- - - - - -
-

Sets a job to repeat every X amount of time

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
interval - - - - String - - - - - - - -

repeat every X

- -
options - - - - Object - - - - - - - -

options to use for job

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- run() → {Promise} -

-
- - - - - -
-

Internal method (RUN)

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- schedule(time) → {exports} -

-
- - - - - -
-

Schedules a job to run at specified time

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
time - - - - String - - - - - - - -

schedule a job to run "then"

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- toJSON() → {Object} -

-
- - - - - -
-

Given a job, turn it into an object we can store in Mongo

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- touch() → {undefined} -

-
- - - - - -
-

Updates "lockedAt" time so the job does not get picked up again

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- unique(unique, opts) → {exports} -

-
- - - - - -
-

Data to ensure is unique for job to be created

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
unique - - - - Object - - - - - - - -

mongo data query for unique

- -
opts - - - - Object - - - - - - - -

unique options

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - -
-
- - - - -
- -
- - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/3.1.0/JobProcessingQueue.html b/docs/agenda/3.1.0/JobProcessingQueue.html deleted file mode 100644 index f24fe45..0000000 --- a/docs/agenda/3.1.0/JobProcessingQueue.html +++ /dev/null @@ -1,905 +0,0 @@ - - - - - - - - - JobProcessingQueue - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- JobProcessingQueue -

- - - - -
-
- -

- - JobProcessingQueue - -

- - - -
- -
-
- - - - - - - - - - - - -

- new JobProcessingQueue(args) -

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
args - - - - Object - - - - - - - -

Job Options

- -
- - - - - -
Properties:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
agenda - - - - Object - - - - - - - -

The Agenda instance

-
attrs - - - - Object - - - - - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - -

Methods

- - - - - - - - - - - - - -

- insert(job) → {undefined} -

-
- - - - - -
-

Inserts job in queue where it will be order from left to right in decreasing -order of nextRunAt and priority (in case of same nextRunAt), if all values -are even the first jobs to be introduced will have priority

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
job - - - - Job - - - - - - - -

job to add to queue

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- pop() → {Job} -

-
- - - - - -
-

Pops and returns last queue element (next job to be processed) without checking concurrency.

-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- push(job) → {undefined} -

-
- - - - - -
-

Inserts job in first queue position

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
job - - - - Job - - - - - - - -

job to add to queue

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

- returnNextConcurrencyFreeJob(agendaDefinitions) → {Job} -

-
- - - - - -
-

Returns (does not pop, element remains in queue) first element (always from the right) -that can be processed (not blocked by concurrency execution)

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
agendaDefinitions - - - - Object - - - - - - - -

job to add to queue

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - -
-
- - - - -
- -
- - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/3.1.0/agenda_cancel.js.html b/docs/agenda/3.1.0/agenda_cancel.js.html deleted file mode 100644 index cec0821..0000000 --- a/docs/agenda/3.1.0/agenda_cancel.js.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - - - - - agenda/cancel.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/cancel.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:cancel');
-
-/**
- * Cancels any jobs matching the passed MongoDB query, and removes them from the database.
- * @name Agenda#cancel
- * @function
- * @param {Object} query MongoDB query to use when cancelling
- * @caller client code, Agenda.purge(), Job.remove()
- * @returns {Promise<Number>} A promise that contains the number of removed documents when fulfilled.
- */
-module.exports = async function(query) {
-  debug('attempting to cancel all Agenda jobs', query);
-  try {
-    const {result} = await this._collection.deleteMany(query);
-    debug('%s jobs cancelled', result.n);
-    return result.n;
-  } catch (error) {
-    debug('error trying to delete jobs from MongoDB');
-    throw error;
-  }
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/agenda_create.js.html b/docs/agenda/3.1.0/agenda_create.js.html deleted file mode 100644 index 021f8aa..0000000 --- a/docs/agenda/3.1.0/agenda_create.js.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - agenda/create.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/create.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:create');
-const Job = require('../job');
-
-/**
- * Given a name and some data, create a new job
- * @name Agenda#create
- * @function
- * @param {String} name name of job
- * @param {Object} data data to set for job
- * @returns {Job} instance of new job
- */
-module.exports = function(name, data) {
-  debug('Agenda.create(%s, [Object])', name);
-  const priority = this._definitions[name] ? this._definitions[name].priority : 0;
-  const job = new Job({name, data, type: 'normal', priority, agenda: this});
-  return job;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/agenda_database.js.html b/docs/agenda/3.1.0/agenda_database.js.html deleted file mode 100644 index 1cfb156..0000000 --- a/docs/agenda/3.1.0/agenda_database.js.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - - - - - agenda/database.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/database.js -

- - - - - -
-
-
'use strict';
-const {MongoClient} = require('mongodb');
-const debug = require('debug')('agenda:database');
-const hasMongoProtocol = require('./has-mongo-protocol');
-
-/**
- * Connect to the spec'd MongoDB server and database.
- * @name Agenda#database
- * @function
- * @param {String} url MongoDB server URI
- * @param {String} collection name of collection to use. Defaults to `agendaJobs`
- * @param {Object} options options for connecting
- * @param {Function} cb callback of MongoDB connection
- * @returns {exports}
- * NOTE:
- * If `url` includes auth details then `options` must specify: { 'uri_decode_auth': true }. This does Auth on
- * the specified database, not the Admin database. If you are using Auth on the Admin DB and not on the Agenda DB,
- * then you need to authenticate against the Admin DB and then pass the MongoDB instance into the constructor
- * or use Agenda.mongo(). If your app already has a MongoDB connection then use that. ie. specify config.mongo in
- * the constructor or use Agenda.mongo().
- */
-module.exports = function(url, collection, options, cb) {
-  const self = this;
-  if (!hasMongoProtocol(url)) {
-    url = 'mongodb://' + url;
-  }
-
-  let reconnectOptions = {autoReconnect: true, reconnectTries: Number.MAX_SAFE_INTEGER, reconnectInterval: this._processEvery};
-  if (options && options.useUnifiedTopology && options.useUnifiedTopology === true) {
-    reconnectOptions = {};
-  }
-
-  collection = collection || 'agendaJobs';
-  options = {...reconnectOptions, ...options};
-  MongoClient.connect(url, options, (error, client) => {
-    if (error) {
-      debug('error connecting to MongoDB using collection: [%s]', collection);
-      if (cb) {
-        cb(error, null);
-      } else {
-        throw error;
-      }
-
-      return;
-    }
-
-    debug('successful connection to MongoDB using collection: [%s]', collection);
-    self._db = client;
-    self._mdb = client.db();
-    self.db_init(collection, cb);
-  });
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/agenda_db-init.js.html b/docs/agenda/3.1.0/agenda_db-init.js.html deleted file mode 100644 index df2da7d..0000000 --- a/docs/agenda/3.1.0/agenda_db-init.js.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - - - - agenda/db-init.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/db-init.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:db_init');
-
-/**
- * Setup and initialize the collection used to manage Jobs.
- * @name Agenda#dbInit
- * @function
- * @param {String} collection name or undefined for default 'agendaJobs'
- * @param {Function} cb called when the db is initialized
- * @returns {undefined}
- */
-module.exports = function(collection, cb) {
-  const self = this;
-  debug('init database collection using name [%s]', collection);
-  this._collection = this._mdb.collection(collection || 'agendaJobs');
-  debug('attempting index creation');
-  this._collection.createIndex(
-    this._indices,
-    {name: 'findAndLockNextJobIndex'},
-    err => {
-      if (err) {
-        debug('index creation failed');
-        self.emit('error', err);
-      } else {
-        debug('index creation success');
-        self.emit('ready');
-      }
-
-      if (cb) {
-        cb(err, self._collection);
-      }
-    }
-  );
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/agenda_default-concurrency.js.html b/docs/agenda/3.1.0/agenda_default-concurrency.js.html deleted file mode 100644 index a5909cb..0000000 --- a/docs/agenda/3.1.0/agenda_default-concurrency.js.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - agenda/default-concurrency.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/default-concurrency.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:defaultConcurrency');
-
-/**
- * Set the default concurrency for each job
- * @name Agenda#defaultConcurrency
- * @function
- * @param {Number} num default concurrency
- * @returns {exports} agenda instance
- */
-module.exports = function(num) {
-  debug('Agenda.defaultConcurrency(%d)', num);
-  this._defaultConcurrency = num;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/agenda_default-lock-lifetime.js.html b/docs/agenda/3.1.0/agenda_default-lock-lifetime.js.html deleted file mode 100644 index 43c9d71..0000000 --- a/docs/agenda/3.1.0/agenda_default-lock-lifetime.js.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - agenda/default-lock-lifetime.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/default-lock-lifetime.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:defaultLockLifetime');
-
-/**
- * Set the default lock time (in ms)
- * Default is 10 * 60 * 1000 ms (10 minutes)
- * @name Agenda#defaultLockLifetime
- * @function
- * @param {Number} ms time in ms to set default lock
- * @returns {Agenda} agenda instance
- */
-module.exports = function(ms) {
-  debug('Agenda.defaultLockLifetime(%d)', ms);
-  this._defaultLockLifetime = ms;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/agenda_default-lock-limit.js.html b/docs/agenda/3.1.0/agenda_default-lock-limit.js.html deleted file mode 100644 index f09ce0f..0000000 --- a/docs/agenda/3.1.0/agenda_default-lock-limit.js.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - agenda/default-lock-limit.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/default-lock-limit.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:defaultLockLimit');
-
-/**
- * Set default lock limit per job type
- * @name Agenda#defaultLockLimit
- * @function
- * @param {Number} num Lock limit per job
- * @returns {Agenda} agenda instance
- */
-module.exports = function(num) {
-  debug('Agenda.defaultLockLimit(%d)', num);
-  this._defaultLockLimit = num;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/agenda_define.js.html b/docs/agenda/3.1.0/agenda_define.js.html deleted file mode 100644 index faf3232..0000000 --- a/docs/agenda/3.1.0/agenda_define.js.html +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - - - - - agenda/define.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/define.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:define');
-
-/**
- * Setup definition for job
- * Method is used by consumers of lib to setup their functions
- * @name Agenda#define
- * @function
- * @param {String} name name of job
- * @param {Object} options options for job to run
- * @param {Function} processor function to be called to run actual job
- * @returns {undefined}
- */
-module.exports = function(name, options, processor) {
-  if (!processor) {
-    processor = options;
-    options = {};
-  }
-
-  this._definitions[name] = {
-    fn: processor,
-    concurrency: options.concurrency || this._defaultConcurrency,
-    lockLimit: options.lockLimit || this._defaultLockLimit,
-    priority: options.priority || 0,
-    lockLifetime: options.lockLifetime || this._defaultLockLifetime,
-    running: 0,
-    locked: 0
-  };
-  debug('job [%s] defined with following options: \n%O', name, this._definitions[name]);
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/agenda_every.js.html b/docs/agenda/3.1.0/agenda_every.js.html deleted file mode 100644 index 1770d77..0000000 --- a/docs/agenda/3.1.0/agenda_every.js.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - - - - - agenda/every.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/every.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:every');
-
-/**
- * Creates a scheduled job with given interval and name/names of the job to run
- * @name Agenda#every
- * @function
- * @param {String|Number} interval - run every X interval
- * @param {String|Array<String>} names - String or strings of jobs to schedule
- * @param {Object} [data] - data to run for job
- * @param {Object} [options] - options to run job for
- * @returns {Promise} Job/s created. Resolves when schedule fails or passes
- */
-module.exports = async function(interval, names, data, options) {
-  /**
-   * Internal method to setup job that gets run every interval
-   * @param {Number} interval run every X interval
-   * @param {String} name String job to schedule
-   * @param {Object} data data to run for job
-   * @param {Object} options options to run job for
-   * @returns {Job} instance of job
-   */
-  const createJob = async(interval, name, data, options) => {
-    const job = this.create(name, data);
-
-    job.attrs.type = 'single';
-    job.repeatEvery(interval, options);
-    await job.save();
-
-    return job;
-  };
-
-  /**
-   * Internal helper method that uses createJob to create jobs for an array of names
-   * @param {Number} interval run every X interval
-   * @param {Array<String>} names Strings of jobs to schedule
-   * @param {Object} data data to run for job
-   * @param {Object} options options to run job for
-   * @returns {Array<Job>} array of jobs created
-   */
-  const createJobs = (interval, names, data, options) => {
-    try {
-      const jobs = names.map(name => createJob(interval, name, data, options));
-
-      debug('every() -> all jobs created successfully');
-
-      return Promise.all(jobs);
-    } catch (error) { // @TODO: catch - ignore :O
-      debug('every() -> error creating one or more of the jobs', error);
-    }
-  };
-
-  if (typeof names === 'string' || names instanceof String) {
-    debug('Agenda.every(%s, %O, %O)', interval, names, options);
-    const jobs = await createJob(interval, names, data, options);
-
-    return jobs;
-  }
-
-  if (Array.isArray(names)) {
-    debug('Agenda.every(%s, %s, %O)', interval, names, options);
-    const jobs = await createJobs(interval, names, data, options);
-
-    return jobs;
-  }
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/agenda_find-and-lock-next-job.js.html b/docs/agenda/3.1.0/agenda_find-and-lock-next-job.js.html deleted file mode 100644 index a3badaa..0000000 --- a/docs/agenda/3.1.0/agenda_find-and-lock-next-job.js.html +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - - - - - - agenda/find-and-lock-next-job.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/find-and-lock-next-job.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:internal:_findAndLockNextJob');
-const {createJob} = require('../utils');
-
-/**
- * Find and lock jobs
- * @name Agenda#findAndLockNextJob
- * @function
- * @param {String} jobName name of job to try to lock
- * @param {Object} definition definition used to tell how job is run
- * @access protected
- * @caller jobQueueFilling() only
- * @returns Promise
- */
-module.exports = async function(jobName, definition) {
-  const self = this;
-  const now = new Date();
-  const lockDeadline = new Date(Date.now().valueOf() - definition.lockLifetime);
-  debug('_findAndLockNextJob(%s, [Function])', jobName);
-
-  // Don't try and access MongoDB if we've lost connection to it.
-  // Trying to resolve crash on Dev PC when it resumes from sleep. NOTE: Does this still happen?
-  const s = this._mdb.s || this._mdb.db.s;
-  if (s.topology.connections && s.topology.connections().length === 0 && !this._mongoUseUnifiedTopology) {
-    if (s.topology.autoReconnect && !s.topology.isDestroyed()) {
-      // Continue processing but notify that Agenda has lost the connection
-      debug('Missing MongoDB connection, not attempting to find and lock a job');
-      self.emit('error', new Error('Lost MongoDB connection'));
-    } else {
-      // No longer recoverable
-      debug('topology.autoReconnect: %s, topology.isDestroyed(): %s', s.topology.autoReconnect, s.topology.isDestroyed());
-      throw new Error('MongoDB connection is not recoverable, application restart required');
-    }
-  } else {
-    // /**
-    // * Query used to find job to run
-    // * @type {{$and: [*]}}
-    // */
-    const JOB_PROCESS_WHERE_QUERY = {
-      $and: [{
-        name: jobName,
-        disabled: {$ne: true}
-      }, {
-        $or: [{
-          lockedAt: {$eq: null},
-          nextRunAt: {$lte: this._nextScanAt}
-        }, {
-          lockedAt: {$lte: lockDeadline}
-        }]
-      }]
-    };
-
-    /**
-     * Query used to set a job as locked
-     * @type {{$set: {lockedAt: Date}}}
-     */
-    const JOB_PROCESS_SET_QUERY = {$set: {lockedAt: now}};
-
-    /**
-     * Query used to affect what gets returned
-     * @type {{returnOriginal: boolean, sort: object}}
-     */
-    const JOB_RETURN_QUERY = {returnDocument: 'after', sort: this._sort};
-
-    // Find ONE and ONLY ONE job and set the 'lockedAt' time so that job begins to be processed
-    const result = await this._collection.findOneAndUpdate(JOB_PROCESS_WHERE_QUERY, JOB_PROCESS_SET_QUERY, JOB_RETURN_QUERY);
-
-    let job;
-    if (result.value) {
-      debug('found a job available to lock, creating a new job on Agenda with id [%s]', result.value._id);
-      job = createJob(self, result.value);
-    }
-
-    return job;
-  }
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/agenda_has-mongo-protocol.js.html b/docs/agenda/3.1.0/agenda_has-mongo-protocol.js.html deleted file mode 100644 index a76c3f2..0000000 --- a/docs/agenda/3.1.0/agenda_has-mongo-protocol.js.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - agenda/has-mongo-protocol.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/has-mongo-protocol.js -

- - - - - -
-
-
'use strict';
-/**
- * Given a mongo connection url will check if it contains the mongo
- * @param {string} url URL to be tested
- * @returns {boolean} whether or not the url is a valid mongo URL
- */
-module.exports = function(url) {
-  return url.match(/mongodb(?:\+srv)?:\/\/.*/) !== null;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/agenda_index.js.html b/docs/agenda/3.1.0/agenda_index.js.html deleted file mode 100644 index 1ffb0cd..0000000 --- a/docs/agenda/3.1.0/agenda_index.js.html +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - - - - - - agenda/index.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/index.js -

- - - - - -
-
-
const {EventEmitter} = require('events');
-const humanInterval = require('human-interval');
-const JobProcessingQueue = require('./job-processing-queue');
-
-/**
- * @class Agenda
- * @param {Object} config - Agenda Config
- * @param {Function} cb - Callback after Agenda has started and connected to mongo
- * @property {Object} _name - Name of the current Agenda queue
- * @property {Number} _processEvery
- * @property {Number} _defaultConcurrency
- * @property {Number} _maxConcurrency
- * @property {Number} _defaultLockLimit
- * @property {Number} _lockLimit
- * @property {Object} _definitions
- * @property {Object} _runningJobs
- * @property {Object} _lockedJobs
- * @property {Object} _jobQueue
- * @property {Number} _defaultLockLifetime
- * @property {Object} _sort
- * @property {Object} _indices
- * @property {Boolean} _isLockingOnTheFly
- * @property {Array} _jobsToLock
- */
-class Agenda extends EventEmitter {
-  // eslint-disable-next-line default-param-last
-  constructor(config = {}, cb) {
-    super();
-
-    if (!(this instanceof Agenda)) {
-      return new Agenda(config);
-    }
-
-    this._name = config.name;
-    this._processEvery = humanInterval(config.processEvery) || humanInterval('5 seconds');
-    this._defaultConcurrency = config.defaultConcurrency || 5;
-    this._maxConcurrency = config.maxConcurrency || 20;
-    this._defaultLockLimit = config.defaultLockLimit || 0;
-    this._lockLimit = config.lockLimit || 0;
-    this._definitions = {};
-    this._runningJobs = [];
-    this._lockedJobs = [];
-    this._jobQueue = new JobProcessingQueue();
-    this._defaultLockLifetime = config.defaultLockLifetime || 10 * 60 * 1000; // 10 minute default lockLifetime
-    this._sort = config.sort || {nextRunAt: 1, priority: -1};
-    this._indices = {name: 1, ...this._sort, priority: -1, lockedAt: 1, nextRunAt: 1, disabled: 1};
-
-    this._isLockingOnTheFly = false;
-    this._jobsToLock = [];
-    this._ready = new Promise(resolve => this.once('ready', resolve));
-
-    if (config.mongo) {
-      this.mongo(config.mongo, config.db ? config.db.collection : undefined, cb);
-      if (config.mongo.s && config.mongo.topology && config.mongo.topology.s) {
-        this._mongoUseUnifiedTopology = Boolean(config.mongo.topology.s.options.useUnifiedTopology);
-      }
-    } else if (config.db) {
-      this.database(config.db.address, config.db.collection, config.db.options, cb);
-    }
-  }
-}
-
-Agenda.prototype.mongo = require('./mongo');
-Agenda.prototype.database = require('./database');
-Agenda.prototype.db_init = require('./db-init'); // eslint-disable-line camelcase
-Agenda.prototype.name = require('./name');
-Agenda.prototype.processEvery = require('./process-every');
-Agenda.prototype.maxConcurrency = require('./max-concurrency');
-Agenda.prototype.defaultConcurrency = require('./default-concurrency');
-Agenda.prototype.lockLimit = require('./locklimit');
-Agenda.prototype.defaultLockLimit = require('./default-lock-limit');
-Agenda.prototype.defaultLockLifetime = require('./default-lock-lifetime');
-Agenda.prototype.sort = require('./sort');
-Agenda.prototype.create = require('./create');
-Agenda.prototype.jobs = require('./jobs');
-Agenda.prototype.purge = require('./purge');
-Agenda.prototype.define = require('./define');
-Agenda.prototype.every = require('./every');
-Agenda.prototype.schedule = require('./schedule');
-Agenda.prototype.now = require('./now');
-Agenda.prototype.cancel = require('./cancel');
-Agenda.prototype.saveJob = require('./save-job');
-Agenda.prototype.start = require('./start');
-Agenda.prototype.stop = require('./stop');
-Agenda.prototype._findAndLockNextJob = require('./find-and-lock-next-job');
-
-module.exports = Agenda;
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/agenda_job-processing-queue.js.html b/docs/agenda/3.1.0/agenda_job-processing-queue.js.html deleted file mode 100644 index cef1c33..0000000 --- a/docs/agenda/3.1.0/agenda_job-processing-queue.js.html +++ /dev/null @@ -1,192 +0,0 @@ - - - - - - - - - - - agenda/job-processing-queue.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/job-processing-queue.js -

- - - - - -
-
-
/**
- * @class
- * @param {Object} args - Job Options
- * @property {Object} agenda - The Agenda instance
- * @property {Object} attrs
- */
-class JobProcessingQueue {
-  constructor() {
-    this._queue = [];
-  }
-
-  get length() {
-    return this._queue.length;
-  }
-}
-
-/**
- * Pops and returns last queue element (next job to be processed) without checking concurrency.
- * @returns {Job} Next Job to be processed
- */
-JobProcessingQueue.prototype.pop = function() {
-  return this._queue.pop();
-};
-
-/**
- * Inserts job in first queue position
- * @param {Job} job job to add to queue
- * @returns {undefined}
- */
-JobProcessingQueue.prototype.push = function(job) {
-  this._queue.push(job);
-};
-
-/**
- * Inserts job in queue where it will be order from left to right in decreasing
- * order of nextRunAt and priority (in case of same nextRunAt), if all values
- * are even the first jobs to be introduced will have priority
- * @param {Job} job job to add to queue
- * @returns {undefined}
- */
-JobProcessingQueue.prototype.insert = function(job) {
-  const matchIndex = this._queue.findIndex(element => {
-    if (element.attrs.nextRunAt.getTime() <= job.attrs.nextRunAt.getTime()) {
-      if (element.attrs.nextRunAt.getTime() === job.attrs.nextRunAt.getTime()) {
-        if (element.attrs.priority >= job.attrs.priority) {
-          return true;
-        }
-      } else {
-        return true;
-      }
-    }
-
-    return false;
-  });
-
-  if (matchIndex === -1) {
-    this._queue.push(job);
-  } else {
-    this._queue.splice(matchIndex, 0, job);
-  }
-};
-
-/**
- * Returns (does not pop, element remains in queue) first element (always from the right)
- * that can be processed (not blocked by concurrency execution)
- * @param {Object} agendaDefinitions job to add to queue
- * @returns {Job} Next Job to be processed
- */
-JobProcessingQueue.prototype.returnNextConcurrencyFreeJob = function(agendaDefinitions) {
-  let next;
-  for (next = this._queue.length - 1; next > 0; next -= 1) {
-    const def = agendaDefinitions[this._queue[next].attrs.name];
-    if (def.concurrency > def.running) {
-      break;
-    }
-  }
-
-  return this._queue[next];
-};
-
-module.exports = JobProcessingQueue;
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/agenda_jobs.js.html b/docs/agenda/3.1.0/agenda_jobs.js.html deleted file mode 100644 index d2bc2de..0000000 --- a/docs/agenda/3.1.0/agenda_jobs.js.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - agenda/jobs.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/jobs.js -

- - - - - -
-
-
'use strict';
-const {createJob} = require('../utils');
-
-/**
- * Finds all jobs matching 'query'
- * @name Agenda#jobs
- * @function
- * @param {Object} query object for MongoDB
- * @param {Object} sort object for MongoDB
- * @param {Number} limit number of documents to return from MongoDB
- * @param {Number} number of documents to skip in MongoDB
- * @returns {Promise} resolves when fails or passes
- */
-module.exports = async function(query = {}, sort = {}, limit = 0, skip = 0) {
-  const result = await this._collection
-    .find(query)
-    .sort(sort)
-    .limit(limit)
-    .skip(skip)
-    .toArray();
-
-  return result.map(job => createJob(this, job));
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/agenda_locklimit.js.html b/docs/agenda/3.1.0/agenda_locklimit.js.html deleted file mode 100644 index 3ec54b4..0000000 --- a/docs/agenda/3.1.0/agenda_locklimit.js.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - agenda/locklimit.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/locklimit.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:locklimit');
-
-/**
- * Set the default amount jobs that are allowed to be locked at one time (GLOBAL)
- * @name Agenda#locklimit
- * @function
- * @param {Number} num Lock limit
- * @returns {exports} agenda instance
- */
-module.exports = function(num) {
-  // @NOTE: Is this different than max concurrency?
-  debug('Agenda.lockLimit(%d)', num);
-  this._lockLimit = num;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/agenda_max-concurrency.js.html b/docs/agenda/3.1.0/agenda_max-concurrency.js.html deleted file mode 100644 index 76f0638..0000000 --- a/docs/agenda/3.1.0/agenda_max-concurrency.js.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - agenda/max-concurrency.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/max-concurrency.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:maxConcurrency');
-
-/**
- * Set the concurrency for jobs (globally), type does not matter
- * @name Agenda#maxConcurrency
- * @function
- * @param {Number} num max concurrency value
- * @returns {exports} agenda instance
- */
-module.exports = function(num) {
-  debug('Agenda.maxConcurrency(%d)', num);
-  this._maxConcurrency = num;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/agenda_mongo.js.html b/docs/agenda/3.1.0/agenda_mongo.js.html deleted file mode 100644 index e7df186..0000000 --- a/docs/agenda/3.1.0/agenda_mongo.js.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - agenda/mongo.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/mongo.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Build method used to add MongoDB connection details
- * @name Agenda#mongo
- * @function
- * @param {MongoClient} mdb instance of MongoClient to use
- * @param {String} collection name collection we want to use ('agendaJobs')
- * @param {Function} cb called when MongoDB connection fails or passes
- * @returns {exports} instance of Agenda
- */
-module.exports = function(mdb, collection, cb) {
-  this._mdb = mdb;
-  this.db_init(collection, cb);
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/agenda_name.js.html b/docs/agenda/3.1.0/agenda_name.js.html deleted file mode 100644 index 88b3f01..0000000 --- a/docs/agenda/3.1.0/agenda_name.js.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - agenda/name.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/name.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:name');
-
-/**
- * Set name of queue
- * @name Agenda#name
- * @function
- * @param {String} name name of agenda instance
- * @returns {exports} agenda instance
- */
-module.exports = function(name) {
-  debug('Agenda.name(%s)', name);
-  this._name = name;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/agenda_now.js.html b/docs/agenda/3.1.0/agenda_now.js.html deleted file mode 100644 index c09a687..0000000 --- a/docs/agenda/3.1.0/agenda_now.js.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - - - - - agenda/now.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/now.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:now');
-const noCallback = require('../no-callback');
-
-/**
- * Create a job for this exact moment
- * @name Agenda#now
- * @function
- * @param {String} name name of job to schedule
- * @param {Object} data data to pass to job
- * @returns {Promise} resolves with the new job instance created
- */
-module.exports = async function(name, data) {
-  debug('Agenda.now(%s, [Object])', name);
-  try {
-    // eslint-disable-next-line prefer-rest-params
-    noCallback(arguments, 2);
-    const job = this.create(name, data);
-
-    job.schedule(new Date());
-    await job.save();
-
-    return job;
-  } catch (error) {
-    debug('error trying to create a job for this exact moment');
-    throw error;
-  }
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/agenda_process-every.js.html b/docs/agenda/3.1.0/agenda_process-every.js.html deleted file mode 100644 index 4896f24..0000000 --- a/docs/agenda/3.1.0/agenda_process-every.js.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - agenda/process-every.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/process-every.js -

- - - - - -
-
-
'use strict';
-const humanInterval = require('human-interval');
-const debug = require('debug')('agenda:processEvery');
-
-/**
- * Set the default process interval
- * @name Agenda#processEvery
- * @function
- * @param {Number|String} time - time to process, expressed in human interval
- * @returns {exports} agenda instance
- */
-module.exports = function(time) {
-  debug('Agenda.processEvery(%d)', time);
-  this._processEvery = humanInterval(time);
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/agenda_purge.js.html b/docs/agenda/3.1.0/agenda_purge.js.html deleted file mode 100644 index 7b47e91..0000000 --- a/docs/agenda/3.1.0/agenda_purge.js.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - agenda/purge.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/purge.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:purge');
-
-/**
- * Removes all jobs from queue
- * @name Agenda#purge
- * @function
- * @returns {Promise} resolved when job cancelling fails or passes
- */
-module.exports = async function() {
-  // @NOTE: Only use after defining your jobs
-  const definedNames = Object.keys(this._definitions);
-  debug('Agenda.purge(%o)', definedNames);
-  return this.cancel({name: {$not: {$in: definedNames}}});
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/agenda_save-job.js.html b/docs/agenda/3.1.0/agenda_save-job.js.html deleted file mode 100644 index 3f0df3e..0000000 --- a/docs/agenda/3.1.0/agenda_save-job.js.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - - - - - - agenda/save-job.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/save-job.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:saveJob');
-const {processJobs} = require('../utils');
-
-/**
- * Given a result for findOneAndUpdate() or insert() above, determine whether to process
- * the job immediately or to let the processJobs() interval pick it up later
- * @param {Job} job job instance
- * @param {*} result the data returned from the findOneAndUpdate() call or insertOne() call
- * @access private
- * @returns {undefined}
- */
-const processDbResult = (job, result) => {
-  debug('processDbResult() called with success, checking whether to process job immediately or not');
-
-  // We have a result from the above calls
-  // findOneAndUpdate() returns different results than insertOne() so check for that
-  let res = result.ops ? result.ops : result.value;
-  if (res) {
-    // If it is an array, grab the first job
-    if (Array.isArray(res)) {
-      res = res[0];
-    }
-
-    // Grab ID and nextRunAt from MongoDB and store it as an attribute on Job
-    job.attrs._id = res._id;
-    job.attrs.nextRunAt = res.nextRunAt;
-
-    // If the current job would have been processed in an older scan, process the job immediately
-    if (job.attrs.nextRunAt && job.attrs.nextRunAt < this._nextScanAt) {
-      debug('[%s:%s] job would have ran by nextScanAt, processing the job immediately', job.attrs.name, res._id);
-      processJobs.call(this, job);
-    }
-  }
-
-  // Return the Job instance
-  return job;
-};
-
-/**
- * Save the properties on a job to MongoDB
- * @name Agenda#saveJob
- * @function
- * @param {Job} job job to save into MongoDB
- * @returns {Promise} resolves when job is saved or errors
- */
-module.exports = async function(job) {
-  try {
-    debug('attempting to save a job into Agenda instance');
-
-    // Grab information needed to save job but that we don't want to persist in MongoDB
-    const id = job.attrs._id;
-    const {unique, uniqueOpts} = job.attrs;
-
-    // Store job as JSON and remove props we don't want to store from object
-    const props = job.toJSON();
-    delete props._id;
-    delete props.unique;
-    delete props.uniqueOpts;
-
-    // Store name of agenda queue as last modifier in job data
-    props.lastModifiedBy = this._name;
-    debug('[job %s] set job props: \n%O', id, props);
-
-    // Grab current time and set default query options for MongoDB
-    const now = new Date();
-    const protect = {};
-    let update = {$set: props};
-    debug('current time stored as %s', now.toISOString());
-
-    // If the job already had an ID, then update the properties of the job
-    // i.e, who last modified it, etc
-    if (id) {
-      // Update the job and process the resulting data'
-      debug('job already has _id, calling findOneAndUpdate() using _id as query');
-      const result = await this._collection.findOneAndUpdate(
-        {_id: id},
-        update,
-        {returnDocument: 'after'}
-      );
-      return processDbResult(job, result);
-    }
-
-    if (props.type === 'single') {
-      // Job type set to 'single' so...
-      // NOTE: Again, not sure about difference between 'single' here and 'once' in job.js
-      debug('job with type of "single" found');
-
-      // If the nextRunAt time is older than the current time, "protect" that property, meaning, don't change
-      // a scheduled job's next run time!
-      if (props.nextRunAt && props.nextRunAt <= now) {
-        debug('job has a scheduled nextRunAt time, protecting that field from upsert');
-        protect.nextRunAt = props.nextRunAt;
-        delete props.nextRunAt;
-      }
-
-      // If we have things to protect, set them in MongoDB using $setOnInsert
-      if (Object.keys(protect).length > 0) {
-        update.$setOnInsert = protect;
-      }
-
-      // Try an upsert
-      // NOTE: 'single' again, not exactly sure what it means
-      debug('calling findOneAndUpdate() with job name and type of "single" as query');
-      const result = await this._collection.findOneAndUpdate({
-        name: props.name,
-        type: 'single'
-      },
-      update, {
-        upsert: true,
-        returnDocument: 'after'
-      });
-      return processDbResult(job, result);
-    }
-
-    if (unique) {
-      // If we want the job to be unique, then we can upsert based on the 'unique' query object that was passed in
-      const query = job.attrs.unique;
-      query.name = props.name;
-      if (uniqueOpts && uniqueOpts.insertOnly) {
-        update = {$setOnInsert: props};
-      }
-
-      // Use the 'unique' query object to find an existing job or create a new one
-      debug('calling findOneAndUpdate() with unique object as query: \n%O', query);
-      const result = await this._collection.findOneAndUpdate(query, update, {upsert: true, returnDocument: 'after'});
-      return processDbResult(job, result);
-    }
-
-    // If all else fails, the job does not exist yet so we just insert it into MongoDB
-    debug('using default behavior, inserting new job via insertOne() with props that were set: \n%O', props);
-    const result = await this._collection.insertOne(props);
-    return processDbResult(job, result);
-  } catch (error) {
-    debug('processDbResult() received an error, job was not updated/created');
-    throw error;
-  }
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/agenda_schedule.js.html b/docs/agenda/3.1.0/agenda_schedule.js.html deleted file mode 100644 index 0718a8e..0000000 --- a/docs/agenda/3.1.0/agenda_schedule.js.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - - - - agenda/schedule.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/schedule.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:schedule');
-
-/**
- * Schedule a job or jobs at a specific time
- * @name Agenda#schedule
- * @function
- * @param {String} when when the job gets run
- * @param {Array<String>} names array of job names to run
- * @param {Object} data data to send to job
- * @returns {Promise<Job|Job[]>} job or jobs created
- */
-module.exports = function(when, names, data) {
-  const self = this;
-
-  /**
-   * Internal method that creates a job with given date
-   * @param {String} when when the job gets run
-   * @param {String} name of job to run
-   * @param {Object} data data to send to job
-   * @returns {Job} instance of new job
-   */
-  const createJob = async(when, name, data) => {
-    const job = self.create(name, data);
-
-    await job.schedule(when).save();
-
-    return job;
-  };
-
-  /**
-   * Internal helper method that calls createJob on a names array
-   * @param {String} when when the job gets run
-   * @param {*} names of jobs to run
-   * @param {Object} data data to send to job
-   * @returns {Array<Job>} jobs that were created
-   */
-  const createJobs = async(when, names, data) => {
-    try {
-      const jobs = await Promise.all(names.map(name => createJob(when, name, data)));
-      debug('Agenda.schedule()::createJobs() -> all jobs created successfully');
-      return jobs;
-    } catch (error) {
-      debug('Agenda.schedule()::createJobs() -> error creating one or more of the jobs');
-      throw error;
-    }
-  };
-
-  if (typeof names === 'string' || names instanceof String) {
-    debug('Agenda.schedule(%s, %O, [%O], cb)', when, names);
-    return createJob(when, names, data);
-  }
-
-  if (Array.isArray(names)) {
-    debug('Agenda.schedule(%s, %O, [%O])', when, names);
-    return createJobs(when, names, data);
-  }
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/agenda_sort.js.html b/docs/agenda/3.1.0/agenda_sort.js.html deleted file mode 100644 index 7b1727e..0000000 --- a/docs/agenda/3.1.0/agenda_sort.js.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - agenda/sort.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/sort.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:sort');
-
-/**
- * Set the sort query for finding next job
- * Default is { nextRunAt: 1, priority: -1 }
- * @name Agenda#sort
- * @function
- * @param {Object} query sort query object for MongoDB
- * @returns {exports} agenda instance
- */
-module.exports = function(query) {
-  debug('Agenda.sort([Object])');
-  this._sort = query;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/agenda_start.js.html b/docs/agenda/3.1.0/agenda_start.js.html deleted file mode 100644 index 1f0f8e0..0000000 --- a/docs/agenda/3.1.0/agenda_start.js.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - - - - - agenda/start.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/start.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:start');
-const {processJobs} = require('../utils');
-
-/**
- * Starts processing jobs using processJobs() methods, storing an interval ID
- * This method will only resolve if a db has been set up beforehand.
- * @name Agenda#start
- * @function
- * @returns {Promise} resolves if db set beforehand, returns undefined otherwise
- */
-module.exports = async function() {
-  if (this._processInterval) {
-    debug('Agenda.start was already called, ignoring');
-    return this._ready;
-  }
-
-  await this._ready;
-  debug('Agenda.start called, creating interval to call processJobs every [%dms]', this._processEvery);
-  this._processInterval = setInterval(processJobs.bind(this), this._processEvery);
-  process.nextTick(processJobs.bind(this));
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/agenda_stop.js.html b/docs/agenda/3.1.0/agenda_stop.js.html deleted file mode 100644 index cf50036..0000000 --- a/docs/agenda/3.1.0/agenda_stop.js.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - - - - agenda/stop.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- agenda/stop.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:stop');
-
-/**
- * Clear the interval that processes the jobs
- * @name Agenda#stop
- * @function
- * @returns {Promise} resolves when job unlocking fails or passes
- */
-module.exports = function() {
-  const self = this;
-  /**
-   * Internal method to unlock jobs so that they can be re-run
-   * NOTE: May need to update what properties get set here, since job unlocking seems to fail
-   * @access private
-   * @returns {Promise} resolves when job unlocking fails or passes
-   */
-  const _unlockJobs = function() {
-    return new Promise((resolve, reject) => {
-      debug('Agenda._unlockJobs()');
-      const jobIds = self._lockedJobs.map(job => job.attrs._id);
-
-      if (jobIds.length === 0) {
-        debug('no jobs to unlock');
-        return resolve();
-      }
-
-      debug('about to unlock jobs with ids: %O', jobIds);
-      self._collection.updateMany({_id: {$in: jobIds}}, {$set: {lockedAt: null}}, err => {
-        if (err) {
-          return reject(err);
-        }
-
-        self._lockedJobs = [];
-        return resolve();
-      });
-    });
-  };
-
-  debug('Agenda.stop called, clearing interval for processJobs()');
-  clearInterval(this._processInterval);
-  this._processInterval = undefined;
-  return _unlockJobs();
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/fonts/OpenSans-Bold-webfont.eot b/docs/agenda/3.1.0/fonts/OpenSans-Bold-webfont.eot deleted file mode 100644 index 5d20d91..0000000 Binary files a/docs/agenda/3.1.0/fonts/OpenSans-Bold-webfont.eot and /dev/null differ diff --git a/docs/agenda/3.1.0/fonts/OpenSans-Bold-webfont.svg b/docs/agenda/3.1.0/fonts/OpenSans-Bold-webfont.svg deleted file mode 100644 index 3ed7be4..0000000 --- a/docs/agenda/3.1.0/fonts/OpenSans-Bold-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/3.1.0/fonts/OpenSans-Bold-webfont.woff b/docs/agenda/3.1.0/fonts/OpenSans-Bold-webfont.woff deleted file mode 100644 index 1205787..0000000 Binary files a/docs/agenda/3.1.0/fonts/OpenSans-Bold-webfont.woff and /dev/null differ diff --git a/docs/agenda/3.1.0/fonts/OpenSans-BoldItalic-webfont.eot b/docs/agenda/3.1.0/fonts/OpenSans-BoldItalic-webfont.eot deleted file mode 100644 index 1f639a1..0000000 Binary files a/docs/agenda/3.1.0/fonts/OpenSans-BoldItalic-webfont.eot and /dev/null differ diff --git a/docs/agenda/3.1.0/fonts/OpenSans-BoldItalic-webfont.svg b/docs/agenda/3.1.0/fonts/OpenSans-BoldItalic-webfont.svg deleted file mode 100644 index 6a2607b..0000000 --- a/docs/agenda/3.1.0/fonts/OpenSans-BoldItalic-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/3.1.0/fonts/OpenSans-BoldItalic-webfont.woff b/docs/agenda/3.1.0/fonts/OpenSans-BoldItalic-webfont.woff deleted file mode 100644 index ed760c0..0000000 Binary files a/docs/agenda/3.1.0/fonts/OpenSans-BoldItalic-webfont.woff and /dev/null differ diff --git a/docs/agenda/3.1.0/fonts/OpenSans-Italic-webfont.eot b/docs/agenda/3.1.0/fonts/OpenSans-Italic-webfont.eot deleted file mode 100644 index 0c8a0ae..0000000 Binary files a/docs/agenda/3.1.0/fonts/OpenSans-Italic-webfont.eot and /dev/null differ diff --git a/docs/agenda/3.1.0/fonts/OpenSans-Italic-webfont.svg b/docs/agenda/3.1.0/fonts/OpenSans-Italic-webfont.svg deleted file mode 100644 index e1075dc..0000000 --- a/docs/agenda/3.1.0/fonts/OpenSans-Italic-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/3.1.0/fonts/OpenSans-Italic-webfont.woff b/docs/agenda/3.1.0/fonts/OpenSans-Italic-webfont.woff deleted file mode 100644 index ff652e6..0000000 Binary files a/docs/agenda/3.1.0/fonts/OpenSans-Italic-webfont.woff and /dev/null differ diff --git a/docs/agenda/3.1.0/fonts/OpenSans-Light-webfont.eot b/docs/agenda/3.1.0/fonts/OpenSans-Light-webfont.eot deleted file mode 100644 index 1486840..0000000 Binary files a/docs/agenda/3.1.0/fonts/OpenSans-Light-webfont.eot and /dev/null differ diff --git a/docs/agenda/3.1.0/fonts/OpenSans-Light-webfont.svg b/docs/agenda/3.1.0/fonts/OpenSans-Light-webfont.svg deleted file mode 100644 index 11a472c..0000000 --- a/docs/agenda/3.1.0/fonts/OpenSans-Light-webfont.svg +++ /dev/null @@ -1,1831 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/3.1.0/fonts/OpenSans-Light-webfont.woff b/docs/agenda/3.1.0/fonts/OpenSans-Light-webfont.woff deleted file mode 100644 index e786074..0000000 Binary files a/docs/agenda/3.1.0/fonts/OpenSans-Light-webfont.woff and /dev/null differ diff --git a/docs/agenda/3.1.0/fonts/OpenSans-LightItalic-webfont.eot b/docs/agenda/3.1.0/fonts/OpenSans-LightItalic-webfont.eot deleted file mode 100644 index 8f44592..0000000 Binary files a/docs/agenda/3.1.0/fonts/OpenSans-LightItalic-webfont.eot and /dev/null differ diff --git a/docs/agenda/3.1.0/fonts/OpenSans-LightItalic-webfont.svg b/docs/agenda/3.1.0/fonts/OpenSans-LightItalic-webfont.svg deleted file mode 100644 index 431d7e3..0000000 --- a/docs/agenda/3.1.0/fonts/OpenSans-LightItalic-webfont.svg +++ /dev/null @@ -1,1835 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/3.1.0/fonts/OpenSans-LightItalic-webfont.woff b/docs/agenda/3.1.0/fonts/OpenSans-LightItalic-webfont.woff deleted file mode 100644 index 43e8b9e..0000000 Binary files a/docs/agenda/3.1.0/fonts/OpenSans-LightItalic-webfont.woff and /dev/null differ diff --git a/docs/agenda/3.1.0/fonts/OpenSans-Regular-webfont.eot b/docs/agenda/3.1.0/fonts/OpenSans-Regular-webfont.eot deleted file mode 100644 index 6bbc3cf..0000000 Binary files a/docs/agenda/3.1.0/fonts/OpenSans-Regular-webfont.eot and /dev/null differ diff --git a/docs/agenda/3.1.0/fonts/OpenSans-Regular-webfont.svg b/docs/agenda/3.1.0/fonts/OpenSans-Regular-webfont.svg deleted file mode 100644 index 25a3952..0000000 --- a/docs/agenda/3.1.0/fonts/OpenSans-Regular-webfont.svg +++ /dev/null @@ -1,1831 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/3.1.0/fonts/OpenSans-Regular-webfont.woff b/docs/agenda/3.1.0/fonts/OpenSans-Regular-webfont.woff deleted file mode 100644 index e231183..0000000 Binary files a/docs/agenda/3.1.0/fonts/OpenSans-Regular-webfont.woff and /dev/null differ diff --git a/docs/agenda/3.1.0/fonts/OpenSans-Semibold-webfont.eot b/docs/agenda/3.1.0/fonts/OpenSans-Semibold-webfont.eot deleted file mode 100755 index d8375dd..0000000 Binary files a/docs/agenda/3.1.0/fonts/OpenSans-Semibold-webfont.eot and /dev/null differ diff --git a/docs/agenda/3.1.0/fonts/OpenSans-Semibold-webfont.svg b/docs/agenda/3.1.0/fonts/OpenSans-Semibold-webfont.svg deleted file mode 100755 index eec4db8..0000000 --- a/docs/agenda/3.1.0/fonts/OpenSans-Semibold-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/3.1.0/fonts/OpenSans-Semibold-webfont.ttf b/docs/agenda/3.1.0/fonts/OpenSans-Semibold-webfont.ttf deleted file mode 100755 index b329084..0000000 Binary files a/docs/agenda/3.1.0/fonts/OpenSans-Semibold-webfont.ttf and /dev/null differ diff --git a/docs/agenda/3.1.0/fonts/OpenSans-Semibold-webfont.woff b/docs/agenda/3.1.0/fonts/OpenSans-Semibold-webfont.woff deleted file mode 100755 index 28d6ade..0000000 Binary files a/docs/agenda/3.1.0/fonts/OpenSans-Semibold-webfont.woff and /dev/null differ diff --git a/docs/agenda/3.1.0/fonts/OpenSans-SemiboldItalic-webfont.eot b/docs/agenda/3.1.0/fonts/OpenSans-SemiboldItalic-webfont.eot deleted file mode 100755 index 0ab1db2..0000000 Binary files a/docs/agenda/3.1.0/fonts/OpenSans-SemiboldItalic-webfont.eot and /dev/null differ diff --git a/docs/agenda/3.1.0/fonts/OpenSans-SemiboldItalic-webfont.svg b/docs/agenda/3.1.0/fonts/OpenSans-SemiboldItalic-webfont.svg deleted file mode 100755 index 7166ec1..0000000 --- a/docs/agenda/3.1.0/fonts/OpenSans-SemiboldItalic-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/3.1.0/fonts/OpenSans-SemiboldItalic-webfont.ttf b/docs/agenda/3.1.0/fonts/OpenSans-SemiboldItalic-webfont.ttf deleted file mode 100755 index d2d6318..0000000 Binary files a/docs/agenda/3.1.0/fonts/OpenSans-SemiboldItalic-webfont.ttf and /dev/null differ diff --git a/docs/agenda/3.1.0/fonts/OpenSans-SemiboldItalic-webfont.woff b/docs/agenda/3.1.0/fonts/OpenSans-SemiboldItalic-webfont.woff deleted file mode 100755 index d4dfca4..0000000 Binary files a/docs/agenda/3.1.0/fonts/OpenSans-SemiboldItalic-webfont.woff and /dev/null differ diff --git a/docs/agenda/3.1.0/global.html b/docs/agenda/3.1.0/global.html deleted file mode 100644 index 786d6b0..0000000 --- a/docs/agenda/3.1.0/global.html +++ /dev/null @@ -1,338 +0,0 @@ - - - - - - - - - Global - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- Global -

- - - - -
-
- -

- - - -

- - - -
- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - - - - - - - - - -

Methods

- - - - - - - - - - - - - -

- parsePriority(priority) → {Number} -

-
- - - - - -
-

Internal method to turn priority into a number

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
priority - - - - String - - - | - - - Number - - - - - - - -

string to parse into number

- -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - -
-
- - - - -
- -
- - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/3.1.0/icons/home.svg b/docs/agenda/3.1.0/icons/home.svg deleted file mode 100644 index 676d2d3..0000000 --- a/docs/agenda/3.1.0/icons/home.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/docs/agenda/3.1.0/icons/search.svg b/docs/agenda/3.1.0/icons/search.svg deleted file mode 100644 index ccc84b6..0000000 --- a/docs/agenda/3.1.0/icons/search.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/docs/agenda/3.1.0/index.html b/docs/agenda/3.1.0/index.html deleted file mode 100644 index 94378bd..0000000 --- a/docs/agenda/3.1.0/index.html +++ /dev/null @@ -1,936 +0,0 @@ - - - - - - - - - Home - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- - - - - - - - - - - - -
-
-

- Agenda -

-

- A light-weight job scheduling library for Node.js -

-

- Slack Status - Build Status - dependencies Status - devDependencies Status - Coverage Status -
-
-
-

-

Agenda offers

-
    -
  • Minimal overhead. Agenda aims to keep its code base small.
  • -
  • Mongo backed persistence layer.
  • -
  • Promises based API.
  • -
  • Scheduling with configurable priority, concurrency, and repeating.
  • -
  • Scheduling via cron or human readable syntax.
  • -
  • Event backed job queue that you can hook into.
  • -
  • Agendash: optional standalone web-interface.
  • -
  • Agenda-rest: optional standalone REST API.
  • -
  • inversify-agenda - Some utilities for the development of agenda workers with Inversify
  • -
-

Feature Comparison

-

Since there are a few job queue solutions, here a table comparing them to help you use the one that -better suits your needs.

-

Agenda is great if you need something that is simple and backed by MongoDB.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FeatureBullBeeAgenda
Backendredisredismongo
Prioritiesβœ“βœ“
Concurrencyβœ“βœ“βœ“
Delayed jobsβœ“βœ“
Global eventsβœ“
Rate Limiterβœ“
Pause/Resumeβœ“
Sandboxed workerβœ“
Repeatable jobsβœ“βœ“
Atomic opsβœ“βœ“
Persistenceβœ“βœ“βœ“
UIβœ“βœ“
REST APIβœ“
Optimized forJobs / MessagesMessagesJobs
-

Kudos for making the comparison chart goes to Bull maintainers.

-

Installation

-

Install via NPM

-
npm install agenda
-
-

You will also need a working Mongo database (v3) to point it to.

-

Example Usage

-
const mongoConnectionString = 'mongodb://127.0.0.1/agenda';
-
-const agenda = new Agenda({db: {address: mongoConnectionString}});
-
-// Or override the default collection name:
-// const agenda = new Agenda({db: {address: mongoConnectionString, collection: 'jobCollectionName'}});
-
-// or pass additional connection options:
-// const agenda = new Agenda({db: {address: mongoConnectionString, collection: 'jobCollectionName', options: {ssl: true}}});
-
-// or pass in an existing mongodb-native MongoClient instance
-// const agenda = new Agenda({mongo: myMongoClient});
-
-agenda.define('delete old users', async job => {
-  await User.remove({lastLogIn: {$lt: twoDaysAgo}});
-});
-
-(async function() { // IIFE to give access to async/await
-  await agenda.start();
-
-  await agenda.every('3 minutes', 'delete old users');
-
-  // Alternatively, you could also do:
-  await agenda.every('*/3 * * * *', 'delete old users');
-})();
-
-
agenda.define('send email report', {priority: 'high', concurrency: 10}, async job => {
-  const {to} = job.attrs.data;
-  await emailClient.send({
-    to,
-    from: 'example@example.com',
-    subject: 'Email Report',
-    body: '...'
-  });
-});
-
-(async function() {
-  await agenda.start();
-  await agenda.schedule('in 20 minutes', 'send email report', {to: 'admin@example.com'});
-})();
-
-
(async function() {
-  const weeklyReport = agenda.create('send email report', {to: 'example@example.com'});
-  await agenda.start();
-  await weeklyReport.repeatEvery('1 week').save();
-})();
-
-

Full documentation

-

Agenda's basic control structure is an instance of an agenda. Agenda's are -mapped to a database collection and load the jobs from within.

-

Table of Contents

- -

Configuring an agenda

-

All configuration methods are chainable, meaning you can do something like:

-
const agenda = new Agenda();
-agenda
-  .database(...)
-  .processEvery('3 minutes')
-  ...;
-
-

Agenda uses Human Interval for specifying the intervals. It supports the following units:

-

seconds, minutes, hours, days,weeks, months -- assumes 30 days, years -- assumes 365 days

-

More sophisticated examples

-
agenda.processEvery('one minute');
-agenda.processEvery('1.5 minutes');
-agenda.processEvery('3 days and 4 hours');
-agenda.processEvery('3 days, 4 hours and 36 seconds');
-
-

database(url, [collectionName])

-

Specifies the database at the url specified. If no collection name is given, -agendaJobs is used.

-
agenda.database('localhost:27017/agenda-test', 'agendaJobs');
-
-

You can also specify it during instantiation.

-
const agenda = new Agenda({db: {address: 'localhost:27017/agenda-test', collection: 'agendaJobs'}});
-
-

Agenda will emit a ready event (see Agenda Events) when properly connected to the database. -It is safe to call agenda.start() without waiting for this event, as this is handled internally. -If you're using the db options, or call database, then you may still need to listen for ready before saving jobs.

-

mongo(dbInstance)

-

Use an existing mongodb-native MongoClient/Db instance. This can help consolidate connections to a -database. You can instead use .database to have agenda handle connecting for you.

-

You can also specify it during instantiation:

-
const agenda = new Agenda({mongo: mongoClientInstance.db('agenda-test')});
-
-

Note that MongoClient.connect() returns a mongoClientInstance since node-mongodb-native 3.0.0, while it used to return a dbInstance that could then be directly passed to agenda.

-

name(name)

-

Takes a string name and sets lastModifiedBy to it in the job database. -Useful for if you have multiple job processors (agendas) and want to see which -job queue last ran the job.

-
agenda.name(os.hostname + '-' + process.pid);
-
-

You can also specify it during instantiation

-
const agenda = new Agenda({name: 'test queue'});
-
-

processEvery(interval)

-

Takes a string interval which can be either a traditional javascript number, -or a string such as 3 minutes

-

Specifies the frequency at which agenda will query the database looking for jobs -that need to be processed. Agenda internally uses setTimeout to guarantee that -jobs run at (close to ~3ms) the right time.

-

Decreasing the frequency will result in fewer database queries, but more jobs -being stored in memory.

-

Also worth noting is that if the job queue is shutdown, any jobs stored in memory -that haven't run will still be locked, meaning that you may have to wait for the -lock to expire. By default it is '5 seconds'.

-
agenda.processEvery('1 minute');
-
-

You can also specify it during instantiation

-
const agenda = new Agenda({processEvery: '30 seconds'});
-
-

maxConcurrency(number)

-

Takes a number which specifies the max number of jobs that can be running at -any given moment. By default it is 20.

-
agenda.maxConcurrency(20);
-
-

You can also specify it during instantiation

-
const agenda = new Agenda({maxConcurrency: 20});
-
-

defaultConcurrency(number)

-

Takes a number which specifies the default number of a specific job that can be running at -any given moment. By default it is 5.

-
agenda.defaultConcurrency(5);
-
-

You can also specify it during instantiation

-
const agenda = new Agenda({defaultConcurrency: 5});
-
-

lockLimit(number)

-

Takes a number which specifies the max number jobs that can be locked at any given moment. By default it is 0 for no max.

-
agenda.lockLimit(0);
-
-

You can also specify it during instantiation

-
const agenda = new Agenda({lockLimit: 0});
-
-

defaultLockLimit(number)

-

Takes a number which specifies the default number of a specific job that can be locked at any given moment. By default it is 0 for no max.

-
agenda.defaultLockLimit(0);
-
-

You can also specify it during instantiation

-
const agenda = new Agenda({defaultLockLimit: 0});
-
-

defaultLockLifetime(number)

-

Takes a number which specifies the default lock lifetime in milliseconds. By -default it is 10 minutes. This can be overridden by specifying the -lockLifetime option to a defined job.

-

A job will unlock if it is finished (ie. the returned Promise resolves/rejects -or done is specified in the params and done() is called) before the -lockLifetime. The lock is useful if the job crashes or times out.

-
agenda.defaultLockLifetime(10000);
-
-

You can also specify it during instantiation

-
const agenda = new Agenda({defaultLockLifetime: 10000});
-
-

sort(query)

-

Takes a query which specifies the sort query to be used for finding and locking the next job.

-

By default it is { nextRunAt: 1, priority: -1 }, which obeys a first in first out approach, with respect to priority.

-

Agenda Events

-

An instance of an agenda will emit the following events:

-
    -
  • ready - called when Agenda mongo connection is successfully opened and indices created. -If you're passing agenda an existing connection, you shouldn't need to listen for this, as agenda.start() will not resolve until indices have been created. -If you're using the db options, or call database, then you may still need to listen for the ready event before saving jobs. agenda.start() will still wait for the connection to be opened.
  • -
  • error - called when Agenda mongo connection process has thrown an error
  • -
-
await agenda.start();
-
-

Defining Job Processors

-

Before you can use a job, you must define its processing behavior.

-

define(jobName, [options], fn)

-

Defines a job with the name of jobName. When a job of jobName gets run, it -will be passed to fn(job, done). To maintain asynchronous behavior, you may -either provide a Promise-returning function in fn or provide done as a -second parameter to fn. If done is specified in the function signature, you -must call done() when you are processing the job. If your function is -synchronous or returns a Promise, you may omit done from the signature.

-

options is an optional argument which can overwrite the defaults. It can take -the following:

-
    -
  • concurrency: number maximum number of that job that can be running at once (per instance of agenda)
  • -
  • lockLimit: number maximum number of that job that can be locked at once (per instance of agenda)
  • -
  • lockLifetime: number interval in ms of how long the job stays locked for (see multiple job processors for more info). -A job will automatically unlock once a returned promise resolves/rejects (or if done is specified in the signature and done() is called).
  • -
  • priority: (lowest|low|normal|high|highest|number) specifies the priority -of the job. Higher priority jobs will run first. See the priority mapping -below
  • -
-

Priority mapping:

-
{
-  highest: 20,
-  high: 10,
-  normal: 0,
-  low: -10,
-  lowest: -20
-}
-
-

Async Job:

-
agenda.define('some long running job', async job => {
-  const data = await doSomelengthyTask();
-  await formatThatData(data);
-  await sendThatData(data);
-});
-
-

Async Job (using done):

-
agenda.define('some long running job', (job, done) => {
-  doSomelengthyTask(data => {
-    formatThatData(data);
-    sendThatData(data);
-    done();
-  });
-});
-
-

Sync Job:

-
agenda.define('say hello', job => {
-  console.log('Hello!');
-});
-
-

define() acts like an assignment: if define(jobName, ...) is called multiple times (e.g. every time your script starts), the definition in the last call will overwrite the previous one. Thus, if you define the jobName only once in your code, it's safe for that call to execute multiple times.

-

Creating Jobs

-

every(interval, name, [data], [options])

-

Runs job name at the given interval. Optionally, data and options can be passed in. -Every creates a job of type single, which means that it will only create one -job in the database, even if that line is run multiple times. This lets you put -it in a file that may get run multiple times, such as webserver.js which may -reboot from time to time.

-

interval can be a human-readable format String, a cron format String, or a Number.

-

data is an optional argument that will be passed to the processing function -under job.attrs.data.

-

options is an optional argument that will be passed to job.repeatEvery. -In order to use this argument, data must also be specified.

-

Returns the job.

-
agenda.define('printAnalyticsReport', async job => {
-  const users = await User.doSomethingReallyIntensive();
-  processUserData(users);
-  console.log('I print a report!');
-});
-
-agenda.every('15 minutes', 'printAnalyticsReport');
-
-

Optionally, name could be array of job names, which is convenient for scheduling -different jobs for same interval.

-
agenda.every('15 minutes', ['printAnalyticsReport', 'sendNotifications', 'updateUserRecords']);
-
-

In this case, every returns array of jobs.

-

schedule(when, name, [data])

-

Schedules a job to run name once at a given time. when can be a Date or a -String such as tomorrow at 5pm.

-

data is an optional argument that will be passed to the processing function -under job.attrs.data.

-

Returns the job.

-
agenda.schedule('tomorrow at noon', 'printAnalyticsReport', {userCount: 100});
-
-

Optionally, name could be array of job names, similar to the every method.

-
agenda.schedule('tomorrow at noon', ['printAnalyticsReport', 'sendNotifications', 'updateUserRecords']);
-
-

In this case, schedule returns array of jobs.

-

now(name, [data])

-

Schedules a job to run name once immediately.

-

data is an optional argument that will be passed to the processing function -under job.attrs.data.

-

Returns the job.

-
agenda.now('do the hokey pokey');
-
-

create(jobName, data)

-

Returns an instance of a jobName with data. This does NOT save the job in -the database. See below to learn how to manually work with jobs.

-
const job = agenda.create('printAnalyticsReport', {userCount: 100});
-await job.save();
-console.log('Job successfully saved');
-
-

Managing Jobs

-

jobs(mongodb-native query, mongodb-native sort, mongodb-native limit, mongodb-native skip)

-

Lets you query (then sort, limit and skip the result) all of the jobs in the agenda job's database. These are full mongodb-native find, sort, limit and skip commands. See mongodb-native's documentation for details.

-
const jobs = await agenda.jobs({name: 'printAnalyticsReport'}, {data:-1}, 3, 1);
-// Work with jobs (see below)
-
-

cancel(mongodb-native query)

-

Cancels any jobs matching the passed mongodb-native query, and removes them from the database. Returns a Promise resolving to the number of cancelled jobs, or rejecting on error.

-
const numRemoved = await agenda.cancel({name: 'printAnalyticsReport'});
-
-

This functionality can also be achieved by first retrieving all the jobs from the database using agenda.jobs(), looping through the resulting array and calling job.remove() on each. It is however preferable to use agenda.cancel() for this use case, as this ensures the operation is atomic.

-

purge()

-

Removes all jobs in the database without defined behaviors. Useful if you change a definition name and want to remove old jobs. Returns a Promise resolving to the number of removed jobs, or rejecting on error.

-

IMPORTANT: Do not run this before you finish defining all of your jobs. If you do, you will nuke your database of jobs.

-
const numRemoved = await agenda.purge();
-
-

Starting the job processor

-

To get agenda to start processing jobs from the database you must start it. This -will schedule an interval (based on processEvery) to check for new jobs and -run them. You can also stop the queue.

-

start

-

Starts the job queue processing, checking processEvery time to see if there -are new jobs. Must be called after processEvery, and before any job scheduling (e.g. every).

-

stop

-

Stops the job queue processing. Unlocks currently running jobs.

-

This can be very useful for graceful shutdowns so that currently running/grabbed jobs are abandoned so that other -job queues can grab them / they are unlocked should the job queue start again. Here is an example of how to do a graceful -shutdown.

-
async function graceful() {
-  await agenda.stop();
-  process.exit(0);
-}
-
-process.on('SIGTERM', graceful);
-process.on('SIGINT' , graceful);
-
-

Multiple job processors

-

Sometimes you may want to have multiple node instances / machines process from -the same queue. Agenda supports a locking mechanism to ensure that multiple -queues don't process the same job.

-

You can configure the locking mechanism by specifying lockLifetime as an -interval when defining the job.

-
agenda.define('someJob', {lockLifetime: 10000}, (job, cb) => {
-  // Do something in 10 seconds or less...
-});
-
-

This will ensure that no other job processor (this one included) attempts to run the job again -for the next 10 seconds. If you have a particularly long running job, you will want to -specify a longer lockLifetime.

-

By default it is 10 minutes. Typically you shouldn't have a job that runs for 10 minutes, -so this is really insurance should the job queue crash before the job is unlocked.

-

When a job is finished (i.e. the returned promise resolves/rejects or done is -specified in the signature and done() is called), it will automatically unlock.

-

Manually working with a job

-

A job instance has many instance methods. All mutating methods must be followed -with a call to await job.save() in order to persist the changes to the database.

-

repeatEvery(interval, [options])

-

Specifies an interval on which the job should repeat. The job runs at the time of defining as well in configured intervals, that is "run now and in intervals".

-

interval can be a human-readable format String, a cron format String, or a Number.

-

options is an optional argument containing:

-

options.timezone: should be a string as accepted by moment-timezone and is considered when using an interval in the cron string format.

-

options.skipImmediate: true | false (default) Setting this true will skip the immediate run. The first run will occur only in configured interval.

-
job.repeatEvery('10 minutes');
-await job.save();
-
-
job.repeatEvery('3 minutes', {
-  skipImmediate: true
-});
-await job.save();
-
-
job.repeatEvery('0 6 * * *', {
-  timezone: 'America/New_York'
-});
-await job.save();
-
-

repeatAt(time)

-

Specifies a time when the job should repeat. Possible values

-
job.repeatAt('3:30pm');
-await job.save();
-
-

schedule(time)

-

Specifies the next time at which the job should run.

-
job.schedule('tomorrow at 6pm');
-await job.save();
-
-

priority(priority)

-

Specifies the priority weighting of the job. Can be a number or a string from -the above priority table.

-
job.priority('low');
-await job.save();
-
-

unique(properties, [options])

-

Ensure that only one instance of this job exists with the specified properties

-

options is an optional argument which can overwrite the defaults. It can take -the following:

-
    -
  • insertOnly: boolean will prevent any properties from persisting if the job already exists. Defaults to false.
  • -
-
job.unique({'data.type': 'active', 'data.userId': '123', nextRunAt(date)});
-await job.save();
-
-

IMPORTANT: To avoid high CPU usage by MongoDB, make sure to create an index on the used fields, like data.type and data.userId for the example above.

-

fail(reason)

-

Sets job.attrs.failedAt to now, and sets job.attrs.failReason to reason.

-

Optionally, reason can be an error, in which case job.attrs.failReason will -be set to error.message

-
job.fail('insufficient disk space');
-// or
-job.fail(new Error('insufficient disk space'));
-await job.save();
-
-

run(callback)

-

Runs the given job and calls callback(err, job) upon completion. Normally -you never need to call this manually.

-
job.run((err, job) => {
-  console.log('I don\'t know why you would need to do this...');
-});
-
-

save()

-

Saves the job.attrs into the database. Returns a Promise resolving to a Job instance, or rejecting on error.

-
try {
-  await job.save();
-  cosole.log('Successfully saved job to collection');
-} catch (e) {
-  console.error('Error saving job to collection');
-}
-
-

remove()

-

Removes the job from the database. Returns a Promise resolving to the number of jobs removed, or rejecting on error.

-
try {
-  await job.remove();
-  console.log('Successfully removed job from collection');
-} catch (e) {
-  console.error('Error removing job from collection');
-}
-
-

disable()

-

Disables the job. Upcoming runs won't execute.

-

enable()

-

Enables the job if it got disabled before. Upcoming runs will execute.

-

touch()

-

Resets the lock on the job. Useful to indicate that the job hasn't timed out -when you have very long running jobs. The call returns a promise that resolves -when the job's lock has been renewed.

-
agenda.define('super long job', async job => {
-  await doSomeLongTask();
-  await job.touch();
-  await doAnotherLongTask();
-  await job.touch();
-  await finishOurLongTasks();
-});
-
-

Job Queue Events

-

An instance of an agenda will emit the following events:

-
    -
  • start - called just before a job starts
  • -
  • start:job name - called just before the specified job starts
  • -
-
agenda.on('start', job => {
-  console.log('Job %s starting', job.attrs.name);
-});
-
-
    -
  • complete - called when a job finishes, regardless of if it succeeds or fails
  • -
  • complete:job name - called when a job finishes, regardless of if it succeeds or fails
  • -
-
agenda.on('complete', job => {
-  console.log(`Job ${job.attrs.name} finished`);
-});
-
-
    -
  • success - called when a job finishes successfully
  • -
  • success:job name - called when a job finishes successfully
  • -
-
agenda.on('success:send email', job => {
-  console.log(`Sent Email Successfully to ${job.attrs.data.to}`);
-});
-
-
    -
  • fail - called when a job throws an error
  • -
  • fail:job name - called when a job throws an error
  • -
-
agenda.on('fail:send email', (err, job) => {
-  console.log(`Job failed with error: ${err.message}`);
-});
-
-

Frequently Asked Questions

-

What is the order in which jobs run?

-

Jobs are run with priority in a first in first out order (so they will be run in the order they were scheduled AND with respect to highest priority).

-

For example, if we have two jobs named "send-email" queued (both with the same priority), and the first job is queued at 3:00 PM and second job is queued at 3:05 PM with the same priority value, then the first job will run first if we start to send "send-email" jobs at 3:10 PM. However if the first job has a priority of 5 and the second job has a priority of 10, then the second will run first (priority takes precedence) at 3:10 PM.

-

The default MongoDB sort object is { nextRunAt: 1, priority: -1 } and can be changed through the option sort when configuring Agenda.

-

What is the difference between lockLimit and maxConcurrency?

-

Agenda will lock jobs 1 by one, setting the lockedAt property in mongoDB, and creating an instance of the Job class which it caches into the _lockedJobs array. This defaults to having no limit, but can be managed using lockLimit. If all jobs will need to be run before agenda's next interval (set via agenda.processEvery), then agenda will attempt to lock all jobs.

-

Agenda will also pull jobs from _lockedJobs and into _runningJobs. These jobs are actively being worked on by user code, and this is limited by maxConcurrency (defaults to 20).

-

If you have multiple instances of agenda processing the same job definition with a fast repeat time you may find they get unevenly loaded. This is because they will compete to lock as many jobs as possible, even if they don't have enough concurrency to process them. This can be resolved by tweaking the maxConcurrency and lockLimit properties.

-

Sample Project Structure?

-

Agenda doesn't have a preferred project structure and leaves it to the user to -choose how they would like to use it. That being said, you can check out the -example project structure below.

-

Can I Donate?

-

Thanks! I'm flattered, but it's really not necessary. If you really want to, you can find my gittip here.

-

Web Interface?

-

Agenda itself does not have a web interface built in but we do offer stand-alone web interface Agendash:

-

Agendash interface

-

Mongo vs Redis

-

The decision to use Mongo instead of Redis is intentional. Redis is often used for -non-essential data (such as sessions) and without configuration doesn't -guarantee the same level of persistence as Mongo (should the server need to be -restarted/crash).

-

Agenda decides to focus on persistence without requiring special configuration -of Redis (thereby degrading the performance of the Redis server on non-critical -data, such as sessions).

-

Ultimately if enough people want a Redis driver instead of Mongo, I will write -one. (Please open an issue requesting it). For now, Agenda decided to focus on -guaranteed persistence.

-

Spawning / forking processes

-

Ultimately Agenda can work from a single job queue across multiple machines, node processes, or forks. If you are interested in having more than one worker, Bars3s has written up a fantastic example of how one might do it:

-
const cluster = require('cluster');
-const os = require('os');
-
-const httpServer = require('./app/http-server');
-const jobWorker = require('./app/job-worker');
-
-const jobWorkers = [];
-const webWorkers = [];
-
-if (cluster.isMaster) {
-  const cpuCount = os.cpus().length;
-  // Create a worker for each CPU
-  for (let i = 0; i < cpuCount; i += 1) {
-    addJobWorker();
-    addWebWorker();
-  }
-
-  cluster.on('exit', (worker, code, signal) => {
-    if (jobWorkers.indexOf(worker.id) !== -1) {
-      console.log(`job worker ${worker.process.pid} exited (signal: ${signal}). Trying to respawn...`);
-      removeJobWorker(worker.id);
-      addJobWorker();
-    }
-
-    if (webWorkers.indexOf(worker.id) !== -1) {
-      console.log(`http worker ${worker.process.pid} exited (signal: ${signal}). Trying to respawn...`);
-      removeWebWorker(worker.id);
-      addWebWorker();
-    }
-  });
-} else {
-  if (process.env.web) {
-    console.log(`start http server: ${cluster.worker.id}`);
-    // Initialize the http server here
-    httpServer.start();
-  }
-
-  if (process.env.job) {
-    console.log(`start job server: ${cluster.worker.id}`);
-    // Initialize the Agenda here
-    jobWorker.start();
-  }
-}
-
-function addWebWorker() {
-  webWorkers.push(cluster.fork({web: 1}).id);
-}
-
-function addJobWorker() {
-  jobWorkers.push(cluster.fork({job: 1}).id);
-}
-
-function removeWebWorker(id) {
-  webWorkers.splice(webWorkers.indexOf(id), 1);
-}
-
-function removeJobWorker(id) {
-  jobWorkers.splice(jobWorkers.indexOf(id), 1);
-}
-
-

Recovering lost Mongo connections ("auto_reconnect")

-

Agenda is configured by default to automatically reconnect indefinitely, emitting an error event -when no connection is available on each process tick, allowing you to restore the Mongo -instance without having to restart the application.

-

However, if you are using an existing Mongo client -you'll need to configure the reconnectTries and reconnectInterval connection settings -manually, otherwise you'll find that Agenda will throw an error with the message "MongoDB connection is not recoverable, -application restart required" if the connection cannot be recovered within 30 seconds.

-

Example Project Structure

-

Agenda will only process jobs that it has definitions for. This allows you to -selectively choose which jobs a given agenda will process.

-

Consider the following project structure, which allows us to share models with -the rest of our code base, and specify which jobs a worker processes, if any at -all.

-
- server.js
-- worker.js
-lib/
-  - agenda.js
-  controllers/
-    - user-controller.js
-  jobs/
-    - email.js
-    - video-processing.js
-    - image-processing.js
-   models/
-     - user-model.js
-     - blog-post.model.js
-
-

Sample job processor (eg. jobs/email.js)

-
let email = require('some-email-lib'),
-  User = require('../models/user-model.js');
-
-module.exports = function(agenda) {
-  agenda.define('registration email', async job => {
-    const user = await User.get(job.attrs.data.userId);
-    await email(user.email(), 'Thanks for registering', 'Thanks for registering ' + user.name());
-  });
-
-  agenda.define('reset password', async job => {
-    // Etc
-  });
-
-  // More email related jobs
-};
-
-

lib/agenda.js

-
const Agenda = require('agenda');
-
-const connectionOpts = {db: {address: 'localhost:27017/agenda-test', collection: 'agendaJobs'}};
-
-const agenda = new Agenda(connectionOpts);
-
-const jobTypes = process.env.JOB_TYPES ? process.env.JOB_TYPES.split(',') : [];
-
-jobTypes.forEach(type => {
-  require('./jobs/' + type)(agenda);
-});
-
-if (jobTypes.length) {
-  agenda.start(); // Returns a promise, which should be handled appropriately
-}
-
-module.exports = agenda;
-
-

lib/controllers/user-controller.js

-
let app = express(),
-  User = require('../models/user-model'),
-  agenda = require('../worker.js');
-
-app.post('/users', (req, res, next) => {
-  const user = new User(req.body);
-  user.save(err => {
-    if (err) {
-      return next(err);
-    }
-    agenda.now('registration email', {userId: user.primary()});
-    res.send(201, user.toJson());
-  });
-});
-
-

worker.js

-
require('./lib/agenda.js');
-
-

Now you can do the following in your project:

-
node server.js
-
-

Fire up an instance with no JOB_TYPES, giving you the ability to process jobs, -but not wasting resources processing jobs.

-
JOB_TYPES=email node server.js
-
-

Allow your http server to process email jobs.

-
JOB_TYPES=email node worker.js
-
-

Fire up an instance that processes email jobs.

-
JOB_TYPES=video-processing,image-processing node worker.js
-
-

Fire up an instance that processes video-processing/image-processing jobs. Good for a heavy hitting server.

-

Debugging Issues

-

If you think you have encountered a bug, please feel free to report it here:

-

Submit Issue

-

Please provide us with as much details as possible such as:

-
    -
  • Agenda version
  • -
  • Environment (OSX, Linux, Windows, etc)
  • -
  • Small description of what happened
  • -
  • Any relevant stack track
  • -
  • Agenda logs (see below)
  • -
-

To turn on logging, please set your DEBUG env variable like so:

-
    -
  • OSX: DEBUG="agenda:*" node index.js
  • -
  • Linux: DEBUG="agenda:*" node index.js
  • -
  • Windows CMD: set DEBUG=agenda:*
  • -
  • Windows PowerShell: $env:DEBUG = "agenda:*"
  • -
-

While not necessary, attaching a text file with this debug information would -be extremely useful in debugging certain issues and is encouraged.

-

Known Issues

-

"Multiple order-by items are not supported. Please specify a single order-by item."

-

When running Agenda on Azure cosmosDB, you might run into this issue caused by Agenda's sort query used for finding and locking the next job. To fix this, you can pass custom sort option: sort: { nextRunAt: 1 }

-

Acknowledgements

- -

License

-

The MIT License

-
-
- - - - - -
- -
- - - - - - - - - - \ No newline at end of file diff --git a/docs/agenda/3.1.0/job_compute-next-run-at.js.html b/docs/agenda/3.1.0/job_compute-next-run-at.js.html deleted file mode 100644 index b6f104f..0000000 --- a/docs/agenda/3.1.0/job_compute-next-run-at.js.html +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - - - - - - job/compute-next-run-at.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/compute-next-run-at.js -

- - - - - -
-
-
'use strict';
-const humanInterval = require('human-interval');
-const {CronTime} = require('cron');
-const moment = require('moment-timezone');
-const date = require('date.js');
-const debug = require('debug')('agenda:job');
-
-/**
- * Internal method used to compute next time a job should run and sets the proper values
- * @name Job#computeNextRunAt
- * @function
- * @returns {exports} instance of Job instance
- */
-module.exports = function() {
-  const interval = this.attrs.repeatInterval;
-  const timezone = this.attrs.repeatTimezone;
-  const {repeatAt} = this.attrs;
-  const previousNextRunAt = this.attrs.nextRunAt || new Date();
-  this.attrs.nextRunAt = undefined;
-
-  const dateForTimezone = date => {
-    date = moment(date);
-    if (timezone !== null) {
-      date.tz(timezone);
-    }
-
-    return date;
-  };
-
-  /**
-   * Internal method that computes the interval
-   * @returns {undefined}
-   */
-  const computeFromInterval = () => {
-    debug('[%s:%s] computing next run via interval [%s]', this.attrs.name, this.attrs._id, interval);
-    let lastRun = this.attrs.lastRunAt || new Date();
-    lastRun = dateForTimezone(lastRun);
-    try {
-      const cronTime = new CronTime(interval);
-      let nextDate = cronTime._getNextDateFrom(lastRun);
-      if (nextDate.valueOf() === lastRun.valueOf() || nextDate.valueOf() <= previousNextRunAt.valueOf()) {
-        // Handle cronTime giving back the same date for the next run time
-        nextDate = cronTime._getNextDateFrom(dateForTimezone(new Date(lastRun.valueOf() + 1000)));
-      }
-
-      this.attrs.nextRunAt = nextDate;
-      debug('[%s:%s] nextRunAt set to [%s]', this.attrs.name, this.attrs._id, new Date(this.attrs.nextRunAt).toISOString());
-    // Either `xo` linter or Node.js 8 stumble on this line if it isn't just ignored
-    } catch (error) { // eslint-disable-line no-unused-vars
-      // Nope, humanInterval then!
-      try {
-        if (!this.attrs.lastRunAt && humanInterval(interval)) {
-          this.attrs.nextRunAt = lastRun.valueOf();
-          debug('[%s:%s] nextRunAt set to [%s]', this.attrs.name, this.attrs._id, new Date(this.attrs.nextRunAt).toISOString());
-        } else {
-          this.attrs.nextRunAt = lastRun.valueOf() + humanInterval(interval);
-          debug('[%s:%s] nextRunAt set to [%s]', this.attrs.name, this.attrs._id, new Date(this.attrs.nextRunAt).toISOString());
-        }
-      // Either `xo` linter or Node.js 8 stumble on this line if it isn't just ignored
-      } catch (error) {} // eslint-disable-line no-unused-vars
-    } finally {
-      if (isNaN(this.attrs.nextRunAt)) {
-        this.attrs.nextRunAt = undefined;
-        debug('[%s:%s] failed to calculate nextRunAt due to invalid repeat interval', this.attrs.name, this.attrs._id);
-        this.fail('failed to calculate nextRunAt due to invalid repeat interval');
-      }
-    }
-  };
-
-  /**
-   * Internal method to compute next run time from the repeat string
-   * @returns {undefined}
-   */
-  function computeFromRepeatAt() {
-    const lastRun = this.attrs.lastRunAt || new Date();
-    const nextDate = date(repeatAt).valueOf();
-
-    // If you do not specify offset date for below test it will fail for ms
-    const offset = Date.now();
-    if (offset === date(repeatAt, offset).valueOf()) {
-      this.attrs.nextRunAt = undefined;
-      debug('[%s:%s] failed to calculate repeatAt due to invalid format', this.attrs.name, this.attrs._id);
-      this.fail('failed to calculate repeatAt time due to invalid format');
-    } else if (nextDate.valueOf() === lastRun.valueOf()) {
-      this.attrs.nextRunAt = date('tomorrow at ', repeatAt);
-      debug('[%s:%s] nextRunAt set to [%s]', this.attrs.name, this.attrs._id, this.attrs.nextRunAt.toISOString());
-    } else {
-      this.attrs.nextRunAt = date(repeatAt);
-      debug('[%s:%s] nextRunAt set to [%s]', this.attrs.name, this.attrs._id, this.attrs.nextRunAt.toISOString());
-    }
-  }
-
-  if (interval) {
-    computeFromInterval.call(this);
-  } else if (repeatAt) {
-    computeFromRepeatAt.call(this);
-  }
-
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/job_disable.js.html b/docs/agenda/3.1.0/job_disable.js.html deleted file mode 100644 index ad2affa..0000000 --- a/docs/agenda/3.1.0/job_disable.js.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - job/disable.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/disable.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Prevents the job type from running
- * @name Job#disable
- * @function
- * @returns {exports} instance of Job
- */
-module.exports = function() {
-  this.attrs.disabled = true;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/job_enable.js.html b/docs/agenda/3.1.0/job_enable.js.html deleted file mode 100644 index 070e1fc..0000000 --- a/docs/agenda/3.1.0/job_enable.js.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - job/enable.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/enable.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Allows job type to run
- * @name Job#enable
- * @function
- * @returns {Job} instance of Job
- */
-module.exports = function() {
-  this.attrs.disabled = false;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/job_fail.js.html b/docs/agenda/3.1.0/job_fail.js.html deleted file mode 100644 index 0444b6e..0000000 --- a/docs/agenda/3.1.0/job_fail.js.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - job/fail.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/fail.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:job');
-
-/**
- * Fails the job with a reason (error) specified
- * @name Job#fail
- * @function
- * @param {Error|String} reason reason job failed
- * @returns {exports} instance of Job
- */
-module.exports = function(reason) {
-  if (reason instanceof Error) {
-    reason = reason.message;
-  }
-
-  this.attrs.failReason = reason;
-  this.attrs.failCount = (this.attrs.failCount || 0) + 1;
-  const now = new Date();
-  this.attrs.failedAt = now;
-  this.attrs.lastFinishedAt = now;
-  debug('[%s:%s] fail() called [%d] times so far', this.attrs.name, this.attrs._id, this.attrs.failCount);
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/job_index.js.html b/docs/agenda/3.1.0/job_index.js.html deleted file mode 100644 index 695841d..0000000 --- a/docs/agenda/3.1.0/job_index.js.html +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - - - - - - job/index.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/index.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Internal method to turn priority into a number
- * @param {String|Number} priority string to parse into number
- * @returns {Number} priority that was parsed
- */
-const parsePriority = priority => {
-  const priorityMap = {
-    lowest: -20,
-    low: -10,
-    normal: 0,
-    high: 10,
-    highest: 20
-  };
-  if (typeof priority === 'number' || priority instanceof Number) {
-    return priority;
-  }
-
-  return priorityMap[priority];
-};
-
-/**
- * @class
- * @param {Object} args - Job Options
- * @property {Object} agenda - The Agenda instance
- * @property {Object} attrs
- */
-class Job {
-  constructor(args) {
-    args = args || {};
-
-    // Remove special args
-    this.agenda = args.agenda;
-    delete args.agenda;
-
-    // Process args
-    args.priority = parsePriority(args.priority) || 0;
-
-    // Set attrs to args
-    const attrs = {};
-    for (const key in args) {
-      if ({}.hasOwnProperty.call(args, key)) {
-        attrs[key] = args[key];
-      }
-    }
-
-    // Set defaults if undefined
-    // NOTE: What is the difference between 'once' here and 'single' in agenda/index.js?
-    attrs.nextRunAt = attrs.nextRunAt || new Date();
-    attrs.type = attrs.type || 'once';
-    this.attrs = attrs;
-  }
-}
-
-Job.prototype.toJSON = require('./to-json');
-Job.prototype.computeNextRunAt = require('./compute-next-run-at');
-Job.prototype.repeatEvery = require('./repeat-every');
-Job.prototype.repeatAt = require('./repeat-at');
-Job.prototype.disable = require('./disable');
-Job.prototype.enable = require('./enable');
-Job.prototype.unique = require('./unique');
-Job.prototype.schedule = require('./schedule');
-Job.prototype.priority = require('./priority');
-Job.prototype.fail = require('./fail');
-Job.prototype.run = require('./run');
-Job.prototype.isRunning = require('./is-running');
-Job.prototype.save = require('./save');
-Job.prototype.remove = require('./remove');
-Job.prototype.touch = require('./touch');
-
-module.exports = Job;
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/job_is-running.js.html b/docs/agenda/3.1.0/job_is-running.js.html deleted file mode 100644 index 5dc7c5e..0000000 --- a/docs/agenda/3.1.0/job_is-running.js.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - - - - - job/is-running.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/is-running.js -

- - - - - -
-
-
'use strict';
-
-/**
- * A job is running if:
- * (lastRunAt exists AND lastFinishedAt does not exist)
- * OR
- * (lastRunAt exists AND lastFinishedAt exists but the lastRunAt is newer [in time] than lastFinishedAt)
- * @name Job#isRunning
- * @function
- * @returns {Boolean} Whether or not job is running at the moment (true for running)
- */
-module.exports = function() {
-  if (!this.attrs.lastRunAt) {
-    return false;
-  }
-
-  if (!this.attrs.lastFinishedAt) {
-    return true;
-  }
-
-  if (this.attrs.lockedAt && this.attrs.lastRunAt.getTime() > this.attrs.lastFinishedAt.getTime()) {
-    return true;
-  }
-
-  return false;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/job_priority.js.html b/docs/agenda/3.1.0/job_priority.js.html deleted file mode 100644 index 0d9eda6..0000000 --- a/docs/agenda/3.1.0/job_priority.js.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - - - - job/priority.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/priority.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Internal method to turn priority into a number
- * @name Job#priority
- * @function
- * @param {String|Number} priority string to parse into number
- * @returns {Number} priority that was parsed
- */
-const parsePriority = priority => {
-  const priorityMap = {
-    lowest: -20,
-    low: -10,
-    normal: 0,
-    high: 10,
-    highest: 20
-  };
-  if (typeof priority === 'number' || priority instanceof Number) {
-    return priority;
-  }
-
-  return priorityMap[priority];
-};
-
-/**
- * Sets priority of the job
- * @param {String} priority priority of when job should be queued
- * @returns {exports} instance of Job
- */
-module.exports = function(priority) {
-  this.attrs.priority = parsePriority(priority);
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/job_remove.js.html b/docs/agenda/3.1.0/job_remove.js.html deleted file mode 100644 index 7144cc2..0000000 --- a/docs/agenda/3.1.0/job_remove.js.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - - - - job/remove.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/remove.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Remove the job from MongoDB
- * @name Job#remove
- * @function
- * @returns {Promise} resolves when job removal fails or passes
- */
-module.exports = function() {
-  return this.agenda.cancel({_id: this.attrs._id});
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/job_repeat-at.js.html b/docs/agenda/3.1.0/job_repeat-at.js.html deleted file mode 100644 index 0017f97..0000000 --- a/docs/agenda/3.1.0/job_repeat-at.js.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - job/repeat-at.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/repeat-at.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Sets a job to repeat at a specific time
- * @name Job#repeatAt
- * @function
- * @param {String} time time to repeat job at (human readable or number)
- * @returns {exports} instance of Job
- */
-module.exports = function(time) {
-  this.attrs.repeatAt = time;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/job_repeat-every.js.html b/docs/agenda/3.1.0/job_repeat-every.js.html deleted file mode 100644 index 704c3cf..0000000 --- a/docs/agenda/3.1.0/job_repeat-every.js.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - - - - - job/repeat-every.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/repeat-every.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Sets a job to repeat every X amount of time
- * @name Job#repeatEvery
- * @function
- * @param {String} interval repeat every X
- * @param {Object} options options to use for job
- * @returns {Job} instance of Job
- */
-module.exports = function(interval, options) {
-  options = options || {};
-  this.attrs.repeatInterval = interval;
-  this.attrs.repeatTimezone = options.timezone ? options.timezone : null;
-  if (options.skipImmediate) {
-    // Set the lastRunAt time to the nextRunAt so that the new nextRunAt will be computed in reference to the current value.
-    this.attrs.lastRunAt = this.attrs.nextRunAt || new Date();
-    this.computeNextRunAt();
-    this.attrs.lastRunAt = undefined;
-  } else {
-    this.computeNextRunAt();
-  }
-
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/job_run.js.html b/docs/agenda/3.1.0/job_run.js.html deleted file mode 100644 index dcaacb0..0000000 --- a/docs/agenda/3.1.0/job_run.js.html +++ /dev/null @@ -1,197 +0,0 @@ - - - - - - - - - - - job/run.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/run.js -

- - - - - -
-
-
'use strict';
-const debug = require('debug')('agenda:job');
-
-/**
- * Internal method (RUN)
- * @name Job#run
- * @function
- * @returns {Promise} Resolves when job persistence in MongoDB fails or passes
- */
-module.exports = function() {
-  const self = this;
-  const {agenda} = self;
-  const definition = agenda._definitions[self.attrs.name];
-
-  // @TODO: this lint issue should be looked into: https://eslint.org/docs/rules/no-async-promise-executor
-  // eslint-disable-next-line no-async-promise-executor
-  return new Promise(async(resolve, reject) => {
-    self.attrs.lastRunAt = new Date();
-    debug('[%s:%s] setting lastRunAt to: %s', self.attrs.name, self.attrs._id, self.attrs.lastRunAt.toISOString());
-    self.computeNextRunAt();
-    await self.save();
-
-    let finished = false;
-    const jobCallback = async err => {
-      // We don't want to complete the job multiple times
-      if (finished) {
-        return;
-      }
-
-      finished = true;
-
-      if (err) {
-        self.fail(err);
-      } else {
-        self.attrs.lastFinishedAt = new Date();
-      }
-
-      self.attrs.lockedAt = null;
-
-      await self.save().catch(error => {
-        debug('[%s:%s] failed to be saved to MongoDB', self.attrs.name, self.attrs._id);
-        reject(error);
-      });
-      debug('[%s:%s] was saved successfully to MongoDB', self.attrs.name, self.attrs._id);
-
-      if (err) {
-        agenda.emit('fail', err, self);
-        agenda.emit('fail:' + self.attrs.name, err, self);
-        debug('[%s:%s] has failed [%s]', self.attrs.name, self.attrs._id, err.message);
-      } else {
-        agenda.emit('success', self);
-        agenda.emit('success:' + self.attrs.name, self);
-        debug('[%s:%s] has succeeded', self.attrs.name, self.attrs._id);
-      }
-
-      agenda.emit('complete', self);
-      agenda.emit('complete:' + self.attrs.name, self);
-      debug('[%s:%s] job finished at [%s] and was unlocked', self.attrs.name, self.attrs._id, self.attrs.lastFinishedAt);
-      // Curiously, we still resolve successfully if the job processor failed.
-      // Agenda is not equipped to handle errors originating in user code, so, we leave them to inspect the side-effects of job.fail()
-      resolve(self);
-    };
-
-    try {
-      agenda.emit('start', self);
-      agenda.emit('start:' + self.attrs.name, self);
-      debug('[%s:%s] starting job', self.attrs.name, self.attrs._id);
-      if (!definition) {
-        debug('[%s:%s] has no definition, can not run', self.attrs.name, self.attrs._id);
-        throw new Error('Undefined job');
-      }
-
-      if (definition.fn.length === 2) {
-        debug('[%s:%s] process function being called', self.attrs.name, self.attrs._id);
-        await definition.fn(self, jobCallback);
-      } else {
-        debug('[%s:%s] process function being called', self.attrs.name, self.attrs._id);
-        await definition.fn(self);
-        await jobCallback();
-      }
-    } catch (error) {
-      debug('[%s:%s] unknown error occurred', self.attrs.name, self.attrs._id);
-      await jobCallback(error);
-    }
-  });
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/job_schedule.js.html b/docs/agenda/3.1.0/job_schedule.js.html deleted file mode 100644 index e52dba4..0000000 --- a/docs/agenda/3.1.0/job_schedule.js.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - job/schedule.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/schedule.js -

- - - - - -
-
-
'use strict';
-const date = require('date.js');
-
-/**
- * Schedules a job to run at specified time
- * @name Job#schedule
- * @function
- * @param {String} time schedule a job to run "then"
- * @returns {exports} instance of Job
- */
-module.exports = function(time) {
-  const d = new Date(time);
-
-  this.attrs.nextRunAt = Number.isNaN(d.getTime()) ? date(time) : d;
-
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/job_to-json.js.html b/docs/agenda/3.1.0/job_to-json.js.html deleted file mode 100644 index 19b5de7..0000000 --- a/docs/agenda/3.1.0/job_to-json.js.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - - - - - job/to-json.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/to-json.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Given a job, turn it into an object we can store in Mongo
- * @name Job#toJSON
- * @function
- * @returns {Object} json object from Job
- */
-module.exports = function() {
-  const self = this;
-  const attrs = self.attrs || {};
-  const result = {};
-
-  for (const prop in attrs) {
-    if ({}.hasOwnProperty.call(attrs, prop)) {
-      result[prop] = attrs[prop];
-    }
-  }
-
-  const dates = ['lastRunAt', 'lastFinishedAt', 'nextRunAt', 'failedAt', 'lockedAt'];
-  dates.forEach(d => {
-    if (result[d]) {
-      result[d] = new Date(result[d]);
-    }
-  });
-
-  return result;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/job_touch.js.html b/docs/agenda/3.1.0/job_touch.js.html deleted file mode 100644 index 40fac12..0000000 --- a/docs/agenda/3.1.0/job_touch.js.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - job/touch.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/touch.js -

- - - - - -
-
-
'use strict';
-
-const noCallback = require('../no-callback');
-
-/**
- * Updates "lockedAt" time so the job does not get picked up again
- * @name Job#touch
- * @function
- * @returns {undefined}
- */
-module.exports = async function() {
-  // eslint-disable-next-line prefer-rest-params
-  noCallback(arguments);
-  this.attrs.lockedAt = new Date();
-  return this.save();
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/job_unique.js.html b/docs/agenda/3.1.0/job_unique.js.html deleted file mode 100644 index 1784b49..0000000 --- a/docs/agenda/3.1.0/job_unique.js.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - job/unique.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- job/unique.js -

- - - - - -
-
-
'use strict';
-
-/**
- * Data to ensure is unique for job to be created
- * @name Job#unique
- * @function
- * @param {Object} unique mongo data query for unique
- * @param {Object} opts unique options
- * @returns {exports} instance of Job
- */
-module.exports = function(unique, opts) {
-  this.attrs.unique = unique;
-  this.attrs.uniqueOpts = opts;
-  return this;
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/scripts/linenumber.js b/docs/agenda/3.1.0/scripts/linenumber.js deleted file mode 100644 index ff6c069..0000000 --- a/docs/agenda/3.1.0/scripts/linenumber.js +++ /dev/null @@ -1,24 +0,0 @@ -'use strict'; - -/* global document */ -(function () { - var lineId, lines, totalLines, anchorHash; - var source = document.getElementsByClassName('prettyprint source linenums'); - var i = 0; - var lineNumber = 0; - - if (source && source[0]) { - anchorHash = document.location.hash.substring(1); - lines = source[0].getElementsByTagName('li'); - totalLines = lines.length; - - for (; i < totalLines; i++) { - lineNumber++; - lineId = 'line' + lineNumber; - lines[i].id = lineId; - if (lineId === anchorHash) { - lines[i].className += ' selected'; - } - } - } -})(); diff --git a/docs/agenda/3.1.0/scripts/pagelocation.js b/docs/agenda/3.1.0/scripts/pagelocation.js deleted file mode 100644 index e138368..0000000 --- a/docs/agenda/3.1.0/scripts/pagelocation.js +++ /dev/null @@ -1,89 +0,0 @@ -'use strict'; - -$(document).ready(function () { - var currentSectionNav, target; - - // If an anchor hash is in the URL highlight the menu item - highlightActiveHash(); - // If a specific page section is in the URL highlight the menu item - highlightActiveSection(); - - // If a specific page section is in the URL scroll that section up to the top - currentSectionNav = $('#' + getCurrentSectionName() + '-nav'); - - if (currentSectionNav.position()) { - $('nav').scrollTop(currentSectionNav.position().top); - } - - // function to scroll to anchor when clicking an anchor linl - $('a[href*="#"]:not([href="#"])').click(function () { - /* eslint-disable no-invalid-this */ - if (location.pathname.replace(/^\//, '') === this.pathname.replace(/^\//, '') && location.hostname === this.hostname) { - target = $(this.hash); - target = target.length ? target : $('[name=' + this.hash.slice(1) + ']'); - if (target.length) { - $('html, body').animate({ - scrollTop: target.offset().top - }, 1000); - } - } - /* eslint-enable no-invalid-this */ - }); -}); - -// If a new anchor section is selected, change the hightlighted menu item -$(window).bind('hashchange', function (event) { - highlightActiveHash(event); -}); - -function highlightActiveHash(event) { - var oldUrl, oldSubSectionElement; - - // check for and remove old hash active state - if (event && event.originalEvent.oldURL) { - oldUrl = event.originalEvent.oldURL; - - if (oldUrl.indexOf('#') > -1) { - oldSubSectionElement = $('#' + getCurrentSectionName() + '-' + oldUrl.substring(oldUrl.indexOf('#') + 1) + '-nav'); - - if (oldSubSectionElement) { - oldSubSectionElement.removeClass('active'); - } - } - } - - if (getCurrentHashName()) { - $('#' + getCurrentSectionName() + '-' + getCurrentHashName() + '-nav').addClass('active'); - } -} - -function highlightActiveSection() { - var pageId = getCurrentSectionName(); - - $('#' + pageId + '-nav').addClass('active'); -} - -function getCurrentSectionName() { - var path = window.location.pathname; - var pageUrl = path.split('/').pop(); - - var sectionName = pageUrl.substring(0, pageUrl.indexOf('.')); - - // remove the wodr module- if its in the url - sectionName = sectionName.replace('module-', ''); - - return sectionName; -} - -function getCurrentHashName() { - var pageSubSectionId; - var pageSubSectionHash = window.location.hash; - - if (pageSubSectionHash) { - pageSubSectionId = pageSubSectionHash.substring(1).replace('.', ''); - - return pageSubSectionId; - } - - return false; -} diff --git a/docs/agenda/3.1.0/styles/jsdoc-default.css b/docs/agenda/3.1.0/styles/jsdoc-default.css deleted file mode 100644 index f2bc6a9..0000000 --- a/docs/agenda/3.1.0/styles/jsdoc-default.css +++ /dev/null @@ -1,957 +0,0 @@ -@font-face { - font-family: "Avenir Next W01"; - font-style: normal; - font-weight: 600; - src: url("https://fast.fonts.net/dv2/14/14c73713-e4df-4dba-933b-057feeac8dd1.woff2?d44f19a684109620e484167ba790e8180fd9e29df91d80ce3d096f014db863074e1ea706cf5ed4e1c042492e76df291ce1d24ec684d3d9da9684f55406b9f22bce02f0f30f556681593dafea074d7bd44e28a680d083ccfd44ed4f8a3087a20c56147c11f917ed1dbd85c4a18cf38da25e6ac78f008f472262304d50e7e0cb7541ef1642c676db6e4bde4924846f5daf486fbde9335e98f6a20f6664bc4525253d1d4fca42cf1c490483c8daf0237f6a0fd292563417ad80ca3e69321417747bdc6f0969f34b2a0401b5e2b9a4dfd5b06d9710850900c66b34870aef&projectId=f750d5c7-baa2-4767-afd7-45484f47fe17") format('woff2'); -} - -@font-face { - font-family: "Avenir Next W01"; - font-style: normal; - font-weight: 500; - src: url("https://fast.fonts.net/dv2/14/627fbb5a-3bae-4cd9-b617-2f923e29d55e.woff2?d44f19a684109620e484167ba790e8180fd9e29df91d80ce3d096f014db863074e1ea706cf5ed4e1c042492e76df291ce1d24ec684d3d9da9684f55406b9f22bce02f0f30f556681593dafea074d7bd44e28a680d083ccfd44ed4f8a3087a20c56147c11f917ed1dbd85c4a18cf38da25e6ac78f008f472262304d50e7e0cb7541ef1642c676db6e4bde4924846f5daf486fbde9335e98f6a20f6664bc4525253d1d4fca42cf1c490483c8daf0237f6a0fd292563417ad80ca3e69321417747bdc6f0969f34b2a0401b5e2b9a4dfd5b06d9710850900c66b34870aef&projectId=f750d5c7-baa2-4767-afd7-45484f47fe17") format('woff2'); -} - -@font-face { - font-family: "Avenir Next W01"; - font-style: normal; - font-weight: 400; - src: url("https://fast.fonts.net/dv2/14/2cd55546-ec00-4af9-aeca-4a3cd186da53.woff2?d44f19a684109620e484167ba790e8180fd9e29df91d80ce3d096f014db863074e1ea706cf5ed4e1c042492e76df291ce1d24ec684d3d9da9684f55406b9f22bce02f0f30f556681593dafea074d7bd44e28a680d083ccfd44ed4f8a3087a20c56147c11f917ed1dbd85c4a18cf38da25e6ac78f008f472262304d50e7e0cb7541ef1642c676db6e4bde4924846f5daf486fbde9335e98f6a20f6664bc4525253d1d4fca42cf1c490483c8daf0237f6a0fd292563417ad80ca3e69321417747bdc6f0969f34b2a0401b5e2b9a4dfd5b06d9710850900c66b34870aef&projectId=f750d5c7-baa2-4767-afd7-45484f47fe17") format('woff2'); -} - -@font-face { - font-family: 'bt_mono'; - font-style: normal; - font-weight: 400; - src: url('https://assets.braintreegateway.com/fonts/bt_mono_regular-webfont.eot'); - src: url('https://assets.braintreegateway.com/fonts/bt_mono_regular-webfont.woff2') format('woff2'), url('https://assets.braintreegateway.com/fonts/bt_mono_regular-webfont.woff') format('woff'), url('https://assets.braintreegateway.com/fonts/bt_mono_regular-webfont.ttf') format('truetype'), url('https://assets.braintreegateway.com/fonts/bt_mono_regular-webfont.svg#bt_mono_reqular-webfont') format('svg'); -} - -@font-face { - font-family: 'bt_mono'; - font-style: normal; - font-weight: 500; - src: url('https://assets.braintreegateway.com/fonts/bt_mono_medium-webfont.eot'); - src: url('https://assets.braintreegateway.com/fonts/bt_mono_medium-webfont.woff2') format('woff2'), url('https://assets.braintreegateway.com/fonts/bt_mono_medium-webfont.woff') format('woff'), url('https://assets.braintreegateway.com/fonts/bt_mono_medium-webfont.ttf') format('truetype'), url('https://assets.braintreegateway.com/fonts/bt_mono_medium-webfont.svg#bt_mono_medium-webfont') format('svg'); -} - -@font-face { - font-family: 'bt_mono'; - font-style: normal; - font-weight: 600; - src: url('https://assets.braintreegateway.com/fonts/bt_mono_bold-webfont.eot'); - src: url('https://assets.braintreegateway.com/fonts/bt_mono_bold-webfont.woff2') format('woff2'), url('https://assets.braintreegateway.com/fonts/bt_mono_bold-webfont.woff') format('woff'), url('https://assets.braintreegateway.com/fonts/bt_mono_bold-webfont.ttf') format('truetype'), url('https://assets.braintreegateway.com/fonts/bt_mono_bold-webfont.svg#bt_mono_bold-webfont') format('svg'); -} - -@font-face { - font-family: 'bt_mono'; - font-style: normal; - font-weight: 900; - src: url('https://assets.braintreegateway.com/fonts/bt_mono_heavy-webfont.eot'); - src: url('https://assets.braintreegateway.com/fonts/bt_mono_heavy-webfont.woff2') format('woff2'), url('https://assets.braintreegateway.com/fonts/bt_mono_heavy-webfont.woff') format('woff'), url('https://assets.braintreegateway.com/fonts/bt_mono_heavy-webfont.ttf') format('truetype'), url('https://assets.braintreegateway.com/fonts/bt_mono_heavy-webfont.svg#bt_mono_heavy-webfont') format('svg'); -} - -* { - box-sizing: border-box -} - -html, body { - height: 100%; - width: 100%; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - color: #3e3c42; - text-rendering: optimizeLegibility; - margin: 0; -} - -body { - color: #3e3c42; - background-color: #f3f3f3; - width: 100%; - font: 16px/1.875 "Avenir Next W01", "Avenir Next", "Helvetica Neue", Helvetica, sans-serif; - font-size: 16px; - line-height: 160%; -} - -a, a:active { - color: #0095dd; - text-decoration: none; -} - -a:hover { - text-decoration: underline -} - -p, ul, ol, blockquote { - margin-bottom: 1em; -} - -p { - max-width: 800px; -} - -h1, h2, h3, h4, h5, h6 { - color: #706d77; - font-weight: 500; - margin: 0; - line-height: 1; -} - -h1 { - color: #4b484f; - font-weight: 500; - font-size: 40px; - display: block; -} - -h1 span { - color: #999; - font-size: 32px; - display: block; - line-height: 1.5; -} - -h1.page-title { - border-bottom: 1px dashed #ccc; - margin-bottom: 20px; - padding-bottom: 30px; -} - -h2 { - font-size: 30px; - margin: 1.5em 0 0; -} - -h3 { - font-size: 20px; - margin: 1.5em 0 0; - text-transform: uppercase; -} - -h3.reference-title { - display: block; - font-weight: 400; - margin-top: 2em; - max-width: 200px; -} - -h3.reference-title small { - display: inline-block; - color: #0095dd; - margin-left: 5px; - font-weight: 500; -} - -h3.subsection-title { - border-bottom: 1px solid #ececec; - padding-bottom: 20px; - margin-top: 3em; - margin-bottom: 1em; -} - -h4 { - font-size: 16px; - margin: 1em 0 0; - font-weight: bold; -} - -h4.name { - font-size: 20px; - margin-top: 0; - font-weight: 500; -} - -h5 { - margin: 2em 0 0.5em 0; - font-size: 14px; - font-weight: 500; - text-transform: uppercase; -} - -.container-overview .subsection-title { - font-size: 14px; - text-transform: uppercase; - margin: 8px 0 15px 0; - font-weight: bold; - color: #4D4E53; - padding-top: 10px; -} - -h6 { - font-size: 100%; - letter-spacing: -0.01em; - margin: 6px 0 3px 0; - font-style: italic; - text-transform: uppercase; - font-weight: 500; -} - -tt, code, kbd, samp { - font-family: "Source Code Pro", monospace; - background: #f4f4f4; - padding: 1px 5px; - border-radius: 5px; -} - -.class-description { - margin-bottom: 1em; - margin-top: 1em; - padding: 10px 20px; - background-color: rgba(26, 159, 224, 0.1); -} - -.class-description:empty { - margin: 0 -} - -#main { - background-color: white; - float: right; - min-width: 360px; - width: calc(100% - 300px); - padding: 30px; - z-index: 100; -} - -header { - display: block; - max-width: 1400px; -} - -section { - display: block; - max-width: 1400px; - background-color: #fff; -} - -.variation { - display: none -} - -.signature-attributes { - font-size: 60%; - color: #aaa; - font-style: italic; - font-weight: lighter; -} - -.rule { - width: 100%; - margin-top: 20px; - display: block; - border-top: 1px solid #ccc; -} - -ul { - list-style-type: none; - padding-left: 0; -} - -ul li a { - font-weight: 500; -} - -ul ul { - padding-top: 5px; -} - -ul li ul { - padding-left: 20px; -} - -ul li ul li a { - font-weight: normal; -} - -nav { - float: left; - display: block; - width: 300px; - background: #f7f7f7; - overflow-x: visible; - overflow-y: auto; - height: 100%; - padding: 0px 30px 100px 30px; - height: 100%; - position: fixed; - transition: left 0.2s; - z-index: 998; - margin-top: 0px; - top: 43px; -} - -.navicon-button { - display: inline-block; - position: fixed; - bottom: 1.5em; - right: 1.5em; - z-index: 2; -} - -nav h3 { - font-size: 13px; - text-transform: uppercase; - letter-spacing: 1px; - font-weight: bold; - line-height: 24px; - margin: 40px 0 10px 0; - padding: 0; -} - -nav ul { - font-size: 100%; - line-height: 17px; - padding: 0; - margin: 0; - list-style-type: none; - border: none; - padding-left: 0; -} - -nav ul a { - font-size: 16px; -} - -nav ul a, nav ul a:active { - display: block; -} - -nav ul a:hover, nav ul a:active { - color: hsl(200, 100%, 43%); - text-decoration: none; -} - -nav>ul { - padding: 0 10px; -} - -nav>ul li:first-child { - padding-top: 0; -} - -nav ul li ul { - padding-left: 0; -} - -nav>ul>li { - border-bottom: 1px solid #e2e2e2; - padding: 10px 0 20px 0; -} - -nav>ul>li.active ul { - border-left: 3px solid #0095dd; - padding-left: 15px; -} - -nav>ul>li.active ul li.active a { - font-weight: bold; -} - -nav>ul>li.active a { - color: #0095dd; -} - -nav>ul>li>a { - color: #706d77; - padding: 20px 0; - font-size: 18px; -} - -nav ul ul { - margin-bottom: 10px padding-left: 0; -} - -nav ul ul a { - color: #5f5c63; -} - -nav ul ul a, nav ul ul a:active { - font-family: 'bt_mono', monospace; - font-size: 14px; - padding-left: 20px; - padding-top: 3px; - padding-bottom: 9px; -} - -nav h2 { - font-size: 12px; - margin: 0; - padding: 0; -} - -nav>h2>a { - color: hsl(202, 71%, 50%); - border-bottom: 1px solid hsl(202, 71%, 50%); - padding-bottom: 5px; -} - -nav>h2>a:hover { - font-weight: 500; - text-decoration: none; -} - -footer { - background-color: #fff; - color: hsl(0, 0%, 28%); - margin-left: 300px; - display: block; - font-style: italic; - font-size: 12px; - padding: 30px; - text-align: center; -} - -.ancestors { - color: #999; -} - -.ancestors a { - color: #999 !important; - text-decoration: none; -} - -.clear { - clear: both; -} - -.important { - font-weight: bold; - color: #950B02; -} - -.yes-def { - text-indent: -1000px; -} - -.type-signature { - color: #aaa; -} - -.name, .signature { - font-family: 'bt_mono', monospace; - word-wrap: break-word; -} - -.details { - margin-top: 14px; - font-size: 13px; - text-align: right; - background: #ffffff; - /* Old browsers */ - background: -moz-linear-gradient(left, #ffffff 0%, #fafafa 100%); - /* FF3.6-15 */ - background: -webkit-linear-gradient(left, #ffffff 0%, #fafafa 100%); - /* Chrome10-25,Safari5.1-6 */ - background: linear-gradient(to right, #ffffff 0%, #fafafa 100%); - /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ - filter: progid: DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#fafafa', GradientType=1); - padding-right: 5px; -} - -.details dt { - display: inline-block; -} - -.details dd { - display: inline-block; - margin: 0; -} - -.details dd a { - font-style: italic; - font-weight: normal; - line-height: 1; -} - -.details ul { - margin: 0 -} - -.details ul { - list-style-type: none -} - -.details li {} - -.details pre.prettyprint { - margin: 0 -} - -.details .object-value { - padding-top: 0 -} - -.description { - margin-bottom: 1em; - margin-top: 1em; -} - -.code-caption { - font-style: italic; - margin: 0; - font-size: 16px; - color: #545454; -} - -.prettyprint { - font-size: 13px; - border: 1px solid #ddd; - border-radius: 3px; - overflow: auto; - background-color: #fbfbfb; -} - -.prettyprint.source { - width: inherit; -} - -.prettyprint code { - font-size: 100%; - line-height: 18px; - display: block; - margin: 0 30px; - background-color: #fbfbfb; - color: #4D4E53; -} - -.prettyprint>code { - padding: 30px 15px; -} - -.prettyprint .linenums code { - padding: 0 15px; -} - -.prettyprint .linenums li:first-of-type code { - padding-top: 15px; -} - -.prettyprint code span.line { - display: inline-block; -} - -.prettyprint.linenums { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.prettyprint.linenums ol { - padding-left: 0 -} - -.prettyprint.linenums li { - border-left: 3px #ddd solid -} - -.prettyprint.linenums li.selected, .prettyprint.linenums li.selected * { - background-color: lightyellow -} - -.prettyprint.linenums li * { - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; -} - -.readme .prettyprint { - max-width: 800px; -} - -.params, .props { - border-spacing: 0; - border: 1px solid #ddd; - border-radius: 3px; - width: 100%; - font-size: 14px; -} - -.params .name, .props .name, .name code { - color: #4D4E53; - font-family: 'bt_mono', monospace; - font-size: 100%; -} - -.params td, .params th, .props td, .props th { - margin: 0px; - text-align: left; - vertical-align: top; - padding: 10px; - display: table-cell; -} - -.params td { - border-top: 1px solid #eee; -} - -.params thead tr, .props thead tr { - background-color: #fff; - font-weight: bold; -} - -.params .params thead tr, .props .props thead tr { - background-color: #fff; - font-weight: bold; -} - -.params td.description>p:first-child, .props td.description>p:first-child { - margin-top: 0; - padding-top: 0; -} - -.params td.description>p:last-child, .props td.description>p:last-child { - margin-bottom: 0; - padding-bottom: 0; -} - -dl.param-type { - margin-top: 5px; -} - -.param-type dt, .param-type dd { - display: inline-block -} - -.param-type dd { - font-family: Consolas, Monaco, 'Andale Mono', monospace -} - -.disabled { - color: #454545 -} - - -/* tag source style */ - -.tag-deprecated { - padding-right: 5px; -} - -.tag-source { - border-bottom: 1px solid rgba(28, 160, 224, 0.35); -} - -.tag-source:first-child { - border-bottom: 1px solid rgba(28, 160, 224, 1); -} - - -/* navicon button */ - -.navicon-button { - position: relative; - transition: 0.25s; - cursor: pointer; - user-select: none; - opacity: .8; - background-color: white; - border-radius: 100%; - width: 50px; - height: 50px; - -webkit-box-shadow: 0px 2px 9px 0px rgba(0, 0, 0, 0.31); - -moz-box-shadow: 0px 2px 9px 0px rgba(0, 0, 0, 0.31); - box-shadow: 0px 2px 9px 0px rgba(0, 0, 0, 0.31); -} - -.navicon-button .navicon:before, .navicon-button .navicon:after { - transition: 0.25s; -} - -.navicon-button:hover { - transition: 0.5s; - opacity: 1; -} - -.navicon-button:hover .navicon:before, .navicon-button:hover .navicon:after { - transition: 0.25s; -} - -.navicon-button:hover .navicon:before { - top: .425rem; -} - -.navicon-button:hover .navicon:after { - top: -.425rem; -} - - -/* navicon */ - -.navicon { - position: relative; - width: 1.5em; - height: .195rem; - background: #000; - top: calc(50% - .09rem); - left: calc(50% - .75rem); - transition: 0.3s; - border-radius: 5px; -} - -.navicon:before, .navicon:after { - display: block; - content: ""; - height: .195rem; - width: 1.5rem; - background: #000; - position: absolute; - z-index: -1; - transition: 0.3s 0.25s; -} - -.navicon:before { - top: 0.425rem; - height: .195rem; - border-radius: 5px; -} - -.navicon:after { - top: -0.425rem; - border-radius: 5px; -} - - -/* open */ - -.nav-trigger:checked+label:not(.steps) .navicon:before, .nav-trigger:checked+label:not(.steps) .navicon:after { - top: 0 !important; -} - -.nav-trigger:checked+label .navicon:before, .nav-trigger:checked+label .navicon:after { - transition: 0.5s; -} - - -/* Minus */ - -.nav-trigger:checked+label { - transform: scale(0.75); -} - - -/* Γ— and + */ - -.nav-trigger:checked+label.plus .navicon, .nav-trigger:checked+label.x .navicon { - background: transparent; -} - -.nav-trigger:checked+label.plus .navicon:before, .nav-trigger:checked+label.x .navicon:before { - transform: rotate(-45deg); - background: #000; -} - -.nav-trigger:checked+label.plus .navicon:after, .nav-trigger:checked+label.x .navicon:after { - transform: rotate(45deg); - background: #000; -} - -.nav-trigger:checked+label.plus { - transform: scale(0.75) rotate(45deg); -} - -.nav-trigger:checked~nav { - left: 0 !important; -} - -.nav-trigger:checked~.overlay { - display: block; -} - -.nav-trigger { - position: fixed; - top: 0; - clip: rect(0, 0, 0, 0); -} - -.overlay { - display: none; - position: fixed; - top: 0; - bottom: 0; - left: 0; - right: 0; - width: 100%; - height: 100%; - background: hsla(0, 0%, 0%, 0.5); - z-index: 1; -} - -table { - border-collapse: separate; - ; - display: block; - overflow-x: auto; - /*table-layout:fixed;*/ -} - -table tbody td { - border-top: 1px solid hsl(207, 10%, 86%); - border-right: 1px solid #eee; - padding: 5px; - /*word-wrap: break-word;*/ -} - -td table.params, td table.props { - border: 0; -} - -@media only screen and (min-width: 320px) and (max-width: 680px) { - body { - overflow-x: hidden; - } - #main { - padding: 30px 30px; - width: 100%; - min-width: 360px; - } - nav { - background: #FFF; - width: 300px; - height: 100%; - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: -300px; - z-index: 3; - padding: 0 10px; - transition: left 0.2s; - margin-top: 0; - } - .navicon-button { - display: inline-block; - position: fixed; - bottom: 1.5em; - right: 20px; - z-index: 1000; - } - .top-nav-wrapper { - display: none; - } - #main h1.page-title { - margin: 0.5em 0; - } - footer { - margin-left: 0; - margin-bottom: 30px; - } -} - -.top-nav-wrapper { - background-color: #ececec; - position: fixed; - top: 0px; - left: 0px; - padding: 10px 10px 0 10px; - z-index: 999; - width: 300px; -} - -.top-nav-wrapper ul { - margin: 0; -} - -.top-nav-wrapper ul li { - display: inline-block; - padding: 0 10px; - vertical-align: top; -} - -.top-nav-wrapper ul li.active { - border-bottom: 2px solid rgba(28, 160, 224, 1); -} - -.search-wrapper { - display: inline-block; - position: relative; -} - -.search-wrapper svg { - position: absolute; - left: 0px; -} - -input.search-input { - background: transparent; - box-shadow: 0; - border: 0; - border-bottom: 1px solid #c7c7c7; - padding: 7px 15px 12px 35px; - margin: 0 auto; -} - - -/* Smooth outline with box-shadow: */ - -input.search-input:focus { - border-bottom: 2px solid rgba(28, 160, 224, 1); - outline: none; -} - - -/* Hightlight JS Paradiso Light Theme */ - -.hljs-comment, .hljs-quote { - color: #776e71 -} - -.hljs-variable, .hljs-template-variable, .hljs-tag, .hljs-name, .hljs-selector-id, .hljs-selector-class, .hljs-regexp, .hljs-link, .hljs-meta { - color: #ef6155 -} - -.hljs-number, .hljs-built_in, .hljs-builtin-name, .hljs-literal, .hljs-type, .hljs-params, .hljs-deletion { - color: #f99b15 -} - -.hljs-title, .hljs-section, .hljs-attribute { - color: #fec418 -} - -.hljs-string, .hljs-symbol, .hljs-bullet, .hljs-addition { - color: #48b685 -} - -.hljs-keyword, .hljs-selector-tag { - color: #815ba4 -} - -.hljs { - display: block; - overflow-x: auto; - background: #e7e9db; - color: #4f424c; - padding: 0.5em -} - -.hljs-emphasis { - font-style: italic -} - -.hljs-strong { - font-weight: bold -} - -.link-icon { - opacity: 0; - position: absolute; - margin-left: -25px; - padding-right: 5px; - padding-top: 2px; -} - -.example-container .link-icon { - margin-top: -6px; -} - -.example-container:hover .link-icon, -.name-container:hover .link-icon { - opacity: .5; -} - -.name-container { - display: flex; - padding-top: 1em; -} diff --git a/docs/agenda/3.1.0/styles/prettify-jsdoc.css b/docs/agenda/3.1.0/styles/prettify-jsdoc.css deleted file mode 100644 index 834a866..0000000 --- a/docs/agenda/3.1.0/styles/prettify-jsdoc.css +++ /dev/null @@ -1,111 +0,0 @@ -/* JSDoc prettify.js theme */ - -/* plain text */ -.pln { - color: #000000; - font-weight: normal; - font-style: normal; -} - -/* string content */ -.str { - color: hsl(104, 100%, 24%); - font-weight: normal; - font-style: normal; -} - -/* a keyword */ -.kwd { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* a comment */ -.com { - font-weight: normal; - font-style: italic; -} - -/* a type name */ -.typ { - color: #000000; - font-weight: normal; - font-style: normal; -} - -/* a literal value */ -.lit { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* punctuation */ -.pun { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* lisp open bracket */ -.opn { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* lisp close bracket */ -.clo { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* a markup tag name */ -.tag { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a markup attribute name */ -.atn { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a markup attribute value */ -.atv { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a declaration */ -.dec { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* a variable name */ -.var { - color: #000000; - font-weight: normal; - font-style: normal; -} - -/* a function name */ -.fun { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* Specify class=linenums on a pre to get line numbering */ -ol.linenums { - margin-top: 0; - margin-bottom: 0; -} diff --git a/docs/agenda/3.1.0/styles/prettify-tomorrow.css b/docs/agenda/3.1.0/styles/prettify-tomorrow.css deleted file mode 100644 index eaf1251..0000000 --- a/docs/agenda/3.1.0/styles/prettify-tomorrow.css +++ /dev/null @@ -1,138 +0,0 @@ -/* Tomorrow Theme */ -/* Original theme - https://github.com/chriskempson/tomorrow-theme */ -/* Pretty printing styles. Used with prettify.js. */ -/* SPAN elements with the classes below are added by prettyprint. */ -/* plain text */ -.pln { - color: #4d4d4c; } - -@media screen { - /* string content */ - .str { - color: hsl(104, 100%, 24%); } - - /* a keyword */ - .kwd { - color: hsl(240, 100%, 50%); } - - /* a comment */ - .com { - color: hsl(0, 0%, 60%); } - - /* a type name */ - .typ { - color: hsl(240, 100%, 32%); } - - /* a literal value */ - .lit { - color: hsl(240, 100%, 40%); } - - /* punctuation */ - .pun { - color: #000000; } - - /* lisp open bracket */ - .opn { - color: #000000; } - - /* lisp close bracket */ - .clo { - color: #000000; } - - /* a markup tag name */ - .tag { - color: #c82829; } - - /* a markup attribute name */ - .atn { - color: #f5871f; } - - /* a markup attribute value */ - .atv { - color: #3e999f; } - - /* a declaration */ - .dec { - color: #f5871f; } - - /* a variable name */ - .var { - color: #c82829; } - - /* a function name */ - .fun { - color: #4271ae; } } -/* Use higher contrast and text-weight for printable form. */ -@media print, projection { - .str { - color: #060; } - - .kwd { - color: #006; - font-weight: bold; } - - .com { - color: #600; - font-style: italic; } - - .typ { - color: #404; - font-weight: bold; } - - .lit { - color: #044; } - - .pun, .opn, .clo { - color: #440; } - - .tag { - color: #006; - font-weight: bold; } - - .atn { - color: #404; } - - .atv { - color: #060; } } -/* Style */ -/* -pre.prettyprint { - background: white; - font-family: Consolas, Monaco, 'Andale Mono', monospace; - font-size: 12px; - line-height: 1.5; - border: 1px solid #ccc; - padding: 10px; } -*/ - -/* Get LI elements to show when they are in the main article */ -article ul li { - list-style-type: circle; - margin-left: 25px; -} - -/* Specify class=linenums on a pre to get line numbering */ -ol.linenums { - margin-top: 0; - margin-bottom: 0; } - -/* IE indents via margin-left */ -li.L0, -li.L1, -li.L2, -li.L3, -li.L4, -li.L5, -li.L6, -li.L7, -li.L8, -li.L9 { - /* */ } - -/* Alternate shading for lines */ -li.L1, -li.L3, -li.L5, -li.L7, -li.L9 { - /* */ } diff --git a/docs/agenda/3.1.0/utils_create-job.js.html b/docs/agenda/3.1.0/utils_create-job.js.html deleted file mode 100644 index 1d53785..0000000 --- a/docs/agenda/3.1.0/utils_create-job.js.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - utils/create-job.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- utils/create-job.js -

- - - - - -
-
-
'use strict';
-const Job = require('../job');
-
-/**
- * Create Job object from data
- * @param {Object} agenda instance of Agenda
- * @param {Object} jobData job data
- * @returns {Job} returns created job
- */
-module.exports = (agenda, jobData) => {
-  jobData.agenda = agenda;
-  return new Job(jobData);
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/3.1.0/utils_process-jobs.js.html b/docs/agenda/3.1.0/utils_process-jobs.js.html deleted file mode 100644 index 84c11fa..0000000 --- a/docs/agenda/3.1.0/utils_process-jobs.js.html +++ /dev/null @@ -1,401 +0,0 @@ - - - - - - - - - - - utils/process-jobs.js - Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- utils/process-jobs.js -

- - - - - -
-
-
'use strict';
-// @TODO: What should we use for internal util functions?
-//        Maybe we should use agenda:util:processJobs which would move agenda:* to agenda:agenda;*
-const debug = require('debug')('agenda:internal:processJobs');
-const createJob = require('./create-job');
-
-/**
- * Process methods for jobs
- * @param {Job} extraJob job to run immediately
- * @returns {undefined}
- */
-module.exports = function(extraJob) {
-  debug('starting to process jobs');
-  // Make sure an interval has actually been set
-  // Prevents race condition with 'Agenda.stop' and already scheduled run
-  if (!this._processInterval) {
-    debug('no _processInterval set when calling processJobs, returning');
-    return;
-  }
-
-  const self = this;
-  const definitions = this._definitions;
-  const jobQueue = this._jobQueue;
-  let jobName;
-
-  // Determine whether or not we have a direct process call!
-  if (!extraJob) {
-    // Go through each jobName set in 'Agenda.process' and fill the queue with the next jobs
-    for (jobName in definitions) {
-      if ({}.hasOwnProperty.call(definitions, jobName)) {
-        debug('queuing up job to process: [%s]', jobName);
-        jobQueueFilling(jobName);
-      }
-    }
-  } else if (definitions[extraJob.attrs.name]) {
-    // Add the job to list of jobs to lock and then lock it immediately!
-    debug('job [%s] was passed directly to processJobs(), locking and running immediately', extraJob.attrs.name);
-    self._jobsToLock.push(extraJob);
-    lockOnTheFly();
-  }
-
-  /**
-   * Returns true if a job of the specified name can be locked.
-   * Considers maximum locked jobs at any time if self._lockLimit is > 0
-   * Considers maximum locked jobs of the specified name at any time if jobDefinition.lockLimit is > 0
-   * @param {String} name name of job to check if we should lock or not
-   * @returns {boolean} whether or not you should lock job
-   */
-  function shouldLock(name) {
-    const jobDefinition = definitions[name];
-    let shouldLock = true;
-    if (self._lockLimit && self._lockLimit <= self._lockedJobs.length) {
-      shouldLock = false;
-    }
-
-    if (jobDefinition.lockLimit && jobDefinition.lockLimit <= jobDefinition.locked) {
-      shouldLock = false;
-    }
-
-    debug('job [%s] lock status: shouldLock = %s', name, shouldLock);
-    return shouldLock;
-  }
-
-  /**
-   * Internal method that adds jobs to be processed to the local queue
-   * @param {*} jobs Jobs to queue
-   * @param {boolean} inFront puts the job in front of queue if true
-   * @returns {undefined}
-   */
-  function enqueueJobs(jobs) {
-    if (!Array.isArray(jobs)) {
-      jobs = [jobs];
-    }
-
-    jobs.forEach(job => {
-      jobQueue.insert(job);
-    });
-  }
-
-  /**
-   * Internal method that will lock a job and store it on MongoDB
-   * This method is called when we immediately start to process a job without using the process interval
-   * We do this because sometimes jobs are scheduled but will be run before the next process time
-   * @returns {undefined}
-   */
-  async function lockOnTheFly() {
-    // Already running this? Return
-    if (self._isLockingOnTheFly) {
-      debug('lockOnTheFly() already running, returning');
-      return;
-    }
-
-    // Don't have any jobs to run? Return
-    if (self._jobsToLock.length === 0) {
-      debug('no jobs to current lock on the fly, returning');
-      self._isLockingOnTheFly = false;
-      return;
-    }
-
-    // Set that we are running this
-    self._isLockingOnTheFly = true;
-
-    // Grab a job that needs to be locked
-    const now = new Date();
-    const job = self._jobsToLock.pop();
-
-    // If locking limits have been hit, stop locking on the fly.
-    // Jobs that were waiting to be locked will be picked up during a
-    // future locking interval.
-    if (!shouldLock(job.attrs.name)) {
-      debug('lock limit hit for: [%s]', job.attrs.name);
-      self._jobsToLock = [];
-      self._isLockingOnTheFly = false;
-      return;
-    }
-
-    // Query to run against collection to see if we need to lock it
-    const criteria = {
-      _id: job.attrs._id,
-      lockedAt: null,
-      nextRunAt: job.attrs.nextRunAt,
-      disabled: {$ne: true}
-    };
-
-    // Update / options for the MongoDB query
-    const update = {$set: {lockedAt: now}};
-    const options = {returnDocument: 'after'};
-
-    // Lock the job in MongoDB!
-    const resp = await self._collection.findOneAndUpdate(criteria, update, options);
-
-    if (resp.value) {
-      const job = createJob(self, resp.value);
-      debug('found job [%s] that can be locked on the fly', job.attrs.name);
-      self._lockedJobs.push(job);
-      definitions[job.attrs.name].locked++;
-      enqueueJobs(job);
-      jobProcessing();
-    }
-
-    // Mark lock on fly is done for now
-    self._isLockingOnTheFly = false;
-
-    // Re-run in case anything is in the queue
-    await lockOnTheFly();
-  }
-
-  /**
-   * Internal method used to fill a queue with jobs that can be run
-   * @param {String} name fill a queue with specific job name
-   * @returns {undefined}
-   */
-  async function jobQueueFilling(name) {
-    // Don't lock because of a limit we have set (lockLimit, etc)
-    if (!shouldLock(name)) {
-      debug('lock limit reached in queue filling for [%s]', name);
-      return;
-    }
-
-    // Set the date of the next time we are going to run _processEvery function
-    const now = new Date();
-    self._nextScanAt = new Date(now.valueOf() + self._processEvery);
-
-    // For this job name, find the next job to run and lock it!
-    try {
-      const job = await self._findAndLockNextJob(name, definitions[name]);
-      // Still have the job?
-      // 1. Add it to lock list
-      // 2. Add count of locked jobs
-      // 3. Queue the job to actually be run now that it is locked
-      // 4. Recursively run this same method we are in to check for more available jobs of same type!
-      if (job) {
-        debug('[%s:%s] job locked while filling queue', name, job.attrs._id);
-        self._lockedJobs.push(job);
-        definitions[job.attrs.name].locked++;
-        enqueueJobs(job);
-        await jobQueueFilling(name);
-        jobProcessing();
-      }
-    } catch (error) {
-      debug('[%s] job lock failed while filling queue', name, error);
-    }
-  }
-
-  /**
-   * Internal method that processes any jobs in the local queue (array)
-   * @returns {undefined}
-   */
-  function jobProcessing() {
-    // Ensure we have jobs
-    if (jobQueue.length === 0) {
-      return;
-    }
-
-    // Store for all sorts of things
-    const now = new Date();
-
-    // Get the next job that is not blocked by concurrency
-    const job = jobQueue.returnNextConcurrencyFreeJob(definitions);
-
-    debug('[%s:%s] about to process job', job.attrs.name, job.attrs._id);
-
-    // If the 'nextRunAt' time is older than the current time, run the job
-    // Otherwise, setTimeout that gets called at the time of 'nextRunAt'
-    if (job.attrs.nextRunAt <= now) {
-      debug('[%s:%s] nextRunAt is in the past, run the job immediately', job.attrs.name, job.attrs._id);
-      runOrRetry();
-    } else {
-      const runIn = job.attrs.nextRunAt - now;
-      debug('[%s:%s] nextRunAt is in the future, calling setTimeout(%d)', job.attrs.name, job.attrs._id, runIn);
-      setTimeout(jobProcessing, runIn);
-    }
-
-    /**
-     * Internal method that tries to run a job and if it fails, retries again!
-     * @returns {undefined}
-     */
-    async function runOrRetry() {
-      if (self._processInterval) {
-        const job = jobQueue.pop();
-        const jobDefinition = definitions[job.attrs.name];
-        if (jobDefinition.concurrency > jobDefinition.running && self._runningJobs.length < self._maxConcurrency) {
-          // Get the deadline of when the job is not supposed to go past for locking
-          const lockDeadline = new Date(Date.now() - jobDefinition.lockLifetime);
-
-          // This means a job has "expired", as in it has not been "touched" within the lockoutTime
-          // Remove from local lock
-          // NOTE: Shouldn't we update the 'lockedAt' value in MongoDB so it can be picked up on restart?
-          if (job.attrs.lockedAt < lockDeadline) {
-            debug('[%s:%s] job lock has expired, freeing it up', job.attrs.name, job.attrs._id);
-            self._lockedJobs.splice(self._lockedJobs.indexOf(job), 1);
-            jobDefinition.locked--;
-            jobProcessing();
-            return;
-          }
-
-          // Add to local "running" queue
-          self._runningJobs.push(job);
-          jobDefinition.running++;
-
-          // CALL THE ACTUAL METHOD TO PROCESS THE JOB!!!
-          debug('[%s:%s] processing job', job.attrs.name, job.attrs._id);
-
-          job.run()
-            .catch(error => [error, job])
-            .then(job => processJobResult(...Array.isArray(job) ? job : [null, job])); // eslint-disable-line promise/prefer-await-to-then
-        } else {
-          // Run the job immediately by putting it on the top of the queue
-          debug('[%s:%s] concurrency preventing immediate run, pushing job to top of queue', job.attrs.name, job.attrs._id);
-          enqueueJobs(job);
-        }
-      }
-    }
-  }
-
-  /**
-   * Internal method used to run the job definition
-   * @param {Error} err thrown if can't process job
-   * @param {module.Job} job job to process
-   * @returns {undefined}
-   */
-  function processJobResult(err, job) {
-    if (err) {
-      return job.agenda.emit('error', err);
-    }
-
-    const {name} = job.attrs;
-
-    // Job isn't in running jobs so throw an error
-    if (!self._runningJobs.includes(job)) {
-      debug('[%s] callback was called, job must have been marked as complete already', job.attrs._id);
-      throw new Error('callback already called - job ' + name + ' already marked complete');
-    }
-
-    // Remove the job from the running queue
-    self._runningJobs.splice(self._runningJobs.indexOf(job), 1);
-    if (definitions[name].running > 0) {
-      definitions[name].running--;
-    }
-
-    // Remove the job from the locked queue
-    self._lockedJobs.splice(self._lockedJobs.indexOf(job), 1);
-    if (definitions[name].locked > 0) {
-      definitions[name].locked--;
-    }
-
-    // Re-process jobs now that one has finished
-    jobProcessing();
-  }
-};
-
-
-
- - - - -
- -
- - - - - - - - - - diff --git a/docs/agenda/4.x/assets/css/main.css b/docs/agenda/4.x/assets/css/main.css deleted file mode 100644 index 3c0dcab..0000000 --- a/docs/agenda/4.x/assets/css/main.css +++ /dev/null @@ -1 +0,0 @@ -/*! normalize.css v1.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-size:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;font-family:sans-serif}button,input,select,textarea{font-family:sans-serif}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em;margin:.67em 0}h2{font-size:1.5em;margin:.83em 0}h3{font-size:1.17em;margin:1em 0}h4,.tsd-index-panel h3{font-size:1em;margin:1.33em 0}h5{font-size:.83em;margin:1.67em 0}h6{font-size:.67em;margin:2.33em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:1em 40px}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{background:#ff0;color:#000}p,pre{margin:1em 0}code,kbd,pre,samp{font-family:monospace,serif;_font-family:"courier new",monospace;font-size:1em}pre{white-space:pre;white-space:pre-wrap;word-wrap:break-word}q{quotes:none}q:before,q:after{content:"";content:none}small{font-size:80%}sub{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;top:-0.5em}sub{bottom:-0.25em}dl,menu,ol,ul{margin:1em 0}dd{margin:0 0 0 40px}menu,ol,ul{padding:0 0 0 40px}nav ul,nav ol{list-style:none;list-style-image:none}img{border:0;-ms-interpolation-mode:bicubic}svg:not(:root){overflow:hidden}figure,form{margin:0}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0;white-space:normal;*margin-left:-7px}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=button]{-webkit-appearance:button;cursor:pointer;*overflow:visible}input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;*overflow:visible}button[disabled],html input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0;*height:13px;*width:13px}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}.hljs{display:inline-block;padding:.5em;background:#fff;color:#000}.hljs-comment,.hljs-annotation,.hljs-template_comment,.diff .hljs-header,.hljs-chunk,.apache .hljs-cbracket{color:green}.hljs-keyword,.hljs-id,.hljs-built_in,.css .smalltalk .hljs-class,.hljs-winutils,.bash .hljs-variable,.tex .hljs-command,.hljs-request,.hljs-status,.nginx .hljs-title{color:blue}.xml .hljs-tag{color:blue}.xml .hljs-tag .hljs-value{color:blue}.hljs-string,.hljs-title,.hljs-parent,.hljs-tag .hljs-value,.hljs-rules .hljs-value{color:#a31515}.ruby .hljs-symbol{color:#a31515}.ruby .hljs-symbol .hljs-string{color:#a31515}.hljs-template_tag,.django .hljs-variable,.hljs-addition,.hljs-flow,.hljs-stream,.apache .hljs-tag,.hljs-date,.tex .hljs-formula,.coffeescript .hljs-attribute{color:#a31515}.ruby .hljs-string,.hljs-decorator,.hljs-filter .hljs-argument,.hljs-localvars,.hljs-array,.hljs-attr_selector,.hljs-pseudo,.hljs-pi,.hljs-doctype,.hljs-deletion,.hljs-envvar,.hljs-shebang,.hljs-preprocessor,.hljs-pragma,.userType,.apache .hljs-sqbracket,.nginx .hljs-built_in,.tex .hljs-special,.hljs-prompt{color:#2b91af}.hljs-phpdoc,.hljs-javadoc,.hljs-xmlDocTag{color:gray}.vhdl .hljs-typename{font-weight:bold}.vhdl .hljs-string{color:#666}.vhdl .hljs-literal{color:#a31515}.vhdl .hljs-attribute{color:#00b0e8}.xml .hljs-attribute{color:red}ul.tsd-descriptions>li>:first-child,.tsd-panel>:first-child,.col>:first-child,.col-11>:first-child,.col-10>:first-child,.col-9>:first-child,.col-8>:first-child,.col-7>:first-child,.col-6>:first-child,.col-5>:first-child,.col-4>:first-child,.col-3>:first-child,.col-2>:first-child,.col-1>:first-child,ul.tsd-descriptions>li>:first-child>:first-child,.tsd-panel>:first-child>:first-child,.col>:first-child>:first-child,.col-11>:first-child>:first-child,.col-10>:first-child>:first-child,.col-9>:first-child>:first-child,.col-8>:first-child>:first-child,.col-7>:first-child>:first-child,.col-6>:first-child>:first-child,.col-5>:first-child>:first-child,.col-4>:first-child>:first-child,.col-3>:first-child>:first-child,.col-2>:first-child>:first-child,.col-1>:first-child>:first-child,ul.tsd-descriptions>li>:first-child>:first-child>:first-child,.tsd-panel>:first-child>:first-child>:first-child,.col>:first-child>:first-child>:first-child,.col-11>:first-child>:first-child>:first-child,.col-10>:first-child>:first-child>:first-child,.col-9>:first-child>:first-child>:first-child,.col-8>:first-child>:first-child>:first-child,.col-7>:first-child>:first-child>:first-child,.col-6>:first-child>:first-child>:first-child,.col-5>:first-child>:first-child>:first-child,.col-4>:first-child>:first-child>:first-child,.col-3>:first-child>:first-child>:first-child,.col-2>:first-child>:first-child>:first-child,.col-1>:first-child>:first-child>:first-child{margin-top:0}ul.tsd-descriptions>li>:last-child,.tsd-panel>:last-child,.col>:last-child,.col-11>:last-child,.col-10>:last-child,.col-9>:last-child,.col-8>:last-child,.col-7>:last-child,.col-6>:last-child,.col-5>:last-child,.col-4>:last-child,.col-3>:last-child,.col-2>:last-child,.col-1>:last-child,ul.tsd-descriptions>li>:last-child>:last-child,.tsd-panel>:last-child>:last-child,.col>:last-child>:last-child,.col-11>:last-child>:last-child,.col-10>:last-child>:last-child,.col-9>:last-child>:last-child,.col-8>:last-child>:last-child,.col-7>:last-child>:last-child,.col-6>:last-child>:last-child,.col-5>:last-child>:last-child,.col-4>:last-child>:last-child,.col-3>:last-child>:last-child,.col-2>:last-child>:last-child,.col-1>:last-child>:last-child,ul.tsd-descriptions>li>:last-child>:last-child>:last-child,.tsd-panel>:last-child>:last-child>:last-child,.col>:last-child>:last-child>:last-child,.col-11>:last-child>:last-child>:last-child,.col-10>:last-child>:last-child>:last-child,.col-9>:last-child>:last-child>:last-child,.col-8>:last-child>:last-child>:last-child,.col-7>:last-child>:last-child>:last-child,.col-6>:last-child>:last-child>:last-child,.col-5>:last-child>:last-child>:last-child,.col-4>:last-child>:last-child>:last-child,.col-3>:last-child>:last-child>:last-child,.col-2>:last-child>:last-child>:last-child,.col-1>:last-child>:last-child>:last-child{margin-bottom:0}.container{max-width:1200px;margin:0 auto;padding:0 40px}@media(max-width: 640px){.container{padding:0 20px}}.container-main{padding-bottom:200px}.row{display:flex;position:relative;margin:0 -10px}.row:after{visibility:hidden;display:block;content:"";clear:both;height:0}.col,.col-11,.col-10,.col-9,.col-8,.col-7,.col-6,.col-5,.col-4,.col-3,.col-2,.col-1{box-sizing:border-box;float:left;padding:0 10px}.col-1{width:8.3333333333%}.offset-1{margin-left:8.3333333333%}.col-2{width:16.6666666667%}.offset-2{margin-left:16.6666666667%}.col-3{width:25%}.offset-3{margin-left:25%}.col-4{width:33.3333333333%}.offset-4{margin-left:33.3333333333%}.col-5{width:41.6666666667%}.offset-5{margin-left:41.6666666667%}.col-6{width:50%}.offset-6{margin-left:50%}.col-7{width:58.3333333333%}.offset-7{margin-left:58.3333333333%}.col-8{width:66.6666666667%}.offset-8{margin-left:66.6666666667%}.col-9{width:75%}.offset-9{margin-left:75%}.col-10{width:83.3333333333%}.offset-10{margin-left:83.3333333333%}.col-11{width:91.6666666667%}.offset-11{margin-left:91.6666666667%}.tsd-kind-icon{display:block;position:relative;padding-left:20px;text-indent:-20px}.tsd-kind-icon:before{content:"";display:inline-block;vertical-align:middle;width:17px;height:17px;margin:0 3px 2px 0;background-image:url(../images/icons.png)}@media(-webkit-min-device-pixel-ratio: 1.5),(min-resolution: 144dpi){.tsd-kind-icon:before{background-image:url(../images/icons@2x.png);background-size:238px 204px}}.tsd-signature.tsd-kind-icon:before{background-position:0 -153px}.tsd-kind-object-literal>.tsd-kind-icon:before{background-position:0px -17px}.tsd-kind-object-literal.tsd-is-protected>.tsd-kind-icon:before{background-position:-17px -17px}.tsd-kind-object-literal.tsd-is-private>.tsd-kind-icon:before{background-position:-34px -17px}.tsd-kind-class>.tsd-kind-icon:before{background-position:0px -34px}.tsd-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-17px -34px}.tsd-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-34px -34px}.tsd-kind-class.tsd-has-type-parameter>.tsd-kind-icon:before{background-position:0px -51px}.tsd-kind-class.tsd-has-type-parameter.tsd-is-protected>.tsd-kind-icon:before{background-position:-17px -51px}.tsd-kind-class.tsd-has-type-parameter.tsd-is-private>.tsd-kind-icon:before{background-position:-34px -51px}.tsd-kind-interface>.tsd-kind-icon:before{background-position:0px -68px}.tsd-kind-interface.tsd-is-protected>.tsd-kind-icon:before{background-position:-17px -68px}.tsd-kind-interface.tsd-is-private>.tsd-kind-icon:before{background-position:-34px -68px}.tsd-kind-interface.tsd-has-type-parameter>.tsd-kind-icon:before{background-position:0px -85px}.tsd-kind-interface.tsd-has-type-parameter.tsd-is-protected>.tsd-kind-icon:before{background-position:-17px -85px}.tsd-kind-interface.tsd-has-type-parameter.tsd-is-private>.tsd-kind-icon:before{background-position:-34px -85px}.tsd-kind-namespace>.tsd-kind-icon:before{background-position:0px -102px}.tsd-kind-namespace.tsd-is-protected>.tsd-kind-icon:before{background-position:-17px -102px}.tsd-kind-namespace.tsd-is-private>.tsd-kind-icon:before{background-position:-34px -102px}.tsd-kind-module>.tsd-kind-icon:before{background-position:0px -102px}.tsd-kind-module.tsd-is-protected>.tsd-kind-icon:before{background-position:-17px -102px}.tsd-kind-module.tsd-is-private>.tsd-kind-icon:before{background-position:-34px -102px}.tsd-kind-enum>.tsd-kind-icon:before{background-position:0px -119px}.tsd-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-17px -119px}.tsd-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-34px -119px}.tsd-kind-enum-member>.tsd-kind-icon:before{background-position:0px -136px}.tsd-kind-enum-member.tsd-is-protected>.tsd-kind-icon:before{background-position:-17px -136px}.tsd-kind-enum-member.tsd-is-private>.tsd-kind-icon:before{background-position:-34px -136px}.tsd-kind-signature>.tsd-kind-icon:before{background-position:0px -153px}.tsd-kind-signature.tsd-is-protected>.tsd-kind-icon:before{background-position:-17px -153px}.tsd-kind-signature.tsd-is-private>.tsd-kind-icon:before{background-position:-34px -153px}.tsd-kind-type-alias>.tsd-kind-icon:before{background-position:0px -170px}.tsd-kind-type-alias.tsd-is-protected>.tsd-kind-icon:before{background-position:-17px -170px}.tsd-kind-type-alias.tsd-is-private>.tsd-kind-icon:before{background-position:-34px -170px}.tsd-kind-type-alias.tsd-has-type-parameter>.tsd-kind-icon:before{background-position:0px -187px}.tsd-kind-type-alias.tsd-has-type-parameter.tsd-is-protected>.tsd-kind-icon:before{background-position:-17px -187px}.tsd-kind-type-alias.tsd-has-type-parameter.tsd-is-private>.tsd-kind-icon:before{background-position:-34px -187px}.tsd-kind-variable>.tsd-kind-icon:before{background-position:-136px -0px}.tsd-kind-variable.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -0px}.tsd-kind-variable.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -0px}.tsd-kind-variable.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -0px}.tsd-kind-variable.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -0px}.tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -0px}.tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -0px}.tsd-kind-variable.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -0px}.tsd-kind-variable.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -0px}.tsd-kind-variable.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -0px}.tsd-kind-variable.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -0px}.tsd-kind-variable.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -0px}.tsd-kind-variable.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -0px}.tsd-kind-property>.tsd-kind-icon:before{background-position:-136px -0px}.tsd-kind-property.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -0px}.tsd-kind-property.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -0px}.tsd-kind-property.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -0px}.tsd-kind-property.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -0px}.tsd-kind-property.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -0px}.tsd-kind-property.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -0px}.tsd-kind-property.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -0px}.tsd-kind-property.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -0px}.tsd-kind-property.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -0px}.tsd-kind-property.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -0px}.tsd-kind-property.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -0px}.tsd-kind-property.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -0px}.tsd-kind-get-signature>.tsd-kind-icon:before{background-position:-136px -17px}.tsd-kind-get-signature.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -17px}.tsd-kind-get-signature.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -17px}.tsd-kind-get-signature.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -17px}.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -17px}.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -17px}.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -17px}.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -17px}.tsd-kind-get-signature.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -17px}.tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -17px}.tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -17px}.tsd-kind-get-signature.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -17px}.tsd-kind-get-signature.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -17px}.tsd-kind-set-signature>.tsd-kind-icon:before{background-position:-136px -34px}.tsd-kind-set-signature.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -34px}.tsd-kind-set-signature.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -34px}.tsd-kind-set-signature.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -34px}.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -34px}.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -34px}.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -34px}.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -34px}.tsd-kind-set-signature.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -34px}.tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -34px}.tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -34px}.tsd-kind-set-signature.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -34px}.tsd-kind-set-signature.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -34px}.tsd-kind-accessor>.tsd-kind-icon:before{background-position:-136px -51px}.tsd-kind-accessor.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -51px}.tsd-kind-accessor.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -51px}.tsd-kind-accessor.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -51px}.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -51px}.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -51px}.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -51px}.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -51px}.tsd-kind-accessor.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -51px}.tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -51px}.tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -51px}.tsd-kind-accessor.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -51px}.tsd-kind-accessor.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -51px}.tsd-kind-function>.tsd-kind-icon:before{background-position:-136px -68px}.tsd-kind-function.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -68px}.tsd-kind-function.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -68px}.tsd-kind-function.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -68px}.tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -68px}.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -68px}.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -68px}.tsd-kind-function.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -68px}.tsd-kind-function.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -68px}.tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -68px}.tsd-kind-function.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -68px}.tsd-kind-function.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -68px}.tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -68px}.tsd-kind-method>.tsd-kind-icon:before{background-position:-136px -68px}.tsd-kind-method.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -68px}.tsd-kind-method.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -68px}.tsd-kind-method.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -68px}.tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -68px}.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -68px}.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -68px}.tsd-kind-method.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -68px}.tsd-kind-method.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -68px}.tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -68px}.tsd-kind-method.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -68px}.tsd-kind-method.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -68px}.tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -68px}.tsd-kind-call-signature>.tsd-kind-icon:before{background-position:-136px -68px}.tsd-kind-call-signature.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -68px}.tsd-kind-call-signature.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -68px}.tsd-kind-call-signature.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -68px}.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -68px}.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -68px}.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -68px}.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -68px}.tsd-kind-call-signature.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -68px}.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -68px}.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -68px}.tsd-kind-call-signature.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -68px}.tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -68px}.tsd-kind-function.tsd-has-type-parameter>.tsd-kind-icon:before{background-position:-136px -85px}.tsd-kind-function.tsd-has-type-parameter.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -85px}.tsd-kind-function.tsd-has-type-parameter.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -85px}.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -85px}.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -85px}.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -85px}.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -85px}.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -85px}.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -85px}.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -85px}.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -85px}.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -85px}.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -85px}.tsd-kind-method.tsd-has-type-parameter>.tsd-kind-icon:before{background-position:-136px -85px}.tsd-kind-method.tsd-has-type-parameter.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -85px}.tsd-kind-method.tsd-has-type-parameter.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -85px}.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -85px}.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -85px}.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -85px}.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -85px}.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -85px}.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -85px}.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -85px}.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -85px}.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -85px}.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -85px}.tsd-kind-constructor>.tsd-kind-icon:before{background-position:-136px -102px}.tsd-kind-constructor.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -102px}.tsd-kind-constructor.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -102px}.tsd-kind-constructor.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -102px}.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -102px}.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -102px}.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -102px}.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -102px}.tsd-kind-constructor.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -102px}.tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -102px}.tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -102px}.tsd-kind-constructor.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -102px}.tsd-kind-constructor.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -102px}.tsd-kind-constructor-signature>.tsd-kind-icon:before{background-position:-136px -102px}.tsd-kind-constructor-signature.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -102px}.tsd-kind-constructor-signature.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -102px}.tsd-kind-constructor-signature.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -102px}.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -102px}.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -102px}.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -102px}.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -102px}.tsd-kind-constructor-signature.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -102px}.tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -102px}.tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -102px}.tsd-kind-constructor-signature.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -102px}.tsd-kind-constructor-signature.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -102px}.tsd-kind-index-signature>.tsd-kind-icon:before{background-position:-136px -119px}.tsd-kind-index-signature.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -119px}.tsd-kind-index-signature.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -119px}.tsd-kind-index-signature.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -119px}.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -119px}.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -119px}.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -119px}.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -119px}.tsd-kind-index-signature.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -119px}.tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -119px}.tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -119px}.tsd-kind-index-signature.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -119px}.tsd-kind-index-signature.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -119px}.tsd-kind-event>.tsd-kind-icon:before{background-position:-136px -136px}.tsd-kind-event.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -136px}.tsd-kind-event.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -136px}.tsd-kind-event.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -136px}.tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -136px}.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -136px}.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -136px}.tsd-kind-event.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -136px}.tsd-kind-event.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -136px}.tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -136px}.tsd-kind-event.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -136px}.tsd-kind-event.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -136px}.tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -136px}.tsd-is-static>.tsd-kind-icon:before{background-position:-136px -153px}.tsd-is-static.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -153px}.tsd-is-static.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -153px}.tsd-is-static.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -153px}.tsd-is-static.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -153px}.tsd-is-static.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -153px}.tsd-is-static.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -153px}.tsd-is-static.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -153px}.tsd-is-static.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -153px}.tsd-is-static.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -153px}.tsd-is-static.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -153px}.tsd-is-static.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -153px}.tsd-is-static.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -153px}.tsd-is-static.tsd-kind-function>.tsd-kind-icon:before{background-position:-136px -170px}.tsd-is-static.tsd-kind-function.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -170px}.tsd-is-static.tsd-kind-function.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -170px}.tsd-is-static.tsd-kind-function.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -170px}.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -170px}.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -170px}.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -170px}.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -170px}.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -170px}.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -170px}.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -170px}.tsd-is-static.tsd-kind-function.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -170px}.tsd-is-static.tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -170px}.tsd-is-static.tsd-kind-method>.tsd-kind-icon:before{background-position:-136px -170px}.tsd-is-static.tsd-kind-method.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -170px}.tsd-is-static.tsd-kind-method.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -170px}.tsd-is-static.tsd-kind-method.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -170px}.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -170px}.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -170px}.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -170px}.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -170px}.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -170px}.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -170px}.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -170px}.tsd-is-static.tsd-kind-method.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -170px}.tsd-is-static.tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -170px}.tsd-is-static.tsd-kind-call-signature>.tsd-kind-icon:before{background-position:-136px -170px}.tsd-is-static.tsd-kind-call-signature.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -170px}.tsd-is-static.tsd-kind-call-signature.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -170px}.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -170px}.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -170px}.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -170px}.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -170px}.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -170px}.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -170px}.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -170px}.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -170px}.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -170px}.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -170px}.tsd-is-static.tsd-kind-event>.tsd-kind-icon:before{background-position:-136px -187px}.tsd-is-static.tsd-kind-event.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -187px}.tsd-is-static.tsd-kind-event.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -187px}.tsd-is-static.tsd-kind-event.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -187px}.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -187px}.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -187px}.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -187px}.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -187px}.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -187px}.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -187px}.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -187px}.tsd-is-static.tsd-kind-event.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -187px}.tsd-is-static.tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -187px}@keyframes fade-in{from{opacity:0}to{opacity:1}}@keyframes fade-out{from{opacity:1;visibility:visible}to{opacity:0}}@keyframes fade-in-delayed{0%{opacity:0}33%{opacity:0}100%{opacity:1}}@keyframes fade-out-delayed{0%{opacity:1;visibility:visible}66%{opacity:0}100%{opacity:0}}@keyframes shift-to-left{from{transform:translate(0, 0)}to{transform:translate(-25%, 0)}}@keyframes unshift-to-left{from{transform:translate(-25%, 0)}to{transform:translate(0, 0)}}@keyframes pop-in-from-right{from{transform:translate(100%, 0)}to{transform:translate(0, 0)}}@keyframes pop-out-to-right{from{transform:translate(0, 0);visibility:visible}to{transform:translate(100%, 0)}}body{background:#fdfdfd;font-family:"Segoe UI",sans-serif;font-size:16px;color:#222}a{color:#4da6ff;text-decoration:none}a:hover{text-decoration:underline}code,pre{font-family:Menlo,Monaco,Consolas,"Courier New",monospace;padding:.2em;margin:0;font-size:14px;background-color:rgba(0,0,0,.04)}pre{padding:10px}pre code{padding:0;font-size:100%;background-color:transparent}.tsd-typography{line-height:1.333em}.tsd-typography ul{list-style:square;padding:0 0 0 20px;margin:0}.tsd-typography h4,.tsd-typography .tsd-index-panel h3,.tsd-index-panel .tsd-typography h3,.tsd-typography h5,.tsd-typography h6{font-size:1em;margin:0}.tsd-typography h5,.tsd-typography h6{font-weight:normal}.tsd-typography p,.tsd-typography ul,.tsd-typography ol{margin:1em 0}@media(min-width: 901px)and (max-width: 1024px){html.default .col-content{width:72%}html.default .col-menu{width:28%}html.default .tsd-navigation{padding-left:10px}}@media(max-width: 900px){html.default .col-content{float:none;width:100%}html.default .col-menu{position:fixed !important;overflow:auto;-webkit-overflow-scrolling:touch;z-index:1024;top:0 !important;bottom:0 !important;left:auto !important;right:0 !important;width:100%;padding:20px 20px 0 0;max-width:450px;visibility:hidden;background-color:#fff;transform:translate(100%, 0)}html.default .col-menu>*:last-child{padding-bottom:20px}html.default .overlay{content:"";display:block;position:fixed;z-index:1023;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,.75);visibility:hidden}html.default.to-has-menu .overlay{animation:fade-in .4s}html.default.to-has-menu header,html.default.to-has-menu footer,html.default.to-has-menu .col-content{animation:shift-to-left .4s}html.default.to-has-menu .col-menu{animation:pop-in-from-right .4s}html.default.from-has-menu .overlay{animation:fade-out .4s}html.default.from-has-menu header,html.default.from-has-menu footer,html.default.from-has-menu .col-content{animation:unshift-to-left .4s}html.default.from-has-menu .col-menu{animation:pop-out-to-right .4s}html.default.has-menu body{overflow:hidden}html.default.has-menu .overlay{visibility:visible}html.default.has-menu header,html.default.has-menu footer,html.default.has-menu .col-content{transform:translate(-25%, 0)}html.default.has-menu .col-menu{visibility:visible;transform:translate(0, 0)}}.tsd-page-title{padding:70px 0 20px 0;margin:0 0 40px 0;background:#fff;box-shadow:0 0 5px rgba(0,0,0,.35)}.tsd-page-title h1{margin:0}.tsd-breadcrumb{margin:0;padding:0;color:#707070}.tsd-breadcrumb a{color:#707070;text-decoration:none}.tsd-breadcrumb a:hover{text-decoration:underline}.tsd-breadcrumb li{display:inline}.tsd-breadcrumb li:after{content:" / "}html.minimal .container{margin:0}html.minimal .container-main{padding-top:50px;padding-bottom:0}html.minimal .content-wrap{padding-left:300px}html.minimal .tsd-navigation{position:fixed !important;overflow:auto;-webkit-overflow-scrolling:touch;box-sizing:border-box;z-index:1;left:0;top:40px;bottom:0;width:300px;padding:20px;margin:0}html.minimal .tsd-member .tsd-member{margin-left:0}html.minimal .tsd-page-toolbar{position:fixed;z-index:2}html.minimal #tsd-filter .tsd-filter-group{right:0;transform:none}html.minimal footer{background-color:transparent}html.minimal footer .container{padding:0}html.minimal .tsd-generator{padding:0}@media(max-width: 900px){html.minimal .tsd-navigation{display:none}html.minimal .content-wrap{padding-left:0}}dl.tsd-comment-tags{overflow:hidden}dl.tsd-comment-tags dt{float:left;padding:1px 5px;margin:0 10px 0 0;border-radius:4px;border:1px solid #707070;color:#707070;font-size:.8em;font-weight:normal}dl.tsd-comment-tags dd{margin:0 0 10px 0}dl.tsd-comment-tags dd:before,dl.tsd-comment-tags dd:after{display:table;content:" "}dl.tsd-comment-tags dd pre,dl.tsd-comment-tags dd:after{clear:both}dl.tsd-comment-tags p{margin:0}.tsd-panel.tsd-comment .lead{font-size:1.1em;line-height:1.333em;margin-bottom:2em}.tsd-panel.tsd-comment .lead:last-child{margin-bottom:0}.toggle-protected .tsd-is-private{display:none}.toggle-public .tsd-is-private,.toggle-public .tsd-is-protected,.toggle-public .tsd-is-private-protected{display:none}.toggle-inherited .tsd-is-inherited{display:none}.toggle-only-exported .tsd-is-not-exported{display:none}.toggle-externals .tsd-is-external{display:none}#tsd-filter{position:relative;display:inline-block;height:40px;vertical-align:bottom}.no-filter #tsd-filter{display:none}#tsd-filter .tsd-filter-group{display:inline-block;height:40px;vertical-align:bottom;white-space:nowrap}#tsd-filter input{display:none}@media(max-width: 900px){#tsd-filter .tsd-filter-group{display:block;position:absolute;top:40px;right:20px;height:auto;background-color:#fff;visibility:hidden;transform:translate(50%, 0);box-shadow:0 0 4px rgba(0,0,0,.25)}.has-options #tsd-filter .tsd-filter-group{visibility:visible}.to-has-options #tsd-filter .tsd-filter-group{animation:fade-in .2s}.from-has-options #tsd-filter .tsd-filter-group{animation:fade-out .2s}#tsd-filter label,#tsd-filter .tsd-select{display:block;padding-right:20px}}footer{border-top:1px solid #eee;background-color:#fff}footer.with-border-bottom{border-bottom:1px solid #eee}footer .tsd-legend-group{font-size:0}footer .tsd-legend{display:inline-block;width:25%;padding:0;font-size:16px;list-style:none;line-height:1.333em;vertical-align:top}@media(max-width: 900px){footer .tsd-legend{width:50%}}.tsd-hierarchy{list-style:square;padding:0 0 0 20px;margin:0}.tsd-hierarchy .target{font-weight:bold}.tsd-index-panel .tsd-index-content{margin-bottom:-30px !important}.tsd-index-panel .tsd-index-section{margin-bottom:30px !important}.tsd-index-panel h3{margin:0 -20px 10px -20px;padding:0 20px 10px 20px;border-bottom:1px solid #eee}.tsd-index-panel ul.tsd-index-list{-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3;-webkit-column-gap:20px;-moz-column-gap:20px;-ms-column-gap:20px;-o-column-gap:20px;column-gap:20px;padding:0;list-style:none;line-height:1.333em}@media(max-width: 900px){.tsd-index-panel ul.tsd-index-list{-webkit-column-count:1;-moz-column-count:1;-ms-column-count:1;-o-column-count:1;column-count:1}}@media(min-width: 901px)and (max-width: 1024px){.tsd-index-panel ul.tsd-index-list{-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}}.tsd-index-panel ul.tsd-index-list li{-webkit-page-break-inside:avoid;-moz-page-break-inside:avoid;-ms-page-break-inside:avoid;-o-page-break-inside:avoid;page-break-inside:avoid}.tsd-index-panel a,.tsd-index-panel .tsd-parent-kind-module a{color:#9600ff}.tsd-index-panel .tsd-parent-kind-interface a{color:#647f1b}.tsd-index-panel .tsd-parent-kind-enum a{color:#937210}.tsd-index-panel .tsd-parent-kind-class a{color:#0672de}.tsd-index-panel .tsd-kind-module a{color:#9600ff}.tsd-index-panel .tsd-kind-interface a{color:#647f1b}.tsd-index-panel .tsd-kind-enum a{color:#937210}.tsd-index-panel .tsd-kind-class a{color:#0672de}.tsd-index-panel .tsd-is-private a{color:#707070}.tsd-flag{display:inline-block;padding:1px 5px;border-radius:4px;color:#fff;background-color:#707070;text-indent:0;font-size:14px;font-weight:normal}.tsd-anchor{position:absolute;top:-100px}.tsd-member{position:relative}.tsd-member .tsd-anchor+h3{margin-top:0;margin-bottom:0;border-bottom:none}.tsd-navigation{margin:0 0 0 40px}.tsd-navigation a{display:block;padding-top:2px;padding-bottom:2px;border-left:2px solid transparent;color:#222;text-decoration:none;transition:border-left-color .1s}.tsd-navigation a:hover{text-decoration:underline}.tsd-navigation ul{margin:0;padding:0;list-style:none}.tsd-navigation li{padding:0}.tsd-navigation.primary{padding-bottom:40px}.tsd-navigation.primary a{display:block;padding-top:6px;padding-bottom:6px}.tsd-navigation.primary ul li a{padding-left:5px}.tsd-navigation.primary ul li li a{padding-left:25px}.tsd-navigation.primary ul li li li a{padding-left:45px}.tsd-navigation.primary ul li li li li a{padding-left:65px}.tsd-navigation.primary ul li li li li li a{padding-left:85px}.tsd-navigation.primary ul li li li li li li a{padding-left:105px}.tsd-navigation.primary>ul{border-bottom:1px solid #eee}.tsd-navigation.primary li{border-top:1px solid #eee}.tsd-navigation.primary li.current>a{font-weight:bold}.tsd-navigation.primary li.label span{display:block;padding:20px 0 6px 5px;color:#707070}.tsd-navigation.primary li.globals+li>span,.tsd-navigation.primary li.globals+li>a{padding-top:20px}.tsd-navigation.secondary{max-height:calc(100vh - 1rem - 40px);overflow:auto;position:-webkit-sticky;position:sticky;top:calc(.5rem + 40px);transition:.3s}.tsd-navigation.secondary.tsd-navigation--toolbar-hide{max-height:calc(100vh - 1rem);top:.5rem}.tsd-navigation.secondary ul{transition:opacity .2s}.tsd-navigation.secondary ul li a{padding-left:25px}.tsd-navigation.secondary ul li li a{padding-left:45px}.tsd-navigation.secondary ul li li li a{padding-left:65px}.tsd-navigation.secondary ul li li li li a{padding-left:85px}.tsd-navigation.secondary ul li li li li li a{padding-left:105px}.tsd-navigation.secondary ul li li li li li li a{padding-left:125px}.tsd-navigation.secondary ul.current a{border-left-color:#eee}.tsd-navigation.secondary li.focus>a,.tsd-navigation.secondary ul.current li.focus>a{border-left-color:#000}.tsd-navigation.secondary li.current{margin-top:20px;margin-bottom:20px;border-left-color:#eee}.tsd-navigation.secondary li.current>a{font-weight:bold}@media(min-width: 901px){.menu-sticky-wrap{position:static}}.tsd-panel{margin:20px 0;padding:20px;background-color:#fff;box-shadow:0 0 4px rgba(0,0,0,.25)}.tsd-panel:empty{display:none}.tsd-panel>h1,.tsd-panel>h2,.tsd-panel>h3{margin:1.5em -20px 10px -20px;padding:0 20px 10px 20px;border-bottom:1px solid #eee}.tsd-panel>h1.tsd-before-signature,.tsd-panel>h2.tsd-before-signature,.tsd-panel>h3.tsd-before-signature{margin-bottom:0;border-bottom:0}.tsd-panel table{display:block;width:100%;overflow:auto;margin-top:10px;word-break:normal;word-break:keep-all}.tsd-panel table th{font-weight:bold}.tsd-panel table th,.tsd-panel table td{padding:6px 13px;border:1px solid #ddd}.tsd-panel table tr{background-color:#fff;border-top:1px solid #ccc}.tsd-panel table tr:nth-child(2n){background-color:#f8f8f8}.tsd-panel-group{margin:60px 0}.tsd-panel-group>h1,.tsd-panel-group>h2,.tsd-panel-group>h3{padding-left:20px;padding-right:20px}#tsd-search{transition:background-color .2s}#tsd-search .title{position:relative;z-index:2}#tsd-search .field{position:absolute;left:0;top:0;right:40px;height:40px}#tsd-search .field input{box-sizing:border-box;position:relative;top:-50px;z-index:1;width:100%;padding:0 10px;opacity:0;outline:0;border:0;background:transparent;color:#222}#tsd-search .field label{position:absolute;overflow:hidden;right:-40px}#tsd-search .field input,#tsd-search .title{transition:opacity .2s}#tsd-search .results{position:absolute;visibility:hidden;top:40px;width:100%;margin:0;padding:0;list-style:none;box-shadow:0 0 4px rgba(0,0,0,.25)}#tsd-search .results li{padding:0 10px;background-color:#fdfdfd}#tsd-search .results li:nth-child(even){background-color:#fff}#tsd-search .results li.state{display:none}#tsd-search .results li.current,#tsd-search .results li:hover{background-color:#eee}#tsd-search .results a{display:block}#tsd-search .results a:before{top:10px}#tsd-search .results span.parent{color:#707070;font-weight:normal}#tsd-search.has-focus{background-color:#eee}#tsd-search.has-focus .field input{top:0;opacity:1}#tsd-search.has-focus .title{z-index:0;opacity:0}#tsd-search.has-focus .results{visibility:visible}#tsd-search.loading .results li.state.loading{display:block}#tsd-search.failure .results li.state.failure{display:block}.tsd-signature{margin:0 0 1em 0;padding:10px;border:1px solid #eee;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;font-size:14px;overflow-x:auto}.tsd-signature.tsd-kind-icon{padding-left:30px}.tsd-signature.tsd-kind-icon:before{top:10px;left:10px}.tsd-panel>.tsd-signature{margin-left:-20px;margin-right:-20px;border-width:1px 0}.tsd-panel>.tsd-signature.tsd-kind-icon{padding-left:40px}.tsd-panel>.tsd-signature.tsd-kind-icon:before{left:20px}.tsd-signature-symbol{color:#707070;font-weight:normal}.tsd-signature-type{font-style:italic;font-weight:normal}.tsd-signatures{padding:0;margin:0 0 1em 0;border:1px solid #eee}.tsd-signatures .tsd-signature{margin:0;border-width:1px 0 0 0;transition:background-color .1s}.tsd-signatures .tsd-signature:first-child{border-top-width:0}.tsd-signatures .tsd-signature.current{background-color:#eee}.tsd-signatures.active>.tsd-signature{cursor:pointer}.tsd-panel>.tsd-signatures{margin-left:-20px;margin-right:-20px;border-width:1px 0}.tsd-panel>.tsd-signatures .tsd-signature.tsd-kind-icon{padding-left:40px}.tsd-panel>.tsd-signatures .tsd-signature.tsd-kind-icon:before{left:20px}.tsd-panel>a.anchor+.tsd-signatures{border-top-width:0;margin-top:-20px}ul.tsd-descriptions{position:relative;overflow:hidden;padding:0;list-style:none}ul.tsd-descriptions.active>.tsd-description{display:none}ul.tsd-descriptions.active>.tsd-description.current{display:block}ul.tsd-descriptions.active>.tsd-description.fade-in{animation:fade-in-delayed .3s}ul.tsd-descriptions.active>.tsd-description.fade-out{animation:fade-out-delayed .3s;position:absolute;display:block;top:0;left:0;right:0;opacity:0;visibility:hidden}ul.tsd-descriptions h4,ul.tsd-descriptions .tsd-index-panel h3,.tsd-index-panel ul.tsd-descriptions h3{font-size:16px;margin:1em 0 .5em 0}ul.tsd-parameters,ul.tsd-type-parameters{list-style:square;margin:0;padding-left:20px}ul.tsd-parameters>li.tsd-parameter-signature,ul.tsd-type-parameters>li.tsd-parameter-signature{list-style:none;margin-left:-20px}ul.tsd-parameters h5,ul.tsd-type-parameters h5{font-size:16px;margin:1em 0 .5em 0}ul.tsd-parameters .tsd-comment,ul.tsd-type-parameters .tsd-comment{margin-top:-0.5em}.tsd-sources{font-size:14px;color:#707070;margin:0 0 1em 0}.tsd-sources a{color:#707070;text-decoration:underline}.tsd-sources ul,.tsd-sources p{margin:0 !important}.tsd-sources ul{list-style:none;padding:0}.tsd-page-toolbar{position:fixed;z-index:1;top:0;left:0;width:100%;height:40px;color:#333;background:#fff;border-bottom:1px solid #eee;transition:transform .3s linear}.tsd-page-toolbar a{color:#333;text-decoration:none}.tsd-page-toolbar a.title{font-weight:bold}.tsd-page-toolbar a.title:hover{text-decoration:underline}.tsd-page-toolbar .table-wrap{display:table;width:100%;height:40px}.tsd-page-toolbar .table-cell{display:table-cell;position:relative;white-space:nowrap;line-height:40px}.tsd-page-toolbar .table-cell:first-child{width:100%}.tsd-page-toolbar--hide{transform:translateY(-100%)}.tsd-select .tsd-select-list li:before,.tsd-select .tsd-select-label:before,.tsd-widget:before{content:"";display:inline-block;width:40px;height:40px;margin:0 -8px 0 0;background-image:url(../images/widgets.png);background-repeat:no-repeat;text-indent:-1024px;vertical-align:bottom}@media(-webkit-min-device-pixel-ratio: 1.5),(min-resolution: 144dpi){.tsd-select .tsd-select-list li:before,.tsd-select .tsd-select-label:before,.tsd-widget:before{background-image:url(../images/widgets@2x.png);background-size:320px 40px}}.tsd-widget{display:inline-block;overflow:hidden;opacity:.6;height:40px;transition:opacity .1s,background-color .2s;vertical-align:bottom;cursor:pointer}.tsd-widget:hover{opacity:.8}.tsd-widget.active{opacity:1;background-color:#eee}.tsd-widget.no-caption{width:40px}.tsd-widget.no-caption:before{margin:0}.tsd-widget.search:before{background-position:0 0}.tsd-widget.menu:before{background-position:-40px 0}.tsd-widget.options:before{background-position:-80px 0}.tsd-widget.options,.tsd-widget.menu{display:none}@media(max-width: 900px){.tsd-widget.options,.tsd-widget.menu{display:inline-block}}input[type=checkbox]+.tsd-widget:before{background-position:-120px 0}input[type=checkbox]:checked+.tsd-widget:before{background-position:-160px 0}.tsd-select{position:relative;display:inline-block;height:40px;transition:opacity .1s,background-color .2s;vertical-align:bottom;cursor:pointer}.tsd-select .tsd-select-label{opacity:.6;transition:opacity .2s}.tsd-select .tsd-select-label:before{background-position:-240px 0}.tsd-select.active .tsd-select-label{opacity:.8}.tsd-select.active .tsd-select-list{visibility:visible;opacity:1;transition-delay:0s}.tsd-select .tsd-select-list{position:absolute;visibility:hidden;top:40px;left:0;margin:0;padding:0;opacity:0;list-style:none;box-shadow:0 0 4px rgba(0,0,0,.25);transition:visibility 0s .2s,opacity .2s}.tsd-select .tsd-select-list li{padding:0 20px 0 0;background-color:#fdfdfd}.tsd-select .tsd-select-list li:before{background-position:40px 0}.tsd-select .tsd-select-list li:nth-child(even){background-color:#fff}.tsd-select .tsd-select-list li:hover{background-color:#eee}.tsd-select .tsd-select-list li.selected:before{background-position:-200px 0}@media(max-width: 900px){.tsd-select .tsd-select-list{top:0;left:auto;right:100%;margin-right:-5px}.tsd-select .tsd-select-label:before{background-position:-280px 0}}img{max-width:100%} diff --git a/docs/agenda/4.x/assets/images/icons.png b/docs/agenda/4.x/assets/images/icons.png deleted file mode 100644 index 3836d5f..0000000 Binary files a/docs/agenda/4.x/assets/images/icons.png and /dev/null differ diff --git a/docs/agenda/4.x/assets/images/icons@2x.png b/docs/agenda/4.x/assets/images/icons@2x.png deleted file mode 100644 index 5a209e2..0000000 Binary files a/docs/agenda/4.x/assets/images/icons@2x.png and /dev/null differ diff --git a/docs/agenda/4.x/assets/images/widgets.png b/docs/agenda/4.x/assets/images/widgets.png deleted file mode 100644 index c738053..0000000 Binary files a/docs/agenda/4.x/assets/images/widgets.png and /dev/null differ diff --git a/docs/agenda/4.x/assets/images/widgets@2x.png b/docs/agenda/4.x/assets/images/widgets@2x.png deleted file mode 100644 index 4bbbd57..0000000 Binary files a/docs/agenda/4.x/assets/images/widgets@2x.png and /dev/null differ diff --git a/docs/agenda/4.x/assets/js/main.js b/docs/agenda/4.x/assets/js/main.js deleted file mode 100644 index c2190a9..0000000 --- a/docs/agenda/4.x/assets/js/main.js +++ /dev/null @@ -1,51 +0,0 @@ -!function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=2)}([function(e,t,r){var n,i; -/** - * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 - * Copyright (C) 2020 Oliver Nightingale - * @license MIT - */!function(){var s,o,a,u,l,c,h,d,f,p,y,m,v,g,x,w,L,E,b,S,k,Q,O,P,T,_,C=function(e){var t=new C.Builder;return t.pipeline.add(C.trimmer,C.stopWordFilter,C.stemmer),t.searchPipeline.add(C.stemmer),e.call(t,t),t.build()};C.version="2.3.9" -/*! - * lunr.utils - * Copyright (C) 2020 Oliver Nightingale - */,C.utils={},C.utils.warn=(s=this,function(e){s.console&&console.warn&&console.warn(e)}),C.utils.asString=function(e){return null==e?"":e.toString()},C.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),r=Object.keys(e),n=0;n0){var u=C.utils.clone(t)||{};u.position=[o,a],u.index=i.length,i.push(new C.Token(r.slice(o,s),u))}o=s+1}}return i},C.tokenizer.separator=/[\s\-]+/ -/*! - * lunr.Pipeline - * Copyright (C) 2020 Oliver Nightingale - */,C.Pipeline=function(){this._stack=[]},C.Pipeline.registeredFunctions=Object.create(null),C.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&C.utils.warn("Overwriting existing registered function: "+t),e.label=t,C.Pipeline.registeredFunctions[e.label]=e},C.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||C.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},C.Pipeline.load=function(e){var t=new C.Pipeline;return e.forEach((function(e){var r=C.Pipeline.registeredFunctions[e];if(!r)throw new Error("Cannot load unregistered function: "+e);t.add(r)})),t},C.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach((function(e){C.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)}),this)},C.Pipeline.prototype.after=function(e,t){C.Pipeline.warnIfFunctionNotRegistered(t);var r=this._stack.indexOf(e);if(-1==r)throw new Error("Cannot find existingFn");r+=1,this._stack.splice(r,0,t)},C.Pipeline.prototype.before=function(e,t){C.Pipeline.warnIfFunctionNotRegistered(t);var r=this._stack.indexOf(e);if(-1==r)throw new Error("Cannot find existingFn");this._stack.splice(r,0,t)},C.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},C.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r1&&(se&&(r=i),s!=e);)n=r-t,i=t+Math.floor(n/2),s=this.elements[2*i];return s==e||s>e?2*i:sa?l+=2:o==a&&(t+=r[u+1]*n[l+1],u+=2,l+=2);return t},C.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},C.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t0){var s,o=i.str.charAt(0);o in i.node.edges?s=i.node.edges[o]:(s=new C.TokenSet,i.node.edges[o]=s),1==i.str.length&&(s.final=!0),n.push({node:s,editsRemaining:i.editsRemaining,str:i.str.slice(1)})}if(0!=i.editsRemaining){if("*"in i.node.edges)var a=i.node.edges["*"];else{a=new C.TokenSet;i.node.edges["*"]=a}if(0==i.str.length&&(a.final=!0),n.push({node:a,editsRemaining:i.editsRemaining-1,str:i.str}),i.str.length>1&&n.push({node:i.node,editsRemaining:i.editsRemaining-1,str:i.str.slice(1)}),1==i.str.length&&(i.node.final=!0),i.str.length>=1){if("*"in i.node.edges)var u=i.node.edges["*"];else{u=new C.TokenSet;i.node.edges["*"]=u}1==i.str.length&&(u.final=!0),n.push({node:u,editsRemaining:i.editsRemaining-1,str:i.str.slice(1)})}if(i.str.length>1){var l,c=i.str.charAt(0),h=i.str.charAt(1);h in i.node.edges?l=i.node.edges[h]:(l=new C.TokenSet,i.node.edges[h]=l),1==i.str.length&&(l.final=!0),n.push({node:l,editsRemaining:i.editsRemaining-1,str:c+i.str.slice(2)})}}}return r},C.TokenSet.fromString=function(e){for(var t=new C.TokenSet,r=t,n=0,i=e.length;n=e;t--){var r=this.uncheckedNodes[t],n=r.child.toString();n in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[n]:(r.child._str=n,this.minimizedNodes[n]=r.child),this.uncheckedNodes.pop()}} -/*! - * lunr.Index - * Copyright (C) 2020 Oliver Nightingale - */,C.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},C.Index.prototype.search=function(e){return this.query((function(t){new C.QueryParser(e,t).parse()}))},C.Index.prototype.query=function(e){for(var t=new C.Query(this.fields),r=Object.create(null),n=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=0;a1?1:e},C.Builder.prototype.k1=function(e){this._k1=e},C.Builder.prototype.add=function(e,t){var r=e[this._ref],n=Object.keys(this._fields);this._documents[r]=t||{},this.documentCount+=1;for(var i=0;i=this.length)return C.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},C.QueryLexer.prototype.width=function(){return this.pos-this.start},C.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},C.QueryLexer.prototype.backup=function(){this.pos-=1},C.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=C.QueryLexer.EOS&&this.backup()},C.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(C.QueryLexer.TERM)),e.ignore(),e.more())return C.QueryLexer.lexText},C.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(C.QueryLexer.EDIT_DISTANCE),C.QueryLexer.lexText},C.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(C.QueryLexer.BOOST),C.QueryLexer.lexText},C.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(C.QueryLexer.TERM)},C.QueryLexer.termSeparator=C.tokenizer.separator,C.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==C.QueryLexer.EOS)return C.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return C.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(C.QueryLexer.TERM),C.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(C.QueryLexer.TERM),C.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(C.QueryLexer.PRESENCE),C.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(C.QueryLexer.PRESENCE),C.QueryLexer.lexText;if(t.match(C.QueryLexer.termSeparator))return C.QueryLexer.lexTerm}else e.escapeCharacter()}},C.QueryParser=function(e,t){this.lexer=new C.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},C.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=C.QueryParser.parseClause;e;)e=e(this);return this.query},C.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},C.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},C.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},C.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case C.QueryLexer.PRESENCE:return C.QueryParser.parsePresence;case C.QueryLexer.FIELD:return C.QueryParser.parseField;case C.QueryLexer.TERM:return C.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(r+=" with value '"+t.str+"'"),new C.QueryParseError(r,t.start,t.end)}},C.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=C.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=C.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+t.str+"'";throw new C.QueryParseError(r,t.start,t.end)}var n=e.peekLexeme();if(null==n){r="expecting term or field, found nothing";throw new C.QueryParseError(r,t.start,t.end)}switch(n.type){case C.QueryLexer.FIELD:return C.QueryParser.parseField;case C.QueryLexer.TERM:return C.QueryParser.parseTerm;default:r="expecting term or field, found '"+n.type+"'";throw new C.QueryParseError(r,n.start,n.end)}}},C.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var r=e.query.allFields.map((function(e){return"'"+e+"'"})).join(", "),n="unrecognised field '"+t.str+"', possible fields: "+r;throw new C.QueryParseError(n,t.start,t.end)}e.currentClause.fields=[t.str];var i=e.peekLexeme();if(null==i){n="expecting term, found nothing";throw new C.QueryParseError(n,t.start,t.end)}switch(i.type){case C.QueryLexer.TERM:return C.QueryParser.parseTerm;default:n="expecting term, found '"+i.type+"'";throw new C.QueryParseError(n,i.start,i.end)}}},C.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(null!=r)switch(r.type){case C.QueryLexer.TERM:return e.nextClause(),C.QueryParser.parseTerm;case C.QueryLexer.FIELD:return e.nextClause(),C.QueryParser.parseField;case C.QueryLexer.EDIT_DISTANCE:return C.QueryParser.parseEditDistance;case C.QueryLexer.BOOST:return C.QueryParser.parseBoost;case C.QueryLexer.PRESENCE:return e.nextClause(),C.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+r.type+"'";throw new C.QueryParseError(n,r.start,r.end)}else e.nextClause()}},C.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var r=parseInt(t.str,10);if(isNaN(r)){var n="edit distance must be numeric";throw new C.QueryParseError(n,t.start,t.end)}e.currentClause.editDistance=r;var i=e.peekLexeme();if(null!=i)switch(i.type){case C.QueryLexer.TERM:return e.nextClause(),C.QueryParser.parseTerm;case C.QueryLexer.FIELD:return e.nextClause(),C.QueryParser.parseField;case C.QueryLexer.EDIT_DISTANCE:return C.QueryParser.parseEditDistance;case C.QueryLexer.BOOST:return C.QueryParser.parseBoost;case C.QueryLexer.PRESENCE:return e.nextClause(),C.QueryParser.parsePresence;default:n="Unexpected lexeme type '"+i.type+"'";throw new C.QueryParseError(n,i.start,i.end)}else e.nextClause()}},C.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var r=parseInt(t.str,10);if(isNaN(r)){var n="boost must be numeric";throw new C.QueryParseError(n,t.start,t.end)}e.currentClause.boost=r;var i=e.peekLexeme();if(null!=i)switch(i.type){case C.QueryLexer.TERM:return e.nextClause(),C.QueryParser.parseTerm;case C.QueryLexer.FIELD:return e.nextClause(),C.QueryParser.parseField;case C.QueryLexer.EDIT_DISTANCE:return C.QueryParser.parseEditDistance;case C.QueryLexer.BOOST:return C.QueryParser.parseBoost;case C.QueryLexer.PRESENCE:return e.nextClause(),C.QueryParser.parsePresence;default:n="Unexpected lexeme type '"+i.type+"'";throw new C.QueryParseError(n,i.start,i.end)}else e.nextClause()}},void 0===(i="function"==typeof(n=function(){return C})?n.call(t,r,t,e):n)||(e.exports=i)}()},function(e,t,r){},function(e,t,r){"use strict";r.r(t);var n=[];function i(e,t){n.push({selector:t,constructor:e})}var s,o,a=function(){function e(){this.createComponents(document.body)}return e.prototype.createComponents=function(e){n.forEach((function(t){e.querySelectorAll(t.selector).forEach((function(e){e.dataset.hasInstance||(new t.constructor({el:e}),e.dataset.hasInstance=String(!0))}))}))},e}(),u=function(e){this.el=e.el},l=r(0),c=(s=function(e,t){return(s=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}s(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});!function(e){e[e.Idle=0]="Idle",e[e.Loading=1]="Loading",e[e.Ready=2]="Ready",e[e.Failure=3]="Failure"}(o||(o={}));var h=function(e){function t(t){var r=e.call(this,t)||this;r.query="",r.loadingState=o.Idle,r.hasFocus=!1,r.preventPress=!1,r.data=null,r.index=null,r.resultClicked=!1;var n=document.querySelector("#tsd-search-field"),i=document.querySelector(".results");if(!n||!i)throw new Error("The input field or the result list wrapper are not found");return r.field=n,r.results=i,r.base=r.el.dataset.base+"/",r.bindEvents(),r}return c(t,e),t.prototype.loadIndex=function(){var e=this;if(this.loadingState==o.Idle&&!this.data){setTimeout((function(){e.loadingState==o.Idle&&e.setLoadingState(o.Loading)}),500);var t=this.el.dataset.index;t?fetch(t).then((function(e){if(!e.ok)throw new Error("The search index is missing");return e.json()})).then((function(t){e.data=t,e.index=l.Index.load(t.index),e.setLoadingState(o.Ready)})).catch((function(t){console.error(t),e.setLoadingState(o.Failure)})):this.setLoadingState(o.Failure)}},t.prototype.updateResults=function(){if(this.loadingState==o.Ready&&(this.results.textContent="",this.query&&this.index&&this.data)){var e=this.index.search("*"+this.query+"*");0===e.length&&(e=this.index.search("*"+this.query+"~1*"));for(var t=0,r=Math.min(10,e.length);t"+e+""})),s=n.parent||"";(s=s.replace(new RegExp(this.query,"i"),(function(e){return""+e+""})))&&(i=''+s+"."+i);var a=document.createElement("li");a.classList.value=n.classes,a.innerHTML='\n '+i+"\n ",this.results.appendChild(a)}}},t.prototype.setLoadingState=function(e){this.loadingState!=e&&(this.el.classList.remove(o[this.loadingState].toLowerCase()),this.loadingState=e,this.el.classList.add(o[this.loadingState].toLowerCase()),this.updateResults())},t.prototype.setHasFocus=function(e){this.hasFocus!=e&&(this.hasFocus=e,this.el.classList.toggle("has-focus"),e?(this.setQuery(""),this.field.value=""):this.field.value=this.query)},t.prototype.setQuery=function(e){this.query=e.trim(),this.updateResults()},t.prototype.setCurrentResult=function(e){var t=this.results.querySelector(".current");if(t){var r=1==e?t.nextElementSibling:t.previousElementSibling;r&&(t.classList.remove("current"),r.classList.add("current"))}else(t=this.results.querySelector(1==e?"li:first-child":"li:last-child"))&&t.classList.add("current")},t.prototype.gotoCurrentResult=function(){var e=this.results.querySelector(".current");if(e||(e=this.results.querySelector("li:first-child")),e){var t=e.querySelector("a");t&&(window.location.href=t.href),this.field.blur()}},t.prototype.bindEvents=function(){var e=this;this.results.addEventListener("mousedown",(function(){e.resultClicked=!0})),this.results.addEventListener("mouseup",(function(){e.resultClicked=!1,e.setHasFocus(!1)})),this.field.addEventListener("focusin",(function(){e.setHasFocus(!0),e.loadIndex()})),this.field.addEventListener("focusout",(function(){e.resultClicked?e.resultClicked=!1:setTimeout((function(){return e.setHasFocus(!1)}),100)})),this.field.addEventListener("input",(function(){e.setQuery(e.field.value)})),this.field.addEventListener("keydown",(function(t){13==t.keyCode||27==t.keyCode||38==t.keyCode||40==t.keyCode?(e.preventPress=!0,t.preventDefault(),13==t.keyCode?e.gotoCurrentResult():27==t.keyCode?e.field.blur():38==t.keyCode?e.setCurrentResult(-1):40==t.keyCode&&e.setCurrentResult(1)):e.preventPress=!1})),this.field.addEventListener("keypress",(function(t){e.preventPress&&t.preventDefault()})),document.body.addEventListener("keydown",(function(t){t.altKey||t.ctrlKey||t.metaKey||!e.hasFocus&&t.keyCode>47&&t.keyCode<112&&e.field.focus()}))},t}(u),d=function(){function e(){this.listeners={}}return e.prototype.addEventListener=function(e,t){e in this.listeners||(this.listeners[e]=[]),this.listeners[e].push(t)},e.prototype.removeEventListener=function(e,t){if(e in this.listeners)for(var r=this.listeners[e],n=0,i=r.length;n=this.scrollTop||0===this.scrollTop,e!==this.showToolbar&&(this.toolbar.classList.toggle("tsd-page-toolbar--hide"),this.secondaryNav.classList.toggle("tsd-navigation--toolbar-hide")),this.lastY=this.scrollTop},t.instance=new t,t}(d),m=function(){var e=function(t,r){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),v=function(e){function t(t){var r=e.call(this,t)||this;return r.anchors=[],r.index=-1,y.instance.addEventListener("resize",(function(){return r.onResize()})),y.instance.addEventListener("scroll",(function(e){return r.onScroll(e)})),r.createAnchors(),r}return m(t,e),t.prototype.createAnchors=function(){var e=this,t=window.location.href;-1!=t.indexOf("#")&&(t=t.substr(0,t.indexOf("#"))),this.el.querySelectorAll("a").forEach((function(r){var n=r.href;if(-1!=n.indexOf("#")&&n.substr(0,t.length)==t){var i=n.substr(n.indexOf("#")+1),s=document.querySelector("a.tsd-anchor[name="+i+"]"),o=r.parentNode;s&&o&&e.anchors.push({link:o,anchor:s,position:0})}})),this.onResize()},t.prototype.onResize=function(){for(var e,t=0,r=this.anchors.length;t-1&&r[i].position>t;)i-=1;for(;i-1&&this.anchors[this.index].link.classList.remove("focus"),this.index=i,this.index>-1&&this.anchors[this.index].link.classList.add("focus"))},t}(u),g=function(){var e=function(t,r){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),x=function(){function e(e,t){this.signature=e,this.description=t}return e.prototype.addClass=function(e){return this.signature.classList.add(e),this.description.classList.add(e),this},e.prototype.removeClass=function(e){return this.signature.classList.remove(e),this.description.classList.remove(e),this},e}(),w=function(e){function t(t){var r=e.call(this,t)||this;return r.groups=[],r.index=-1,r.createGroups(),r.container&&(r.el.classList.add("active"),Array.from(r.el.children).forEach((function(e){e.addEventListener("touchstart",(function(e){return r.onClick(e)})),e.addEventListener("click",(function(e){return r.onClick(e)}))})),r.container.classList.add("active"),r.setIndex(0)),r}return g(t,e),t.prototype.setIndex=function(e){if(e<0&&(e=0),e>this.groups.length-1&&(e=this.groups.length-1),this.index!=e){var t=this.groups[e];if(this.index>-1){var r=this.groups[this.index];r.removeClass("current").addClass("fade-out"),t.addClass("current"),t.addClass("fade-in"),y.instance.triggerResize(),setTimeout((function(){r.removeClass("fade-out"),t.removeClass("fade-in")}),300)}else t.addClass("current"),y.instance.triggerResize();this.index=e}},t.prototype.createGroups=function(){var e=this.el.children;if(!(e.length<2)){this.container=this.el.nextElementSibling;var t=this.container.children;this.groups=[];for(var r=0;r10}})),document.addEventListener(b,(function(){Q=!1})),document.addEventListener("click",(function(e){k&&(e.preventDefault(),e.stopImmediatePropagation(),k=!1)}));var T=function(){var e=function(t,r){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),_=function(e){function t(t){var r=e.call(this,t)||this;return r.className=r.el.dataset.toggle||"",r.el.addEventListener(b,(function(e){return r.onPointerUp(e)})),r.el.addEventListener("click",(function(e){return e.preventDefault()})),document.addEventListener(L,(function(e){return r.onDocumentPointerDown(e)})),document.addEventListener(b,(function(e){return r.onDocumentPointerUp(e)})),r}return T(t,e),t.prototype.setActive=function(e){if(this.active!=e){this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);var t=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(t),setTimeout((function(){return document.documentElement.classList.remove(t)}),500)}},t.prototype.onPointerUp=function(e){O||(this.setActive(!0),e.preventDefault())},t.prototype.onDocumentPointerDown=function(e){if(this.active){if(e.target.closest(".col-menu, .tsd-filter-group"))return;this.setActive(!1)}},t.prototype.onDocumentPointerUp=function(e){var t=this;if(!O&&this.active&&e.target.closest(".col-menu")){var r=e.target.closest("a");if(r){var n=window.location.href;-1!=n.indexOf("#")&&(n=n.substr(0,n.indexOf("#"))),r.href.substr(0,n.length)==n&&setTimeout((function(){return t.setActive(!1)}),250)}}},t}(u),C=function(){var e=function(t,r){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),R=function(){function e(e,t){this.key=e,this.value=t,this.defaultValue=t,this.initialize(),window.localStorage[this.key]&&this.setValue(this.fromLocalStorage(window.localStorage[this.key]))}return e.prototype.initialize=function(){},e.prototype.setValue=function(e){if(this.value!=e){var t=this.value;this.value=e,window.localStorage[this.key]=this.toLocalStorage(e),this.handleValueChange(t,e)}},e}(),I=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return C(t,e),t.prototype.initialize=function(){var e=this,t=document.querySelector("#tsd-filter-"+this.key);t&&(this.checkbox=t,this.checkbox.addEventListener("change",(function(){e.setValue(e.checkbox.checked)})))},t.prototype.handleValueChange=function(e,t){this.checkbox&&(this.checkbox.checked=this.value,document.documentElement.classList.toggle("toggle-"+this.key,this.value!=this.defaultValue))},t.prototype.fromLocalStorage=function(e){return"true"==e},t.prototype.toLocalStorage=function(e){return e?"true":"false"},t}(R),j=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return C(t,e),t.prototype.initialize=function(){var e=this;document.documentElement.classList.add("toggle-"+this.key+this.value);var t=document.querySelector("#tsd-filter-"+this.key);if(t){this.select=t;var r=function(){e.select.classList.add("active")};this.select.addEventListener(L,r),this.select.addEventListener("mouseover",r),this.select.addEventListener("mouseleave",(function(){e.select.classList.remove("active")})),this.select.querySelectorAll("li").forEach((function(r){r.addEventListener(b,(function(r){t.classList.remove("active"),e.setValue(r.target.dataset.value||"")}))})),document.addEventListener(L,(function(t){e.select.contains(t.target)||e.select.classList.remove("active")}))}},t.prototype.handleValueChange=function(e,t){this.select.querySelectorAll("li.selected").forEach((function(e){e.classList.remove("selected")}));var r=this.select.querySelector('li[data-value="'+t+'"]'),n=this.select.querySelector(".tsd-select-label");r&&n&&(r.classList.add("selected"),n.textContent=r.textContent),document.documentElement.classList.remove("toggle-"+e),document.documentElement.classList.add("toggle-"+t)},t.prototype.fromLocalStorage=function(e){return e},t.prototype.toLocalStorage=function(e){return e},t}(R),F=function(e){function t(t){var r=e.call(this,t)||this;return r.optionVisibility=new j("visibility","private"),r.optionInherited=new I("inherited",!0),r.optionExternals=new I("externals",!0),r.optionOnlyExported=new I("only-exported",!1),r}return C(t,e),t.isSupported=function(){try{return void 0!==window.localStorage}catch(e){return!1}},t}(u);r(1);i(h,"#tsd-search"),i(v,".menu-highlight"),i(w,".tsd-signatures"),i(_,"a[data-toggle]"),F.isSupported()?i(F,"#tsd-filter"):document.documentElement.classList.add("no-filter");var N=new a;Object.defineProperty(window,"app",{value:N})}]); \ No newline at end of file diff --git a/docs/agenda/4.x/assets/js/search.json b/docs/agenda/4.x/assets/js/search.json deleted file mode 100644 index d5b5081..0000000 --- a/docs/agenda/4.x/assets/js/search.json +++ /dev/null @@ -1 +0,0 @@ -{"kinds":{"32":"Variable","64":"Function","128":"Class","256":"Interface","512":"Constructor","1024":"Property","2048":"Method","65536":"Type literal","262144":"Accessor","2097152":"Object literal","4194304":"Type alias"},"rows":[{"id":0,"kind":256,"name":"IJobDefinition","url":"interfaces/ijobdefinition.html","classes":"tsd-kind-interface tsd-has-type-parameter"},{"id":1,"kind":1024,"name":"lockLimit","url":"interfaces/ijobdefinition.html#locklimit","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IJobDefinition"},{"id":2,"kind":1024,"name":"lockLifetime","url":"interfaces/ijobdefinition.html#locklifetime","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IJobDefinition"},{"id":3,"kind":1024,"name":"priority","url":"interfaces/ijobdefinition.html#priority","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IJobDefinition"},{"id":4,"kind":1024,"name":"concurrency","url":"interfaces/ijobdefinition.html#concurrency","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IJobDefinition"},{"id":5,"kind":1024,"name":"fn","url":"interfaces/ijobdefinition.html#fn","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IJobDefinition"},{"id":6,"kind":4194304,"name":"DefinitionProcessor","url":"globals.html#definitionprocessor","classes":"tsd-kind-type-alias tsd-has-type-parameter"},{"id":7,"kind":65536,"name":"__type","url":"globals.html#definitionprocessor.__type","classes":"tsd-kind-type-literal tsd-parent-kind-type-alias","parent":"DefinitionProcessor"},{"id":8,"kind":256,"name":"IAgendaConfig","url":"interfaces/iagendaconfig.html","classes":"tsd-kind-interface"},{"id":9,"kind":1024,"name":"name","url":"interfaces/iagendaconfig.html#name","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IAgendaConfig"},{"id":10,"kind":1024,"name":"defaultConcurrency","url":"interfaces/iagendaconfig.html#defaultconcurrency","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IAgendaConfig"},{"id":11,"kind":1024,"name":"processEvery","url":"interfaces/iagendaconfig.html#processevery","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IAgendaConfig"},{"id":12,"kind":1024,"name":"maxConcurrency","url":"interfaces/iagendaconfig.html#maxconcurrency","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IAgendaConfig"},{"id":13,"kind":1024,"name":"defaultLockLimit","url":"interfaces/iagendaconfig.html#defaultlocklimit","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IAgendaConfig"},{"id":14,"kind":1024,"name":"lockLimit","url":"interfaces/iagendaconfig.html#locklimit","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IAgendaConfig"},{"id":15,"kind":1024,"name":"defaultLockLifetime","url":"interfaces/iagendaconfig.html#defaultlocklifetime","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IAgendaConfig"},{"id":16,"kind":256,"name":"IJobParameters","url":"interfaces/ijobparameters.html","classes":"tsd-kind-interface tsd-has-type-parameter"},{"id":17,"kind":1024,"name":"_id","url":"interfaces/ijobparameters.html#_id","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IJobParameters"},{"id":18,"kind":1024,"name":"name","url":"interfaces/ijobparameters.html#name","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IJobParameters"},{"id":19,"kind":1024,"name":"priority","url":"interfaces/ijobparameters.html#priority","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IJobParameters"},{"id":20,"kind":1024,"name":"nextRunAt","url":"interfaces/ijobparameters.html#nextrunat","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IJobParameters"},{"id":21,"kind":1024,"name":"type","url":"interfaces/ijobparameters.html#type","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IJobParameters"},{"id":22,"kind":1024,"name":"lockedAt","url":"interfaces/ijobparameters.html#lockedat","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IJobParameters"},{"id":23,"kind":1024,"name":"lastFinishedAt","url":"interfaces/ijobparameters.html#lastfinishedat","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IJobParameters"},{"id":24,"kind":1024,"name":"failedAt","url":"interfaces/ijobparameters.html#failedat","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IJobParameters"},{"id":25,"kind":1024,"name":"failCount","url":"interfaces/ijobparameters.html#failcount","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IJobParameters"},{"id":26,"kind":1024,"name":"failReason","url":"interfaces/ijobparameters.html#failreason","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IJobParameters"},{"id":27,"kind":1024,"name":"repeatTimezone","url":"interfaces/ijobparameters.html#repeattimezone","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IJobParameters"},{"id":28,"kind":1024,"name":"lastRunAt","url":"interfaces/ijobparameters.html#lastrunat","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IJobParameters"},{"id":29,"kind":1024,"name":"repeatInterval","url":"interfaces/ijobparameters.html#repeatinterval","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IJobParameters"},{"id":30,"kind":1024,"name":"data","url":"interfaces/ijobparameters.html#data","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IJobParameters"},{"id":31,"kind":1024,"name":"repeatAt","url":"interfaces/ijobparameters.html#repeatat","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IJobParameters"},{"id":32,"kind":1024,"name":"disabled","url":"interfaces/ijobparameters.html#disabled","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IJobParameters"},{"id":33,"kind":1024,"name":"progress","url":"interfaces/ijobparameters.html#progress","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IJobParameters"},{"id":34,"kind":1024,"name":"unique","url":"interfaces/ijobparameters.html#unique","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IJobParameters"},{"id":35,"kind":1024,"name":"uniqueOpts","url":"interfaces/ijobparameters.html#uniqueopts","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IJobParameters"},{"id":36,"kind":1024,"name":"lastModifiedBy","url":"interfaces/ijobparameters.html#lastmodifiedby","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IJobParameters"},{"id":37,"kind":4194304,"name":"TJobDatefield","url":"globals.html#tjobdatefield","classes":"tsd-kind-type-alias"},{"id":38,"kind":32,"name":"datefields","url":"globals.html#datefields","classes":"tsd-kind-variable"},{"id":39,"kind":256,"name":"IDatabaseOptions","url":"interfaces/idatabaseoptions.html","classes":"tsd-kind-interface"},{"id":40,"kind":1024,"name":"db","url":"interfaces/idatabaseoptions.html#db","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IDatabaseOptions"},{"id":41,"kind":65536,"name":"__type","url":"interfaces/idatabaseoptions.html#db.__type","classes":"tsd-kind-type-literal tsd-parent-kind-property","parent":"IDatabaseOptions.db"},{"id":42,"kind":32,"name":"collection","url":"interfaces/idatabaseoptions.html#db.__type.collection","classes":"tsd-kind-variable tsd-parent-kind-type-literal","parent":"IDatabaseOptions.db.__type"},{"id":43,"kind":32,"name":"address","url":"interfaces/idatabaseoptions.html#db.__type.address","classes":"tsd-kind-variable tsd-parent-kind-type-literal","parent":"IDatabaseOptions.db.__type"},{"id":44,"kind":32,"name":"options","url":"interfaces/idatabaseoptions.html#db.__type.options","classes":"tsd-kind-variable tsd-parent-kind-type-literal","parent":"IDatabaseOptions.db.__type"},{"id":45,"kind":256,"name":"IMongoOptions","url":"interfaces/imongooptions.html","classes":"tsd-kind-interface"},{"id":46,"kind":1024,"name":"db","url":"interfaces/imongooptions.html#db","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IMongoOptions"},{"id":47,"kind":1024,"name":"mongo","url":"interfaces/imongooptions.html#mongo","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IMongoOptions"},{"id":48,"kind":256,"name":"IDbConfig","url":"interfaces/idbconfig.html","classes":"tsd-kind-interface"},{"id":49,"kind":1024,"name":"ensureIndex","url":"interfaces/idbconfig.html#ensureindex","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IDbConfig"},{"id":50,"kind":1024,"name":"sort","url":"interfaces/idbconfig.html#sort","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IDbConfig"},{"id":51,"kind":256,"name":"IAgendaJobStatus","url":"interfaces/iagendajobstatus.html","classes":"tsd-kind-interface"},{"id":52,"kind":256,"name":"IAgendaStatus","url":"interfaces/iagendastatus.html","classes":"tsd-kind-interface"},{"id":53,"kind":1024,"name":"version","url":"interfaces/iagendastatus.html#version","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IAgendaStatus"},{"id":54,"kind":1024,"name":"queueName","url":"interfaces/iagendastatus.html#queuename","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IAgendaStatus"},{"id":55,"kind":1024,"name":"totalQueueSizeDB","url":"interfaces/iagendastatus.html#totalqueuesizedb","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IAgendaStatus"},{"id":56,"kind":1024,"name":"config","url":"interfaces/iagendastatus.html#config","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IAgendaStatus"},{"id":57,"kind":65536,"name":"__type","url":"interfaces/iagendastatus.html#config.__type","classes":"tsd-kind-type-literal tsd-parent-kind-property","parent":"IAgendaStatus.config"},{"id":58,"kind":32,"name":"totalLockLimit","url":"interfaces/iagendastatus.html#config.__type.totallocklimit","classes":"tsd-kind-variable tsd-parent-kind-type-literal","parent":"IAgendaStatus.config.__type"},{"id":59,"kind":32,"name":"maxConcurrency","url":"interfaces/iagendastatus.html#config.__type.maxconcurrency","classes":"tsd-kind-variable tsd-parent-kind-type-literal","parent":"IAgendaStatus.config.__type"},{"id":60,"kind":32,"name":"processEvery","url":"interfaces/iagendastatus.html#config.__type.processevery","classes":"tsd-kind-variable tsd-parent-kind-type-literal","parent":"IAgendaStatus.config.__type"},{"id":61,"kind":1024,"name":"internal","url":"interfaces/iagendastatus.html#internal","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IAgendaStatus"},{"id":62,"kind":65536,"name":"__type","url":"interfaces/iagendastatus.html#internal.__type-1","classes":"tsd-kind-type-literal tsd-parent-kind-property","parent":"IAgendaStatus.internal"},{"id":63,"kind":32,"name":"localQueueProcessing","url":"interfaces/iagendastatus.html#internal.__type-1.localqueueprocessing","classes":"tsd-kind-variable tsd-parent-kind-type-literal","parent":"IAgendaStatus.internal.__type"},{"id":64,"kind":1024,"name":"jobStatus","url":"interfaces/iagendastatus.html#jobstatus","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IAgendaStatus"},{"id":65,"kind":1024,"name":"queuedJobs","url":"interfaces/iagendastatus.html#queuedjobs","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IAgendaStatus"},{"id":66,"kind":1024,"name":"runningJobs","url":"interfaces/iagendastatus.html#runningjobs","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IAgendaStatus"},{"id":67,"kind":1024,"name":"lockedJobs","url":"interfaces/iagendastatus.html#lockedjobs","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IAgendaStatus"},{"id":68,"kind":1024,"name":"jobsToLock","url":"interfaces/iagendastatus.html#jobstolock","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IAgendaStatus"},{"id":69,"kind":1024,"name":"isLockingOnTheFly","url":"interfaces/iagendastatus.html#islockingonthefly","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"IAgendaStatus"},{"id":70,"kind":64,"name":"hasMongoProtocol","url":"globals.html#hasmongoprotocol","classes":"tsd-kind-function"},{"id":71,"kind":128,"name":"JobDbRepository","url":"classes/jobdbrepository.html","classes":"tsd-kind-class"},{"id":72,"kind":1024,"name":"collection","url":"classes/jobdbrepository.html#collection","classes":"tsd-kind-property tsd-parent-kind-class","parent":"JobDbRepository"},{"id":73,"kind":512,"name":"constructor","url":"classes/jobdbrepository.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"JobDbRepository"},{"id":74,"kind":1024,"name":"agenda","url":"classes/jobdbrepository.html#agenda","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"JobDbRepository"},{"id":75,"kind":1024,"name":"connectOptions","url":"classes/jobdbrepository.html#connectoptions","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"JobDbRepository"},{"id":76,"kind":2048,"name":"createConnection","url":"classes/jobdbrepository.html#createconnection","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"JobDbRepository"},{"id":77,"kind":2048,"name":"hasMongoConnection","url":"classes/jobdbrepository.html#hasmongoconnection","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"JobDbRepository"},{"id":78,"kind":2048,"name":"hasDatabaseConfig","url":"classes/jobdbrepository.html#hasdatabaseconfig","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"JobDbRepository"},{"id":79,"kind":2048,"name":"getJobs","url":"classes/jobdbrepository.html#getjobs","classes":"tsd-kind-method tsd-parent-kind-class","parent":"JobDbRepository"},{"id":80,"kind":2048,"name":"removeJobs","url":"classes/jobdbrepository.html#removejobs","classes":"tsd-kind-method tsd-parent-kind-class","parent":"JobDbRepository"},{"id":81,"kind":2048,"name":"getQueueSize","url":"classes/jobdbrepository.html#getqueuesize","classes":"tsd-kind-method tsd-parent-kind-class","parent":"JobDbRepository"},{"id":82,"kind":2048,"name":"unlockJob","url":"classes/jobdbrepository.html#unlockjob","classes":"tsd-kind-method tsd-parent-kind-class","parent":"JobDbRepository"},{"id":83,"kind":2048,"name":"unlockJobs","url":"classes/jobdbrepository.html#unlockjobs","classes":"tsd-kind-method tsd-parent-kind-class","parent":"JobDbRepository"},{"id":84,"kind":2048,"name":"lockJob","url":"classes/jobdbrepository.html#lockjob","classes":"tsd-kind-method tsd-parent-kind-class","parent":"JobDbRepository"},{"id":85,"kind":2048,"name":"getNextJobToRun","url":"classes/jobdbrepository.html#getnextjobtorun","classes":"tsd-kind-method tsd-parent-kind-class","parent":"JobDbRepository"},{"id":86,"kind":2048,"name":"connect","url":"classes/jobdbrepository.html#connect","classes":"tsd-kind-method tsd-parent-kind-class","parent":"JobDbRepository"},{"id":87,"kind":2048,"name":"database","url":"classes/jobdbrepository.html#database","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"JobDbRepository"},{"id":88,"kind":2048,"name":"processDbResult","url":"classes/jobdbrepository.html#processdbresult","classes":"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter tsd-is-private","parent":"JobDbRepository"},{"id":89,"kind":2048,"name":"saveJob","url":"classes/jobdbrepository.html#savejob","classes":"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter","parent":"JobDbRepository"},{"id":90,"kind":32,"name":"log","url":"globals.html#log","classes":"tsd-kind-variable"},{"id":91,"kind":4194304,"name":"JobPriority","url":"globals.html#jobpriority","classes":"tsd-kind-type-alias"},{"id":92,"kind":2097152,"name":"priorityMap","url":"globals.html#prioritymap","classes":"tsd-kind-object-literal"},{"id":93,"kind":32,"name":"lowest","url":"globals.html#prioritymap.lowest","classes":"tsd-kind-variable tsd-parent-kind-object-literal","parent":"priorityMap"},{"id":94,"kind":32,"name":"low","url":"globals.html#prioritymap.low","classes":"tsd-kind-variable tsd-parent-kind-object-literal","parent":"priorityMap"},{"id":95,"kind":32,"name":"normal","url":"globals.html#prioritymap.normal","classes":"tsd-kind-variable tsd-parent-kind-object-literal","parent":"priorityMap"},{"id":96,"kind":32,"name":"high","url":"globals.html#prioritymap.high","classes":"tsd-kind-variable tsd-parent-kind-object-literal","parent":"priorityMap"},{"id":97,"kind":32,"name":"highest","url":"globals.html#prioritymap.highest","classes":"tsd-kind-variable tsd-parent-kind-object-literal","parent":"priorityMap"},{"id":98,"kind":64,"name":"parsePriority","url":"globals.html#parsepriority","classes":"tsd-kind-function"},{"id":99,"kind":128,"name":"JobProcessingQueue","url":"classes/jobprocessingqueue.html","classes":"tsd-kind-class"},{"id":100,"kind":1024,"name":"_queue","url":"classes/jobprocessingqueue.html#_queue","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"JobProcessingQueue"},{"id":101,"kind":512,"name":"constructor","url":"classes/jobprocessingqueue.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"JobProcessingQueue"},{"id":102,"kind":1024,"name":"agenda","url":"classes/jobprocessingqueue.html#agenda","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"JobProcessingQueue"},{"id":103,"kind":262144,"name":"length","url":"classes/jobprocessingqueue.html#length","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"JobProcessingQueue"},{"id":104,"kind":2048,"name":"getQueue","url":"classes/jobprocessingqueue.html#getqueue","classes":"tsd-kind-method tsd-parent-kind-class","parent":"JobProcessingQueue"},{"id":105,"kind":2048,"name":"pop","url":"classes/jobprocessingqueue.html#pop","classes":"tsd-kind-method tsd-parent-kind-class","parent":"JobProcessingQueue"},{"id":106,"kind":2048,"name":"remove","url":"classes/jobprocessingqueue.html#remove","classes":"tsd-kind-method tsd-parent-kind-class","parent":"JobProcessingQueue"},{"id":107,"kind":2048,"name":"insert","url":"classes/jobprocessingqueue.html#insert","classes":"tsd-kind-method tsd-parent-kind-class","parent":"JobProcessingQueue"},{"id":108,"kind":2048,"name":"returnNextConcurrencyFreeJob","url":"classes/jobprocessingqueue.html#returnnextconcurrencyfreejob","classes":"tsd-kind-method tsd-parent-kind-class","parent":"JobProcessingQueue"},{"id":109,"kind":128,"name":"JobProcessor","url":"classes/jobprocessor.html","classes":"tsd-kind-class"},{"id":110,"kind":1024,"name":"jobStatus","url":"classes/jobprocessor.html#jobstatus","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"JobProcessor"},{"id":111,"kind":65536,"name":"__type","url":"classes/jobprocessor.html#jobstatus.__type","classes":"tsd-kind-type-literal tsd-parent-kind-property","parent":"JobProcessor.jobStatus"},{"id":112,"kind":1024,"name":"localQueueProcessing","url":"classes/jobprocessor.html#localqueueprocessing","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"JobProcessor"},{"id":113,"kind":2048,"name":"getStatus","url":"classes/jobprocessor.html#getstatus","classes":"tsd-kind-method tsd-parent-kind-class","parent":"JobProcessor"},{"id":114,"kind":1024,"name":"nextScanAt","url":"classes/jobprocessor.html#nextscanat","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"JobProcessor"},{"id":115,"kind":1024,"name":"jobQueue","url":"classes/jobprocessor.html#jobqueue","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"JobProcessor"},{"id":116,"kind":1024,"name":"runningJobs","url":"classes/jobprocessor.html#runningjobs","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"JobProcessor"},{"id":117,"kind":1024,"name":"lockedJobs","url":"classes/jobprocessor.html#lockedjobs","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"JobProcessor"},{"id":118,"kind":1024,"name":"jobsToLock","url":"classes/jobprocessor.html#jobstolock","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"JobProcessor"},{"id":119,"kind":1024,"name":"isLockingOnTheFly","url":"classes/jobprocessor.html#islockingonthefly","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"JobProcessor"},{"id":120,"kind":1024,"name":"isRunning","url":"classes/jobprocessor.html#isrunning","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"JobProcessor"},{"id":121,"kind":1024,"name":"processInterval","url":"classes/jobprocessor.html#processinterval","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"JobProcessor"},{"id":122,"kind":512,"name":"constructor","url":"classes/jobprocessor.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"JobProcessor"},{"id":123,"kind":1024,"name":"agenda","url":"classes/jobprocessor.html#agenda","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"JobProcessor"},{"id":124,"kind":1024,"name":"maxConcurrency","url":"classes/jobprocessor.html#maxconcurrency","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"JobProcessor"},{"id":125,"kind":1024,"name":"totalLockLimit","url":"classes/jobprocessor.html#totallocklimit","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"JobProcessor"},{"id":126,"kind":1024,"name":"processEvery","url":"classes/jobprocessor.html#processevery","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"JobProcessor"},{"id":127,"kind":2048,"name":"stop","url":"classes/jobprocessor.html#stop","classes":"tsd-kind-method tsd-parent-kind-class","parent":"JobProcessor"},{"id":128,"kind":2048,"name":"process","url":"classes/jobprocessor.html#process","classes":"tsd-kind-method tsd-parent-kind-class","parent":"JobProcessor"},{"id":129,"kind":2048,"name":"shouldLock","url":"classes/jobprocessor.html#shouldlock","classes":"tsd-kind-method tsd-parent-kind-class","parent":"JobProcessor"},{"id":130,"kind":2048,"name":"enqueueJob","url":"classes/jobprocessor.html#enqueuejob","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"JobProcessor"},{"id":131,"kind":2048,"name":"lockOnTheFly","url":"classes/jobprocessor.html#lockonthefly","classes":"tsd-kind-method tsd-parent-kind-class","parent":"JobProcessor"},{"id":132,"kind":2048,"name":"findAndLockNextJob","url":"classes/jobprocessor.html#findandlocknextjob","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"JobProcessor"},{"id":133,"kind":2048,"name":"jobQueueFilling","url":"classes/jobprocessor.html#jobqueuefilling","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"JobProcessor"},{"id":134,"kind":2048,"name":"jobProcessing","url":"classes/jobprocessor.html#jobprocessing","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"JobProcessor"},{"id":135,"kind":2048,"name":"runOrRetry","url":"classes/jobprocessor.html#runorretry","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"JobProcessor"},{"id":136,"kind":2048,"name":"updateStatus","url":"classes/jobprocessor.html#updatestatus","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"JobProcessor"},{"id":137,"kind":32,"name":"agendaVersion","url":"globals.html#agendaversion","classes":"tsd-kind-variable"},{"id":138,"kind":64,"name":"calculateProcessEvery","url":"globals.html#calculateprocessevery","classes":"tsd-kind-function"},{"id":139,"kind":128,"name":"Agenda","url":"classes/agenda.html","classes":"tsd-kind-class"},{"id":140,"kind":1024,"name":"attrs","url":"classes/agenda.html#attrs","classes":"tsd-kind-property tsd-parent-kind-class","parent":"Agenda"},{"id":141,"kind":1024,"name":"db","url":"classes/agenda.html#db","classes":"tsd-kind-property tsd-parent-kind-class","parent":"Agenda"},{"id":142,"kind":2048,"name":"on","url":"classes/agenda.html#on","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite","parent":"Agenda"},{"id":143,"kind":1024,"name":"definitions","url":"classes/agenda.html#definitions","classes":"tsd-kind-property tsd-parent-kind-class","parent":"Agenda"},{"id":144,"kind":65536,"name":"__type","url":"classes/agenda.html#definitions.__type","classes":"tsd-kind-type-literal tsd-parent-kind-property","parent":"Agenda.definitions"},{"id":145,"kind":1024,"name":"jobProcessor","url":"classes/agenda.html#jobprocessor","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"Agenda"},{"id":146,"kind":1024,"name":"ready","url":"classes/agenda.html#ready","classes":"tsd-kind-property tsd-parent-kind-class","parent":"Agenda"},{"id":147,"kind":2048,"name":"isActiveJobProcessor","url":"classes/agenda.html#isactivejobprocessor","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Agenda"},{"id":148,"kind":2048,"name":"getRunningStats","url":"classes/agenda.html#getrunningstats","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Agenda"},{"id":149,"kind":512,"name":"constructor","url":"classes/agenda.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-overwrite","parent":"Agenda"},{"id":150,"kind":2048,"name":"database","url":"classes/agenda.html#database","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Agenda"},{"id":151,"kind":2048,"name":"mongo","url":"classes/agenda.html#mongo","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Agenda"},{"id":152,"kind":2048,"name":"sort","url":"classes/agenda.html#sort","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Agenda"},{"id":153,"kind":2048,"name":"hasDatabaseConfig","url":"classes/agenda.html#hasdatabaseconfig","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"Agenda"},{"id":154,"kind":2048,"name":"cancel","url":"classes/agenda.html#cancel","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Agenda"},{"id":155,"kind":2048,"name":"name","url":"classes/agenda.html#name","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Agenda"},{"id":156,"kind":2048,"name":"processEvery","url":"classes/agenda.html#processevery","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Agenda"},{"id":157,"kind":2048,"name":"maxConcurrency","url":"classes/agenda.html#maxconcurrency","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Agenda"},{"id":158,"kind":2048,"name":"defaultConcurrency","url":"classes/agenda.html#defaultconcurrency","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Agenda"},{"id":159,"kind":2048,"name":"lockLimit","url":"classes/agenda.html#locklimit","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Agenda"},{"id":160,"kind":2048,"name":"defaultLockLimit","url":"classes/agenda.html#defaultlocklimit","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Agenda"},{"id":161,"kind":2048,"name":"defaultLockLifetime","url":"classes/agenda.html#defaultlocklifetime","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Agenda"},{"id":162,"kind":2048,"name":"jobs","url":"classes/agenda.html#jobs","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Agenda"},{"id":163,"kind":2048,"name":"purge","url":"classes/agenda.html#purge","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Agenda"},{"id":164,"kind":2048,"name":"define","url":"classes/agenda.html#define","classes":"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter","parent":"Agenda"},{"id":165,"kind":2048,"name":"createJobs","url":"classes/agenda.html#createjobs","classes":"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter tsd-is-private","parent":"Agenda"},{"id":166,"kind":2048,"name":"create","url":"classes/agenda.html#create","classes":"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter","parent":"Agenda"},{"id":167,"kind":2048,"name":"every","url":"classes/agenda.html#every","classes":"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter","parent":"Agenda"},{"id":168,"kind":2048,"name":"schedule","url":"classes/agenda.html#schedule","classes":"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter","parent":"Agenda"},{"id":169,"kind":2048,"name":"now","url":"classes/agenda.html#now","classes":"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter","parent":"Agenda"},{"id":170,"kind":2048,"name":"start","url":"classes/agenda.html#start","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Agenda"},{"id":171,"kind":2048,"name":"stop","url":"classes/agenda.html#stop","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Agenda"},{"id":172,"kind":2048,"name":"addListener","url":"classes/agenda.html#addlistener","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-inherited","parent":"Agenda"},{"id":173,"kind":2048,"name":"once","url":"classes/agenda.html#once","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-inherited","parent":"Agenda"},{"id":174,"kind":2048,"name":"removeListener","url":"classes/agenda.html#removelistener","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-inherited","parent":"Agenda"},{"id":175,"kind":2048,"name":"off","url":"classes/agenda.html#off","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-inherited","parent":"Agenda"},{"id":176,"kind":2048,"name":"removeAllListeners","url":"classes/agenda.html#removealllisteners","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-inherited","parent":"Agenda"},{"id":177,"kind":2048,"name":"setMaxListeners","url":"classes/agenda.html#setmaxlisteners","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-inherited","parent":"Agenda"},{"id":178,"kind":2048,"name":"getMaxListeners","url":"classes/agenda.html#getmaxlisteners","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-inherited","parent":"Agenda"},{"id":179,"kind":2048,"name":"listeners","url":"classes/agenda.html#listeners","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-inherited","parent":"Agenda"},{"id":180,"kind":2048,"name":"rawListeners","url":"classes/agenda.html#rawlisteners","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-inherited","parent":"Agenda"},{"id":181,"kind":2048,"name":"emit","url":"classes/agenda.html#emit","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-inherited","parent":"Agenda"},{"id":182,"kind":2048,"name":"listenerCount","url":"classes/agenda.html#listenercount","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-inherited","parent":"Agenda"},{"id":183,"kind":2048,"name":"prependListener","url":"classes/agenda.html#prependlistener","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-inherited","parent":"Agenda"},{"id":184,"kind":2048,"name":"prependOnceListener","url":"classes/agenda.html#prependoncelistener","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-inherited","parent":"Agenda"},{"id":185,"kind":2048,"name":"eventNames","url":"classes/agenda.html#eventnames","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-inherited","parent":"Agenda"},{"id":186,"kind":2048,"name":"listenerCount","url":"classes/agenda.html#listenercount-1","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-inherited tsd-is-static","parent":"Agenda"},{"id":187,"kind":1024,"name":"defaultMaxListeners","url":"classes/agenda.html#defaultmaxlisteners","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited tsd-is-static","parent":"Agenda"},{"id":188,"kind":1024,"name":"errorMonitor","url":"classes/agenda.html#errormonitor","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited tsd-is-static","parent":"Agenda"},{"id":189,"kind":64,"name":"isValidDate","url":"globals.html#isvaliddate","classes":"tsd-kind-function"},{"id":190,"kind":64,"name":"dateForTimezone","url":"globals.html#datefortimezone","classes":"tsd-kind-function"},{"id":191,"kind":64,"name":"isValidHumanInterval","url":"globals.html#isvalidhumaninterval","classes":"tsd-kind-function"},{"id":192,"kind":64,"name":"computeFromInterval","url":"globals.html#computefrominterval","classes":"tsd-kind-function"},{"id":193,"kind":64,"name":"computeFromRepeatAt","url":"globals.html#computefromrepeatat","classes":"tsd-kind-function"},{"id":194,"kind":128,"name":"Job","url":"classes/job.html","classes":"tsd-kind-class tsd-has-type-parameter"},{"id":195,"kind":1024,"name":"attrs","url":"classes/job.html#attrs","classes":"tsd-kind-property tsd-parent-kind-class","parent":"Job"},{"id":196,"kind":1024,"name":"canceled","url":"classes/job.html#canceled","classes":"tsd-kind-property tsd-parent-kind-class","parent":"Job"},{"id":197,"kind":512,"name":"constructor","url":"classes/job.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"Job"},{"id":198,"kind":1024,"name":"agenda","url":"classes/job.html#agenda","classes":"tsd-kind-property tsd-parent-kind-class","parent":"Job"},{"id":199,"kind":1024,"name":"byJobProcessor","url":"classes/job.html#byjobprocessor","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"Job"},{"id":200,"kind":2048,"name":"toJson","url":"classes/job.html#tojson","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Job"},{"id":201,"kind":2048,"name":"repeatEvery","url":"classes/job.html#repeatevery","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Job"},{"id":202,"kind":2048,"name":"repeatAt","url":"classes/job.html#repeatat","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Job"},{"id":203,"kind":2048,"name":"disable","url":"classes/job.html#disable","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Job"},{"id":204,"kind":2048,"name":"enable","url":"classes/job.html#enable","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Job"},{"id":205,"kind":2048,"name":"unique","url":"classes/job.html#unique","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Job"},{"id":206,"kind":2048,"name":"schedule","url":"classes/job.html#schedule","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Job"},{"id":207,"kind":2048,"name":"priority","url":"classes/job.html#priority","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Job"},{"id":208,"kind":2048,"name":"fail","url":"classes/job.html#fail","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Job"},{"id":209,"kind":2048,"name":"fetchStatus","url":"classes/job.html#fetchstatus","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"Job"},{"id":210,"kind":2048,"name":"isRunning","url":"classes/job.html#isrunning","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Job"},{"id":211,"kind":2048,"name":"save","url":"classes/job.html#save","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Job"},{"id":212,"kind":2048,"name":"remove","url":"classes/job.html#remove","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Job"},{"id":213,"kind":2048,"name":"isDead","url":"classes/job.html#isdead","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Job"},{"id":214,"kind":2048,"name":"touch","url":"classes/job.html#touch","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Job"},{"id":215,"kind":2048,"name":"computeNextRunAt","url":"classes/job.html#computenextrunat","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"Job"},{"id":216,"kind":2048,"name":"run","url":"classes/job.html#run","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Job"},{"id":217,"kind":2048,"name":"isPromise","url":"classes/job.html#ispromise","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"Job"},{"id":218,"kind":4194304,"name":"JobWithId","url":"globals.html#jobwithid","classes":"tsd-kind-type-alias"}],"index":{"version":"2.3.9","fields":["name","parent"],"fieldVectors":[["name/0",[0,35.218]],["parent/0",[]],["name/1",[1,41.409]],["parent/1",[0,3.315]],["name/2",[2,49.882]],["parent/2",[0,3.315]],["name/3",[3,41.409]],["parent/3",[0,3.315]],["name/4",[4,49.882]],["parent/4",[0,3.315]],["name/5",[5,49.882]],["parent/5",[0,3.315]],["name/6",[6,44.773]],["parent/6",[]],["name/7",[7,35.218]],["parent/7",[6,4.214]],["name/8",[8,32.536]],["parent/8",[]],["name/9",[9,41.409]],["parent/9",[8,3.062]],["name/10",[10,44.773]],["parent/10",[8,3.062]],["name/11",[11,38.896]],["parent/11",[8,3.062]],["name/12",[12,38.896]],["parent/12",[8,3.062]],["name/13",[13,44.773]],["parent/13",[8,3.062]],["name/14",[1,41.409]],["parent/14",[8,3.062]],["name/15",[14,44.773]],["parent/15",[8,3.062]],["name/16",[15,23.256]],["parent/16",[]],["name/17",[16,49.882]],["parent/17",[15,2.189]],["name/18",[9,41.409]],["parent/18",[15,2.189]],["name/19",[3,41.409]],["parent/19",[15,2.189]],["name/20",[17,49.882]],["parent/20",[15,2.189]],["name/21",[18,49.882]],["parent/21",[15,2.189]],["name/22",[19,49.882]],["parent/22",[15,2.189]],["name/23",[20,49.882]],["parent/23",[15,2.189]],["name/24",[21,49.882]],["parent/24",[15,2.189]],["name/25",[22,49.882]],["parent/25",[15,2.189]],["name/26",[23,49.882]],["parent/26",[15,2.189]],["name/27",[24,49.882]],["parent/27",[15,2.189]],["name/28",[25,49.882]],["parent/28",[15,2.189]],["name/29",[26,49.882]],["parent/29",[15,2.189]],["name/30",[27,49.882]],["parent/30",[15,2.189]],["name/31",[28,44.773]],["parent/31",[15,2.189]],["name/32",[29,49.882]],["parent/32",[15,2.189]],["name/33",[30,49.882]],["parent/33",[15,2.189]],["name/34",[31,44.773]],["parent/34",[15,2.189]],["name/35",[32,49.882]],["parent/35",[15,2.189]],["name/36",[33,49.882]],["parent/36",[15,2.189]],["name/37",[34,49.882]],["parent/37",[]],["name/38",[35,49.882]],["parent/38",[]],["name/39",[36,44.773]],["parent/39",[]],["name/40",[37,41.409]],["parent/40",[36,4.214]],["name/41",[7,35.218]],["parent/41",[38,4.695]],["name/42",[39,44.773]],["parent/42",[40,3.898]],["name/43",[41,49.882]],["parent/43",[40,3.898]],["name/44",[42,49.882]],["parent/44",[40,3.898]],["name/45",[43,41.409]],["parent/45",[]],["name/46",[37,41.409]],["parent/46",[43,3.898]],["name/47",[44,44.773]],["parent/47",[43,3.898]],["name/48",[45,41.409]],["parent/48",[]],["name/49",[46,49.882]],["parent/49",[45,3.898]],["name/50",[47,44.773]],["parent/50",[45,3.898]],["name/51",[48,49.882]],["parent/51",[]],["name/52",[49,28.679]],["parent/52",[]],["name/53",[50,49.882]],["parent/53",[49,2.699]],["name/54",[51,49.882]],["parent/54",[49,2.699]],["name/55",[52,49.882]],["parent/55",[49,2.699]],["name/56",[53,49.882]],["parent/56",[49,2.699]],["name/57",[7,35.218]],["parent/57",[54,4.695]],["name/58",[55,44.773]],["parent/58",[56,3.898]],["name/59",[12,38.896]],["parent/59",[56,3.898]],["name/60",[11,38.896]],["parent/60",[56,3.898]],["name/61",[57,49.882]],["parent/61",[49,2.699]],["name/62",[7,35.218]],["parent/62",[58,4.695]],["name/63",[59,44.773]],["parent/63",[60,4.695]],["name/64",[61,44.773]],["parent/64",[49,2.699]],["name/65",[62,49.882]],["parent/65",[49,2.699]],["name/66",[63,44.773]],["parent/66",[49,2.699]],["name/67",[64,44.773]],["parent/67",[49,2.699]],["name/68",[65,44.773]],["parent/68",[49,2.699]],["name/69",[66,44.773]],["parent/69",[49,2.699]],["name/70",[67,49.882]],["parent/70",[]],["name/71",[68,24.232]],["parent/71",[]],["name/72",[39,44.773]],["parent/72",[68,2.281]],["name/73",[69,36.889]],["parent/73",[68,2.281]],["name/74",[70,14.139]],["parent/74",[68,2.281]],["name/75",[71,49.882]],["parent/75",[68,2.281]],["name/76",[72,49.882]],["parent/76",[68,2.281]],["name/77",[73,49.882]],["parent/77",[68,2.281]],["name/78",[74,44.773]],["parent/78",[68,2.281]],["name/79",[75,49.882]],["parent/79",[68,2.281]],["name/80",[76,49.882]],["parent/80",[68,2.281]],["name/81",[77,49.882]],["parent/81",[68,2.281]],["name/82",[78,49.882]],["parent/82",[68,2.281]],["name/83",[79,49.882]],["parent/83",[68,2.281]],["name/84",[80,49.882]],["parent/84",[68,2.281]],["name/85",[81,49.882]],["parent/85",[68,2.281]],["name/86",[82,49.882]],["parent/86",[68,2.281]],["name/87",[83,44.773]],["parent/87",[68,2.281]],["name/88",[84,49.882]],["parent/88",[68,2.281]],["name/89",[85,49.882]],["parent/89",[68,2.281]],["name/90",[86,49.882]],["parent/90",[]],["name/91",[87,49.882]],["parent/91",[]],["name/92",[88,35.218]],["parent/92",[]],["name/93",[89,49.882]],["parent/93",[88,3.315]],["name/94",[90,49.882]],["parent/94",[88,3.315]],["name/95",[91,49.882]],["parent/95",[88,3.315]],["name/96",[92,49.882]],["parent/96",[88,3.315]],["name/97",[93,49.882]],["parent/97",[88,3.315]],["name/98",[94,49.882]],["parent/98",[]],["name/99",[95,30.423]],["parent/99",[]],["name/100",[96,49.882]],["parent/100",[95,2.863]],["name/101",[69,36.889]],["parent/101",[95,2.863]],["name/102",[70,14.139]],["parent/102",[95,2.863]],["name/103",[97,49.882]],["parent/103",[95,2.863]],["name/104",[98,49.882]],["parent/104",[95,2.863]],["name/105",[99,49.882]],["parent/105",[95,2.863]],["name/106",[100,44.773]],["parent/106",[95,2.863]],["name/107",[101,49.882]],["parent/107",[95,2.863]],["name/108",[102,49.882]],["parent/108",[95,2.863]],["name/109",[103,20.437]],["parent/109",[]],["name/110",[61,44.773]],["parent/110",[103,1.924]],["name/111",[7,35.218]],["parent/111",[104,4.695]],["name/112",[59,44.773]],["parent/112",[103,1.924]],["name/113",[105,49.882]],["parent/113",[103,1.924]],["name/114",[106,49.882]],["parent/114",[103,1.924]],["name/115",[107,49.882]],["parent/115",[103,1.924]],["name/116",[63,44.773]],["parent/116",[103,1.924]],["name/117",[64,44.773]],["parent/117",[103,1.924]],["name/118",[65,44.773]],["parent/118",[103,1.924]],["name/119",[66,44.773]],["parent/119",[103,1.924]],["name/120",[108,44.773]],["parent/120",[103,1.924]],["name/121",[109,49.882]],["parent/121",[103,1.924]],["name/122",[69,36.889]],["parent/122",[103,1.924]],["name/123",[70,14.139]],["parent/123",[103,1.924]],["name/124",[12,38.896]],["parent/124",[103,1.924]],["name/125",[55,44.773]],["parent/125",[103,1.924]],["name/126",[11,38.896]],["parent/126",[103,1.924]],["name/127",[110,44.773]],["parent/127",[103,1.924]],["name/128",[111,49.882]],["parent/128",[103,1.924]],["name/129",[112,49.882]],["parent/129",[103,1.924]],["name/130",[113,49.882]],["parent/130",[103,1.924]],["name/131",[114,49.882]],["parent/131",[103,1.924]],["name/132",[115,49.882]],["parent/132",[103,1.924]],["name/133",[116,49.882]],["parent/133",[103,1.924]],["name/134",[117,49.882]],["parent/134",[103,1.924]],["name/135",[118,49.882]],["parent/135",[103,1.924]],["name/136",[119,49.882]],["parent/136",[103,1.924]],["name/137",[120,49.882]],["parent/137",[]],["name/138",[121,49.882]],["parent/138",[]],["name/139",[70,14.139]],["parent/139",[]],["name/140",[122,44.773]],["parent/140",[70,1.331]],["name/141",[37,41.409]],["parent/141",[70,1.331]],["name/142",[123,49.882]],["parent/142",[70,1.331]],["name/143",[124,49.882]],["parent/143",[70,1.331]],["name/144",[7,35.218]],["parent/144",[125,4.695]],["name/145",[103,20.437]],["parent/145",[70,1.331]],["name/146",[126,49.882]],["parent/146",[70,1.331]],["name/147",[127,49.882]],["parent/147",[70,1.331]],["name/148",[128,49.882]],["parent/148",[70,1.331]],["name/149",[69,36.889]],["parent/149",[70,1.331]],["name/150",[83,44.773]],["parent/150",[70,1.331]],["name/151",[44,44.773]],["parent/151",[70,1.331]],["name/152",[47,44.773]],["parent/152",[70,1.331]],["name/153",[74,44.773]],["parent/153",[70,1.331]],["name/154",[129,49.882]],["parent/154",[70,1.331]],["name/155",[9,41.409]],["parent/155",[70,1.331]],["name/156",[11,38.896]],["parent/156",[70,1.331]],["name/157",[12,38.896]],["parent/157",[70,1.331]],["name/158",[10,44.773]],["parent/158",[70,1.331]],["name/159",[1,41.409]],["parent/159",[70,1.331]],["name/160",[13,44.773]],["parent/160",[70,1.331]],["name/161",[14,44.773]],["parent/161",[70,1.331]],["name/162",[130,49.882]],["parent/162",[70,1.331]],["name/163",[131,49.882]],["parent/163",[70,1.331]],["name/164",[132,49.882]],["parent/164",[70,1.331]],["name/165",[133,49.882]],["parent/165",[70,1.331]],["name/166",[134,49.882]],["parent/166",[70,1.331]],["name/167",[135,49.882]],["parent/167",[70,1.331]],["name/168",[136,44.773]],["parent/168",[70,1.331]],["name/169",[137,49.882]],["parent/169",[70,1.331]],["name/170",[138,49.882]],["parent/170",[70,1.331]],["name/171",[110,44.773]],["parent/171",[70,1.331]],["name/172",[139,49.882]],["parent/172",[70,1.331]],["name/173",[140,49.882]],["parent/173",[70,1.331]],["name/174",[141,49.882]],["parent/174",[70,1.331]],["name/175",[142,49.882]],["parent/175",[70,1.331]],["name/176",[143,49.882]],["parent/176",[70,1.331]],["name/177",[144,49.882]],["parent/177",[70,1.331]],["name/178",[145,49.882]],["parent/178",[70,1.331]],["name/179",[146,49.882]],["parent/179",[70,1.331]],["name/180",[147,49.882]],["parent/180",[70,1.331]],["name/181",[148,49.882]],["parent/181",[70,1.331]],["name/182",[149,44.773]],["parent/182",[70,1.331]],["name/183",[150,49.882]],["parent/183",[70,1.331]],["name/184",[151,49.882]],["parent/184",[70,1.331]],["name/185",[152,49.882]],["parent/185",[70,1.331]],["name/186",[149,44.773]],["parent/186",[70,1.331]],["name/187",[153,49.882]],["parent/187",[70,1.331]],["name/188",[154,49.882]],["parent/188",[70,1.331]],["name/189",[155,49.882]],["parent/189",[]],["name/190",[156,49.882]],["parent/190",[]],["name/191",[157,49.882]],["parent/191",[]],["name/192",[158,49.882]],["parent/192",[]],["name/193",[159,49.882]],["parent/193",[]],["name/194",[160,21.95]],["parent/194",[]],["name/195",[122,44.773]],["parent/195",[160,2.066]],["name/196",[161,49.882]],["parent/196",[160,2.066]],["name/197",[69,36.889]],["parent/197",[160,2.066]],["name/198",[70,14.139]],["parent/198",[160,2.066]],["name/199",[162,49.882]],["parent/199",[160,2.066]],["name/200",[163,49.882]],["parent/200",[160,2.066]],["name/201",[164,49.882]],["parent/201",[160,2.066]],["name/202",[28,44.773]],["parent/202",[160,2.066]],["name/203",[165,49.882]],["parent/203",[160,2.066]],["name/204",[166,49.882]],["parent/204",[160,2.066]],["name/205",[31,44.773]],["parent/205",[160,2.066]],["name/206",[136,44.773]],["parent/206",[160,2.066]],["name/207",[3,41.409]],["parent/207",[160,2.066]],["name/208",[167,49.882]],["parent/208",[160,2.066]],["name/209",[168,49.882]],["parent/209",[160,2.066]],["name/210",[108,44.773]],["parent/210",[160,2.066]],["name/211",[169,49.882]],["parent/211",[160,2.066]],["name/212",[100,44.773]],["parent/212",[160,2.066]],["name/213",[170,49.882]],["parent/213",[160,2.066]],["name/214",[171,49.882]],["parent/214",[160,2.066]],["name/215",[172,49.882]],["parent/215",[160,2.066]],["name/216",[173,49.882]],["parent/216",[160,2.066]],["name/217",[174,49.882]],["parent/217",[160,2.066]],["name/218",[175,49.882]],["parent/218",[]]],"invertedIndex":[["__type",{"_index":7,"name":{"7":{},"41":{},"57":{},"62":{},"111":{},"144":{}},"parent":{}}],["_id",{"_index":16,"name":{"17":{}},"parent":{}}],["_queue",{"_index":96,"name":{"100":{}},"parent":{}}],["addlistener",{"_index":139,"name":{"172":{}},"parent":{}}],["address",{"_index":41,"name":{"43":{}},"parent":{}}],["agenda",{"_index":70,"name":{"74":{},"102":{},"123":{},"139":{},"198":{}},"parent":{"140":{},"141":{},"142":{},"143":{},"145":{},"146":{},"147":{},"148":{},"149":{},"150":{},"151":{},"152":{},"153":{},"154":{},"155":{},"156":{},"157":{},"158":{},"159":{},"160":{},"161":{},"162":{},"163":{},"164":{},"165":{},"166":{},"167":{},"168":{},"169":{},"170":{},"171":{},"172":{},"173":{},"174":{},"175":{},"176":{},"177":{},"178":{},"179":{},"180":{},"181":{},"182":{},"183":{},"184":{},"185":{},"186":{},"187":{},"188":{}}}],["agenda.definitions",{"_index":125,"name":{},"parent":{"144":{}}}],["agendaversion",{"_index":120,"name":{"137":{}},"parent":{}}],["attrs",{"_index":122,"name":{"140":{},"195":{}},"parent":{}}],["byjobprocessor",{"_index":162,"name":{"199":{}},"parent":{}}],["calculateprocessevery",{"_index":121,"name":{"138":{}},"parent":{}}],["cancel",{"_index":129,"name":{"154":{}},"parent":{}}],["canceled",{"_index":161,"name":{"196":{}},"parent":{}}],["collection",{"_index":39,"name":{"42":{},"72":{}},"parent":{}}],["computefrominterval",{"_index":158,"name":{"192":{}},"parent":{}}],["computefromrepeatat",{"_index":159,"name":{"193":{}},"parent":{}}],["computenextrunat",{"_index":172,"name":{"215":{}},"parent":{}}],["concurrency",{"_index":4,"name":{"4":{}},"parent":{}}],["config",{"_index":53,"name":{"56":{}},"parent":{}}],["connect",{"_index":82,"name":{"86":{}},"parent":{}}],["connectoptions",{"_index":71,"name":{"75":{}},"parent":{}}],["constructor",{"_index":69,"name":{"73":{},"101":{},"122":{},"149":{},"197":{}},"parent":{}}],["create",{"_index":134,"name":{"166":{}},"parent":{}}],["createconnection",{"_index":72,"name":{"76":{}},"parent":{}}],["createjobs",{"_index":133,"name":{"165":{}},"parent":{}}],["data",{"_index":27,"name":{"30":{}},"parent":{}}],["database",{"_index":83,"name":{"87":{},"150":{}},"parent":{}}],["datefields",{"_index":35,"name":{"38":{}},"parent":{}}],["datefortimezone",{"_index":156,"name":{"190":{}},"parent":{}}],["db",{"_index":37,"name":{"40":{},"46":{},"141":{}},"parent":{}}],["defaultconcurrency",{"_index":10,"name":{"10":{},"158":{}},"parent":{}}],["defaultlocklifetime",{"_index":14,"name":{"15":{},"161":{}},"parent":{}}],["defaultlocklimit",{"_index":13,"name":{"13":{},"160":{}},"parent":{}}],["defaultmaxlisteners",{"_index":153,"name":{"187":{}},"parent":{}}],["define",{"_index":132,"name":{"164":{}},"parent":{}}],["definitionprocessor",{"_index":6,"name":{"6":{}},"parent":{"7":{}}}],["definitions",{"_index":124,"name":{"143":{}},"parent":{}}],["disable",{"_index":165,"name":{"203":{}},"parent":{}}],["disabled",{"_index":29,"name":{"32":{}},"parent":{}}],["emit",{"_index":148,"name":{"181":{}},"parent":{}}],["enable",{"_index":166,"name":{"204":{}},"parent":{}}],["enqueuejob",{"_index":113,"name":{"130":{}},"parent":{}}],["ensureindex",{"_index":46,"name":{"49":{}},"parent":{}}],["errormonitor",{"_index":154,"name":{"188":{}},"parent":{}}],["eventnames",{"_index":152,"name":{"185":{}},"parent":{}}],["every",{"_index":135,"name":{"167":{}},"parent":{}}],["fail",{"_index":167,"name":{"208":{}},"parent":{}}],["failcount",{"_index":22,"name":{"25":{}},"parent":{}}],["failedat",{"_index":21,"name":{"24":{}},"parent":{}}],["failreason",{"_index":23,"name":{"26":{}},"parent":{}}],["fetchstatus",{"_index":168,"name":{"209":{}},"parent":{}}],["findandlocknextjob",{"_index":115,"name":{"132":{}},"parent":{}}],["fn",{"_index":5,"name":{"5":{}},"parent":{}}],["getjobs",{"_index":75,"name":{"79":{}},"parent":{}}],["getmaxlisteners",{"_index":145,"name":{"178":{}},"parent":{}}],["getnextjobtorun",{"_index":81,"name":{"85":{}},"parent":{}}],["getqueue",{"_index":98,"name":{"104":{}},"parent":{}}],["getqueuesize",{"_index":77,"name":{"81":{}},"parent":{}}],["getrunningstats",{"_index":128,"name":{"148":{}},"parent":{}}],["getstatus",{"_index":105,"name":{"113":{}},"parent":{}}],["hasdatabaseconfig",{"_index":74,"name":{"78":{},"153":{}},"parent":{}}],["hasmongoconnection",{"_index":73,"name":{"77":{}},"parent":{}}],["hasmongoprotocol",{"_index":67,"name":{"70":{}},"parent":{}}],["high",{"_index":92,"name":{"96":{}},"parent":{}}],["highest",{"_index":93,"name":{"97":{}},"parent":{}}],["iagendaconfig",{"_index":8,"name":{"8":{}},"parent":{"9":{},"10":{},"11":{},"12":{},"13":{},"14":{},"15":{}}}],["iagendajobstatus",{"_index":48,"name":{"51":{}},"parent":{}}],["iagendastatus",{"_index":49,"name":{"52":{}},"parent":{"53":{},"54":{},"55":{},"56":{},"61":{},"64":{},"65":{},"66":{},"67":{},"68":{},"69":{}}}],["iagendastatus.config",{"_index":54,"name":{},"parent":{"57":{}}}],["iagendastatus.config.__type",{"_index":56,"name":{},"parent":{"58":{},"59":{},"60":{}}}],["iagendastatus.internal",{"_index":58,"name":{},"parent":{"62":{}}}],["iagendastatus.internal.__type",{"_index":60,"name":{},"parent":{"63":{}}}],["idatabaseoptions",{"_index":36,"name":{"39":{}},"parent":{"40":{}}}],["idatabaseoptions.db",{"_index":38,"name":{},"parent":{"41":{}}}],["idatabaseoptions.db.__type",{"_index":40,"name":{},"parent":{"42":{},"43":{},"44":{}}}],["idbconfig",{"_index":45,"name":{"48":{}},"parent":{"49":{},"50":{}}}],["ijobdefinition",{"_index":0,"name":{"0":{}},"parent":{"1":{},"2":{},"3":{},"4":{},"5":{}}}],["ijobparameters",{"_index":15,"name":{"16":{}},"parent":{"17":{},"18":{},"19":{},"20":{},"21":{},"22":{},"23":{},"24":{},"25":{},"26":{},"27":{},"28":{},"29":{},"30":{},"31":{},"32":{},"33":{},"34":{},"35":{},"36":{}}}],["imongooptions",{"_index":43,"name":{"45":{}},"parent":{"46":{},"47":{}}}],["insert",{"_index":101,"name":{"107":{}},"parent":{}}],["internal",{"_index":57,"name":{"61":{}},"parent":{}}],["isactivejobprocessor",{"_index":127,"name":{"147":{}},"parent":{}}],["isdead",{"_index":170,"name":{"213":{}},"parent":{}}],["islockingonthefly",{"_index":66,"name":{"69":{},"119":{}},"parent":{}}],["ispromise",{"_index":174,"name":{"217":{}},"parent":{}}],["isrunning",{"_index":108,"name":{"120":{},"210":{}},"parent":{}}],["isvaliddate",{"_index":155,"name":{"189":{}},"parent":{}}],["isvalidhumaninterval",{"_index":157,"name":{"191":{}},"parent":{}}],["job",{"_index":160,"name":{"194":{}},"parent":{"195":{},"196":{},"197":{},"198":{},"199":{},"200":{},"201":{},"202":{},"203":{},"204":{},"205":{},"206":{},"207":{},"208":{},"209":{},"210":{},"211":{},"212":{},"213":{},"214":{},"215":{},"216":{},"217":{}}}],["jobdbrepository",{"_index":68,"name":{"71":{}},"parent":{"72":{},"73":{},"74":{},"75":{},"76":{},"77":{},"78":{},"79":{},"80":{},"81":{},"82":{},"83":{},"84":{},"85":{},"86":{},"87":{},"88":{},"89":{}}}],["jobpriority",{"_index":87,"name":{"91":{}},"parent":{}}],["jobprocessing",{"_index":117,"name":{"134":{}},"parent":{}}],["jobprocessingqueue",{"_index":95,"name":{"99":{}},"parent":{"100":{},"101":{},"102":{},"103":{},"104":{},"105":{},"106":{},"107":{},"108":{}}}],["jobprocessor",{"_index":103,"name":{"109":{},"145":{}},"parent":{"110":{},"112":{},"113":{},"114":{},"115":{},"116":{},"117":{},"118":{},"119":{},"120":{},"121":{},"122":{},"123":{},"124":{},"125":{},"126":{},"127":{},"128":{},"129":{},"130":{},"131":{},"132":{},"133":{},"134":{},"135":{},"136":{}}}],["jobprocessor.jobstatus",{"_index":104,"name":{},"parent":{"111":{}}}],["jobqueue",{"_index":107,"name":{"115":{}},"parent":{}}],["jobqueuefilling",{"_index":116,"name":{"133":{}},"parent":{}}],["jobs",{"_index":130,"name":{"162":{}},"parent":{}}],["jobstatus",{"_index":61,"name":{"64":{},"110":{}},"parent":{}}],["jobstolock",{"_index":65,"name":{"68":{},"118":{}},"parent":{}}],["jobwithid",{"_index":175,"name":{"218":{}},"parent":{}}],["lastfinishedat",{"_index":20,"name":{"23":{}},"parent":{}}],["lastmodifiedby",{"_index":33,"name":{"36":{}},"parent":{}}],["lastrunat",{"_index":25,"name":{"28":{}},"parent":{}}],["length",{"_index":97,"name":{"103":{}},"parent":{}}],["listenercount",{"_index":149,"name":{"182":{},"186":{}},"parent":{}}],["listeners",{"_index":146,"name":{"179":{}},"parent":{}}],["localqueueprocessing",{"_index":59,"name":{"63":{},"112":{}},"parent":{}}],["lockedat",{"_index":19,"name":{"22":{}},"parent":{}}],["lockedjobs",{"_index":64,"name":{"67":{},"117":{}},"parent":{}}],["lockjob",{"_index":80,"name":{"84":{}},"parent":{}}],["locklifetime",{"_index":2,"name":{"2":{}},"parent":{}}],["locklimit",{"_index":1,"name":{"1":{},"14":{},"159":{}},"parent":{}}],["lockonthefly",{"_index":114,"name":{"131":{}},"parent":{}}],["log",{"_index":86,"name":{"90":{}},"parent":{}}],["low",{"_index":90,"name":{"94":{}},"parent":{}}],["lowest",{"_index":89,"name":{"93":{}},"parent":{}}],["maxconcurrency",{"_index":12,"name":{"12":{},"59":{},"124":{},"157":{}},"parent":{}}],["mongo",{"_index":44,"name":{"47":{},"151":{}},"parent":{}}],["name",{"_index":9,"name":{"9":{},"18":{},"155":{}},"parent":{}}],["nextrunat",{"_index":17,"name":{"20":{}},"parent":{}}],["nextscanat",{"_index":106,"name":{"114":{}},"parent":{}}],["normal",{"_index":91,"name":{"95":{}},"parent":{}}],["now",{"_index":137,"name":{"169":{}},"parent":{}}],["off",{"_index":142,"name":{"175":{}},"parent":{}}],["on",{"_index":123,"name":{"142":{}},"parent":{}}],["once",{"_index":140,"name":{"173":{}},"parent":{}}],["options",{"_index":42,"name":{"44":{}},"parent":{}}],["parsepriority",{"_index":94,"name":{"98":{}},"parent":{}}],["pop",{"_index":99,"name":{"105":{}},"parent":{}}],["prependlistener",{"_index":150,"name":{"183":{}},"parent":{}}],["prependoncelistener",{"_index":151,"name":{"184":{}},"parent":{}}],["priority",{"_index":3,"name":{"3":{},"19":{},"207":{}},"parent":{}}],["prioritymap",{"_index":88,"name":{"92":{}},"parent":{"93":{},"94":{},"95":{},"96":{},"97":{}}}],["process",{"_index":111,"name":{"128":{}},"parent":{}}],["processdbresult",{"_index":84,"name":{"88":{}},"parent":{}}],["processevery",{"_index":11,"name":{"11":{},"60":{},"126":{},"156":{}},"parent":{}}],["processinterval",{"_index":109,"name":{"121":{}},"parent":{}}],["progress",{"_index":30,"name":{"33":{}},"parent":{}}],["purge",{"_index":131,"name":{"163":{}},"parent":{}}],["queuedjobs",{"_index":62,"name":{"65":{}},"parent":{}}],["queuename",{"_index":51,"name":{"54":{}},"parent":{}}],["rawlisteners",{"_index":147,"name":{"180":{}},"parent":{}}],["ready",{"_index":126,"name":{"146":{}},"parent":{}}],["remove",{"_index":100,"name":{"106":{},"212":{}},"parent":{}}],["removealllisteners",{"_index":143,"name":{"176":{}},"parent":{}}],["removejobs",{"_index":76,"name":{"80":{}},"parent":{}}],["removelistener",{"_index":141,"name":{"174":{}},"parent":{}}],["repeatat",{"_index":28,"name":{"31":{},"202":{}},"parent":{}}],["repeatevery",{"_index":164,"name":{"201":{}},"parent":{}}],["repeatinterval",{"_index":26,"name":{"29":{}},"parent":{}}],["repeattimezone",{"_index":24,"name":{"27":{}},"parent":{}}],["returnnextconcurrencyfreejob",{"_index":102,"name":{"108":{}},"parent":{}}],["run",{"_index":173,"name":{"216":{}},"parent":{}}],["runningjobs",{"_index":63,"name":{"66":{},"116":{}},"parent":{}}],["runorretry",{"_index":118,"name":{"135":{}},"parent":{}}],["save",{"_index":169,"name":{"211":{}},"parent":{}}],["savejob",{"_index":85,"name":{"89":{}},"parent":{}}],["schedule",{"_index":136,"name":{"168":{},"206":{}},"parent":{}}],["setmaxlisteners",{"_index":144,"name":{"177":{}},"parent":{}}],["shouldlock",{"_index":112,"name":{"129":{}},"parent":{}}],["sort",{"_index":47,"name":{"50":{},"152":{}},"parent":{}}],["start",{"_index":138,"name":{"170":{}},"parent":{}}],["stop",{"_index":110,"name":{"127":{},"171":{}},"parent":{}}],["tjobdatefield",{"_index":34,"name":{"37":{}},"parent":{}}],["tojson",{"_index":163,"name":{"200":{}},"parent":{}}],["totallocklimit",{"_index":55,"name":{"58":{},"125":{}},"parent":{}}],["totalqueuesizedb",{"_index":52,"name":{"55":{}},"parent":{}}],["touch",{"_index":171,"name":{"214":{}},"parent":{}}],["type",{"_index":18,"name":{"21":{}},"parent":{}}],["unique",{"_index":31,"name":{"34":{},"205":{}},"parent":{}}],["uniqueopts",{"_index":32,"name":{"35":{}},"parent":{}}],["unlockjob",{"_index":78,"name":{"82":{}},"parent":{}}],["unlockjobs",{"_index":79,"name":{"83":{}},"parent":{}}],["updatestatus",{"_index":119,"name":{"136":{}},"parent":{}}],["version",{"_index":50,"name":{"53":{}},"parent":{}}]],"pipeline":[]}} \ No newline at end of file diff --git a/docs/agenda/4.x/classes/agenda.html b/docs/agenda/4.x/classes/agenda.html deleted file mode 100644 index e405fba..0000000 --- a/docs/agenda/4.x/classes/agenda.html +++ /dev/null @@ -1,2458 +0,0 @@ - - - - - - Agenda | @hokify/agenda - - - - - -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
- - - - - - -
-
- Menu -
-
-
-
-
-
- -

Class Agenda

-
-
-
-
-
-
-
-
-
-
-
-

Hierarchy

-
    -
  • - EventEmitter -
      -
    • - Agenda -
    • -
    -
  • -
-
-
-

Index

-
- -
-
-
-

Constructors

-
- -

constructor

-
    -
  • new Agenda(config?: { defaultConcurrency?: undefined | number; defaultLockLifetime?: undefined | number; defaultLockLimit?: undefined | number; lockLimit?: undefined | number; maxConcurrency?: undefined | number; name?: undefined | string; processEvery?: string | number } & IDatabaseOptions | IMongoOptions | {} & IDbConfig, cb?: undefined | ((error?: Error) => void)): Agenda
  • -
-
    -
  • - -
    -
    -

    Parameters

    -
      -
    • -
      Default value config: { defaultConcurrency?: undefined | number; defaultLockLifetime?: undefined | number; defaultLockLimit?: undefined | number; lockLimit?: undefined | number; maxConcurrency?: undefined | number; name?: undefined | string; processEvery?: string | number } & IDatabaseOptions | IMongoOptions | {} & IDbConfig = {}
      -
      -
      -

      Agenda Config

      -
      -
      -
    • -
    • -
      Optional cb: undefined | ((error?: Error) => void)
      -
      -
      -

      Callback after Agenda has started and connected to mongo

      -
      -
      -
    • -
    -

    Returns Agenda

    -
  • -
-
-
-
-

Properties

-
- -

Readonly attrs

- - -
-
- -

db

- - -
-
- -

Readonly definitions

-
definitions: {}
- -
-

Type declaration

- -
-
-
- -

Private Optional jobProcessor

-
jobProcessor: JobProcessor
- -
-
- -

Readonly ready

-
ready: Promise<void>
- -
-
- -

Static defaultMaxListeners

-
defaultMaxListeners: number
- -
-
- -

Static Readonly errorMonitor

-
errorMonitor: unique symbol
- -
-
-

This symbol shall be used to install a listener for only monitoring 'error' - events. Listeners installed using this symbol are called before the regular - 'error' listeners are called.

-
-

Installing a listener using this symbol does not change the behavior once an - 'error' event is emitted, therefore the process will still crash if no - regular 'error' listener is installed.

-
-
-
-
-

Methods

-
- -

addListener

-
    -
  • addListener(event: string | symbol, listener: (...args: any[]) => void): this
  • -
-
    -
  • - -

    Parameters

    -
      -
    • -
      event: string | symbol
      -
    • -
    • -
      listener: (...args: any[]) => void
      -
        -
      • -
          -
        • (...args: any[]): void
        • -
        -
          -
        • -

          Parameters

          -
            -
          • -
            Rest ...args: any[]
            -
          • -
          -

          Returns void

          -
        • -
        -
      • -
      -
    • -
    -

    Returns this

    -
  • -
-
-
- -

cancel

- -
    -
  • - -
    -
    -

    Cancels any jobs matching the passed MongoDB query, and removes them from the database.

    -
    -
    -

    Parameters

    - -

    Returns Promise<number>

    -
  • -
-
-
- -

create

-
    -
  • create(name: string): Job<void>
  • -
  • create<DATA>(name: string, data: DATA): Job<DATA>
  • -
-
    -
  • - -
    -
    -

    Given a name and some data, create a new job

    -
    -
    -

    Parameters

    -
      -
    • -
      name: string
      -
      -
      -
    • -
    -

    Returns Job<void>

    -
  • -
  • - -

    Type parameters

    -
      -
    • -

      DATA = unknown

      -
    • -
    -

    Parameters

    -
      -
    • -
      name: string
      -
    • -
    • -
      data: DATA
      -
    • -
    -

    Returns Job<DATA>

    -
  • -
-
-
- -

Private createJobs

-
    -
  • createJobs<DATA>(names: string[], createJob: (name: string) => Promise<Job<DATA>>): Promise<Job<DATA>[]>
  • -
-
    -
  • - -
    -
    -

    Internal helper method that uses createJob to create jobs for an array of names

    -
    -
    -

    Type parameters

    -
      -
    • -

      DATA = unknown

      -
    • -
    -

    Parameters

    -
      -
    • -
      names: string[]
      -
      -

      Strings of jobs to schedule

      -
      -
    • -
    • -
      createJob: (name: string) => Promise<Job<DATA>>
      -
        -
      • -
          -
        • (name: string): Promise<Job<DATA>>
        • -
        -
          -
        • -

          Parameters

          -
            -
          • -
            name: string
            -
          • -
          -

          Returns Promise<Job<DATA>>

          -
        • -
        -
      • -
      -
    • -
    -

    Returns Promise<Job<DATA>[]>

    -

    array of jobs created

    -
  • -
-
-
- -

database

-
    -
  • database(address: string, collection?: undefined | string, options?: MongoClientOptions): Promise<Agenda>
  • -
-
    -
  • - -
    -
    -

    Connect to the spec'd MongoDB server and database.

    -
    -
    -

    Parameters

    -
      -
    • -
      address: string
      -
    • -
    • -
      Optional collection: undefined | string
      -
    • -
    • -
      Optional options: MongoClientOptions
      -
    • -
    -

    Returns Promise<Agenda>

    -
  • -
-
-
- -

defaultConcurrency

-
    -
  • defaultConcurrency(num: number): Agenda
  • -
-
    -
  • - -
    -
    -

    Set the default concurrency for each job

    -
    -
    -

    Parameters

    -
      -
    • -
      num: number
      -
      -

      number of max concurrency

      -
      -
    • -
    -

    Returns Agenda

    -
  • -
-
-
- -

defaultLockLifetime

-
    -
  • defaultLockLifetime(ms: number): Agenda
  • -
-
    -
  • - -
    -
    -

    Set the default lock time (in ms) - Default is 10 * 60 * 1000 ms (10 minutes)

    -
    -
    -

    Parameters

    -
      -
    • -
      ms: number
      -
      -
      -
    • -
    -

    Returns Agenda

    -
  • -
-
-
- -

defaultLockLimit

-
    -
  • defaultLockLimit(num: number): Agenda
  • -
-
    -
  • - -
    -
    -

    Set default lock limit per job type

    -
    -
    -

    Parameters

    -
      -
    • -
      num: number
      -
      -
      -
    • -
    -

    Returns Agenda

    -
  • -
-
-
- -

define

-
    -
  • define<DATA>(name: string, processor: (agendaJob: Job<DATA>, done: (error?: Error) => void) => void, options?: Partial<Pick<IJobDefinition, "lockLimit" | "lockLifetime" | "concurrency">> & { priority?: JobPriority }): void
  • -
  • define<DATA>(name: string, processor: (agendaJob: Job<DATA>) => Promise<void>, options?: Partial<Pick<IJobDefinition, "lockLimit" | "lockLifetime" | "concurrency">> & { priority?: JobPriority }): void
  • -
-
    -
  • - -
    -
    -

    Setup definition for job - Method is used by consumers of lib to setup their functions - BREAKING CHANGE in v4: options moved from 2nd to 3rd parameter!

    -
    -
    -

    Type parameters

    -
      -
    • -

      DATA = any

      -
    • -
    -

    Parameters

    -
      -
    • -
      name: string
      -
    • -
    • -
      processor: (agendaJob: Job<DATA>, done: (error?: Error) => void) => void
      -
        -
      • -
          -
        • (agendaJob: Job<DATA>, done: (error?: Error) => void): void
        • -
        -
          -
        • -

          Parameters

          -
            -
          • -
            agendaJob: Job<DATA>
            -
          • -
          • -
            done: (error?: Error) => void
            -
              -
            • -
                -
              • (error?: Error): void
              • -
              -
                -
              • -

                Parameters

                -
                  -
                • -
                  Optional error: Error
                  -
                • -
                -

                Returns void

                -
              • -
              -
            • -
            -
          • -
          -

          Returns void

          -
        • -
        -
      • -
      -
    • -
    • -
      Optional options: Partial<Pick<IJobDefinition, "lockLimit" | "lockLifetime" | "concurrency">> & { priority?: JobPriority }
      -
      -
      -
    • -
    -

    Returns void

    -
  • -
  • - -

    Type parameters

    -
      -
    • -

      DATA = any

      -
    • -
    -

    Parameters

    -
      -
    • -
      name: string
      -
    • -
    • -
      processor: (agendaJob: Job<DATA>) => Promise<void>
      -
        -
      • -
          -
        • (agendaJob: Job<DATA>): Promise<void>
        • -
        -
          -
        • -

          Parameters

          -
            -
          • -
            agendaJob: Job<DATA>
            -
          • -
          -

          Returns Promise<void>

          -
        • -
        -
      • -
      -
    • -
    • -
      Optional options: Partial<Pick<IJobDefinition, "lockLimit" | "lockLifetime" | "concurrency">> & { priority?: JobPriority }
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

emit

-
    -
  • emit(event: string | symbol, ...args: any[]): boolean
  • -
-
    -
  • - -

    Parameters

    -
      -
    • -
      event: string | symbol
      -
    • -
    • -
      Rest ...args: any[]
      -
    • -
    -

    Returns boolean

    -
  • -
-
-
- -

eventNames

-
    -
  • eventNames(): Array<string | symbol>
  • -
-
    -
  • - -

    Returns Array<string | symbol>

    -
  • -
-
-
- -

every

-
    -
  • every(interval: string | number, names: string[], data?: undefined, options?: undefined | { skipImmediate?: undefined | false | true; timezone?: undefined | string }): Promise<Job<void>[]>
  • -
  • every(interval: string | number, name: string, data?: undefined, options?: undefined | { skipImmediate?: undefined | false | true; timezone?: undefined | string }): Promise<Job<void>>
  • -
  • every<DATA>(interval: string | number, names: string[], data: DATA, options?: undefined | { skipImmediate?: undefined | false | true; timezone?: undefined | string }): Promise<Job<DATA>[]>
  • -
  • every<DATA>(interval: string | number, name: string, data: DATA, options?: undefined | { skipImmediate?: undefined | false | true; timezone?: undefined | string }): Promise<Job<DATA>>
  • -
-
    -
  • - -
    -
    -

    Creates a scheduled job with given interval and name/names of the job to run

    -
    -
    -

    Parameters

    -
      -
    • -
      interval: string | number
      -
    • -
    • -
      names: string[]
      -
    • -
    • -
      Optional data: undefined
      -
    • -
    • -
      Optional options: undefined | { skipImmediate?: undefined | false | true; timezone?: undefined | string }
      -
      -
      -
    • -
    -

    Returns Promise<Job<void>[]>

    -
  • -
  • - -

    Parameters

    -
      -
    • -
      interval: string | number
      -
    • -
    • -
      name: string
      -
    • -
    • -
      Optional data: undefined
      -
    • -
    • -
      Optional options: undefined | { skipImmediate?: undefined | false | true; timezone?: undefined | string }
      -
    • -
    -

    Returns Promise<Job<void>>

    -
  • -
  • - -

    Type parameters

    -
      -
    • -

      DATA = unknown

      -
    • -
    -

    Parameters

    -
      -
    • -
      interval: string | number
      -
    • -
    • -
      names: string[]
      -
    • -
    • -
      data: DATA
      -
    • -
    • -
      Optional options: undefined | { skipImmediate?: undefined | false | true; timezone?: undefined | string }
      -
    • -
    -

    Returns Promise<Job<DATA>[]>

    -
  • -
  • - -

    Type parameters

    -
      -
    • -

      DATA = unknown

      -
    • -
    -

    Parameters

    -
      -
    • -
      interval: string | number
      -
    • -
    • -
      name: string
      -
    • -
    • -
      data: DATA
      -
    • -
    • -
      Optional options: undefined | { skipImmediate?: undefined | false | true; timezone?: undefined | string }
      -
    • -
    -

    Returns Promise<Job<DATA>>

    -
  • -
-
-
- -

getMaxListeners

-
    -
  • getMaxListeners(): number
  • -
-
    -
  • - -

    Returns number

    -
  • -
-
-
- -

getRunningStats

-
    -
  • getRunningStats(fullDetails?: boolean): Promise<IAgendaStatus>
  • -
-
    -
  • - -

    Parameters

    -
      -
    • -
      Default value fullDetails: boolean = false
      -
    • -
    -

    Returns Promise<IAgendaStatus>

    -
  • -
-
-
- -

Private hasDatabaseConfig

-
    -
  • hasDatabaseConfig(config: unknown): config is IDatabaseOptions | IMongoOptions & IDbConfig
  • -
-
    -
  • - -

    Parameters

    -
      -
    • -
      config: unknown
      -
    • -
    -

    Returns config is IDatabaseOptions | IMongoOptions & IDbConfig

    -
  • -
-
-
- -

isActiveJobProcessor

-
    -
  • isActiveJobProcessor(): boolean
  • -
- -
-
- -

jobs

- -
    -
  • - -
    -
    -

    Finds all jobs matching 'query'

    -
    -
    -

    Parameters

    -
      -
    • -
      Default value query: FilterQuery<IJobParameters> = {}
      -
    • -
    • -
      Default value sort: FilterQuery<IJobParameters> = {}
      -
    • -
    • -
      Default value limit: number = 0
      -
    • -
    • -
      Default value skip: number = 0
      -
      -
      -
    • -
    -

    Returns Promise<Job[]>

    -
  • -
-
-
- -

listenerCount

-
    -
  • listenerCount(event: string | symbol): number
  • -
-
    -
  • - -

    Parameters

    -
      -
    • -
      event: string | symbol
      -
    • -
    -

    Returns number

    -
  • -
-
-
- -

listeners

-
    -
  • listeners(event: string | symbol): Function[]
  • -
-
    -
  • - -

    Parameters

    -
      -
    • -
      event: string | symbol
      -
    • -
    -

    Returns Function[]

    -
  • -
-
-
- -

lockLimit

-
    -
  • lockLimit(num: number): Agenda
  • -
-
    -
  • - -
    -
    -

    Set the default amount jobs that are allowed to be locked at one time (GLOBAL)

    -
    -
    -

    Parameters

    -
      -
    • -
      num: number
      -
      -
      -
    • -
    -

    Returns Agenda

    -
  • -
-
-
- -

maxConcurrency

-
    -
  • maxConcurrency(num: number): Agenda
  • -
-
    -
  • - -
    -
    -

    Set the concurrency for jobs (globally), type does not matter

    -
    -
    -

    Parameters

    -
      -
    • -
      num: number
      -
      -
      -
    • -
    -

    Returns Agenda

    -
  • -
-
-
- -

mongo

-
    -
  • mongo(mongo: Db, collection?: undefined | string): Promise<Agenda>
  • -
-
    -
  • - -
    -
    -

    Use existing mongo connectino to pass into agenda

    -
    -
    -

    Parameters

    -
      -
    • -
      mongo: Db
      -
    • -
    • -
      Optional collection: undefined | string
      -
      -
      -
    • -
    -

    Returns Promise<Agenda>

    -
  • -
-
-
- -

name

-
    -
  • name(name: string): Agenda
  • -
-
    -
  • - -
    -
    -

    Set name of queue

    -
    -
    -

    Parameters

    -
      -
    • -
      name: string
      -
      -
      -
    • -
    -

    Returns Agenda

    -
  • -
-
-
- -

now

-
    -
  • now<DATA>(name: string): Promise<Job<DATA>>
  • -
  • now<DATA>(name: string, data: DATA): Promise<Job<DATA>>
  • -
-
    -
  • - -
    -
    -

    Create a job for this exact moment

    -
    -
    -

    Type parameters

    -
      -
    • -

      DATA = void

      -
    • -
    -

    Parameters

    -
      -
    • -
      name: string
      -
      -
      -
    • -
    -

    Returns Promise<Job<DATA>>

    -
  • -
  • - -

    Type parameters

    -
      -
    • -

      DATA = unknown

      -
    • -
    -

    Parameters

    -
      -
    • -
      name: string
      -
    • -
    • -
      data: DATA
      -
    • -
    -

    Returns Promise<Job<DATA>>

    -
  • -
-
-
- -

off

-
    -
  • off(event: string | symbol, listener: (...args: any[]) => void): this
  • -
-
    -
  • - -

    Parameters

    -
      -
    • -
      event: string | symbol
      -
    • -
    • -
      listener: (...args: any[]) => void
      -
        -
      • -
          -
        • (...args: any[]): void
        • -
        -
          -
        • -

          Parameters

          -
            -
          • -
            Rest ...args: any[]
            -
          • -
          -

          Returns void

          -
        • -
        -
      • -
      -
    • -
    -

    Returns this

    -
  • -
-
-
- -

on

-
    -
  • on(event: "processJob", listener: (job: JobWithId) => void): this
  • -
  • on(event: "fail", listener: (error: Error, job: JobWithId) => void): this
  • -
  • on(event: "success", listener: (job: JobWithId) => void): this
  • -
  • on(event: "start", listener: (job: JobWithId) => void): this
  • -
  • on(event: "complete", listener: (job: JobWithId) => void): this
  • -
  • on(event: string, listener: (job: JobWithId) => void): this
  • -
  • on(event: string, listener: (error: Error, job: JobWithId) => void): this
  • -
  • on(event: "ready", listener: () => void): this
  • -
  • on(event: "error", listener: (error: Error) => void): this
  • -
-
    -
  • - -

    Parameters

    -
      -
    • -
      event: "processJob"
      -
    • -
    • -
      listener: (job: JobWithId) => void
      -
        -
      • - -
          -
        • -

          Parameters

          - -

          Returns void

          -
        • -
        -
      • -
      -
    • -
    -

    Returns this

    -
  • -
  • - -

    Parameters

    -
      -
    • -
      event: "fail"
      -
    • -
    • -
      listener: (error: Error, job: JobWithId) => void
      -
        -
      • - -
          -
        • -

          Parameters

          - -

          Returns void

          -
        • -
        -
      • -
      -
    • -
    -

    Returns this

    -
  • -
  • - -

    Parameters

    -
      -
    • -
      event: "success"
      -
    • -
    • -
      listener: (job: JobWithId) => void
      -
        -
      • - -
          -
        • -

          Parameters

          - -

          Returns void

          -
        • -
        -
      • -
      -
    • -
    -

    Returns this

    -
  • -
  • - -

    Parameters

    -
      -
    • -
      event: "start"
      -
    • -
    • -
      listener: (job: JobWithId) => void
      -
        -
      • - -
          -
        • -

          Parameters

          - -

          Returns void

          -
        • -
        -
      • -
      -
    • -
    -

    Returns this

    -
  • -
  • - -

    Parameters

    -
      -
    • -
      event: "complete"
      -
    • -
    • -
      listener: (job: JobWithId) => void
      -
        -
      • - -
          -
        • -

          Parameters

          - -

          Returns void

          -
        • -
        -
      • -
      -
    • -
    -

    Returns this

    -
  • -
  • - -

    Parameters

    -
      -
    • -
      event: string
      -
    • -
    • -
      listener: (job: JobWithId) => void
      -
        -
      • - -
          -
        • -

          Parameters

          - -

          Returns void

          -
        • -
        -
      • -
      -
    • -
    -

    Returns this

    -
  • -
  • - -

    Parameters

    -
      -
    • -
      event: string
      -
    • -
    • -
      listener: (error: Error, job: JobWithId) => void
      -
        -
      • - -
          -
        • -

          Parameters

          - -

          Returns void

          -
        • -
        -
      • -
      -
    • -
    -

    Returns this

    -
  • -
  • - -

    Parameters

    -
      -
    • -
      event: "ready"
      -
    • -
    • -
      listener: () => void
      -
        -
      • -
          -
        • (): void
        • -
        -
          -
        • -

          Returns void

          -
        • -
        -
      • -
      -
    • -
    -

    Returns this

    -
  • -
  • - -

    Parameters

    -
      -
    • -
      event: "error"
      -
    • -
    • -
      listener: (error: Error) => void
      -
        -
      • -
          -
        • (error: Error): void
        • -
        -
          -
        • -

          Parameters

          -
            -
          • -
            error: Error
            -
          • -
          -

          Returns void

          -
        • -
        -
      • -
      -
    • -
    -

    Returns this

    -
  • -
-
-
- -

once

-
    -
  • once(event: string | symbol, listener: (...args: any[]) => void): this
  • -
-
    -
  • - -

    Parameters

    -
      -
    • -
      event: string | symbol
      -
    • -
    • -
      listener: (...args: any[]) => void
      -
        -
      • -
          -
        • (...args: any[]): void
        • -
        -
          -
        • -

          Parameters

          -
            -
          • -
            Rest ...args: any[]
            -
          • -
          -

          Returns void

          -
        • -
        -
      • -
      -
    • -
    -

    Returns this

    -
  • -
-
-
- -

prependListener

-
    -
  • prependListener(event: string | symbol, listener: (...args: any[]) => void): this
  • -
-
    -
  • - -

    Parameters

    -
      -
    • -
      event: string | symbol
      -
    • -
    • -
      listener: (...args: any[]) => void
      -
        -
      • -
          -
        • (...args: any[]): void
        • -
        -
          -
        • -

          Parameters

          -
            -
          • -
            Rest ...args: any[]
            -
          • -
          -

          Returns void

          -
        • -
        -
      • -
      -
    • -
    -

    Returns this

    -
  • -
-
-
- -

prependOnceListener

-
    -
  • prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this
  • -
-
    -
  • - -

    Parameters

    -
      -
    • -
      event: string | symbol
      -
    • -
    • -
      listener: (...args: any[]) => void
      -
        -
      • -
          -
        • (...args: any[]): void
        • -
        -
          -
        • -

          Parameters

          -
            -
          • -
            Rest ...args: any[]
            -
          • -
          -

          Returns void

          -
        • -
        -
      • -
      -
    • -
    -

    Returns this

    -
  • -
-
-
- -

processEvery

-
    -
  • processEvery(time: string | number): Agenda
  • -
-
    -
  • - -
    -
    -

    Set the time how often the job processor checks for new jobs to process

    -
    -
    -

    Parameters

    -
      -
    • -
      time: string | number
      -
      -
      -
    • -
    -

    Returns Agenda

    -
  • -
-
-
- -

purge

-
    -
  • purge(): Promise<number>
  • -
-
    -
  • - -
    -
    -

    Removes all jobs from queue

    -
    -
    -
    note:
    -

    Only use after defining your jobs

    -
    -
    -
    -

    Returns Promise<number>

    -
  • -
-
-
- -

rawListeners

-
    -
  • rawListeners(event: string | symbol): Function[]
  • -
-
    -
  • - -

    Parameters

    -
      -
    • -
      event: string | symbol
      -
    • -
    -

    Returns Function[]

    -
  • -
-
-
- -

removeAllListeners

-
    -
  • removeAllListeners(event?: string | symbol): this
  • -
-
    -
  • - -

    Parameters

    -
      -
    • -
      Optional event: string | symbol
      -
    • -
    -

    Returns this

    -
  • -
-
-
- -

removeListener

-
    -
  • removeListener(event: string | symbol, listener: (...args: any[]) => void): this
  • -
-
    -
  • - -

    Parameters

    -
      -
    • -
      event: string | symbol
      -
    • -
    • -
      listener: (...args: any[]) => void
      -
        -
      • -
          -
        • (...args: any[]): void
        • -
        -
          -
        • -

          Parameters

          -
            -
          • -
            Rest ...args: any[]
            -
          • -
          -

          Returns void

          -
        • -
        -
      • -
      -
    • -
    -

    Returns this

    -
  • -
-
-
- -

schedule

-
    -
  • schedule<DATA>(when: string | Date, names: string[]): Promise<Job<DATA>[]>
  • -
  • schedule<DATA>(when: string | Date, names: string): Promise<Job<DATA>>
  • -
  • schedule<DATA>(when: string | Date, names: string[], data: DATA): Promise<Job<DATA>[]>
  • -
  • schedule<DATA>(when: string | Date, name: string, data: DATA): Promise<Job<DATA>>
  • -
-
    -
  • - -
    -
    -

    Schedule a job or jobs at a specific time

    -
    -
    -

    Type parameters

    -
      -
    • -

      DATA = void

      -
    • -
    -

    Parameters

    -
      -
    • -
      when: string | Date
      -
    • -
    • -
      names: string[]
      -
      -
      -
    • -
    -

    Returns Promise<Job<DATA>[]>

    -
  • -
  • - -

    Type parameters

    -
      -
    • -

      DATA = void

      -
    • -
    -

    Parameters

    -
      -
    • -
      when: string | Date
      -
    • -
    • -
      names: string
      -
    • -
    -

    Returns Promise<Job<DATA>>

    -
  • -
  • - -

    Type parameters

    -
      -
    • -

      DATA = unknown

      -
    • -
    -

    Parameters

    -
      -
    • -
      when: string | Date
      -
    • -
    • -
      names: string[]
      -
    • -
    • -
      data: DATA
      -
    • -
    -

    Returns Promise<Job<DATA>[]>

    -
  • -
  • - -

    Type parameters

    -
      -
    • -

      DATA = unknown

      -
    • -
    -

    Parameters

    -
      -
    • -
      when: string | Date
      -
    • -
    • -
      name: string
      -
    • -
    • -
      data: DATA
      -
    • -
    -

    Returns Promise<Job<DATA>>

    -
  • -
-
-
- -

setMaxListeners

-
    -
  • setMaxListeners(n: number): this
  • -
-
    -
  • - -

    Parameters

    -
      -
    • -
      n: number
      -
    • -
    -

    Returns this

    -
  • -
-
-
- -

sort

- -
    -
  • - -
    -
    -

    Set the sort query for finding next job - Default is { nextRunAt: 1, priority: -1 }

    -
    -
    -

    Parameters

    - -

    Returns Agenda

    -
  • -
-
-
- -

start

-
    -
  • start(): Promise<void>
  • -
-
    -
  • - -
    -
    -

    Starts processing jobs using processJobs() methods, storing an interval ID - This method will only resolve if a db has been set up beforehand.

    -
    -
    -

    Returns Promise<void>

    -
  • -
-
-
- -

stop

-
    -
  • stop(): Promise<void>
  • -
-
    -
  • - -
    -
    -

    Clear the interval that processes the jobs

    -
    -
    -

    Returns Promise<void>

    -
  • -
-
-
- -

Static listenerCount

-
    -
  • listenerCount(emitter: EventEmitter, event: string | symbol): number
  • -
-
    -
  • - -
    -
    -
    deprecated
    -

    since v4.0.0

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      emitter: EventEmitter
      -
    • -
    • -
      event: string | symbol
      -
    • -
    -

    Returns number

    -
  • -
-
-
-
- -
-
-
-
-

Legend

-
-
    -
  • Constructor
  • -
  • Property
  • -
  • Method
  • -
-
    -
  • Private property
  • -
  • Private method
  • -
-
    -
  • Property
  • -
-
    -
  • Inherited method
  • -
-
-
-
-
-

Generated using TypeDoc

-
-
- - - \ No newline at end of file diff --git a/docs/agenda/4.x/classes/job.html b/docs/agenda/4.x/classes/job.html deleted file mode 100644 index bb8afd0..0000000 --- a/docs/agenda/4.x/classes/job.html +++ /dev/null @@ -1,921 +0,0 @@ - - - - - - Job | @hokify/agenda - - - - - -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
- - - - - - -
-
- Menu -
-
-
-
-
-
- -

Class Job<DATA>

-
-
-
-
-
-
-
-
-
-
-
-

Type parameters

-
    -
  • -

    DATA = unknown | void

    -
  • -
-
-
-

Hierarchy

-
    -
  • - Job -
  • -
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Methods

- -
-
-
-
-
-

Constructors

-
- -

constructor

-
    -
  • new Job(agenda: Agenda, args: Partial<IJobParameters<void>> & { name: string; type: "normal" | "single" }, byJobProcessor?: any): Job
  • -
  • new Job(agenda: Agenda, args: Partial<IJobParameters<DATA>> & { data: DATA; name: string; type: "normal" | "single" }, byJobProcessor?: any): Job
  • -
-
    -
  • - -
    -
    -

    creates a new job object

    -
    -
    -

    Parameters

    -
      -
    • -
      agenda: Agenda
      -
    • -
    • -
      args: Partial<IJobParameters<void>> & { name: string; type: "normal" | "single" }
      -
    • -
    • -
      Optional byJobProcessor: any
      -
      -
      -
      -
      -
    • -
    -

    Returns Job

    -
  • -
  • - -
    -
    -

    creates a new job object

    -
    -
    -

    Parameters

    -
      -
    • -
      agenda: Agenda
      -
    • -
    • -
      args: Partial<IJobParameters<DATA>> & { data: DATA; name: string; type: "normal" | "single" }
      -
    • -
    • -
      Optional byJobProcessor: any
      -
      -
      -
      -
      -
    • -
    -

    Returns Job

    -
  • -
-
-
-
-

Properties

-
- -

Readonly agenda

-
agenda: Agenda
- -
-
- -

Readonly attrs

-
attrs: IJobParameters<DATA>
- -
-
- -

Private Readonly byJobProcessor

-
byJobProcessor: boolean
- -
-
-
-
-
-
- -

canceled

-
canceled: Error | undefined
- -
-
-

this flag is set to true, if a job got canceled (e.g. due to a timeout or other exception), - you can use it for long running tasks to periodically check if canceled is true, - also touch will check if and throws that the job got canceled

-
-
-
-
-
-

Methods

-
- -

Private computeNextRunAt

-
    -
  • computeNextRunAt(): this
  • -
- -
-
- -

disable

-
    -
  • disable(): this
  • -
-
    -
  • - -
    -
    -

    Prevents the job from running

    -
    -
    -

    Returns this

    -
  • -
-
-
- -

enable

-
    -
  • enable(): this
  • -
-
    -
  • - -
    -
    -

    Allows job to run

    -
    -
    -

    Returns this

    -
  • -
-
-
- -

fail

-
    -
  • fail(reason: Error | string): this
  • -
-
    -
  • - -
    -
    -

    Fails the job with a reason (error) specified

    -
    -
    -

    Parameters

    -
      -
    • -
      reason: Error | string
      -
      -
      -
    • -
    -

    Returns this

    -
  • -
-
-
- -

Private fetchStatus

-
    -
  • fetchStatus(): Promise<void>
  • -
- -
-
- -

isDead

-
    -
  • isDead(): Promise<boolean>
  • -
-
    -
  • - -

    Returns Promise<boolean>

    -
  • -
-
-
- -

Private isPromise

-
    -
  • isPromise(value: unknown): value is Promise<void>
  • -
-
    -
  • - -

    Parameters

    -
      -
    • -
      value: unknown
      -
    • -
    -

    Returns value is Promise<void>

    -
  • -
-
-
- -

isRunning

-
    -
  • isRunning(): Promise<boolean>
  • -
-
    -
  • - -
    -
    -

    A job is running if: - (lastRunAt exists AND lastFinishedAt does not exist) - OR - (lastRunAt exists AND lastFinishedAt exists but the lastRunAt is newer [in time] than lastFinishedAt)

    -
    -
    -

    Returns Promise<boolean>

    -

    Whether or not job is running at the moment (true for running)

    -
  • -
-
-
- -

priority

- -
    -
  • - -
    -
    -

    Sets priority of the job

    -
    -
    -

    Parameters

    -
      -
    • -
      priority: JobPriority
      -
      -

      priority of when job should be queued

      -
      -
    • -
    -

    Returns this

    -
  • -
-
-
- -

remove

-
    -
  • remove(): Promise<number>
  • -
-
    -
  • - -
    -
    -

    Remove the job from database

    -
    -
    -

    Returns Promise<number>

    -
  • -
-
-
- -

repeatAt

-
    -
  • repeatAt(time: string): this
  • -
-
    -
  • - -
    -
    -

    Sets a job to repeat at a specific time

    -
    -
    -

    Parameters

    -
      -
    • -
      time: string
      -
      -
      -
    • -
    -

    Returns this

    -
  • -
-
-
- -

repeatEvery

-
    -
  • repeatEvery(interval: string | number, options?: { skipImmediate?: undefined | false | true; timezone?: undefined | string }): this
  • -
-
    -
  • - -
    -
    -

    Sets a job to repeat every X amount of time

    -
    -
    -

    Parameters

    -
      -
    • -
      interval: string | number
      -
    • -
    • -
      Default value options: { skipImmediate?: undefined | false | true; timezone?: undefined | string } = {}
      -
      -
      -
        -
      • -
        Optional skipImmediate?: undefined | false | true
        -
      • -
      • -
        Optional timezone?: undefined | string
        -
      • -
      -
    • -
    -

    Returns this

    -
  • -
-
-
- -

run

-
    -
  • run(): Promise<void>
  • -
- -
-
- -

save

-
    -
  • save(): Promise<Job>
  • -
-
    -
  • - -
    -
    -

    Saves a job to database

    -
    -
    -

    Returns Promise<Job>

    -
  • -
-
-
- -

schedule

-
    -
  • schedule(time: string | Date): this
  • -
-
    -
  • - -
    -
    -

    Schedules a job to run at specified time

    -
    -
    -

    Parameters

    -
      -
    • -
      time: string | Date
      -
      -
      -
    • -
    -

    Returns this

    -
  • -
-
-
- -

toJson

- - -
-
- -

touch

-
    -
  • touch(progress?: undefined | number): Promise<void>
  • -
-
    -
  • - -
    -
    -

    Updates "lockedAt" time so the job does not get picked up again

    -
    -
    -

    Parameters

    -
      -
    • -
      Optional progress: undefined | number
      -
      -

      0 to 100

      -
      -
    • -
    -

    Returns Promise<void>

    -
  • -
-
-
- -

unique

-
    -
  • unique(unique: Required<IJobParameters<DATA>>["unique"], opts?: IJobParameters["uniqueOpts"]): this
  • -
-
    -
  • - -
    -
    -

    Data to ensure is unique for job to be created

    -
    -
    -

    Parameters

    -
      -
    • -
      unique: Required<IJobParameters<DATA>>["unique"]
      -
    • -
    • -
      Optional opts: IJobParameters["uniqueOpts"]
      -
      -
      -
    • -
    -

    Returns this

    -
  • -
-
-
-
- -
-
-
-
-

Legend

-
-
    -
  • Constructor
  • -
  • Property
  • -
  • Method
  • -
-
    -
  • Private property
  • -
  • Private method
  • -
-
    -
  • Property
  • -
-
    -
  • Inherited method
  • -
-
-
-
-
-

Generated using TypeDoc

-
-
- - - \ No newline at end of file diff --git a/docs/agenda/4.x/classes/jobdbrepository.html b/docs/agenda/4.x/classes/jobdbrepository.html deleted file mode 100644 index b71903b..0000000 --- a/docs/agenda/4.x/classes/jobdbrepository.html +++ /dev/null @@ -1,738 +0,0 @@ - - - - - - JobDbRepository | @hokify/agenda - - - - - -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
- - - - - - -
-
- Menu -
-
-
-
-
-
- -

Class JobDbRepository

-
-
-
-
-
-
-
-
-
-
-
-

Hierarchy

-
    -
  • - JobDbRepository -
  • -
-
-
-

Index

-
- -
-
-
-

Constructors

-
- -

constructor

- - -
-
-
-

Properties

-
- -

Private agenda

-
agenda: Agenda
- -
-
- -

collection

-
collection: Collection
- -
-
- -

Private connectOptions

- - -
-
-
-

Methods

-
- -

connect

-
    -
  • connect(): Promise<void>
  • -
- -
-
- -

Private createConnection

-
    -
  • createConnection(): Promise<Db>
  • -
- -
-
- -

Private database

-
    -
  • database(url: string, options?: MongoClientOptions): Promise<Db>
  • -
-
    -
  • - -

    Parameters

    -
      -
    • -
      url: string
      -
    • -
    • -
      Optional options: MongoClientOptions
      -
    • -
    -

    Returns Promise<Db>

    -
  • -
-
-
- -

getJobs

- - -
-
- -

getNextJobToRun

-
    -
  • getNextJobToRun(jobName: string, nextScanAt: Date, lockDeadline: Date, now?: Date): Promise<IJobParameters | undefined>
  • -
-
    -
  • - -

    Parameters

    -
      -
    • -
      jobName: string
      -
    • -
    • -
      nextScanAt: Date
      -
    • -
    • -
      lockDeadline: Date
      -
    • -
    • -
      Default value now: Date = new Date()
      -
    • -
    -

    Returns Promise<IJobParameters | undefined>

    -
  • -
-
-
- -

getQueueSize

-
    -
  • getQueueSize(): Promise<number>
  • -
- -
-
- -

Private hasDatabaseConfig

-
    -
  • hasDatabaseConfig(connectOptions: unknown): connectOptions is IDatabaseOptions
  • -
-
    -
  • - -

    Parameters

    -
      -
    • -
      connectOptions: unknown
      -
    • -
    -

    Returns connectOptions is IDatabaseOptions

    -
  • -
-
-
- -

Private hasMongoConnection

-
    -
  • hasMongoConnection(connectOptions: unknown): connectOptions is IMongoOptions
  • -
-
    -
  • - -

    Parameters

    -
      -
    • -
      connectOptions: unknown
      -
    • -
    -

    Returns connectOptions is IMongoOptions

    -
  • -
-
-
- -

lockJob

- - -
-
- -

Private processDbResult

- - -
-
- -

removeJobs

- - -
-
- -

saveJob

-
    -
  • saveJob<DATA>(job: Job<DATA>): Promise<Job<DATA>>
  • -
-
    -
  • - -
    -
    -

    Save the properties on a job to MongoDB

    -
    -
    -
    name
    -

    Agenda#saveJob

    -
    -
    function
    -
    -
    -
    -

    Type parameters

    -
      -
    • -

      DATA = unknown | void

      -
    • -
    -

    Parameters

    -
      -
    • -
      job: Job<DATA>
      -
      -

      job to save into MongoDB

      -
      -
    • -
    -

    Returns Promise<Job<DATA>>

    -

    resolves when job is saved or errors

    -
  • -
-
-
- -

unlockJob

-
    -
  • unlockJob(job: Job): Promise<void>
  • -
- -
-
- -

unlockJobs

-
    -
  • unlockJobs(jobIds: ObjectId[]): Promise<void>
  • -
-
    -
  • - -
    -
    -

    Internal method to unlock jobs so that they can be re-run

    -
    -
    -

    Parameters

    -
      -
    • -
      jobIds: ObjectId[]
      -
    • -
    -

    Returns Promise<void>

    -
  • -
-
-
-
- -
-
-
-
-

Legend

-
-
    -
  • Constructor
  • -
  • Property
  • -
  • Method
  • -
-
    -
  • Private property
  • -
  • Private method
  • -
-
    -
  • Property
  • -
-
    -
  • Inherited method
  • -
-
-
-
-
-

Generated using TypeDoc

-
-
- - - \ No newline at end of file diff --git a/docs/agenda/4.x/classes/jobprocessingqueue.html b/docs/agenda/4.x/classes/jobprocessingqueue.html deleted file mode 100644 index f599767..0000000 --- a/docs/agenda/4.x/classes/jobprocessingqueue.html +++ /dev/null @@ -1,498 +0,0 @@ - - - - - - JobProcessingQueue | @hokify/agenda - - - - - -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
- - - - - - -
-
- Menu -
-
-
-
-
-
- -

Class JobProcessingQueue

-
-
-
-
-
-
-
-
-
-
-
-

Hierarchy

-
    -
  • - JobProcessingQueue -
  • -
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Accessors

- -
-
-

Methods

- -
-
-
-
-
-

Constructors

-
- -

constructor

- - -
-
-
-

Properties

-
- -

Private _queue

-
_queue: Job[]
- -
-
- -

Private agenda

-
agenda: Agenda
- -
-
-
-

Accessors

-
- -

length

-
    -
  • get length(): number
  • -
- -
-
-
-

Methods

-
- -

getQueue

-
    -
  • getQueue(): Job[]
  • -
- -
-
- -

insert

-
    -
  • insert(job: Job): void
  • -
-
    -
  • - -
    -
    -

    Inserts job in queue where it will be order from left to right in decreasing - order of nextRunAt and priority (in case of same nextRunAt), if all values - are even the first jobs to be introduced will have priority

    -
    -
    -

    Parameters

    -
      -
    • -
      job: Job
      -
      -

      job to add to queue

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

pop

-
    -
  • pop(): Job | undefined
  • -
-
    -
  • - -
    -
    -

    Pops and returns last queue element (next job to be processed) without checking concurrency.

    -
    -
    -

    Returns Job | undefined

    -

    Next Job to be processed

    -
  • -
-
-
- -

remove

-
    -
  • remove(job: Job): void
  • -
-
    -
  • - -
    -
    -

    Inserts job in first queue position

    -
    -
    -

    Parameters

    -
      -
    • -
      job: Job
      -
      -

      job to add to queue

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

returnNextConcurrencyFreeJob

-
    -
  • returnNextConcurrencyFreeJob(jobStatus: {}, handledJobs: IJobParameters["_id"][]): (JobWithId & { attrs: IJobParameters & { nextRunAt: Date } }) | undefined
  • -
-
    -
  • - -
    -
    -

    Returns (does not pop, element remains in queue) first element (always from the right) - that can be processed (not blocked by concurrency execution)

    -
    -
    -

    Parameters

    -
      -
    • -
      jobStatus: {}
      -
      -

      current status of jobs

      -
      -
        -
      • -
        [jobName: string]: { running: number } | undefined
        -
      • -
      -
    • -
    • -
      handledJobs: IJobParameters["_id"][]
      -
    • -
    -

    Returns (JobWithId & { attrs: IJobParameters & { nextRunAt: Date } }) | undefined

    -

    Next Job to be processed

    -
  • -
-
-
-
- -
-
-
-
-

Legend

-
-
    -
  • Constructor
  • -
  • Property
  • -
  • Method
  • -
-
    -
  • Private property
  • -
  • Private method
  • -
-
    -
  • Property
  • -
-
    -
  • Inherited method
  • -
-
-
-
-
-

Generated using TypeDoc

-
-
- - - \ No newline at end of file diff --git a/docs/agenda/4.x/classes/jobprocessor.html b/docs/agenda/4.x/classes/jobprocessor.html deleted file mode 100644 index 7e757bb..0000000 --- a/docs/agenda/4.x/classes/jobprocessor.html +++ /dev/null @@ -1,826 +0,0 @@ - - - - - - JobProcessor | @hokify/agenda - - - - - -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
- - - - - - -
-
- Menu -
-
-
-
-
-
- -

Class JobProcessor

-
-
-
-
-
-
-
-
-
-
-
-

Hierarchy

-
    -
  • - JobProcessor -
  • -
-
-
-

Index

-
- -
-
-
-

Constructors

-
- -

constructor

-
    -
  • new JobProcessor(agenda: Agenda, maxConcurrency: number, totalLockLimit: number, processEvery: number): JobProcessor
  • -
- -
-
-
-

Properties

-
- -

Private agenda

-
agenda: Agenda
- -
-
- -

Private isLockingOnTheFly

-
isLockingOnTheFly: boolean = false
- -
-
- -

Private isRunning

-
isRunning: boolean = true
- -
-
- -

Private jobQueue

-
jobQueue: JobProcessingQueue = new JobProcessingQueue(this.agenda)
- -
-
- -

Private jobStatus

-
jobStatus: {}
- -
-

Type declaration

-
    -
  • -
    [name: string]: { locked: number; running: number } | undefined
    -
  • -
-
-
-
- -

Private jobsToLock

-
jobsToLock: JobWithId[] = []
- -
-
- -

Private localQueueProcessing

-
localQueueProcessing: number = 0
- -
-
- -

Private lockedJobs

-
lockedJobs: JobWithId[] = []
- -
-
- -

Private maxConcurrency

-
maxConcurrency: number
- -
-
- -

Private nextScanAt

-
nextScanAt: Date = new Date()
- -
-
- -

Private processEvery

-
processEvery: number
- -
-
- -

Private Optional processInterval

-
processInterval: ReturnType<typeof setInterval>
- -
-
- -

Private runningJobs

-
runningJobs: JobWithId[] = []
- -
-
- -

Private totalLockLimit

-
totalLockLimit: number
- -
-
-
-

Methods

-
- -

Private enqueueJob

-
    -
  • enqueueJob(job: Job): void
  • -
-
    -
  • - -
    -
    -

    Internal method that adds jobs to be processed to the local queue

    -
    -
    -

    Parameters

    -
      -
    • -
      job: Job
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

Private findAndLockNextJob

- - -
-
- -

getStatus

- - -
-
- -

Private jobProcessing

-
    -
  • jobProcessing(handledJobs?: IJobParameters["_id"][]): void
  • -
-
    -
  • - -
    -
    -

    Internal method that processes any jobs in the local queue (array) - handledJobs keeps list of already processed jobs

    -
    -
    -

    Parameters

    -
      -
    • -
      Default value handledJobs: IJobParameters["_id"][] = []
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

Private jobQueueFilling

-
    -
  • jobQueueFilling(name: string): Promise<void>
  • -
-
    -
  • - -
    -
    -

    Internal method used to fill a queue with jobs that can be run

    -
    -
    -

    Parameters

    -
      -
    • -
      name: string
      -
      -

      fill a queue with specific job name

      -
      -
    • -
    -

    Returns Promise<void>

    -
  • -
-
-
- -

lockOnTheFly

-
    -
  • lockOnTheFly(): Promise<void>
  • -
-
    -
  • - -
    -
    -

    Internal method that will lock a job and store it on MongoDB - This method is called when we immediately start to process a job without using the process interval - We do this because sometimes jobs are scheduled but will be run before the next process time

    -
    -
    -

    Returns Promise<void>

    -
  • -
-
-
- -

process

-
    -
  • process(extraJob?: JobWithId): Promise<void>
  • -
- -
-
- -

Private runOrRetry

-
    -
  • runOrRetry(job: JobWithId): Promise<void>
  • -
-
    -
  • - -
    -
    -

    Internal method that tries to run a job and if it fails, retries again!

    -
    -
    -

    Parameters

    - -

    Returns Promise<void>

    -

    processed a job or not

    -
  • -
-
-
- -

shouldLock

-
    -
  • shouldLock(name: string): boolean
  • -
-
    -
  • - -
    -
    -

    Returns true if a job of the specified name can be locked. - Considers maximum locked jobs at any time if self._lockLimit is > 0 - Considers maximum locked jobs of the specified name at any time if jobDefinition.lockLimit is > 0

    -
    -
    -

    Parameters

    -
      -
    • -
      name: string
      -
      -

      name of job to check if we should lock or not

      -
      -
    • -
    -

    Returns boolean

    -

    whether or not you should lock job

    -
  • -
-
-
- -

stop

- - -
-
- -

Private updateStatus

-
    -
  • updateStatus(name: string, key: "locked" | "running", number: -1 | 1): void
  • -
-
    -
  • - -

    Parameters

    -
      -
    • -
      name: string
      -
    • -
    • -
      key: "locked" | "running"
      -
    • -
    • -
      number: -1 | 1
      -
    • -
    -

    Returns void

    -
  • -
-
-
-
- -
-
-
-
-

Legend

-
-
    -
  • Constructor
  • -
  • Property
  • -
  • Method
  • -
-
    -
  • Private property
  • -
  • Private method
  • -
-
    -
  • Property
  • -
-
    -
  • Inherited method
  • -
-
-
-
-
-

Generated using TypeDoc

-
-
- - - \ No newline at end of file diff --git a/docs/agenda/4.x/globals.html b/docs/agenda/4.x/globals.html deleted file mode 100644 index 6857f00..0000000 --- a/docs/agenda/4.x/globals.html +++ /dev/null @@ -1,644 +0,0 @@ - - - - - - @hokify/agenda - - - - - -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
- - - - - - -
-
- Menu -
-
-
-
-
-
- -

@hokify/agenda

-
-
-
-
-
-
-
-

Index

-
- -
-
-
-

Type aliases

-
- -

DefinitionProcessor

-
DefinitionProcessor<DATA, CB>: (agendaJob: Job<DATA>, done: CB) => CB extends void ? Promise<void> : void
- -

Type parameters

-
    -
  • -

    DATA

    -
  • -
  • -

    CB

    -
  • -
-
-

Type declaration

-
    -
  • -
      -
    • (agendaJob: Job<DATA>, done: CB): CB extends void ? Promise<void> : void
    • -
    -
      -
    • -

      Parameters

      -
        -
      • -
        agendaJob: Job<DATA>
        -
      • -
      • -
        done: CB
        -
      • -
      -

      Returns CB extends void ? Promise<void> : void

      -
    • -
    -
  • -
-
-
-
- -

JobPriority

-
JobPriority: number | keyof typeof priorityMap
- -
-
- -

JobWithId

-
JobWithId: Job & { attrs: IJobParameters & { _id: ObjectId } }
- -
-
- -

TJobDatefield

-
TJobDatefield: keyof Pick<IJobParameters, "lastRunAt" | "lastFinishedAt" | "nextRunAt" | "failedAt" | "lockedAt">
- -
-
-
-

Variables

-
- -

agendaVersion

-
agendaVersion: any
- -
-
- -

Const datefields

-
datefields: Array<TJobDatefield> = ['lastRunAt','lastFinishedAt','nextRunAt','failedAt','lockedAt']
- -
-
- -

Const log

-
log: Debugger = debug('agenda:job')
- -
-
-
-

Functions

-
- -

calculateProcessEvery

-
    -
  • calculateProcessEvery(input?: number | string): number
  • -
-
    -
  • - -

    Parameters

    -
      -
    • -
      Default value input: number | string = 5000
      -
    • -
    -

    Returns number

    -
  • -
-
-
- -

Const computeFromInterval

- - -
-
- -

computeFromRepeatAt

- - -
-
- -

Const dateForTimezone

-
    -
  • dateForTimezone(timezoneDate: Date, timezone?: undefined | string): Moment
  • -
-
    -
  • - -

    Parameters

    -
      -
    • -
      timezoneDate: Date
      -
    • -
    • -
      Optional timezone: undefined | string
      -
    • -
    -

    Returns Moment

    -
  • -
-
-
- -

Const hasMongoProtocol

-
    -
  • hasMongoProtocol(url: string): boolean
  • -
- -
-
- -

isValidDate

-
    -
  • isValidDate(date: unknown): date is Date
  • -
- -
-
- -

isValidHumanInterval

-
    -
  • isValidHumanInterval(value: unknown): value is string
  • -
- -
-
- -

parsePriority

- -
    -
  • - -
    -
    -

    Internal method to turn priority into a number

    -
    -
    -

    Parameters

    - -

    Returns number

    -
  • -
-
-
-
-

Object literals

-
- -

Const priorityMap

-
priorityMap: object
- -
- -

high

-
high: number = 10
- -
-
- -

highest

-
highest: number = 20
- -
-
- -

low

-
low: number = -10
- -
-
- -

lowest

-
lowest: number = -20
- -
-
- -

normal

-
normal: number = 0
- -
-
-
-
- -
-
-
-
-

Legend

-
-
    -
  • Constructor
  • -
  • Property
  • -
  • Method
  • -
-
    -
  • Private property
  • -
  • Private method
  • -
-
    -
  • Property
  • -
-
    -
  • Inherited method
  • -
-
-
-
-
-

Generated using TypeDoc

-
-
- - - \ No newline at end of file diff --git a/docs/agenda/4.x/index.html b/docs/agenda/4.x/index.html deleted file mode 100644 index 6d050e5..0000000 --- a/docs/agenda/4.x/index.html +++ /dev/null @@ -1,1126 +0,0 @@ - - - - - - @hokify/agenda - - - - - -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
- - - - - - -
-
- Menu -
-
-
-
-
-
- -

@hokify/agenda

-
-
-
-
-
-
-
- -

Typescript rewrite of agendaJS

-
-

- Agenda -

-

- A light-weight job scheduling library for Node.js -

-

- Build Status - dependencies Status - devDependencies Status - Coverage Status -
-
-
-

- -

Fork

-
-

This is a fork of agenda js, it differs from the original version in following points:

-
    -
  • Complete rewrite in Typescript (fully typed!)
  • -
  • Supports mongoDB sharding by name
  • -
  • touch() can have an optional progress parameter (0-100)
  • -
  • Bugfixes and improvements for locking & job processing (concurrency, lockLimit,..)
  • -
  • Breaking change: define() config paramter moved from 2nd position to 3rd
  • -
  • getRunningStats()
  • -
  • automatically waits for agenda to be connected before calling any database operations
  • -
  • uses a database abstraction layer behind the scene
  • -
  • does not create a database index by default, either run
    db.agendaJogs.ensureIndex({
    -  "name" : 1,
    -  "nextRunAt" : 1,
    -  "priority" : -1,
    -  "lockedAt" : 1,
    -  "disabled" : 1
    -})
    - manually or set ensureIndex: true when initializing Agenda
  • -
- -

Agenda offers

-
-
    -
  • Minimal overhead. Agenda aims to keep its code base small.
  • -
  • Mongo backed persistence layer.
  • -
  • Promises based API.
  • -
  • Scheduling with configurable priority, concurrency, and repeating.
  • -
  • Scheduling via cron or human readable syntax.
  • -
  • Event backed job queue that you can hook into.
  • -
  • Agendash: optional standalone web-interface.
  • -
  • Agenda-rest: optional standalone REST API.
  • -
  • inversify-agenda - Some utilities for the development of agenda workers with Inversify
  • -
- -

Feature Comparison

-
-

Since there are a few job queue solutions, here a table comparing them to help you use the one that - better suits your needs.

-

Agenda is great if you need a MongoDB job scheduler, but try Bree if you need something simpler (built by a previous maintainer).

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FeatureBullBeeAgenda
Backendredisredismongo
Prioritiesβœ“βœ“
Concurrencyβœ“βœ“βœ“
Delayed jobsβœ“βœ“
Global eventsβœ“
Rate Limiterβœ“
Pause/Resumeβœ“
Sandboxed workerβœ“
Repeatable jobsβœ“βœ“
Atomic opsβœ“βœ“
Persistenceβœ“βœ“βœ“
UIβœ“βœ“
REST APIβœ“
Optimized forJobs / MessagesMessagesJobs
-

Kudos for making the comparison chart goes to Bull maintainers.

- -

Installation

-
-

Install via NPM

-
npm install @hokify/agenda
-

You will also need a working Mongo database (v3+) to point it to.

- -

Example Usage

-
-
const mongoConnectionString = 'mongodb://127.0.0.1/agenda';
-
-const agenda = new Agenda({db: {address: mongoConnectionString}});
-
-// Or override the default collection name:
-// const agenda = new Agenda({db: {address: mongoConnectionString, collection: 'jobCollectionName'}});
-
-// or pass additional connection options:
-// const agenda = new Agenda({db: {address: mongoConnectionString, collection: 'jobCollectionName', options: {ssl: true}}});
-
-// or pass in an existing mongodb-native MongoClient instance
-// const agenda = new Agenda({mongo: myMongoClient});
-
-agenda.define('delete old users', async job => {
-  await User.remove({lastLogIn: {$lt: twoDaysAgo}});
-});
-
-(async function() { // IIFE to give access to async/await
-  await agenda.start();
-
-  await agenda.every('3 minutes', 'delete old users');
-
-  // Alternatively, you could also do:
-  await agenda.every('*/3 * * * *', 'delete old users');
-})();
-
agenda.define('send email report', async job => {
-  const {to} = job.attrs.data;
-  await emailClient.send({
-    to,
-    from: 'example@example.com',
-    subject: 'Email Report',
-    body: '...'
-  });
-}, {priority: 'high', concurrency: 10}, );
-
-(async function() {
-  await agenda.start();
-  await agenda.schedule('in 20 minutes', 'send email report', {to: 'admin@example.com'});
-})();
-
(async function() {
-  const weeklyReport = agenda.create('send email report', {to: 'example@example.com'});
-  await agenda.start();
-  await weeklyReport.repeatEvery('1 week').save();
-})();
- -

Full documentation

-
-

See also https://hokify.github.io/agenda/agenda/4.x/index.html

-

Agenda's basic control structure is an instance of an agenda. Agenda's are - mapped to a database collection and load the jobs from within.

- -

Table of Contents

-
- - -

Configuring an agenda

-
-

All configuration methods are chainable, meaning you can do something like:

-
const agenda = new Agenda();
-agenda
-  .database(...)
-  .processEvery('3 minutes')
-  ...;
-

Possible agenda config options:

-
{
-    name: string;
-    defaultConcurrency: number;
-    processEvery: number;
-    maxConcurrency: number;
-    defaultLockLimit: number;
-    lockLimit: number;
-    defaultLockLifetime: number;
-    ensureIndex: boolean;
-    sort: SortOptionObject<IJobParameters>;
-    db: {
-        collection: string;
-        address: string;
-        options: MongoClientOptions;
-    };
-    mongo: Db;
-}
-

Agenda uses Human Interval for specifying the intervals. It supports the following units:

-

seconds, minutes, hours, days,weeks, months -- assumes 30 days, years -- assumes 365 days

-

More sophisticated examples

-
agenda.processEvery('one minute');
-agenda.processEvery('1.5 minutes');
-agenda.processEvery('3 days and 4 hours');
-agenda.processEvery('3 days, 4 hours and 36 seconds');
- -

database(url, [collectionName], [MongoClientOptions])

-
-

Specifies the database at the url specified. If no collection name is given, - agendaJobs is used.

-

By default useNewUrlParser and useUnifiedTopology is set to true,

-
agenda.database('localhost:27017/agenda-test', 'agendaJobs');
-

You can also specify it during instantiation.

-
const agenda = new Agenda({db: {address: 'localhost:27017/agenda-test', collection: 'agendaJobs'}});
-

Agenda will emit a ready event (see Agenda Events) when properly connected to the database. - It is safe to call agenda.start() without waiting for this event, as this is handled internally. - If you're using the db options, or call database, then you may still need to listen for ready before saving jobs.

- -

mongo(dbInstance, [collectionName])

-
-

Use an existing mongodb-native MongoClient/Db instance. This can help consolidate connections to a - database. You can instead use .database to have agenda handle connecting for you.

-

You can also specify it during instantiation:

-
const agenda = new Agenda({mongo: mongoClientInstance.db('agenda-test')});
-

Note that MongoClient.connect() returns a mongoClientInstance since node-mongodb-native 3.0.0, while it used to return a dbInstance that could then be directly passed to agenda.

- -

name(name)

-
-

Takes a string name and sets lastModifiedBy to it in the job database. - Useful for if you have multiple job processors (agendas) and want to see which - job queue last ran the job.

-
agenda.name(os.hostname + '-' + process.pid);
-

You can also specify it during instantiation

-
const agenda = new Agenda({name: 'test queue'});
- -

processEvery(interval)

-
-

Takes a string interval which can be either a traditional javascript number, - or a string such as 3 minutes

-

Specifies the frequency at which agenda will query the database looking for jobs - that need to be processed. Agenda internally uses setTimeout to guarantee that - jobs run at (close to ~3ms) the right time.

-

Decreasing the frequency will result in fewer database queries, but more jobs - being stored in memory.

-

Also worth noting is that if the job queue is shutdown, any jobs stored in memory - that haven't run will still be locked, meaning that you may have to wait for the - lock to expire. By default it is '5 seconds'.

-
agenda.processEvery('1 minute');
-

You can also specify it during instantiation

-
const agenda = new Agenda({processEvery: '30 seconds'});
- -

maxConcurrency(number)

-
-

Takes a number which specifies the max number of jobs that can be running at - any given moment. By default it is 20.

-
agenda.maxConcurrency(20);
-

You can also specify it during instantiation

-
const agenda = new Agenda({maxConcurrency: 20});
- -

defaultConcurrency(number)

-
-

Takes a number which specifies the default number of a specific job that can be running at - any given moment. By default it is 5.

-
agenda.defaultConcurrency(5);
-

You can also specify it during instantiation

-
const agenda = new Agenda({defaultConcurrency: 5});
- -

lockLimit(number)

-
-

Takes a number which specifies the max number jobs that can be locked at any given moment. By default it is 0 for no max.

-
agenda.lockLimit(0);
-

You can also specify it during instantiation

-
const agenda = new Agenda({lockLimit: 0});
- -

defaultLockLimit(number)

-
-

Takes a number which specifies the default number of a specific job that can be locked at any given moment. By default it is 0 for no max.

-
agenda.defaultLockLimit(0);
-

You can also specify it during instantiation

-
const agenda = new Agenda({defaultLockLimit: 0});
- -

defaultLockLifetime(number)

-
-

Takes a number which specifies the default lock lifetime in milliseconds. By - default it is 10 minutes. This can be overridden by specifying the - lockLifetime option to a defined job.

-

A job will unlock if it is finished (ie. the returned Promise resolves/rejects - or done is specified in the params and done() is called) before the - lockLifetime. The lock is useful if the job crashes or times out.

-
agenda.defaultLockLifetime(10000);
-

You can also specify it during instantiation

-
const agenda = new Agenda({defaultLockLifetime: 10000});
- -

sort(query)

-
-

Takes a query which specifies the sort query to be used for finding and locking the next job.

-

By default it is { nextRunAt: 1, priority: -1 }, which obeys a first in first out approach, with respect to priority.

- -

Agenda Events

-
-

An instance of an agenda will emit the following events:

-
    -
  • ready - called when Agenda mongo connection is successfully opened and indices created.
      If you're passing agenda an existing connection, you shouldn't need to listen for this, as `agenda.start()` will not resolve until indices have been created.
    -  If you're using the `db` options, or call `database`, then you may still need to listen for the `ready` event before saving jobs. `agenda.start()` will still wait for the connection to be opened.
    -
  • -
  • error - called when Agenda mongo connection process has thrown an error
  • -
-
await agenda.start();
- -

Defining Job Processors

-
-

Before you can use a job, you must define its processing behavior.

- -

define(jobName, fn, [options])

-
-

Defines a job with the name of jobName. When a job of jobName gets run, it - will be passed to fn(job, done). To maintain asynchronous behavior, you may - either provide a Promise-returning function in fn or provide done as a - second parameter to fn. If done is specified in the function signature, you - must call done() when you are processing the job. If your function is - synchronous or returns a Promise, you may omit done from the signature.

-

options is an optional argument which can overwrite the defaults. It can take - the following:

-
    -
  • concurrency: number maximum number of that job that can be running at once (per instance of agenda)
  • -
  • lockLimit: number maximum number of that job that can be locked at once (per instance of agenda)
  • -
  • lockLifetime: number interval in ms of how long the job stays locked for (see multiple job processors for more info). - A job will automatically unlock once a returned promise resolves/rejects (or if done is specified in the signature and done() is called).
  • -
  • priority: (lowest|low|normal|high|highest|number) specifies the priority - of the job. Higher priority jobs will run first. See the priority mapping - below
  • -
-

Priority mapping:

-
{
-  highest: 20,
-  high: 10,
-  normal: 0,
-  low: -10,
-  lowest: -20
-}
-

Async Job:

-
agenda.define('some long running job', async job => {
-  const data = await doSomelengthyTask();
-  await formatThatData(data);
-  await sendThatData(data);
-});
-

Async Job (using done):

-
agenda.define('some long running job', (job, done) => {
-  doSomelengthyTask(data => {
-    formatThatData(data);
-    sendThatData(data);
-    done();
-  });
-});
-

Sync Job:

-
agenda.define('say hello', job => {
-  console.log('Hello!');
-});
-

define() acts like an assignment: if define(jobName, ...) is called multiple times (e.g. every time your script starts), the definition in the last call will overwrite the previous one. Thus, if you define the jobName only once in your code, it's safe for that call to execute multiple times.

- -

Creating Jobs

-
- -

every(interval, name, [data], [options])

-
-

Runs job name at the given interval. Optionally, data and options can be passed in. - Every creates a job of type single, which means that it will only create one - job in the database, even if that line is run multiple times. This lets you put - it in a file that may get run multiple times, such as webserver.js which may - reboot from time to time.

-

interval can be a human-readable format String, a cron format String, or a Number.

-

data is an optional argument that will be passed to the processing function - under job.attrs.data.

-

options is an optional argument that will be passed to job.repeatEvery. - In order to use this argument, data must also be specified.

-

Returns the job.

-
agenda.define('printAnalyticsReport', async job => {
-  const users = await User.doSomethingReallyIntensive();
-  processUserData(users);
-  console.log('I print a report!');
-});
-
-agenda.every('15 minutes', 'printAnalyticsReport');
-

Optionally, name could be array of job names, which is convenient for scheduling - different jobs for same interval.

-
agenda.every('15 minutes', ['printAnalyticsReport', 'sendNotifications', 'updateUserRecords']);
-

In this case, every returns array of jobs.

- -

schedule(when, name, [data])

-
-

Schedules a job to run name once at a given time. when can be a Date or a - String such as tomorrow at 5pm.

-

data is an optional argument that will be passed to the processing function - under job.attrs.data.

-

Returns the job.

-
agenda.schedule('tomorrow at noon', 'printAnalyticsReport', {userCount: 100});
-

Optionally, name could be array of job names, similar to the every method.

-
agenda.schedule('tomorrow at noon', ['printAnalyticsReport', 'sendNotifications', 'updateUserRecords']);
-

In this case, schedule returns array of jobs.

- -

now(name, [data])

-
-

Schedules a job to run name once immediately.

-

data is an optional argument that will be passed to the processing function - under job.attrs.data.

-

Returns the job.

-
agenda.now('do the hokey pokey');
- -

create(jobName, data)

-
-

Returns an instance of a jobName with data. This does NOT save the job in - the database. See below to learn how to manually work with jobs.

-
const job = agenda.create('printAnalyticsReport', {userCount: 100});
-await job.save();
-console.log('Job successfully saved');
- -

Managing Jobs

-
- -

jobs(mongodb-native query, mongodb-native sort, mongodb-native limit, mongodb-native skip)

-
-

Lets you query (then sort, limit and skip the result) all of the jobs in the agenda job's database. These are full mongodb-native find, sort, limit and skip commands. See mongodb-native's documentation for details.

-
const jobs = await agenda.jobs({name: 'printAnalyticsReport'}, {data:-1}, 3, 1);
-// Work with jobs (see below)
- -

cancel(mongodb-native query)

-
-

Cancels any jobs matching the passed mongodb-native query, and removes them from the database. Returns a Promise resolving to the number of cancelled jobs, or rejecting on error.

-
const numRemoved = await agenda.cancel({name: 'printAnalyticsReport'});
-

This functionality can also be achieved by first retrieving all the jobs from the database using agenda.jobs(), looping through the resulting array and calling job.remove() on each. It is however preferable to use agenda.cancel() for this use case, as this ensures the operation is atomic.

- -

purge()

-
-

Removes all jobs in the database without defined behaviors. Useful if you change a definition name and want to remove old jobs. Returns a Promise resolving to the number of removed jobs, or rejecting on error.

-

IMPORTANT: Do not run this before you finish defining all of your jobs. If you do, you will nuke your database of jobs.

-
const numRemoved = await agenda.purge();
- -

Starting the job processor

-
-

To get agenda to start processing jobs from the database you must start it. This - will schedule an interval (based on processEvery) to check for new jobs and - run them. You can also stop the queue.

- -

start

-
-

Starts the job queue processing, checking processEvery time to see if there - are new jobs. Must be called after processEvery, and before any job scheduling (e.g. every).

- -

stop

-
-

Stops the job queue processing. Unlocks currently running jobs.

-

This can be very useful for graceful shutdowns so that currently running/grabbed jobs are abandoned so that other - job queues can grab them / they are unlocked should the job queue start again. Here is an example of how to do a graceful - shutdown.

-
async function graceful() {
-  await agenda.stop();
-  process.exit(0);
-}
-
-process.on('SIGTERM', graceful);
-process.on('SIGINT' , graceful);
- -

Multiple job processors

-
-

Sometimes you may want to have multiple node instances / machines process from - the same queue. Agenda supports a locking mechanism to ensure that multiple - queues don't process the same job.

-

You can configure the locking mechanism by specifying lockLifetime as an - interval when defining the job.

-
agenda.define('someJob', (job, cb) => {
-  // Do something in 10 seconds or less...
-}, {lockLifetime: 10000});
-

This will ensure that no other job processor (this one included) attempts to run the job again - for the next 10 seconds. If you have a particularly long running job, you will want to - specify a longer lockLifetime.

-

By default it is 10 minutes. Typically you shouldn't have a job that runs for 10 minutes, - so this is really insurance should the job queue crash before the job is unlocked.

-

When a job is finished (i.e. the returned promise resolves/rejects or done is - specified in the signature and done() is called), it will automatically unlock.

- -

Manually working with a job

-
-

A job instance has many instance methods. All mutating methods must be followed - with a call to await job.save() in order to persist the changes to the database.

- -

repeatEvery(interval, [options])

-
-

Specifies an interval on which the job should repeat. The job runs at the time of defining as well in configured intervals, that is "run now and in intervals".

-

interval can be a human-readable format String, a cron format String, or a Number.

-

options is an optional argument containing:

-

options.timezone: should be a string as accepted by moment-timezone and is considered when using an interval in the cron string format.

-

options.skipImmediate: true | false (default) Setting this true will skip the immediate run. The first run will occur only in configured interval.

-
job.repeatEvery('10 minutes');
-await job.save();
-
job.repeatEvery('3 minutes', {
-  skipImmediate: true
-});
-await job.save();
-
job.repeatEvery('0 6 * * *', {
-  timezone: 'America/New_York'
-});
-await job.save();
- -

repeatAt(time)

-
-

Specifies a time when the job should repeat. Possible values

-
job.repeatAt('3:30pm');
-await job.save();
- -

schedule(time)

-
-

Specifies the next time at which the job should run.

-
job.schedule('tomorrow at 6pm');
-await job.save();
- -

priority(priority)

-
-

Specifies the priority weighting of the job. Can be a number or a string from - the above priority table.

-
job.priority('low');
-await job.save();
- -

unique(properties, [options])

-
-

Ensure that only one instance of this job exists with the specified properties

-

options is an optional argument which can overwrite the defaults. It can take - the following:

-
    -
  • insertOnly: boolean will prevent any properties from persisting if the job already exists. Defaults to false.
  • -
-
job.unique({'data.type': 'active', 'data.userId': '123', nextRunAt: date});
-await job.save();
-

IMPORTANT: To avoid high CPU usage by MongoDB, make sure to create an index on the used fields, like data.type and data.userId for the example above.

- -

fail(reason)

-
-

Sets job.attrs.failedAt to now, and sets job.attrs.failReason to reason.

-

Optionally, reason can be an error, in which case job.attrs.failReason will - be set to error.message

-
job.fail('insufficient disk space');
-// or
-job.fail(new Error('insufficient disk space'));
-await job.save();
- -

run(callback)

-
-

Runs the given job and calls callback(err, job) upon completion. Normally - you never need to call this manually.

-
job.run((err, job) => {
-  console.log('I don\'t know why you would need to do this...');
-});
- -

save()

-
-

Saves the job.attrs into the database. Returns a Promise resolving to a Job instance, or rejecting on error.

-
try {
-  await job.save();
-  cosole.log('Successfully saved job to collection');
-} catch (e) {
-  console.error('Error saving job to collection');
-}
- -

remove()

-
-

Removes the job from the database. Returns a Promise resolving to the number of jobs removed, or rejecting on error.

-
try {
-  await job.remove();
-  console.log('Successfully removed job from collection');
-} catch (e) {
-  console.error('Error removing job from collection');
-}
- -

disable()

-
-

Disables the job. Upcoming runs won't execute.

- -

enable()

-
-

Enables the job if it got disabled before. Upcoming runs will execute.

- -

touch()

-
-

Resets the lock on the job. Useful to indicate that the job hasn't timed out - when you have very long running jobs. The call returns a promise that resolves - when the job's lock has been renewed.

-
agenda.define('super long job', async job => {
-  await doSomeLongTask();
-  await job.touch();
-  await doAnotherLongTask();
-  await job.touch();
-  await finishOurLongTasks();
-});
- -

Job Queue Events

-
-

An instance of an agenda will emit the following events:

-
    -
  • start - called just before a job starts
  • -
  • start:job name - called just before the specified job starts
  • -
-
agenda.on('start', job => {
-  console.log('Job %s starting', job.attrs.name);
-});
-
    -
  • complete - called when a job finishes, regardless of if it succeeds or fails
  • -
  • complete:job name - called when a job finishes, regardless of if it succeeds or fails
  • -
-
agenda.on('complete', job => {
-  console.log(`Job ${job.attrs.name} finished`);
-});
-
    -
  • success - called when a job finishes successfully
  • -
  • success:job name - called when a job finishes successfully
  • -
-
agenda.on('success:send email', job => {
-  console.log(`Sent Email Successfully to ${job.attrs.data.to}`);
-});
-
    -
  • fail - called when a job throws an error
  • -
  • fail:job name - called when a job throws an error
  • -
-
agenda.on('fail:send email', (err, job) => {
-  console.log(`Job failed with error: ${err.message}`);
-});
- -

Frequently Asked Questions

-
- -

What is the order in which jobs run?

-
-

Jobs are run with priority in a first in first out order (so they will be run in the order they were scheduled AND with respect to highest priority).

-

For example, if we have two jobs named "send-email" queued (both with the same priority), and the first job is queued at 3:00 PM and second job is queued at 3:05 PM with the same priority value, then the first job will run first if we start to send "send-email" jobs at 3:10 PM. However if the first job has a priority of 5 and the second job has a priority of 10, then the second will run first (priority takes precedence) at 3:10 PM.

-

The default MongoDB sort object is { nextRunAt: 1, priority: -1 } and can be changed through the option sort when configuring Agenda.

- -

What is the difference between lockLimit and maxConcurrency?

-
-

Agenda will lock jobs 1 by one, setting the lockedAt property in mongoDB, and creating an instance of the Job class which it caches into the _lockedJobs array. This defaults to having no limit, but can be managed using lockLimit. If all jobs will need to be run before agenda's next interval (set via agenda.processEvery), then agenda will attempt to lock all jobs.

-

Agenda will also pull jobs from _lockedJobs and into _runningJobs. These jobs are actively being worked on by user code, and this is limited by maxConcurrency (defaults to 20).

-

If you have multiple instances of agenda processing the same job definition with a fast repeat time you may find they get unevenly loaded. This is because they will compete to lock as many jobs as possible, even if they don't have enough concurrency to process them. This can be resolved by tweaking the maxConcurrency and lockLimit properties.

- -

Sample Project Structure?

-
-

Agenda doesn't have a preferred project structure and leaves it to the user to - choose how they would like to use it. That being said, you can check out the - example project structure below.

- -

Can I Donate?

-
-

Thanks! I'm flattered, but it's really not necessary. If you really want to, you can find my gittip here.

- -

Web Interface?

-
-

Agenda itself does not have a web interface built in but we do offer stand-alone web interface Agendash:

-

Agendash interface

- -

Mongo vs Redis

-
-

The decision to use Mongo instead of Redis is intentional. Redis is often used for - non-essential data (such as sessions) and without configuration doesn't - guarantee the same level of persistence as Mongo (should the server need to be - restarted/crash).

-

Agenda decides to focus on persistence without requiring special configuration - of Redis (thereby degrading the performance of the Redis server on non-critical - data, such as sessions).

-

Ultimately if enough people want a Redis driver instead of Mongo, I will write - one. (Please open an issue requesting it). For now, Agenda decided to focus on - guaranteed persistence.

- -

Spawning / forking processes

-
-

Ultimately Agenda can work from a single job queue across multiple machines, node processes, or forks. If you are interested in having more than one worker, Bars3s has written up a fantastic example of how one might do it:

-
const cluster = require('cluster');
-const os = require('os');
-
-const httpServer = require('./app/http-server');
-const jobWorker = require('./app/job-worker');
-
-const jobWorkers = [];
-const webWorkers = [];
-
-if (cluster.isMaster) {
-  const cpuCount = os.cpus().length;
-  // Create a worker for each CPU
-  for (let i = 0; i < cpuCount; i += 1) {
-    addJobWorker();
-    addWebWorker();
-  }
-
-  cluster.on('exit', (worker, code, signal) => {
-    if (jobWorkers.indexOf(worker.id) !== -1) {
-      console.log(`job worker ${worker.process.pid} exited (signal: ${signal}). Trying to respawn...`);
-      removeJobWorker(worker.id);
-      addJobWorker();
-    }
-
-    if (webWorkers.indexOf(worker.id) !== -1) {
-      console.log(`http worker ${worker.process.pid} exited (signal: ${signal}). Trying to respawn...`);
-      removeWebWorker(worker.id);
-      addWebWorker();
-    }
-  });
-} else {
-  if (process.env.web) {
-    console.log(`start http server: ${cluster.worker.id}`);
-    // Initialize the http server here
-    httpServer.start();
-  }
-
-  if (process.env.job) {
-    console.log(`start job server: ${cluster.worker.id}`);
-    // Initialize the Agenda here
-    jobWorker.start();
-  }
-}
-
-function addWebWorker() {
-  webWorkers.push(cluster.fork({web: 1}).id);
-}
-
-function addJobWorker() {
-  jobWorkers.push(cluster.fork({job: 1}).id);
-}
-
-function removeWebWorker(id) {
-  webWorkers.splice(webWorkers.indexOf(id), 1);
-}
-
-function removeJobWorker(id) {
-  jobWorkers.splice(jobWorkers.indexOf(id), 1);
-}
- -

Recovering lost Mongo connections ("auto_reconnect")

-
-

Agenda is configured by default to automatically reconnect indefinitely, emitting an error event - when no connection is available on each process tick, allowing you to restore the Mongo - instance without having to restart the application.

-

However, if you are using an existing Mongo client - you'll need to configure the reconnectTries and reconnectInterval connection settings - manually, otherwise you'll find that Agenda will throw an error with the message "MongoDB connection is not recoverable, - application restart required" if the connection cannot be recovered within 30 seconds.

- -

Example Project Structure

-
-

Agenda will only process jobs that it has definitions for. This allows you to - selectively choose which jobs a given agenda will process.

-

Consider the following project structure, which allows us to share models with - the rest of our code base, and specify which jobs a worker processes, if any at - all.

-
- server.js
-- worker.js
-lib/
-  - agenda.js
-  controllers/
-    - user-controller.js
-  jobs/
-    - email.js
-    - video-processing.js
-    - image-processing.js
-   models/
-     - user-model.js
-     - blog-post.model.js
-

Sample job processor (eg. jobs/email.js)

-
let email = require('some-email-lib'),
-  User = require('../models/user-model.js');
-
-module.exports = function(agenda) {
-  agenda.define('registration email', async job => {
-    const user = await User.get(job.attrs.data.userId);
-    await email(user.email(), 'Thanks for registering', 'Thanks for registering ' + user.name());
-  });
-
-  agenda.define('reset password', async job => {
-    // Etc
-  });
-
-  // More email related jobs
-};
-

lib/agenda.js

-
const Agenda = require('agenda');
-
-const connectionOpts = {db: {address: 'localhost:27017/agenda-test', collection: 'agendaJobs'}};
-
-const agenda = new Agenda(connectionOpts);
-
-const jobTypes = process.env.JOB_TYPES ? process.env.JOB_TYPES.split(',') : [];
-
-jobTypes.forEach(type => {
-  require('./jobs/' + type)(agenda);
-});
-
-if (jobTypes.length) {
-  agenda.start(); // Returns a promise, which should be handled appropriately
-}
-
-module.exports = agenda;
-

lib/controllers/user-controller.js

-
let app = express(),
-  User = require('../models/user-model'),
-  agenda = require('../worker.js');
-
-app.post('/users', (req, res, next) => {
-  const user = new User(req.body);
-  user.save(err => {
-    if (err) {
-      return next(err);
-    }
-    agenda.now('registration email', {userId: user.primary()});
-    res.send(201, user.toJson());
-  });
-});
-

worker.js

-
require('./lib/agenda.js');
-

Now you can do the following in your project:

-
node server.js
-

Fire up an instance with no JOB_TYPES, giving you the ability to process jobs, - but not wasting resources processing jobs.

-
JOB_TYPES=email node server.js
-

Allow your http server to process email jobs.

-
JOB_TYPES=email node worker.js
-

Fire up an instance that processes email jobs.

-
JOB_TYPES=video-processing,image-processing node worker.js
-

Fire up an instance that processes video-processing/image-processing jobs. Good for a heavy hitting server.

- -

Debugging Issues

-
-

If you think you have encountered a bug, please feel free to report it here:

-

Submit Issue

-

Please provide us with as much details as possible such as:

-
    -
  • Agenda version
  • -
  • Environment (OSX, Linux, Windows, etc)
  • -
  • Small description of what happened
  • -
  • Any relevant stack track
  • -
  • Agenda logs (see below)
  • -
- -

To turn on logging, please set your DEBUG env variable like so:

-
-
    -
  • OSX: DEBUG="agenda:*" node index.js
  • -
  • Linux: DEBUG="agenda:*" node index.js
  • -
  • Windows CMD: set DEBUG=agenda:*
  • -
  • Windows PowerShell: $env:DEBUG = "agenda:*"
  • -
-

While not necessary, attaching a text file with this debug information would - be extremely useful in debugging certain issues and is encouraged.

- -

Known Issues

-
- -

"Multiple order-by items are not supported. Please specify a single order-by item."

-
-

When running Agenda on Azure cosmosDB, you might run into this issue caused by Agenda's sort query used for finding and locking the next job. To fix this, you can pass custom sort option: sort: { nextRunAt: 1 }

- -

Acknowledgements

-
- - -

License

-
-

The MIT License

-
-
- -
-
-
-
-

Legend

-
-
    -
  • Constructor
  • -
  • Property
  • -
  • Method
  • -
-
    -
  • Private property
  • -
  • Private method
  • -
-
    -
  • Property
  • -
-
    -
  • Inherited method
  • -
-
-
-
-
-

Generated using TypeDoc

-
-
- - - \ No newline at end of file diff --git a/docs/agenda/4.x/interfaces/iagendaconfig.html b/docs/agenda/4.x/interfaces/iagendaconfig.html deleted file mode 100644 index 3932db7..0000000 --- a/docs/agenda/4.x/interfaces/iagendaconfig.html +++ /dev/null @@ -1,327 +0,0 @@ - - - - - - IAgendaConfig | @hokify/agenda - - - - - -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
- - - - - - -
-
- Menu -
-
-
-
-
-
- -

Interface IAgendaConfig

-
-
-
-
-
-
-
-

Hierarchy

-
    -
  • - IAgendaConfig -
  • -
-
-
-

Index

-
- -
-
-
-

Properties

-
- -

defaultConcurrency

-
defaultConcurrency: number
- -
-
- -

defaultLockLifetime

-
defaultLockLifetime: number
- -
-
- -

defaultLockLimit

-
defaultLockLimit: number
- -
-
- -

lockLimit

-
lockLimit: number
- -
-
- -

maxConcurrency

-
maxConcurrency: number
- -
-
- -

Optional name

-
name: undefined | string
- -
-
- -

processEvery

-
processEvery: number
- -
-
-
- -
-
-
-
-

Legend

-
-
    -
  • Constructor
  • -
  • Property
  • -
  • Method
  • -
-
    -
  • Private property
  • -
  • Private method
  • -
-
    -
  • Property
  • -
-
    -
  • Inherited method
  • -
-
-
-
-
-

Generated using TypeDoc

-
-
- - - \ No newline at end of file diff --git a/docs/agenda/4.x/interfaces/iagendajobstatus.html b/docs/agenda/4.x/interfaces/iagendajobstatus.html deleted file mode 100644 index 89e4df6..0000000 --- a/docs/agenda/4.x/interfaces/iagendajobstatus.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - - - IAgendaJobStatus | @hokify/agenda - - - - - -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
- - - - - - -
-
- Menu -
-
-
-
-
-
- -

Interface IAgendaJobStatus

-
-
-
-
-
-
-
-

Hierarchy

-
    -
  • - IAgendaJobStatus -
  • -
-
-
-

Indexable

-
[name: string]: { config: IJobDefinition; locked: number; running: number }
-
    -
  • -
    config: IJobDefinition
    -
  • -
  • -
    locked: number
    -
  • -
  • -
    running: number
    -
  • -
-
-
- -
-
-
-
-

Legend

-
-
    -
  • Constructor
  • -
  • Property
  • -
  • Method
  • -
-
    -
  • Private property
  • -
  • Private method
  • -
-
    -
  • Property
  • -
-
    -
  • Inherited method
  • -
-
-
-
-
-

Generated using TypeDoc

-
-
- - - \ No newline at end of file diff --git a/docs/agenda/4.x/interfaces/iagendastatus.html b/docs/agenda/4.x/interfaces/iagendastatus.html deleted file mode 100644 index 7f0cdc7..0000000 --- a/docs/agenda/4.x/interfaces/iagendastatus.html +++ /dev/null @@ -1,405 +0,0 @@ - - - - - - IAgendaStatus | @hokify/agenda - - - - - -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
- - - - - - -
-
- Menu -
-
-
-
-
-
- -

Interface IAgendaStatus

-
-
-
-
-
-
-
-

Hierarchy

-
    -
  • - IAgendaStatus -
  • -
-
-
-

Index

-
- -
-
-
-

Properties

-
- -

config

-
config: { maxConcurrency: number; processEvery: string | number; totalLockLimit: number }
- -
-

Type declaration

-
    -
  • -
    maxConcurrency: number
    -
  • -
  • -
    processEvery: string | number
    -
  • -
  • -
    totalLockLimit: number
    -
  • -
-
-
-
- -

internal

-
internal: { localQueueProcessing: number }
- -
-

Type declaration

-
    -
  • -
    localQueueProcessing: number
    -
  • -
-
-
-
- -

isLockingOnTheFly

-
isLockingOnTheFly: boolean
- -
-
- -

Optional jobStatus

-
jobStatus: IAgendaJobStatus
- -
-
- -

jobsToLock

-
jobsToLock: number | IJobParameters[]
- -
-
- -

lockedJobs

-
lockedJobs: number | IJobParameters[]
- -
-
- -

queueName

-
queueName: string | undefined
- -
-
- -

queuedJobs

-
queuedJobs: number | IJobParameters[]
- -
-
- -

runningJobs

-
runningJobs: number | IJobParameters[]
- -
-
- -

totalQueueSizeDB

-
totalQueueSizeDB: number
- -
-
- -

version

-
version: string
- -
-
-
- -
-
-
-
-

Legend

-
-
    -
  • Constructor
  • -
  • Property
  • -
  • Method
  • -
-
    -
  • Private property
  • -
  • Private method
  • -
-
    -
  • Property
  • -
-
    -
  • Inherited method
  • -
-
-
-
-
-

Generated using TypeDoc

-
-
- - - \ No newline at end of file diff --git a/docs/agenda/4.x/interfaces/idatabaseoptions.html b/docs/agenda/4.x/interfaces/idatabaseoptions.html deleted file mode 100644 index 5b35ac1..0000000 --- a/docs/agenda/4.x/interfaces/idatabaseoptions.html +++ /dev/null @@ -1,257 +0,0 @@ - - - - - - IDatabaseOptions | @hokify/agenda - - - - - -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
- - - - - - -
-
- Menu -
-
-
-
-
-
- -

Interface IDatabaseOptions

-
-
-
-
-
-
-
-

Hierarchy

-
    -
  • - IDatabaseOptions -
  • -
-
-
-

Index

-
-
-
-

Properties

- -
-
-
-
-
-

Properties

-
- -

db

-
db: { address: string; collection?: undefined | string; options?: MongoClientOptions }
- -
-

Type declaration

-
    -
  • -
    address: string
    -
  • -
  • -
    Optional collection?: undefined | string
    -
  • -
  • -
    Optional options?: MongoClientOptions
    -
  • -
-
-
-
-
- -
-
-
-
-

Legend

-
-
    -
  • Constructor
  • -
  • Property
  • -
  • Method
  • -
-
    -
  • Private property
  • -
  • Private method
  • -
-
    -
  • Property
  • -
-
    -
  • Inherited method
  • -
-
-
-
-
-

Generated using TypeDoc

-
-
- - - \ No newline at end of file diff --git a/docs/agenda/4.x/interfaces/idbconfig.html b/docs/agenda/4.x/interfaces/idbconfig.html deleted file mode 100644 index 2ffd7d3..0000000 --- a/docs/agenda/4.x/interfaces/idbconfig.html +++ /dev/null @@ -1,257 +0,0 @@ - - - - - - IDbConfig | @hokify/agenda - - - - - -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
- - - - - - -
-
- Menu -
-
-
-
-
-
- -

Interface IDbConfig

-
-
-
-
-
-
-
-

Hierarchy

-
    -
  • - IDbConfig -
  • -
-
-
-

Index

-
-
-
-

Properties

- -
-
-
-
-
-

Properties

-
- -

Optional ensureIndex

-
ensureIndex: undefined | false | true
- -
-
- -

Optional sort

-
sort: SortOptionObject<IJobParameters>
- -
-
-
- -
-
-
-
-

Legend

-
-
    -
  • Constructor
  • -
  • Property
  • -
  • Method
  • -
-
    -
  • Private property
  • -
  • Private method
  • -
-
    -
  • Property
  • -
-
    -
  • Inherited method
  • -
-
-
-
-
-

Generated using TypeDoc

-
-
- - - \ No newline at end of file diff --git a/docs/agenda/4.x/interfaces/ijobdefinition.html b/docs/agenda/4.x/interfaces/ijobdefinition.html deleted file mode 100644 index 8a44b53..0000000 --- a/docs/agenda/4.x/interfaces/ijobdefinition.html +++ /dev/null @@ -1,327 +0,0 @@ - - - - - - IJobDefinition | @hokify/agenda - - - - - -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
- - - - - - -
-
- Menu -
-
-
-
-
-
- -

Interface IJobDefinition<DATA>

-
-
-
-
-
-
-
-

Type parameters

-
    -
  • -

    DATA = unknown

    -
  • -
-
-
-

Hierarchy

-
    -
  • - IJobDefinition -
  • -
-
-
-

Index

-
-
-
-

Properties

- -
-
-
-
-
-

Properties

-
- -

Optional concurrency

-
concurrency: undefined | number
- -
-
-

how many jobs of this kind can run in parallel/simultanously per Agenda instance

-
-
-
-
- -

fn

-
fn: DefinitionProcessor<DATA, void | ((error?: Error) => void)>
- -
-
- -

lockLifetime

-
lockLifetime: number
- -
-
-

lock lifetime in milliseconds

-
-
-
-
- -

lockLimit

-
lockLimit: number
- -
-
-

max number of locked jobs of this kind

-
-
-
-
- -

Optional priority

-
priority: undefined | number
- -
-
-

Higher priority jobs will run first.

-
-
-
-
-
- -
-
-
-
-

Legend

-
-
    -
  • Constructor
  • -
  • Property
  • -
  • Method
  • -
-
    -
  • Private property
  • -
  • Private method
  • -
-
    -
  • Property
  • -
-
    -
  • Inherited method
  • -
-
-
-
-
-

Generated using TypeDoc

-
-
- - - \ No newline at end of file diff --git a/docs/agenda/4.x/interfaces/ijobparameters.html b/docs/agenda/4.x/interfaces/ijobparameters.html deleted file mode 100644 index ba13f61..0000000 --- a/docs/agenda/4.x/interfaces/ijobparameters.html +++ /dev/null @@ -1,523 +0,0 @@ - - - - - - IJobParameters | @hokify/agenda - - - - - -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
- - - - - - -
-
- Menu -
-
-
-
-
-
- -

Interface IJobParameters<DATA>

-
-
-
-
-
-
-
-

Type parameters

-
    -
  • -

    DATA = unknown | void

    -
  • -
-
-
-

Hierarchy

-
    -
  • - IJobParameters -
  • -
-
-
-

Index

-
- -
-
-
-

Properties

-
- -

Optional _id

-
_id: ObjectId
- -
-
- -

data

-
data: DATA
- -
-
- -

Optional disabled

-
disabled: undefined | false | true
- -
-
- -

Optional failCount

-
failCount: undefined | number
- -
-
- -

Optional failReason

-
failReason: undefined | string
- -
-
- -

Optional failedAt

-
failedAt: Date
- -
-
- -

Optional lastFinishedAt

-
lastFinishedAt: Date
- -
-
- -

Optional lastModifiedBy

-
lastModifiedBy: undefined | string
- -
-
- -

Optional lastRunAt

-
lastRunAt: Date
- -
-
- -

Optional lockedAt

-
lockedAt: Date
- -
-
- -

name

-
name: string
- -
-
- -

nextRunAt

-
nextRunAt: Date | null
- -
-
- -

priority

-
priority: number
- -
-
- -

Optional progress

-
progress: undefined | number
- -
-
- -

Optional repeatAt

-
repeatAt: undefined | string
- -
-
- -

Optional repeatInterval

-
repeatInterval: string | number
- -
-
- -

Optional repeatTimezone

-
repeatTimezone: undefined | string
- -
-
- -

type

-
type: "normal" | "single"
- -
-
-

normal: job is queued and will be processed (regular case when the user adds a new job) - single: job with this name is only queued once, if there is an exisitn gentry in the database, the job is just updated, but not newly inserted (this is used for .every())

-
-
-
-
- -

Optional unique

-
unique: FilterQuery<IJobParameters<DATA>>
- -
-
- -

Optional uniqueOpts

-
uniqueOpts: undefined | { insertOnly: boolean }
- -
-
-
- -
-
-
-
-

Legend

-
-
    -
  • Constructor
  • -
  • Property
  • -
  • Method
  • -
-
    -
  • Private property
  • -
  • Private method
  • -
-
    -
  • Property
  • -
-
    -
  • Inherited method
  • -
-
-
-
-
-

Generated using TypeDoc

-
-
- - - \ No newline at end of file diff --git a/docs/agenda/4.x/interfaces/imongooptions.html b/docs/agenda/4.x/interfaces/imongooptions.html deleted file mode 100644 index 08dbc6e..0000000 --- a/docs/agenda/4.x/interfaces/imongooptions.html +++ /dev/null @@ -1,257 +0,0 @@ - - - - - - IMongoOptions | @hokify/agenda - - - - - -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
- - - - - - -
-
- Menu -
-
-
-
-
-
- -

Interface IMongoOptions

-
-
-
-
-
-
-
-

Hierarchy

-
    -
  • - IMongoOptions -
  • -
-
-
-

Index

-
-
-
-

Properties

- -
-
-
-
-
-

Properties

-
- -

Optional db

-
db: undefined | { collection?: undefined | string }
- -
-
- -

mongo

-
mongo: Db
- -
-
-
- -
-
-
-
-

Legend

-
-
    -
  • Constructor
  • -
  • Property
  • -
  • Method
  • -
-
    -
  • Private property
  • -
  • Private method
  • -
-
    -
  • Property
  • -
-
    -
  • Inherited method
  • -
-
-
-
-
-

Generated using TypeDoc

-
-
- - - \ No newline at end of file diff --git a/docs/agenda/6.x/.nojekyll b/docs/agenda/6.x/.nojekyll deleted file mode 100644 index e2ac661..0000000 --- a/docs/agenda/6.x/.nojekyll +++ /dev/null @@ -1 +0,0 @@ -TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/docs/agenda/6.x/assets/highlight.css b/docs/agenda/6.x/assets/highlight.css deleted file mode 100644 index 92ac88c..0000000 --- a/docs/agenda/6.x/assets/highlight.css +++ /dev/null @@ -1,113 +0,0 @@ -:root { - --light-hl-0: #001080; - --dark-hl-0: #9CDCFE; - --light-hl-1: #000000; - --dark-hl-1: #D4D4D4; - --light-hl-2: #795E26; - --dark-hl-2: #DCDCAA; - --light-hl-3: #A31515; - --dark-hl-3: #CE9178; - --light-hl-4: #098658; - --dark-hl-4: #B5CEA8; - --light-hl-5: #0000FF; - --dark-hl-5: #569CD6; - --light-hl-6: #0070C1; - --dark-hl-6: #4FC1FF; - --light-hl-7: #008000; - --dark-hl-7: #6A9955; - --light-hl-8: #AF00DB; - --dark-hl-8: #C586C0; - --light-hl-9: #000000; - --dark-hl-9: #C8C8C8; - --light-hl-10: #267F99; - --dark-hl-10: #4EC9B0; - --light-hl-11: #EE0000; - --dark-hl-11: #D7BA7D; - --light-hl-12: #000000FF; - --dark-hl-12: #D4D4D4; - --light-code-background: #F5F5F5; - --dark-code-background: #1E1E1E; -} - -@media (prefers-color-scheme: light) { :root { - --hl-0: var(--light-hl-0); - --hl-1: var(--light-hl-1); - --hl-2: var(--light-hl-2); - --hl-3: var(--light-hl-3); - --hl-4: var(--light-hl-4); - --hl-5: var(--light-hl-5); - --hl-6: var(--light-hl-6); - --hl-7: var(--light-hl-7); - --hl-8: var(--light-hl-8); - --hl-9: var(--light-hl-9); - --hl-10: var(--light-hl-10); - --hl-11: var(--light-hl-11); - --hl-12: var(--light-hl-12); - --code-background: var(--light-code-background); -} } - -@media (prefers-color-scheme: dark) { :root { - --hl-0: var(--dark-hl-0); - --hl-1: var(--dark-hl-1); - --hl-2: var(--dark-hl-2); - --hl-3: var(--dark-hl-3); - --hl-4: var(--dark-hl-4); - --hl-5: var(--dark-hl-5); - --hl-6: var(--dark-hl-6); - --hl-7: var(--dark-hl-7); - --hl-8: var(--dark-hl-8); - --hl-9: var(--dark-hl-9); - --hl-10: var(--dark-hl-10); - --hl-11: var(--dark-hl-11); - --hl-12: var(--dark-hl-12); - --code-background: var(--dark-code-background); -} } - -body.light { - --hl-0: var(--light-hl-0); - --hl-1: var(--light-hl-1); - --hl-2: var(--light-hl-2); - --hl-3: var(--light-hl-3); - --hl-4: var(--light-hl-4); - --hl-5: var(--light-hl-5); - --hl-6: var(--light-hl-6); - --hl-7: var(--light-hl-7); - --hl-8: var(--light-hl-8); - --hl-9: var(--light-hl-9); - --hl-10: var(--light-hl-10); - --hl-11: var(--light-hl-11); - --hl-12: var(--light-hl-12); - --code-background: var(--light-code-background); -} - -body.dark { - --hl-0: var(--dark-hl-0); - --hl-1: var(--dark-hl-1); - --hl-2: var(--dark-hl-2); - --hl-3: var(--dark-hl-3); - --hl-4: var(--dark-hl-4); - --hl-5: var(--dark-hl-5); - --hl-6: var(--dark-hl-6); - --hl-7: var(--dark-hl-7); - --hl-8: var(--dark-hl-8); - --hl-9: var(--dark-hl-9); - --hl-10: var(--dark-hl-10); - --hl-11: var(--dark-hl-11); - --hl-12: var(--dark-hl-12); - --code-background: var(--dark-code-background); -} - -.hl-0 { color: var(--hl-0); } -.hl-1 { color: var(--hl-1); } -.hl-2 { color: var(--hl-2); } -.hl-3 { color: var(--hl-3); } -.hl-4 { color: var(--hl-4); } -.hl-5 { color: var(--hl-5); } -.hl-6 { color: var(--hl-6); } -.hl-7 { color: var(--hl-7); } -.hl-8 { color: var(--hl-8); } -.hl-9 { color: var(--hl-9); } -.hl-10 { color: var(--hl-10); } -.hl-11 { color: var(--hl-11); } -.hl-12 { color: var(--hl-12); } -pre, code { background: var(--code-background); } diff --git a/docs/agenda/6.x/assets/icons.css b/docs/agenda/6.x/assets/icons.css deleted file mode 100644 index 776a356..0000000 --- a/docs/agenda/6.x/assets/icons.css +++ /dev/null @@ -1,1043 +0,0 @@ -.tsd-kind-icon { - display: block; - position: relative; - padding-left: 20px; - text-indent: -20px; -} -.tsd-kind-icon:before { - content: ""; - display: inline-block; - vertical-align: middle; - width: 17px; - height: 17px; - margin: 0 3px 2px 0; - background-image: url(./icons.png); -} -@media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { - .tsd-kind-icon:before { - background-image: url(./icons@2x.png); - background-size: 238px 204px; - } -} - -.tsd-signature.tsd-kind-icon:before { - background-position: 0 -153px; -} - -.tsd-kind-object-literal > .tsd-kind-icon:before { - background-position: 0px -17px; -} -.tsd-kind-object-literal.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -17px; -} -.tsd-kind-object-literal.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -17px; -} - -.tsd-kind-class > .tsd-kind-icon:before { - background-position: 0px -34px; -} -.tsd-kind-class.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -34px; -} -.tsd-kind-class.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -34px; -} - -.tsd-kind-class.tsd-has-type-parameter > .tsd-kind-icon:before { - background-position: 0px -51px; -} -.tsd-kind-class.tsd-has-type-parameter.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -17px -51px; -} -.tsd-kind-class.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -51px; -} - -.tsd-kind-interface > .tsd-kind-icon:before { - background-position: 0px -68px; -} -.tsd-kind-interface.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -68px; -} -.tsd-kind-interface.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -68px; -} - -.tsd-kind-interface.tsd-has-type-parameter > .tsd-kind-icon:before { - background-position: 0px -85px; -} -.tsd-kind-interface.tsd-has-type-parameter.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -17px -85px; -} -.tsd-kind-interface.tsd-has-type-parameter.tsd-is-private - > .tsd-kind-icon:before { - background-position: -34px -85px; -} - -.tsd-kind-namespace > .tsd-kind-icon:before { - background-position: 0px -102px; -} -.tsd-kind-namespace.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -102px; -} -.tsd-kind-namespace.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -102px; -} - -.tsd-kind-module > .tsd-kind-icon:before { - background-position: 0px -102px; -} -.tsd-kind-module.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -102px; -} -.tsd-kind-module.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -102px; -} - -.tsd-kind-enum > .tsd-kind-icon:before { - background-position: 0px -119px; -} -.tsd-kind-enum.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -119px; -} -.tsd-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -119px; -} - -.tsd-kind-enum-member > .tsd-kind-icon:before { - background-position: 0px -136px; -} -.tsd-kind-enum-member.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -136px; -} -.tsd-kind-enum-member.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -136px; -} - -.tsd-kind-signature > .tsd-kind-icon:before { - background-position: 0px -153px; -} -.tsd-kind-signature.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -153px; -} -.tsd-kind-signature.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -153px; -} - -.tsd-kind-type-alias > .tsd-kind-icon:before { - background-position: 0px -170px; -} -.tsd-kind-type-alias.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -170px; -} -.tsd-kind-type-alias.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -170px; -} - -.tsd-kind-type-alias.tsd-has-type-parameter > .tsd-kind-icon:before { - background-position: 0px -187px; -} -.tsd-kind-type-alias.tsd-has-type-parameter.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -17px -187px; -} -.tsd-kind-type-alias.tsd-has-type-parameter.tsd-is-private - > .tsd-kind-icon:before { - background-position: -34px -187px; -} - -.tsd-kind-variable > .tsd-kind-icon:before { - background-position: -136px -0px; -} -.tsd-kind-variable.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -0px; -} -.tsd-kind-variable.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -0px; -} -.tsd-kind-variable.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -0px; -} -.tsd-kind-variable.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -0px; -} -.tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -0px; -} -.tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -0px; -} -.tsd-kind-variable.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -0px; -} -.tsd-kind-variable.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -0px; -} -.tsd-kind-variable.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -0px; -} -.tsd-kind-variable.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -0px; -} -.tsd-kind-variable.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -0px; -} -.tsd-kind-variable.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -0px; -} - -.tsd-kind-property > .tsd-kind-icon:before { - background-position: -136px -0px; -} -.tsd-kind-property.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -0px; -} -.tsd-kind-property.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -0px; -} -.tsd-kind-property.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -0px; -} -.tsd-kind-property.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -0px; -} -.tsd-kind-property.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -0px; -} -.tsd-kind-property.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -0px; -} -.tsd-kind-property.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -0px; -} -.tsd-kind-property.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -0px; -} -.tsd-kind-property.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -0px; -} -.tsd-kind-property.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -0px; -} -.tsd-kind-property.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -0px; -} -.tsd-kind-property.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -0px; -} - -.tsd-kind-get-signature > .tsd-kind-icon:before { - background-position: -136px -17px; -} -.tsd-kind-get-signature.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -17px; -} -.tsd-kind-get-signature.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -17px; -} - -.tsd-kind-set-signature > .tsd-kind-icon:before { - background-position: -136px -34px; -} -.tsd-kind-set-signature.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -34px; -} -.tsd-kind-set-signature.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -34px; -} - -.tsd-kind-accessor > .tsd-kind-icon:before { - background-position: -136px -51px; -} -.tsd-kind-accessor.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -51px; -} -.tsd-kind-accessor.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -51px; -} - -.tsd-kind-function > .tsd-kind-icon:before { - background-position: -136px -68px; -} -.tsd-kind-function.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -68px; -} -.tsd-kind-function.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -68px; -} -.tsd-kind-function.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -68px; -} -.tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -68px; -} -.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -68px; -} -.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -68px; -} -.tsd-kind-function.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -68px; -} -.tsd-kind-function.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -68px; -} -.tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -68px; -} -.tsd-kind-function.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -68px; -} -.tsd-kind-function.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -68px; -} -.tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -68px; -} - -.tsd-kind-method > .tsd-kind-icon:before { - background-position: -136px -68px; -} -.tsd-kind-method.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -68px; -} -.tsd-kind-method.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -68px; -} -.tsd-kind-method.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -68px; -} -.tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -68px; -} -.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -68px; -} -.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -68px; -} -.tsd-kind-method.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -68px; -} -.tsd-kind-method.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -68px; -} -.tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { - background-position: -187px -68px; -} -.tsd-kind-method.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -68px; -} -.tsd-kind-method.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -68px; -} -.tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -68px; -} - -.tsd-kind-call-signature > .tsd-kind-icon:before { - background-position: -136px -68px; -} -.tsd-kind-call-signature.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -68px; -} -.tsd-kind-call-signature.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -68px; -} - -.tsd-kind-function.tsd-has-type-parameter > .tsd-kind-icon:before { - background-position: -136px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -153px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class - > .tsd-kind-icon:before { - background-position: -51px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum - > .tsd-kind-icon:before { - background-position: -170px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface - > .tsd-kind-icon:before { - background-position: -204px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -85px; -} - -.tsd-kind-method.tsd-has-type-parameter > .tsd-kind-icon:before { - background-position: -136px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -153px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class - > .tsd-kind-icon:before { - background-position: -51px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum - > .tsd-kind-icon:before { - background-position: -170px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface - > .tsd-kind-icon:before { - background-position: -204px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -85px; -} - -.tsd-kind-constructor > .tsd-kind-icon:before { - background-position: -136px -102px; -} -.tsd-kind-constructor.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -102px; -} -.tsd-kind-constructor.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -102px; -} - -.tsd-kind-constructor-signature > .tsd-kind-icon:before { - background-position: -136px -102px; -} -.tsd-kind-constructor-signature.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -102px; -} -.tsd-kind-constructor-signature.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-interface - > .tsd-kind-icon:before { - background-position: -204px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -102px; -} - -.tsd-kind-index-signature > .tsd-kind-icon:before { - background-position: -136px -119px; -} -.tsd-kind-index-signature.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -119px; -} -.tsd-kind-index-signature.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -119px; -} - -.tsd-kind-event > .tsd-kind-icon:before { - background-position: -136px -136px; -} -.tsd-kind-event.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -136px; -} -.tsd-kind-event.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -136px; -} -.tsd-kind-event.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -136px; -} -.tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -68px -136px; -} -.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { - background-position: -85px -136px; -} -.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -136px; -} -.tsd-kind-event.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -136px; -} -.tsd-kind-event.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -136px; -} -.tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { - background-position: -187px -136px; -} -.tsd-kind-event.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -136px; -} -.tsd-kind-event.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -136px; -} -.tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -136px; -} - -.tsd-is-static > .tsd-kind-icon:before { - background-position: -136px -153px; -} -.tsd-is-static.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -153px; -} -.tsd-is-static.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -153px; -} -.tsd-is-static.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -153px; -} -.tsd-is-static.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -68px -153px; -} -.tsd-is-static.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { - background-position: -85px -153px; -} -.tsd-is-static.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -153px; -} -.tsd-is-static.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -153px; -} -.tsd-is-static.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -153px; -} -.tsd-is-static.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { - background-position: -187px -153px; -} -.tsd-is-static.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -153px; -} -.tsd-is-static.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -153px; -} -.tsd-is-static.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -153px; -} - -.tsd-is-static.tsd-kind-function > .tsd-kind-icon:before { - background-position: -136px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-interface - > .tsd-kind-icon:before { - background-position: -204px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -170px; -} - -.tsd-is-static.tsd-kind-method > .tsd-kind-icon:before { - background-position: -136px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-interface - > .tsd-kind-icon:before { - background-position: -204px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -170px; -} - -.tsd-is-static.tsd-kind-call-signature > .tsd-kind-icon:before { - background-position: -136px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -153px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class - > .tsd-kind-icon:before { - background-position: -51px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum - > .tsd-kind-icon:before { - background-position: -170px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface - > .tsd-kind-icon:before { - background-position: -204px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -170px; -} - -.tsd-is-static.tsd-kind-event > .tsd-kind-icon:before { - background-position: -136px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-interface - > .tsd-kind-icon:before { - background-position: -204px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -187px; -} diff --git a/docs/agenda/6.x/assets/icons.png b/docs/agenda/6.x/assets/icons.png deleted file mode 100644 index 3836d5f..0000000 Binary files a/docs/agenda/6.x/assets/icons.png and /dev/null differ diff --git a/docs/agenda/6.x/assets/icons@2x.png b/docs/agenda/6.x/assets/icons@2x.png deleted file mode 100644 index 5a209e2..0000000 Binary files a/docs/agenda/6.x/assets/icons@2x.png and /dev/null differ diff --git a/docs/agenda/6.x/assets/main.js b/docs/agenda/6.x/assets/main.js deleted file mode 100644 index 54869f4..0000000 --- a/docs/agenda/6.x/assets/main.js +++ /dev/null @@ -1,52 +0,0 @@ -(()=>{var Ce=Object.create;var J=Object.defineProperty;var Pe=Object.getOwnPropertyDescriptor;var Oe=Object.getOwnPropertyNames;var Re=Object.getPrototypeOf,_e=Object.prototype.hasOwnProperty;var Me=t=>J(t,"__esModule",{value:!0});var Fe=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var De=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Oe(e))!_e.call(t,i)&&(r||i!=="default")&&J(t,i,{get:()=>e[i],enumerable:!(n=Pe(e,i))||n.enumerable});return t},Ae=(t,e)=>De(Me(J(t!=null?Ce(Re(t)):{},"default",!e&&t&&t.__esModule?{get:()=>t.default,enumerable:!0}:{value:t,enumerable:!0})),t);var de=Fe((ce,he)=>{(function(){var t=function(e){var r=new t.Builder;return r.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),r.searchPipeline.add(t.stemmer),e.call(r,r),r.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(r){e.console&&console.warn&&console.warn(r)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var r=Object.create(null),n=Object.keys(e),i=0;i0){var h=t.utils.clone(r)||{};h.position=[a,l],h.index=s.length,s.push(new t.Token(n.slice(a,o),h))}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,r){r in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+r),e.label=r,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var r=e.label&&e.label in this.registeredFunctions;r||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. -`,e)},t.Pipeline.load=function(e){var r=new t.Pipeline;return e.forEach(function(n){var i=t.Pipeline.registeredFunctions[n];if(i)r.add(i);else throw new Error("Cannot load unregistered function: "+n)}),r},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(r){t.Pipeline.warnIfFunctionNotRegistered(r),this._stack.push(r)},this)},t.Pipeline.prototype.after=function(e,r){t.Pipeline.warnIfFunctionNotRegistered(r);var n=this._stack.indexOf(e);if(n==-1)throw new Error("Cannot find existingFn");n=n+1,this._stack.splice(n,0,r)},t.Pipeline.prototype.before=function(e,r){t.Pipeline.warnIfFunctionNotRegistered(r);var n=this._stack.indexOf(e);if(n==-1)throw new Error("Cannot find existingFn");this._stack.splice(n,0,r)},t.Pipeline.prototype.remove=function(e){var r=this._stack.indexOf(e);r!=-1&&this._stack.splice(r,1)},t.Pipeline.prototype.run=function(e){for(var r=this._stack.length,n=0;n1&&(oe&&(n=s),o!=e);)i=n-r,s=r+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ou?h+=2:a==u&&(r+=n[l+1]*i[h+1],l+=2,h+=2);return r},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),r=1,n=0;r0){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 u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}if(s.str.length==0&&(u.final=!0),i.push({node:u,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 l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}s.str.length==1&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var h=s.str.charAt(0),p=s.str.charAt(1),v;p in s.node.edges?v=s.node.edges[p]:(v=new t.TokenSet,s.node.edges[p]=v),s.str.length==1&&(v.final=!0),i.push({node:v,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return n},t.TokenSet.fromString=function(e){for(var r=new t.TokenSet,n=r,i=0,s=e.length;i=e;r--){var n=this.uncheckedNodes[r],i=n.child.toString();i in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[i]:(n.child._str=i,this.minimizedNodes[i]=n.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(r){var n=new t.QueryParser(e,r);n.parse()})},t.Index.prototype.query=function(e){for(var r=new t.Query(this.fields),n=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,r){var n=e[this._ref],i=Object.keys(this._fields);this._documents[n]=r||{},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,r;do e=this.next(),r=e.charCodeAt(0);while(r>47&&r<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 r=e.next();if(r==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(r.charCodeAt(0)==92){e.escapeCharacter();continue}if(r==":")return t.QueryLexer.lexField;if(r=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(r=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(r=="+"&&e.width()===1||r=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(r.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,r){this.lexer=new t.QueryLexer(e),this.query=r,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 r=e.peekLexeme();if(r!=null)switch(r.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 n="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(n+=" with value '"+r.str+"'"),new t.QueryParseError(n,r.start,r.end)}},t.QueryParser.parsePresence=function(e){var r=e.consumeLexeme();if(r!=null){switch(r.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+r.str+"'";throw new t.QueryParseError(n,r.start,r.end)}var i=e.peekLexeme();if(i==null){var n="expecting term or field, found nothing";throw new t.QueryParseError(n,r.start,r.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var n="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(n,i.start,i.end)}}},t.QueryParser.parseField=function(e){var r=e.consumeLexeme();if(r!=null){if(e.query.allFields.indexOf(r.str)==-1){var n=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+r.str+"', possible fields: "+n;throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.fields=[r.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,r.start,r.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 r=e.consumeLexeme();if(r!=null){e.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(n==null){e.nextClause();return}switch(n.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 '"+n.type+"'";throw new t.QueryParseError(i,n.start,n.end)}}},t.QueryParser.parseEditDistance=function(e){var r=e.consumeLexeme();if(r!=null){var n=parseInt(r.str,10);if(isNaN(n)){var i="edit distance must be numeric";throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.editDistance=n;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 r=e.consumeLexeme();if(r!=null){var n=parseInt(r.str,10);if(isNaN(n)){var i="boost must be numeric";throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.boost=n;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,r){typeof define=="function"&&define.amd?define(r):typeof ce=="object"?he.exports=r():e.lunr=r()}(this,function(){return t})})()});var le=[];function N(t,e){le.push({selector:e,constructor:t})}var X=class{constructor(){this.createComponents(document.body)}createComponents(e){le.forEach(r=>{e.querySelectorAll(r.selector).forEach(n=>{n.dataset.hasInstance||(new r.constructor({el:n}),n.dataset.hasInstance=String(!0))})})}};var Q=class{constructor(e){this.el=e.el}};var Z=class{constructor(){this.listeners={}}addEventListener(e,r){e in this.listeners||(this.listeners[e]=[]),this.listeners[e].push(r)}removeEventListener(e,r){if(!(e in this.listeners))return;let n=this.listeners[e];for(let i=0,s=n.length;i{let r=Date.now();return(...n)=>{r+e-Date.now()<0&&(t(...n),r=Date.now())}};var ee=class extends Z{constructor(){super();this.scrollTop=0;this.lastY=0;this.width=0;this.height=0;this.showToolbar=!0;this.toolbar=document.querySelector(".tsd-page-toolbar"),this.secondaryNav=document.querySelector(".tsd-navigation.secondary"),window.addEventListener("scroll",K(()=>this.onScroll(),10)),window.addEventListener("resize",K(()=>this.onResize(),10)),this.onResize(),this.onScroll()}triggerResize(){let e=new CustomEvent("resize",{detail:{width:this.width,height:this.height}});this.dispatchEvent(e)}onResize(){this.width=window.innerWidth||0,this.height=window.innerHeight||0;let e=new CustomEvent("resize",{detail:{width:this.width,height:this.height}});this.dispatchEvent(e)}onScroll(){this.scrollTop=window.scrollY||0;let e=new CustomEvent("scroll",{detail:{scrollTop:this.scrollTop}});this.dispatchEvent(e),this.hideShowToolbar()}hideShowToolbar(){var r;let e=this.showToolbar;this.showToolbar=this.lastY>=this.scrollTop||this.scrollTop<=0,e!==this.showToolbar&&(this.toolbar.classList.toggle("tsd-page-toolbar--hide"),(r=this.secondaryNav)==null||r.classList.toggle("tsd-navigation--toolbar-hide")),this.lastY=this.scrollTop}},I=ee;I.instance=new ee;var te=class extends Q{constructor(e){super(e);this.anchors=[];this.index=-1;I.instance.addEventListener("resize",()=>this.onResize()),I.instance.addEventListener("scroll",r=>this.onScroll(r)),this.createAnchors()}createAnchors(){let e=window.location.href;e.indexOf("#")!=-1&&(e=e.substr(0,e.indexOf("#"))),this.el.querySelectorAll("a").forEach(r=>{let n=r.href;if(n.indexOf("#")==-1||n.substr(0,e.length)!=e)return;let i=n.substr(n.indexOf("#")+1),s=document.querySelector("a.tsd-anchor[name="+i+"]"),o=r.parentNode;!s||!o||this.anchors.push({link:o,anchor:s,position:0})}),this.onResize()}onResize(){let e;for(let n=0,i=this.anchors.length;nn.position-i.position);let r=new CustomEvent("scroll",{detail:{scrollTop:I.instance.scrollTop}});this.onScroll(r)}onScroll(e){let r=e.detail.scrollTop+5,n=this.anchors,i=n.length-1,s=this.index;for(;s>-1&&n[s].position>r;)s-=1;for(;s-1&&this.anchors[this.index].link.classList.remove("focus"),this.index=s,this.index>-1&&this.anchors[this.index].link.classList.add("focus"))}};var ue=(t,e=100)=>{let r;return(...n)=>{clearTimeout(r),r=setTimeout(()=>t(n),e)}};var me=Ae(de());function ve(){let t=document.getElementById("tsd-search");if(!t)return;let e=document.getElementById("search-script");t.classList.add("loading"),e&&(e.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),e.addEventListener("load",()=>{t.classList.remove("loading"),t.classList.add("ready")}),window.searchData&&t.classList.remove("loading"));let r=document.querySelector("#tsd-search input"),n=document.querySelector("#tsd-search .results");if(!r||!n)throw new Error("The input field or the result list wrapper was not found");let i=!1;n.addEventListener("mousedown",()=>i=!0),n.addEventListener("mouseup",()=>{i=!1,t.classList.remove("has-focus")}),r.addEventListener("focus",()=>t.classList.add("has-focus")),r.addEventListener("blur",()=>{i||(i=!1,t.classList.remove("has-focus"))});let s={base:t.dataset.base+"/"};Ve(t,n,r,s)}function Ve(t,e,r,n){r.addEventListener("input",ue(()=>{ze(t,e,r,n)},200));let i=!1;r.addEventListener("keydown",s=>{i=!0,s.key=="Enter"?Ne(e,r):s.key=="Escape"?r.blur():s.key=="ArrowUp"?fe(e,-1):s.key==="ArrowDown"?fe(e,1):i=!1}),r.addEventListener("keypress",s=>{i&&s.preventDefault()}),document.body.addEventListener("keydown",s=>{s.altKey||s.ctrlKey||s.metaKey||!r.matches(":focus")&&s.key==="/"&&(r.focus(),s.preventDefault())})}function He(t,e){t.index||window.searchData&&(e.classList.remove("loading"),e.classList.add("ready"),t.data=window.searchData,t.index=me.Index.load(window.searchData.index))}function ze(t,e,r,n){if(He(n,t),!n.index||!n.data)return;e.textContent="";let i=r.value.trim(),s=n.index.search(`*${i}*`);for(let o=0,a=Math.min(10,s.length);o${pe(u.parent,i)}.${l}`);let h=document.createElement("li");h.classList.value=u.classes;let p=document.createElement("a");p.href=n.base+u.url,p.classList.add("tsd-kind-icon"),p.innerHTML=l,h.append(p),e.appendChild(h)}}function fe(t,e){let r=t.querySelector(".current");if(!r)r=t.querySelector(e==1?"li:first-child":"li:last-child"),r&&r.classList.add("current");else{let n=r;if(e===1)do n=n.nextElementSibling;while(n instanceof HTMLElement&&n.offsetParent==null);else do n=n.previousElementSibling;while(n instanceof HTMLElement&&n.offsetParent==null);n&&(r.classList.remove("current"),n.classList.add("current"))}}function Ne(t,e){let r=t.querySelector(".current");if(r||(r=t.querySelector("li:first-child")),r){let n=r.querySelector("a");n&&(window.location.href=n.href),e.blur()}}function pe(t,e){if(e==="")return t;let r=t.toLocaleLowerCase(),n=e.toLocaleLowerCase(),i=[],s=0,o=r.indexOf(n);for(;o!=-1;)i.push(re(t.substring(s,o)),`${re(t.substring(o,o+n.length))}`),s=o+n.length,o=r.indexOf(n,s);return i.push(re(t.substring(s))),i.join("")}var je={"&":"&","<":"<",">":">","'":"'",'"':"""};function re(t){return t.replace(/[&<>"'"]/g,e=>je[e])}var ge=class{constructor(e,r){this.signature=e,this.description=r}addClass(e){return this.signature.classList.add(e),this.description.classList.add(e),this}removeClass(e){return this.signature.classList.remove(e),this.description.classList.remove(e),this}},ne=class extends Q{constructor(e){super(e);this.groups=[];this.index=-1;this.createGroups(),this.container&&(this.el.classList.add("active"),Array.from(this.el.children).forEach(r=>{r.addEventListener("touchstart",n=>this.onClick(n)),r.addEventListener("click",n=>this.onClick(n))}),this.container.classList.add("active"),this.setIndex(0))}setIndex(e){if(e<0&&(e=0),e>this.groups.length-1&&(e=this.groups.length-1),this.index==e)return;let r=this.groups[e];if(this.index>-1){let n=this.groups[this.index];n.removeClass("current").addClass("fade-out"),r.addClass("current"),r.addClass("fade-in"),I.instance.triggerResize(),setTimeout(()=>{n.removeClass("fade-out"),r.removeClass("fade-in")},300)}else r.addClass("current"),I.instance.triggerResize();this.index=e}createGroups(){let e=this.el.children;if(e.length<2)return;this.container=this.el.nextElementSibling;let r=this.container.children;this.groups=[];for(let n=0;n{r.signature===e.currentTarget&&this.setIndex(n)})}};var C="mousedown",xe="mousemove",_="mouseup",G={x:0,y:0},ye=!1,ie=!1,Be=!1,A=!1,Le=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(Le?"is-mobile":"not-mobile");Le&&"ontouchstart"in document.documentElement&&(Be=!0,C="touchstart",xe="touchmove",_="touchend");document.addEventListener(C,t=>{ie=!0,A=!1;let e=C=="touchstart"?t.targetTouches[0]:t;G.y=e.pageY||0,G.x=e.pageX||0});document.addEventListener(xe,t=>{if(!!ie&&!A){let e=C=="touchstart"?t.targetTouches[0]:t,r=G.x-(e.pageX||0),n=G.y-(e.pageY||0);A=Math.sqrt(r*r+n*n)>10}});document.addEventListener(_,()=>{ie=!1});document.addEventListener("click",t=>{ye&&(t.preventDefault(),t.stopImmediatePropagation(),ye=!1)});var se=class extends Q{constructor(e){super(e);this.className=this.el.dataset.toggle||"",this.el.addEventListener(_,r=>this.onPointerUp(r)),this.el.addEventListener("click",r=>r.preventDefault()),document.addEventListener(C,r=>this.onDocumentPointerDown(r)),document.addEventListener(_,r=>this.onDocumentPointerUp(r))}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 r=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(r),setTimeout(()=>document.documentElement.classList.remove(r),500)}onPointerUp(e){A||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-menu, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!A&&this.active&&e.target.closest(".col-menu")){let r=e.target.closest("a");if(r){let n=window.location.href;n.indexOf("#")!=-1&&(n=n.substr(0,n.indexOf("#"))),r.href.substr(0,n.length)==n&&setTimeout(()=>this.setActive(!1),250)}}}};var ae=class{constructor(e,r){this.key=e,this.value=r,this.defaultValue=r,this.initialize(),window.localStorage[this.key]&&this.setValue(this.fromLocalStorage(window.localStorage[this.key]))}initialize(){}setValue(e){if(this.value==e)return;let r=this.value;this.value=e,window.localStorage[this.key]=this.toLocalStorage(e),this.handleValueChange(r,e)}},oe=class extends ae{initialize(){let e=document.querySelector("#tsd-filter-"+this.key);!e||(this.checkbox=e,this.checkbox.addEventListener("change",()=>{this.setValue(this.checkbox.checked)}))}handleValueChange(e,r){!this.checkbox||(this.checkbox.checked=this.value,document.documentElement.classList.toggle("toggle-"+this.key,this.value!=this.defaultValue))}fromLocalStorage(e){return e=="true"}toLocalStorage(e){return e?"true":"false"}},Ee=class extends ae{initialize(){document.documentElement.classList.add("toggle-"+this.key+this.value);let e=document.querySelector("#tsd-filter-"+this.key);if(!e)return;this.select=e;let r=()=>{this.select.classList.add("active")},n=()=>{this.select.classList.remove("active")};this.select.addEventListener(C,r),this.select.addEventListener("mouseover",r),this.select.addEventListener("mouseleave",n),this.select.querySelectorAll("li").forEach(i=>{i.addEventListener(_,s=>{e.classList.remove("active"),this.setValue(s.target.dataset.value||"")})}),document.addEventListener(C,i=>{this.select.contains(i.target)||this.select.classList.remove("active")})}handleValueChange(e,r){this.select.querySelectorAll("li.selected").forEach(s=>{s.classList.remove("selected")});let n=this.select.querySelector('li[data-value="'+r+'"]'),i=this.select.querySelector(".tsd-select-label");n&&i&&(n.classList.add("selected"),i.textContent=n.textContent),document.documentElement.classList.remove("toggle-"+e),document.documentElement.classList.add("toggle-"+r)}fromLocalStorage(e){return e}toLocalStorage(e){return e}},Y=class extends Q{constructor(e){super(e);this.optionVisibility=new Ee("visibility","private"),this.optionInherited=new oe("inherited",!0),this.optionExternals=new oe("externals",!0)}static isSupported(){try{return typeof window.localStorage!="undefined"}catch{return!1}}};function we(t){let e=localStorage.getItem("tsd-theme")||"os";t.value=e,be(e),t.addEventListener("change",()=>{localStorage.setItem("tsd-theme",t.value),be(t.value)})}function be(t){switch(t){case"os":document.body.classList.remove("light","dark");break;case"light":document.body.classList.remove("dark"),document.body.classList.add("light");break;case"dark":document.body.classList.remove("light"),document.body.classList.add("dark");break}}ve();N(te,".menu-highlight");N(ne,".tsd-signatures");N(se,"a[data-toggle]");Y.isSupported()?N(Y,"#tsd-filter"):document.documentElement.classList.add("no-filter");var Te=document.getElementById("theme");Te&&we(Te);var qe=new X;Object.defineProperty(window,"app",{value:qe});})(); -/*! - * lunr.Builder - * Copyright (C) 2020 Oliver Nightingale - */ -/*! - * lunr.Index - * Copyright (C) 2020 Oliver Nightingale - */ -/*! - * lunr.Pipeline - * Copyright (C) 2020 Oliver Nightingale - */ -/*! - * lunr.Set - * Copyright (C) 2020 Oliver Nightingale - */ -/*! - * lunr.TokenSet - * Copyright (C) 2020 Oliver Nightingale - */ -/*! - * lunr.Vector - * Copyright (C) 2020 Oliver Nightingale - */ -/*! - * lunr.stemmer - * Copyright (C) 2020 Oliver Nightingale - * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt - */ -/*! - * lunr.stopWordFilter - * Copyright (C) 2020 Oliver Nightingale - */ -/*! - * lunr.tokenizer - * Copyright (C) 2020 Oliver Nightingale - */ -/*! - * lunr.trimmer - * Copyright (C) 2020 Oliver Nightingale - */ -/*! - * lunr.utils - * Copyright (C) 2020 Oliver Nightingale - */ -/** - * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 - * Copyright (C) 2020 Oliver Nightingale - * @license MIT - */ diff --git a/docs/agenda/6.x/assets/search.js b/docs/agenda/6.x/assets/search.js deleted file mode 100644 index adc7829..0000000 --- a/docs/agenda/6.x/assets/search.js +++ /dev/null @@ -1 +0,0 @@ -window.searchData = JSON.parse("{\"kinds\":{\"32\":\"Variable\",\"128\":\"Class\",\"256\":\"Interface\",\"512\":\"Constructor\",\"1024\":\"Property\",\"2048\":\"Method\",\"65536\":\"Type literal\",\"4194304\":\"Type alias\"},\"rows\":[{\"id\":0,\"kind\":128,\"name\":\"Agenda\",\"url\":\"classes/Agenda.html\",\"classes\":\"tsd-kind-class\"},{\"id\":1,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/Agenda.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class tsd-is-overwrite\",\"parent\":\"Agenda\"},{\"id\":2,\"kind\":1024,\"name\":\"attrs\",\"url\":\"classes/Agenda.html#attrs\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Agenda\"},{\"id\":3,\"kind\":1024,\"name\":\"db\",\"url\":\"classes/Agenda.html#db\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Agenda\"},{\"id\":4,\"kind\":2048,\"name\":\"on\",\"url\":\"classes/Agenda.html#on\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite\",\"parent\":\"Agenda\"},{\"id\":5,\"kind\":1024,\"name\":\"definitions\",\"url\":\"classes/Agenda.html#definitions\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Agenda\"},{\"id\":6,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/Agenda.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"Agenda\"},{\"id\":7,\"kind\":1024,\"name\":\"jobProcessor\",\"url\":\"classes/Agenda.html#jobProcessor\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"Agenda\"},{\"id\":8,\"kind\":1024,\"name\":\"ready\",\"url\":\"classes/Agenda.html#ready\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Agenda\"},{\"id\":9,\"kind\":2048,\"name\":\"isActiveJobProcessor\",\"url\":\"classes/Agenda.html#isActiveJobProcessor\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Agenda\"},{\"id\":10,\"kind\":2048,\"name\":\"getRunningStats\",\"url\":\"classes/Agenda.html#getRunningStats\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Agenda\"},{\"id\":11,\"kind\":2048,\"name\":\"database\",\"url\":\"classes/Agenda.html#database\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Agenda\"},{\"id\":12,\"kind\":2048,\"name\":\"mongo\",\"url\":\"classes/Agenda.html#mongo\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Agenda\"},{\"id\":13,\"kind\":2048,\"name\":\"sort\",\"url\":\"classes/Agenda.html#sort\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Agenda\"},{\"id\":14,\"kind\":2048,\"name\":\"hasDatabaseConfig\",\"url\":\"classes/Agenda.html#hasDatabaseConfig\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-private\",\"parent\":\"Agenda\"},{\"id\":15,\"kind\":2048,\"name\":\"cancel\",\"url\":\"classes/Agenda.html#cancel\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Agenda\"},{\"id\":16,\"kind\":2048,\"name\":\"name\",\"url\":\"classes/Agenda.html#name\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Agenda\"},{\"id\":17,\"kind\":2048,\"name\":\"processEvery\",\"url\":\"classes/Agenda.html#processEvery\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Agenda\"},{\"id\":18,\"kind\":2048,\"name\":\"maxConcurrency\",\"url\":\"classes/Agenda.html#maxConcurrency\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Agenda\"},{\"id\":19,\"kind\":2048,\"name\":\"defaultConcurrency\",\"url\":\"classes/Agenda.html#defaultConcurrency\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Agenda\"},{\"id\":20,\"kind\":2048,\"name\":\"lockLimit\",\"url\":\"classes/Agenda.html#lockLimit\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Agenda\"},{\"id\":21,\"kind\":2048,\"name\":\"defaultLockLimit\",\"url\":\"classes/Agenda.html#defaultLockLimit\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Agenda\"},{\"id\":22,\"kind\":2048,\"name\":\"defaultLockLifetime\",\"url\":\"classes/Agenda.html#defaultLockLifetime\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Agenda\"},{\"id\":23,\"kind\":2048,\"name\":\"jobs\",\"url\":\"classes/Agenda.html#jobs\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Agenda\"},{\"id\":24,\"kind\":2048,\"name\":\"purge\",\"url\":\"classes/Agenda.html#purge\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Agenda\"},{\"id\":25,\"kind\":2048,\"name\":\"define\",\"url\":\"classes/Agenda.html#define\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter\",\"parent\":\"Agenda\"},{\"id\":26,\"kind\":2048,\"name\":\"createJobs\",\"url\":\"classes/Agenda.html#createJobs\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter tsd-is-private\",\"parent\":\"Agenda\"},{\"id\":27,\"kind\":2048,\"name\":\"create\",\"url\":\"classes/Agenda.html#create\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter\",\"parent\":\"Agenda\"},{\"id\":28,\"kind\":2048,\"name\":\"every\",\"url\":\"classes/Agenda.html#every\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter\",\"parent\":\"Agenda\"},{\"id\":29,\"kind\":2048,\"name\":\"schedule\",\"url\":\"classes/Agenda.html#schedule\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter\",\"parent\":\"Agenda\"},{\"id\":30,\"kind\":2048,\"name\":\"now\",\"url\":\"classes/Agenda.html#now\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter\",\"parent\":\"Agenda\"},{\"id\":31,\"kind\":2048,\"name\":\"start\",\"url\":\"classes/Agenda.html#start\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Agenda\"},{\"id\":32,\"kind\":2048,\"name\":\"stop\",\"url\":\"classes/Agenda.html#stop\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Agenda\"},{\"id\":33,\"kind\":256,\"name\":\"IAgendaConfig\",\"url\":\"interfaces/IAgendaConfig.html\",\"classes\":\"tsd-kind-interface\"},{\"id\":34,\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/IAgendaConfig.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IAgendaConfig\"},{\"id\":35,\"kind\":1024,\"name\":\"defaultConcurrency\",\"url\":\"interfaces/IAgendaConfig.html#defaultConcurrency\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IAgendaConfig\"},{\"id\":36,\"kind\":1024,\"name\":\"processEvery\",\"url\":\"interfaces/IAgendaConfig.html#processEvery\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IAgendaConfig\"},{\"id\":37,\"kind\":1024,\"name\":\"maxConcurrency\",\"url\":\"interfaces/IAgendaConfig.html#maxConcurrency\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IAgendaConfig\"},{\"id\":38,\"kind\":1024,\"name\":\"defaultLockLimit\",\"url\":\"interfaces/IAgendaConfig.html#defaultLockLimit\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IAgendaConfig\"},{\"id\":39,\"kind\":1024,\"name\":\"lockLimit\",\"url\":\"interfaces/IAgendaConfig.html#lockLimit\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IAgendaConfig\"},{\"id\":40,\"kind\":1024,\"name\":\"defaultLockLifetime\",\"url\":\"interfaces/IAgendaConfig.html#defaultLockLifetime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IAgendaConfig\"},{\"id\":41,\"kind\":256,\"name\":\"IJobDefinition\",\"url\":\"interfaces/IJobDefinition.html\",\"classes\":\"tsd-kind-interface tsd-has-type-parameter\"},{\"id\":42,\"kind\":1024,\"name\":\"lockLimit\",\"url\":\"interfaces/IJobDefinition.html#lockLimit\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IJobDefinition\"},{\"id\":43,\"kind\":1024,\"name\":\"lockLifetime\",\"url\":\"interfaces/IJobDefinition.html#lockLifetime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IJobDefinition\"},{\"id\":44,\"kind\":1024,\"name\":\"priority\",\"url\":\"interfaces/IJobDefinition.html#priority\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IJobDefinition\"},{\"id\":45,\"kind\":1024,\"name\":\"concurrency\",\"url\":\"interfaces/IJobDefinition.html#concurrency\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IJobDefinition\"},{\"id\":46,\"kind\":1024,\"name\":\"fn\",\"url\":\"interfaces/IJobDefinition.html#fn\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IJobDefinition\"},{\"id\":47,\"kind\":4194304,\"name\":\"DefinitionProcessor\",\"url\":\"modules.html#DefinitionProcessor\",\"classes\":\"tsd-kind-type-alias tsd-has-type-parameter\"},{\"id\":48,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules.html#DefinitionProcessor.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"DefinitionProcessor\"},{\"id\":49,\"kind\":256,\"name\":\"IJobParameters\",\"url\":\"interfaces/IJobParameters.html\",\"classes\":\"tsd-kind-interface tsd-has-type-parameter\"},{\"id\":50,\"kind\":1024,\"name\":\"_id\",\"url\":\"interfaces/IJobParameters.html#_id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IJobParameters\"},{\"id\":51,\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/IJobParameters.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IJobParameters\"},{\"id\":52,\"kind\":1024,\"name\":\"priority\",\"url\":\"interfaces/IJobParameters.html#priority\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IJobParameters\"},{\"id\":53,\"kind\":1024,\"name\":\"nextRunAt\",\"url\":\"interfaces/IJobParameters.html#nextRunAt\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IJobParameters\"},{\"id\":54,\"kind\":1024,\"name\":\"type\",\"url\":\"interfaces/IJobParameters.html#type\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IJobParameters\"},{\"id\":55,\"kind\":1024,\"name\":\"lockedAt\",\"url\":\"interfaces/IJobParameters.html#lockedAt\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IJobParameters\"},{\"id\":56,\"kind\":1024,\"name\":\"lastFinishedAt\",\"url\":\"interfaces/IJobParameters.html#lastFinishedAt\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IJobParameters\"},{\"id\":57,\"kind\":1024,\"name\":\"failedAt\",\"url\":\"interfaces/IJobParameters.html#failedAt\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IJobParameters\"},{\"id\":58,\"kind\":1024,\"name\":\"failCount\",\"url\":\"interfaces/IJobParameters.html#failCount\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IJobParameters\"},{\"id\":59,\"kind\":1024,\"name\":\"failReason\",\"url\":\"interfaces/IJobParameters.html#failReason\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IJobParameters\"},{\"id\":60,\"kind\":1024,\"name\":\"repeatTimezone\",\"url\":\"interfaces/IJobParameters.html#repeatTimezone\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IJobParameters\"},{\"id\":61,\"kind\":1024,\"name\":\"lastRunAt\",\"url\":\"interfaces/IJobParameters.html#lastRunAt\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IJobParameters\"},{\"id\":62,\"kind\":1024,\"name\":\"repeatInterval\",\"url\":\"interfaces/IJobParameters.html#repeatInterval\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IJobParameters\"},{\"id\":63,\"kind\":1024,\"name\":\"data\",\"url\":\"interfaces/IJobParameters.html#data\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IJobParameters\"},{\"id\":64,\"kind\":1024,\"name\":\"repeatAt\",\"url\":\"interfaces/IJobParameters.html#repeatAt\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IJobParameters\"},{\"id\":65,\"kind\":1024,\"name\":\"disabled\",\"url\":\"interfaces/IJobParameters.html#disabled\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IJobParameters\"},{\"id\":66,\"kind\":1024,\"name\":\"progress\",\"url\":\"interfaces/IJobParameters.html#progress\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IJobParameters\"},{\"id\":67,\"kind\":1024,\"name\":\"unique\",\"url\":\"interfaces/IJobParameters.html#unique\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IJobParameters\"},{\"id\":68,\"kind\":1024,\"name\":\"uniqueOpts\",\"url\":\"interfaces/IJobParameters.html#uniqueOpts\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IJobParameters\"},{\"id\":69,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/IJobParameters.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"IJobParameters\"},{\"id\":70,\"kind\":1024,\"name\":\"insertOnly\",\"url\":\"interfaces/IJobParameters.html#__type.insertOnly\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"IJobParameters.__type\"},{\"id\":71,\"kind\":1024,\"name\":\"lastModifiedBy\",\"url\":\"interfaces/IJobParameters.html#lastModifiedBy\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IJobParameters\"},{\"id\":72,\"kind\":4194304,\"name\":\"TJobDatefield\",\"url\":\"modules.html#TJobDatefield\",\"classes\":\"tsd-kind-type-alias\"},{\"id\":73,\"kind\":32,\"name\":\"datefields\",\"url\":\"modules.html#datefields\",\"classes\":\"tsd-kind-variable\"},{\"id\":74,\"kind\":256,\"name\":\"IDatabaseOptions\",\"url\":\"interfaces/IDatabaseOptions.html\",\"classes\":\"tsd-kind-interface\"},{\"id\":75,\"kind\":1024,\"name\":\"db\",\"url\":\"interfaces/IDatabaseOptions.html#db\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IDatabaseOptions\"},{\"id\":76,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/IDatabaseOptions.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"IDatabaseOptions\"},{\"id\":77,\"kind\":1024,\"name\":\"collection\",\"url\":\"interfaces/IDatabaseOptions.html#__type.collection\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"IDatabaseOptions.__type\"},{\"id\":78,\"kind\":1024,\"name\":\"address\",\"url\":\"interfaces/IDatabaseOptions.html#__type.address\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"IDatabaseOptions.__type\"},{\"id\":79,\"kind\":1024,\"name\":\"options\",\"url\":\"interfaces/IDatabaseOptions.html#__type.options\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"IDatabaseOptions.__type\"},{\"id\":80,\"kind\":256,\"name\":\"IMongoOptions\",\"url\":\"interfaces/IMongoOptions.html\",\"classes\":\"tsd-kind-interface\"},{\"id\":81,\"kind\":1024,\"name\":\"db\",\"url\":\"interfaces/IMongoOptions.html#db\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IMongoOptions\"},{\"id\":82,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/IMongoOptions.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"IMongoOptions\"},{\"id\":83,\"kind\":1024,\"name\":\"collection\",\"url\":\"interfaces/IMongoOptions.html#__type.collection\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"IMongoOptions.__type\"},{\"id\":84,\"kind\":1024,\"name\":\"mongo\",\"url\":\"interfaces/IMongoOptions.html#mongo\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IMongoOptions\"},{\"id\":85,\"kind\":256,\"name\":\"IDbConfig\",\"url\":\"interfaces/IDbConfig.html\",\"classes\":\"tsd-kind-interface\"},{\"id\":86,\"kind\":1024,\"name\":\"ensureIndex\",\"url\":\"interfaces/IDbConfig.html#ensureIndex\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IDbConfig\"},{\"id\":87,\"kind\":1024,\"name\":\"sort\",\"url\":\"interfaces/IDbConfig.html#sort\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"IDbConfig\"},{\"id\":88,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/IDbConfig.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"IDbConfig\"},{\"id\":89,\"kind\":128,\"name\":\"Job\",\"url\":\"classes/Job.html\",\"classes\":\"tsd-kind-class tsd-has-type-parameter\"},{\"id\":90,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/Job.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class tsd-has-type-parameter\",\"parent\":\"Job\"},{\"id\":91,\"kind\":1024,\"name\":\"attrs\",\"url\":\"classes/Job.html#attrs\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Job\"},{\"id\":92,\"kind\":1024,\"name\":\"canceled\",\"url\":\"classes/Job.html#canceled\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Job\"},{\"id\":93,\"kind\":1024,\"name\":\"gotTimerToExecute\",\"url\":\"classes/Job.html#gotTimerToExecute\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Job\"},{\"id\":94,\"kind\":1024,\"name\":\"agenda\",\"url\":\"classes/Job.html#agenda\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Job\"},{\"id\":95,\"kind\":2048,\"name\":\"toJson\",\"url\":\"classes/Job.html#toJson\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Job\"},{\"id\":96,\"kind\":2048,\"name\":\"repeatEvery\",\"url\":\"classes/Job.html#repeatEvery\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Job\"},{\"id\":97,\"kind\":2048,\"name\":\"repeatAt\",\"url\":\"classes/Job.html#repeatAt\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Job\"},{\"id\":98,\"kind\":2048,\"name\":\"disable\",\"url\":\"classes/Job.html#disable\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Job\"},{\"id\":99,\"kind\":2048,\"name\":\"enable\",\"url\":\"classes/Job.html#enable\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Job\"},{\"id\":100,\"kind\":2048,\"name\":\"unique\",\"url\":\"classes/Job.html#unique\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Job\"},{\"id\":101,\"kind\":2048,\"name\":\"schedule\",\"url\":\"classes/Job.html#schedule\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Job\"},{\"id\":102,\"kind\":2048,\"name\":\"priority\",\"url\":\"classes/Job.html#priority\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Job\"},{\"id\":103,\"kind\":2048,\"name\":\"fail\",\"url\":\"classes/Job.html#fail\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Job\"},{\"id\":104,\"kind\":2048,\"name\":\"fetchStatus\",\"url\":\"classes/Job.html#fetchStatus\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-private\",\"parent\":\"Job\"},{\"id\":105,\"kind\":2048,\"name\":\"isRunning\",\"url\":\"classes/Job.html#isRunning\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Job\"},{\"id\":106,\"kind\":2048,\"name\":\"save\",\"url\":\"classes/Job.html#save\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Job\"},{\"id\":107,\"kind\":2048,\"name\":\"remove\",\"url\":\"classes/Job.html#remove\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Job\"},{\"id\":108,\"kind\":2048,\"name\":\"isDead\",\"url\":\"classes/Job.html#isDead\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Job\"},{\"id\":109,\"kind\":2048,\"name\":\"isExpired\",\"url\":\"classes/Job.html#isExpired\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Job\"},{\"id\":110,\"kind\":2048,\"name\":\"touch\",\"url\":\"classes/Job.html#touch\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Job\"},{\"id\":111,\"kind\":2048,\"name\":\"computeNextRunAt\",\"url\":\"classes/Job.html#computeNextRunAt\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-private\",\"parent\":\"Job\"},{\"id\":112,\"kind\":2048,\"name\":\"run\",\"url\":\"classes/Job.html#run\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Job\"},{\"id\":113,\"kind\":2048,\"name\":\"isPromise\",\"url\":\"classes/Job.html#isPromise\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-private\",\"parent\":\"Job\"},{\"id\":114,\"kind\":4194304,\"name\":\"JobWithId\",\"url\":\"modules.html#JobWithId\",\"classes\":\"tsd-kind-type-alias\"}],\"index\":{\"version\":\"2.3.9\",\"fields\":[\"name\",\"parent\"],\"fieldVectors\":[[\"name/0\",[0,12.126]],[\"parent/0\",[]],[\"name/1\",[1,38.373]],[\"parent/1\",[0,1.157]],[\"name/2\",[2,38.373]],[\"parent/2\",[0,1.157]],[\"name/3\",[3,35.008]],[\"parent/3\",[0,1.157]],[\"name/4\",[4,43.481]],[\"parent/4\",[0,1.157]],[\"name/5\",[5,43.481]],[\"parent/5\",[0,1.157]],[\"name/6\",[6,28.818]],[\"parent/6\",[0,1.157]],[\"name/7\",[7,43.481]],[\"parent/7\",[0,1.157]],[\"name/8\",[8,43.481]],[\"parent/8\",[0,1.157]],[\"name/9\",[9,43.481]],[\"parent/9\",[0,1.157]],[\"name/10\",[10,43.481]],[\"parent/10\",[0,1.157]],[\"name/11\",[11,43.481]],[\"parent/11\",[0,1.157]],[\"name/12\",[12,38.373]],[\"parent/12\",[0,1.157]],[\"name/13\",[13,38.373]],[\"parent/13\",[0,1.157]],[\"name/14\",[14,43.481]],[\"parent/14\",[0,1.157]],[\"name/15\",[15,43.481]],[\"parent/15\",[0,1.157]],[\"name/16\",[16,35.008]],[\"parent/16\",[0,1.157]],[\"name/17\",[17,38.373]],[\"parent/17\",[0,1.157]],[\"name/18\",[18,38.373]],[\"parent/18\",[0,1.157]],[\"name/19\",[19,38.373]],[\"parent/19\",[0,1.157]],[\"name/20\",[20,35.008]],[\"parent/20\",[0,1.157]],[\"name/21\",[21,38.373]],[\"parent/21\",[0,1.157]],[\"name/22\",[22,38.373]],[\"parent/22\",[0,1.157]],[\"name/23\",[23,43.481]],[\"parent/23\",[0,1.157]],[\"name/24\",[24,43.481]],[\"parent/24\",[0,1.157]],[\"name/25\",[25,43.481]],[\"parent/25\",[0,1.157]],[\"name/26\",[26,43.481]],[\"parent/26\",[0,1.157]],[\"name/27\",[27,43.481]],[\"parent/27\",[0,1.157]],[\"name/28\",[28,43.481]],[\"parent/28\",[0,1.157]],[\"name/29\",[29,38.373]],[\"parent/29\",[0,1.157]],[\"name/30\",[30,43.481]],[\"parent/30\",[0,1.157]],[\"name/31\",[31,43.481]],[\"parent/31\",[0,1.157]],[\"name/32\",[32,43.481]],[\"parent/32\",[0,1.157]],[\"name/33\",[33,26.135]],[\"parent/33\",[]],[\"name/34\",[16,35.008]],[\"parent/34\",[33,2.495]],[\"name/35\",[19,38.373]],[\"parent/35\",[33,2.495]],[\"name/36\",[17,38.373]],[\"parent/36\",[33,2.495]],[\"name/37\",[18,38.373]],[\"parent/37\",[33,2.495]],[\"name/38\",[21,38.373]],[\"parent/38\",[33,2.495]],[\"name/39\",[20,35.008]],[\"parent/39\",[33,2.495]],[\"name/40\",[22,38.373]],[\"parent/40\",[33,2.495]],[\"name/41\",[34,28.818]],[\"parent/41\",[]],[\"name/42\",[20,35.008]],[\"parent/42\",[34,2.751]],[\"name/43\",[35,43.481]],[\"parent/43\",[34,2.751]],[\"name/44\",[36,35.008]],[\"parent/44\",[34,2.751]],[\"name/45\",[37,43.481]],[\"parent/45\",[34,2.751]],[\"name/46\",[38,43.481]],[\"parent/46\",[34,2.751]],[\"name/47\",[39,38.373]],[\"parent/47\",[]],[\"name/48\",[6,28.818]],[\"parent/48\",[39,3.663]],[\"name/49\",[40,16.401]],[\"parent/49\",[]],[\"name/50\",[41,43.481]],[\"parent/50\",[40,1.565]],[\"name/51\",[16,35.008]],[\"parent/51\",[40,1.565]],[\"name/52\",[36,35.008]],[\"parent/52\",[40,1.565]],[\"name/53\",[42,43.481]],[\"parent/53\",[40,1.565]],[\"name/54\",[43,43.481]],[\"parent/54\",[40,1.565]],[\"name/55\",[44,43.481]],[\"parent/55\",[40,1.565]],[\"name/56\",[45,43.481]],[\"parent/56\",[40,1.565]],[\"name/57\",[46,43.481]],[\"parent/57\",[40,1.565]],[\"name/58\",[47,43.481]],[\"parent/58\",[40,1.565]],[\"name/59\",[48,43.481]],[\"parent/59\",[40,1.565]],[\"name/60\",[49,43.481]],[\"parent/60\",[40,1.565]],[\"name/61\",[50,43.481]],[\"parent/61\",[40,1.565]],[\"name/62\",[51,43.481]],[\"parent/62\",[40,1.565]],[\"name/63\",[52,43.481]],[\"parent/63\",[40,1.565]],[\"name/64\",[53,38.373]],[\"parent/64\",[40,1.565]],[\"name/65\",[54,43.481]],[\"parent/65\",[40,1.565]],[\"name/66\",[55,43.481]],[\"parent/66\",[40,1.565]],[\"name/67\",[56,38.373]],[\"parent/67\",[40,1.565]],[\"name/68\",[57,43.481]],[\"parent/68\",[40,1.565]],[\"name/69\",[6,28.818]],[\"parent/69\",[40,1.565]],[\"name/70\",[58,43.481]],[\"parent/70\",[59,4.15]],[\"name/71\",[60,43.481]],[\"parent/71\",[40,1.565]],[\"name/72\",[61,43.481]],[\"parent/72\",[]],[\"name/73\",[62,43.481]],[\"parent/73\",[]],[\"name/74\",[63,35.008]],[\"parent/74\",[]],[\"name/75\",[3,35.008]],[\"parent/75\",[63,3.342]],[\"name/76\",[6,28.818]],[\"parent/76\",[63,3.342]],[\"name/77\",[64,38.373]],[\"parent/77\",[65,3.342]],[\"name/78\",[66,43.481]],[\"parent/78\",[65,3.342]],[\"name/79\",[67,43.481]],[\"parent/79\",[65,3.342]],[\"name/80\",[68,32.495]],[\"parent/80\",[]],[\"name/81\",[3,35.008]],[\"parent/81\",[68,3.102]],[\"name/82\",[6,28.818]],[\"parent/82\",[68,3.102]],[\"name/83\",[64,38.373]],[\"parent/83\",[69,4.15]],[\"name/84\",[12,38.373]],[\"parent/84\",[68,3.102]],[\"name/85\",[70,32.495]],[\"parent/85\",[]],[\"name/86\",[71,43.481]],[\"parent/86\",[70,3.102]],[\"name/87\",[13,38.373]],[\"parent/87\",[70,3.102]],[\"name/88\",[6,28.818]],[\"parent/88\",[70,3.102]],[\"name/89\",[72,15.149]],[\"parent/89\",[]],[\"name/90\",[1,38.373]],[\"parent/90\",[72,1.446]],[\"name/91\",[2,38.373]],[\"parent/91\",[72,1.446]],[\"name/92\",[73,43.481]],[\"parent/92\",[72,1.446]],[\"name/93\",[74,43.481]],[\"parent/93\",[72,1.446]],[\"name/94\",[0,12.126]],[\"parent/94\",[72,1.446]],[\"name/95\",[75,43.481]],[\"parent/95\",[72,1.446]],[\"name/96\",[76,43.481]],[\"parent/96\",[72,1.446]],[\"name/97\",[53,38.373]],[\"parent/97\",[72,1.446]],[\"name/98\",[77,43.481]],[\"parent/98\",[72,1.446]],[\"name/99\",[78,43.481]],[\"parent/99\",[72,1.446]],[\"name/100\",[56,38.373]],[\"parent/100\",[72,1.446]],[\"name/101\",[29,38.373]],[\"parent/101\",[72,1.446]],[\"name/102\",[36,35.008]],[\"parent/102\",[72,1.446]],[\"name/103\",[79,43.481]],[\"parent/103\",[72,1.446]],[\"name/104\",[80,43.481]],[\"parent/104\",[72,1.446]],[\"name/105\",[81,43.481]],[\"parent/105\",[72,1.446]],[\"name/106\",[82,43.481]],[\"parent/106\",[72,1.446]],[\"name/107\",[83,43.481]],[\"parent/107\",[72,1.446]],[\"name/108\",[84,43.481]],[\"parent/108\",[72,1.446]],[\"name/109\",[85,43.481]],[\"parent/109\",[72,1.446]],[\"name/110\",[86,43.481]],[\"parent/110\",[72,1.446]],[\"name/111\",[87,43.481]],[\"parent/111\",[72,1.446]],[\"name/112\",[88,43.481]],[\"parent/112\",[72,1.446]],[\"name/113\",[89,43.481]],[\"parent/113\",[72,1.446]],[\"name/114\",[90,43.481]],[\"parent/114\",[]]],\"invertedIndex\":[[\"__type\",{\"_index\":6,\"name\":{\"6\":{},\"48\":{},\"69\":{},\"76\":{},\"82\":{},\"88\":{}},\"parent\":{}}],[\"_id\",{\"_index\":41,\"name\":{\"50\":{}},\"parent\":{}}],[\"address\",{\"_index\":66,\"name\":{\"78\":{}},\"parent\":{}}],[\"agenda\",{\"_index\":0,\"name\":{\"0\":{},\"94\":{}},\"parent\":{\"1\":{},\"2\":{},\"3\":{},\"4\":{},\"5\":{},\"6\":{},\"7\":{},\"8\":{},\"9\":{},\"10\":{},\"11\":{},\"12\":{},\"13\":{},\"14\":{},\"15\":{},\"16\":{},\"17\":{},\"18\":{},\"19\":{},\"20\":{},\"21\":{},\"22\":{},\"23\":{},\"24\":{},\"25\":{},\"26\":{},\"27\":{},\"28\":{},\"29\":{},\"30\":{},\"31\":{},\"32\":{}}}],[\"attrs\",{\"_index\":2,\"name\":{\"2\":{},\"91\":{}},\"parent\":{}}],[\"cancel\",{\"_index\":15,\"name\":{\"15\":{}},\"parent\":{}}],[\"canceled\",{\"_index\":73,\"name\":{\"92\":{}},\"parent\":{}}],[\"collection\",{\"_index\":64,\"name\":{\"77\":{},\"83\":{}},\"parent\":{}}],[\"computenextrunat\",{\"_index\":87,\"name\":{\"111\":{}},\"parent\":{}}],[\"concurrency\",{\"_index\":37,\"name\":{\"45\":{}},\"parent\":{}}],[\"constructor\",{\"_index\":1,\"name\":{\"1\":{},\"90\":{}},\"parent\":{}}],[\"create\",{\"_index\":27,\"name\":{\"27\":{}},\"parent\":{}}],[\"createjobs\",{\"_index\":26,\"name\":{\"26\":{}},\"parent\":{}}],[\"data\",{\"_index\":52,\"name\":{\"63\":{}},\"parent\":{}}],[\"database\",{\"_index\":11,\"name\":{\"11\":{}},\"parent\":{}}],[\"datefields\",{\"_index\":62,\"name\":{\"73\":{}},\"parent\":{}}],[\"db\",{\"_index\":3,\"name\":{\"3\":{},\"75\":{},\"81\":{}},\"parent\":{}}],[\"defaultconcurrency\",{\"_index\":19,\"name\":{\"19\":{},\"35\":{}},\"parent\":{}}],[\"defaultlocklifetime\",{\"_index\":22,\"name\":{\"22\":{},\"40\":{}},\"parent\":{}}],[\"defaultlocklimit\",{\"_index\":21,\"name\":{\"21\":{},\"38\":{}},\"parent\":{}}],[\"define\",{\"_index\":25,\"name\":{\"25\":{}},\"parent\":{}}],[\"definitionprocessor\",{\"_index\":39,\"name\":{\"47\":{}},\"parent\":{\"48\":{}}}],[\"definitions\",{\"_index\":5,\"name\":{\"5\":{}},\"parent\":{}}],[\"disable\",{\"_index\":77,\"name\":{\"98\":{}},\"parent\":{}}],[\"disabled\",{\"_index\":54,\"name\":{\"65\":{}},\"parent\":{}}],[\"enable\",{\"_index\":78,\"name\":{\"99\":{}},\"parent\":{}}],[\"ensureindex\",{\"_index\":71,\"name\":{\"86\":{}},\"parent\":{}}],[\"every\",{\"_index\":28,\"name\":{\"28\":{}},\"parent\":{}}],[\"fail\",{\"_index\":79,\"name\":{\"103\":{}},\"parent\":{}}],[\"failcount\",{\"_index\":47,\"name\":{\"58\":{}},\"parent\":{}}],[\"failedat\",{\"_index\":46,\"name\":{\"57\":{}},\"parent\":{}}],[\"failreason\",{\"_index\":48,\"name\":{\"59\":{}},\"parent\":{}}],[\"fetchstatus\",{\"_index\":80,\"name\":{\"104\":{}},\"parent\":{}}],[\"fn\",{\"_index\":38,\"name\":{\"46\":{}},\"parent\":{}}],[\"getrunningstats\",{\"_index\":10,\"name\":{\"10\":{}},\"parent\":{}}],[\"gottimertoexecute\",{\"_index\":74,\"name\":{\"93\":{}},\"parent\":{}}],[\"hasdatabaseconfig\",{\"_index\":14,\"name\":{\"14\":{}},\"parent\":{}}],[\"iagendaconfig\",{\"_index\":33,\"name\":{\"33\":{}},\"parent\":{\"34\":{},\"35\":{},\"36\":{},\"37\":{},\"38\":{},\"39\":{},\"40\":{}}}],[\"idatabaseoptions\",{\"_index\":63,\"name\":{\"74\":{}},\"parent\":{\"75\":{},\"76\":{}}}],[\"idatabaseoptions.__type\",{\"_index\":65,\"name\":{},\"parent\":{\"77\":{},\"78\":{},\"79\":{}}}],[\"idbconfig\",{\"_index\":70,\"name\":{\"85\":{}},\"parent\":{\"86\":{},\"87\":{},\"88\":{}}}],[\"ijobdefinition\",{\"_index\":34,\"name\":{\"41\":{}},\"parent\":{\"42\":{},\"43\":{},\"44\":{},\"45\":{},\"46\":{}}}],[\"ijobparameters\",{\"_index\":40,\"name\":{\"49\":{}},\"parent\":{\"50\":{},\"51\":{},\"52\":{},\"53\":{},\"54\":{},\"55\":{},\"56\":{},\"57\":{},\"58\":{},\"59\":{},\"60\":{},\"61\":{},\"62\":{},\"63\":{},\"64\":{},\"65\":{},\"66\":{},\"67\":{},\"68\":{},\"69\":{},\"71\":{}}}],[\"ijobparameters.__type\",{\"_index\":59,\"name\":{},\"parent\":{\"70\":{}}}],[\"imongooptions\",{\"_index\":68,\"name\":{\"80\":{}},\"parent\":{\"81\":{},\"82\":{},\"84\":{}}}],[\"imongooptions.__type\",{\"_index\":69,\"name\":{},\"parent\":{\"83\":{}}}],[\"insertonly\",{\"_index\":58,\"name\":{\"70\":{}},\"parent\":{}}],[\"isactivejobprocessor\",{\"_index\":9,\"name\":{\"9\":{}},\"parent\":{}}],[\"isdead\",{\"_index\":84,\"name\":{\"108\":{}},\"parent\":{}}],[\"isexpired\",{\"_index\":85,\"name\":{\"109\":{}},\"parent\":{}}],[\"ispromise\",{\"_index\":89,\"name\":{\"113\":{}},\"parent\":{}}],[\"isrunning\",{\"_index\":81,\"name\":{\"105\":{}},\"parent\":{}}],[\"job\",{\"_index\":72,\"name\":{\"89\":{}},\"parent\":{\"90\":{},\"91\":{},\"92\":{},\"93\":{},\"94\":{},\"95\":{},\"96\":{},\"97\":{},\"98\":{},\"99\":{},\"100\":{},\"101\":{},\"102\":{},\"103\":{},\"104\":{},\"105\":{},\"106\":{},\"107\":{},\"108\":{},\"109\":{},\"110\":{},\"111\":{},\"112\":{},\"113\":{}}}],[\"jobprocessor\",{\"_index\":7,\"name\":{\"7\":{}},\"parent\":{}}],[\"jobs\",{\"_index\":23,\"name\":{\"23\":{}},\"parent\":{}}],[\"jobwithid\",{\"_index\":90,\"name\":{\"114\":{}},\"parent\":{}}],[\"lastfinishedat\",{\"_index\":45,\"name\":{\"56\":{}},\"parent\":{}}],[\"lastmodifiedby\",{\"_index\":60,\"name\":{\"71\":{}},\"parent\":{}}],[\"lastrunat\",{\"_index\":50,\"name\":{\"61\":{}},\"parent\":{}}],[\"lockedat\",{\"_index\":44,\"name\":{\"55\":{}},\"parent\":{}}],[\"locklifetime\",{\"_index\":35,\"name\":{\"43\":{}},\"parent\":{}}],[\"locklimit\",{\"_index\":20,\"name\":{\"20\":{},\"39\":{},\"42\":{}},\"parent\":{}}],[\"maxconcurrency\",{\"_index\":18,\"name\":{\"18\":{},\"37\":{}},\"parent\":{}}],[\"mongo\",{\"_index\":12,\"name\":{\"12\":{},\"84\":{}},\"parent\":{}}],[\"name\",{\"_index\":16,\"name\":{\"16\":{},\"34\":{},\"51\":{}},\"parent\":{}}],[\"nextrunat\",{\"_index\":42,\"name\":{\"53\":{}},\"parent\":{}}],[\"now\",{\"_index\":30,\"name\":{\"30\":{}},\"parent\":{}}],[\"on\",{\"_index\":4,\"name\":{\"4\":{}},\"parent\":{}}],[\"options\",{\"_index\":67,\"name\":{\"79\":{}},\"parent\":{}}],[\"priority\",{\"_index\":36,\"name\":{\"44\":{},\"52\":{},\"102\":{}},\"parent\":{}}],[\"processevery\",{\"_index\":17,\"name\":{\"17\":{},\"36\":{}},\"parent\":{}}],[\"progress\",{\"_index\":55,\"name\":{\"66\":{}},\"parent\":{}}],[\"purge\",{\"_index\":24,\"name\":{\"24\":{}},\"parent\":{}}],[\"ready\",{\"_index\":8,\"name\":{\"8\":{}},\"parent\":{}}],[\"remove\",{\"_index\":83,\"name\":{\"107\":{}},\"parent\":{}}],[\"repeatat\",{\"_index\":53,\"name\":{\"64\":{},\"97\":{}},\"parent\":{}}],[\"repeatevery\",{\"_index\":76,\"name\":{\"96\":{}},\"parent\":{}}],[\"repeatinterval\",{\"_index\":51,\"name\":{\"62\":{}},\"parent\":{}}],[\"repeattimezone\",{\"_index\":49,\"name\":{\"60\":{}},\"parent\":{}}],[\"run\",{\"_index\":88,\"name\":{\"112\":{}},\"parent\":{}}],[\"save\",{\"_index\":82,\"name\":{\"106\":{}},\"parent\":{}}],[\"schedule\",{\"_index\":29,\"name\":{\"29\":{},\"101\":{}},\"parent\":{}}],[\"sort\",{\"_index\":13,\"name\":{\"13\":{},\"87\":{}},\"parent\":{}}],[\"start\",{\"_index\":31,\"name\":{\"31\":{}},\"parent\":{}}],[\"stop\",{\"_index\":32,\"name\":{\"32\":{}},\"parent\":{}}],[\"tjobdatefield\",{\"_index\":61,\"name\":{\"72\":{}},\"parent\":{}}],[\"tojson\",{\"_index\":75,\"name\":{\"95\":{}},\"parent\":{}}],[\"touch\",{\"_index\":86,\"name\":{\"110\":{}},\"parent\":{}}],[\"type\",{\"_index\":43,\"name\":{\"54\":{}},\"parent\":{}}],[\"unique\",{\"_index\":56,\"name\":{\"67\":{},\"100\":{}},\"parent\":{}}],[\"uniqueopts\",{\"_index\":57,\"name\":{\"68\":{}},\"parent\":{}}]],\"pipeline\":[]}}"); \ No newline at end of file diff --git a/docs/agenda/6.x/assets/style.css b/docs/agenda/6.x/assets/style.css deleted file mode 100644 index a16ed02..0000000 --- a/docs/agenda/6.x/assets/style.css +++ /dev/null @@ -1,1413 +0,0 @@ -@import url("./icons.css"); - -:root { - /* Light */ - --light-color-background: #fcfcfc; - --light-color-secondary-background: #fff; - --light-color-text: #222; - --light-color-text-aside: #707070; - --light-color-link: #4da6ff; - --light-color-menu-divider: #eee; - --light-color-menu-divider-focus: #000; - --light-color-menu-label: #707070; - --light-color-panel: var(--light-color-secondary-background); - --light-color-panel-divider: #eee; - --light-color-comment-tag: #707070; - --light-color-comment-tag-text: #fff; - --light-color-ts: #9600ff; - --light-color-ts-interface: #647f1b; - --light-color-ts-enum: #937210; - --light-color-ts-class: #0672de; - --light-color-ts-private: #707070; - --light-color-toolbar: #fff; - --light-color-toolbar-text: #333; - --light-icon-filter: invert(0); - --light-external-icon: url("data:image/svg+xml;utf8,"); - - /* Dark */ - --dark-color-background: #36393f; - --dark-color-secondary-background: #2f3136; - --dark-color-text: #ffffff; - --dark-color-text-aside: #e6e4e4; - --dark-color-link: #00aff4; - --dark-color-menu-divider: #eee; - --dark-color-menu-divider-focus: #000; - --dark-color-menu-label: #707070; - --dark-color-panel: var(--dark-color-secondary-background); - --dark-color-panel-divider: #818181; - --dark-color-comment-tag: #dcddde; - --dark-color-comment-tag-text: #2f3136; - --dark-color-ts: #c97dff; - --dark-color-ts-interface: #9cbe3c; - --dark-color-ts-enum: #d6ab29; - --dark-color-ts-class: #3695f3; - --dark-color-ts-private: #e2e2e2; - --dark-color-toolbar: #34373c; - --dark-color-toolbar-text: #ffffff; - --dark-icon-filter: invert(1); - --dark-external-icon: url("data:image/svg+xml;utf8,"); -} - -@media (prefers-color-scheme: light) { - :root { - --color-background: var(--light-color-background); - --color-secondary-background: var(--light-color-secondary-background); - --color-text: var(--light-color-text); - --color-text-aside: var(--light-color-text-aside); - --color-link: var(--light-color-link); - --color-menu-divider: var(--light-color-menu-divider); - --color-menu-divider-focus: var(--light-color-menu-divider-focus); - --color-menu-label: var(--light-color-menu-label); - --color-panel: var(--light-color-panel); - --color-panel-divider: var(--light-color-panel-divider); - --color-comment-tag: var(--light-color-comment-tag); - --color-comment-tag-text: var(--light-color-comment-tag-text); - --color-ts: var(--light-color-ts); - --color-ts-interface: var(--light-color-ts-interface); - --color-ts-enum: var(--light-color-ts-enum); - --color-ts-class: var(--light-color-ts-class); - --color-ts-private: var(--light-color-ts-private); - --color-toolbar: var(--light-color-toolbar); - --color-toolbar-text: var(--light-color-toolbar-text); - --icon-filter: var(--light-icon-filter); - --external-icon: var(--light-external-icon); - } -} - -@media (prefers-color-scheme: dark) { - :root { - --color-background: var(--dark-color-background); - --color-secondary-background: var(--dark-color-secondary-background); - --color-text: var(--dark-color-text); - --color-text-aside: var(--dark-color-text-aside); - --color-link: var(--dark-color-link); - --color-menu-divider: var(--dark-color-menu-divider); - --color-menu-divider-focus: var(--dark-color-menu-divider-focus); - --color-menu-label: var(--dark-color-menu-label); - --color-panel: var(--dark-color-panel); - --color-panel-divider: var(--dark-color-panel-divider); - --color-comment-tag: var(--dark-color-comment-tag); - --color-comment-tag-text: var(--dark-color-comment-tag-text); - --color-ts: var(--dark-color-ts); - --color-ts-interface: var(--dark-color-ts-interface); - --color-ts-enum: var(--dark-color-ts-enum); - --color-ts-class: var(--dark-color-ts-class); - --color-ts-private: var(--dark-color-ts-private); - --color-toolbar: var(--dark-color-toolbar); - --color-toolbar-text: var(--dark-color-toolbar-text); - --icon-filter: var(--dark-icon-filter); - --external-icon: var(--dark-external-icon); - } -} - -body { - margin: 0; -} - -body.light { - --color-background: var(--light-color-background); - --color-secondary-background: var(--light-color-secondary-background); - --color-text: var(--light-color-text); - --color-text-aside: var(--light-color-text-aside); - --color-link: var(--light-color-link); - --color-menu-divider: var(--light-color-menu-divider); - --color-menu-divider-focus: var(--light-color-menu-divider-focus); - --color-menu-label: var(--light-color-menu-label); - --color-panel: var(--light-color-panel); - --color-panel-divider: var(--light-color-panel-divider); - --color-comment-tag: var(--light-color-comment-tag); - --color-comment-tag-text: var(--light-color-comment-tag-text); - --color-ts: var(--light-color-ts); - --color-ts-interface: var(--light-color-ts-interface); - --color-ts-enum: var(--light-color-ts-enum); - --color-ts-class: var(--light-color-ts-class); - --color-ts-private: var(--light-color-ts-private); - --color-toolbar: var(--light-color-toolbar); - --color-toolbar-text: var(--light-color-toolbar-text); - --icon-filter: var(--light-icon-filter); - --external-icon: var(--light-external-icon); -} - -body.dark { - --color-background: var(--dark-color-background); - --color-secondary-background: var(--dark-color-secondary-background); - --color-text: var(--dark-color-text); - --color-text-aside: var(--dark-color-text-aside); - --color-link: var(--dark-color-link); - --color-menu-divider: var(--dark-color-menu-divider); - --color-menu-divider-focus: var(--dark-color-menu-divider-focus); - --color-menu-label: var(--dark-color-menu-label); - --color-panel: var(--dark-color-panel); - --color-panel-divider: var(--dark-color-panel-divider); - --color-comment-tag: var(--dark-color-comment-tag); - --color-comment-tag-text: var(--dark-color-comment-tag-text); - --color-ts: var(--dark-color-ts); - --color-ts-interface: var(--dark-color-ts-interface); - --color-ts-enum: var(--dark-color-ts-enum); - --color-ts-class: var(--dark-color-ts-class); - --color-ts-private: var(--dark-color-ts-private); - --color-toolbar: var(--dark-color-toolbar); - --color-toolbar-text: var(--dark-color-toolbar-text); - --icon-filter: var(--dark-icon-filter); - --external-icon: var(--dark-external-icon); -} - -h1, -h2, -h3, -h4, -h5, -h6 { - line-height: 1.2; -} - -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -h2 { - font-size: 1.5em; - margin: 0.83em 0; -} - -h3 { - font-size: 1.17em; - margin: 1em 0; -} - -h4, -.tsd-index-panel h3 { - font-size: 1em; - margin: 1.33em 0; -} - -h5 { - font-size: 0.83em; - margin: 1.67em 0; -} - -h6 { - font-size: 0.67em; - margin: 2.33em 0; -} - -pre { - white-space: pre; - white-space: pre-wrap; - word-wrap: break-word; -} - -dl, -menu, -ol, -ul { - margin: 1em 0; -} - -dd { - margin: 0 0 0 40px; -} - -.container { - max-width: 1200px; - margin: 0 auto; - padding: 0 40px; -} -@media (max-width: 640px) { - .container { - padding: 0 20px; - } -} - -.container-main { - padding-bottom: 200px; -} - -.row { - display: flex; - position: relative; - margin: 0 -10px; -} -.row:after { - visibility: hidden; - display: block; - content: ""; - clear: both; - height: 0; -} - -.col-4, -.col-8 { - box-sizing: border-box; - float: left; - padding: 0 10px; -} - -.col-4 { - width: 33.3333333333%; -} -.col-8 { - width: 66.6666666667%; -} - -ul.tsd-descriptions > li > :first-child, -.tsd-panel > :first-child, -.col-8 > :first-child, -.col-4 > :first-child, -ul.tsd-descriptions > li > :first-child > :first-child, -.tsd-panel > :first-child > :first-child, -.col-8 > :first-child > :first-child, -.col-4 > :first-child > :first-child, -ul.tsd-descriptions > li > :first-child > :first-child > :first-child, -.tsd-panel > :first-child > :first-child > :first-child, -.col-8 > :first-child > :first-child > :first-child, -.col-4 > :first-child > :first-child > :first-child { - margin-top: 0; -} -ul.tsd-descriptions > li > :last-child, -.tsd-panel > :last-child, -.col-8 > :last-child, -.col-4 > :last-child, -ul.tsd-descriptions > li > :last-child > :last-child, -.tsd-panel > :last-child > :last-child, -.col-8 > :last-child > :last-child, -.col-4 > :last-child > :last-child, -ul.tsd-descriptions > li > :last-child > :last-child > :last-child, -.tsd-panel > :last-child > :last-child > :last-child, -.col-8 > :last-child > :last-child > :last-child, -.col-4 > :last-child > :last-child > :last-child { - margin-bottom: 0; -} - -@keyframes fade-in { - from { - opacity: 0; - } - to { - opacity: 1; - } -} -@keyframes fade-out { - from { - opacity: 1; - visibility: visible; - } - to { - opacity: 0; - } -} -@keyframes fade-in-delayed { - 0% { - opacity: 0; - } - 33% { - opacity: 0; - } - 100% { - opacity: 1; - } -} -@keyframes fade-out-delayed { - 0% { - opacity: 1; - visibility: visible; - } - 66% { - opacity: 0; - } - 100% { - opacity: 0; - } -} -@keyframes shift-to-left { - from { - transform: translate(0, 0); - } - to { - transform: translate(-25%, 0); - } -} -@keyframes unshift-to-left { - from { - transform: translate(-25%, 0); - } - to { - transform: translate(0, 0); - } -} -@keyframes pop-in-from-right { - from { - transform: translate(100%, 0); - } - to { - transform: translate(0, 0); - } -} -@keyframes pop-out-to-right { - from { - transform: translate(0, 0); - visibility: visible; - } - to { - transform: translate(100%, 0); - } -} -body { - background: var(--color-background); - font-family: "Segoe UI", sans-serif; - font-size: 16px; - color: var(--color-text); -} - -a { - color: var(--color-link); - text-decoration: none; -} -a:hover { - text-decoration: underline; -} -a.external[target="_blank"] { - background-image: var(--external-icon); - background-position: top 3px right; - background-repeat: no-repeat; - padding-right: 13px; -} - -code, -pre { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; - padding: 0.2em; - margin: 0; - font-size: 14px; -} - -pre { - padding: 10px; -} -pre code { - padding: 0; - font-size: 100%; -} - -blockquote { - margin: 1em 0; - padding-left: 1em; - border-left: 4px solid gray; -} - -.tsd-typography { - line-height: 1.333em; -} -.tsd-typography ul { - list-style: square; - padding: 0 0 0 20px; - margin: 0; -} -.tsd-typography h4, -.tsd-typography .tsd-index-panel h3, -.tsd-index-panel .tsd-typography h3, -.tsd-typography h5, -.tsd-typography h6 { - font-size: 1em; - margin: 0; -} -.tsd-typography h5, -.tsd-typography h6 { - font-weight: normal; -} -.tsd-typography p, -.tsd-typography ul, -.tsd-typography ol { - margin: 1em 0; -} - -@media (min-width: 901px) and (max-width: 1024px) { - html .col-content { - width: 72%; - } - html .col-menu { - width: 28%; - } - html .tsd-navigation { - padding-left: 10px; - } -} -@media (max-width: 900px) { - html .col-content { - float: none; - width: 100%; - } - html .col-menu { - position: fixed !important; - overflow: auto; - -webkit-overflow-scrolling: touch; - z-index: 1024; - top: 0 !important; - bottom: 0 !important; - left: auto !important; - right: 0 !important; - width: 100%; - padding: 20px 20px 0 0; - max-width: 450px; - visibility: hidden; - background-color: var(--color-panel); - transform: translate(100%, 0); - } - html .col-menu > *:last-child { - padding-bottom: 20px; - } - html .overlay { - content: ""; - display: block; - position: fixed; - z-index: 1023; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: rgba(0, 0, 0, 0.75); - visibility: hidden; - } - - .to-has-menu .overlay { - animation: fade-in 0.4s; - } - - .to-has-menu :is(header, footer, .col-content) { - animation: shift-to-left 0.4s; - } - - .to-has-menu .col-menu { - animation: pop-in-from-right 0.4s; - } - - .from-has-menu .overlay { - animation: fade-out 0.4s; - } - - .from-has-menu :is(header, footer, .col-content) { - animation: unshift-to-left 0.4s; - } - - .from-has-menu .col-menu { - animation: pop-out-to-right 0.4s; - } - - .has-menu body { - overflow: hidden; - } - .has-menu .overlay { - visibility: visible; - } - .has-menu :is(header, footer, .col-content) { - transform: translate(-25%, 0); - } - .has-menu .col-menu { - visibility: visible; - transform: translate(0, 0); - display: grid; - grid-template-rows: auto 1fr; - max-height: 100vh; - } - .has-menu .tsd-navigation { - max-height: 100%; - } -} - -.tsd-page-title { - padding: 70px 0 20px 0; - margin: 0 0 40px 0; - background: var(--color-panel); - box-shadow: 0 0 5px rgba(0, 0, 0, 0.35); -} -.tsd-page-title h1 { - margin: 0; -} - -.tsd-breadcrumb { - margin: 0; - padding: 0; - color: var(--color-text-aside); -} -.tsd-breadcrumb a { - color: var(--color-text-aside); - text-decoration: none; -} -.tsd-breadcrumb a:hover { - text-decoration: underline; -} -.tsd-breadcrumb li { - display: inline; -} -.tsd-breadcrumb li:after { - content: " / "; -} - -dl.tsd-comment-tags { - overflow: hidden; -} -dl.tsd-comment-tags dt { - float: left; - padding: 1px 5px; - margin: 0 10px 0 0; - border-radius: 4px; - border: 1px solid var(--color-comment-tag); - color: var(--color-comment-tag); - font-size: 0.8em; - font-weight: normal; -} -dl.tsd-comment-tags dd { - margin: 0 0 10px 0; -} -dl.tsd-comment-tags dd:before, -dl.tsd-comment-tags dd:after { - display: table; - content: " "; -} -dl.tsd-comment-tags dd pre, -dl.tsd-comment-tags dd:after { - clear: both; -} -dl.tsd-comment-tags p { - margin: 0; -} - -.tsd-panel.tsd-comment .lead { - font-size: 1.1em; - line-height: 1.333em; - margin-bottom: 2em; -} -.tsd-panel.tsd-comment .lead:last-child { - margin-bottom: 0; -} - -.toggle-protected .tsd-is-private { - display: none; -} - -.toggle-public .tsd-is-private, -.toggle-public .tsd-is-protected, -.toggle-public .tsd-is-private-protected { - display: none; -} - -.toggle-inherited .tsd-is-inherited { - display: none; -} - -.toggle-externals .tsd-is-external { - display: none; -} - -#tsd-filter { - position: relative; - display: inline-block; - height: 40px; - vertical-align: bottom; -} -.no-filter #tsd-filter { - display: none; -} -#tsd-filter .tsd-filter-group { - display: inline-block; - height: 40px; - vertical-align: bottom; - white-space: nowrap; -} -#tsd-filter input { - display: none; -} -@media (max-width: 900px) { - #tsd-filter .tsd-filter-group { - display: block; - position: absolute; - top: 40px; - right: 20px; - height: auto; - background-color: var(--color-panel); - visibility: hidden; - transform: translate(50%, 0); - box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); - } - .has-options #tsd-filter .tsd-filter-group { - visibility: visible; - } - .to-has-options #tsd-filter .tsd-filter-group { - animation: fade-in 0.2s; - } - .from-has-options #tsd-filter .tsd-filter-group { - animation: fade-out 0.2s; - } - #tsd-filter label, - #tsd-filter .tsd-select { - display: block; - padding-right: 20px; - } -} - -footer { - border-top: 1px solid var(--color-panel-divider); - background-color: var(--color-panel); -} -footer:after { - content: ""; - display: table; -} -footer.with-border-bottom { - border-bottom: 1px solid var(--color-panel-divider); -} -footer .tsd-legend-group { - font-size: 0; -} -footer .tsd-legend { - display: inline-block; - width: 25%; - padding: 0; - font-size: 16px; - list-style: none; - line-height: 1.333em; - vertical-align: top; -} -@media (max-width: 900px) { - footer .tsd-legend { - width: 50%; - } -} - -.tsd-hierarchy { - list-style: square; - padding: 0 0 0 20px; - margin: 0; -} -.tsd-hierarchy .target { - font-weight: bold; -} - -.tsd-index-panel .tsd-index-content { - margin-bottom: -30px !important; -} -.tsd-index-panel .tsd-index-section { - margin-bottom: 30px !important; -} -.tsd-index-panel h3 { - margin: 0 -20px 10px -20px; - padding: 0 20px 10px 20px; - border-bottom: 1px solid var(--color-panel-divider); -} -.tsd-index-panel ul.tsd-index-list { - -webkit-column-count: 3; - -moz-column-count: 3; - -ms-column-count: 3; - -o-column-count: 3; - column-count: 3; - -webkit-column-gap: 20px; - -moz-column-gap: 20px; - -ms-column-gap: 20px; - -o-column-gap: 20px; - column-gap: 20px; - padding: 0; - list-style: none; - line-height: 1.333em; -} -@media (max-width: 900px) { - .tsd-index-panel ul.tsd-index-list { - -webkit-column-count: 1; - -moz-column-count: 1; - -ms-column-count: 1; - -o-column-count: 1; - column-count: 1; - } -} -@media (min-width: 901px) and (max-width: 1024px) { - .tsd-index-panel ul.tsd-index-list { - -webkit-column-count: 2; - -moz-column-count: 2; - -ms-column-count: 2; - -o-column-count: 2; - column-count: 2; - } -} -.tsd-index-panel ul.tsd-index-list li { - -webkit-page-break-inside: avoid; - -moz-page-break-inside: avoid; - -ms-page-break-inside: avoid; - -o-page-break-inside: avoid; - page-break-inside: avoid; -} -.tsd-index-panel a, -.tsd-index-panel .tsd-parent-kind-module a { - color: var(--color-ts); -} -.tsd-index-panel .tsd-parent-kind-interface a { - color: var(--color-ts-interface); -} -.tsd-index-panel .tsd-parent-kind-enum a { - color: var(--color-ts-enum); -} -.tsd-index-panel .tsd-parent-kind-class a { - color: var(--color-ts-class); -} -.tsd-index-panel .tsd-kind-module a { - color: var(--color-ts); -} -.tsd-index-panel .tsd-kind-interface a { - color: var(--color-ts-interface); -} -.tsd-index-panel .tsd-kind-enum a { - color: var(--color-ts-enum); -} -.tsd-index-panel .tsd-kind-class a { - color: var(--color-ts-class); -} -.tsd-index-panel .tsd-is-private a { - color: var(--color-ts-private); -} - -.tsd-flag { - display: inline-block; - padding: 1px 5px; - border-radius: 4px; - color: var(--color-comment-tag-text); - background-color: var(--color-comment-tag); - text-indent: 0; - font-size: 14px; - font-weight: normal; -} - -.tsd-anchor { - position: absolute; - top: -100px; -} - -.tsd-member { - position: relative; -} -.tsd-member .tsd-anchor + h3 { - margin-top: 0; - margin-bottom: 0; - border-bottom: none; -} -.tsd-member [data-tsd-kind] { - color: var(--color-ts); -} -.tsd-member [data-tsd-kind="Interface"] { - color: var(--color-ts-interface); -} -.tsd-member [data-tsd-kind="Enum"] { - color: var(--color-ts-enum); -} -.tsd-member [data-tsd-kind="Class"] { - color: var(--color-ts-class); -} -.tsd-member [data-tsd-kind="Private"] { - color: var(--color-ts-private); -} - -.tsd-navigation { - margin: 0 0 0 40px; -} -.tsd-navigation a { - display: block; - padding-top: 2px; - padding-bottom: 2px; - border-left: 2px solid transparent; - color: var(--color-text); - text-decoration: none; - transition: border-left-color 0.1s; -} -.tsd-navigation a:hover { - text-decoration: underline; -} -.tsd-navigation ul { - margin: 0; - padding: 0; - list-style: none; -} -.tsd-navigation li { - padding: 0; -} - -.tsd-navigation.primary { - padding-bottom: 40px; -} -.tsd-navigation.primary a { - display: block; - padding-top: 6px; - padding-bottom: 6px; -} -.tsd-navigation.primary ul li a { - padding-left: 5px; -} -.tsd-navigation.primary ul li li a { - padding-left: 25px; -} -.tsd-navigation.primary ul li li li a { - padding-left: 45px; -} -.tsd-navigation.primary ul li li li li a { - padding-left: 65px; -} -.tsd-navigation.primary ul li li li li li a { - padding-left: 85px; -} -.tsd-navigation.primary ul li li li li li li a { - padding-left: 105px; -} -.tsd-navigation.primary > ul { - border-bottom: 1px solid var(--color-panel-divider); -} -.tsd-navigation.primary li { - border-top: 1px solid var(--color-panel-divider); -} -.tsd-navigation.primary li.current > a { - font-weight: bold; -} -.tsd-navigation.primary li.label span { - display: block; - padding: 20px 0 6px 5px; - color: var(--color-menu-label); -} -.tsd-navigation.primary li.globals + li > span, -.tsd-navigation.primary li.globals + li > a { - padding-top: 20px; -} - -.tsd-navigation.secondary { - max-height: calc(100vh - 1rem - 40px); - overflow: auto; - position: sticky; - top: calc(0.5rem + 40px); - transition: 0.3s; -} -.tsd-navigation.secondary.tsd-navigation--toolbar-hide { - max-height: calc(100vh - 1rem); - top: 0.5rem; -} -.tsd-navigation.secondary ul { - transition: opacity 0.2s; -} -.tsd-navigation.secondary ul li a { - padding-left: 25px; -} -.tsd-navigation.secondary ul li li a { - padding-left: 45px; -} -.tsd-navigation.secondary ul li li li a { - padding-left: 65px; -} -.tsd-navigation.secondary ul li li li li a { - padding-left: 85px; -} -.tsd-navigation.secondary ul li li li li li a { - padding-left: 105px; -} -.tsd-navigation.secondary ul li li li li li li a { - padding-left: 125px; -} -.tsd-navigation.secondary ul.current a { - border-left-color: var(--color-panel-divider); -} -.tsd-navigation.secondary li.focus > a, -.tsd-navigation.secondary ul.current li.focus > a { - border-left-color: var(--color-menu-divider-focus); -} -.tsd-navigation.secondary li.current { - margin-top: 20px; - margin-bottom: 20px; - border-left-color: var(--color-panel-divider); -} -.tsd-navigation.secondary li.current > a { - font-weight: bold; -} - -@media (min-width: 901px) { - .menu-sticky-wrap { - position: static; - } -} - -.tsd-panel { - margin: 20px 0; - padding: 20px; - background-color: var(--color-panel); - box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); -} -.tsd-panel:empty { - display: none; -} -.tsd-panel > h1, -.tsd-panel > h2, -.tsd-panel > h3 { - margin: 1.5em -20px 10px -20px; - padding: 0 20px 10px 20px; - border-bottom: 1px solid var(--color-panel-divider); -} -.tsd-panel > h1.tsd-before-signature, -.tsd-panel > h2.tsd-before-signature, -.tsd-panel > h3.tsd-before-signature { - margin-bottom: 0; - border-bottom: 0; -} -.tsd-panel table { - display: block; - width: 100%; - overflow: auto; - margin-top: 10px; - word-break: normal; - word-break: keep-all; - border-collapse: collapse; -} -.tsd-panel table th { - font-weight: bold; -} -.tsd-panel table th, -.tsd-panel table td { - padding: 6px 13px; - border: 1px solid var(--color-panel-divider); -} -.tsd-panel table tr { - background: var(--color-background); -} -.tsd-panel table tr:nth-child(even) { - background: var(--color-secondary-background); -} - -.tsd-panel-group { - margin: 60px 0; -} -.tsd-panel-group > h1, -.tsd-panel-group > h2, -.tsd-panel-group > h3 { - padding-left: 20px; - padding-right: 20px; -} - -#tsd-search { - transition: background-color 0.2s; -} -#tsd-search .title { - position: relative; - z-index: 2; -} -#tsd-search .field { - position: absolute; - left: 0; - top: 0; - right: 40px; - height: 40px; -} -#tsd-search .field input { - box-sizing: border-box; - position: relative; - top: -50px; - z-index: 1; - width: 100%; - padding: 0 10px; - opacity: 0; - outline: 0; - border: 0; - background: transparent; - color: var(--color-text); -} -#tsd-search .field label { - position: absolute; - overflow: hidden; - right: -40px; -} -#tsd-search .field input, -#tsd-search .title { - transition: opacity 0.2s; -} -#tsd-search .results { - position: absolute; - visibility: hidden; - top: 40px; - width: 100%; - margin: 0; - padding: 0; - list-style: none; - box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); -} -#tsd-search .results li { - padding: 0 10px; - background-color: var(--color-background); -} -#tsd-search .results li:nth-child(even) { - background-color: var(--color-panel); -} -#tsd-search .results li.state { - display: none; -} -#tsd-search .results li.current, -#tsd-search .results li:hover { - background-color: var(--color-panel-divider); -} -#tsd-search .results a { - display: block; -} -#tsd-search .results a:before { - top: 10px; -} -#tsd-search .results span.parent { - color: var(--color-text-aside); - font-weight: normal; -} -#tsd-search.has-focus { - background-color: var(--color-panel-divider); -} -#tsd-search.has-focus .field input { - top: 0; - opacity: 1; -} -#tsd-search.has-focus .title { - z-index: 0; - opacity: 0; -} -#tsd-search.has-focus .results { - visibility: visible; -} -#tsd-search.loading .results li.state.loading { - display: block; -} -#tsd-search.failure .results li.state.failure { - display: block; -} - -.tsd-signature { - margin: 0 0 1em 0; - padding: 10px; - border: 1px solid var(--color-panel-divider); - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; - font-size: 14px; - overflow-x: auto; -} -.tsd-signature.tsd-kind-icon { - padding-left: 30px; -} -.tsd-signature.tsd-kind-icon:before { - top: 10px; - left: 10px; -} -.tsd-panel > .tsd-signature { - margin-left: -20px; - margin-right: -20px; - border-width: 1px 0; -} -.tsd-panel > .tsd-signature.tsd-kind-icon { - padding-left: 40px; -} -.tsd-panel > .tsd-signature.tsd-kind-icon:before { - left: 20px; -} - -.tsd-signature-symbol { - color: var(--color-text-aside); - font-weight: normal; -} - -.tsd-signature-type { - font-style: italic; - font-weight: normal; -} - -.tsd-signatures { - padding: 0; - margin: 0 0 1em 0; - border: 1px solid var(--color-panel-divider); -} -.tsd-signatures .tsd-signature { - margin: 0; - border-width: 1px 0 0 0; - transition: background-color 0.1s; -} -.tsd-signatures .tsd-signature:first-child { - border-top-width: 0; -} -.tsd-signatures .tsd-signature.current { - background-color: var(--color-panel-divider); -} -.tsd-signatures.active > .tsd-signature { - cursor: pointer; -} -.tsd-panel > .tsd-signatures { - margin-left: -20px; - margin-right: -20px; - border-width: 1px 0; -} -.tsd-panel > .tsd-signatures .tsd-signature.tsd-kind-icon { - padding-left: 40px; -} -.tsd-panel > .tsd-signatures .tsd-signature.tsd-kind-icon:before { - left: 20px; -} -.tsd-panel > a.anchor + .tsd-signatures { - border-top-width: 0; - margin-top: -20px; -} - -ul.tsd-descriptions { - position: relative; - overflow: hidden; - padding: 0; - list-style: none; -} -ul.tsd-descriptions.active > .tsd-description { - display: none; -} -ul.tsd-descriptions.active > .tsd-description.current { - display: block; -} -ul.tsd-descriptions.active > .tsd-description.fade-in { - animation: fade-in-delayed 0.3s; -} -ul.tsd-descriptions.active > .tsd-description.fade-out { - animation: fade-out-delayed 0.3s; - position: absolute; - display: block; - top: 0; - left: 0; - right: 0; - opacity: 0; - visibility: hidden; -} -ul.tsd-descriptions h4, -ul.tsd-descriptions .tsd-index-panel h3, -.tsd-index-panel ul.tsd-descriptions h3 { - font-size: 16px; - margin: 1em 0 0.5em 0; -} - -ul.tsd-parameters, -ul.tsd-type-parameters { - list-style: square; - margin: 0; - padding-left: 20px; -} -ul.tsd-parameters > li.tsd-parameter-signature, -ul.tsd-type-parameters > li.tsd-parameter-signature { - list-style: none; - margin-left: -20px; -} -ul.tsd-parameters h5, -ul.tsd-type-parameters h5 { - font-size: 16px; - margin: 1em 0 0.5em 0; -} -ul.tsd-parameters .tsd-comment, -ul.tsd-type-parameters .tsd-comment { - margin-top: -0.5em; -} - -.tsd-sources { - font-size: 14px; - color: var(--color-text-aside); - margin: 0 0 1em 0; -} -.tsd-sources a { - color: var(--color-text-aside); - text-decoration: underline; -} -.tsd-sources ul, -.tsd-sources p { - margin: 0 !important; -} -.tsd-sources ul { - list-style: none; - padding: 0; -} - -.tsd-page-toolbar { - position: fixed; - z-index: 1; - top: 0; - left: 0; - width: 100%; - height: 40px; - color: var(--color-toolbar-text); - background: var(--color-toolbar); - border-bottom: 1px solid var(--color-panel-divider); - transition: transform 0.3s linear; -} -.tsd-page-toolbar a { - color: var(--color-toolbar-text); - text-decoration: none; -} -.tsd-page-toolbar a.title { - font-weight: bold; -} -.tsd-page-toolbar a.title:hover { - text-decoration: underline; -} -.tsd-page-toolbar .table-wrap { - display: table; - width: 100%; - height: 40px; -} -.tsd-page-toolbar .table-cell { - display: table-cell; - position: relative; - white-space: nowrap; - line-height: 40px; -} -.tsd-page-toolbar .table-cell:first-child { - width: 100%; -} - -.tsd-page-toolbar--hide { - transform: translateY(-100%); -} - -.tsd-select .tsd-select-list li:before, -.tsd-select .tsd-select-label:before, -.tsd-widget:before { - content: ""; - display: inline-block; - width: 40px; - height: 40px; - margin: 0 -8px 0 0; - background-image: url(./widgets.png); - background-repeat: no-repeat; - text-indent: -1024px; - vertical-align: bottom; - filter: var(--icon-filter); -} -@media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { - .tsd-select .tsd-select-list li:before, - .tsd-select .tsd-select-label:before, - .tsd-widget:before { - background-image: url(./widgets@2x.png); - background-size: 320px 40px; - } -} - -.tsd-widget { - display: inline-block; - overflow: hidden; - opacity: 0.8; - height: 40px; - transition: opacity 0.1s, background-color 0.2s; - vertical-align: bottom; - cursor: pointer; -} -.tsd-widget:hover { - opacity: 0.9; -} -.tsd-widget.active { - opacity: 1; - background-color: var(--color-panel-divider); -} -.tsd-widget.no-caption { - width: 40px; -} -.tsd-widget.no-caption:before { - margin: 0; -} -.tsd-widget.search:before { - background-position: 0 0; -} -.tsd-widget.menu:before { - background-position: -40px 0; -} -.tsd-widget.options:before { - background-position: -80px 0; -} -.tsd-widget.options, -.tsd-widget.menu { - display: none; -} -@media (max-width: 900px) { - .tsd-widget.options, - .tsd-widget.menu { - display: inline-block; - } -} -input[type="checkbox"] + .tsd-widget:before { - background-position: -120px 0; -} -input[type="checkbox"]:checked + .tsd-widget:before { - background-position: -160px 0; -} - -.tsd-select { - position: relative; - display: inline-block; - height: 40px; - transition: opacity 0.1s, background-color 0.2s; - vertical-align: bottom; - cursor: pointer; -} -.tsd-select .tsd-select-label { - opacity: 0.6; - transition: opacity 0.2s; -} -.tsd-select .tsd-select-label:before { - background-position: -240px 0; -} -.tsd-select.active .tsd-select-label { - opacity: 0.8; -} -.tsd-select.active .tsd-select-list { - visibility: visible; - opacity: 1; - transition-delay: 0s; -} -.tsd-select .tsd-select-list { - position: absolute; - visibility: hidden; - top: 40px; - left: 0; - margin: 0; - padding: 0; - opacity: 0; - list-style: none; - box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); - transition: visibility 0s 0.2s, opacity 0.2s; -} -.tsd-select .tsd-select-list li { - padding: 0 20px 0 0; - background-color: var(--color-background); -} -.tsd-select .tsd-select-list li:before { - background-position: 40px 0; -} -.tsd-select .tsd-select-list li:nth-child(even) { - background-color: var(--color-panel); -} -.tsd-select .tsd-select-list li:hover { - background-color: var(--color-panel-divider); -} -.tsd-select .tsd-select-list li.selected:before { - background-position: -200px 0; -} -@media (max-width: 900px) { - .tsd-select .tsd-select-list { - top: 0; - left: auto; - right: 100%; - margin-right: -5px; - } - .tsd-select .tsd-select-label:before { - background-position: -280px 0; - } -} - -img { - max-width: 100%; -} - -.tsd-anchor-icon { - margin-left: 10px; - vertical-align: middle; - color: var(--color-text); -} - -.tsd-anchor-icon svg { - width: 1em; - height: 1em; - visibility: hidden; -} - -.tsd-anchor-link:hover > .tsd-anchor-icon svg { - visibility: visible; -} diff --git a/docs/agenda/6.x/assets/widgets.png b/docs/agenda/6.x/assets/widgets.png deleted file mode 100644 index c738053..0000000 Binary files a/docs/agenda/6.x/assets/widgets.png and /dev/null differ diff --git a/docs/agenda/6.x/assets/widgets@2x.png b/docs/agenda/6.x/assets/widgets@2x.png deleted file mode 100644 index 4bbbd57..0000000 Binary files a/docs/agenda/6.x/assets/widgets@2x.png and /dev/null differ diff --git a/docs/agenda/6.x/classes/Agenda.html b/docs/agenda/6.x/classes/Agenda.html deleted file mode 100644 index 239721d..0000000 --- a/docs/agenda/6.x/classes/Agenda.html +++ /dev/null @@ -1,269 +0,0 @@ -Agenda | @hokify/agenda
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • EventEmitter
    • Agenda

Index

Constructors

  • new Agenda(config?: ({ defaultConcurrency?: number; defaultLockLifetime?: number; defaultLockLimit?: number; lockLimit?: number; maxConcurrency?: number; name?: string; processEvery?: string | number } & IDbConfig) & ({ defaultConcurrency?: number; defaultLockLifetime?: number; defaultLockLimit?: number; lockLimit?: number; maxConcurrency?: number; name?: string; processEvery?: string | number } & IDatabaseOptions & IDbConfig) & ({ defaultConcurrency?: number; defaultLockLifetime?: number; defaultLockLimit?: number; lockLimit?: number; maxConcurrency?: number; name?: string; processEvery?: string | number } & IMongoOptions & IDbConfig), cb?: (error?: Error) => void): Agenda
  • Parameters

    • config: ({ defaultConcurrency?: number; defaultLockLifetime?: number; defaultLockLimit?: number; lockLimit?: number; maxConcurrency?: number; name?: string; processEvery?: string | number } & IDbConfig) & ({ defaultConcurrency?: number; defaultLockLifetime?: number; defaultLockLimit?: number; lockLimit?: number; maxConcurrency?: number; name?: string; processEvery?: string | number } & IDatabaseOptions & IDbConfig) & ({ defaultConcurrency?: number; defaultLockLifetime?: number; defaultLockLimit?: number; lockLimit?: number; maxConcurrency?: number; name?: string; processEvery?: string | number } & IMongoOptions & IDbConfig) = DefaultOptions
      -

      Agenda Config

      -
    • Optional cb: (error?: Error) => void
      -

      Callback after Agenda has started and connected to mongo

      -
        • (error?: Error): void
        • Parameters

          • Optional error: Error

          Returns void

    Returns Agenda

Properties

db: JobDbRepository
definitions: {} = {}

Type declaration

jobProcessor?: JobProcessor
ready: Promise<void>
captureRejectionSymbol: typeof captureRejectionSymbol
captureRejections: boolean
-

Sets or gets the default captureRejection value for all emitters.

-
defaultMaxListeners: number
errorMonitor: typeof errorMonitor
-

This symbol shall be used to install a listener for only monitoring 'error' -events. Listeners installed using this symbol are called before the regular -'error' listeners are called.

-

Installing a listener using this symbol does not change the behavior once an -'error' event is emitted, therefore the process will still crash if no -regular 'error' listener is installed.

-

Methods

  • addListener(eventName: string | symbol, listener: (...args: any[]) => void): Agenda
  • -

    Alias for emitter.on(eventName, listener).

    -
    since

    v0.1.26

    -

    Parameters

    • eventName: string | symbol
    • listener: (...args: any[]) => void
        • (...args: any[]): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    Returns Agenda

  • -

    Cancels any jobs matching the passed MongoDB query, and removes them from the database.

    -

    Parameters

    Returns Promise<number>

  • create(name: string): Job<void>
  • create<DATA>(name: string, data: DATA): Job<DATA>
  • -

    Given a name and some data, create a new job

    -

    Parameters

    • name: string
      -

    Returns Job<void>

  • Type parameters

    • DATA = unknown

    Parameters

    • name: string
    • data: DATA

    Returns Job<DATA>

  • createJobs<DATA>(names: string[], createJob: (name: string) => Promise<Job<DATA>>): Promise<Job<DATA>[]>
  • -

    Internal helper method that uses createJob to create jobs for an array of names

    -

    Type parameters

    • DATA = unknown

    Parameters

    • names: string[]
      -

      Strings of jobs to schedule

      -
    • createJob: (name: string) => Promise<Job<DATA>>
        • (name: string): Promise<Job<DATA>>
        • Parameters

          • name: string

          Returns Promise<Job<DATA>>

    Returns Promise<Job<DATA>[]>

    array of jobs created

    -
  • database(address: string, collection?: string, options?: MongoClientOptions): Promise<Agenda>
  • -

    Connect to the spec'd MongoDB server and database.

    -

    Parameters

    • address: string
    • Optional collection: string
    • Optional options: MongoClientOptions

    Returns Promise<Agenda>

  • defaultConcurrency(num: number): Agenda
  • -

    Set the default concurrency for each job

    -

    Parameters

    • num: number
      -

      number of max concurrency

      -

    Returns Agenda

  • defaultLockLifetime(ms: number): Agenda
  • -

    Set the default lock time (in ms) -Default is 10 * 60 * 1000 ms (10 minutes)

    -

    Parameters

    • ms: number
      -

    Returns Agenda

  • defaultLockLimit(num: number): Agenda
  • define<DATA>(name: string, processor: (agendaJob: Job<DATA>, done: (error?: Error) => void) => void, options?: Partial<Pick<IJobDefinition<unknown>, "lockLimit" | "lockLifetime" | "concurrency">> & { priority?: JobPriority }): void
  • define<DATA>(name: string, processor: (agendaJob: Job<DATA>) => Promise<void>, options?: Partial<Pick<IJobDefinition<unknown>, "lockLimit" | "lockLifetime" | "concurrency">> & { priority?: JobPriority }): void
  • -

    Setup definition for job -Method is used by consumers of lib to setup their functions -BREAKING CHANGE in v4: options moved from 2nd to 3rd parameter!

    -

    Type parameters

    • DATA = any

    Parameters

    • name: string
    • processor: (agendaJob: Job<DATA>, done: (error?: Error) => void) => void
        • (agendaJob: Job<DATA>, done: (error?: Error) => void): void
        • Parameters

          • agendaJob: Job<DATA>
          • done: (error?: Error) => void
              • (error?: Error): void
              • Parameters

                • Optional error: Error

                Returns void

          Returns void

    • Optional options: Partial<Pick<IJobDefinition<unknown>, "lockLimit" | "lockLifetime" | "concurrency">> & { priority?: JobPriority }
      -

    Returns void

  • Type parameters

    • DATA = any

    Parameters

    • name: string
    • processor: (agendaJob: Job<DATA>) => Promise<void>
        • (agendaJob: Job<DATA>): Promise<void>
        • Parameters

          • agendaJob: Job<DATA>

          Returns Promise<void>

    • Optional options: Partial<Pick<IJobDefinition<unknown>, "lockLimit" | "lockLifetime" | "concurrency">> & { priority?: JobPriority }

    Returns void

  • emit(eventName: string | symbol, ...args: any[]): boolean
  • -

    Synchronously calls each of the listeners registered for the event namedeventName, in the order they were registered, passing the supplied arguments -to each.

    -

    Returns true if the event had listeners, false otherwise.

    -
    const EventEmitter = require('events');
    const myEmitter = new EventEmitter();

    // First listener
    myEmitter.on('event', function firstListener() {
    console.log('Helloooo! first listener');
    });
    // Second listener
    myEmitter.on('event', function secondListener(arg1, arg2) {
    console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
    });
    // Third listener
    myEmitter.on('event', function thirdListener(...args) {
    const parameters = args.join(', ');
    console.log(`event with parameters ${parameters} in third listener`);
    });

    console.log(myEmitter.listeners('event'));

    myEmitter.emit('event', 1, 2, 3, 4, 5);

    // Prints:
    // [
    // [Function: firstListener],
    // [Function: secondListener],
    // [Function: thirdListener]
    // ]
    // Helloooo! first listener
    // event with parameters 1, 2 in second listener
    // event with parameters 1, 2, 3, 4, 5 in third listener -
    -
    since

    v0.1.26

    -

    Parameters

    • eventName: string | symbol
    • Rest ...args: any[]

    Returns boolean

  • eventNames(): (string | symbol)[]
  • -

    Returns an array listing the events for which the emitter has registered -listeners. The values in the array are strings or Symbols.

    -
    const EventEmitter = require('events');
    const myEE = new EventEmitter();
    myEE.on('foo', () => {});
    myEE.on('bar', () => {});

    const sym = Symbol('symbol');
    myEE.on(sym, () => {});

    console.log(myEE.eventNames());
    // Prints: [ 'foo', 'bar', Symbol(symbol) ] -
    -
    since

    v6.0.0

    -

    Returns (string | symbol)[]

  • every(interval: string | number, names: string[], data?: undefined, options?: { skipImmediate?: boolean; timezone?: string }): Promise<Job<void>[]>
  • every(interval: string | number, name: string, data?: undefined, options?: { skipImmediate?: boolean; timezone?: string }): Promise<Job<void>>
  • every<DATA>(interval: string | number, names: string[], data: DATA, options?: { skipImmediate?: boolean; timezone?: string }): Promise<Job<DATA>[]>
  • every<DATA>(interval: string | number, name: string, data: DATA, options?: { skipImmediate?: boolean; timezone?: string }): Promise<Job<DATA>>
  • -

    Creates a scheduled job with given interval and name/names of the job to run

    -

    Parameters

    • interval: string | number
    • names: string[]
    • Optional data: undefined
    • Optional options: { skipImmediate?: boolean; timezone?: string }
      -
      • Optional skipImmediate?: boolean
      • Optional timezone?: string

    Returns Promise<Job<void>[]>

  • Parameters

    • interval: string | number
    • name: string
    • Optional data: undefined
    • Optional options: { skipImmediate?: boolean; timezone?: string }
      • Optional skipImmediate?: boolean
      • Optional timezone?: string

    Returns Promise<Job<void>>

  • Type parameters

    • DATA = unknown

    Parameters

    • interval: string | number
    • names: string[]
    • data: DATA
    • Optional options: { skipImmediate?: boolean; timezone?: string }
      • Optional skipImmediate?: boolean
      • Optional timezone?: string

    Returns Promise<Job<DATA>[]>

  • Type parameters

    • DATA = unknown

    Parameters

    • interval: string | number
    • name: string
    • data: DATA
    • Optional options: { skipImmediate?: boolean; timezone?: string }
      • Optional skipImmediate?: boolean
      • Optional timezone?: string

    Returns Promise<Job<DATA>>

  • getMaxListeners(): number
  • -

    Returns the current max listener value for the EventEmitter which is either -set by emitter.setMaxListeners(n) or defaults to defaultMaxListeners.

    -
    since

    v1.0.0

    -

    Returns number

  • getRunningStats(fullDetails?: boolean): Promise<IAgendaStatus>
  • Parameters

    • fullDetails: boolean = false

    Returns Promise<IAgendaStatus>

  • isActiveJobProcessor(): boolean
  • jobs(query?: Filter<IJobParameters<unknown>>, sort?: Sort, limit?: number, skip?: number): Promise<Job<unknown>[]>
  • -

    Finds all jobs matching 'query'

    -

    Parameters

    • query: Filter<IJobParameters<unknown>> = {}
    • sort: Sort = {}
    • limit: number = 0
    • skip: number = 0
      -

    Returns Promise<Job<unknown>[]>

  • listenerCount(eventName: string | symbol): number
  • -

    Returns the number of listeners listening to the event named eventName.

    -
    since

    v3.2.0

    -

    Parameters

    • eventName: string | symbol
      -

      The name of the event being listened for

      -

    Returns number

  • listeners(eventName: string | symbol): Function[]
  • -

    Returns a copy of the array of listeners for the event named eventName.

    -
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ] -
    -
    since

    v0.1.26

    -

    Parameters

    • eventName: string | symbol

    Returns Function[]

  • lockLimit(num: number): Agenda
  • -

    Set the default amount jobs that are allowed to be locked at one time (GLOBAL)

    -

    Parameters

    • num: number
      -

    Returns Agenda

  • maxConcurrency(num: number): Agenda
  • -

    Set the concurrency for jobs (globally), type does not matter

    -

    Parameters

    • num: number
      -

    Returns Agenda

  • mongo(mongo: Db, collection?: string): Promise<Agenda>
  • -

    Use existing mongo connectino to pass into agenda

    -

    Parameters

    • mongo: Db
    • Optional collection: string
      -

    Returns Promise<Agenda>

  • now<DATA>(name: string): Promise<Job<DATA>>
  • now<DATA>(name: string, data: DATA): Promise<Job<DATA>>
  • -

    Create a job for this exact moment

    -

    Type parameters

    • DATA = void

    Parameters

    • name: string
      -

    Returns Promise<Job<DATA>>

  • Type parameters

    • DATA = unknown

    Parameters

    • name: string
    • data: DATA

    Returns Promise<Job<DATA>>

  • off(eventName: string | symbol, listener: (...args: any[]) => void): Agenda
  • -

    Alias for emitter.removeListener().

    -
    since

    v10.0.0

    -

    Parameters

    • eventName: string | symbol
    • listener: (...args: any[]) => void
        • (...args: any[]): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    Returns Agenda

  • once(eventName: string | symbol, listener: (...args: any[]) => void): Agenda
  • -

    Adds a one-timelistener function for the event named eventName. The -next time eventName is triggered, this listener is removed and then invoked.

    -
    server.once('connection', (stream) => {
    console.log('Ah, we have our first user!');
    }); -
    -

    Returns a reference to the EventEmitter, so that calls can be chained.

    -

    By default, event listeners are invoked in the order they are added. Theemitter.prependOnceListener() method can be used as an alternative to add the -event listener to the beginning of the listeners array.

    -
    const myEE = new EventEmitter();
    myEE.once('foo', () => console.log('a'));
    myEE.prependOnceListener('foo', () => console.log('b'));
    myEE.emit('foo');
    // Prints:
    // b
    // a -
    -
    since

    v0.3.0

    -

    Parameters

    • eventName: string | symbol
      -

      The name of the event.

      -
    • listener: (...args: any[]) => void
      -

      The callback function

      -
        • (...args: any[]): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    Returns Agenda

  • prependListener(eventName: string | symbol, listener: (...args: any[]) => void): Agenda
  • -

    Adds the listener function to the beginning of the listeners array for the -event named eventName. No checks are made to see if the listener has -already been added. Multiple calls passing the same combination of eventNameand listener will result in the listener being added, and called, multiple -times.

    -
    server.prependListener('connection', (stream) => {
    console.log('someone connected!');
    }); -
    -

    Returns a reference to the EventEmitter, so that calls can be chained.

    -
    since

    v6.0.0

    -

    Parameters

    • eventName: string | symbol
      -

      The name of the event.

      -
    • listener: (...args: any[]) => void
      -

      The callback function

      -
        • (...args: any[]): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    Returns Agenda

  • prependOnceListener(eventName: string | symbol, listener: (...args: any[]) => void): Agenda
  • -

    Adds a one-timelistener function for the event named eventName to the_beginning_ of the listeners array. The next time eventName is triggered, this -listener is removed, and then invoked.

    -
    server.prependOnceListener('connection', (stream) => {
    console.log('Ah, we have our first user!');
    }); -
    -

    Returns a reference to the EventEmitter, so that calls can be chained.

    -
    since

    v6.0.0

    -

    Parameters

    • eventName: string | symbol
      -

      The name of the event.

      -
    • listener: (...args: any[]) => void
      -

      The callback function

      -
        • (...args: any[]): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    Returns Agenda

  • processEvery(time: string | number): Agenda
  • -

    Set the time how often the job processor checks for new jobs to process

    -

    Parameters

    • time: string | number
      -

    Returns Agenda

  • purge(): Promise<number>
  • -

    Removes all jobs from queue

    -
    note:

    Only use after defining your jobs

    -

    Returns Promise<number>

  • rawListeners(eventName: string | symbol): Function[]
  • -

    Returns a copy of the array of listeners for the event named eventName, -including any wrappers (such as those created by .once()).

    -
    const emitter = new EventEmitter();
    emitter.once('log', () => console.log('log once'));

    // Returns a new Array with a function `onceWrapper` which has a property
    // `listener` which contains the original listener bound above
    const listeners = emitter.rawListeners('log');
    const logFnWrapper = listeners[0];

    // Logs "log once" to the console and does not unbind the `once` event
    logFnWrapper.listener();

    // Logs "log once" to the console and removes the listener
    logFnWrapper();

    emitter.on('log', () => console.log('log persistently'));
    // Will return a new Array with a single function bound by `.on()` above
    const newListeners = emitter.rawListeners('log');

    // Logs "log persistently" twice
    newListeners[0]();
    emitter.emit('log'); -
    -
    since

    v9.4.0

    -

    Parameters

    • eventName: string | symbol

    Returns Function[]

  • removeAllListeners(event?: string | symbol): Agenda
  • -

    Removes all listeners, or those of the specified eventName.

    -

    It is bad practice to remove listeners added elsewhere in the code, -particularly when the EventEmitter instance was created by some other -component or module (e.g. sockets or file streams).

    -

    Returns a reference to the EventEmitter, so that calls can be chained.

    -
    since

    v0.1.26

    -

    Parameters

    • Optional event: string | symbol

    Returns Agenda

  • removeListener(eventName: string | symbol, listener: (...args: any[]) => void): Agenda
  • -

    Removes the specified listener from the listener array for the event namedeventName.

    -
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); -
    -

    removeListener() will remove, at most, one instance of a listener from the -listener array. If any single listener has been added multiple times to the -listener array for the specified eventName, then removeListener() must be -called multiple times to remove each instance.

    -

    Once an event is emitted, all listeners attached to it at the -time of emitting are called in order. This implies that anyremoveListener() or removeAllListeners() calls after emitting and_before_ the last listener finishes execution will -not remove them fromemit() in progress. Subsequent events behave as expected.

    -
    const myEmitter = new MyEmitter();

    const callbackA = () => {
    console.log('A');
    myEmitter.removeListener('event', callbackB);
    };

    const callbackB = () => {
    console.log('B');
    };

    myEmitter.on('event', callbackA);

    myEmitter.on('event', callbackB);

    // callbackA removes listener callbackB but it will still be called.
    // Internal listener array at time of emit [callbackA, callbackB]
    myEmitter.emit('event');
    // Prints:
    // A
    // B

    // callbackB is now removed.
    // Internal listener array [callbackA]
    myEmitter.emit('event');
    // Prints:
    // A -
    -

    Because listeners are managed using an internal array, calling this will -change the position indices of any listener registered after the listener -being removed. This will not impact the order in which listeners are called, -but it means that any copies of the listener array as returned by -the emitter.listeners() method will need to be recreated.

    -

    When a single function has been added as a handler multiple times for a single -event (as in the example below), removeListener() will remove the most -recently added instance. In the example the once('ping')listener is removed:

    -
    const ee = new EventEmitter();

    function pong() {
    console.log('pong');
    }

    ee.on('ping', pong);
    ee.once('ping', pong);
    ee.removeListener('ping', pong);

    ee.emit('ping');
    ee.emit('ping'); -
    -

    Returns a reference to the EventEmitter, so that calls can be chained.

    -
    since

    v0.1.26

    -

    Parameters

    • eventName: string | symbol
    • listener: (...args: any[]) => void
        • (...args: any[]): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    Returns Agenda

  • schedule<DATA>(when: string | Date, names: string[]): Promise<Job<DATA>[]>
  • schedule<DATA>(when: string | Date, names: string): Promise<Job<DATA>>
  • schedule<DATA>(when: string | Date, names: string[], data: DATA): Promise<Job<DATA>[]>
  • schedule<DATA>(when: string | Date, name: string, data: DATA): Promise<Job<DATA>>
  • -

    Schedule a job or jobs at a specific time

    -

    Type parameters

    • DATA = void

    Parameters

    • when: string | Date
    • names: string[]
      -

    Returns Promise<Job<DATA>[]>

  • Type parameters

    • DATA = void

    Parameters

    • when: string | Date
    • names: string

    Returns Promise<Job<DATA>>

  • Type parameters

    • DATA = unknown

    Parameters

    • when: string | Date
    • names: string[]
    • data: DATA

    Returns Promise<Job<DATA>[]>

  • Type parameters

    • DATA = unknown

    Parameters

    • when: string | Date
    • name: string
    • data: DATA

    Returns Promise<Job<DATA>>

  • setMaxListeners(n: number): Agenda
  • -

    By default EventEmitters will print a warning if more than 10 listeners are -added for a particular event. This is a useful default that helps finding -memory leaks. The emitter.setMaxListeners() method allows the limit to be -modified for this specific EventEmitter instance. The value can be set toInfinity (or 0) to indicate an unlimited number of listeners.

    -

    Returns a reference to the EventEmitter, so that calls can be chained.

    -
    since

    v0.3.5

    -

    Parameters

    • n: number

    Returns Agenda

  • -

    Set the sort query for finding next job -Default is { nextRunAt: 1, priority: -1 }

    -

    Parameters

    • query: {}
      -
      • [key: string]: SortDirection

    Returns Agenda

  • start(): Promise<void>
  • -

    Starts processing jobs using processJobs() methods, storing an interval ID -This method will only resolve if a db has been set up beforehand.

    -

    Returns Promise<void>

  • stop(): Promise<void>
  • -

    Clear the interval that processes the jobs and unlocks all currently locked jobs

    -

    Returns Promise<void>

  • getEventListeners(emitter: DOMEventTarget | EventEmitter, name: string | symbol): Function[]
  • -

    Returns a copy of the array of listeners for the event named eventName.

    -

    For EventEmitters this behaves exactly the same as calling .listeners on -the emitter.

    -

    For EventTargets this is the only way to get the event listeners for the -event target. This is useful for debugging and diagnostic purposes.

    -
    const { getEventListeners, EventEmitter } = require('events');

    {
    const ee = new EventEmitter();
    const listener = () => console.log('Events are fun');
    ee.on('foo', listener);
    getEventListeners(ee, 'foo'); // [listener]
    }
    {
    const et = new EventTarget();
    const listener = () => console.log('Events are fun');
    et.addEventListener('foo', listener);
    getEventListeners(et, 'foo'); // [listener]
    } -
    -
    since

    v15.2.0, v14.17.0

    -

    Parameters

    • emitter: DOMEventTarget | EventEmitter
    • name: string | symbol

    Returns Function[]

  • listenerCount(emitter: EventEmitter, eventName: string | symbol): number
  • -

    A class method that returns the number of listeners for the given eventNameregistered on the given emitter.

    -
    const { EventEmitter, listenerCount } = require('events');
    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2 -
    -
    since

    v0.9.12

    -
    deprecated

    Since v3.2.0 - Use listenerCount instead.

    -

    Parameters

    • emitter: EventEmitter
      -

      The emitter to query

      -
    • eventName: string | symbol
      -

      The event name

      -

    Returns number

  • on(emitter: EventEmitter, eventName: string, options?: StaticEventEmitterOptions): AsyncIterableIterator<any>
  • -

    ```js -const { on, EventEmitter } = require('events');

    -

    (async () => { - const ee = new EventEmitter();

    -

    // Emit later on - process.nextTick(() => { - ee.emit('foo', 'bar'); - ee.emit('foo', 42); - });

    -

    for await (const event of on(ee, 'foo')) { - // The execution of this inner block is synchronous and it - // processes one event at a time (even with await). Do not use - // if concurrent execution is required. - console.log(event); // prints ['bar'] [42] - } - // Unreachable here -})();

    -

    Returns an `AsyncIterator` that iterates `eventName` events. It will throw
    if the `EventEmitter` emits `'error'`. It removes all listeners when
    exiting the loop. The `value` returned by each iteration is an array
    composed of the emitted event arguments.

    An `AbortSignal` can be used to cancel waiting on events:

    ```js
    const { on, EventEmitter } = require('events');
    const ac = new AbortController();

    (async () => {
    const ee = new EventEmitter();

    // Emit later on
    process.nextTick(() => {
    ee.emit('foo', 'bar');
    ee.emit('foo', 42);
    });

    for await (const event of on(ee, 'foo', { signal: ac.signal })) {
    // The execution of this inner block is synchronous and it
    // processes one event at a time (even with await). Do not use
    // if concurrent execution is required.
    console.log(event); // prints ['bar'] [42]
    }
    // Unreachable here
    })();

    process.nextTick(() => ac.abort()); -
    -
    since

    v13.6.0, v12.16.0

    -

    Parameters

    • emitter: EventEmitter
    • eventName: string
      -

      The name of the event being listened for

      -
    • Optional options: StaticEventEmitterOptions

    Returns AsyncIterableIterator<any>

    that iterates eventName events emitted by the emitter

    -
  • once(emitter: NodeEventTarget, eventName: string | symbol, options?: StaticEventEmitterOptions): Promise<any[]>
  • once(emitter: DOMEventTarget, eventName: string, options?: StaticEventEmitterOptions): Promise<any[]>
  • -

    Creates a Promise that is fulfilled when the EventEmitter emits the given -event or that is rejected if the EventEmitter emits 'error' while waiting. -The Promise will resolve with an array of all the arguments emitted to the -given event.

    -

    This method is intentionally generic and works with the web platform EventTarget interface, which has no special'error' event -semantics and does not listen to the 'error' event.

    -
    const { once, EventEmitter } = require('events');

    async function run() {
    const ee = new EventEmitter();

    process.nextTick(() => {
    ee.emit('myevent', 42);
    });

    const [value] = await once(ee, 'myevent');
    console.log(value);

    const err = new Error('kaboom');
    process.nextTick(() => {
    ee.emit('error', err);
    });

    try {
    await once(ee, 'myevent');
    } catch (err) {
    console.log('error happened', err);
    }
    }

    run(); -
    -

    The special handling of the 'error' event is only used when events.once()is used to wait for another event. If events.once() is used to wait for the -'error' event itself, then it is treated as any other kind of event without -special handling:

    -
    const { EventEmitter, once } = require('events');

    const ee = new EventEmitter();

    once(ee, 'error')
    .then(([err]) => console.log('ok', err.message))
    .catch((err) => console.log('error', err.message));

    ee.emit('error', new Error('boom'));

    // Prints: ok boom -
    -

    An AbortSignal can be used to cancel waiting for the event:

    -
    const { EventEmitter, once } = require('events');

    const ee = new EventEmitter();
    const ac = new AbortController();

    async function foo(emitter, event, signal) {
    try {
    await once(emitter, event, { signal });
    console.log('event emitted!');
    } catch (error) {
    if (error.name === 'AbortError') {
    console.error('Waiting for the event was canceled!');
    } else {
    console.error('There was an error', error.message);
    }
    }
    }

    foo(ee, 'foo', ac.signal);
    ac.abort(); // Abort waiting for the event
    ee.emit('foo'); // Prints: Waiting for the event was canceled! -
    -
    since

    v11.13.0, v10.16.0

    -

    Parameters

    • emitter: NodeEventTarget
    • eventName: string | symbol
    • Optional options: StaticEventEmitterOptions

    Returns Promise<any[]>

  • Parameters

    • emitter: DOMEventTarget
    • eventName: string
    • Optional options: StaticEventEmitterOptions

    Returns Promise<any[]>

  • setMaxListeners(n?: number, ...eventTargets: (DOMEventTarget | EventEmitter)[]): void
  • -

    By default EventEmitters will print a warning if more than 10 listeners are -added for a particular event. This is a useful default that helps finding -memory leaks. The EventEmitter.setMaxListeners() method allows the default limit to be -modified (if eventTargets is empty) or modify the limit specified in every EventTarget | EventEmitter passed as arguments. -The value can be set toInfinity (or 0) to indicate an unlimited number of listeners.

    -
    EventEmitter.setMaxListeners(20);
    // Equivalent to
    EventEmitter.defaultMaxListeners = 20;

    const eventTarget = new EventTarget();
    // Only way to increase limit for `EventTarget` instances
    // as these doesn't expose its own `setMaxListeners` method
    EventEmitter.setMaxListeners(20, eventTarget); -
    -
    since

    v15.3.0, v14.17.0

    -

    Parameters

    • Optional n: number
    • Rest ...eventTargets: (DOMEventTarget | EventEmitter)[]

    Returns void

Legend

  • Constructor
  • Property
  • Method
  • Private property
  • Private method
  • Property

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/agenda/6.x/classes/Job.html b/docs/agenda/6.x/classes/Job.html deleted file mode 100644 index 1473412..0000000 --- a/docs/agenda/6.x/classes/Job.html +++ /dev/null @@ -1,53 +0,0 @@ -Job | @hokify/agenda
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class Job<DATA>

Type parameters

  • DATA = unknown | void

Hierarchy

  • Job

Index

Constructors

  • new Job<DATA>(agenda: Agenda, args: Partial<IJobParameters<void>> & { name: string; type: "normal" | "single" }, byJobProcessor?: boolean): Job<DATA>
  • new Job<DATA>(agenda: Agenda, args: Partial<IJobParameters<DATA>> & { data: DATA; name: string; type: "normal" | "single" }, byJobProcessor?: boolean): Job<DATA>
  • -

    creates a new job object

    -

    Type parameters

    • DATA = unknown

    Parameters

    • agenda: Agenda
    • args: Partial<IJobParameters<void>> & { name: string; type: "normal" | "single" }
    • Optional byJobProcessor: boolean
      -

    Returns Job<DATA>

  • -

    creates a new job object

    -

    Type parameters

    • DATA = unknown

    Parameters

    • agenda: Agenda
    • args: Partial<IJobParameters<DATA>> & { data: DATA; name: string; type: "normal" | "single" }
    • Optional byJobProcessor: boolean
      -

    Returns Job<DATA>

Properties

agenda: Agenda
attrs: IJobParameters<DATA>
canceled: undefined | Error
-

this flag is set to true, if a job got canceled (e.g. due to a timeout or other exception), -you can use it for long running tasks to periodically check if canceled is true, -also touch will check if and throws that the job got canceled

-
gotTimerToExecute: boolean
-

internal variable to ensure a job does not set unlimited numbers of setTimeouts if the job is not processed -immediately

-

Methods

  • computeNextRunAt(): Job<DATA>
  • disable(): Job<DATA>
  • enable(): Job<DATA>
  • fail(reason: string | Error): Job<DATA>
  • -

    Fails the job with a reason (error) specified

    -

    Parameters

    • reason: string | Error
      -

    Returns Job<DATA>

  • fetchStatus(): Promise<void>
  • isDead(): Promise<boolean>
  • isExpired(): boolean
  • isPromise(value: unknown): value is Promise<void>
  • Parameters

    • value: unknown

    Returns value is Promise<void>

  • isRunning(): Promise<boolean>
  • -

    A job is running if: -(lastRunAt exists AND lastFinishedAt does not exist) -OR -(lastRunAt exists AND lastFinishedAt exists but the lastRunAt is newer [in time] than lastFinishedAt)

    -

    Returns Promise<boolean>

    Whether or not job is running at the moment (true for running)

    -
  • priority(priority: JobPriority): Job<DATA>
  • -

    Sets priority of the job

    -

    Parameters

    • priority: JobPriority
      -

      priority of when job should be queued

      -

    Returns Job<DATA>

  • remove(): Promise<number>
  • -

    Remove the job from database

    -

    Returns Promise<number>

  • repeatAt(time: string): Job<DATA>
  • -

    Sets a job to repeat at a specific time

    -

    Parameters

    • time: string
      -

    Returns Job<DATA>

  • repeatEvery(interval: string | number, options?: { skipImmediate?: boolean; timezone?: string }): Job<DATA>
  • -

    Sets a job to repeat every X amount of time

    -

    Parameters

    • interval: string | number
    • options: { skipImmediate?: boolean; timezone?: string } = {}
      -
      • Optional skipImmediate?: boolean
      • Optional timezone?: string

    Returns Job<DATA>

  • run(): Promise<void>
  • save(): Promise<Job<unknown>>
  • schedule(time: string | Date): Job<DATA>
  • -

    Schedules a job to run at specified time

    -

    Parameters

    • time: string | Date
      -

    Returns Job<DATA>

  • touch(progress?: number): Promise<void>
  • -

    Updates "lockedAt" time so the job does not get picked up again

    -

    Parameters

    • Optional progress: number
      -

      0 to 100

      -

    Returns Promise<void>

  • unique(unique: Filter<Omit<IJobParameters<DATA>, "unique">>, opts?: { insertOnly: boolean }): Job<DATA>
  • -

    Data to ensure is unique for job to be created

    -

    Parameters

    • unique: Filter<Omit<IJobParameters<DATA>, "unique">>
    • Optional opts: { insertOnly: boolean }
      -
      • insertOnly: boolean

    Returns Job<DATA>

Legend

  • Constructor
  • Property
  • Method
  • Private property
  • Private method
  • Property

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/agenda/6.x/index.html b/docs/agenda/6.x/index.html deleted file mode 100644 index 6bddcc6..0000000 --- a/docs/agenda/6.x/index.html +++ /dev/null @@ -1,819 +0,0 @@ -@hokify/agenda
Options
All
  • Public
  • Public/Protected
  • All
Menu

@hokify/agenda

- -

AgendaTS

-
-

(full typed version of agendaJS)

-

- Agenda TS -

-

- A light-weight job scheduling library for Node.js -

- -

This was originally a fork of agenda.js, -it differs from the original version in following points:

-
    -
  • Complete rewrite in Typescript (fully typed!)
  • -
  • mongodb4 driver (supports mongodb 5.x)
  • -
  • Supports mongoDB sharding by name
  • -
  • touch() can have an optional progress parameter (0-100)
  • -
  • Bugfixes and improvements for locking & job processing (concurrency, lockLimit,..)
  • -
  • Breaking change: define() config paramter moved from 2nd position to 3rd
  • -
  • getRunningStats()
  • -
  • automatically waits for agenda to be connected before calling any database operations
  • -
  • uses a database abstraction layer behind the scene
  • -
  • does not create a database index by default, you can set ensureIndex: true when initializing Agenda -or run manually:
    db.agendaJobs.ensureIndex({
    "name" : 1,
    "nextRunAt" : 1,
    "priority" : -1,
    "lockedAt" : 1,
    "disabled" : 1
    }, "findAndLockNextJobIndex") -
    -
  • -
- - -

Agenda offers

-
-
    -
  • Minimal overhead. Agenda aims to keep its code base small.
  • -
  • Mongo backed persistence layer.
  • -
  • Promises based API.
  • -
  • Scheduling with configurable priority, concurrency, and repeating.
  • -
  • Scheduling via cron or human readable syntax.
  • -
  • Event backed job queue that you can hook into.
  • -
  • Agendash: optional standalone web-interface.
  • -
  • Agenda-rest: optional standalone REST API.
  • -
  • inversify-agenda - Some utilities for the development of agenda workers with Inversify
  • -
- - -

Feature Comparison

-
-

Since there are a few job queue solutions, here a table comparing them to help you use the one that -better suits your needs.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FeatureBullBeeAgendaAgendaTS
Backendredisredismongomongo
Prioritiesβœ“βœ“βœ“
Concurrencyβœ“βœ“βœ“βœ“
Delayed jobsβœ“βœ“βœ“
Global eventsβœ“
Rate Limiterβœ“
Pause/Resumeβœ“~
Sandboxed workerβœ“
Repeatable jobsβœ“βœ“βœ“
Atomic opsβœ“βœ“~
Persistenceβœ“βœ“βœ“βœ“
UIβœ“βœ“βœ“
REST APIβœ“βœ“
Optimized forJobs / MessagesMessagesJobsJobs
-

Kudos for making the comparison chart goes to Bull maintainers.

- - -

Installation

-
-

Install via NPM

-
npm install @hokify/agenda
-
-

You will also need a working Mongo database (v4+) to point it to.

- - -

Example Usage

-
-
const mongoConnectionString = 'mongodb://127.0.0.1/agenda';

const agenda = new Agenda({db: {address: mongoConnectionString}});

// Or override the default collection name:
// const agenda = new Agenda({db: {address: mongoConnectionString, collection: 'jobCollectionName'}});

// or pass additional connection options:
// const agenda = new Agenda({db: {address: mongoConnectionString, collection: 'jobCollectionName', options: {ssl: true}}});

// or pass in an existing mongodb-native MongoClient instance
// const agenda = new Agenda({mongo: myMongoClient});

agenda.define('delete old users', async job => {
await User.remove({lastLogIn: {$lt: twoDaysAgo}});
});

(async function() { // IIFE to give access to async/await
await agenda.start();

await agenda.every('3 minutes', 'delete old users');

// Alternatively, you could also do:
await agenda.every('*/3 * * * *', 'delete old users');
})(); -
-
agenda.define('send email report', async job => {
const {to} = job.attrs.data;
await emailClient.send({
to,
from: 'example@example.com',
subject: 'Email Report',
body: '...'
});
}, {priority: 'high', concurrency: 10}, );

(async function() {
await agenda.start();
await agenda.schedule('in 20 minutes', 'send email report', {to: 'admin@example.com'});
})(); -
-
(async function() {
const weeklyReport = agenda.create('send email report', {to: 'example@example.com'});
await agenda.start();
await weeklyReport.repeatEvery('1 week').save();
})(); -
- - -

Full documentation

-
-

See also https://hokify.github.io/agenda/

-

Agenda's basic control structure is an instance of an agenda. Agenda's are -mapped to a database collection and load the jobs from within.

- - -

Table of Contents

-
- - - -

Configuring an agenda

-
-

All configuration methods are chainable, meaning you can do something like:

-
const agenda = new Agenda();
agenda
.database(...)
.processEvery('3 minutes')
...; -
-

Possible agenda config options:

-
{
name: string;
defaultConcurrency: number;
processEvery: number;
maxConcurrency: number;
defaultLockLimit: number;
lockLimit: number;
defaultLockLifetime: number;
ensureIndex: boolean;
sort: SortOptionObject<IJobParameters>;
db: {
collection: string;
address: string;
options: MongoClientOptions;
};
mongo: Db;
} -
-

Agenda uses Human Interval for specifying the intervals. It supports the following units:

-

seconds, minutes, hours, days,weeks, months -- assumes 30 days, years -- assumes 365 days

-

More sophisticated examples

-
agenda.processEvery('one minute');
agenda.processEvery('1.5 minutes');
agenda.processEvery('3 days and 4 hours');
agenda.processEvery('3 days, 4 hours and 36 seconds'); -
- - -

database(url, [collectionName], [MongoClientOptions])

-
-

Specifies the database at the url specified. If no collection name is given, -agendaJobs is used.

-

By default useNewUrlParser and useUnifiedTopology is set to true,

-
agenda.database('localhost:27017/agenda-test', 'agendaJobs');
-
-

You can also specify it during instantiation.

-
const agenda = new Agenda({db: {address: 'localhost:27017/agenda-test', collection: 'agendaJobs'}});
-
-

Agenda will emit a ready event (see Agenda Events) when properly connected to the database. -It is safe to call agenda.start() without waiting for this event, as this is handled internally. -If you're using the db options, or call database, then you may still need to listen for ready before saving jobs.

- - -

mongo(dbInstance, [collectionName])

-
-

Use an existing mongodb-native MongoClient/Db instance. This can help consolidate connections to a -database. You can instead use .database to have agenda handle connecting for you.

-

You can also specify it during instantiation:

-
const agenda = new Agenda({mongo: mongoClientInstance.db('agenda-test')});
-
-

Note that MongoClient.connect() returns a mongoClientInstance since node-mongodb-native 3.0.0, while it used to return a dbInstance that could then be directly passed to agenda.

- - -

name(name)

-
-

Takes a string name and sets lastModifiedBy to it in the job database. -Useful for if you have multiple job processors (agendas) and want to see which -job queue last ran the job.

-
agenda.name(os.hostname + '-' + process.pid);
-
-

You can also specify it during instantiation

-
const agenda = new Agenda({name: 'test queue'});
-
- - -

processEvery(interval)

-
-

Takes a string interval which can be either a traditional javascript number, -or a string such as 3 minutes

-

Specifies the frequency at which agenda will query the database looking for jobs -that need to be processed. Agenda internally uses setTimeout to guarantee that -jobs run at (close to ~3ms) the right time.

-

Decreasing the frequency will result in fewer database queries, but more jobs -being stored in memory.

-

Also worth noting is that if the job queue is shutdown, any jobs stored in memory -that haven't run will still be locked, meaning that you may have to wait for the -lock to expire. By default it is '5 seconds'.

-
agenda.processEvery('1 minute');
-
-

You can also specify it during instantiation

-
const agenda = new Agenda({processEvery: '30 seconds'});
-
- - -

maxConcurrency(number)

-
-

Takes a number which specifies the max number of jobs that can be running at -any given moment. By default it is 20.

-
agenda.maxConcurrency(20);
-
-

You can also specify it during instantiation

-
const agenda = new Agenda({maxConcurrency: 20});
-
- - -

defaultConcurrency(number)

-
-

Takes a number which specifies the default number of a specific job that can be running at -any given moment. By default it is 5.

-
agenda.defaultConcurrency(5);
-
-

You can also specify it during instantiation

-
const agenda = new Agenda({defaultConcurrency: 5});
-
- - -

lockLimit(number)

-
-

Takes a number which specifies the max number jobs that can be locked at any given moment. By default it is 0 for no max.

-
agenda.lockLimit(0);
-
-

You can also specify it during instantiation

-
const agenda = new Agenda({lockLimit: 0});
-
- - -

defaultLockLimit(number)

-
-

Takes a number which specifies the default number of a specific job that can be locked at any given moment. By default it is 0 for no max.

-
agenda.defaultLockLimit(0);
-
-

You can also specify it during instantiation

-
const agenda = new Agenda({defaultLockLimit: 0});
-
- - -

defaultLockLifetime(number)

-
-

Takes a number which specifies the default lock lifetime in milliseconds. By -default it is 10 minutes. This can be overridden by specifying the -lockLifetime option to a defined job.

-

A job will unlock if it is finished (ie. the returned Promise resolves/rejects -or done is specified in the params and done() is called) before the -lockLifetime. The lock is useful if the job crashes or times out.

-
agenda.defaultLockLifetime(10000);
-
-

You can also specify it during instantiation

-
const agenda = new Agenda({defaultLockLifetime: 10000});
-
- - -

sort(query)

-
-

Takes a query which specifies the sort query to be used for finding and locking the next job.

-

By default it is { nextRunAt: 1, priority: -1 }, which obeys a first in first out approach, with respect to priority.

- - -

Agenda Events

-
-

An instance of an agenda will emit the following events:

-
    -
  • ready - called when Agenda mongo connection is successfully opened and indices created. - If you're passing agenda an existing connection, you shouldn't need to listen for this, as agenda.start() will not resolve until indices have been created. - If you're using the db options, or call database, then you may still need to listen for the ready event before saving jobs. agenda.start() will still wait for the connection to be opened.
  • -
  • error - called when Agenda mongo connection process has thrown an error
  • -
-
await agenda.start();
-
- - -

Defining Job Processors

-
-

Before you can use a job, you must define its processing behavior.

- - -

define(jobName, fn, [options])

-
-

Defines a job with the name of jobName. When a job of jobName gets run, it -will be passed to fn(job, done). To maintain asynchronous behavior, you may -either provide a Promise-returning function in fn or provide done as a -second parameter to fn. If done is specified in the function signature, you -must call done() when you are processing the job. If your function is -synchronous or returns a Promise, you may omit done from the signature.

-

options is an optional argument which can overwrite the defaults. It can take -the following:

-
    -
  • concurrency: number maximum number of that job that can be running at once (per instance of agenda)
  • -
  • lockLimit: number maximum number of that job that can be locked at once (per instance of agenda)
  • -
  • lockLifetime: number interval in ms of how long the job stays locked for (see multiple job processors for more info). -A job will automatically unlock once a returned promise resolves/rejects (or if done is specified in the signature and done() is called).
  • -
  • priority: (lowest|low|normal|high|highest|number) specifies the priority -of the job. Higher priority jobs will run first. See the priority mapping -below
  • -
-

Priority mapping:

-
{
highest: 20,
high: 10,
normal: 0,
low: -10,
lowest: -20
} -
-

Async Job:

-
agenda.define('some long running job', async job => {
const data = await doSomelengthyTask();
await formatThatData(data);
await sendThatData(data);
}); -
-

Async Job (using done):

-
agenda.define('some long running job', (job, done) => {
doSomelengthyTask(data => {
formatThatData(data);
sendThatData(data);
done();
});
}); -
-

Sync Job:

-
agenda.define('say hello', job => {
console.log('Hello!');
}); -
-

define() acts like an assignment: if define(jobName, ...) is called multiple times (e.g. every time your script starts), the definition in the last call will overwrite the previous one. Thus, if you define the jobName only once in your code, it's safe for that call to execute multiple times.

- - -

Creating Jobs

-
- - -

every(interval, name, [data], [options])

-
-

Runs job name at the given interval. Optionally, data and options can be passed in. -Every creates a job of type single, which means that it will only create one -job in the database, even if that line is run multiple times. This lets you put -it in a file that may get run multiple times, such as webserver.js which may -reboot from time to time.

-

interval can be a human-readable format String, a cron format String, or a Number.

-

data is an optional argument that will be passed to the processing function -under job.attrs.data.

-

options is an optional argument that will be passed to job.repeatEvery. -In order to use this argument, data must also be specified.

-

Returns the job.

-
agenda.define('printAnalyticsReport', async job => {
const users = await User.doSomethingReallyIntensive();
processUserData(users);
console.log('I print a report!');
});

agenda.every('15 minutes', 'printAnalyticsReport'); -
-

Optionally, name could be array of job names, which is convenient for scheduling -different jobs for same interval.

-
agenda.every('15 minutes', ['printAnalyticsReport', 'sendNotifications', 'updateUserRecords']);
-
-

In this case, every returns array of jobs.

- - -

schedule(when, name, [data])

-
-

Schedules a job to run name once at a given time. when can be a Date or a -String such as tomorrow at 5pm.

-

data is an optional argument that will be passed to the processing function -under job.attrs.data.

-

Returns the job.

-
agenda.schedule('tomorrow at noon', 'printAnalyticsReport', {userCount: 100});
-
-

Optionally, name could be array of job names, similar to the every method.

-
agenda.schedule('tomorrow at noon', ['printAnalyticsReport', 'sendNotifications', 'updateUserRecords']);
-
-

In this case, schedule returns array of jobs.

- - -

now(name, [data])

-
-

Schedules a job to run name once immediately.

-

data is an optional argument that will be passed to the processing function -under job.attrs.data.

-

Returns the job.

-
agenda.now('do the hokey pokey');
-
- - -

create(jobName, data)

-
-

Returns an instance of a jobName with data. This does NOT save the job in -the database. See below to learn how to manually work with jobs.

-
const job = agenda.create('printAnalyticsReport', {userCount: 100});
await job.save();
console.log('Job successfully saved'); -
- - -

Managing Jobs

-
- - -

jobs(mongodb-native query, mongodb-native sort, mongodb-native limit, mongodb-native skip)

-
-

Lets you query (then sort, limit and skip the result) all of the jobs in the agenda job's database. These are full mongodb-native find, sort, limit and skip commands. See mongodb-native's documentation for details.

-
const jobs = await agenda.jobs({name: 'printAnalyticsReport'}, {data:-1}, 3, 1);
// Work with jobs (see below) -
- - -

cancel(mongodb-native query)

-
-

Cancels any jobs matching the passed mongodb-native query, and removes them from the database. Returns a Promise resolving to the number of cancelled jobs, or rejecting on error.

-
const numRemoved = await agenda.cancel({name: 'printAnalyticsReport'});
-
-

This functionality can also be achieved by first retrieving all the jobs from the database using agenda.jobs(), looping through the resulting array and calling job.remove() on each. It is however preferable to use agenda.cancel() for this use case, as this ensures the operation is atomic.

- - -

purge()

-
-

Removes all jobs in the database without defined behaviors. Useful if you change a definition name and want to remove old jobs. Returns a Promise resolving to the number of removed jobs, or rejecting on error.

-

IMPORTANT: Do not run this before you finish defining all of your jobs. If you do, you will nuke your database of jobs.

-
const numRemoved = await agenda.purge();
-
- - -

Starting the job processor

-
-

To get agenda to start processing jobs from the database you must start it. This -will schedule an interval (based on processEvery) to check for new jobs and -run them. You can also stop the queue.

- - -

start

-
-

Starts the job queue processing, checking processEvery time to see if there -are new jobs. Must be called after processEvery, and before any job scheduling (e.g. every).

- - -

stop

-
-

Stops the job queue processing. Unlocks currently running jobs.

-

This can be very useful for graceful shutdowns so that currently running/grabbed jobs are abandoned so that other -job queues can grab them / they are unlocked should the job queue start again. Here is an example of how to do a graceful -shutdown.

-
async function graceful() {
await agenda.stop();
process.exit(0);
}

process.on('SIGTERM', graceful);
process.on('SIGINT' , graceful); -
- - -

Multiple job processors

-
-

Sometimes you may want to have multiple node instances / machines process from -the same queue. Agenda supports a locking mechanism to ensure that multiple -queues don't process the same job.

-

You can configure the locking mechanism by specifying lockLifetime as an -interval when defining the job.

-
agenda.define('someJob', (job, cb) => {
// Do something in 10 seconds or less...
}, {lockLifetime: 10000}); -
-

This will ensure that no other job processor (this one included) attempts to run the job again -for the next 10 seconds. If you have a particularly long running job, you will want to -specify a longer lockLifetime.

-

By default it is 10 minutes. Typically you shouldn't have a job that runs for 10 minutes, -so this is really insurance should the job queue crash before the job is unlocked.

-

When a job is finished (i.e. the returned promise resolves/rejects or done is -specified in the signature and done() is called), it will automatically unlock.

- - -

Manually working with a job

-
-

A job instance has many instance methods. All mutating methods must be followed -with a call to await job.save() in order to persist the changes to the database.

- - -

repeatEvery(interval, [options])

-
-

Specifies an interval on which the job should repeat. The job runs at the time of defining as well in configured intervals, that is "run now and in intervals".

-

interval can be a human-readable format String, a cron format String, or a Number.

-

options is an optional argument containing:

-

options.timezone: should be a string as accepted by moment-timezone and is considered when using an interval in the cron string format.

-

options.skipImmediate: true | false (default) Setting this true will skip the immediate run. The first run will occur only in configured interval.

-
job.repeatEvery('10 minutes');
await job.save(); -
-
job.repeatEvery('3 minutes', {
skipImmediate: true
});
await job.save(); -
-
job.repeatEvery('0 6 * * *', {
timezone: 'America/New_York'
});
await job.save(); -
- - -

repeatAt(time)

-
-

Specifies a time when the job should repeat. Possible values

-
job.repeatAt('3:30pm');
await job.save(); -
- - -

schedule(time)

-
-

Specifies the next time at which the job should run.

-
job.schedule('tomorrow at 6pm');
await job.save(); -
- - -

priority(priority)

-
-

Specifies the priority weighting of the job. Can be a number or a string from -the above priority table.

-
job.priority('low');
await job.save(); -
- - -

unique(properties, [options])

-
-

Ensure that only one instance of this job exists with the specified properties

-

options is an optional argument which can overwrite the defaults. It can take -the following:

-
    -
  • insertOnly: boolean will prevent any properties from persisting if the job already exists. Defaults to false.
  • -
-
job.unique({'data.type': 'active', 'data.userId': '123', nextRunAt: date});
await job.save(); -
-

IMPORTANT: To avoid high CPU usage by MongoDB, make sure to create an index on the used fields, like data.type and data.userId for the example above.

- - -

fail(reason)

-
-

Sets job.attrs.failedAt to now, and sets job.attrs.failReason to reason.

-

Optionally, reason can be an error, in which case job.attrs.failReason will -be set to error.message

-
job.fail('insufficient disk space');
// or
job.fail(new Error('insufficient disk space'));
await job.save(); -
- - -

run(callback)

-
-

Runs the given job and calls callback(err, job) upon completion. Normally -you never need to call this manually.

-
job.run((err, job) => {
console.log('I don\'t know why you would need to do this...');
}); -
- - -

save()

-
-

Saves the job.attrs into the database. Returns a Promise resolving to a Job instance, or rejecting on error.

-
try {
await job.save();
cosole.log('Successfully saved job to collection');
} catch (e) {
console.error('Error saving job to collection');
} -
- - -

remove()

-
-

Removes the job from the database. Returns a Promise resolving to the number of jobs removed, or rejecting on error.

-
try {
await job.remove();
console.log('Successfully removed job from collection');
} catch (e) {
console.error('Error removing job from collection');
} -
- - -

disable()

-
-

Disables the job. Upcoming runs won't execute.

- - -

enable()

-
-

Enables the job if it got disabled before. Upcoming runs will execute.

- - -

touch()

-
-

Resets the lock on the job. Useful to indicate that the job hasn't timed out -when you have very long running jobs. The call returns a promise that resolves -when the job's lock has been renewed.

-
agenda.define('super long job', async job => {
await doSomeLongTask();
await job.touch();
await doAnotherLongTask();
await job.touch();
await finishOurLongTasks();
}); -
- - -

Job Queue Events

-
-

An instance of an agenda will emit the following events:

-
    -
  • start - called just before a job starts
  • -
  • start:job name - called just before the specified job starts
  • -
-
agenda.on('start', job => {
console.log('Job %s starting', job.attrs.name);
}); -
-
    -
  • complete - called when a job finishes, regardless of if it succeeds or fails
  • -
  • complete:job name - called when a job finishes, regardless of if it succeeds or fails
  • -
-
agenda.on('complete', job => {
console.log(`Job ${job.attrs.name} finished`);
}); -
-
    -
  • success - called when a job finishes successfully
  • -
  • success:job name - called when a job finishes successfully
  • -
-
agenda.on('success:send email', job => {
console.log(`Sent Email Successfully to ${job.attrs.data.to}`);
}); -
-
    -
  • fail - called when a job throws an error
  • -
  • fail:job name - called when a job throws an error
  • -
-
agenda.on('fail:send email', (err, job) => {
console.log(`Job failed with error: ${err.message}`);
}); -
- - -

Frequently Asked Questions

-
- - -

What is the order in which jobs run?

-
-

Jobs are run with priority in a first in first out order (so they will be run in the order they were scheduled AND with respect to highest priority).

-

For example, if we have two jobs named "send-email" queued (both with the same priority), and the first job is queued at 3:00 PM and second job is queued at 3:05 PM with the same priority value, then the first job will run first if we start to send "send-email" jobs at 3:10 PM. However if the first job has a priority of 5 and the second job has a priority of 10, then the second will run first (priority takes precedence) at 3:10 PM.

-

The default MongoDB sort object is { nextRunAt: 1, priority: -1 } and can be changed through the option sort when configuring Agenda.

- - -

What is the difference between lockLimit and maxConcurrency?

-
-

Agenda will lock jobs 1 by one, setting the lockedAt property in mongoDB, and creating an instance of the Job class which it caches into the _lockedJobs array. This defaults to having no limit, but can be managed using lockLimit. If all jobs will need to be run before agenda's next interval (set via agenda.processEvery), then agenda will attempt to lock all jobs.

-

Agenda will also pull jobs from _lockedJobs and into _runningJobs. These jobs are actively being worked on by user code, and this is limited by maxConcurrency (defaults to 20).

-

If you have multiple instances of agenda processing the same job definition with a fast repeat time you may find they get unevenly loaded. This is because they will compete to lock as many jobs as possible, even if they don't have enough concurrency to process them. This can be resolved by tweaking the maxConcurrency and lockLimit properties.

- - -

Sample Project Structure?

-
-

Agenda doesn't have a preferred project structure and leaves it to the user to -choose how they would like to use it. That being said, you can check out the -example project structure below.

- - -

Can I Donate?

-
-

Thanks! I'm flattered, but it's really not necessary. If you really want to, you can find my gittip here.

- - -

Web Interface?

-
-

Agenda itself does not have a web interface built in but we do offer stand-alone web interface Agendash:

-

Agendash interface

- - -

Mongo vs Redis

-
-

The decision to use Mongo instead of Redis is intentional. Redis is often used for -non-essential data (such as sessions) and without configuration doesn't -guarantee the same level of persistence as Mongo (should the server need to be -restarted/crash).

-

Agenda decides to focus on persistence without requiring special configuration -of Redis (thereby degrading the performance of the Redis server on non-critical -data, such as sessions).

-

Ultimately if enough people want a Redis driver instead of Mongo, I will write -one. (Please open an issue requesting it). For now, Agenda decided to focus on -guaranteed persistence.

- - -

Spawning / forking processes

-
-

Ultimately Agenda can work from a single job queue across multiple machines, node processes, or forks. If you are interested in having more than one worker, Bars3s has written up a fantastic example of how one might do it:

-
const cluster = require('cluster');
const os = require('os');

const httpServer = require('./app/http-server');
const jobWorker = require('./app/job-worker');

const jobWorkers = [];
const webWorkers = [];

if (cluster.isMaster) {
const cpuCount = os.cpus().length;
// Create a worker for each CPU
for (let i = 0; i < cpuCount; i += 1) {
addJobWorker();
addWebWorker();
}

cluster.on('exit', (worker, code, signal) => {
if (jobWorkers.indexOf(worker.id) !== -1) {
console.log(`job worker ${worker.process.pid} exited (signal: ${signal}). Trying to respawn...`);
removeJobWorker(worker.id);
addJobWorker();
}

if (webWorkers.indexOf(worker.id) !== -1) {
console.log(`http worker ${worker.process.pid} exited (signal: ${signal}). Trying to respawn...`);
removeWebWorker(worker.id);
addWebWorker();
}
});
} else {
if (process.env.web) {
console.log(`start http server: ${cluster.worker.id}`);
// Initialize the http server here
httpServer.start();
}

if (process.env.job) {
console.log(`start job server: ${cluster.worker.id}`);
// Initialize the Agenda here
jobWorker.start();
}
}

function addWebWorker() {
webWorkers.push(cluster.fork({web: 1}).id);
}

function addJobWorker() {
jobWorkers.push(cluster.fork({job: 1}).id);
}

function removeWebWorker(id) {
webWorkers.splice(webWorkers.indexOf(id), 1);
}

function removeJobWorker(id) {
jobWorkers.splice(jobWorkers.indexOf(id), 1);
} -
- - -

Recovering lost Mongo connections ("auto_reconnect")

-
-

Agenda is configured by default to automatically reconnect indefinitely, emitting an error event -when no connection is available on each process tick, allowing you to restore the Mongo -instance without having to restart the application.

-

However, if you are using an existing Mongo client -you'll need to configure the reconnectTries and reconnectInterval connection settings -manually, otherwise you'll find that Agenda will throw an error with the message "MongoDB connection is not recoverable, -application restart required" if the connection cannot be recovered within 30 seconds.

- - -

Example Project Structure

-
-

Agenda will only process jobs that it has definitions for. This allows you to -selectively choose which jobs a given agenda will process.

-

Consider the following project structure, which allows us to share models with -the rest of our code base, and specify which jobs a worker processes, if any at -all.

-
- server.js
- worker.js
lib/
- agenda.js
controllers/
- user-controller.js
jobs/
- email.js
- video-processing.js
- image-processing.js
models/
- user-model.js
- blog-post.model.js -
-

Sample job processor (eg. jobs/email.js)

-
let email = require('some-email-lib'),
User = require('../models/user-model.js');

module.exports = function(agenda) {
agenda.define('registration email', async job => {
const user = await User.get(job.attrs.data.userId);
await email(user.email(), 'Thanks for registering', 'Thanks for registering ' + user.name());
});

agenda.define('reset password', async job => {
// Etc
});

// More email related jobs
}; -
-

lib/agenda.js

-
const Agenda = require('agenda');

const connectionOpts = {db: {address: 'localhost:27017/agenda-test', collection: 'agendaJobs'}};

const agenda = new Agenda(connectionOpts);

const jobTypes = process.env.JOB_TYPES ? process.env.JOB_TYPES.split(',') : [];

jobTypes.forEach(type => {
require('./jobs/' + type)(agenda);
});

if (jobTypes.length) {
agenda.start(); // Returns a promise, which should be handled appropriately
}

module.exports = agenda; -
-

lib/controllers/user-controller.js

-
let app = express(),
User = require('../models/user-model'),
agenda = require('../worker.js');

app.post('/users', (req, res, next) => {
const user = new User(req.body);
user.save(err => {
if (err) {
return next(err);
}
agenda.now('registration email', {userId: user.primary()});
res.send(201, user.toJson());
});
}); -
-

worker.js

-
require('./lib/agenda.js');
-
-

Now you can do the following in your project:

-
node server.js
-
-

Fire up an instance with no JOB_TYPES, giving you the ability to process jobs, -but not wasting resources processing jobs.

-
JOB_TYPES=email node server.js
-
-

Allow your http server to process email jobs.

-
JOB_TYPES=email node worker.js
-
-

Fire up an instance that processes email jobs.

-
JOB_TYPES=video-processing,image-processing node worker.js
-
-

Fire up an instance that processes video-processing/image-processing jobs. Good for a heavy hitting server.

- - -

Debugging Issues

-
-

If you think you have encountered a bug, please feel free to report it here:

-

Submit Issue

-

Please provide us with as much details as possible such as:

-
    -
  • Agenda version
  • -
  • Environment (OSX, Linux, Windows, etc)
  • -
  • Small description of what happened
  • -
  • Any relevant stack track
  • -
  • Agenda logs (see below)
  • -
- - -

To turn on logging, please set your DEBUG env variable like so:

-
-
    -
  • OSX: DEBUG="agenda:*" ts-node src/index.ts
  • -
  • Linux: DEBUG="agenda:*" ts-node src/index.ts
  • -
  • Windows CMD: set DEBUG=agenda:*
  • -
  • Windows PowerShell: $env:DEBUG = "agenda:*"
  • -
-

While not necessary, attaching a text file with this debug information would -be extremely useful in debugging certain issues and is encouraged.

- - -

Known Issues

-
- - -

"Multiple order-by items are not supported. Please specify a single order-by item."

-
-

When running Agenda on Azure cosmosDB, you might run into this issue caused by Agenda's sort query used for finding and locking the next job. To fix this, you can pass custom sort option: sort: { nextRunAt: 1 }

- - -

Performance

-
-

It is recommended to set this index if you use agendash:

-
db.agendaJobs.ensureIndex({
"nextRunAt" : -1,
"lastRunAt" : -1,
"lastFinishedAt" : -1
}, "agendash2") -
-

If you have one job definition with thousand of instances, you can add this index to improve internal sorting query -for faster sortings

-
db.agendaJobs.ensureIndex({
"name" : 1,
"disabled" : 1,
"lockedAt" : 1
}, "findAndLockDeadJobs") -
- - -

Acknowledgements

-
- - - -

License

-
-

The MIT License

-

Legend

  • Constructor
  • Property
  • Method
  • Private property
  • Private method
  • Property

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/agenda/6.x/interfaces/IAgendaConfig.html b/docs/agenda/6.x/interfaces/IAgendaConfig.html deleted file mode 100644 index fcc7a2e..0000000 --- a/docs/agenda/6.x/interfaces/IAgendaConfig.html +++ /dev/null @@ -1 +0,0 @@ -IAgendaConfig | @hokify/agenda
Options
All
  • Public
  • Public/Protected
  • All
Menu

Interface IAgendaConfig

Hierarchy

  • IAgendaConfig

Index

Properties

defaultConcurrency: number
defaultLockLifetime: number
defaultLockLimit: number
lockLimit: number
maxConcurrency: number
name?: string
processEvery: number

Legend

  • Constructor
  • Property
  • Method
  • Private property
  • Private method
  • Property

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/agenda/6.x/interfaces/IDatabaseOptions.html b/docs/agenda/6.x/interfaces/IDatabaseOptions.html deleted file mode 100644 index 23d698d..0000000 --- a/docs/agenda/6.x/interfaces/IDatabaseOptions.html +++ /dev/null @@ -1 +0,0 @@ -IDatabaseOptions | @hokify/agenda
Options
All
  • Public
  • Public/Protected
  • All
Menu

Interface IDatabaseOptions

Hierarchy

  • IDatabaseOptions

Index

Properties

Properties

db: { address: string; collection?: string; options?: MongoClientOptions }

Type declaration

  • address: string
  • Optional collection?: string
  • Optional options?: MongoClientOptions

Legend

  • Constructor
  • Property
  • Method
  • Private property
  • Private method
  • Property

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/agenda/6.x/interfaces/IDbConfig.html b/docs/agenda/6.x/interfaces/IDbConfig.html deleted file mode 100644 index 3ceb061..0000000 --- a/docs/agenda/6.x/interfaces/IDbConfig.html +++ /dev/null @@ -1 +0,0 @@ -IDbConfig | @hokify/agenda
Options
All
  • Public
  • Public/Protected
  • All
Menu

Interface IDbConfig

Hierarchy

  • IDbConfig

Index

Properties

Properties

ensureIndex?: boolean
sort?: {}

Type declaration

  • [key: string]: SortDirection

Legend

  • Constructor
  • Property
  • Method
  • Private property
  • Private method
  • Property

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/agenda/6.x/interfaces/IJobDefinition.html b/docs/agenda/6.x/interfaces/IJobDefinition.html deleted file mode 100644 index 476354b..0000000 --- a/docs/agenda/6.x/interfaces/IJobDefinition.html +++ /dev/null @@ -1,9 +0,0 @@ -IJobDefinition | @hokify/agenda
Options
All
  • Public
  • Public/Protected
  • All
Menu

Interface IJobDefinition<DATA>

Type parameters

  • DATA = unknown

Hierarchy

  • IJobDefinition

Index

Properties

concurrency?: number
-

how many jobs of this kind can run in parallel/simultanously per Agenda instance

-
fn: DefinitionProcessor<DATA, void | ((error?: Error) => void)>
lockLifetime: number
-

lock lifetime in milliseconds

-
lockLimit: number
-

max number of locked jobs of this kind

-
priority?: number
-

Higher priority jobs will run first.

-

Legend

  • Constructor
  • Property
  • Method
  • Private property
  • Private method
  • Property

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/agenda/6.x/interfaces/IJobParameters.html b/docs/agenda/6.x/interfaces/IJobParameters.html deleted file mode 100644 index 03bf562..0000000 --- a/docs/agenda/6.x/interfaces/IJobParameters.html +++ /dev/null @@ -1,4 +0,0 @@ -IJobParameters | @hokify/agenda
Options
All
  • Public
  • Public/Protected
  • All
Menu

Interface IJobParameters<DATA>

Type parameters

  • DATA = unknown | void

Hierarchy

  • IJobParameters

Index

Properties

_id?: ObjectId
data: DATA
disabled?: boolean
failCount?: number
failReason?: string
failedAt?: Date
lastFinishedAt?: Date
lastModifiedBy?: string
lastRunAt?: Date
lockedAt?: Date
name: string
nextRunAt: null | Date
priority: number
progress?: number
repeatAt?: string
repeatInterval?: string | number
repeatTimezone?: string
type: "normal" | "single"
-

normal: job is queued and will be processed (regular case when the user adds a new job) -single: job with this name is only queued once, if there is an exisitn gentry in the database, the job is just updated, but not newly inserted (this is used for .every())

-
unique?: Filter<Omit<IJobParameters<DATA>, "unique">>
uniqueOpts?: { insertOnly: boolean }

Type declaration

  • insertOnly: boolean

Legend

  • Constructor
  • Property
  • Method
  • Private property
  • Private method
  • Property

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/agenda/6.x/interfaces/IMongoOptions.html b/docs/agenda/6.x/interfaces/IMongoOptions.html deleted file mode 100644 index 9da44a7..0000000 --- a/docs/agenda/6.x/interfaces/IMongoOptions.html +++ /dev/null @@ -1 +0,0 @@ -IMongoOptions | @hokify/agenda
Options
All
  • Public
  • Public/Protected
  • All
Menu

Interface IMongoOptions

Hierarchy

  • IMongoOptions

Index

Properties

Properties

db?: { collection?: string }

Type declaration

  • Optional collection?: string
mongo: Db

Legend

  • Constructor
  • Property
  • Method
  • Private property
  • Private method
  • Property

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/agenda/6.x/modules.html b/docs/agenda/6.x/modules.html deleted file mode 100644 index bffabc7..0000000 --- a/docs/agenda/6.x/modules.html +++ /dev/null @@ -1 +0,0 @@ -@hokify/agenda
Options
All
  • Public
  • Public/Protected
  • All
Menu

@hokify/agenda

Index

Type aliases

DefinitionProcessor<DATA, CB>: (agendaJob: Job<DATA>, done: CB) => CB extends void ? Promise<void> : void

Type parameters

  • DATA

  • CB

Type declaration

    • (agendaJob: Job<DATA>, done: CB): CB extends void ? Promise<void> : void
    • Parameters

      • agendaJob: Job<DATA>
      • done: CB

      Returns CB extends void ? Promise<void> : void

JobWithId: Job & { attrs: IJobParameters & { _id: ObjectId } }
TJobDatefield: keyof Pick<IJobParameters, "lastRunAt" | "lastFinishedAt" | "nextRunAt" | "failedAt" | "lockedAt">

Variables

datefields: TJobDatefield[] = ...

Legend

  • Constructor
  • Property
  • Method
  • Private property
  • Private method
  • Property

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index 2d2d455..0000000 --- a/docs/index.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Agenda TS β€” Lightweight job scheduling for Node.js ---- - -* [Changelog](https://github.com/hokify/agenda/blob/master/CHANGELOG.md#readme) -* [Issues](https://github.com/hokify/agenda/issues) -* [NPM](https://www.npmjs.com/package/@hokify/agenda) - -## Documentation - -- [v6.x.0](./agenda/6.x) - latest -- [v4.x.0](./agenda/4.x) -- [v3.1.0](./agenda/3.1.0) -- [v2.2.0](./agenda/2.2.0) -- [v2.0.0](./agenda/2.0.0) -- [v1.0.3](./agenda/1.0.3) diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..597ae91 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,47 @@ +import eslint from "@eslint/js"; +import prettierConfig from "eslint-config-prettier"; +import globals from "globals"; +import tseslint from "typescript-eslint"; + +export default tseslint.config( + eslint.configs.recommended, + ...tseslint.configs.recommended, + { + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + ecmaVersion: 2022, + globals: { + ...globals.es2022, + ...globals.node, + }, + }, + }, + }, + prettierConfig, + { + ignores: [ + "package.json", + "eslint.config.mjs", + "prettier.config.mjs", + "node_modules/*", + ".yarn/*", + "lib/*", + ], + }, + { + files: ["**/*.ts"], + rules: { + "@typescript-eslint/no-unused-vars": [ + "error", + { + args: "all", + argsIgnorePattern: "^_", + caughtErrors: "all", + caughtErrorsIgnorePattern: "^_", + }, + ], + }, + } +); diff --git a/LICENSE.md b/license.md similarity index 99% rename from LICENSE.md rename to license.md index 276b7f6..2e79b90 100644 --- a/LICENSE.md +++ b/license.md @@ -1,4 +1,5 @@ ## License + (The MIT License) Copyright (c) 2013 Ryan Schmukler diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 03ddd8f..0000000 --- a/package-lock.json +++ /dev/null @@ -1,17231 +0,0 @@ -{ - "name": "@whisthub/agenda", - "version": "0.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "@whisthub/agenda", - "version": "0.0.0", - "license": "MIT", - "dependencies": { - "cron-parser": "^4", - "date.js": "~0.3.3", - "debug": "~4", - "human-interval": "~2", - "luxon": "^3" - }, - "devDependencies": { - "@hokify/eslint-config": "^2.3.8", - "@istanbuljs/nyc-config-typescript": "^1.0.2", - "@types/chai": "^4.3.4", - "@types/debug": "^4.1.7", - "@types/human-interval": "^1.0.0", - "@types/luxon": "^3.1.0", - "@types/mocha": "^10.0.1", - "@types/node": "^18.11.12", - "@types/sinon": "^10.0.13", - "chai": "^4.3.7", - "delay": "^6.0.0", - "eslint": "^8.29.0", - "mocha": "10.1.0", - "mongodb": "^6.3.0", - "mongodb-memory-server": "^9.1.6", - "nyc": "^15.1.0", - "prettier": "^2.8.1", - "sinon": "15.0.0", - "standard-version": "^9.5.0", - "tsx": "^4.7.0", - "typedoc": "^0.23.21", - "typescript": "^4.9.4" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "mongodb": ">=4" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@aws-crypto/crc32": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", - "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" - } - }, - "node_modules/@aws-crypto/crc32/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/@aws-crypto/ie11-detection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", - "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^1.11.1" - } - }, - "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/@aws-crypto/sha256-browser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", - "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@aws-crypto/ie11-detection": "^3.0.0", - "@aws-crypto/sha256-js": "^3.0.0", - "@aws-crypto/supports-web-crypto": "^3.0.0", - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/@aws-crypto/sha256-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", - "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" - } - }, - "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/@aws-crypto/supports-web-crypto": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", - "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^1.11.1" - } - }, - "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/@aws-crypto/util": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", - "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - } - }, - "node_modules/@aws-crypto/util/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.503.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.503.1.tgz", - "integrity": "sha512-nOBoY1hM4hyd2xQbH8IK53MStsl5ywoY899dBxXBNx2FbNEP4cU4kps9NwBGxujXzd8g6WEmarpcKwAdrERvWg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.502.0", - "@aws-sdk/core": "3.496.0", - "@aws-sdk/credential-provider-node": "3.503.1", - "@aws-sdk/middleware-host-header": "3.502.0", - "@aws-sdk/middleware-logger": "3.502.0", - "@aws-sdk/middleware-recursion-detection": "3.502.0", - "@aws-sdk/middleware-signing": "3.502.0", - "@aws-sdk/middleware-user-agent": "3.502.0", - "@aws-sdk/region-config-resolver": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@aws-sdk/util-endpoints": "3.502.0", - "@aws-sdk/util-user-agent-browser": "3.502.0", - "@aws-sdk/util-user-agent-node": "3.502.0", - "@smithy/config-resolver": "^2.1.1", - "@smithy/core": "^1.3.1", - "@smithy/fetch-http-handler": "^2.4.1", - "@smithy/hash-node": "^2.1.1", - "@smithy/invalid-dependency": "^2.1.1", - "@smithy/middleware-content-length": "^2.1.1", - "@smithy/middleware-endpoint": "^2.4.1", - "@smithy/middleware-retry": "^2.1.1", - "@smithy/middleware-serde": "^2.1.1", - "@smithy/middleware-stack": "^2.1.1", - "@smithy/node-config-provider": "^2.2.1", - "@smithy/node-http-handler": "^2.3.1", - "@smithy/protocol-http": "^3.1.1", - "@smithy/smithy-client": "^2.3.1", - "@smithy/types": "^2.9.1", - "@smithy/url-parser": "^2.1.1", - "@smithy/util-base64": "^2.1.1", - "@smithy/util-body-length-browser": "^2.1.1", - "@smithy/util-body-length-node": "^2.2.1", - "@smithy/util-defaults-mode-browser": "^2.1.1", - "@smithy/util-defaults-mode-node": "^2.1.1", - "@smithy/util-endpoints": "^1.1.1", - "@smithy/util-retry": "^2.1.1", - "@smithy/util-utf8": "^2.1.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.502.0.tgz", - "integrity": "sha512-OZAYal1+PQgUUtWiHhRayDtX0OD+XpXHKAhjYgEIPbyhQaCMp3/Bq1xDX151piWXvXqXLJHFKb8DUEqzwGO9QA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.496.0", - "@aws-sdk/middleware-host-header": "3.502.0", - "@aws-sdk/middleware-logger": "3.502.0", - "@aws-sdk/middleware-recursion-detection": "3.502.0", - "@aws-sdk/middleware-user-agent": "3.502.0", - "@aws-sdk/region-config-resolver": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@aws-sdk/util-endpoints": "3.502.0", - "@aws-sdk/util-user-agent-browser": "3.502.0", - "@aws-sdk/util-user-agent-node": "3.502.0", - "@smithy/config-resolver": "^2.1.1", - "@smithy/core": "^1.3.1", - "@smithy/fetch-http-handler": "^2.4.1", - "@smithy/hash-node": "^2.1.1", - "@smithy/invalid-dependency": "^2.1.1", - "@smithy/middleware-content-length": "^2.1.1", - "@smithy/middleware-endpoint": "^2.4.1", - "@smithy/middleware-retry": "^2.1.1", - "@smithy/middleware-serde": "^2.1.1", - "@smithy/middleware-stack": "^2.1.1", - "@smithy/node-config-provider": "^2.2.1", - "@smithy/node-http-handler": "^2.3.1", - "@smithy/protocol-http": "^3.1.1", - "@smithy/smithy-client": "^2.3.1", - "@smithy/types": "^2.9.1", - "@smithy/url-parser": "^2.1.1", - "@smithy/util-base64": "^2.1.1", - "@smithy/util-body-length-browser": "^2.1.1", - "@smithy/util-body-length-node": "^2.2.1", - "@smithy/util-defaults-mode-browser": "^2.1.1", - "@smithy/util-defaults-mode-node": "^2.1.1", - "@smithy/util-endpoints": "^1.1.1", - "@smithy/util-retry": "^2.1.1", - "@smithy/util-utf8": "^2.1.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.502.0.tgz", - "integrity": "sha512-Yc9tZqTOMWtdgpkrdjKShgWb9oKNsFQrItfoiN1xWDllaFFRPi2KTiZiR0AbSTrNasJy13d210DOxrIdte+kWQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.502.0", - "@aws-sdk/core": "3.496.0", - "@aws-sdk/middleware-host-header": "3.502.0", - "@aws-sdk/middleware-logger": "3.502.0", - "@aws-sdk/middleware-recursion-detection": "3.502.0", - "@aws-sdk/middleware-signing": "3.502.0", - "@aws-sdk/middleware-user-agent": "3.502.0", - "@aws-sdk/region-config-resolver": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@aws-sdk/util-endpoints": "3.502.0", - "@aws-sdk/util-user-agent-browser": "3.502.0", - "@aws-sdk/util-user-agent-node": "3.502.0", - "@smithy/config-resolver": "^2.1.1", - "@smithy/core": "^1.3.1", - "@smithy/fetch-http-handler": "^2.4.1", - "@smithy/hash-node": "^2.1.1", - "@smithy/invalid-dependency": "^2.1.1", - "@smithy/middleware-content-length": "^2.1.1", - "@smithy/middleware-endpoint": "^2.4.1", - "@smithy/middleware-retry": "^2.1.1", - "@smithy/middleware-serde": "^2.1.1", - "@smithy/middleware-stack": "^2.1.1", - "@smithy/node-config-provider": "^2.2.1", - "@smithy/node-http-handler": "^2.3.1", - "@smithy/protocol-http": "^3.1.1", - "@smithy/smithy-client": "^2.3.1", - "@smithy/types": "^2.9.1", - "@smithy/url-parser": "^2.1.1", - "@smithy/util-base64": "^2.1.1", - "@smithy/util-body-length-browser": "^2.1.1", - "@smithy/util-body-length-node": "^2.2.1", - "@smithy/util-defaults-mode-browser": "^2.1.1", - "@smithy/util-defaults-mode-node": "^2.1.1", - "@smithy/util-endpoints": "^1.1.1", - "@smithy/util-retry": "^2.1.1", - "@smithy/util-utf8": "^2.1.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "@aws-sdk/credential-provider-node": "*" - } - }, - "node_modules/@aws-sdk/client-sts": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.502.0.tgz", - "integrity": "sha512-0q08gsvn6nuRqjK+i/e30PT/t7vvYwmGJS0PhJikZWv5yRDNSUxSYG0uDwKSbLDzmc2UX5+mLeyjPHlL4hbGlA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.496.0", - "@aws-sdk/middleware-host-header": "3.502.0", - "@aws-sdk/middleware-logger": "3.502.0", - "@aws-sdk/middleware-recursion-detection": "3.502.0", - "@aws-sdk/middleware-user-agent": "3.502.0", - "@aws-sdk/region-config-resolver": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@aws-sdk/util-endpoints": "3.502.0", - "@aws-sdk/util-user-agent-browser": "3.502.0", - "@aws-sdk/util-user-agent-node": "3.502.0", - "@smithy/config-resolver": "^2.1.1", - "@smithy/core": "^1.3.1", - "@smithy/fetch-http-handler": "^2.4.1", - "@smithy/hash-node": "^2.1.1", - "@smithy/invalid-dependency": "^2.1.1", - "@smithy/middleware-content-length": "^2.1.1", - "@smithy/middleware-endpoint": "^2.4.1", - "@smithy/middleware-retry": "^2.1.1", - "@smithy/middleware-serde": "^2.1.1", - "@smithy/middleware-stack": "^2.1.1", - "@smithy/node-config-provider": "^2.2.1", - "@smithy/node-http-handler": "^2.3.1", - "@smithy/protocol-http": "^3.1.1", - "@smithy/smithy-client": "^2.3.1", - "@smithy/types": "^2.9.1", - "@smithy/url-parser": "^2.1.1", - "@smithy/util-base64": "^2.1.1", - "@smithy/util-body-length-browser": "^2.1.1", - "@smithy/util-body-length-node": "^2.2.1", - "@smithy/util-defaults-mode-browser": "^2.1.1", - "@smithy/util-defaults-mode-node": "^2.1.1", - "@smithy/util-endpoints": "^1.1.1", - "@smithy/util-middleware": "^2.1.1", - "@smithy/util-retry": "^2.1.1", - "@smithy/util-utf8": "^2.1.1", - "fast-xml-parser": "4.2.5", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "@aws-sdk/credential-provider-node": "*" - } - }, - "node_modules/@aws-sdk/core": { - "version": "3.496.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.496.0.tgz", - "integrity": "sha512-yT+ug7Cw/3eJi7x2es0+46x12+cIJm5Xv+GPWsrTFD1TKgqO/VPEgfDtHFagDNbFmjNQA65Ygc/kEdIX9ICX/A==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/core": "^1.3.1", - "@smithy/protocol-http": "^3.1.1", - "@smithy/signature-v4": "^2.1.1", - "@smithy/smithy-client": "^2.3.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.503.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.503.1.tgz", - "integrity": "sha512-B7GQ9hRRKaUTp5sWYqBfoIXIWc0zgBuzWANtnswFpKcYN/sdgq2OQoiWUEZrn3BBpun1LgJ1JuFNY8fkEfVTQg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.503.1", - "@aws-sdk/types": "3.502.0", - "@smithy/property-provider": "^2.1.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.502.0.tgz", - "integrity": "sha512-KIB8Ae1Z7domMU/jU4KiIgK4tmYgvuXlhR54ehwlVHxnEoFPoPuGHFZU7oFn79jhhSLUFQ1lRYMxP0cEwb7XeQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@aws-sdk/types": "3.502.0", - "@smithy/property-provider": "^2.1.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.503.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.503.1.tgz", - "integrity": "sha512-rTdlFFGoPPFMF2YjtlfRuSgKI+XsF49u7d98255hySwhsbwd3Xp+utTTPquxP+CwDxMHbDlI7NxDzFiFdsoZug==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@aws-sdk/types": "3.502.0", - "@smithy/fetch-http-handler": "^2.4.1", - "@smithy/node-http-handler": "^2.3.1", - "@smithy/property-provider": "^2.1.1", - "@smithy/protocol-http": "^3.1.1", - "@smithy/smithy-client": "^2.3.1", - "@smithy/types": "^2.9.1", - "@smithy/util-stream": "^2.1.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.503.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.503.1.tgz", - "integrity": "sha512-1RiC72NdWJ5w2IaX/91Fku+FrrChzaHuMCD5wbjk5TMHjwiDZ622wvMKYVmn30biW0RbJidaw38Y9PAGivdZxw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@aws-sdk/client-sts": "3.502.0", - "@aws-sdk/credential-provider-env": "3.502.0", - "@aws-sdk/credential-provider-process": "3.502.0", - "@aws-sdk/credential-provider-sso": "3.503.1", - "@aws-sdk/credential-provider-web-identity": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@smithy/credential-provider-imds": "^2.2.1", - "@smithy/property-provider": "^2.1.1", - "@smithy/shared-ini-file-loader": "^2.3.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.503.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.503.1.tgz", - "integrity": "sha512-1qsRWnXl8OUZEDpUFF/gjCGjePjZB6fIpX+XQuTpKokeDzYZk0HwQSakPspfmzT8MkyB9IBJVWb7KbFCjKNt0A==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@aws-sdk/credential-provider-env": "3.502.0", - "@aws-sdk/credential-provider-http": "3.503.1", - "@aws-sdk/credential-provider-ini": "3.503.1", - "@aws-sdk/credential-provider-process": "3.502.0", - "@aws-sdk/credential-provider-sso": "3.503.1", - "@aws-sdk/credential-provider-web-identity": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@smithy/credential-provider-imds": "^2.2.1", - "@smithy/property-provider": "^2.1.1", - "@smithy/shared-ini-file-loader": "^2.3.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.502.0.tgz", - "integrity": "sha512-fJJowOjQ4infYQX0E1J3xFVlmuwEYJAFk0Mo1qwafWmEthsBJs+6BR2RiWDELHKrSK35u4Pf3fu3RkYuCtmQFw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@aws-sdk/types": "3.502.0", - "@smithy/property-provider": "^2.1.1", - "@smithy/shared-ini-file-loader": "^2.3.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.503.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.503.1.tgz", - "integrity": "sha512-Wj+rgpD4EcGB+j6mMYPD4SPNEN0sUSq7UMTTfdzZ+1MSTnbPDC9rgde0D3yJPrJ1le/0j+sXPALvr5RKSpENbg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@aws-sdk/client-sso": "3.502.0", - "@aws-sdk/token-providers": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@smithy/property-provider": "^2.1.1", - "@smithy/shared-ini-file-loader": "^2.3.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.502.0.tgz", - "integrity": "sha512-veBAjDqjMMgA2Qxxf9ywDfHYLeJpaeHWLWCQ9XCHwJJ6ZIGWmAZPTq3he/UMr5JIQXooIccqqyqXMDIXPenXpA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@aws-sdk/client-sts": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@smithy/property-provider": "^2.1.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/credential-providers": { - "version": "3.503.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.503.1.tgz", - "integrity": "sha512-+BILMFJF8Nwc9ZmV0tm2eOEJNfxdkkoBw4KegKAkYj+7PY+NL5S6t6syvWYLWATEtJyeqREq2WUxplILe5vu5A==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.503.1", - "@aws-sdk/client-sso": "3.502.0", - "@aws-sdk/client-sts": "3.502.0", - "@aws-sdk/credential-provider-cognito-identity": "3.503.1", - "@aws-sdk/credential-provider-env": "3.502.0", - "@aws-sdk/credential-provider-http": "3.503.1", - "@aws-sdk/credential-provider-ini": "3.503.1", - "@aws-sdk/credential-provider-node": "3.503.1", - "@aws-sdk/credential-provider-process": "3.502.0", - "@aws-sdk/credential-provider-sso": "3.503.1", - "@aws-sdk/credential-provider-web-identity": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@smithy/credential-provider-imds": "^2.2.1", - "@smithy/property-provider": "^2.1.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.502.0.tgz", - "integrity": "sha512-EjnG0GTYXT/wJBmm5/mTjDcAkzU8L7wQjOzd3FTXuTCNNyvAvwrszbOj5FlarEw5XJBbQiZtBs+I5u9+zy560w==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@aws-sdk/types": "3.502.0", - "@smithy/protocol-http": "^3.1.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.502.0.tgz", - "integrity": "sha512-FDyv6K4nCoHxbjLGS2H8ex8I0KDIiu4FJgVRPs140ZJy6gE5Pwxzv6YTzZGLMrnqcIs9gh065Lf6DjwMelZqaw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@aws-sdk/types": "3.502.0", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.502.0.tgz", - "integrity": "sha512-hvbyGJbxeuezxOu8VfFmcV4ql1hKXLxHTe5FNYfEBat2KaZXVhc1Hg+4TvB06/53p+E8J99Afmumkqbxs2esUA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@aws-sdk/types": "3.502.0", - "@smithy/protocol-http": "^3.1.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-signing": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.502.0.tgz", - "integrity": "sha512-4hF08vSzJ7L6sB+393gOFj3s2N6nLusYS0XrMW6wYNFU10IDdbf8Z3TZ7gysDJJHEGQPmTAesPEDBsasGWcMxg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@aws-sdk/types": "3.502.0", - "@smithy/property-provider": "^2.1.1", - "@smithy/protocol-http": "^3.1.1", - "@smithy/signature-v4": "^2.1.1", - "@smithy/types": "^2.9.1", - "@smithy/util-middleware": "^2.1.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.502.0.tgz", - "integrity": "sha512-TxbBZbRiXPH0AUxegqiNd9aM9zNSbfjtBs5MEfcBsweeT/B2O7K1EjP9+CkB8Xmk/5FLKhAKLr19b1TNoE27rw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@aws-sdk/types": "3.502.0", - "@aws-sdk/util-endpoints": "3.502.0", - "@smithy/protocol-http": "^3.1.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.502.0.tgz", - "integrity": "sha512-mxmsX2AGgnSM+Sah7mcQCIneOsJQNiLX0COwEttuf8eO+6cLMAZvVudH3BnWTfea4/A9nuri9DLCqBvEmPrilg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@aws-sdk/types": "3.502.0", - "@smithy/node-config-provider": "^2.2.1", - "@smithy/types": "^2.9.1", - "@smithy/util-config-provider": "^2.2.1", - "@smithy/util-middleware": "^2.1.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/token-providers": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.502.0.tgz", - "integrity": "sha512-RQgMgIXYlSf0xGl6EUeD+pqIPBlb7e29dbqHOBFc66hJVYUC2ULZX7Y+jLvcGIEaMiIaTPyvntZRFip+U+9hag==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@aws-sdk/client-sso-oidc": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@smithy/property-provider": "^2.1.1", - "@smithy/shared-ini-file-loader": "^2.3.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/types": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.502.0.tgz", - "integrity": "sha512-M0DSPYe/gXhwD2QHgoukaZv5oDxhW3FfvYIrJptyqUq3OnPJBcDbihHjrE0PBtfh/9kgMZT60/fQ2NVFANfa2g==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.502.0.tgz", - "integrity": "sha512-6LKFlJPp2J24r1Kpfoz5ESQn+1v5fEjDB3mtUKRdpwarhm3syu7HbKlHCF3KbcCOyahobvLvhoedT78rJFEeeg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@aws-sdk/types": "3.502.0", - "@smithy/types": "^2.9.1", - "@smithy/util-endpoints": "^1.1.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/util-locate-window": { - "version": "3.495.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.495.0.tgz", - "integrity": "sha512-MfaPXT0kLX2tQaR90saBT9fWQq2DHqSSJRzW+MZWsmF+y5LGCOhO22ac/2o6TKSQm7h0HRc2GaADqYYYor62yg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.502.0.tgz", - "integrity": "sha512-v8gKyCs2obXoIkLETAeEQ3AM+QmhHhst9xbM1cJtKUGsRlVIak/XyyD+kVE6kmMm1cjfudHpHKABWk9apQcIZQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@aws-sdk/types": "3.502.0", - "@smithy/types": "^2.9.1", - "bowser": "^2.11.0", - "tslib": "^2.5.0" - } - }, - "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.502.0.tgz", - "integrity": "sha512-9RjxpkGZKbTdl96tIJvAo+vZoz4P/cQh36SBUt9xfRfW0BtsaLyvSrvlR5wyUYhvRcC12Axqh/8JtnAPq//+Vw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@aws-sdk/types": "3.502.0", - "@smithy/node-config-provider": "^2.2.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@aws-sdk/util-utf8-browser": { - "version": "3.259.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", - "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.3.1" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", - "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.7.tgz", - "integrity": "sha512-djHlEfFHnSnTAcPb7dATbiM5HxGOP98+3JLBZtjRb5I7RXrw7kFRoG2dXM8cm3H+o11A8IFH/uprmJpwFynRNQ==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.7", - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.7", - "@babel/parser": "^7.17.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", - "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.17.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.7.tgz", - "integrity": "sha512-TKsj9NkjJfTBxM7Phfy7kv6yYc4ZcOo+AaWGqQOKTPDOmcGkIFb5xNA746eKisQkm4yavUYh4InYM9S+VnO01w==", - "dev": true, - "dependencies": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz", - "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.13.10" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.20.1.tgz", - "integrity": "sha512-CGulbEDcg/ND1Im7fUNRZdGXmX2MTWVVZacQi/6DiKE5HNwZ3aVTm5PV4lO8HHz0B2h8WQyvKKjbX5XgTtydsg==", - "dev": true, - "dependencies": { - "core-js-pure": "^3.25.1", - "regenerator-runtime": "^0.13.10" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@hokify/eslint-config": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@hokify/eslint-config/-/eslint-config-2.3.8.tgz", - "integrity": "sha512-Q5TDtalK1+QJQ8Evc+3VDV4Z5kH9+E+cbUTAHKCYkrjfUBUGqx6XrbFQ/TFjt469kBYhJynwZwR1iOObAg64cA==", - "dev": true, - "dependencies": { - "@typescript-eslint/eslint-plugin": "^5.43.0", - "@typescript-eslint/parser": "^5.43.0", - "eslint-config-airbnb-base": "^15.0.0", - "eslint-config-airbnb-typescript": "^17.0.0", - "eslint-config-prettier": "^8.5.0", - "eslint-import-resolver-alias": "^1.1.2", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^2.7.1", - "eslint-plugin-import": "2.26.0", - "eslint-plugin-jsx-a11y": "^6.6.1", - "eslint-plugin-mocha": "^10.1.0", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-react": "^7.31.10", - "eslint-plugin-unicorn": "^44.0.2", - "eslint-plugin-you-dont-need-lodash-underscore": "^6.12.0" - }, - "peerDependencies": { - "eslint": ">=8.10.0", - "prettier": ">=2.5.1" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", - "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@hutson/parse-repository-url": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", - "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/nyc-config-typescript": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.2.tgz", - "integrity": "sha512-iKGIyMoyJuFnJRSVTZ78POIRvNnwZaWIf8vG4ZS3rQq58MMDrqEX2nnzx0R28V2X8JvmKYiqY9FP2hlJsm8A0w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "nyc": ">=15" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@mongodb-js/saslprep": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.4.tgz", - "integrity": "sha512-8zJ8N1x51xo9hwPh6AWnKdLGEC5N3lDa6kms1YHmFBoRhTpJR6HG8wWk0td1MVCu9cD4YBrvjZEtd5Obw0Fbnw==", - "dev": true, - "dependencies": { - "sparse-bitfield": "^3.0.3" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz", - "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/samsam": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz", - "integrity": "sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", - "dev": true - }, - "node_modules/@smithy/abort-controller": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.1.1.tgz", - "integrity": "sha512-1+qdrUqLhaALYL0iOcN43EP6yAXXQ2wWZ6taf4S2pNGowmOc5gx+iMQv+E42JizNJjB0+gEadOXeV1Bf7JWL1Q==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/config-resolver": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.1.1.tgz", - "integrity": "sha512-lxfLDpZm+AWAHPFZps5JfDoO9Ux1764fOgvRUBpHIO8HWHcSN1dkgsago1qLRVgm1BZ8RCm8cgv99QvtaOWIhw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/node-config-provider": "^2.2.1", - "@smithy/types": "^2.9.1", - "@smithy/util-config-provider": "^2.2.1", - "@smithy/util-middleware": "^2.1.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/core": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.3.1.tgz", - "integrity": "sha512-tf+NIu9FkOh312b6M9G4D68is4Xr7qptzaZGZUREELF8ysE1yLKphqt7nsomjKZVwW7WE5pDDex9idowNGRQ/Q==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/middleware-endpoint": "^2.4.1", - "@smithy/middleware-retry": "^2.1.1", - "@smithy/middleware-serde": "^2.1.1", - "@smithy/protocol-http": "^3.1.1", - "@smithy/smithy-client": "^2.3.1", - "@smithy/types": "^2.9.1", - "@smithy/util-middleware": "^2.1.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/credential-provider-imds": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.2.1.tgz", - "integrity": "sha512-7XHjZUxmZYnONheVQL7j5zvZXga+EWNgwEAP6OPZTi7l8J4JTeNh9aIOfE5fKHZ/ee2IeNOh54ZrSna+Vc6TFA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/node-config-provider": "^2.2.1", - "@smithy/property-provider": "^2.1.1", - "@smithy/types": "^2.9.1", - "@smithy/url-parser": "^2.1.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/eventstream-codec": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.1.1.tgz", - "integrity": "sha512-E8KYBxBIuU4c+zrpR22VsVrOPoEDzk35bQR3E+xm4k6Pa6JqzkDOdMyf9Atac5GPNKHJBdVaQ4JtjdWX2rl/nw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^2.9.1", - "@smithy/util-hex-encoding": "^2.1.1", - "tslib": "^2.5.0" - } - }, - "node_modules/@smithy/fetch-http-handler": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.4.1.tgz", - "integrity": "sha512-VYGLinPsFqH68lxfRhjQaSkjXM7JysUOJDTNjHBuN/ykyRb2f1gyavN9+VhhPTWCy32L4yZ2fdhpCs/nStEicg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/protocol-http": "^3.1.1", - "@smithy/querystring-builder": "^2.1.1", - "@smithy/types": "^2.9.1", - "@smithy/util-base64": "^2.1.1", - "tslib": "^2.5.0" - } - }, - "node_modules/@smithy/hash-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.1.1.tgz", - "integrity": "sha512-Qhoq0N8f2OtCnvUpCf+g1vSyhYQrZjhSwvJ9qvR8BUGOtTXiyv2x1OD2e6jVGmlpC4E4ax1USHoyGfV9JFsACg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/types": "^2.9.1", - "@smithy/util-buffer-from": "^2.1.1", - "@smithy/util-utf8": "^2.1.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/invalid-dependency": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.1.1.tgz", - "integrity": "sha512-7WTgnKw+VPg8fxu2v9AlNOQ5yaz6RA54zOVB4f6vQuR0xFKd+RzlCpt0WidYTsye7F+FYDIaS/RnJW4pxjNInw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "node_modules/@smithy/is-array-buffer": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.1.1.tgz", - "integrity": "sha512-xozSQrcUinPpNPNPds4S7z/FakDTh1MZWtRP/2vQtYB/u3HYrX2UXuZs+VhaKBd6Vc7g2XPr2ZtwGBNDN6fNKQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/middleware-content-length": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.1.1.tgz", - "integrity": "sha512-rSr9ezUl9qMgiJR0UVtVOGEZElMdGFyl8FzWEF5iEKTlcWxGr2wTqGfDwtH3LAB7h+FPkxqv4ZU4cpuCN9Kf/g==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/protocol-http": "^3.1.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/middleware-endpoint": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.4.1.tgz", - "integrity": "sha512-XPZTb1E2Oav60Ven3n2PFx+rX9EDsU/jSTA8VDamt7FXks67ekjPY/XrmmPDQaFJOTUHJNKjd8+kZxVO5Ael4Q==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/middleware-serde": "^2.1.1", - "@smithy/node-config-provider": "^2.2.1", - "@smithy/shared-ini-file-loader": "^2.3.1", - "@smithy/types": "^2.9.1", - "@smithy/url-parser": "^2.1.1", - "@smithy/util-middleware": "^2.1.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/middleware-retry": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.1.1.tgz", - "integrity": "sha512-eMIHOBTXro6JZ+WWzZWd/8fS8ht5nS5KDQjzhNMHNRcG5FkNTqcKpYhw7TETMYzbLfhO5FYghHy1vqDWM4FLDA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/node-config-provider": "^2.2.1", - "@smithy/protocol-http": "^3.1.1", - "@smithy/service-error-classification": "^2.1.1", - "@smithy/smithy-client": "^2.3.1", - "@smithy/types": "^2.9.1", - "@smithy/util-middleware": "^2.1.1", - "@smithy/util-retry": "^2.1.1", - "tslib": "^2.5.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/middleware-serde": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.1.1.tgz", - "integrity": "sha512-D8Gq0aQBeE1pxf3cjWVkRr2W54t+cdM2zx78tNrVhqrDykRA7asq8yVJij1u5NDtKzKqzBSPYh7iW0svUKg76g==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/middleware-stack": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.1.1.tgz", - "integrity": "sha512-KPJhRlhsl8CjgGXK/DoDcrFGfAqoqvuwlbxy+uOO4g2Azn1dhH+GVfC3RAp+6PoL5PWPb+vt6Z23FP+Mr6qeCw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/node-config-provider": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.2.1.tgz", - "integrity": "sha512-epzK3x1xNxA9oJgHQ5nz+2j6DsJKdHfieb+YgJ7ATWxzNcB7Hc+Uya2TUck5MicOPhDV8HZImND7ZOecVr+OWg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/property-provider": "^2.1.1", - "@smithy/shared-ini-file-loader": "^2.3.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/node-http-handler": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.3.1.tgz", - "integrity": "sha512-gLA8qK2nL9J0Rk/WEZSvgin4AppvuCYRYg61dcUo/uKxvMZsMInL5I5ZdJTogOvdfVug3N2dgI5ffcUfS4S9PA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/abort-controller": "^2.1.1", - "@smithy/protocol-http": "^3.1.1", - "@smithy/querystring-builder": "^2.1.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/property-provider": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.1.1.tgz", - "integrity": "sha512-FX7JhhD/o5HwSwg6GLK9zxrMUrGnb3PzNBrcthqHKBc3dH0UfgEAU24xnJ8F0uow5mj17UeBEOI6o3CF2k7Mhw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/protocol-http": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.1.1.tgz", - "integrity": "sha512-6ZRTSsaXuSL9++qEwH851hJjUA0OgXdQFCs+VDw4tGH256jQ3TjYY/i34N4vd24RV3nrjNsgd1yhb57uMoKbzQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/querystring-builder": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.1.1.tgz", - "integrity": "sha512-C/ko/CeEa8jdYE4gt6nHO5XDrlSJ3vdCG0ZAc6nD5ZIE7LBp0jCx4qoqp7eoutBu7VrGMXERSRoPqwi1WjCPbg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/types": "^2.9.1", - "@smithy/util-uri-escape": "^2.1.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/querystring-parser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.1.1.tgz", - "integrity": "sha512-H4+6jKGVhG1W4CIxfBaSsbm98lOO88tpDWmZLgkJpt8Zkk/+uG0FmmqMuCAc3HNM2ZDV+JbErxr0l5BcuIf/XQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/service-error-classification": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.1.1.tgz", - "integrity": "sha512-txEdZxPUgM1PwGvDvHzqhXisrc5LlRWYCf2yyHfvITWioAKat7srQvpjMAvgzf0t6t7j8yHrryXU9xt7RZqFpw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/types": "^2.9.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.3.1.tgz", - "integrity": "sha512-2E2kh24igmIznHLB6H05Na4OgIEilRu0oQpYXo3LCNRrawHAcfDKq9004zJs+sAMt2X5AbY87CUCJ7IpqpSgdw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/signature-v4": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.1.1.tgz", - "integrity": "sha512-Hb7xub0NHuvvQD3YwDSdanBmYukoEkhqBjqoxo+bSdC0ryV9cTfgmNjuAQhTPYB6yeU7hTR+sPRiFMlxqv6kmg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/eventstream-codec": "^2.1.1", - "@smithy/is-array-buffer": "^2.1.1", - "@smithy/types": "^2.9.1", - "@smithy/util-hex-encoding": "^2.1.1", - "@smithy/util-middleware": "^2.1.1", - "@smithy/util-uri-escape": "^2.1.1", - "@smithy/util-utf8": "^2.1.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/smithy-client": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.3.1.tgz", - "integrity": "sha512-YsTdU8xVD64r2pLEwmltrNvZV6XIAC50LN6ivDopdt+YiF/jGH6PY9zUOu0CXD/d8GMB8gbhnpPsdrjAXHS9QA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/middleware-endpoint": "^2.4.1", - "@smithy/middleware-stack": "^2.1.1", - "@smithy/protocol-http": "^3.1.1", - "@smithy/types": "^2.9.1", - "@smithy/util-stream": "^2.1.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/types": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.9.1.tgz", - "integrity": "sha512-vjXlKNXyprDYDuJ7UW5iobdmyDm6g8dDG+BFUncAg/3XJaN45Gy5RWWWUVgrzIK7S4R1KWgIX5LeJcfvSI24bw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/url-parser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.1.1.tgz", - "integrity": "sha512-qC9Bv8f/vvFIEkHsiNrUKYNl8uKQnn4BdhXl7VzQRP774AwIjiSMMwkbT+L7Fk8W8rzYVifzJNYxv1HwvfBo3Q==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/querystring-parser": "^2.1.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "node_modules/@smithy/util-base64": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.1.1.tgz", - "integrity": "sha512-UfHVpY7qfF/MrgndI5PexSKVTxSZIdz9InghTFa49QOvuu9I52zLPLUHXvHpNuMb1iD2vmc6R+zbv/bdMipR/g==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/util-buffer-from": "^2.1.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/util-body-length-browser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.1.1.tgz", - "integrity": "sha512-ekOGBLvs1VS2d1zM2ER4JEeBWAvIOUKeaFch29UjjJsxmZ/f0L3K3x0dEETgh3Q9bkZNHgT+rkdl/J/VUqSRag==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.5.0" - } - }, - "node_modules/@smithy/util-body-length-node": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.2.1.tgz", - "integrity": "sha512-/ggJG+ta3IDtpNVq4ktmEUtOkH1LW64RHB5B0hcr5ZaWBmo96UX2cIOVbjCqqDickTXqBWZ4ZO0APuaPrD7Abg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/util-buffer-from": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.1.1.tgz", - "integrity": "sha512-clhNjbyfqIv9Md2Mg6FffGVrJxw7bgK7s3Iax36xnfVj6cg0fUG7I4RH0XgXJF8bxi+saY5HR21g2UPKSxVCXg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/is-array-buffer": "^2.1.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/util-config-provider": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.2.1.tgz", - "integrity": "sha512-50VL/tx9oYYcjJn/qKqNy7sCtpD0+s8XEBamIFo4mFFTclKMNp+rsnymD796uybjiIquB7VCB/DeafduL0y2kw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-browser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.1.1.tgz", - "integrity": "sha512-lqLz/9aWRO6mosnXkArtRuQqqZBhNpgI65YDpww4rVQBuUT7qzKbDLG5AmnQTCiU4rOquaZO/Kt0J7q9Uic7MA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/property-provider": "^2.1.1", - "@smithy/smithy-client": "^2.3.1", - "@smithy/types": "^2.9.1", - "bowser": "^2.11.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.1.1.tgz", - "integrity": "sha512-tYVrc+w+jSBfBd267KDnvSGOh4NMz+wVH7v4CClDbkdPfnjvImBZsOURncT5jsFwR9KCuDyPoSZq4Pa6+eCUrA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/config-resolver": "^2.1.1", - "@smithy/credential-provider-imds": "^2.2.1", - "@smithy/node-config-provider": "^2.2.1", - "@smithy/property-provider": "^2.1.1", - "@smithy/smithy-client": "^2.3.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@smithy/util-endpoints": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.1.1.tgz", - "integrity": "sha512-sI4d9rjoaekSGEtq3xSb2nMjHMx8QXcz2cexnVyRWsy4yQ9z3kbDpX+7fN0jnbdOp0b3KSTZJZ2Yb92JWSanLw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/node-config-provider": "^2.2.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@smithy/util-hex-encoding": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.1.1.tgz", - "integrity": "sha512-3UNdP2pkYUUBGEXzQI9ODTDK+Tcu1BlCyDBaRHwyxhA+8xLP8agEKQq4MGmpjqb4VQAjq9TwlCQX0kP6XDKYLg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/util-middleware": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.1.1.tgz", - "integrity": "sha512-mKNrk8oz5zqkNcbcgAAepeJbmfUW6ogrT2Z2gDbIUzVzNAHKJQTYmH9jcy0jbWb+m7ubrvXKb6uMjkSgAqqsFA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/util-retry": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.1.1.tgz", - "integrity": "sha512-Mg+xxWPTeSPrthpC5WAamJ6PW4Kbo01Fm7lWM1jmGRvmrRdsd3192Gz2fBXAMURyXpaNxyZf6Hr/nQ4q70oVEA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/service-error-classification": "^2.1.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@smithy/util-stream": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.1.1.tgz", - "integrity": "sha512-J7SMIpUYvU4DQN55KmBtvaMc7NM3CZ2iWICdcgaovtLzseVhAqFRYqloT3mh0esrFw+3VEK6nQFteFsTqZSECQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/fetch-http-handler": "^2.4.1", - "@smithy/node-http-handler": "^2.3.1", - "@smithy/types": "^2.9.1", - "@smithy/util-base64": "^2.1.1", - "@smithy/util-buffer-from": "^2.1.1", - "@smithy/util-hex-encoding": "^2.1.1", - "@smithy/util-utf8": "^2.1.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/util-uri-escape": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.1.1.tgz", - "integrity": "sha512-saVzI1h6iRBUVSqtnlOnc9ssU09ypo7n+shdQ8hBTZno/9rZ3AuRYvoHInV57VF7Qn7B+pFJG7qTzFiHxWlWBw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/util-utf8": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.1.1.tgz", - "integrity": "sha512-BqTpzYEcUMDwAKr7/mVRUtHDhs6ZoXDi9NypMvMfOr/+u1NW7JgqodPDECiiLboEm6bobcPcECxzjtQh865e9A==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@smithy/util-buffer-from": "^2.1.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@types/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", - "dev": true - }, - "node_modules/@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", - "dev": true, - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/human-interval": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/human-interval/-/human-interval-1.0.0.tgz", - "integrity": "sha512-ud7H6R7y58RpOFcJPhmuCacUAaE5Tpkhhm1gwx3vaaAiVEvqalvG/yaG6K0+yPaSEorkI/HGKp0/H3xirxJ4Tg==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/luxon": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.1.0.tgz", - "integrity": "sha512-gCd/HcCgjqSxfMrgtqxCgYk/22NBQfypwFUG7ZAyG/4pqs51WLTcUzVp1hqTbieDYeHS3WoVEh2Yv/2l+7B0Vg==", - "dev": true - }, - "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "node_modules/@types/mocha": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", - "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", - "dev": true - }, - "node_modules/@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.11.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.12.tgz", - "integrity": "sha512-FgD3NtTAKvyMmD44T07zz2fEf+OKwutgBCEVM8GcvMGVGaDktiLNTDvPwC/LUe3PinMW+X6CuLOF2Ui1mAlSXg==", - "dev": true - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", - "dev": true - }, - "node_modules/@types/sinon": { - "version": "10.0.13", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.13.tgz", - "integrity": "sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ==", - "dev": true, - "dependencies": { - "@types/sinonjs__fake-timers": "*" - } - }, - "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", - "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", - "dev": true - }, - "node_modules/@types/webidl-conversions": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", - "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", - "dev": true - }, - "node_modules/@types/whatwg-url": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", - "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/webidl-conversions": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.43.0.tgz", - "integrity": "sha512-wNPzG+eDR6+hhW4yobEmpR36jrqqQv1vxBq5LJO3fBAktjkvekfr4BRl+3Fn1CM/A+s8/EiGUbOMDoYqWdbtXA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.43.0", - "@typescript-eslint/type-utils": "5.43.0", - "@typescript-eslint/utils": "5.43.0", - "debug": "^4.3.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.43.0.tgz", - "integrity": "sha512-2iHUK2Lh7PwNUlhFxxLI2haSDNyXvebBO9izhjhMoDC+S3XI9qt2DGFUsiJ89m2k7gGYch2aEpYqV5F/+nwZug==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.43.0", - "@typescript-eslint/types": "5.43.0", - "@typescript-eslint/typescript-estree": "5.43.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.43.0.tgz", - "integrity": "sha512-XNWnGaqAtTJsUiZaoiGIrdJYHsUOd3BZ3Qj5zKp9w6km6HsrjPk/TGZv0qMTWyWj0+1QOqpHQ2gZOLXaGA9Ekw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.43.0", - "@typescript-eslint/visitor-keys": "5.43.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.43.0.tgz", - "integrity": "sha512-K21f+KY2/VvYggLf5Pk4tgBOPs2otTaIHy2zjclo7UZGLyFH86VfUOm5iq+OtDtxq/Zwu2I3ujDBykVW4Xtmtg==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "5.43.0", - "@typescript-eslint/utils": "5.43.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.43.0.tgz", - "integrity": "sha512-jpsbcD0x6AUvV7tyOlyvon0aUsQpF8W+7TpJntfCUWU1qaIKu2K34pMwQKSzQH8ORgUrGYY6pVIh1Pi8TNeteg==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.43.0.tgz", - "integrity": "sha512-BZ1WVe+QQ+igWal2tDbNg1j2HWUkAa+CVqdU79L4HP9izQY6CNhXfkNwd1SS4+sSZAP/EthI1uiCSY/+H0pROg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.43.0", - "@typescript-eslint/visitor-keys": "5.43.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.43.0.tgz", - "integrity": "sha512-8nVpA6yX0sCjf7v/NDfeaOlyaIIqL7OaIGOWSPFqUKK59Gnumd3Wa+2l8oAaYO2lk0sO+SbWFWRSvhu8gLGv4A==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.43.0", - "@typescript-eslint/types": "5.43.0", - "@typescript-eslint/typescript-estree": "5.43.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.43.0.tgz", - "integrity": "sha512-icl1jNH/d18OVHLfcwdL3bWUKsBeIiKYTGxMJCoGe7xFht+E4QgzOqoWYrU8XSLJWhVw8nTacbm03v23J/hFTg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.43.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/add-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", - "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", - "dev": true - }, - "node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "dependencies": { - "default-require-extensions": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true - }, - "node_modules/array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", - "dev": true - }, - "node_modules/async-mutex": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.4.1.tgz", - "integrity": "sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA==", - "dev": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/axe-core": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.5.2.tgz", - "integrity": "sha512-u2MVsXfew5HBvjsczCv+xlwdNnB1oQR9HlAcsejZttNjKKSkeDNVwB1vMThIUIFI9GoT57Vtk8iQLwqOfAkboA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", - "dev": true - }, - "node_modules/b4a": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", - "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==", - "dev": true - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bson": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz", - "integrity": "sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q==", - "dev": true, - "engines": { - "node": ">=16.20.1" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-keys/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001317", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001317.tgz", - "integrity": "sha512-xIZLh8gBm4dqNX0gkzrBeyI86J2eCjWzYAs40q88smG844YIrN4tVQl/RhquHvKEKImWWFIVh1Lxe5n1G/N+GQ==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ci-info": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.6.1.tgz", - "integrity": "sha512-up5ggbaDqOqJ4UqLKZ2naVkyqSJQgJi5lwD6b6mM748ysrghDBX0bx/qJTUHzw7zu6Mq4gycviSF5hJnwceD8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/clean-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", - "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/clean-regexp/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "dev": true, - "engines": [ - "node >= 6.0" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true - }, - "node_modules/conventional-changelog": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.25.tgz", - "integrity": "sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==", - "dev": true, - "dependencies": { - "conventional-changelog-angular": "^5.0.12", - "conventional-changelog-atom": "^2.0.8", - "conventional-changelog-codemirror": "^2.0.8", - "conventional-changelog-conventionalcommits": "^4.5.0", - "conventional-changelog-core": "^4.2.1", - "conventional-changelog-ember": "^2.0.9", - "conventional-changelog-eslint": "^3.0.9", - "conventional-changelog-express": "^2.0.6", - "conventional-changelog-jquery": "^3.0.11", - "conventional-changelog-jshint": "^2.0.9", - "conventional-changelog-preset-loader": "^2.3.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-atom": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", - "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==", - "dev": true, - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-codemirror": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", - "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==", - "dev": true, - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-config-spec": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.1.0.tgz", - "integrity": "sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==", - "dev": true - }, - "node_modules/conventional-changelog-conventionalcommits": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz", - "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0", - "lodash": "^4.17.15", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", - "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", - "dev": true, - "dependencies": { - "add-stream": "^1.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-parser": "^3.2.0", - "dateformat": "^3.0.0", - "get-pkg-repo": "^4.0.0", - "git-raw-commits": "^2.0.8", - "git-remote-origin-url": "^2.0.0", - "git-semver-tags": "^4.1.1", - "lodash": "^4.17.15", - "normalize-package-data": "^3.0.0", - "q": "^1.5.1", - "read-pkg": "^3.0.0", - "read-pkg-up": "^3.0.0", - "through2": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-changelog-core/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-changelog-core/node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-changelog-core/node_modules/read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", - "dev": true, - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-changelog-core/node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/conventional-changelog-core/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/conventional-changelog-core/node_modules/read-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/conventional-changelog-ember": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", - "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", - "dev": true, - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-eslint": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", - "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", - "dev": true, - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-express": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", - "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", - "dev": true, - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-jquery": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", - "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", - "dev": true, - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-jshint": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", - "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-preset-loader": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", - "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", - "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", - "dev": true, - "dependencies": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-changelog-writer": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", - "dev": true, - "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", - "dev": true, - "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-recommended-bump": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", - "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", - "dev": true, - "dependencies": { - "concat-stream": "^2.0.0", - "conventional-changelog-preset-loader": "^2.3.4", - "conventional-commits-filter": "^2.0.7", - "conventional-commits-parser": "^3.2.0", - "git-raw-commits": "^2.0.8", - "git-semver-tags": "^4.1.1", - "meow": "^8.0.0", - "q": "^1.5.1" - }, - "bin": { - "conventional-recommended-bump": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/core-js-pure": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.1.tgz", - "integrity": "sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ==", - "dev": true, - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/cron-parser": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.5.0.tgz", - "integrity": "sha512-QHdeh3zLWz6YvYTFKpRb860rJlip16pEinbxXT1i2NZB/nOxBjd2RbSv54sn5UrAj9WykiSLYWWDgo8azQK0HA==", - "dependencies": { - "luxon": "^2.4.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/cron-parser/node_modules/luxon": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.5.2.tgz", - "integrity": "sha512-Yg7/RDp4nedqmLgyH0LwgGRvMEKVzKbUdkBYyCosbHgJ+kaOUx0qzSiSatVc3DFygnirTPYnMM2P5dg2uH1WvA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "node_modules/dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/date.js": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/date.js/-/date.js-0.3.3.tgz", - "integrity": "sha512-HgigOS3h3k6HnW011nAb43c5xx5rBXk8P2v/WIT9Zv4koIaVXiH2BURguI78VVp+5Qc076T7OR378JViCnZtBw==", - "dependencies": { - "debug": "~3.1.0" - } - }, - "node_modules/date.js/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/date.js/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-eql": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.2.tgz", - "integrity": "sha512-gT18+YW4CcW/DBNTwAmqTtkJh7f9qqScu2qFVlx7kCoeY9tlBu9cUcr7+I+Z/noG8INehS3xQgLpTtd/QUTn4w==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/default-require-extensions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", - "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", - "dev": true, - "dependencies": { - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delay": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/delay/-/delay-6.0.0.tgz", - "integrity": "sha512-2NJozoOHQ4NuZuVIr5CWd0iiLVIRSDepakaovIN+9eIDHEhdCAEvSy2cuf1DCrPPQLvHmbqTHODlhHg8UCy4zw==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dotgitignore": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-2.1.0.tgz", - "integrity": "sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==", - "dev": true, - "dependencies": { - "find-up": "^3.0.0", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dotgitignore/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dotgitignore/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dotgitignore/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dotgitignore/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dotgitignore/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.88", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.88.tgz", - "integrity": "sha512-oA7mzccefkvTNi9u7DXmT0LqvhnOiN2BhSrKerta7HeUC1cLoIwtbf2wL+Ah2ozh5KQd3/1njrGrwDBXx6d14Q==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", - "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.15.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-airbnb-base": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", - "dev": true, - "dependencies": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "peerDependencies": { - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.2" - } - }, - "node_modules/eslint-config-airbnb-base/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-config-airbnb-typescript": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.0.0.tgz", - "integrity": "sha512-elNiuzD0kPAPTXjFWg+lE24nMdHMtuxgYoD30OyMD6yrW1AhFZPAg27VX7d3tzOErw+dgJTNWfRSDqEcXb4V0g==", - "dev": true, - "dependencies": { - "eslint-config-airbnb-base": "^15.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.13.0", - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.3" - } - }, - "node_modules/eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-import-resolver-alias": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-alias/-/eslint-import-resolver-alias-1.1.2.tgz", - "integrity": "sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w==", - "dev": true, - "engines": { - "node": ">= 4" - }, - "peerDependencies": { - "eslint-plugin-import": ">=1.4.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-typescript": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz", - "integrity": "sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "glob": "^7.2.0", - "is-glob": "^4.0.3", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", - "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "find-up": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-es": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", - "dev": true, - "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "node_modules/eslint-plugin-es/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz", - "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.18.9", - "aria-query": "^4.2.2", - "array-includes": "^3.1.5", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.4.3", - "axobject-query": "^2.2.0", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.2", - "language-tags": "^1.0.5", - "minimatch": "^3.1.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-mocha": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.1.0.tgz", - "integrity": "sha512-xLqqWUF17llsogVOC+8C6/jvQ+4IoOREbN7ZCHuOHuD6cT5cDD4h7f2LgsZuzMAiwswWE21tO7ExaknHVDrSkw==", - "dev": true, - "dependencies": { - "eslint-utils": "^3.0.0", - "rambda": "^7.1.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", - "dev": true, - "dependencies": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "peerDependencies": { - "eslint": ">=5.16.0" - } - }, - "node_modules/eslint-plugin-node/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-plugin-node/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-node/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.31.10", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz", - "integrity": "sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.5", - "array.prototype.flatmap": "^1.3.0", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.5", - "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.1", - "object.values": "^1.1.5", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.3", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-unicorn": { - "version": "44.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-44.0.2.tgz", - "integrity": "sha512-GLIDX1wmeEqpGaKcnMcqRvMVsoabeF0Ton0EX4Th5u6Kmf7RM9WBl705AXFEsns56ESkEs0uyelLuUTvz9Tr0w==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.19.1", - "ci-info": "^3.4.0", - "clean-regexp": "^1.0.0", - "eslint-utils": "^3.0.0", - "esquery": "^1.4.0", - "indent-string": "^4.0.0", - "is-builtin-module": "^3.2.0", - "lodash": "^4.17.21", - "pluralize": "^8.0.0", - "read-pkg-up": "^7.0.1", - "regexp-tree": "^0.1.24", - "safe-regex": "^2.1.1", - "semver": "^7.3.7", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=14.18" - }, - "funding": { - "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" - }, - "peerDependencies": { - "eslint": ">=8.23.1" - } - }, - "node_modules/eslint-plugin-you-dont-need-lodash-underscore": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-you-dont-need-lodash-underscore/-/eslint-plugin-you-dont-need-lodash-underscore-6.12.0.tgz", - "integrity": "sha512-WF4mNp+k2532iswT6iUd1BX6qjd3AV4cFy/09VC82GY9SsRtvkxhUIx7JNGSe0/bLyd57oTr4inPFiIaENXhGw==", - "dev": true, - "dependencies": { - "kebab-case": "^1.0.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", - "dev": true, - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fast-xml-parser": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", - "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", - "dev": true, - "funding": [ - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - }, - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "optional": true, - "peer": true, - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-pkg-repo": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", - "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", - "dev": true, - "dependencies": { - "@hutson/parse-repository-url": "^3.0.0", - "hosted-git-info": "^4.0.0", - "through2": "^2.0.0", - "yargs": "^16.2.0" - }, - "bin": { - "get-pkg-repo": "src/cli.js" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-pkg-repo/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/get-pkg-repo/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/get-pkg-repo/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/get-pkg-repo/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/get-pkg-repo/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/git-raw-commits": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", - "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", - "dev": true, - "dependencies": { - "dargs": "^7.0.0", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "git-raw-commits": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/git-remote-origin-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", - "dev": true, - "dependencies": { - "gitconfiglocal": "^1.0.0", - "pify": "^2.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/git-semver-tags": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", - "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", - "dev": true, - "dependencies": { - "meow": "^8.0.0", - "semver": "^6.0.0" - }, - "bin": { - "git-semver-tags": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/git-semver-tags/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/gitconfiglocal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", - "dev": true, - "dependencies": { - "ini": "^1.3.2" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "13.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", - "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", - "dev": true - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasha/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/https-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/human-interval": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/human-interval/-/human-interval-2.0.1.tgz", - "integrity": "sha512-r4Aotzf+OtKIGQCB3odUowy4GfUDTy3aTWTfLd7ZF2gBCy3XW3v/dJLRefZnOFFnjqs5B1TypvS8WarpBkYUNQ==", - "dependencies": { - "numbered": "^1.1.0" - } - }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-builtin-module": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", - "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", - "dev": true, - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", - "dev": true, - "dependencies": { - "text-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "dependencies": { - "append-transform": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-processinfo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", - "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", - "dev": true, - "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.0", - "istanbul-lib-coverage": "^3.0.0-alpha.1", - "make-dir": "^3.0.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^3.3.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/js-sdsl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", - "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true - }, - "node_modules/kebab-case": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/kebab-case/-/kebab-case-1.0.1.tgz", - "integrity": "sha512-txPHx6nVLhv8PHGXIlAk0nYoh894SpAqGPXNvbg2hh8spvHXIah3+vT87DLoa59nKgC6scD3u3xAuRIgiMqbfQ==", - "dev": true - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true - }, - "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", - "dev": true, - "dependencies": { - "language-subtag-registry": "~0.3.2" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true - }, - "node_modules/lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loupe": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", - "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.0" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, - "node_modules/luxon": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", - "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/marked": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.2.tgz", - "integrity": "sha512-JjBTFTAvuTgANXx82a5vzK9JLSMoV6V3LBVn4Uhdso6t7vXrGx7g1Cd2r6NYSsxrYbQGFCMqBDhFHyK5q2UvcQ==", - "dev": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "dev": true - }, - "node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/meow/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/mocha": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.1.0.tgz", - "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", - "dev": true, - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/mocha/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/mocha/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/mocha/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mongodb": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.3.0.tgz", - "integrity": "sha512-tt0KuGjGtLUhLoU263+xvQmPHEGTw5LbcNC73EoFRYgSHwZt5tsoJC110hDyO1kjQzpgNrpdcSza9PknWN4LrA==", - "dev": true, - "dependencies": { - "@mongodb-js/saslprep": "^1.1.0", - "bson": "^6.2.0", - "mongodb-connection-string-url": "^3.0.0" - }, - "engines": { - "node": ">=16.20.1" - }, - "peerDependencies": { - "@aws-sdk/credential-providers": "^3.188.0", - "@mongodb-js/zstd": "^1.1.0", - "gcp-metadata": "^5.2.0", - "kerberos": "^2.0.1", - "mongodb-client-encryption": ">=6.0.0 <7", - "snappy": "^7.2.2", - "socks": "^2.7.1" - }, - "peerDependenciesMeta": { - "@aws-sdk/credential-providers": { - "optional": true - }, - "@mongodb-js/zstd": { - "optional": true - }, - "gcp-metadata": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "snappy": { - "optional": true - }, - "socks": { - "optional": true - } - } - }, - "node_modules/mongodb-connection-string-url": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", - "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", - "dev": true, - "dependencies": { - "@types/whatwg-url": "^8.2.1", - "whatwg-url": "^11.0.0" - } - }, - "node_modules/mongodb-memory-server": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-9.1.6.tgz", - "integrity": "sha512-gzcpgGYlPhuKmria37W+bvYy6W+OkX2UVG7MoP41OWFvQv2Hn7A+fLXkV+lsMmhog1lMQprdV6AR+gixgheLaw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "mongodb-memory-server-core": "9.1.6", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.20.1" - } - }, - "node_modules/mongodb-memory-server-core": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-9.1.6.tgz", - "integrity": "sha512-3H/dq5II+XcSbK80hicMw4zFlDxcpjt4oWJq76RlOVuLoaf3AFqVheR6Vqx9ymlIqER4Jni58FMCIIRbesia1A==", - "dev": true, - "dependencies": { - "async-mutex": "^0.4.0", - "camelcase": "^6.3.0", - "debug": "^4.3.4", - "find-cache-dir": "^3.3.2", - "follow-redirects": "^1.15.3", - "https-proxy-agent": "^7.0.2", - "mongodb": "^5.9.1", - "new-find-package-json": "^2.0.0", - "semver": "^7.5.4", - "tar-stream": "^3.0.0", - "tslib": "^2.6.2", - "yauzl": "^2.10.0" - }, - "engines": { - "node": ">=14.20.1" - } - }, - "node_modules/mongodb-memory-server-core/node_modules/bson": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/bson/-/bson-5.5.1.tgz", - "integrity": "sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==", - "dev": true, - "engines": { - "node": ">=14.20.1" - } - }, - "node_modules/mongodb-memory-server-core/node_modules/mongodb": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.9.2.tgz", - "integrity": "sha512-H60HecKO4Bc+7dhOv4sJlgvenK4fQNqqUIlXxZYQNbfEWSALGAwGoyJd/0Qwk4TttFXUOHJ2ZJQe/52ScaUwtQ==", - "dev": true, - "dependencies": { - "bson": "^5.5.0", - "mongodb-connection-string-url": "^2.6.0", - "socks": "^2.7.1" - }, - "engines": { - "node": ">=14.20.1" - }, - "optionalDependencies": { - "@mongodb-js/saslprep": "^1.1.0" - }, - "peerDependencies": { - "@aws-sdk/credential-providers": "^3.188.0", - "@mongodb-js/zstd": "^1.0.0", - "kerberos": "^1.0.0 || ^2.0.0", - "mongodb-client-encryption": ">=2.3.0 <3", - "snappy": "^7.2.2" - }, - "peerDependenciesMeta": { - "@aws-sdk/credential-providers": { - "optional": true - }, - "@mongodb-js/zstd": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "snappy": { - "optional": true - } - } - }, - "node_modules/mongodb/node_modules/@types/whatwg-url": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.4.tgz", - "integrity": "sha512-lXCmTWSHJvf0TRSO58nm978b8HJ/EdsSsEKLd3ODHFjo+3VGAyyTp4v50nWvwtzBxSMQrVOK7tcuN0zGPLICMw==", - "dev": true, - "dependencies": { - "@types/webidl-conversions": "*" - } - }, - "node_modules/mongodb/node_modules/mongodb-connection-string-url": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.0.tgz", - "integrity": "sha512-t1Vf+m1I5hC2M5RJx/7AtxgABy1cZmIPQRMXw+gEIPn/cZNF3Oiy+l0UIypUwVB5trcWHq3crg2g3uAR9aAwsQ==", - "dev": true, - "dependencies": { - "@types/whatwg-url": "^11.0.2", - "whatwg-url": "^13.0.0" - } - }, - "node_modules/mongodb/node_modules/tr46": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", - "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", - "dev": true, - "dependencies": { - "punycode": "^2.3.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/mongodb/node_modules/whatwg-url": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", - "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", - "dev": true, - "dependencies": { - "tr46": "^4.1.1", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/new-find-package-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/new-find-package-json/-/new-find-package-json-2.0.0.tgz", - "integrity": "sha512-lDcBsjBSMlj3LXH2v/FW3txlh2pYTjmbOXPYJD93HI5EwuLzI11tdHSIpUMmfq/IOsldj4Ps8M8flhm+pCK4Ew==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/nise": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.2.tgz", - "integrity": "sha512-+gQjFi8v+tkfCuSCxfURHLhRhniE/+IaYbIphxAN2JRR9SHKhY8hgXpaXiYfHdw+gcGe4buxgbprBQFab9FkhA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "^7.0.4", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - } - }, - "node_modules/nise/node_modules/@sinonjs/fake-timers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", - "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/nise/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz", - "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "dependencies": { - "process-on-spawn": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", - "dev": true - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/numbered": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/numbered/-/numbered-1.1.0.tgz", - "integrity": "sha512-pv/ue2Odr7IfYOO0byC1KgBI10wo5YDauLhxY6/saNzAdAs0r1SotGCPzzCLNPL0xtrAwWRialLu23AAu9xO1g==" - }, - "node_modules/nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "bin": { - "nyc": "bin/nyc.js" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/nyc/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/nyc/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/nyc/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nyc/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/nyc/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/nyc/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz", - "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "dependencies": { - "fromentries": "^1.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true, - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", - "dev": true - }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/rambda": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/rambda/-/rambda-7.2.0.tgz", - "integrity": "sha512-xW2ZcQh+AtRHdIN0RUix+gAwyfAeMBZA6SnLSblw1+YRqUx+eV4Eppg/ayDdrvSs6KegZYHYtSF6+I86Z5Owqg==", - "dev": true - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.10", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", - "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==", - "dev": true - }, - "node_modules/regexp-tree": { - "version": "0.1.24", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", - "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", - "dev": true, - "bin": { - "regexp-tree": "bin/regexp-tree" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "dependencies": { - "es6-error": "^4.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/safe-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", - "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", - "dev": true, - "dependencies": { - "regexp-tree": "~0.1.1" - } - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/shiki": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.11.1.tgz", - "integrity": "sha512-EugY9VASFuDqOexOgXR18ZV+TbFrQHeCpEYaXamO+SZlsnT/2LxuLBX25GGtIrwaEVFXUAbUQ601SWE2rMwWHA==", - "dev": true, - "dependencies": { - "jsonc-parser": "^3.0.0", - "vscode-oniguruma": "^1.6.1", - "vscode-textmate": "^6.0.0" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/sinon": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.0.0.tgz", - "integrity": "sha512-pV97G1GbslaSJoSdy2F2z8uh5F+uPGp3ddOzA4JsBOUBLEQRz2OAqlKGRFTSh2KiqUCmHkzyAeu7R4x1Hx0wwg==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "^9.1.2", - "@sinonjs/samsam": "^7.0.1", - "diff": "^5.0.0", - "nise": "^5.1.2", - "supports-color": "^7.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dev": true, - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", - "dev": true, - "dependencies": { - "memory-pager": "^1.0.2" - } - }, - "node_modules/spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "dev": true - }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "dependencies": { - "readable-stream": "^3.0.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/standard-version": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-9.5.0.tgz", - "integrity": "sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "conventional-changelog": "3.1.25", - "conventional-changelog-config-spec": "2.1.0", - "conventional-changelog-conventionalcommits": "4.6.3", - "conventional-recommended-bump": "6.1.0", - "detect-indent": "^6.0.0", - "detect-newline": "^3.1.0", - "dotgitignore": "^2.1.0", - "figures": "^3.1.0", - "find-up": "^5.0.0", - "git-semver-tags": "^4.0.0", - "semver": "^7.1.1", - "stringify-package": "^1.0.1", - "yargs": "^16.0.0" - }, - "bin": { - "standard-version": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/standard-version/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/standard-version/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/standard-version/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/standard-version/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/standard-version/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/standard-version/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/standard-version/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/standard-version/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/standard-version/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/standard-version/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/standard-version/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/standard-version/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/streamx": { - "version": "2.15.6", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.6.tgz", - "integrity": "sha512-q+vQL4AAz+FdfT137VF69Cc/APqUbxy+MDOImRrMvchJpigHj9GksgDU2LYbO9rx7RX6osWgxJB2WxhYv4SZAw==", - "dev": true, - "dependencies": { - "fast-fifo": "^1.1.0", - "queue-tick": "^1.0.1" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/stringify-package": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz", - "integrity": "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==", - "dev": true - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "dev": true, - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsx": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.0.tgz", - "integrity": "sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==", - "dev": true, - "dependencies": { - "esbuild": "~0.19.10", - "get-tsconfig": "^4.7.2" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typedoc": { - "version": "0.23.21", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.21.tgz", - "integrity": "sha512-VNE9Jv7BgclvyH9moi2mluneSviD43dCE9pY8RWkO88/DrEgJZk9KpUk7WO468c9WWs/+aG6dOnoH7ccjnErhg==", - "dev": true, - "dependencies": { - "lunr": "^2.3.9", - "marked": "^4.0.19", - "minimatch": "^5.1.0", - "shiki": "^0.11.1" - }, - "bin": { - "typedoc": "bin/typedoc" - }, - "engines": { - "node": ">= 14.14" - }, - "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x" - } - }, - "node_modules/typedoc/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/typedoc/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/typescript": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/uglify-js": { - "version": "3.16.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.16.3.tgz", - "integrity": "sha512-uVbFqx9vvLhQg0iBaau9Z75AxWJ8tqM9AV890dIZCLApF4rTcyHwmAvLeEdYRs+BzYWu8Iw81F79ah0EfTXbaw==", - "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "optional": true, - "peer": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/vscode-oniguruma": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz", - "integrity": "sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA==", - "dev": true - }, - "node_modules/vscode-textmate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-6.0.0.tgz", - "integrity": "sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ==", - "dev": true - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dev": true, - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, - "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser/node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs-unparser/node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.0" - } - }, - "@aws-crypto/crc32": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", - "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "optional": true, - "peer": true - } - } - }, - "@aws-crypto/ie11-detection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", - "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "optional": true, - "peer": true - } - } - }, - "@aws-crypto/sha256-browser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", - "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@aws-crypto/ie11-detection": "^3.0.0", - "@aws-crypto/sha256-js": "^3.0.0", - "@aws-crypto/supports-web-crypto": "^3.0.0", - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "optional": true, - "peer": true - } - } - }, - "@aws-crypto/sha256-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", - "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "optional": true, - "peer": true - } - } - }, - "@aws-crypto/supports-web-crypto": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", - "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "optional": true, - "peer": true - } - } - }, - "@aws-crypto/util": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", - "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "optional": true, - "peer": true - } - } - }, - "@aws-sdk/client-cognito-identity": { - "version": "3.503.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.503.1.tgz", - "integrity": "sha512-nOBoY1hM4hyd2xQbH8IK53MStsl5ywoY899dBxXBNx2FbNEP4cU4kps9NwBGxujXzd8g6WEmarpcKwAdrERvWg==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.502.0", - "@aws-sdk/core": "3.496.0", - "@aws-sdk/credential-provider-node": "3.503.1", - "@aws-sdk/middleware-host-header": "3.502.0", - "@aws-sdk/middleware-logger": "3.502.0", - "@aws-sdk/middleware-recursion-detection": "3.502.0", - "@aws-sdk/middleware-signing": "3.502.0", - "@aws-sdk/middleware-user-agent": "3.502.0", - "@aws-sdk/region-config-resolver": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@aws-sdk/util-endpoints": "3.502.0", - "@aws-sdk/util-user-agent-browser": "3.502.0", - "@aws-sdk/util-user-agent-node": "3.502.0", - "@smithy/config-resolver": "^2.1.1", - "@smithy/core": "^1.3.1", - "@smithy/fetch-http-handler": "^2.4.1", - "@smithy/hash-node": "^2.1.1", - "@smithy/invalid-dependency": "^2.1.1", - "@smithy/middleware-content-length": "^2.1.1", - "@smithy/middleware-endpoint": "^2.4.1", - "@smithy/middleware-retry": "^2.1.1", - "@smithy/middleware-serde": "^2.1.1", - "@smithy/middleware-stack": "^2.1.1", - "@smithy/node-config-provider": "^2.2.1", - "@smithy/node-http-handler": "^2.3.1", - "@smithy/protocol-http": "^3.1.1", - "@smithy/smithy-client": "^2.3.1", - "@smithy/types": "^2.9.1", - "@smithy/url-parser": "^2.1.1", - "@smithy/util-base64": "^2.1.1", - "@smithy/util-body-length-browser": "^2.1.1", - "@smithy/util-body-length-node": "^2.2.1", - "@smithy/util-defaults-mode-browser": "^2.1.1", - "@smithy/util-defaults-mode-node": "^2.1.1", - "@smithy/util-endpoints": "^1.1.1", - "@smithy/util-retry": "^2.1.1", - "@smithy/util-utf8": "^2.1.1", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/client-sso": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.502.0.tgz", - "integrity": "sha512-OZAYal1+PQgUUtWiHhRayDtX0OD+XpXHKAhjYgEIPbyhQaCMp3/Bq1xDX151piWXvXqXLJHFKb8DUEqzwGO9QA==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.496.0", - "@aws-sdk/middleware-host-header": "3.502.0", - "@aws-sdk/middleware-logger": "3.502.0", - "@aws-sdk/middleware-recursion-detection": "3.502.0", - "@aws-sdk/middleware-user-agent": "3.502.0", - "@aws-sdk/region-config-resolver": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@aws-sdk/util-endpoints": "3.502.0", - "@aws-sdk/util-user-agent-browser": "3.502.0", - "@aws-sdk/util-user-agent-node": "3.502.0", - "@smithy/config-resolver": "^2.1.1", - "@smithy/core": "^1.3.1", - "@smithy/fetch-http-handler": "^2.4.1", - "@smithy/hash-node": "^2.1.1", - "@smithy/invalid-dependency": "^2.1.1", - "@smithy/middleware-content-length": "^2.1.1", - "@smithy/middleware-endpoint": "^2.4.1", - "@smithy/middleware-retry": "^2.1.1", - "@smithy/middleware-serde": "^2.1.1", - "@smithy/middleware-stack": "^2.1.1", - "@smithy/node-config-provider": "^2.2.1", - "@smithy/node-http-handler": "^2.3.1", - "@smithy/protocol-http": "^3.1.1", - "@smithy/smithy-client": "^2.3.1", - "@smithy/types": "^2.9.1", - "@smithy/url-parser": "^2.1.1", - "@smithy/util-base64": "^2.1.1", - "@smithy/util-body-length-browser": "^2.1.1", - "@smithy/util-body-length-node": "^2.2.1", - "@smithy/util-defaults-mode-browser": "^2.1.1", - "@smithy/util-defaults-mode-node": "^2.1.1", - "@smithy/util-endpoints": "^1.1.1", - "@smithy/util-retry": "^2.1.1", - "@smithy/util-utf8": "^2.1.1", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/client-sso-oidc": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.502.0.tgz", - "integrity": "sha512-Yc9tZqTOMWtdgpkrdjKShgWb9oKNsFQrItfoiN1xWDllaFFRPi2KTiZiR0AbSTrNasJy13d210DOxrIdte+kWQ==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.502.0", - "@aws-sdk/core": "3.496.0", - "@aws-sdk/middleware-host-header": "3.502.0", - "@aws-sdk/middleware-logger": "3.502.0", - "@aws-sdk/middleware-recursion-detection": "3.502.0", - "@aws-sdk/middleware-signing": "3.502.0", - "@aws-sdk/middleware-user-agent": "3.502.0", - "@aws-sdk/region-config-resolver": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@aws-sdk/util-endpoints": "3.502.0", - "@aws-sdk/util-user-agent-browser": "3.502.0", - "@aws-sdk/util-user-agent-node": "3.502.0", - "@smithy/config-resolver": "^2.1.1", - "@smithy/core": "^1.3.1", - "@smithy/fetch-http-handler": "^2.4.1", - "@smithy/hash-node": "^2.1.1", - "@smithy/invalid-dependency": "^2.1.1", - "@smithy/middleware-content-length": "^2.1.1", - "@smithy/middleware-endpoint": "^2.4.1", - "@smithy/middleware-retry": "^2.1.1", - "@smithy/middleware-serde": "^2.1.1", - "@smithy/middleware-stack": "^2.1.1", - "@smithy/node-config-provider": "^2.2.1", - "@smithy/node-http-handler": "^2.3.1", - "@smithy/protocol-http": "^3.1.1", - "@smithy/smithy-client": "^2.3.1", - "@smithy/types": "^2.9.1", - "@smithy/url-parser": "^2.1.1", - "@smithy/util-base64": "^2.1.1", - "@smithy/util-body-length-browser": "^2.1.1", - "@smithy/util-body-length-node": "^2.2.1", - "@smithy/util-defaults-mode-browser": "^2.1.1", - "@smithy/util-defaults-mode-node": "^2.1.1", - "@smithy/util-endpoints": "^1.1.1", - "@smithy/util-retry": "^2.1.1", - "@smithy/util-utf8": "^2.1.1", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/client-sts": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.502.0.tgz", - "integrity": "sha512-0q08gsvn6nuRqjK+i/e30PT/t7vvYwmGJS0PhJikZWv5yRDNSUxSYG0uDwKSbLDzmc2UX5+mLeyjPHlL4hbGlA==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.496.0", - "@aws-sdk/middleware-host-header": "3.502.0", - "@aws-sdk/middleware-logger": "3.502.0", - "@aws-sdk/middleware-recursion-detection": "3.502.0", - "@aws-sdk/middleware-user-agent": "3.502.0", - "@aws-sdk/region-config-resolver": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@aws-sdk/util-endpoints": "3.502.0", - "@aws-sdk/util-user-agent-browser": "3.502.0", - "@aws-sdk/util-user-agent-node": "3.502.0", - "@smithy/config-resolver": "^2.1.1", - "@smithy/core": "^1.3.1", - "@smithy/fetch-http-handler": "^2.4.1", - "@smithy/hash-node": "^2.1.1", - "@smithy/invalid-dependency": "^2.1.1", - "@smithy/middleware-content-length": "^2.1.1", - "@smithy/middleware-endpoint": "^2.4.1", - "@smithy/middleware-retry": "^2.1.1", - "@smithy/middleware-serde": "^2.1.1", - "@smithy/middleware-stack": "^2.1.1", - "@smithy/node-config-provider": "^2.2.1", - "@smithy/node-http-handler": "^2.3.1", - "@smithy/protocol-http": "^3.1.1", - "@smithy/smithy-client": "^2.3.1", - "@smithy/types": "^2.9.1", - "@smithy/url-parser": "^2.1.1", - "@smithy/util-base64": "^2.1.1", - "@smithy/util-body-length-browser": "^2.1.1", - "@smithy/util-body-length-node": "^2.2.1", - "@smithy/util-defaults-mode-browser": "^2.1.1", - "@smithy/util-defaults-mode-node": "^2.1.1", - "@smithy/util-endpoints": "^1.1.1", - "@smithy/util-middleware": "^2.1.1", - "@smithy/util-retry": "^2.1.1", - "@smithy/util-utf8": "^2.1.1", - "fast-xml-parser": "4.2.5", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/core": { - "version": "3.496.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.496.0.tgz", - "integrity": "sha512-yT+ug7Cw/3eJi7x2es0+46x12+cIJm5Xv+GPWsrTFD1TKgqO/VPEgfDtHFagDNbFmjNQA65Ygc/kEdIX9ICX/A==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/core": "^1.3.1", - "@smithy/protocol-http": "^3.1.1", - "@smithy/signature-v4": "^2.1.1", - "@smithy/smithy-client": "^2.3.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-cognito-identity": { - "version": "3.503.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.503.1.tgz", - "integrity": "sha512-B7GQ9hRRKaUTp5sWYqBfoIXIWc0zgBuzWANtnswFpKcYN/sdgq2OQoiWUEZrn3BBpun1LgJ1JuFNY8fkEfVTQg==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@aws-sdk/client-cognito-identity": "3.503.1", - "@aws-sdk/types": "3.502.0", - "@smithy/property-provider": "^2.1.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-env": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.502.0.tgz", - "integrity": "sha512-KIB8Ae1Z7domMU/jU4KiIgK4tmYgvuXlhR54ehwlVHxnEoFPoPuGHFZU7oFn79jhhSLUFQ1lRYMxP0cEwb7XeQ==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@aws-sdk/types": "3.502.0", - "@smithy/property-provider": "^2.1.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-http": { - "version": "3.503.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.503.1.tgz", - "integrity": "sha512-rTdlFFGoPPFMF2YjtlfRuSgKI+XsF49u7d98255hySwhsbwd3Xp+utTTPquxP+CwDxMHbDlI7NxDzFiFdsoZug==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@aws-sdk/types": "3.502.0", - "@smithy/fetch-http-handler": "^2.4.1", - "@smithy/node-http-handler": "^2.3.1", - "@smithy/property-provider": "^2.1.1", - "@smithy/protocol-http": "^3.1.1", - "@smithy/smithy-client": "^2.3.1", - "@smithy/types": "^2.9.1", - "@smithy/util-stream": "^2.1.1", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-ini": { - "version": "3.503.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.503.1.tgz", - "integrity": "sha512-1RiC72NdWJ5w2IaX/91Fku+FrrChzaHuMCD5wbjk5TMHjwiDZ622wvMKYVmn30biW0RbJidaw38Y9PAGivdZxw==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@aws-sdk/client-sts": "3.502.0", - "@aws-sdk/credential-provider-env": "3.502.0", - "@aws-sdk/credential-provider-process": "3.502.0", - "@aws-sdk/credential-provider-sso": "3.503.1", - "@aws-sdk/credential-provider-web-identity": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@smithy/credential-provider-imds": "^2.2.1", - "@smithy/property-provider": "^2.1.1", - "@smithy/shared-ini-file-loader": "^2.3.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-node": { - "version": "3.503.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.503.1.tgz", - "integrity": "sha512-1qsRWnXl8OUZEDpUFF/gjCGjePjZB6fIpX+XQuTpKokeDzYZk0HwQSakPspfmzT8MkyB9IBJVWb7KbFCjKNt0A==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@aws-sdk/credential-provider-env": "3.502.0", - "@aws-sdk/credential-provider-http": "3.503.1", - "@aws-sdk/credential-provider-ini": "3.503.1", - "@aws-sdk/credential-provider-process": "3.502.0", - "@aws-sdk/credential-provider-sso": "3.503.1", - "@aws-sdk/credential-provider-web-identity": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@smithy/credential-provider-imds": "^2.2.1", - "@smithy/property-provider": "^2.1.1", - "@smithy/shared-ini-file-loader": "^2.3.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-process": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.502.0.tgz", - "integrity": "sha512-fJJowOjQ4infYQX0E1J3xFVlmuwEYJAFk0Mo1qwafWmEthsBJs+6BR2RiWDELHKrSK35u4Pf3fu3RkYuCtmQFw==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@aws-sdk/types": "3.502.0", - "@smithy/property-provider": "^2.1.1", - "@smithy/shared-ini-file-loader": "^2.3.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-sso": { - "version": "3.503.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.503.1.tgz", - "integrity": "sha512-Wj+rgpD4EcGB+j6mMYPD4SPNEN0sUSq7UMTTfdzZ+1MSTnbPDC9rgde0D3yJPrJ1le/0j+sXPALvr5RKSpENbg==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@aws-sdk/client-sso": "3.502.0", - "@aws-sdk/token-providers": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@smithy/property-provider": "^2.1.1", - "@smithy/shared-ini-file-loader": "^2.3.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-web-identity": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.502.0.tgz", - "integrity": "sha512-veBAjDqjMMgA2Qxxf9ywDfHYLeJpaeHWLWCQ9XCHwJJ6ZIGWmAZPTq3he/UMr5JIQXooIccqqyqXMDIXPenXpA==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@aws-sdk/client-sts": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@smithy/property-provider": "^2.1.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-providers": { - "version": "3.503.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.503.1.tgz", - "integrity": "sha512-+BILMFJF8Nwc9ZmV0tm2eOEJNfxdkkoBw4KegKAkYj+7PY+NL5S6t6syvWYLWATEtJyeqREq2WUxplILe5vu5A==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@aws-sdk/client-cognito-identity": "3.503.1", - "@aws-sdk/client-sso": "3.502.0", - "@aws-sdk/client-sts": "3.502.0", - "@aws-sdk/credential-provider-cognito-identity": "3.503.1", - "@aws-sdk/credential-provider-env": "3.502.0", - "@aws-sdk/credential-provider-http": "3.503.1", - "@aws-sdk/credential-provider-ini": "3.503.1", - "@aws-sdk/credential-provider-node": "3.503.1", - "@aws-sdk/credential-provider-process": "3.502.0", - "@aws-sdk/credential-provider-sso": "3.503.1", - "@aws-sdk/credential-provider-web-identity": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@smithy/credential-provider-imds": "^2.2.1", - "@smithy/property-provider": "^2.1.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-host-header": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.502.0.tgz", - "integrity": "sha512-EjnG0GTYXT/wJBmm5/mTjDcAkzU8L7wQjOzd3FTXuTCNNyvAvwrszbOj5FlarEw5XJBbQiZtBs+I5u9+zy560w==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@aws-sdk/types": "3.502.0", - "@smithy/protocol-http": "^3.1.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-logger": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.502.0.tgz", - "integrity": "sha512-FDyv6K4nCoHxbjLGS2H8ex8I0KDIiu4FJgVRPs140ZJy6gE5Pwxzv6YTzZGLMrnqcIs9gh065Lf6DjwMelZqaw==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@aws-sdk/types": "3.502.0", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-recursion-detection": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.502.0.tgz", - "integrity": "sha512-hvbyGJbxeuezxOu8VfFmcV4ql1hKXLxHTe5FNYfEBat2KaZXVhc1Hg+4TvB06/53p+E8J99Afmumkqbxs2esUA==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@aws-sdk/types": "3.502.0", - "@smithy/protocol-http": "^3.1.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-signing": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.502.0.tgz", - "integrity": "sha512-4hF08vSzJ7L6sB+393gOFj3s2N6nLusYS0XrMW6wYNFU10IDdbf8Z3TZ7gysDJJHEGQPmTAesPEDBsasGWcMxg==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@aws-sdk/types": "3.502.0", - "@smithy/property-provider": "^2.1.1", - "@smithy/protocol-http": "^3.1.1", - "@smithy/signature-v4": "^2.1.1", - "@smithy/types": "^2.9.1", - "@smithy/util-middleware": "^2.1.1", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-user-agent": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.502.0.tgz", - "integrity": "sha512-TxbBZbRiXPH0AUxegqiNd9aM9zNSbfjtBs5MEfcBsweeT/B2O7K1EjP9+CkB8Xmk/5FLKhAKLr19b1TNoE27rw==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@aws-sdk/types": "3.502.0", - "@aws-sdk/util-endpoints": "3.502.0", - "@smithy/protocol-http": "^3.1.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/region-config-resolver": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.502.0.tgz", - "integrity": "sha512-mxmsX2AGgnSM+Sah7mcQCIneOsJQNiLX0COwEttuf8eO+6cLMAZvVudH3BnWTfea4/A9nuri9DLCqBvEmPrilg==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@aws-sdk/types": "3.502.0", - "@smithy/node-config-provider": "^2.2.1", - "@smithy/types": "^2.9.1", - "@smithy/util-config-provider": "^2.2.1", - "@smithy/util-middleware": "^2.1.1", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/token-providers": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.502.0.tgz", - "integrity": "sha512-RQgMgIXYlSf0xGl6EUeD+pqIPBlb7e29dbqHOBFc66hJVYUC2ULZX7Y+jLvcGIEaMiIaTPyvntZRFip+U+9hag==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@aws-sdk/client-sso-oidc": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@smithy/property-provider": "^2.1.1", - "@smithy/shared-ini-file-loader": "^2.3.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/types": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.502.0.tgz", - "integrity": "sha512-M0DSPYe/gXhwD2QHgoukaZv5oDxhW3FfvYIrJptyqUq3OnPJBcDbihHjrE0PBtfh/9kgMZT60/fQ2NVFANfa2g==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/util-endpoints": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.502.0.tgz", - "integrity": "sha512-6LKFlJPp2J24r1Kpfoz5ESQn+1v5fEjDB3mtUKRdpwarhm3syu7HbKlHCF3KbcCOyahobvLvhoedT78rJFEeeg==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@aws-sdk/types": "3.502.0", - "@smithy/types": "^2.9.1", - "@smithy/util-endpoints": "^1.1.1", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/util-locate-window": { - "version": "3.495.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.495.0.tgz", - "integrity": "sha512-MfaPXT0kLX2tQaR90saBT9fWQq2DHqSSJRzW+MZWsmF+y5LGCOhO22ac/2o6TKSQm7h0HRc2GaADqYYYor62yg==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@aws-sdk/util-user-agent-browser": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.502.0.tgz", - "integrity": "sha512-v8gKyCs2obXoIkLETAeEQ3AM+QmhHhst9xbM1cJtKUGsRlVIak/XyyD+kVE6kmMm1cjfudHpHKABWk9apQcIZQ==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@aws-sdk/types": "3.502.0", - "@smithy/types": "^2.9.1", - "bowser": "^2.11.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/util-user-agent-node": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.502.0.tgz", - "integrity": "sha512-9RjxpkGZKbTdl96tIJvAo+vZoz4P/cQh36SBUt9xfRfW0BtsaLyvSrvlR5wyUYhvRcC12Axqh/8JtnAPq//+Vw==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@aws-sdk/types": "3.502.0", - "@smithy/node-config-provider": "^2.2.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/util-utf8-browser": { - "version": "3.259.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", - "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "tslib": "^2.3.1" - } - }, - "@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/compat-data": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", - "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", - "dev": true - }, - "@babel/core": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.7.tgz", - "integrity": "sha512-djHlEfFHnSnTAcPb7dATbiM5HxGOP98+3JLBZtjRb5I7RXrw7kFRoG2dXM8cm3H+o11A8IFH/uprmJpwFynRNQ==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.7", - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.7", - "@babel/parser": "^7.17.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", - "dev": true, - "requires": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", - "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", - "dev": true, - "requires": { - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "dev": true - }, - "@babel/helpers": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.7.tgz", - "integrity": "sha512-TKsj9NkjJfTBxM7Phfy7kv6yYc4ZcOo+AaWGqQOKTPDOmcGkIFb5xNA746eKisQkm4yavUYh4InYM9S+VnO01w==", - "dev": true, - "requires": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" - } - }, - "@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", - "dev": true - }, - "@babel/runtime": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz", - "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.10" - } - }, - "@babel/runtime-corejs3": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.20.1.tgz", - "integrity": "sha512-CGulbEDcg/ND1Im7fUNRZdGXmX2MTWVVZacQi/6DiKE5HNwZ3aVTm5PV4lO8HHz0B2h8WQyvKKjbX5XgTtydsg==", - "dev": true, - "requires": { - "core-js-pure": "^3.25.1", - "regenerator-runtime": "^0.13.10" - } - }, - "@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" - } - }, - "@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - } - }, - "@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", - "dev": true, - "optional": true - }, - "@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - } - } - }, - "@hokify/eslint-config": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@hokify/eslint-config/-/eslint-config-2.3.8.tgz", - "integrity": "sha512-Q5TDtalK1+QJQ8Evc+3VDV4Z5kH9+E+cbUTAHKCYkrjfUBUGqx6XrbFQ/TFjt469kBYhJynwZwR1iOObAg64cA==", - "dev": true, - "requires": { - "@typescript-eslint/eslint-plugin": "^5.43.0", - "@typescript-eslint/parser": "^5.43.0", - "eslint-config-airbnb-base": "^15.0.0", - "eslint-config-airbnb-typescript": "^17.0.0", - "eslint-config-prettier": "^8.5.0", - "eslint-import-resolver-alias": "^1.1.2", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^2.7.1", - "eslint-plugin-import": "2.26.0", - "eslint-plugin-jsx-a11y": "^6.6.1", - "eslint-plugin-mocha": "^10.1.0", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-react": "^7.31.10", - "eslint-plugin-unicorn": "^44.0.2", - "eslint-plugin-you-dont-need-lodash-underscore": "^6.12.0" - } - }, - "@humanwhocodes/config-array": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", - "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@hutson/parse-repository-url": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", - "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", - "dev": true - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@istanbuljs/nyc-config-typescript": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.2.tgz", - "integrity": "sha512-iKGIyMoyJuFnJRSVTZ78POIRvNnwZaWIf8vG4ZS3rQq58MMDrqEX2nnzx0R28V2X8JvmKYiqY9FP2hlJsm8A0w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2" - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "@mongodb-js/saslprep": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.4.tgz", - "integrity": "sha512-8zJ8N1x51xo9hwPh6AWnKdLGEC5N3lDa6kms1YHmFBoRhTpJR6HG8wWk0td1MVCu9cD4YBrvjZEtd5Obw0Fbnw==", - "dev": true, - "requires": { - "sparse-bitfield": "^3.0.3" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - }, - "dependencies": { - "@sinonjs/commons": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz", - "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - } - } - }, - "@sinonjs/samsam": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz", - "integrity": "sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==", - "dev": true, - "requires": { - "@sinonjs/commons": "^2.0.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", - "dev": true - }, - "@smithy/abort-controller": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.1.1.tgz", - "integrity": "sha512-1+qdrUqLhaALYL0iOcN43EP6yAXXQ2wWZ6taf4S2pNGowmOc5gx+iMQv+E42JizNJjB0+gEadOXeV1Bf7JWL1Q==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@smithy/config-resolver": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.1.1.tgz", - "integrity": "sha512-lxfLDpZm+AWAHPFZps5JfDoO9Ux1764fOgvRUBpHIO8HWHcSN1dkgsago1qLRVgm1BZ8RCm8cgv99QvtaOWIhw==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/node-config-provider": "^2.2.1", - "@smithy/types": "^2.9.1", - "@smithy/util-config-provider": "^2.2.1", - "@smithy/util-middleware": "^2.1.1", - "tslib": "^2.5.0" - } - }, - "@smithy/core": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.3.1.tgz", - "integrity": "sha512-tf+NIu9FkOh312b6M9G4D68is4Xr7qptzaZGZUREELF8ysE1yLKphqt7nsomjKZVwW7WE5pDDex9idowNGRQ/Q==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/middleware-endpoint": "^2.4.1", - "@smithy/middleware-retry": "^2.1.1", - "@smithy/middleware-serde": "^2.1.1", - "@smithy/protocol-http": "^3.1.1", - "@smithy/smithy-client": "^2.3.1", - "@smithy/types": "^2.9.1", - "@smithy/util-middleware": "^2.1.1", - "tslib": "^2.5.0" - } - }, - "@smithy/credential-provider-imds": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.2.1.tgz", - "integrity": "sha512-7XHjZUxmZYnONheVQL7j5zvZXga+EWNgwEAP6OPZTi7l8J4JTeNh9aIOfE5fKHZ/ee2IeNOh54ZrSna+Vc6TFA==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/node-config-provider": "^2.2.1", - "@smithy/property-provider": "^2.1.1", - "@smithy/types": "^2.9.1", - "@smithy/url-parser": "^2.1.1", - "tslib": "^2.5.0" - } - }, - "@smithy/eventstream-codec": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.1.1.tgz", - "integrity": "sha512-E8KYBxBIuU4c+zrpR22VsVrOPoEDzk35bQR3E+xm4k6Pa6JqzkDOdMyf9Atac5GPNKHJBdVaQ4JtjdWX2rl/nw==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^2.9.1", - "@smithy/util-hex-encoding": "^2.1.1", - "tslib": "^2.5.0" - } - }, - "@smithy/fetch-http-handler": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.4.1.tgz", - "integrity": "sha512-VYGLinPsFqH68lxfRhjQaSkjXM7JysUOJDTNjHBuN/ykyRb2f1gyavN9+VhhPTWCy32L4yZ2fdhpCs/nStEicg==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/protocol-http": "^3.1.1", - "@smithy/querystring-builder": "^2.1.1", - "@smithy/types": "^2.9.1", - "@smithy/util-base64": "^2.1.1", - "tslib": "^2.5.0" - } - }, - "@smithy/hash-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.1.1.tgz", - "integrity": "sha512-Qhoq0N8f2OtCnvUpCf+g1vSyhYQrZjhSwvJ9qvR8BUGOtTXiyv2x1OD2e6jVGmlpC4E4ax1USHoyGfV9JFsACg==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/types": "^2.9.1", - "@smithy/util-buffer-from": "^2.1.1", - "@smithy/util-utf8": "^2.1.1", - "tslib": "^2.5.0" - } - }, - "@smithy/invalid-dependency": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.1.1.tgz", - "integrity": "sha512-7WTgnKw+VPg8fxu2v9AlNOQ5yaz6RA54zOVB4f6vQuR0xFKd+RzlCpt0WidYTsye7F+FYDIaS/RnJW4pxjNInw==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@smithy/is-array-buffer": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.1.1.tgz", - "integrity": "sha512-xozSQrcUinPpNPNPds4S7z/FakDTh1MZWtRP/2vQtYB/u3HYrX2UXuZs+VhaKBd6Vc7g2XPr2ZtwGBNDN6fNKQ==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/middleware-content-length": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.1.1.tgz", - "integrity": "sha512-rSr9ezUl9qMgiJR0UVtVOGEZElMdGFyl8FzWEF5iEKTlcWxGr2wTqGfDwtH3LAB7h+FPkxqv4ZU4cpuCN9Kf/g==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/protocol-http": "^3.1.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@smithy/middleware-endpoint": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.4.1.tgz", - "integrity": "sha512-XPZTb1E2Oav60Ven3n2PFx+rX9EDsU/jSTA8VDamt7FXks67ekjPY/XrmmPDQaFJOTUHJNKjd8+kZxVO5Ael4Q==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/middleware-serde": "^2.1.1", - "@smithy/node-config-provider": "^2.2.1", - "@smithy/shared-ini-file-loader": "^2.3.1", - "@smithy/types": "^2.9.1", - "@smithy/url-parser": "^2.1.1", - "@smithy/util-middleware": "^2.1.1", - "tslib": "^2.5.0" - } - }, - "@smithy/middleware-retry": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.1.1.tgz", - "integrity": "sha512-eMIHOBTXro6JZ+WWzZWd/8fS8ht5nS5KDQjzhNMHNRcG5FkNTqcKpYhw7TETMYzbLfhO5FYghHy1vqDWM4FLDA==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/node-config-provider": "^2.2.1", - "@smithy/protocol-http": "^3.1.1", - "@smithy/service-error-classification": "^2.1.1", - "@smithy/smithy-client": "^2.3.1", - "@smithy/types": "^2.9.1", - "@smithy/util-middleware": "^2.1.1", - "@smithy/util-retry": "^2.1.1", - "tslib": "^2.5.0", - "uuid": "^8.3.2" - } - }, - "@smithy/middleware-serde": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.1.1.tgz", - "integrity": "sha512-D8Gq0aQBeE1pxf3cjWVkRr2W54t+cdM2zx78tNrVhqrDykRA7asq8yVJij1u5NDtKzKqzBSPYh7iW0svUKg76g==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@smithy/middleware-stack": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.1.1.tgz", - "integrity": "sha512-KPJhRlhsl8CjgGXK/DoDcrFGfAqoqvuwlbxy+uOO4g2Azn1dhH+GVfC3RAp+6PoL5PWPb+vt6Z23FP+Mr6qeCw==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@smithy/node-config-provider": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.2.1.tgz", - "integrity": "sha512-epzK3x1xNxA9oJgHQ5nz+2j6DsJKdHfieb+YgJ7ATWxzNcB7Hc+Uya2TUck5MicOPhDV8HZImND7ZOecVr+OWg==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/property-provider": "^2.1.1", - "@smithy/shared-ini-file-loader": "^2.3.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@smithy/node-http-handler": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.3.1.tgz", - "integrity": "sha512-gLA8qK2nL9J0Rk/WEZSvgin4AppvuCYRYg61dcUo/uKxvMZsMInL5I5ZdJTogOvdfVug3N2dgI5ffcUfS4S9PA==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/abort-controller": "^2.1.1", - "@smithy/protocol-http": "^3.1.1", - "@smithy/querystring-builder": "^2.1.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@smithy/property-provider": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.1.1.tgz", - "integrity": "sha512-FX7JhhD/o5HwSwg6GLK9zxrMUrGnb3PzNBrcthqHKBc3dH0UfgEAU24xnJ8F0uow5mj17UeBEOI6o3CF2k7Mhw==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@smithy/protocol-http": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.1.1.tgz", - "integrity": "sha512-6ZRTSsaXuSL9++qEwH851hJjUA0OgXdQFCs+VDw4tGH256jQ3TjYY/i34N4vd24RV3nrjNsgd1yhb57uMoKbzQ==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@smithy/querystring-builder": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.1.1.tgz", - "integrity": "sha512-C/ko/CeEa8jdYE4gt6nHO5XDrlSJ3vdCG0ZAc6nD5ZIE7LBp0jCx4qoqp7eoutBu7VrGMXERSRoPqwi1WjCPbg==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/types": "^2.9.1", - "@smithy/util-uri-escape": "^2.1.1", - "tslib": "^2.5.0" - } - }, - "@smithy/querystring-parser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.1.1.tgz", - "integrity": "sha512-H4+6jKGVhG1W4CIxfBaSsbm98lOO88tpDWmZLgkJpt8Zkk/+uG0FmmqMuCAc3HNM2ZDV+JbErxr0l5BcuIf/XQ==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@smithy/service-error-classification": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.1.1.tgz", - "integrity": "sha512-txEdZxPUgM1PwGvDvHzqhXisrc5LlRWYCf2yyHfvITWioAKat7srQvpjMAvgzf0t6t7j8yHrryXU9xt7RZqFpw==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/types": "^2.9.1" - } - }, - "@smithy/shared-ini-file-loader": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.3.1.tgz", - "integrity": "sha512-2E2kh24igmIznHLB6H05Na4OgIEilRu0oQpYXo3LCNRrawHAcfDKq9004zJs+sAMt2X5AbY87CUCJ7IpqpSgdw==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@smithy/signature-v4": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.1.1.tgz", - "integrity": "sha512-Hb7xub0NHuvvQD3YwDSdanBmYukoEkhqBjqoxo+bSdC0ryV9cTfgmNjuAQhTPYB6yeU7hTR+sPRiFMlxqv6kmg==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/eventstream-codec": "^2.1.1", - "@smithy/is-array-buffer": "^2.1.1", - "@smithy/types": "^2.9.1", - "@smithy/util-hex-encoding": "^2.1.1", - "@smithy/util-middleware": "^2.1.1", - "@smithy/util-uri-escape": "^2.1.1", - "@smithy/util-utf8": "^2.1.1", - "tslib": "^2.5.0" - } - }, - "@smithy/smithy-client": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.3.1.tgz", - "integrity": "sha512-YsTdU8xVD64r2pLEwmltrNvZV6XIAC50LN6ivDopdt+YiF/jGH6PY9zUOu0CXD/d8GMB8gbhnpPsdrjAXHS9QA==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/middleware-endpoint": "^2.4.1", - "@smithy/middleware-stack": "^2.1.1", - "@smithy/protocol-http": "^3.1.1", - "@smithy/types": "^2.9.1", - "@smithy/util-stream": "^2.1.1", - "tslib": "^2.5.0" - } - }, - "@smithy/types": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.9.1.tgz", - "integrity": "sha512-vjXlKNXyprDYDuJ7UW5iobdmyDm6g8dDG+BFUncAg/3XJaN45Gy5RWWWUVgrzIK7S4R1KWgIX5LeJcfvSI24bw==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/url-parser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.1.1.tgz", - "integrity": "sha512-qC9Bv8f/vvFIEkHsiNrUKYNl8uKQnn4BdhXl7VzQRP774AwIjiSMMwkbT+L7Fk8W8rzYVifzJNYxv1HwvfBo3Q==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/querystring-parser": "^2.1.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@smithy/util-base64": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.1.1.tgz", - "integrity": "sha512-UfHVpY7qfF/MrgndI5PexSKVTxSZIdz9InghTFa49QOvuu9I52zLPLUHXvHpNuMb1iD2vmc6R+zbv/bdMipR/g==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/util-buffer-from": "^2.1.1", - "tslib": "^2.5.0" - } - }, - "@smithy/util-body-length-browser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.1.1.tgz", - "integrity": "sha512-ekOGBLvs1VS2d1zM2ER4JEeBWAvIOUKeaFch29UjjJsxmZ/f0L3K3x0dEETgh3Q9bkZNHgT+rkdl/J/VUqSRag==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/util-body-length-node": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.2.1.tgz", - "integrity": "sha512-/ggJG+ta3IDtpNVq4ktmEUtOkH1LW64RHB5B0hcr5ZaWBmo96UX2cIOVbjCqqDickTXqBWZ4ZO0APuaPrD7Abg==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/util-buffer-from": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.1.1.tgz", - "integrity": "sha512-clhNjbyfqIv9Md2Mg6FffGVrJxw7bgK7s3Iax36xnfVj6cg0fUG7I4RH0XgXJF8bxi+saY5HR21g2UPKSxVCXg==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/is-array-buffer": "^2.1.1", - "tslib": "^2.5.0" - } - }, - "@smithy/util-config-provider": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.2.1.tgz", - "integrity": "sha512-50VL/tx9oYYcjJn/qKqNy7sCtpD0+s8XEBamIFo4mFFTclKMNp+rsnymD796uybjiIquB7VCB/DeafduL0y2kw==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/util-defaults-mode-browser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.1.1.tgz", - "integrity": "sha512-lqLz/9aWRO6mosnXkArtRuQqqZBhNpgI65YDpww4rVQBuUT7qzKbDLG5AmnQTCiU4rOquaZO/Kt0J7q9Uic7MA==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/property-provider": "^2.1.1", - "@smithy/smithy-client": "^2.3.1", - "@smithy/types": "^2.9.1", - "bowser": "^2.11.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-defaults-mode-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.1.1.tgz", - "integrity": "sha512-tYVrc+w+jSBfBd267KDnvSGOh4NMz+wVH7v4CClDbkdPfnjvImBZsOURncT5jsFwR9KCuDyPoSZq4Pa6+eCUrA==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/config-resolver": "^2.1.1", - "@smithy/credential-provider-imds": "^2.2.1", - "@smithy/node-config-provider": "^2.2.1", - "@smithy/property-provider": "^2.1.1", - "@smithy/smithy-client": "^2.3.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@smithy/util-endpoints": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.1.1.tgz", - "integrity": "sha512-sI4d9rjoaekSGEtq3xSb2nMjHMx8QXcz2cexnVyRWsy4yQ9z3kbDpX+7fN0jnbdOp0b3KSTZJZ2Yb92JWSanLw==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/node-config-provider": "^2.2.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@smithy/util-hex-encoding": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.1.1.tgz", - "integrity": "sha512-3UNdP2pkYUUBGEXzQI9ODTDK+Tcu1BlCyDBaRHwyxhA+8xLP8agEKQq4MGmpjqb4VQAjq9TwlCQX0kP6XDKYLg==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/util-middleware": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.1.1.tgz", - "integrity": "sha512-mKNrk8oz5zqkNcbcgAAepeJbmfUW6ogrT2Z2gDbIUzVzNAHKJQTYmH9jcy0jbWb+m7ubrvXKb6uMjkSgAqqsFA==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@smithy/util-retry": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.1.1.tgz", - "integrity": "sha512-Mg+xxWPTeSPrthpC5WAamJ6PW4Kbo01Fm7lWM1jmGRvmrRdsd3192Gz2fBXAMURyXpaNxyZf6Hr/nQ4q70oVEA==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/service-error-classification": "^2.1.1", - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - } - }, - "@smithy/util-stream": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.1.1.tgz", - "integrity": "sha512-J7SMIpUYvU4DQN55KmBtvaMc7NM3CZ2iWICdcgaovtLzseVhAqFRYqloT3mh0esrFw+3VEK6nQFteFsTqZSECQ==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/fetch-http-handler": "^2.4.1", - "@smithy/node-http-handler": "^2.3.1", - "@smithy/types": "^2.9.1", - "@smithy/util-base64": "^2.1.1", - "@smithy/util-buffer-from": "^2.1.1", - "@smithy/util-hex-encoding": "^2.1.1", - "@smithy/util-utf8": "^2.1.1", - "tslib": "^2.5.0" - } - }, - "@smithy/util-uri-escape": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.1.1.tgz", - "integrity": "sha512-saVzI1h6iRBUVSqtnlOnc9ssU09ypo7n+shdQ8hBTZno/9rZ3AuRYvoHInV57VF7Qn7B+pFJG7qTzFiHxWlWBw==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/util-utf8": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.1.1.tgz", - "integrity": "sha512-BqTpzYEcUMDwAKr7/mVRUtHDhs6ZoXDi9NypMvMfOr/+u1NW7JgqodPDECiiLboEm6bobcPcECxzjtQh865e9A==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@smithy/util-buffer-from": "^2.1.1", - "tslib": "^2.5.0" - } - }, - "@types/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", - "dev": true - }, - "@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", - "dev": true, - "requires": { - "@types/ms": "*" - } - }, - "@types/human-interval": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/human-interval/-/human-interval-1.0.0.tgz", - "integrity": "sha512-ud7H6R7y58RpOFcJPhmuCacUAaE5Tpkhhm1gwx3vaaAiVEvqalvG/yaG6K0+yPaSEorkI/HGKp0/H3xirxJ4Tg==", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "@types/luxon": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.1.0.tgz", - "integrity": "sha512-gCd/HcCgjqSxfMrgtqxCgYk/22NBQfypwFUG7ZAyG/4pqs51WLTcUzVp1hqTbieDYeHS3WoVEh2Yv/2l+7B0Vg==", - "dev": true - }, - "@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "@types/mocha": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", - "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", - "dev": true - }, - "@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", - "dev": true - }, - "@types/node": { - "version": "18.11.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.12.tgz", - "integrity": "sha512-FgD3NtTAKvyMmD44T07zz2fEf+OKwutgBCEVM8GcvMGVGaDktiLNTDvPwC/LUe3PinMW+X6CuLOF2Ui1mAlSXg==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", - "dev": true - }, - "@types/sinon": { - "version": "10.0.13", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.13.tgz", - "integrity": "sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ==", - "dev": true, - "requires": { - "@types/sinonjs__fake-timers": "*" - } - }, - "@types/sinonjs__fake-timers": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", - "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", - "dev": true - }, - "@types/webidl-conversions": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", - "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", - "dev": true - }, - "@types/whatwg-url": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", - "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/webidl-conversions": "*" - } - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.43.0.tgz", - "integrity": "sha512-wNPzG+eDR6+hhW4yobEmpR36jrqqQv1vxBq5LJO3fBAktjkvekfr4BRl+3Fn1CM/A+s8/EiGUbOMDoYqWdbtXA==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.43.0", - "@typescript-eslint/type-utils": "5.43.0", - "@typescript-eslint/utils": "5.43.0", - "debug": "^4.3.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.43.0.tgz", - "integrity": "sha512-2iHUK2Lh7PwNUlhFxxLI2haSDNyXvebBO9izhjhMoDC+S3XI9qt2DGFUsiJ89m2k7gGYch2aEpYqV5F/+nwZug==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.43.0", - "@typescript-eslint/types": "5.43.0", - "@typescript-eslint/typescript-estree": "5.43.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.43.0.tgz", - "integrity": "sha512-XNWnGaqAtTJsUiZaoiGIrdJYHsUOd3BZ3Qj5zKp9w6km6HsrjPk/TGZv0qMTWyWj0+1QOqpHQ2gZOLXaGA9Ekw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.43.0", - "@typescript-eslint/visitor-keys": "5.43.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.43.0.tgz", - "integrity": "sha512-K21f+KY2/VvYggLf5Pk4tgBOPs2otTaIHy2zjclo7UZGLyFH86VfUOm5iq+OtDtxq/Zwu2I3ujDBykVW4Xtmtg==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "5.43.0", - "@typescript-eslint/utils": "5.43.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.43.0.tgz", - "integrity": "sha512-jpsbcD0x6AUvV7tyOlyvon0aUsQpF8W+7TpJntfCUWU1qaIKu2K34pMwQKSzQH8ORgUrGYY6pVIh1Pi8TNeteg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.43.0.tgz", - "integrity": "sha512-BZ1WVe+QQ+igWal2tDbNg1j2HWUkAa+CVqdU79L4HP9izQY6CNhXfkNwd1SS4+sSZAP/EthI1uiCSY/+H0pROg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.43.0", - "@typescript-eslint/visitor-keys": "5.43.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.43.0.tgz", - "integrity": "sha512-8nVpA6yX0sCjf7v/NDfeaOlyaIIqL7OaIGOWSPFqUKK59Gnumd3Wa+2l8oAaYO2lk0sO+SbWFWRSvhu8gLGv4A==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.43.0", - "@typescript-eslint/types": "5.43.0", - "@typescript-eslint/typescript-estree": "5.43.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", - "semver": "^7.3.7" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.43.0.tgz", - "integrity": "sha512-icl1jNH/d18OVHLfcwdL3bWUKsBeIiKYTGxMJCoGe7xFht+E4QgzOqoWYrU8XSLJWhVw8nTacbm03v23J/hFTg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.43.0", - "eslint-visitor-keys": "^3.3.0" - } - }, - "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "add-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", - "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", - "dev": true - }, - "agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dev": true, - "requires": { - "debug": "^4.3.4" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "requires": { - "default-require-extensions": "^3.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - } - }, - "array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true - }, - "array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" - } - }, - "array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - } - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", - "dev": true - }, - "async-mutex": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.4.1.tgz", - "integrity": "sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA==", - "dev": true, - "requires": { - "tslib": "^2.4.0" - } - }, - "axe-core": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.5.2.tgz", - "integrity": "sha512-u2MVsXfew5HBvjsczCv+xlwdNnB1oQR9HlAcsejZttNjKKSkeDNVwB1vMThIUIFI9GoT57Vtk8iQLwqOfAkboA==", - "dev": true - }, - "axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", - "dev": true - }, - "b4a": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", - "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", - "dev": true, - "optional": true, - "peer": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - } - }, - "bson": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz", - "integrity": "sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q==", - "dev": true - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true - }, - "caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "requires": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } - } - }, - "caniuse-lite": { - "version": "1.0.30001317", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001317.tgz", - "integrity": "sha512-xIZLh8gBm4dqNX0gkzrBeyI86J2eCjWzYAs40q88smG844YIrN4tVQl/RhquHvKEKImWWFIVh1Lxe5n1G/N+GQ==", - "dev": true - }, - "chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "ci-info": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.6.1.tgz", - "integrity": "sha512-up5ggbaDqOqJ4UqLKZ2naVkyqSJQgJi5lwD6b6mM748ysrghDBX0bx/qJTUHzw7zu6Mq4gycviSF5hJnwceD8w==", - "dev": true - }, - "clean-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", - "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - } - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "requires": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true - }, - "conventional-changelog": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.25.tgz", - "integrity": "sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==", - "dev": true, - "requires": { - "conventional-changelog-angular": "^5.0.12", - "conventional-changelog-atom": "^2.0.8", - "conventional-changelog-codemirror": "^2.0.8", - "conventional-changelog-conventionalcommits": "^4.5.0", - "conventional-changelog-core": "^4.2.1", - "conventional-changelog-ember": "^2.0.9", - "conventional-changelog-eslint": "^3.0.9", - "conventional-changelog-express": "^2.0.6", - "conventional-changelog-jquery": "^3.0.11", - "conventional-changelog-jshint": "^2.0.9", - "conventional-changelog-preset-loader": "^2.3.4" - } - }, - "conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", - "dev": true, - "requires": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - } - }, - "conventional-changelog-atom": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", - "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==", - "dev": true, - "requires": { - "q": "^1.5.1" - } - }, - "conventional-changelog-codemirror": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", - "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==", - "dev": true, - "requires": { - "q": "^1.5.1" - } - }, - "conventional-changelog-config-spec": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.1.0.tgz", - "integrity": "sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==", - "dev": true - }, - "conventional-changelog-conventionalcommits": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz", - "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==", - "dev": true, - "requires": { - "compare-func": "^2.0.0", - "lodash": "^4.17.15", - "q": "^1.5.1" - } - }, - "conventional-changelog-core": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", - "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", - "dev": true, - "requires": { - "add-stream": "^1.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-parser": "^3.2.0", - "dateformat": "^3.0.0", - "get-pkg-repo": "^4.0.0", - "git-raw-commits": "^2.0.8", - "git-remote-origin-url": "^2.0.0", - "git-semver-tags": "^4.1.1", - "lodash": "^4.17.15", - "normalize-package-data": "^3.0.0", - "q": "^1.5.1", - "read-pkg": "^3.0.0", - "read-pkg-up": "^3.0.0", - "through2": "^4.0.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - } - } - }, - "conventional-changelog-ember": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", - "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", - "dev": true, - "requires": { - "q": "^1.5.1" - } - }, - "conventional-changelog-eslint": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", - "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", - "dev": true, - "requires": { - "q": "^1.5.1" - } - }, - "conventional-changelog-express": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", - "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", - "dev": true, - "requires": { - "q": "^1.5.1" - } - }, - "conventional-changelog-jquery": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", - "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", - "dev": true, - "requires": { - "q": "^1.5.1" - } - }, - "conventional-changelog-jshint": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", - "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", - "dev": true, - "requires": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - } - }, - "conventional-changelog-preset-loader": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", - "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", - "dev": true - }, - "conventional-changelog-writer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", - "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", - "dev": true, - "requires": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", - "dev": true, - "requires": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - } - }, - "conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", - "dev": true, - "requires": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - } - }, - "conventional-recommended-bump": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", - "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", - "dev": true, - "requires": { - "concat-stream": "^2.0.0", - "conventional-changelog-preset-loader": "^2.3.4", - "conventional-commits-filter": "^2.0.7", - "conventional-commits-parser": "^3.2.0", - "git-raw-commits": "^2.0.8", - "git-semver-tags": "^4.1.1", - "meow": "^8.0.0", - "q": "^1.5.1" - } - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "core-js-pure": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.1.tgz", - "integrity": "sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ==", - "dev": true - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "cron-parser": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.5.0.tgz", - "integrity": "sha512-QHdeh3zLWz6YvYTFKpRb860rJlip16pEinbxXT1i2NZB/nOxBjd2RbSv54sn5UrAj9WykiSLYWWDgo8azQK0HA==", - "requires": { - "luxon": "^2.4.0" - }, - "dependencies": { - "luxon": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.5.2.tgz", - "integrity": "sha512-Yg7/RDp4nedqmLgyH0LwgGRvMEKVzKbUdkBYyCosbHgJ+kaOUx0qzSiSatVc3DFygnirTPYnMM2P5dg2uH1WvA==" - } - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", - "dev": true - }, - "date.js": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/date.js/-/date.js-0.3.3.tgz", - "integrity": "sha512-HgigOS3h3k6HnW011nAb43c5xx5rBXk8P2v/WIT9Zv4koIaVXiH2BURguI78VVp+5Qc076T7OR378JViCnZtBw==", - "requires": { - "debug": "~3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, - "deep-eql": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.2.tgz", - "integrity": "sha512-gT18+YW4CcW/DBNTwAmqTtkJh7f9qqScu2qFVlx7kCoeY9tlBu9cUcr7+I+Z/noG8INehS3xQgLpTtd/QUTn4w==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "default-require-extensions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", - "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", - "dev": true, - "requires": { - "strip-bom": "^4.0.0" - } - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "delay": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/delay/-/delay-6.0.0.tgz", - "integrity": "sha512-2NJozoOHQ4NuZuVIr5CWd0iiLVIRSDepakaovIN+9eIDHEhdCAEvSy2cuf1DCrPPQLvHmbqTHODlhHg8UCy4zw==", - "dev": true - }, - "detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "dotgitignore": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-2.1.0.tgz", - "integrity": "sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "minimatch": "^3.0.4" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - } - } - }, - "electron-to-chromium": { - "version": "1.4.88", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.88.tgz", - "integrity": "sha512-oA7mzccefkvTNi9u7DXmT0LqvhnOiN2BhSrKerta7HeUC1cLoIwtbf2wL+Ah2ozh5KQd3/1njrGrwDBXx6d14Q==", - "dev": true - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - } - }, - "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", - "dev": true, - "requires": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", - "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.15.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - } - } - }, - "eslint-config-airbnb-base": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", - "dev": true, - "requires": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "eslint-config-airbnb-typescript": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.0.0.tgz", - "integrity": "sha512-elNiuzD0kPAPTXjFWg+lE24nMdHMtuxgYoD30OyMD6yrW1AhFZPAg27VX7d3tzOErw+dgJTNWfRSDqEcXb4V0g==", - "dev": true, - "requires": { - "eslint-config-airbnb-base": "^15.0.0" - } - }, - "eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true, - "requires": {} - }, - "eslint-import-resolver-alias": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-alias/-/eslint-import-resolver-alias-1.1.2.tgz", - "integrity": "sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w==", - "dev": true, - "requires": {} - }, - "eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-import-resolver-typescript": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz", - "integrity": "sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==", - "dev": true, - "requires": { - "debug": "^4.3.4", - "glob": "^7.2.0", - "is-glob": "^4.0.3", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - } - }, - "eslint-module-utils": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", - "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "find-up": "^2.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-es": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", - "dev": true, - "requires": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "dependencies": { - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", - "dev": true, - "requires": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-plugin-jsx-a11y": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz", - "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==", - "dev": true, - "requires": { - "@babel/runtime": "^7.18.9", - "aria-query": "^4.2.2", - "array-includes": "^3.1.5", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.4.3", - "axobject-query": "^2.2.0", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.2", - "language-tags": "^1.0.5", - "minimatch": "^3.1.2", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "eslint-plugin-mocha": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.1.0.tgz", - "integrity": "sha512-xLqqWUF17llsogVOC+8C6/jvQ+4IoOREbN7ZCHuOHuD6cT5cDD4h7f2LgsZuzMAiwswWE21tO7ExaknHVDrSkw==", - "dev": true, - "requires": { - "eslint-utils": "^3.0.0", - "rambda": "^7.1.0" - } - }, - "eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", - "dev": true, - "requires": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "dependencies": { - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "eslint-plugin-react": { - "version": "7.31.10", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz", - "integrity": "sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==", - "dev": true, - "requires": { - "array-includes": "^3.1.5", - "array.prototype.flatmap": "^1.3.0", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.5", - "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.1", - "object.values": "^1.1.5", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.3", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.7" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "eslint-plugin-unicorn": { - "version": "44.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-44.0.2.tgz", - "integrity": "sha512-GLIDX1wmeEqpGaKcnMcqRvMVsoabeF0Ton0EX4Th5u6Kmf7RM9WBl705AXFEsns56ESkEs0uyelLuUTvz9Tr0w==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.19.1", - "ci-info": "^3.4.0", - "clean-regexp": "^1.0.0", - "eslint-utils": "^3.0.0", - "esquery": "^1.4.0", - "indent-string": "^4.0.0", - "is-builtin-module": "^3.2.0", - "lodash": "^4.17.21", - "pluralize": "^8.0.0", - "read-pkg-up": "^7.0.1", - "regexp-tree": "^0.1.24", - "safe-regex": "^2.1.1", - "semver": "^7.3.7", - "strip-indent": "^3.0.0" - } - }, - "eslint-plugin-you-dont-need-lodash-underscore": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-you-dont-need-lodash-underscore/-/eslint-plugin-you-dont-need-lodash-underscore-6.12.0.tgz", - "integrity": "sha512-WF4mNp+k2532iswT6iUd1BX6qjd3AV4cFy/09VC82GY9SsRtvkxhUIx7JNGSe0/bLyd57oTr4inPFiIaENXhGw==", - "dev": true, - "requires": { - "kebab-case": "^1.0.0" - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "dependencies": { - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fast-xml-parser": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", - "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "strnum": "^1.0.5" - } - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - } - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", - "dev": true - }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - } - }, - "fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-pkg-repo": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", - "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", - "dev": true, - "requires": { - "@hutson/parse-repository-url": "^3.0.0", - "hosted-git-info": "^4.0.0", - "through2": "^2.0.0", - "yargs": "^16.2.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", - "dev": true, - "requires": { - "resolve-pkg-maps": "^1.0.0" - } - }, - "git-raw-commits": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", - "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", - "dev": true, - "requires": { - "dargs": "^7.0.0", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - } - }, - "git-remote-origin-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", - "dev": true, - "requires": { - "gitconfiglocal": "^1.0.0", - "pify": "^2.3.0" - } - }, - "git-semver-tags": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", - "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", - "dev": true, - "requires": { - "meow": "^8.0.0", - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "gitconfiglocal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", - "dev": true, - "requires": { - "ini": "^1.3.2" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", - "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", - "dev": true - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "https-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", - "dev": true, - "requires": { - "agent-base": "^7.0.2", - "debug": "4" - } - }, - "human-interval": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/human-interval/-/human-interval-2.0.1.tgz", - "integrity": "sha512-r4Aotzf+OtKIGQCB3odUowy4GfUDTy3aTWTfLd7ZF2gBCy3XW3v/dJLRefZnOFFnjqs5B1TypvS8WarpBkYUNQ==", - "requires": { - "numbered": "^1.1.0" - } - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-builtin-module": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", - "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", - "dev": true, - "requires": { - "builtin-modules": "^3.3.0" - } - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, - "is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", - "dev": true, - "requires": { - "text-extensions": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "requires": { - "append-transform": "^2.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "istanbul-lib-processinfo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", - "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.0", - "istanbul-lib-coverage": "^3.0.0-alpha.1", - "make-dir": "^3.0.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^3.3.3" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "js-sdsl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", - "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", - "dev": true, - "requires": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" - } - }, - "just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true - }, - "kebab-case": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/kebab-case/-/kebab-case-1.0.1.tgz", - "integrity": "sha512-txPHx6nVLhv8PHGXIlAk0nYoh894SpAqGPXNvbg2hh8spvHXIah3+vT87DLoa59nKgC6scD3u3xAuRIgiMqbfQ==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true - }, - "language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", - "dev": true, - "requires": { - "language-subtag-registry": "~0.3.2" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - } - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true - }, - "lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "loupe": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", - "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", - "dev": true, - "requires": { - "get-func-name": "^2.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, - "luxon": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", - "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==" - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true - }, - "marked": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.2.tgz", - "integrity": "sha512-JjBTFTAvuTgANXx82a5vzK9JLSMoV6V3LBVn4Uhdso6t7vXrGx7g1Cd2r6NYSsxrYbQGFCMqBDhFHyK5q2UvcQ==", - "dev": true - }, - "memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "dev": true - }, - "meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "dependencies": { - "hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - } - }, - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - } - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - } - }, - "mocha": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.1.0.tgz", - "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", - "dev": true, - "requires": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true - }, - "mongodb": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.3.0.tgz", - "integrity": "sha512-tt0KuGjGtLUhLoU263+xvQmPHEGTw5LbcNC73EoFRYgSHwZt5tsoJC110hDyO1kjQzpgNrpdcSza9PknWN4LrA==", - "dev": true, - "requires": { - "@mongodb-js/saslprep": "^1.1.0", - "bson": "^6.2.0", - "mongodb-connection-string-url": "^3.0.0" - }, - "dependencies": { - "@types/whatwg-url": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.4.tgz", - "integrity": "sha512-lXCmTWSHJvf0TRSO58nm978b8HJ/EdsSsEKLd3ODHFjo+3VGAyyTp4v50nWvwtzBxSMQrVOK7tcuN0zGPLICMw==", - "dev": true, - "requires": { - "@types/webidl-conversions": "*" - } - }, - "mongodb-connection-string-url": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.0.tgz", - "integrity": "sha512-t1Vf+m1I5hC2M5RJx/7AtxgABy1cZmIPQRMXw+gEIPn/cZNF3Oiy+l0UIypUwVB5trcWHq3crg2g3uAR9aAwsQ==", - "dev": true, - "requires": { - "@types/whatwg-url": "^11.0.2", - "whatwg-url": "^13.0.0" - } - }, - "tr46": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", - "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", - "dev": true, - "requires": { - "punycode": "^2.3.0" - } - }, - "whatwg-url": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", - "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", - "dev": true, - "requires": { - "tr46": "^4.1.1", - "webidl-conversions": "^7.0.0" - } - } - } - }, - "mongodb-connection-string-url": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", - "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", - "dev": true, - "requires": { - "@types/whatwg-url": "^8.2.1", - "whatwg-url": "^11.0.0" - } - }, - "mongodb-memory-server": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-9.1.6.tgz", - "integrity": "sha512-gzcpgGYlPhuKmria37W+bvYy6W+OkX2UVG7MoP41OWFvQv2Hn7A+fLXkV+lsMmhog1lMQprdV6AR+gixgheLaw==", - "dev": true, - "requires": { - "mongodb-memory-server-core": "9.1.6", - "tslib": "^2.6.2" - } - }, - "mongodb-memory-server-core": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-9.1.6.tgz", - "integrity": "sha512-3H/dq5II+XcSbK80hicMw4zFlDxcpjt4oWJq76RlOVuLoaf3AFqVheR6Vqx9ymlIqER4Jni58FMCIIRbesia1A==", - "dev": true, - "requires": { - "async-mutex": "^0.4.0", - "camelcase": "^6.3.0", - "debug": "^4.3.4", - "find-cache-dir": "^3.3.2", - "follow-redirects": "^1.15.3", - "https-proxy-agent": "^7.0.2", - "mongodb": "^5.9.1", - "new-find-package-json": "^2.0.0", - "semver": "^7.5.4", - "tar-stream": "^3.0.0", - "tslib": "^2.6.2", - "yauzl": "^2.10.0" - }, - "dependencies": { - "bson": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/bson/-/bson-5.5.1.tgz", - "integrity": "sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==", - "dev": true - }, - "mongodb": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.9.2.tgz", - "integrity": "sha512-H60HecKO4Bc+7dhOv4sJlgvenK4fQNqqUIlXxZYQNbfEWSALGAwGoyJd/0Qwk4TttFXUOHJ2ZJQe/52ScaUwtQ==", - "dev": true, - "requires": { - "@mongodb-js/saslprep": "^1.1.0", - "bson": "^5.5.0", - "mongodb-connection-string-url": "^2.6.0", - "socks": "^2.7.1" - } - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "new-find-package-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/new-find-package-json/-/new-find-package-json-2.0.0.tgz", - "integrity": "sha512-lDcBsjBSMlj3LXH2v/FW3txlh2pYTjmbOXPYJD93HI5EwuLzI11tdHSIpUMmfq/IOsldj4Ps8M8flhm+pCK4Ew==", - "dev": true, - "requires": { - "debug": "^4.3.4" - } - }, - "nise": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.2.tgz", - "integrity": "sha512-+gQjFi8v+tkfCuSCxfURHLhRhniE/+IaYbIphxAN2JRR9SHKhY8hgXpaXiYfHdw+gcGe4buxgbprBQFab9FkhA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "^7.0.4", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - }, - "dependencies": { - "@sinonjs/fake-timers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", - "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - }, - "dependencies": { - "@sinonjs/commons": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz", - "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - } - } - } - } - }, - "node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "requires": { - "process-on-spawn": "^1.0.0" - } - }, - "node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "numbered": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/numbered/-/numbered-1.1.0.tgz", - "integrity": "sha512-pv/ue2Odr7IfYOO0byC1KgBI10wo5YDauLhxY6/saNzAdAs0r1SotGCPzzCLNPL0xtrAwWRialLu23AAu9xO1g==" - }, - "nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "requires": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", - "dev": true, - "requires": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "requires": { - "isarray": "0.0.1" - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - } - } - }, - "pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz", - "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", - "dev": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "requires": { - "fromentries": "^1.2.0" - } - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", - "dev": true - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true - }, - "rambda": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/rambda/-/rambda-7.2.0.tgz", - "integrity": "sha512-xW2ZcQh+AtRHdIN0RUix+gAwyfAeMBZA6SnLSblw1+YRqUx+eV4Eppg/ayDdrvSs6KegZYHYtSF6+I86Z5Owqg==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "regenerator-runtime": { - "version": "0.13.10", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", - "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==", - "dev": true - }, - "regexp-tree": { - "version": "0.1.24", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", - "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", - "dev": true - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", - "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", - "dev": true, - "requires": { - "regexp-tree": "~0.1.1" - } - }, - "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shiki": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.11.1.tgz", - "integrity": "sha512-EugY9VASFuDqOexOgXR18ZV+TbFrQHeCpEYaXamO+SZlsnT/2LxuLBX25GGtIrwaEVFXUAbUQ601SWE2rMwWHA==", - "dev": true, - "requires": { - "jsonc-parser": "^3.0.0", - "vscode-oniguruma": "^1.6.1", - "vscode-textmate": "^6.0.0" - } - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "sinon": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.0.0.tgz", - "integrity": "sha512-pV97G1GbslaSJoSdy2F2z8uh5F+uPGp3ddOzA4JsBOUBLEQRz2OAqlKGRFTSh2KiqUCmHkzyAeu7R4x1Hx0wwg==", - "dev": true, - "requires": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "^9.1.2", - "@sinonjs/samsam": "^7.0.1", - "diff": "^5.0.0", - "nise": "^5.1.2", - "supports-color": "^7.2.0" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true - }, - "socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dev": true, - "requires": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - } - }, - "sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", - "dev": true, - "requires": { - "memory-pager": "^1.0.2" - } - }, - "spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "requires": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - } - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "dev": true - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "requires": { - "through": "2" - } - }, - "split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "requires": { - "readable-stream": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "standard-version": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-9.5.0.tgz", - "integrity": "sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "conventional-changelog": "3.1.25", - "conventional-changelog-config-spec": "2.1.0", - "conventional-changelog-conventionalcommits": "4.6.3", - "conventional-recommended-bump": "6.1.0", - "detect-indent": "^6.0.0", - "detect-newline": "^3.1.0", - "dotgitignore": "^2.1.0", - "figures": "^3.1.0", - "find-up": "^5.0.0", - "git-semver-tags": "^4.0.0", - "semver": "^7.1.1", - "stringify-package": "^1.0.1", - "yargs": "^16.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "streamx": { - "version": "2.15.6", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.6.tgz", - "integrity": "sha512-q+vQL4AAz+FdfT137VF69Cc/APqUbxy+MDOImRrMvchJpigHj9GksgDU2LYbO9rx7RX6osWgxJB2WxhYv4SZAw==", - "dev": true, - "requires": { - "fast-fifo": "^1.1.0", - "queue-tick": "^1.0.1" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - } - } - }, - "string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4" - } - }, - "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - } - }, - "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - } - }, - "stringify-package": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz", - "integrity": "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "dev": true, - "optional": true, - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "dev": true, - "requires": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "requires": { - "readable-stream": "3" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true - }, - "tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - } - } - }, - "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "tsx": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.0.tgz", - "integrity": "sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==", - "dev": true, - "requires": { - "esbuild": "~0.19.10", - "fsevents": "~2.3.3", - "get-tsconfig": "^4.7.2" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typedoc": { - "version": "0.23.21", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.21.tgz", - "integrity": "sha512-VNE9Jv7BgclvyH9moi2mluneSviD43dCE9pY8RWkO88/DrEgJZk9KpUk7WO468c9WWs/+aG6dOnoH7ccjnErhg==", - "dev": true, - "requires": { - "lunr": "^2.3.9", - "marked": "^4.0.19", - "minimatch": "^5.1.0", - "shiki": "^0.11.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "typescript": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", - "dev": true - }, - "uglify-js": { - "version": "3.16.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.16.3.tgz", - "integrity": "sha512-uVbFqx9vvLhQg0iBaau9Z75AxWJ8tqM9AV890dIZCLApF4rTcyHwmAvLeEdYRs+BzYWu8Iw81F79ah0EfTXbaw==", - "dev": true, - "optional": true - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "optional": true, - "peer": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vscode-oniguruma": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz", - "integrity": "sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA==", - "dev": true - }, - "vscode-textmate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-6.0.0.tgz", - "integrity": "sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ==", - "dev": true - }, - "webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true - }, - "whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dev": true, - "requires": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, - "workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "requires": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "dependencies": { - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - } - } - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } - } -} diff --git a/package.json b/package.json index f8d88d0..4733a9f 100644 --- a/package.json +++ b/package.json @@ -1,88 +1,75 @@ { - "name": "@whisthub/agenda", - "version": "0.0.0", - "type": "module", - "description": "Light weight job scheduler for Node.js", - "exports": "./dist/index.js", - "types": "dist/index.d.ts", - "publishConfig": { - "access": "public" - }, - "files": [ - "dist" - ], - "engines": { - "node": ">=18.0.0" - }, - "scripts": { - "release": "npm run build && standard-version", - "prepublishOnly": "npm run build", - "build": "tsc", - "test": "npm run mocha", - "lint": "eslint src", - "lint-fix": "eslint src --fix", - "mocha": "mocha --reporter spec -b", - "mocha-coverage": "nyc mocha --reporter spec -b", - "mocha-debug": "DEBUG=agenda:**,-agenda:internal:** mocha --reporter spec -b", - "mocha-debug-internal": "DEBUG=agenda:internal:** mocha --reporter spec -b", - "mocha-debug-all": "DEBUG=agenda:** mocha --reporter spec -b", - "docs": "typedoc --out docs/agenda/6.x src/index.ts" - }, - "config": { - "blanket": { - "pattern": "lib", - "data-cover-never": "node_modules" - } - }, - "repository": { - "type": "git", - "url": "git://github.com/whisthub/agenda" - }, - "keywords": [ - "job", - "jobs", - "cron", - "delayed", - "scheduler", - "runner" - ], - "author": "Sebastiaan Marynissen ", - "license": "MIT", - "bugs": { - "url": "https://github.com/whisthub/agenda/issues" - }, - "dependencies": { - "cron-parser": "^4", - "date.js": "~0.3.3", - "debug": "~4", - "human-interval": "~2", - "luxon": "^3" - }, - "peerDependencies": { - "mongodb": ">=4" - }, - "devDependencies": { - "@hokify/eslint-config": "^2.3.8", - "@istanbuljs/nyc-config-typescript": "^1.0.2", - "@types/chai": "^4.3.4", - "@types/debug": "^4.1.7", - "@types/human-interval": "^1.0.0", - "@types/luxon": "^3.1.0", - "@types/mocha": "^10.0.1", - "@types/node": "^18.11.12", - "@types/sinon": "^10.0.13", - "chai": "^4.3.7", - "delay": "^6.0.0", - "eslint": "^8.29.0", - "mocha": "10.1.0", - "mongodb": "^6.3.0", - "mongodb-memory-server": "^9.1.6", - "nyc": "^15.1.0", - "prettier": "^2.8.1", - "sinon": "15.0.0", - "standard-version": "^9.5.0", - "tsx": "^4.7.0", - "typedoc": "^0.23.21", - "typescript": "^4.9.4" - } + "name": "@lesjoursfr/agenda", + "version": "0.0.0", + "description": "Light weight job scheduler for Node.js", + "license": "MIT", + "repository": "lesjoursfr/agenda", + "homepage": "https://github.com/lesjoursfr/audio-waveform#readme", + "bugs": { + "url": "https://github.com/lesjoursfr/audio-waveform/issues" + }, + "publishConfig": { + "access": "public" + }, + "engines": { + "node": "20.x || 22.x" + }, + "keywords": [ + "job", + "jobs", + "cron", + "delayed", + "scheduler", + "runner" + ], + "main": "./lib/index.js", + "types": "./lib/index.d.ts", + "files": [ + "lib/**/*", + "src/**/*" + ], + "scripts": { + "freshlock": "rm -rf node_modules/ && rm .yarn/install-state.gz && rm yarn.lock && yarn", + "check-lint": "eslint", + "check-format": "prettier --check .", + "check-tsc": "tsc --noEmit", + "lint": "eslint --fix", + "format": "prettier --write .", + "build": "tsc -p tsconfig.build.json", + "test": "mocha", + "typedoc": "typedoc src/index.ts --out ./docs && prettier --write ./docs --ignore-path .gitignore" + }, + "dependencies": { + "@lesjoursfr/date": "^1.0.0", + "@lesjoursfr/human-interval": "^1.0.0", + "cron-parser": "^4.9.0", + "debug": "^4.3.7", + "luxon": "^3.5.0" + }, + "peerDependencies": { + "mongodb": ">=6" + }, + "devDependencies": { + "@eslint/js": "^9.13.0", + "@tsconfig/node20": "^20.1.4", + "@types/debug": "^4.1.12", + "@types/human-interval": "^1.0.2", + "@types/luxon": "^3.4.2", + "@types/mocha": "^10.0.9", + "@types/node": "^22.8.5", + "@types/sinon": "^17.0.3", + "eslint": "^9.13.0", + "eslint-config-prettier": "^9.1.0", + "globals": "^15.11.0", + "mocha": "^10.7.3", + "mongodb": "^6.10.0", + "mongodb-memory-server": "^10.1.2", + "prettier": "^3.3.3", + "sinon": "^19.0.2", + "ts-node": "^10.9.2", + "typedoc": "^0.26.10", + "typescript": "^5.6.3", + "typescript-eslint": "^8.12.2" + }, + "packageManager": "yarn@4.5.1" } diff --git a/prettier.config.mjs b/prettier.config.mjs new file mode 100644 index 0000000..6d51fcf --- /dev/null +++ b/prettier.config.mjs @@ -0,0 +1,20 @@ +const config = { + printWidth: 120, + trailingComma: "es5", + overrides: [ + { + files: ["eslint.config.mjs", "prettier.config.mjs", "*.json", "*.md"], + options: { + printWidth: 80, + }, + }, + { + files: ["tsconfig.json"], + options: { + trailingComma: "none", + }, + }, + ], +}; + +export default config; diff --git a/README.md b/readme.md similarity index 77% rename from README.md rename to readme.md index 6cae553..3b6daeb 100644 --- a/README.md +++ b/readme.md @@ -2,14 +2,14 @@ I forked it from https://github.com/hokify/agenda because I desperately needed support for [mongodb@6](https://www.npmjs.com/package/mongodb) for my website www.whisthub.com. Ideally this gets merged back eventually into [@hokify/agenda](https://github.com/hokify/agenda), or even better in [agenda/agenda](https://github.com/agenda/agenda). -However, I *do* intend to keep this up to date with the latest version of the [mongodb](https://www.npmjs.com/package/mongodb) package, but that's all. +However, I _do_ intend to keep this up to date with the latest version of the [mongodb](https://www.npmjs.com/package/mongodb) package, but that's all. Agenda is a great library and I would hate to see it dying because new mongodb versions are not supported. -Key differences with the [original repo](https://github.com/hokify/agenda) are: +Key differences with the [original repo](https://github.com/hokify/agenda) are: - - MongoDB is now a peer dependency, so it must be installed separately. - - The module is now [esm only](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c). This is to prepare for any of the dependencies - most notably `mongodb` - becoming esm-only one day too. It also helps push the ecosystem forward. - - The library is only tested against `mongodb@6`, but it should work for version 5 and even 4. +- MongoDB is now a peer dependency, so it must be installed separately. +- The module is now [esm only](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c). This is to prepare for any of the dependencies - most notably `mongodb` - becoming esm-only one day too. It also helps push the ecosystem forward. +- The library is only tested against `mongodb@6`, but it should work for version 5 and even 4. # Agenda @@ -23,17 +23,17 @@ Key differences with the [original repo](https://github.com/hokify/agenda) are: This was originally a fork of agenda.js, it differs from the original version in following points: -- Complete rewrite in Typescript (fully typed!) -- [mongodb@6](https://www.npmjs.com/package/mongodb) driver (supports mongodb 5.x and mongodb 4.x too) -- Supports mongoDB sharding by name -- touch() can have an optional progress parameter (0-100) -- Bugfixes and improvements for locking & job processing (concurrency, lockLimit,..) -- Breaking change: define() config paramter moved from 2nd position to 3rd -- getRunningStats() -- automatically waits for agenda to be connected before calling any database operations -- uses a database abstraction layer behind the scene -- does not create a database index by default, you can set `ensureIndex: true` when initializing Agenda - or run manually: +- Complete rewrite in Typescript (fully typed!) +- [mongodb@6](https://www.npmjs.com/package/mongodb) driver (supports mongodb 5.x and mongodb 4.x too) +- Supports mongoDB sharding by name +- touch() can have an optional progress parameter (0-100) +- Bugfixes and improvements for locking & job processing (concurrency, lockLimit,..) +- Breaking change: define() config paramter moved from 2nd position to 3rd +- getRunningStats() +- automatically waits for agenda to be connected before calling any database operations +- uses a database abstraction layer behind the scene +- does not create a database index by default, you can set `ensureIndex: true` when initializing Agenda + or run manually: ``` db.agendaJobs.ensureIndex({ @@ -47,15 +47,15 @@ db.agendaJobs.ensureIndex({ # Agenda offers -- Minimal overhead. Agenda aims to keep its code base small. -- Mongo backed persistence layer. -- Promises based API. -- Scheduling with configurable priority, concurrency, and repeating. -- Scheduling via cron or human readable syntax. -- Event backed job queue that you can hook into. -- [Agendash](https://github.com/agenda/agendash): optional standalone web-interface. -- [Agenda-rest](https://github.com/agenda/agenda-rest): optional standalone REST API. -- [inversify-agenda](https://github.com/lautarobock/inversify-agenda) - Some utilities for the development of agenda workers with Inversify +- Minimal overhead. Agenda aims to keep its code base small. +- Mongo backed persistence layer. +- Promises based API. +- Scheduling with configurable priority, concurrency, and repeating. +- Scheduling via cron or human readable syntax. +- Event backed job queue that you can hook into. +- [Agendash](https://github.com/agenda/agendash): optional standalone web-interface. +- [Agenda-rest](https://github.com/agenda/agenda-rest): optional standalone REST API. +- [inversify-agenda](https://github.com/lautarobock/inversify-agenda) - Some utilities for the development of agenda workers with Inversify ### Feature Comparison @@ -94,7 +94,7 @@ You will also need a working [Mongo](https://www.mongodb.com/) database (v4+) to # Example Usage ```js -const mongoConnectionString = 'mongodb://127.0.0.1/agenda'; +const mongoConnectionString = "mongodb://127.0.0.1/agenda"; const agenda = new Agenda({ db: { address: mongoConnectionString } }); @@ -107,7 +107,7 @@ const agenda = new Agenda({ db: { address: mongoConnectionString } }); // or pass in an existing mongodb-native MongoClient instance // const agenda = new Agenda({mongo: myMongoClient}); -agenda.define('delete old users', async job => { +agenda.define("delete old users", async (job) => { await User.remove({ lastLogIn: { $lt: twoDaysAgo } }); }); @@ -115,39 +115,43 @@ agenda.define('delete old users', async job => { // IIFE to give access to async/await await agenda.start(); - await agenda.every('3 minutes', 'delete old users'); + await agenda.every("3 minutes", "delete old users"); // Alternatively, you could also do: - await agenda.every('*/3 * * * *', 'delete old users'); + await agenda.every("*/3 * * * *", "delete old users"); })(); ``` ```js agenda.define( - 'send email report', - async job => { + "send email report", + async (job) => { const { to } = job.attrs.data; await emailClient.send({ to, - from: 'example@example.com', - subject: 'Email Report', - body: '...' + from: "example@example.com", + subject: "Email Report", + body: "...", }); }, - { priority: 'high', concurrency: 10 } + { priority: "high", concurrency: 10 } ); (async function () { await agenda.start(); - await agenda.schedule('in 20 minutes', 'send email report', { to: 'admin@example.com' }); + await agenda.schedule("in 20 minutes", "send email report", { + to: "admin@example.com", + }); })(); ``` ```js (async function () { - const weeklyReport = agenda.create('send email report', { to: 'example@example.com' }); + const weeklyReport = agenda.create("send email report", { + to: "example@example.com", + }); await agenda.start(); - await weeklyReport.repeatEvery('1 week').save(); + await weeklyReport.repeatEvery("1 week").save(); })(); ``` @@ -160,20 +164,20 @@ mapped to a database collection and load the jobs from within. ## Table of Contents -- [Configuring an agenda](#configuring-an-agenda) -- [Agenda Events](#agenda-events) -- [Defining job processors](#defining-job-processors) -- [Creating jobs](#creating-jobs) -- [Managing jobs](#managing-jobs) -- [Starting the job processor](#starting-the-job-processor) -- [Multiple job processors](#multiple-job-processors) -- [Manually working with jobs](#manually-working-with-a-job) -- [Job Queue Events](#job-queue-events) -- [Frequently asked questions](#frequently-asked-questions) -- [Example Project structure](#example-project-structure) -- [Known Issues](#known-issues) -- [Debugging Issues](#debugging-issues) -- [Acknowledgements](#acknowledgements) +- [Configuring an agenda](#configuring-an-agenda) +- [Agenda Events](#agenda-events) +- [Defining job processors](#defining-job-processors) +- [Creating jobs](#creating-jobs) +- [Managing jobs](#managing-jobs) +- [Starting the job processor](#starting-the-job-processor) +- [Multiple job processors](#multiple-job-processors) +- [Manually working with jobs](#manually-working-with-a-job) +- [Job Queue Events](#job-queue-events) +- [Frequently asked questions](#frequently-asked-questions) +- [Example Project structure](#example-project-structure) +- [Known Issues](#known-issues) +- [Debugging Issues](#debugging-issues) +- [Acknowledgements](#acknowledgements) ## Configuring an agenda @@ -204,7 +208,7 @@ Possible agenda config options: collection: string; address: string; options: MongoClientOptions; - }; + } mongo: Db; } ``` @@ -216,10 +220,10 @@ Agenda uses [Human Interval](http://github.com/rschmukler/human-interval) for sp More sophisticated examples ```js -agenda.processEvery('one minute'); -agenda.processEvery('1.5 minutes'); -agenda.processEvery('3 days and 4 hours'); -agenda.processEvery('3 days, 4 hours and 36 seconds'); +agenda.processEvery("one minute"); +agenda.processEvery("1.5 minutes"); +agenda.processEvery("3 days and 4 hours"); +agenda.processEvery("3 days, 4 hours and 36 seconds"); ``` ### database(url, [collectionName], [MongoClientOptions]) @@ -230,14 +234,14 @@ Specifies the database at the `url` specified. If no collection name is given, By default `useNewUrlParser` and `useUnifiedTopology` is set to `true`, ```js -agenda.database('localhost:27017/agenda-test', 'agendaJobs'); +agenda.database("localhost:27017/agenda-test", "agendaJobs"); ``` You can also specify it during instantiation. ```js const agenda = new Agenda({ - db: { address: 'localhost:27017/agenda-test', collection: 'agendaJobs' } + db: { address: "localhost:27017/agenda-test", collection: "agendaJobs" }, }); ``` @@ -253,7 +257,7 @@ database. You can instead use `.database` to have agenda handle connecting for y You can also specify it during instantiation: ```js -const agenda = new Agenda({ mongo: mongoClientInstance.db('agenda-test') }); +const agenda = new Agenda({ mongo: mongoClientInstance.db("agenda-test") }); ``` Note that MongoClient.connect() returns a mongoClientInstance since [node-mongodb-native 3.0.0](https://github.com/mongodb/node-mongodb-native/blob/master/CHANGES_3.0.0.md), while it used to return a dbInstance that could then be directly passed to agenda. @@ -265,13 +269,13 @@ Useful for if you have multiple job processors (agendas) and want to see which job queue last ran the job. ```js -agenda.name(os.hostname + '-' + process.pid); +agenda.name(os.hostname + "-" + process.pid); ``` You can also specify it during instantiation ```js -const agenda = new Agenda({ name: 'test queue' }); +const agenda = new Agenda({ name: "test queue" }); ``` ### processEvery(interval) @@ -291,13 +295,13 @@ that haven't run will still be locked, meaning that you may have to wait for the lock to expire. By default it is `'5 seconds'`. ```js -agenda.processEvery('1 minute'); +agenda.processEvery("1 minute"); ``` You can also specify it during instantiation ```js -const agenda = new Agenda({ processEvery: '30 seconds' }); +const agenda = new Agenda({ processEvery: "30 seconds" }); ``` ### maxConcurrency(number) @@ -388,10 +392,10 @@ By default it is `{ nextRunAt: 1, priority: -1 }`, which obeys a first in first An instance of an agenda will emit the following events: -- `ready` - called when Agenda mongo connection is successfully opened and indices created. - If you're passing agenda an existing connection, you shouldn't need to listen for this, as `agenda.start()` will not resolve until indices have been created. - If you're using the `db` options, or call `database`, then you may still need to listen for the `ready` event before saving jobs. `agenda.start()` will still wait for the connection to be opened. -- `error` - called when Agenda mongo connection process has thrown an error +- `ready` - called when Agenda mongo connection is successfully opened and indices created. + If you're passing agenda an existing connection, you shouldn't need to listen for this, as `agenda.start()` will not resolve until indices have been created. + If you're using the `db` options, or call `database`, then you may still need to listen for the `ready` event before saving jobs. `agenda.start()` will still wait for the connection to be opened. +- `error` - called when Agenda mongo connection process has thrown an error ```js await agenda.start(); @@ -413,13 +417,13 @@ synchronous or returns a Promise, you may omit `done` from the signature. `options` is an optional argument which can overwrite the defaults. It can take the following: -- `concurrency`: `number` maximum number of that job that can be running at once (per instance of agenda) -- `lockLimit`: `number` maximum number of that job that can be locked at once (per instance of agenda) -- `lockLifetime`: `number` interval in ms of how long the job stays locked for (see [multiple job processors](#multiple-job-processors) for more info). - A job will automatically unlock once a returned promise resolves/rejects (or if `done` is specified in the signature and `done()` is called). -- `priority`: `(lowest|low|normal|high|highest|number)` specifies the priority - of the job. Higher priority jobs will run first. See the priority mapping - below +- `concurrency`: `number` maximum number of that job that can be running at once (per instance of agenda) +- `lockLimit`: `number` maximum number of that job that can be locked at once (per instance of agenda) +- `lockLifetime`: `number` interval in ms of how long the job stays locked for (see [multiple job processors](#multiple-job-processors) for more info). + A job will automatically unlock once a returned promise resolves/rejects (or if `done` is specified in the signature and `done()` is called). +- `priority`: `(lowest|low|normal|high|highest|number)` specifies the priority + of the job. Higher priority jobs will run first. See the priority mapping + below Priority mapping: @@ -436,7 +440,7 @@ Priority mapping: Async Job: ```js -agenda.define('some long running job', async job => { +agenda.define("some long running job", async (job) => { const data = await doSomelengthyTask(); await formatThatData(data); await sendThatData(data); @@ -446,8 +450,8 @@ agenda.define('some long running job', async job => { Async Job (using `done`): ```js -agenda.define('some long running job', (job, done) => { - doSomelengthyTask(data => { +agenda.define("some long running job", (job, done) => { + doSomelengthyTask((data) => { formatThatData(data); sendThatData(data); done(); @@ -458,8 +462,8 @@ agenda.define('some long running job', (job, done) => { Sync Job: ```js -agenda.define('say hello', job => { - console.log('Hello!'); +agenda.define("say hello", (job) => { + console.log("Hello!"); }); ``` @@ -486,20 +490,24 @@ In order to use this argument, `data` must also be specified. Returns the `job`. ```js -agenda.define('printAnalyticsReport', async job => { +agenda.define("printAnalyticsReport", async (job) => { const users = await User.doSomethingReallyIntensive(); processUserData(users); - console.log('I print a report!'); + console.log("I print a report!"); }); -agenda.every('15 minutes', 'printAnalyticsReport'); +agenda.every("15 minutes", "printAnalyticsReport"); ``` Optionally, `name` could be array of job names, which is convenient for scheduling different jobs for same `interval`. ```js -agenda.every('15 minutes', ['printAnalyticsReport', 'sendNotifications', 'updateUserRecords']); +agenda.every("15 minutes", [ + "printAnalyticsReport", + "sendNotifications", + "updateUserRecords", +]); ``` In this case, `every` returns array of `jobs`. @@ -515,16 +523,16 @@ under `job.attrs.data`. Returns the `job`. ```js -agenda.schedule('tomorrow at noon', 'printAnalyticsReport', { userCount: 100 }); +agenda.schedule("tomorrow at noon", "printAnalyticsReport", { userCount: 100 }); ``` Optionally, `name` could be array of job names, similar to the `every` method. ```js -agenda.schedule('tomorrow at noon', [ - 'printAnalyticsReport', - 'sendNotifications', - 'updateUserRecords' +agenda.schedule("tomorrow at noon", [ + "printAnalyticsReport", + "sendNotifications", + "updateUserRecords", ]); ``` @@ -540,7 +548,7 @@ under `job.attrs.data`. Returns the `job`. ```js -agenda.now('do the hokey pokey'); +agenda.now("do the hokey pokey"); ``` ### create(jobName, data) @@ -549,9 +557,9 @@ Returns an instance of a `jobName` with `data`. This does _NOT_ save the job in the database. See below to learn how to manually work with jobs. ```js -const job = agenda.create('printAnalyticsReport', { userCount: 100 }); +const job = agenda.create("printAnalyticsReport", { userCount: 100 }); await job.save(); -console.log('Job successfully saved'); +console.log("Job successfully saved"); ``` ## Managing Jobs @@ -561,7 +569,12 @@ console.log('Job successfully saved'); Lets you query (then sort, limit and skip the result) all of the jobs in the agenda job's database. These are full [mongodb-native](https://github.com/mongodb/node-mongodb-native) `find`, `sort`, `limit` and `skip` commands. See mongodb-native's documentation for details. ```js -const jobs = await agenda.jobs({ name: 'printAnalyticsReport' }, { data: -1 }, 3, 1); +const jobs = await agenda.jobs( + { name: "printAnalyticsReport" }, + { data: -1 }, + 3, + 1 +); // Work with jobs (see below) ``` @@ -570,7 +583,7 @@ const jobs = await agenda.jobs({ name: 'printAnalyticsReport' }, { data: -1 }, 3 Cancels any jobs matching the passed mongodb-native query, and removes them from the database. Returns a Promise resolving to the number of cancelled jobs, or rejecting on error. ```js -const numRemoved = await agenda.cancel({ name: 'printAnalyticsReport' }); +const numRemoved = await agenda.cancel({ name: "printAnalyticsReport" }); ``` This functionality can also be achieved by first retrieving all the jobs from the database using `agenda.jobs()`, looping through the resulting array and calling `job.remove()` on each. It is however preferable to use `agenda.cancel()` for this use case, as this ensures the operation is atomic. @@ -610,8 +623,8 @@ async function graceful() { process.exit(0); } -process.on('SIGTERM', graceful); -process.on('SIGINT', graceful); +process.on("SIGTERM", graceful); +process.on("SIGINT", graceful); ``` ## Multiple job processors @@ -625,7 +638,7 @@ interval when defining the job. ```js agenda.define( - 'someJob', + "someJob", (job, cb) => { // Do something in 10 seconds or less... }, @@ -661,20 +674,20 @@ Specifies an `interval` on which the job should repeat. The job runs at the time `options.skipImmediate`: `true` | `false` (default) Setting this `true` will skip the immediate run. The first run will occur only in configured interval. ```js -job.repeatEvery('10 minutes'); +job.repeatEvery("10 minutes"); await job.save(); ``` ```js -job.repeatEvery('3 minutes', { - skipImmediate: true +job.repeatEvery("3 minutes", { + skipImmediate: true, }); await job.save(); ``` ```js -job.repeatEvery('0 6 * * *', { - timezone: 'America/New_York' +job.repeatEvery("0 6 * * *", { + timezone: "America/New_York", }); await job.save(); ``` @@ -684,7 +697,7 @@ await job.save(); Specifies a `time` when the job should repeat. [Possible values](https://github.com/matthewmueller/date#examples) ```js -job.repeatAt('3:30pm'); +job.repeatAt("3:30pm"); await job.save(); ``` @@ -693,7 +706,7 @@ await job.save(); Specifies the next `time` at which the job should run. ```js -job.schedule('tomorrow at 6pm'); +job.schedule("tomorrow at 6pm"); await job.save(); ``` @@ -703,7 +716,7 @@ Specifies the `priority` weighting of the job. Can be a number or a string from the above priority table. ```js -job.priority('low'); +job.priority("low"); await job.save(); ``` @@ -714,10 +727,10 @@ Ensure that only one instance of this job exists with the specified properties `options` is an optional argument which can overwrite the defaults. It can take the following: -- `insertOnly`: `boolean` will prevent any properties from persisting if the job already exists. Defaults to false. +- `insertOnly`: `boolean` will prevent any properties from persisting if the job already exists. Defaults to false. ```js -job.unique({ 'data.type': 'active', 'data.userId': '123', nextRunAt: date }); +job.unique({ "data.type": "active", "data.userId": "123", nextRunAt: date }); await job.save(); ``` @@ -731,9 +744,9 @@ Optionally, `reason` can be an error, in which case `job.attrs.failReason` will be set to `error.message` ```js -job.fail('insufficient disk space'); +job.fail("insufficient disk space"); // or -job.fail(new Error('insufficient disk space')); +job.fail(new Error("insufficient disk space")); await job.save(); ``` @@ -755,9 +768,9 @@ Saves the `job.attrs` into the database. Returns a Promise resolving to a Job in ```js try { await job.save(); - cosole.log('Successfully saved job to collection'); + cosole.log("Successfully saved job to collection"); } catch (e) { - console.error('Error saving job to collection'); + console.error("Error saving job to collection"); } ``` @@ -768,9 +781,9 @@ Removes the `job` from the database. Returns a Promise resolving to the number o ```js try { await job.remove(); - console.log('Successfully removed job from collection'); + console.log("Successfully removed job from collection"); } catch (e) { - console.error('Error removing job from collection'); + console.error("Error removing job from collection"); } ``` @@ -789,7 +802,7 @@ when you have very long running jobs. The call returns a promise that resolves when the job's lock has been renewed. ```js -agenda.define('super long job', async job => { +agenda.define("super long job", async (job) => { await doSomeLongTask(); await job.touch(); await doAnotherLongTask(); @@ -802,38 +815,38 @@ agenda.define('super long job', async job => { An instance of an agenda will emit the following events: -- `start` - called just before a job starts -- `start:job name` - called just before the specified job starts +- `start` - called just before a job starts +- `start:job name` - called just before the specified job starts ```js -agenda.on('start', job => { - console.log('Job %s starting', job.attrs.name); +agenda.on("start", (job) => { + console.log("Job %s starting", job.attrs.name); }); ``` -- `complete` - called when a job finishes, regardless of if it succeeds or fails -- `complete:job name` - called when a job finishes, regardless of if it succeeds or fails +- `complete` - called when a job finishes, regardless of if it succeeds or fails +- `complete:job name` - called when a job finishes, regardless of if it succeeds or fails ```js -agenda.on('complete', job => { +agenda.on("complete", (job) => { console.log(`Job ${job.attrs.name} finished`); }); ``` -- `success` - called when a job finishes successfully -- `success:job name` - called when a job finishes successfully +- `success` - called when a job finishes successfully +- `success:job name` - called when a job finishes successfully ```js -agenda.on('success:send email', job => { +agenda.on("success:send email", (job) => { console.log(`Sent Email Successfully to ${job.attrs.data.to}`); }); ``` -- `fail` - called when a job throws an error -- `fail:job name` - called when a job throws an error +- `fail` - called when a job throws an error +- `fail:job name` - called when a job throws an error ```js -agenda.on('fail:send email', (err, job) => { +agenda.on("fail:send email", (err, job) => { console.log(`Job failed with error: ${err.message}`); }); ``` @@ -892,11 +905,11 @@ guaranteed persistence. Ultimately Agenda can work from a single job queue across multiple machines, node processes, or forks. If you are interested in having more than one worker, [Bars3s](http://github.com/bars3s) has written up a fantastic example of how one might do it: ```js -const cluster = require('cluster'); -const os = require('os'); +const cluster = require("cluster"); +const os = require("os"); -const httpServer = require('./app/http-server'); -const jobWorker = require('./app/job-worker'); +const httpServer = require("./app/http-server"); +const jobWorker = require("./app/job-worker"); const jobWorkers = []; const webWorkers = []; @@ -909,7 +922,7 @@ if (cluster.isMaster) { addWebWorker(); } - cluster.on('exit', (worker, code, signal) => { + cluster.on("exit", (worker, code, signal) => { if (jobWorkers.indexOf(worker.id) !== -1) { console.log( `job worker ${worker.process.pid} exited (signal: ${signal}). Trying to respawn...` @@ -996,16 +1009,20 @@ lib/ Sample job processor (eg. `jobs/email.js`) ```js -let email = require('some-email-lib'), - User = require('../models/user-model.js'); +let email = require("some-email-lib"), + User = require("../models/user-model.js"); module.exports = function (agenda) { - agenda.define('registration email', async job => { + agenda.define("registration email", async (job) => { const user = await User.get(job.attrs.data.userId); - await email(user.email(), 'Thanks for registering', 'Thanks for registering ' + user.name()); + await email( + user.email(), + "Thanks for registering", + "Thanks for registering " + user.name() + ); }); - agenda.define('reset password', async job => { + agenda.define("reset password", async (job) => { // Etc }); @@ -1016,16 +1033,18 @@ module.exports = function (agenda) { lib/agenda.js ```js -const Agenda = require('agenda'); +const Agenda = require("agenda"); -const connectionOpts = { db: { address: 'localhost:27017/agenda-test', collection: 'agendaJobs' } }; +const connectionOpts = { + db: { address: "localhost:27017/agenda-test", collection: "agendaJobs" }, +}; const agenda = new Agenda(connectionOpts); -const jobTypes = process.env.JOB_TYPES ? process.env.JOB_TYPES.split(',') : []; +const jobTypes = process.env.JOB_TYPES ? process.env.JOB_TYPES.split(",") : []; -jobTypes.forEach(type => { - require('./jobs/' + type)(agenda); +jobTypes.forEach((type) => { + require("./jobs/" + type)(agenda); }); if (jobTypes.length) { @@ -1039,16 +1058,16 @@ lib/controllers/user-controller.js ```js let app = express(), - User = require('../models/user-model'), - agenda = require('../worker.js'); + User = require("../models/user-model"), + agenda = require("../worker.js"); -app.post('/users', (req, res, next) => { +app.post("/users", (req, res, next) => { const user = new User(req.body); - user.save(err => { + user.save((err) => { if (err) { return next(err); } - agenda.now('registration email', { userId: user.primary() }); + agenda.now("registration email", { userId: user.primary() }); res.send(201, user.toJson()); }); }); @@ -1057,7 +1076,7 @@ app.post('/users', (req, res, next) => { worker.js ```js -require('./lib/agenda.js'); +require("./lib/agenda.js"); ``` Now you can do the following in your project: @@ -1095,18 +1114,18 @@ If you think you have encountered a bug, please feel free to report it here: Please provide us with as much details as possible such as: -- Agenda version -- Environment (OSX, Linux, Windows, etc) -- Small description of what happened -- Any relevant stack track -- Agenda logs (see below) +- Agenda version +- Environment (OSX, Linux, Windows, etc) +- Small description of what happened +- Any relevant stack track +- Agenda logs (see below) #### To turn on logging, please set your DEBUG env variable like so: -- OSX: `DEBUG="agenda:*" ts-node src/index.ts` -- Linux: `DEBUG="agenda:*" ts-node src/index.ts` -- Windows CMD: `set DEBUG=agenda:*` -- Windows PowerShell: `$env:DEBUG = "agenda:*"` +- OSX: `DEBUG="agenda:*" ts-node src/index.ts` +- Linux: `DEBUG="agenda:*" ts-node src/index.ts` +- Windows CMD: `set DEBUG=agenda:*` +- Windows PowerShell: `$env:DEBUG = "agenda:*"` While not necessary, attaching a text file with this debug information would be extremely useful in debugging certain issues and is encouraged. @@ -1244,16 +1263,16 @@ parameter is true, I do not initialize any jobs (create jobs etc..) 2.) to use this, you have to enable it on a job. Set forkMode to true: ```ts -const job = agenda.create('some job', { meep: 1 }); +const job = agenda.create("some job", { meep: 1 }); job.forkMode(true); await job.save(); ``` # Acknowledgements -- Agenda was originally created by [@rschmukler](https://github.com/rschmukler). -- [Agendash](https://github.com/agenda/agendash) was originally created by [@joeframbach](https://github.com/joeframbach). -- These days Agenda has a great community of [contributors](https://github.com/hokify/agenda/graphs/contributors) around it. Join us! +- Agenda was originally created by [@rschmukler](https://github.com/rschmukler). +- [Agendash](https://github.com/agenda/agendash) was originally created by [@joeframbach](https://github.com/joeframbach). +- These days Agenda has a great community of [contributors](https://github.com/hokify/agenda/graphs/contributors) around it. Join us! # License diff --git a/src/Job.ts b/src/Job.ts deleted file mode 100644 index 8877d60..0000000 --- a/src/Job.ts +++ /dev/null @@ -1,503 +0,0 @@ -import date from 'date.js'; -import debug from 'debug'; -import { ObjectId } from 'mongodb'; -import { ChildProcess, fork } from 'child_process'; -import type { Agenda } from './index.js'; -import type { DefinitionProcessor } from './types/JobDefinition.js'; -import { IJobParameters, datefields, TJobDatefield } from './types/JobParameters.js'; -import { JobPriority, parsePriority } from './utils/priority.js'; -import { computeFromInterval, computeFromRepeatAt } from './utils/nextRunAt.js'; - -const log = debug('agenda:job'); - -/** - * @class - */ -export class Job { - readonly attrs: IJobParameters; - - /** this flag is set to true, if a job got canceled (e.g. due to a timeout or other exception), - * you can use it for long running tasks to periodically check if canceled is true, - * also touch will check if and throws that the job got canceled - */ - private canceled?: Error | string | true; - - getCanceledMessage() { - return typeof this.canceled === 'object' - ? this.canceled?.message || this.canceled - : this.canceled; - } - - private forkedChild?: ChildProcess; - - cancel(error?: Error | string) { - this.agenda.emit(`cancel:${this.attrs.name}`, this); - this.canceled = error || true; - if (this.forkedChild) { - try { - this.forkedChild.send({ - type: 'cancel', - error: this.canceled instanceof Error ? this.canceled.message : this.canceled - }); - // eslint-disable-next-line no-console - console.info('send canceled child', this.attrs.name, this.attrs._id); - } catch (err) { - // eslint-disable-next-line no-console - console.log('cannot send cancel to child'); - } - } - } - - /** internal variable to ensure a job does not set unlimited numbers of setTimeouts if the job is not processed - * immediately */ - gotTimerToExecute: boolean; - - /** - * creates a new job object - * @param agenda - * @param args - * @param byJobProcessor - */ - constructor( - agenda: Agenda, - args: Partial> & { - name: string; - type: 'normal' | 'single'; - }, - byJobProcessor?: boolean - ); - constructor( - agenda: Agenda, - args: Partial> & { - name: string; - type: 'normal' | 'single'; - data: DATA; - }, - byJobProcessor?: boolean - ); - constructor( - readonly agenda: Agenda, - args: Partial> & { - name: string; - type: 'normal' | 'single'; - data: DATA; - }, - private readonly byJobProcessor = false - ) { - // Set attrs to args - this.attrs = { - ...args, - // Set defaults if undefined - priority: parsePriority(args.priority), - nextRunAt: args.nextRunAt === undefined ? new Date() : args.nextRunAt, - type: args.type - }; - } - - /** - * Given a job, turn it into an JobParameters object - */ - toJson(): IJobParameters { - const result = {} as IJobParameters; - - for (const key of Object.keys(this.attrs)) { - if (Object.hasOwnProperty.call(this.attrs, key)) { - result[key] = - datefields.includes(key as TJobDatefield) && this.attrs[key] - ? new Date(this.attrs[key]) - : this.attrs[key]; - } - } - - return result; - } - - /** - * Sets a job to repeat every X amount of time - * @param interval - * @param options - */ - repeatEvery( - interval: string | number, - options: { timezone?: string; skipImmediate?: boolean } = {} - ): this { - this.attrs.repeatInterval = interval; - this.attrs.repeatTimezone = options.timezone; - if (options.skipImmediate) { - // Set the lastRunAt time to the nextRunAt so that the new nextRunAt will be computed in reference to the current value. - this.attrs.lastRunAt = this.attrs.nextRunAt || new Date(); - this.computeNextRunAt(); - this.attrs.lastRunAt = undefined; - } else { - this.computeNextRunAt(); - } - - return this; - } - - /** - * Sets a job to repeat at a specific time - * @param time - */ - repeatAt(time: string): this { - this.attrs.repeatAt = time; - return this; - } - - /** - * if set, a job is forked via node child process and runs in a seperate/own - * thread - * @param enableForkMode - */ - forkMode(enableForkMode: boolean): this { - this.attrs.fork = enableForkMode; - return this; - } - - /** - * Prevents the job from running - */ - disable(): this { - this.attrs.disabled = true; - return this; - } - - /** - * Allows job to run - */ - enable(): this { - this.attrs.disabled = false; - return this; - } - - /** - * Data to ensure is unique for job to be created - * @param unique - * @param opts - */ - unique( - unique: Required>['unique'], - opts?: IJobParameters['uniqueOpts'] - ): this { - this.attrs.unique = unique; - this.attrs.uniqueOpts = opts; - return this; - } - - /** - * Schedules a job to run at specified time - * @param time - */ - schedule(time: string | Date): this { - const d = new Date(time); - - this.attrs.nextRunAt = Number.isNaN(d.getTime()) ? date(time) : d; - - return this; - } - - /** - * Sets priority of the job - * @param priority priority of when job should be queued - */ - priority(priority: JobPriority): this { - this.attrs.priority = parsePriority(priority); - return this; - } - - /** - * Fails the job with a reason (error) specified - * - * @param reason - */ - fail(reason: Error | string): this { - this.attrs.failReason = reason instanceof Error ? reason.message : reason; - this.attrs.failCount = (this.attrs.failCount || 0) + 1; - const now = new Date(); - this.attrs.failedAt = now; - this.attrs.lastFinishedAt = now; - log( - '[%s:%s] fail() called [%d] times so far', - this.attrs.name, - this.attrs._id, - this.attrs.failCount - ); - return this; - } - - private async fetchStatus(): Promise { - const dbJob = await this.agenda.db.getJobs({ _id: this.attrs._id }); - if (!dbJob || dbJob.length === 0) { - // @todo: should we just return false instead? a finished job could have been removed from database, - // and then this would throw... - throw new Error(`job with id ${this.attrs._id} not found in database`); - } - - this.attrs.lastRunAt = dbJob[0].lastRunAt; - this.attrs.lockedAt = dbJob[0].lockedAt; - this.attrs.lastFinishedAt = dbJob[0].lastFinishedAt; - } - - /** - * A job is running if: - * (lastRunAt exists AND lastFinishedAt does not exist) - * OR - * (lastRunAt exists AND lastFinishedAt exists but the lastRunAt is newer [in time] than lastFinishedAt) - * @returns Whether or not job is running at the moment (true for running) - */ - async isRunning(): Promise { - if (!this.byJobProcessor || this.attrs.fork) { - // we have no job definition, therfore we are not the job processor, but a client call - // so we get the real state from database - await this.fetchStatus(); - } - - if (!this.attrs.lastRunAt) { - return false; - } - - if (!this.attrs.lastFinishedAt) { - return true; - } - - if ( - this.attrs.lockedAt && - this.attrs.lastRunAt.getTime() > this.attrs.lastFinishedAt.getTime() - ) { - return true; - } - - return false; - } - - /** - * Saves a job to database - */ - async save(): Promise { - if (this.agenda.forkedWorker) { - const warning = new Error('calling save() on a Job during a forkedWorker has no effect!'); - console.warn(warning.message, warning.stack); - return this as Job; - } - // ensure db connection is ready - await this.agenda.ready; - return this.agenda.db.saveJob(this as Job); - } - - /** - * Remove the job from database - */ - remove(): Promise { - return this.agenda.cancel({ _id: this.attrs._id }); - } - - async isDead(): Promise { - return this.isExpired(); - } - - async isExpired(): Promise { - if (!this.byJobProcessor || this.attrs.fork) { - // we have no job definition, therfore we are not the job processor, but a client call - // so we get the real state from database - await this.fetchStatus(); - } - - const definition = this.agenda.definitions[this.attrs.name]; - - const lockDeadline = new Date(Date.now() - definition.lockLifetime); - - // This means a job has "expired", as in it has not been "touched" within the lockoutTime - // Remove from local lock - if (this.attrs.lockedAt && this.attrs.lockedAt < lockDeadline) { - return true; - } - return false; - } - - /** - * Updates "lockedAt" time so the job does not get picked up again - * @param progress 0 to 100 - */ - async touch(progress?: number): Promise { - if (this.canceled) { - throw new Error(`job ${this.attrs.name} got canceled already: ${this.canceled}!`); - } - this.attrs.lockedAt = new Date(); - this.attrs.progress = progress; - - await this.agenda.db.saveJobState(this); - } - - private computeNextRunAt() { - try { - if (this.attrs.repeatInterval) { - this.attrs.nextRunAt = computeFromInterval(this.attrs); - log( - '[%s:%s] nextRunAt set to [%s]', - this.attrs.name, - this.attrs._id, - new Date(this.attrs.nextRunAt).toISOString() - ); - } else if (this.attrs.repeatAt) { - this.attrs.nextRunAt = computeFromRepeatAt(this.attrs); - - log( - '[%s:%s] nextRunAt set to [%s]', - this.attrs.name, - this.attrs._id, - this.attrs.nextRunAt.toISOString() - ); - } else { - this.attrs.nextRunAt = null; - } - } catch (error: any) { - this.attrs.nextRunAt = null; - this.fail(error); - } - - return this; - } - - async run(): Promise { - this.attrs.lastRunAt = new Date(); - log( - '[%s:%s] setting lastRunAt to: %s', - this.attrs.name, - this.attrs._id, - this.attrs.lastRunAt.toISOString() - ); - this.computeNextRunAt(); - await this.agenda.db.saveJobState(this); - - try { - this.agenda.emit('start', this); - this.agenda.emit(`start:${this.attrs.name}`, this); - log('[%s:%s] starting job', this.attrs.name, this.attrs._id); - - if (this.attrs.fork) { - if (!this.agenda.forkHelper) { - throw new Error('no forkHelper specified, you need to set a path to a helper script'); - } - const { forkHelper } = this.agenda; - - await new Promise((resolve, reject) => { - this.forkedChild = fork( - forkHelper.path, - [ - this.attrs.name, - this.attrs._id!.toString(), - this.agenda.definitions[this.attrs.name].filePath || '' - ], - forkHelper.options - ); - - let childError: any; - this.forkedChild.on('close', code => { - if (code) { - // eslint-disable-next-line no-console - console.info( - 'fork parameters', - forkHelper, - this.attrs.name, - this.attrs._id, - this.agenda.definitions[this.attrs.name].filePath - ); - const error = new Error(`child process exited with code: ${code}`); - console.warn(error.message, childError || this.canceled); - reject(childError || this.canceled || error); - } else { - resolve(); - } - }); - this.forkedChild.on('message', message => { - // console.log(`Message from child.js: ${message}`, JSON.stringify(message)); - if (typeof message === 'string') { - try { - childError = JSON.parse(message); - } catch (errJson) { - childError = message; - } - } else { - childError = message; - } - }); - }); - } else { - await this.runJob(); - } - - this.attrs.lastFinishedAt = new Date(); - - this.agenda.emit('success', this); - this.agenda.emit(`success:${this.attrs.name}`, this); - log('[%s:%s] has succeeded', this.attrs.name, this.attrs._id); - } catch (error: any) { - log('[%s:%s] unknown error occurred', this.attrs.name, this.attrs._id); - - this.fail(error); - - this.agenda.emit('fail', error, this); - this.agenda.emit(`fail:${this.attrs.name}`, error, this); - log('[%s:%s] has failed [%s]', this.attrs.name, this.attrs._id, error.message); - } finally { - this.forkedChild = undefined; - this.attrs.lockedAt = undefined; - try { - await this.agenda.db.saveJobState(this); - log('[%s:%s] was saved successfully to MongoDB', this.attrs.name, this.attrs._id); - } catch (err) { - // in case this fails, we ignore it - // this can e.g. happen if the job gets removed during the execution - log('[%s:%s] was not saved to MongoDB', this.attrs.name, this.attrs._id, err); - } - - this.agenda.emit('complete', this); - this.agenda.emit(`complete:${this.attrs.name}`, this); - log( - '[%s:%s] job finished at [%s] and was unlocked', - this.attrs.name, - this.attrs._id, - this.attrs.lastFinishedAt - ); - } - } - - async runJob() { - const definition = this.agenda.definitions[this.attrs.name]; - - if (!definition) { - log('[%s:%s] has no definition, can not run', this.attrs.name, this.attrs._id); - throw new Error('Undefined job'); - } - - if (definition.fn.length === 2) { - log('[%s:%s] process function being called', this.attrs.name, this.attrs._id); - await new Promise((resolve, reject) => { - try { - const result = definition.fn(this as Job, error => { - if (error) { - reject(error); - return; - } - resolve(); - }); - - if (this.isPromise(result)) { - result.catch((error: Error) => reject(error)); - } - } catch (error) { - reject(error); - } - }); - } else { - log('[%s:%s] process function being called', this.attrs.name, this.attrs._id); - await (definition.fn as DefinitionProcessor)(this); - } - } - - private isPromise(value: unknown): value is Promise { - return !!(value && typeof (value as Promise).then === 'function'); - } -} - -export type JobWithId = Job & { attrs: IJobParameters & { _id: ObjectId } }; diff --git a/src/JobDbRepository.ts b/src/JobDbRepository.ts deleted file mode 100644 index 4b98ee9..0000000 --- a/src/JobDbRepository.ts +++ /dev/null @@ -1,405 +0,0 @@ -import debug from 'debug'; -import { - Collection, - Db, - Filter, - MongoClient, - MongoClientOptions, - ObjectId, - Sort, - UpdateFilter -} from 'mongodb'; -import type { Job, JobWithId } from './Job.js'; -import type { Agenda } from './index.js'; -import type { IDatabaseOptions, IDbConfig, IMongoOptions } from './types/DbOptions.js'; -import type { IJobParameters } from './types/JobParameters.js'; -import { hasMongoProtocol } from './utils/hasMongoProtocol.js'; - -const log = debug('agenda:db'); - -/** - * @class - */ -export class JobDbRepository { - collection: Collection; - - constructor( - private agenda: Agenda, - private connectOptions: (IDatabaseOptions | IMongoOptions) & IDbConfig - ) { - this.connectOptions.sort = this.connectOptions.sort || { nextRunAt: 1, priority: -1 }; - } - - private async createConnection(): Promise { - const { connectOptions } = this; - if (this.hasDatabaseConfig(connectOptions)) { - log('using database config', connectOptions); - return this.database(connectOptions.db.address, connectOptions.db.options); - } - - if (this.hasMongoConnection(connectOptions)) { - log('using passed in mongo connection'); - return connectOptions.mongo; - } - - throw new Error('invalid db config, or db config not found'); - } - - private hasMongoConnection(connectOptions: unknown): connectOptions is IMongoOptions { - return !!(connectOptions as IMongoOptions)?.mongo; - } - - private hasDatabaseConfig(connectOptions: unknown): connectOptions is IDatabaseOptions { - return !!(connectOptions as IDatabaseOptions)?.db?.address; - } - - async getJobById(id: string) { - return this.collection.findOne({ _id: new ObjectId(id) }); - } - - async getJobs( - query: Filter, - sort: Sort = {}, - limit = 0, - skip = 0 - ): Promise { - return this.collection.find(query).sort(sort).limit(limit).skip(skip).toArray(); - } - - async removeJobs(query: Filter): Promise { - const result = await this.collection.deleteMany(query); - return result.deletedCount || 0; - } - - async getQueueSize(): Promise { - return this.collection.countDocuments({ nextRunAt: { $lt: new Date() } }); - } - - async unlockJob(job: Job): Promise { - // only unlock jobs which are not currently processed (nextRunAT is not null) - await this.collection.updateOne( - { _id: job.attrs._id, nextRunAt: { $ne: null } }, - { $unset: { lockedAt: true } } - ); - } - - /** - * Internal method to unlock jobs so that they can be re-run - */ - async unlockJobs(jobIds: ObjectId[]): Promise { - await this.collection.updateMany( - { _id: { $in: jobIds }, nextRunAt: { $ne: null } }, - { $unset: { lockedAt: true } } - ); - } - - async lockJob(job: JobWithId): Promise { - // Query to run against collection to see if we need to lock it - const criteria: Filter & { lockedAt?: Date | null }> = { - _id: job.attrs._id, - name: job.attrs.name, - lockedAt: null, - nextRunAt: job.attrs.nextRunAt, - disabled: { $ne: true } - }; - - // Update / options for the MongoDB query - const update: UpdateFilter = { $set: { lockedAt: new Date() } }; - - // Lock the job in MongoDB! - // @ts-ignore - const resp = (await this.collection.findOneAndUpdate( - criteria as Filter, - update, - { - returnDocument: 'after', - sort: this.connectOptions.sort, - includeResultMetadata: true - } - )) as any; - - return resp?.value || undefined; - } - - async getNextJobToRun( - jobName: string, - nextScanAt: Date, - lockDeadline: Date, - now: Date = new Date() - ): Promise { - /** - * Query used to find job to run - */ - const JOB_PROCESS_WHERE_QUERY: Filter & { lockedAt?: Date | null } */> = - { - name: jobName, - disabled: { $ne: true }, - $or: [ - { - lockedAt: { $eq: null as any }, - nextRunAt: { $lte: nextScanAt } - }, - { - lockedAt: { $lte: lockDeadline } - } - ] - }; - - /** - * Query used to set a job as locked - */ - const JOB_PROCESS_SET_QUERY: UpdateFilter = { $set: { lockedAt: now } }; - - // Find ONE and ONLY ONE job and set the 'lockedAt' time so that job begins to be processed - // @ts-ignore - const result = (await this.collection.findOneAndUpdate( - JOB_PROCESS_WHERE_QUERY, - JOB_PROCESS_SET_QUERY, - { - returnDocument: 'after', - sort: this.connectOptions.sort, - includeResultMetadata: true - } - )) as any; - - return result.value || undefined; - } - - async connect(): Promise { - const db = await this.createConnection(); - log('successful connection to MongoDB', db.options); - - const collection = this.connectOptions.db?.collection || 'agendaJobs'; - - this.collection = db.collection(collection); - if (log.enabled) { - log( - `connected with collection: ${collection}, collection size: ${ - typeof this.collection.estimatedDocumentCount === 'function' - ? await this.collection.estimatedDocumentCount() - : '?' - }` - ); - } - - if (this.connectOptions.ensureIndex) { - log('attempting index creation'); - try { - const result = await this.collection.createIndex( - { - name: 1, - ...this.connectOptions.sort, - priority: -1, - lockedAt: 1, - nextRunAt: 1, - disabled: 1 - }, - { name: 'findAndLockNextJobIndex' } - ); - log('index succesfully created', result); - } catch (error) { - log('db index creation failed', error); - throw error; - } - } - - this.agenda.emit('ready'); - } - - private async database(url: string, options?: MongoClientOptions) { - let connectionString = url; - - if (!hasMongoProtocol(connectionString)) { - connectionString = `mongodb://${connectionString}`; - } - - const client = await MongoClient.connect(connectionString, { - ...options - }); - - return client.db(); - } - - private processDbResult( - job: Job, - res?: IJobParameters - ): Job { - log( - 'processDbResult() called with success, checking whether to process job immediately or not' - ); - - // We have a result from the above calls - if (res) { - // Grab ID and nextRunAt from MongoDB and store it as an attribute on Job - job.attrs._id = res._id; - job.attrs.nextRunAt = res.nextRunAt; - - // check if we should process the job immediately - this.agenda.emit('processJob', job); - } - - // Return the Job instance - return job; - } - - async saveJobState(job: Job): Promise { - const id = job.attrs._id; - const $set = { - lockedAt: (job.attrs.lockedAt && new Date(job.attrs.lockedAt)) || undefined, - nextRunAt: (job.attrs.nextRunAt && new Date(job.attrs.nextRunAt)) || undefined, - lastRunAt: (job.attrs.lastRunAt && new Date(job.attrs.lastRunAt)) || undefined, - progress: job.attrs.progress, - failReason: job.attrs.failReason, - failCount: job.attrs.failCount, - failedAt: job.attrs.failedAt && new Date(job.attrs.failedAt), - lastFinishedAt: (job.attrs.lastFinishedAt && new Date(job.attrs.lastFinishedAt)) || undefined - }; - - log('[job %s] save job state: \n%O', id, $set); - - const result = await this.collection.updateOne( - { _id: id, name: job.attrs.name }, - { - $set - } - ); - - if (!result.acknowledged || result.matchedCount !== 1) { - throw new Error( - `job ${id} (name: ${job.attrs.name}) cannot be updated in the database, maybe it does not exist anymore?` - ); - } - } - - /** - * Save the properties on a job to MongoDB - * @name Agenda#saveJob - * @function - * @param {Job} job job to save into MongoDB - * @returns {Promise} resolves when job is saved or errors - */ - async saveJob(job: Job): Promise> { - try { - log('attempting to save a job'); - - // Grab information needed to save job but that we don't want to persist in MongoDB - const id = job.attrs._id; - - // Store job as JSON and remove props we don't want to store from object - // _id, unique, uniqueOpts - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const { _id, unique, uniqueOpts, ...props } = { - ...job.toJson(), - // Store name of agenda queue as last modifier in job data - lastModifiedBy: this.agenda.attrs.name - }; - - log('[job %s] set job props: \n%O', id, props); - - // Grab current time and set default query options for MongoDB - const now = new Date(); - const protect: Partial = {}; - let update: UpdateFilter = { $set: props }; - log('current time stored as %s', now.toISOString()); - - // If the job already had an ID, then update the properties of the job - // i.e, who last modified it, etc - if (id) { - // Update the job and process the resulting data' - log('job already has _id, calling findOneAndUpdate() using _id as query'); - // @ts-ignore - const result = (await this.collection.findOneAndUpdate( - { _id: id, name: props.name }, - update, - { - returnDocument: 'after', - includeResultMetadata: true - } - )) as any; - return this.processDbResult(job, result.value as IJobParameters); - } - - if (props.type === 'single') { - // Job type set to 'single' so... - log('job with type of "single" found'); - - // If the nextRunAt time is older than the current time, "protect" that property, meaning, don't change - // a scheduled job's next run time! - if (props.nextRunAt && props.nextRunAt <= now) { - log('job has a scheduled nextRunAt time, protecting that field from upsert'); - protect.nextRunAt = props.nextRunAt; - delete (props as Partial).nextRunAt; - } - - // If we have things to protect, set them in MongoDB using $setOnInsert - if (Object.keys(protect).length > 0) { - update.$setOnInsert = protect; - } - - // Try an upsert - log( - `calling findOneAndUpdate(${props.name}) with job name and type of "single" as query`, - await this.collection.findOne({ - name: props.name, - type: 'single' - }) - ); - // this call ensure a job of this name can only exists once - // @ts-ignore - const result = (await this.collection.findOneAndUpdate( - { - name: props.name, - type: 'single' - }, - update, - { - upsert: true, - returnDocument: 'after', - includeResultMetadata: true - } - )) as any; - log( - `findOneAndUpdate(${props.name}) with type "single" ${ - result.lastErrorObject?.updatedExisting - ? 'updated existing entry' - : 'inserted new entry' - }` - ); - return this.processDbResult(job, result.value as IJobParameters); - } - - if (job.attrs.unique) { - // If we want the job to be unique, then we can upsert based on the 'unique' query object that was passed in - const query: Filter, 'unique'>> = job.attrs.unique; - query.name = props.name; - if (job.attrs.uniqueOpts?.insertOnly) { - update = { $setOnInsert: props }; - } - - // Use the 'unique' query object to find an existing job or create a new one - log('calling findOneAndUpdate() with unique object as query: \n%O', query); - // @ts-ignore - const result = (await this.collection.findOneAndUpdate(query as IJobParameters, update, { - upsert: true, - returnDocument: 'after', - includeResultMetadata: true - })) as any; - return this.processDbResult(job, result.value as IJobParameters); - } - - // If all else fails, the job does not exist yet so we just insert it into MongoDB - log( - 'using default behavior, inserting new job via insertOne() with props that were set: \n%O', - props - ); - const result = await this.collection.insertOne(props); - return this.processDbResult(job, { - _id: result.insertedId, - ...props - } as IJobParameters); - } catch (error) { - log('processDbResult() received an error, job was not updated/created'); - throw error; - } - } -} diff --git a/src/JobProcessingQueue.ts b/src/JobProcessingQueue.ts deleted file mode 100644 index 74040b5..0000000 --- a/src/JobProcessingQueue.ts +++ /dev/null @@ -1,128 +0,0 @@ -// eslint-disable-next-line prettier/prettier -import type {Job, JobWithId} from './Job.js'; -import type { IJobParameters } from './types/JobParameters.js'; -import type { Agenda } from './index.js'; -/** - * @class - */ -export class JobProcessingQueue { - private _queue: Job[]; - - constructor(private agenda: Agenda) { - this._queue = []; - } - - get length(): number { - return this._queue.length; - } - - getQueue(): Job[] { - return this._queue; - } - - /** - * Pops and returns last queue element (next job to be processed) without checking concurrency. - * @returns {Job} Next Job to be processed - */ - pop(): Job | undefined { - return this._queue.pop(); - } - - /** - * Inserts job in first queue position - * @param {Job} job job to add to queue - * @returns {undefined} - */ - /* - push(job: Job): void { - this._queue.push(job); - } */ - - remove(job: Job): void { - let removeJobIndex = this._queue.indexOf(job); - if (removeJobIndex === -1) { - // lookup by id - removeJobIndex = this._queue.findIndex( - j => j.attrs._id?.toString() === job.attrs._id?.toString() - ); - } - if (removeJobIndex === -1) { - throw new Error(`cannot find job ${job.attrs._id} in processing queue?`); - } - - this._queue.splice(removeJobIndex, 1); - } - - /** - * Inserts job in queue where it will be order from left to right in decreasing - * order of nextRunAt and priority (in case of same nextRunAt), if all values - * are even the first jobs to be introduced will have priority - * @param {Job} job job to add to queue - * @returns {undefined} - */ - insert(job: Job): void { - const matchIndex = this._queue.findIndex(element => { - if ( - element.attrs.nextRunAt && - job.attrs.nextRunAt && - element.attrs.nextRunAt.getTime() <= job.attrs.nextRunAt.getTime() - ) { - if (element.attrs.nextRunAt.getTime() === job.attrs.nextRunAt.getTime()) { - if (element.attrs.priority >= job.attrs.priority) { - return true; - } - } else { - return true; - } - } - - return false; - }); - - if (matchIndex === -1) { - // put on left side of the queue - this._queue.unshift(job); - } else { - this._queue.splice(matchIndex, 0, job); - } - } - - /** - * Returns (does not pop, element remains in queue) first element (always from the right) - * that can be processed (not blocked by concurrency execution) - * @param {Object} jobStatus current status of jobs - * @returns {Job} Next Job to be processed - */ - returnNextConcurrencyFreeJob( - jobStatus: { - [jobName: string]: - | { - running: number; - } - | undefined; - }, - handledJobs: IJobParameters['_id'][] - ): (JobWithId & { attrs: IJobParameters & { nextRunAt?: Date | null } }) | undefined { - const next = (Object.keys(this._queue) as unknown as number[]).reverse().find(i => { - const def = this.agenda.definitions[this._queue[i].attrs.name]; - const status = jobStatus[this._queue[i].attrs.name]; - - // check if we have a definition - // if there is no status available, we are good to go - // if there is no max concurrency defined (0), we are also good to go - // and if concurrency limit is not reached yet (actual running jobs is lower than max concurrency) - if ( - def && - !handledJobs.includes(this._queue[i].attrs._id) && - (!status || !def.concurrency || status.running < def.concurrency) - ) { - return true; - } - return false; - }); - - return next !== undefined - ? (this._queue[next] as JobWithId & { attrs: IJobParameters & { nextRunAt: Date } }) - : undefined; - } -} diff --git a/src/JobProcessor.ts b/src/JobProcessor.ts deleted file mode 100644 index 37eb6ba..0000000 --- a/src/JobProcessor.ts +++ /dev/null @@ -1,655 +0,0 @@ -import debug from 'debug'; -import { createRequire } from 'node:module'; -import type { IAgendaJobStatus, IAgendaStatus } from './types/AgendaStatus.js'; -import type { IJobDefinition } from './types/JobDefinition.js'; -import type { Agenda, JobWithId } from './index.js'; -import type { IJobParameters } from './types/JobParameters.js'; -import { Job } from './Job.js'; -import { JobProcessingQueue } from './JobProcessingQueue.js'; - -const log = debug('agenda:jobProcessor'); - -// eslint-disable-next-line @typescript-eslint/no-var-requires,global-require -const require = createRequire(import.meta.url); -const { version: agendaVersion } = require('../package.json'); - -const MAX_SAFE_32BIT_INTEGER = 2 ** 31; // Math.pow(2,31); - -/** - * @class - * Process methods for jobs - */ -export class JobProcessor { - private jobStatus: { - [name: string]: { running: number; locked: number } | undefined; - } = {}; - - private localQueueProcessing = 0; - - private localLockLimitReached = 0; - - async getStatus(fullDetails = false): Promise { - const jobStatus = Object.keys(this.agenda.definitions).reduce((obj, key) => { - obj[key] = { - ...this.jobStatus[key], - config: this.agenda.definitions[key] - }; - return obj; - }, {}) as IAgendaJobStatus; - - return { - version: agendaVersion, - queueName: this.agenda.attrs.name, - totalQueueSizeDB: await this.agenda.db.getQueueSize(), - internal: { - localQueueProcessing: this.localQueueProcessing, - localLockLimitReached: this.localLockLimitReached - }, - config: { - totalLockLimit: this.totalLockLimit, - maxConcurrency: this.maxConcurrency, - processEvery: this.processEvery - }, - jobStatus, - queuedJobs: !fullDetails - ? this.jobQueue.length - : this.jobQueue.getQueue().map(job => ({ - ...job.toJson(), - canceled: job.getCanceledMessage() - })), - runningJobs: !fullDetails - ? this.runningJobs.length - : this.runningJobs.map(job => ({ - ...job.toJson(), - canceled: job.getCanceledMessage() - })), - lockedJobs: !fullDetails - ? this.lockedJobs.length - : this.lockedJobs.map(job => ({ - ...job.toJson(), - canceled: job.getCanceledMessage() - })), - jobsToLock: !fullDetails - ? this.jobsToLock.length - : this.jobsToLock.map(job => ({ - ...job.toJson(), - canceled: job.getCanceledMessage() - })), - isLockingOnTheFly: this.isLockingOnTheFly - }; - } - - private nextScanAt = new Date(); - - private jobQueue: JobProcessingQueue; - - private runningJobs: JobWithId[] = []; - - private lockedJobs: JobWithId[] = []; - - private jobsToLock: JobWithId[] = []; - - private isLockingOnTheFly = false; - - private isJobQueueFilling = new Map(); - - private isRunning = true; - - private processInterval?: ReturnType; - - constructor( - private agenda: Agenda, - private maxConcurrency: number, - private totalLockLimit: number, - private processEvery: number - ) { - this.jobQueue = new JobProcessingQueue(this.agenda); - log('creating interval to call processJobs every [%dms]', processEvery); - this.processInterval = setInterval(() => this.process(), processEvery); - this.process(); - } - - stop(): JobWithId[] { - log.extend('stop')('stop job processor', this.isRunning); - this.isRunning = false; - - if (this.processInterval) { - clearInterval(this.processInterval); - this.processInterval = undefined; - } - - return this.lockedJobs; - } - - // processJobs - async process(extraJob?: JobWithId): Promise { - // Make sure an interval has actually been set - // Prevents race condition with 'Agenda.stop' and already scheduled run - if (!this.isRunning) { - log.extend('process')('JobProcessor got stopped already, returning'); - return; - } - - // Determine whether or not we have a direct process call! - if (!extraJob) { - log.extend('process')('starting to process jobs'); - - // Go through each jobName set in 'Agenda.process' and fill the queue with the next jobs - await Promise.all( - Object.keys(this.agenda.definitions).map(async jobName => { - log.extend('process')('queuing up job to process: [%s]', jobName); - await this.jobQueueFilling(jobName); - }) - ); - this.jobProcessing(); - } else if ( - this.agenda.definitions[extraJob.attrs.name] && - // If the extraJob would have been processed in an older scan, process the job immediately - extraJob.attrs.nextRunAt && - extraJob.attrs.nextRunAt < this.nextScanAt - ) { - log.extend('process')( - '[%s:%s] job would have ran by nextScanAt, processing the job immediately', - extraJob.attrs.name - ); - // Add the job to list of jobs to lock and then lock it immediately! - this.jobsToLock.push(extraJob); - await this.lockOnTheFly(); - } - } - - /** - * Returns true if a job of the specified name can be locked. - * Considers maximum locked jobs at any time if self._lockLimit is > 0 - * Considers maximum locked jobs of the specified name at any time if jobDefinition.lockLimit is > 0 - * @param {String} name name of job to check if we should lock or not - * @returns {boolean} whether or not you should lock job - */ - shouldLock(name: string): boolean { - const jobDefinition = this.agenda.definitions[name]; - let shouldLock = true; - // global lock limit - if (this.totalLockLimit && this.lockedJobs.length >= this.totalLockLimit) { - shouldLock = false; - } - - // job specific lock limit - const status = this.jobStatus[name]; - if (jobDefinition.lockLimit && status && status.locked >= jobDefinition.lockLimit) { - shouldLock = false; - } - - log.extend('shouldLock')( - 'job [%s] lock status: shouldLock = %s', - name, - shouldLock, - `${status?.locked} >= ${jobDefinition?.lockLimit}`, - `${this.lockedJobs.length} >= ${this.totalLockLimit}` - ); - return shouldLock; - } - - /** - * Internal method that adds jobs to be processed to the local queue - * @param {*} jobs Jobs to queue - * @param {boolean} inFront puts the job in front of queue if true - * @returns {undefined} - */ - private enqueueJob(job: Job): void { - this.jobQueue.insert(job); - } - - /** - * Internal method that will lock a job and store it on MongoDB - * This method is called when we immediately start to process a job without using the process interval - * We do this because sometimes jobs are scheduled but will be run before the next process time - * @returns {undefined} - */ - async lockOnTheFly(): Promise { - // Already running this? Return - if (this.isLockingOnTheFly) { - log.extend('lockOnTheFly')('already running, returning'); - return; - } - - // Don't have any jobs to run? Return - if (this.jobsToLock.length === 0) { - log.extend('lockOnTheFly')('no jobs to current lock on the fly, returning'); - return; - } - - this.isLockingOnTheFly = true; - - // Set that we are running this - try { - // Grab a job that needs to be locked - const job = this.jobsToLock.pop(); - - if (job) { - if (this.isJobQueueFilling.has(job.attrs.name)) { - log.extend('lockOnTheFly')('jobQueueFilling already running for: %s', job.attrs.name); - return; - } - - // If locking limits have been hit, stop locking on the fly. - // Jobs that were waiting to be locked will be picked up during a - // future locking interval. - if (!this.shouldLock(job.attrs.name)) { - log.extend('lockOnTheFly')('lock limit hit for: [%s:%S]', job.attrs.name, job.attrs._id); - this.updateStatus(job.attrs.name, 'lockLimitReached', +1); - this.jobsToLock = []; - return; - } - - // Lock the job in MongoDB! - const resp = await this.agenda.db.lockJob(job); - - if (resp) { - if (job.attrs.name !== resp.name) { - throw new Error( - `got different job name: ${resp.name} (actual) !== ${job.attrs.name} (expected)` - ); - } - - const jobToEnqueue = new Job(this.agenda, resp, true) as JobWithId; - - // Before en-queing job make sure we haven't exceed our lock limits - if (!this.shouldLock(jobToEnqueue.attrs.name)) { - log.extend('lockOnTheFly')( - 'lock limit reached while job was locked in database. Releasing lock on [%s]', - jobToEnqueue.attrs.name - ); - this.updateStatus(jobToEnqueue.attrs.name, 'lockLimitReached', +1); - this.agenda.db.unlockJob(jobToEnqueue); - - this.jobsToLock = []; - return; - } - - log.extend('lockOnTheFly')( - 'found job [%s:%s] that can be locked on the fly', - jobToEnqueue.attrs.name, - jobToEnqueue.attrs._id - ); - this.updateStatus(jobToEnqueue.attrs.name, 'locked', +1); - this.lockedJobs.push(jobToEnqueue); - this.enqueueJob(jobToEnqueue); - this.jobProcessing(); - } else { - log.extend('lockOnTheFly')('cannot lock job [%s] on the fly', job.attrs.name); - } - } - } finally { - // Mark lock on fly is done for now - this.isLockingOnTheFly = false; - } - - // Re-run in case anything is in the queue - await this.lockOnTheFly(); - } - - private async findAndLockNextJob( - jobName: string, - definition: IJobDefinition - ): Promise { - const lockDeadline = new Date(Date.now().valueOf() - definition.lockLifetime); - log.extend('findAndLockNextJob')( - `looking for lockable jobs for ${jobName} (lock dead line = ${lockDeadline})` - ); - - // Find ONE and ONLY ONE job and set the 'lockedAt' time so that job begins to be processed - const result = await this.agenda.db.getNextJobToRun(jobName, this.nextScanAt, lockDeadline); - - if (result) { - log.extend('findAndLockNextJob')( - 'found a job available to lock, creating a new job on Agenda with id [%s]', - result._id - ); - return new Job(this.agenda, result, true) as JobWithId; - } - - return undefined; - } - - /** - * Internal method used to fill a queue with jobs that can be run - * @param {String} name fill a queue with specific job name - * @returns {undefined} - */ - private async jobQueueFilling(name: string): Promise { - this.isJobQueueFilling.set(name, true); - - try { - // Don't lock because of a limit we have set (lockLimit, etc) - if (!this.shouldLock(name)) { - this.updateStatus(name, 'lockLimitReached', +1); - log.extend('jobQueueFilling')('lock limit reached in queue filling for [%s]', name); - return; - } - - // Set the date of the next time we are going to run _processEvery function - const now = new Date(); - this.nextScanAt = new Date(now.valueOf() + this.processEvery); - - // For this job name, find the next job to run and lock it! - const job = await this.findAndLockNextJob(name, this.agenda.definitions[name]); - - // Still have the job? - // 1. Add it to lock list - // 2. Add count of locked jobs - // 3. Queue the job to actually be run now that it is locked - // 4. Recursively run this same method we are in to check for more available jobs of same type! - if (job) { - if (job.attrs.name !== name) { - throw new Error( - `got different job name: ${job.attrs.name} (actual) !== ${name} (expected)` - ); - } - - // Before en-queing job make sure we haven't exceed our lock limits - if (!this.shouldLock(name)) { - log.extend('jobQueueFilling')( - 'lock limit reached before job was returned. Releasing lock on [%s]', - name - ); - this.updateStatus(name, 'lockLimitReached', +1); - this.agenda.db.unlockJob(job); - return; - } - - log.extend('jobQueueFilling')( - '[%s:%s] job locked while filling queue', - name, - job.attrs._id - ); - this.updateStatus(name, 'locked', +1); - this.lockedJobs.push(job); - - this.enqueueJob(job); - await this.jobQueueFilling(name); - } else { - log.extend('jobQueueFilling')('Cannot lock job [%s]', name); - } - } catch (error) { - log.extend('jobQueueFilling')('[%s] job lock failed while filling queue', name, error); - this.agenda.emit('error', error); - } finally { - this.isJobQueueFilling.delete(name); - } - } - - /** - * Internal method that processes any jobs in the local queue (array) - * handledJobs keeps list of already processed jobs - * @returns {undefined} - */ - private async jobProcessing(handledJobs: IJobParameters['_id'][] = []) { - // Ensure we have jobs - if (this.jobQueue.length === 0) { - return; - } - - this.localQueueProcessing += 1; - - try { - const now = new Date(); - - // Check if there is any job that is not blocked by concurrency - const job = this.jobQueue.returnNextConcurrencyFreeJob(this.jobStatus, handledJobs); - - if (!job) { - log.extend('jobProcessing')('[%s:%s] there is no job to process'); - return; - } - - this.jobQueue.remove(job); - - if (!(await job.isExpired())) { - // check if job has expired (and therefore probably got picked up again by another queue in the meantime) - // before it even has started to run - - log.extend('jobProcessing')( - '[%s:%s] there is a job to process (priority = %d)', - job.attrs.name, - job.attrs._id, - job.attrs.priority, - job.gotTimerToExecute - ); - - // If the 'nextRunAt' time is older than the current time, run the job - // Otherwise, setTimeout that gets called at the time of 'nextRunAt' - if (!job.attrs.nextRunAt || job.attrs.nextRunAt <= now) { - log.extend('jobProcessing')( - '[%s:%s] nextRunAt is in the past, run the job immediately', - job.attrs.name, - job.attrs._id - ); - this.runOrRetry(job); - } else { - const runIn = job.attrs.nextRunAt.getTime() - now.getTime(); - if (runIn > this.processEvery) { - // this job is not in the near future, remove it (it will be picked up later) - log.extend('runOrRetry')( - '[%s:%s] job is too far away, freeing it up', - job.attrs.name, - job.attrs._id - ); - let lockedJobIndex = this.lockedJobs.indexOf(job); - if (lockedJobIndex === -1) { - // lookup by id - lockedJobIndex = this.lockedJobs.findIndex( - j => j.attrs._id?.toString() === job.attrs._id?.toString() - ); - } - if (lockedJobIndex === -1) { - throw new Error(`cannot find job ${job.attrs._id} in locked jobs queue?`); - } - - this.lockedJobs.splice(lockedJobIndex, 1); - this.updateStatus(job.attrs.name, 'locked', -1); - } else { - log.extend('jobProcessing')( - '[%s:%s] nextRunAt is in the future, calling setTimeout(%d)', - job.attrs.name, - job.attrs._id, - runIn - ); - // re add to queue (puts it at the right position in the queue) - this.jobQueue.insert(job); - // ensure every job gets a timer to run at the near future time (but also ensure this time is set only once) - if (!job.gotTimerToExecute) { - job.gotTimerToExecute = true; - setTimeout( - () => { - this.jobProcessing(); - }, - runIn > MAX_SAFE_32BIT_INTEGER ? MAX_SAFE_32BIT_INTEGER : runIn - ); // check if runIn is higher than unsined 32 bit int, if so, use this time to recheck, - // because setTimeout will run in an overflow otherwise and reprocesses immediately - } - } - } - } - - handledJobs.push(job.attrs._id); - - if (job && this.localQueueProcessing < this.maxConcurrency) { - // additionally run again and check if there are more jobs that we can process right now (as long concurrency not reached) - setImmediate(() => this.jobProcessing(handledJobs)); - } - } finally { - this.localQueueProcessing -= 1; - } - } - - /** - * Internal method that tries to run a job and if it fails, retries again! - * @returns {boolean} processed a job or not - */ - private async runOrRetry(job: JobWithId): Promise { - if (!this.isRunning) { - // const a = new Error(); - // console.log('STACK', a.stack); - log.extend('runOrRetry')( - 'JobProcessor got stopped already while calling runOrRetry, returning!' - ); - return; - } - - const jobDefinition = this.agenda.definitions[job.attrs.name]; - const status = this.jobStatus[job.attrs.name]; - - if ( - (!jobDefinition.concurrency || !status || status.running < jobDefinition.concurrency) && - this.runningJobs.length < this.maxConcurrency - ) { - // Add to local "running" queue - this.runningJobs.push(job); - this.updateStatus(job.attrs.name, 'running', 1); - - let jobIsRunning = true; - try { - log.extend('runOrRetry')('[%s:%s] processing job', job.attrs.name, job.attrs._id); - - // check if the job is still alive - const checkIfJobIsStillAlive = () => - // check every "this.agenda.definitions[job.attrs.name].lockLifetime / 2"" (or at mininum every processEvery) - new Promise((resolve, reject) => { - setTimeout(async () => { - // when job is not running anymore, just finish - if (!jobIsRunning) { - log.extend('runOrRetry')( - '[%s:%s] checkIfJobIsStillAlive detected job is not running anymore. stopping check.', - job.attrs.name, - job.attrs._id - ); - resolve(); - return; - } - - if (await job.isExpired()) { - log.extend('runOrRetry')( - '[%s:%s] checkIfJobIsStillAlive detected an expired job, killing it.', - job.attrs.name, - job.attrs._id - ); - - reject( - new Error( - `execution of '${job.attrs.name}' canceled, execution took more than ${ - this.agenda.definitions[job.attrs.name].lockLifetime - }ms. Call touch() for long running jobs to keep them alive.` - ) - ); - return; - } - - if (!job.attrs.lockedAt) { - log.extend('runOrRetry')( - '[%s:%s] checkIfJobIsStillAlive detected a job without a lockedAt value, killing it.', - job.attrs.name, - job.attrs._id - ); - - reject( - new Error( - `execution of '${job.attrs.name}' canceled, no lockedAt date found. Ensure to call touch() for long running jobs to keep them alive.` - ) - ); - return; - } - - resolve(checkIfJobIsStillAlive()); - }, Math.max(this.processEvery / 2, this.agenda.definitions[job.attrs.name].lockLifetime / 2)); - }); - // CALL THE ACTUAL METHOD TO PROCESS THE JOB!!! - await Promise.race([job.run(), checkIfJobIsStillAlive()]); - - log.extend('runOrRetry')( - '[%s:%s] processing job successfull', - job.attrs.name, - job.attrs._id - ); - - // Job isn't in running jobs so throw an error - if (!this.runningJobs.includes(job)) { - log.extend('runOrRetry')( - '[%s] callback was called, job must have been marked as complete already', - job.attrs._id - ); - throw new Error( - `callback already called - job ${job.attrs.name} already marked complete` - ); - } - } catch (error: any) { - job.cancel(error); - log.extend('runOrRetry')( - '[%s:%s] processing job failed', - job.attrs.name, - job.attrs._id, - error - ); - this.agenda.emit('error', error); - } finally { - jobIsRunning = false; - - // Remove the job from the running queue - let runningJobIndex = this.runningJobs.indexOf(job); - if (runningJobIndex === -1) { - // lookup by id - runningJobIndex = this.runningJobs.findIndex( - j => j.attrs._id?.toString() === job.attrs._id?.toString() - ); - } - if (runningJobIndex === -1) { - // eslint-disable-next-line no-unsafe-finally - throw new Error(`cannot find job ${job.attrs._id} in running jobs queue?`); - } - this.runningJobs.splice(runningJobIndex, 1); - this.updateStatus(job.attrs.name, 'running', -1); - - // Remove the job from the locked queue - let lockedJobIndex = this.lockedJobs.indexOf(job); - if (lockedJobIndex === -1) { - // lookup by id - lockedJobIndex = this.lockedJobs.findIndex( - j => j.attrs._id?.toString() === job.attrs._id?.toString() - ); - } - if (lockedJobIndex === -1) { - // eslint-disable-next-line no-unsafe-finally - throw new Error(`cannot find job ${job.attrs._id} in locked jobs queue?`); - } - this.lockedJobs.splice(lockedJobIndex, 1); - this.updateStatus(job.attrs.name, 'locked', -1); - } - - // Re-process jobs now that one has finished - setImmediate(() => this.jobProcessing()); - return; - } - - // Run the job later - log.extend('runOrRetry')( - '[%s:%s] concurrency preventing immediate run, pushing job to top of queue', - job.attrs.name, - job.attrs._id - ); - this.enqueueJob(job); - } - - private updateStatus( - name: string, - key: 'locked' | 'running' | 'lockLimitReached', - number: -1 | 1 - ) { - if (!this.jobStatus[name]) { - this.jobStatus[name] = { - locked: 0, - running: 0 - }; - } - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.jobStatus[name]![key] += number; - } -} diff --git a/src/index.ts b/src/index.ts index fcdf17c..39c186c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,582 +1,555 @@ -import { EventEmitter } from 'events'; -import debug from 'debug'; - -import type { Db, Filter, MongoClientOptions, Sort } from 'mongodb'; -import { SortDirection } from 'mongodb'; -import { ForkOptions } from 'child_process'; -import type { IJobDefinition } from './types/JobDefinition.js'; -import type { IAgendaConfig } from './types/AgendaConfig.js'; -import type { IDatabaseOptions, IDbConfig, IMongoOptions } from './types/DbOptions.js'; -import type { IAgendaStatus } from './types/AgendaStatus.js'; -import type { IJobParameters } from './types/JobParameters.js'; -import { Job, JobWithId } from './Job.js'; -import { JobDbRepository } from './JobDbRepository.js'; -import { JobPriority, parsePriority } from './utils/priority.js'; -import { JobProcessor } from './JobProcessor.js'; -import { calculateProcessEvery } from './utils/processEvery.js'; -import { getCallerFilePath } from './utils/stack.js'; - -const log = debug('agenda'); +import debug from "debug"; +import type { Db, Filter, MongoClientOptions, Sort } from "mongodb"; +import { SortDirection } from "mongodb"; +import { ForkOptions } from "node:child_process"; +import { EventEmitter } from "node:events"; +import type { + IAgendaConfig, + IAgendaStatus, + IDatabaseOptions, + IDbConfig, + IJobDefinition, + IJobParameters, + IMongoOptions, +} from "./interfaces/index"; +import { Job, JobWithId } from "./job"; +import { JobDbRepository } from "./job-db-repository"; +import { JobProcessor } from "./job-processor"; +import { calculateProcessEvery, getCallerFilePath, JobPriority, parsePriority } from "./utils/index"; + +const log = debug("agenda"); const DefaultOptions = { - processEvery: 5000, - defaultConcurrency: 5, - maxConcurrency: 20, - defaultLockLimit: 0, - lockLimit: 0, - defaultLockLifetime: 10 * 60 * 1000, - sort: { nextRunAt: 1, priority: -1 } as const, - forkHelper: { path: 'dist/childWorker.js' } + processEvery: 5000, + defaultConcurrency: 5, + maxConcurrency: 20, + defaultLockLimit: 0, + lockLimit: 0, + defaultLockLifetime: 10 * 60 * 1000, + sort: { nextRunAt: 1, priority: -1 } as const, + forkHelper: { path: "dist/childWorker.js" }, }; /** * @class */ export class Agenda extends EventEmitter { - readonly attrs: IAgendaConfig & IDbConfig; - - public readonly forkedWorker?: boolean; - - public readonly forkHelper?: { - path: string; - options?: ForkOptions; - }; - - db: JobDbRepository; - - // internally used - on(event: 'processJob', listener: (job: JobWithId) => void): this; - - on(event: 'fail', listener: (error: Error, job: JobWithId) => void): this; - on(event: 'success', listener: (job: JobWithId) => void): this; - on(event: 'start', listener: (job: JobWithId) => void): this; - on(event: 'complete', listener: (job: JobWithId) => void): this; - on(event: string, listener: (job: JobWithId) => void): this; - on(event: string, listener: (error: Error, job: JobWithId) => void): this; - on(event: 'ready', listener: () => void): this; - on(event: 'error', listener: (error: Error) => void): this; - on(event: string, listener: (...args) => void): this { - if (this.forkedWorker && event !== 'ready' && event !== 'error') { - const warning = new Error(`calling on(${event}) during a forkedWorker has no effect!`); - console.warn(warning.message, warning.stack); - return this; - } - return super.on(event, listener); - } - - readonly definitions: { - [name: string]: IJobDefinition; - } = {}; - - private jobProcessor?: JobProcessor; - - readonly ready: Promise; - - isActiveJobProcessor(): boolean { - return !!this.jobProcessor; - } - - async getForkedJob(jobId: string) { - const jobData = await this.db.getJobById(jobId); - if (!jobData) { - throw new Error('db entry not found'); - } - const job = new Job(this, jobData); - return job; - } - - async getRunningStats(fullDetails = false): Promise { - if (!this.jobProcessor) { - throw new Error('agenda not running!'); - } - return this.jobProcessor.getStatus(fullDetails); - } - - /** - * @param {Object} config - Agenda Config - * @param {Function} cb - Callback after Agenda has started and connected to mongo - */ - constructor( - config: { - name?: string; - defaultConcurrency?: number; - processEvery?: string | number; - maxConcurrency?: number; - defaultLockLimit?: number; - lockLimit?: number; - defaultLockLifetime?: number; - // eslint-disable-next-line @typescript-eslint/ban-types - } & (IDatabaseOptions | IMongoOptions | {}) & - IDbConfig & { - forkHelper?: { path: string; options?: ForkOptions }; - forkedWorker?: boolean; - } = DefaultOptions, - cb?: (error?: Error) => void - ) { - super(); - - this.attrs = { - name: config.name || '', - processEvery: calculateProcessEvery(config.processEvery) || DefaultOptions.processEvery, - defaultConcurrency: config.defaultConcurrency || DefaultOptions.defaultConcurrency, - maxConcurrency: config.maxConcurrency || DefaultOptions.maxConcurrency, - defaultLockLimit: config.defaultLockLimit || DefaultOptions.defaultLockLimit, - lockLimit: config.lockLimit || DefaultOptions.lockLimit, - defaultLockLifetime: config.defaultLockLifetime || DefaultOptions.defaultLockLifetime, // 10 minute default lockLifetime - sort: config.sort || DefaultOptions.sort - }; - - this.forkedWorker = config.forkedWorker; - this.forkHelper = config.forkHelper; - - this.ready = new Promise(resolve => { - this.once('ready', resolve); - }); - - if (this.hasDatabaseConfig(config)) { - this.db = new JobDbRepository(this, config); - this.db.connect(); - } - - if (cb) { - this.ready.then(() => cb()); - } - } - - /** - * Connect to the spec'd MongoDB server and database. - */ - async database( - address: string, - collection?: string, - options?: MongoClientOptions - ): Promise { - this.db = new JobDbRepository(this, { db: { address, collection, options } }); - await this.db.connect(); - return this; - } - - /** - * Use existing mongo connectino to pass into agenda - * @param mongo - * @param collection - */ - async mongo(mongo: Db, collection?: string): Promise { - this.db = new JobDbRepository(this, { mongo, db: { collection } }); - await this.db.connect(); - return this; - } - - /** - * Set the sort query for finding next job - * Default is { nextRunAt: 1, priority: -1 } - * @param query - */ - sort(query: { [key: string]: SortDirection }): Agenda { - log('Agenda.sort([Object])'); - this.attrs.sort = query; - return this; - } - - private hasDatabaseConfig( - config: unknown - ): config is (IDatabaseOptions | IMongoOptions) & IDbConfig { - return !!((config as IDatabaseOptions)?.db?.address || (config as IMongoOptions)?.mongo); - } - - /** - * Cancels any jobs matching the passed MongoDB query, and removes them from the database. - * @param query - */ - async cancel(query: Filter): Promise { - log('attempting to cancel all Agenda jobs', query); - try { - const amountOfRemovedJobs = await this.db.removeJobs(query); - log('%s jobs cancelled', amountOfRemovedJobs); - return amountOfRemovedJobs; - } catch (error) { - log('error trying to delete jobs from MongoDB'); - throw error; - } - } - - /** - * Set name of queue - * @param name - */ - name(name: string): Agenda { - log('Agenda.name(%s)', name); - this.attrs.name = name; - return this; - } - - /** - * Set the time how often the job processor checks for new jobs to process - * @param time - */ - processEvery(time: string | number): Agenda { - if (this.jobProcessor) { - throw new Error( - 'job processor is already running, you need to set processEvery before calling start' - ); - } - log('Agenda.processEvery(%d)', time); - this.attrs.processEvery = calculateProcessEvery(time); - return this; - } - - /** - * Set the concurrency for jobs (globally), type does not matter - * @param num - */ - maxConcurrency(num: number): Agenda { - log('Agenda.maxConcurrency(%d)', num); - this.attrs.maxConcurrency = num; - return this; - } - - /** - * Set the default concurrency for each job - * @param num number of max concurrency - */ - defaultConcurrency(num: number): Agenda { - log('Agenda.defaultConcurrency(%d)', num); - this.attrs.defaultConcurrency = num; - return this; - } - - /** - * Set the default amount jobs that are allowed to be locked at one time (GLOBAL) - * @param num - */ - lockLimit(num: number): Agenda { - log('Agenda.lockLimit(%d)', num); - this.attrs.lockLimit = num; - return this; - } - - /** - * Set default lock limit per job type - * @param num - */ - defaultLockLimit(num: number): Agenda { - log('Agenda.defaultLockLimit(%d)', num); - this.attrs.defaultLockLimit = num; - return this; - } - - /** - * Set the default lock time (in ms) - * Default is 10 * 60 * 1000 ms (10 minutes) - * @param ms - */ - defaultLockLifetime(ms: number): Agenda { - log('Agenda.defaultLockLifetime(%d)', ms); - this.attrs.defaultLockLifetime = ms; - return this; - } - - /** - * Finds all jobs matching 'query' - * @param query - * @param sort - * @param limit - * @param skip - */ - async jobs( - query: Filter = {}, - sort: Sort = {}, - limit = 0, - skip = 0 - ): Promise { - const result = await this.db.getJobs(query, sort, limit, skip); - - return result.map(job => new Job(this, job)); - } - - /** - * Removes all jobs from queue - * @note: Only use after defining your jobs - */ - async purge(): Promise { - const definedNames = Object.keys(this.definitions); - log('Agenda.purge(%o)', definedNames); - return this.cancel({ name: { $not: { $in: definedNames } } }); - } - - /** - * Setup definition for job - * Method is used by consumers of lib to setup their functions - * BREAKING CHANGE in v4: options moved from 2nd to 3rd parameter! - * @param name - * @param processor - * @param options - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - define( - name: string, - processor: (agendaJob: Job, done: (error?: Error) => void) => void, - options?: Partial> & { - priority?: JobPriority; - } - ): void; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - define( - name: string, - processor: (agendaJob: Job) => Promise, - options?: Partial> & { - priority?: JobPriority; - } - ): void; - define( - name: string, - processor: ((job: Job) => Promise) | ((job: Job, done) => void), - options?: Partial> & { - priority?: JobPriority; - } - ): void { - if (this.definitions[name]) { - log('overwriting already defined agenda job', name); - } - - const filePath = getCallerFilePath(); - - this.definitions[name] = { - fn: processor, - filePath, - concurrency: options?.concurrency || this.attrs.defaultConcurrency, - lockLimit: options?.lockLimit || this.attrs.defaultLockLimit, - priority: parsePriority(options?.priority), - lockLifetime: options?.lockLifetime || this.attrs.defaultLockLifetime - }; - log('job [%s] defined with following options: \n%O', name, this.definitions[name]); - } - - /** - * Internal helper method that uses createJob to create jobs for an array of names - * @param {Number} interval run every X interval - * @param {Array} names Strings of jobs to schedule - * @param {Object} data data to run for job - * @param {Object} options options to run job for - * @returns {Array} array of jobs created - */ - private async createJobs( - names: string[], - createJob: (name: string) => Promise> - ): Promise[]> { - try { - const jobs = await Promise.all(names.map(name => createJob(name))); - - log('createJobs() -> all jobs created successfully'); - - return jobs; - } catch (error) { - log('createJobs() -> error creating one or more of the jobs', error); - throw error; - } - } - - /** - * Given a name and some data, create a new job - * @param name - */ - create(name: string): Job; - create(name: string, data: DATA): Job; - create(name: string, data?: unknown): Job { - log('Agenda.create(%s, [Object])', name); - const priority = this.definitions[name] ? this.definitions[name].priority : 0; - const job = new Job(this, { name, data, type: 'normal', priority }); - return job; - } - - /** - * Creates a scheduled job with given interval and name/names of the job to run - * @param interval - * @param names - * @param data - * @param options - */ - async every( - interval: string | number, - names: string[], - data?: undefined, - options?: { timezone?: string; skipImmediate?: boolean; forkMode?: boolean } - ): Promise[]>; - async every( - interval: string | number, - name: string, - data?: undefined, - options?: { timezone?: string; skipImmediate?: boolean; forkMode?: boolean } - ): Promise>; - async every( - interval: string | number, - names: string[], - data: DATA, - options?: { timezone?: string; skipImmediate?: boolean; forkMode?: boolean } - ): Promise[]>; - async every( - interval: string | number, - name: string, - data: DATA, - options?: { timezone?: string; skipImmediate?: boolean; forkMode?: boolean } - ): Promise>; - async every( - interval: string | number, - names: string | string[], - data?: unknown, - options?: { timezone?: string; skipImmediate?: boolean; forkMode?: boolean } - ): Promise | Job[]> { - /** - * Internal method to setup job that gets run every interval - * @param {Number} interval run every X interval - * @param {String} name String job to schedule - * @param {Object} data data to run for job - * @param {Object} options options to run job for - * @returns {Job} instance of job - */ - log('Agenda.every(%s, %O, %O)', interval, names, options); - - const createJob = async (name: string): Promise => { - const job = this.create(name, data); - job.attrs.type = 'single'; - job.repeatEvery(interval, options); - if (options?.forkMode) { - job.forkMode(options.forkMode); - } - await job.save(); - - return job; - }; - - if (typeof names === 'string') { - const job = await createJob(names); - - return job; - } - - log('Agenda.every(%s, %s, %O)', interval, names, options); - const jobs = await this.createJobs(names, createJob); - - return jobs; - } - - /** - * Schedule a job or jobs at a specific time - * @param when - * @param names - */ - async schedule(when: string | Date, names: string[]): Promise[]>; - async schedule(when: string | Date, names: string): Promise>; - async schedule( - when: string | Date, - names: string[], - data: DATA - ): Promise[]>; - async schedule(when: string | Date, name: string, data: DATA): Promise>; - async schedule( - when: string | Date, - names: string | string[], - data?: unknown - ): Promise { - const createJob = async (name: string) => { - const job = this.create(name, data); - - await job.schedule(when).save(); - - return job; - }; - - if (typeof names === 'string') { - log('Agenda.schedule(%s, %O, [%O])', when, names); - return createJob(names); - } - - log('Agenda.schedule(%s, %O, [%O])', when, names); - return this.createJobs(names, createJob); - } - - /** - * Create a job for this exact moment - * @param name - */ - async now(name: string): Promise>; - async now(name: string, data: DATA): Promise>; - async now(name: string, data?: DATA): Promise> { - log('Agenda.now(%s, [Object])', name); - try { - const job = this.create(name, data); - - job.schedule(new Date()); - await job.save(); - - return job as Job; - } catch (error) { - log('error trying to create a job for this exact moment'); - throw error; - } - } - - /** - * Starts processing jobs using processJobs() methods, storing an interval ID - * This method will only resolve if a db has been set up beforehand. - */ - async start(): Promise { - log( - 'Agenda.start called, waiting for agenda to be initialized (db connection)', - this.attrs.processEvery - ); - await this.ready; - if (this.jobProcessor) { - log('Agenda.start was already called, ignoring'); - return; - } - - this.jobProcessor = new JobProcessor( - this, - this.attrs.maxConcurrency, - this.attrs.lockLimit, - this.attrs.processEvery - ); - - this.on('processJob', this.jobProcessor.process.bind(this.jobProcessor)); - } - - /** - * Clear the interval that processes the jobs and unlocks all currently locked jobs - */ - async stop(): Promise { - if (!this.jobProcessor) { - log('Agenda.stop called, but agenda has never started!'); - return; - } - - log('Agenda.stop called, clearing interval for processJobs()'); - - const lockedJobs = this.jobProcessor.stop(); - - log('Agenda._unlockJobs()'); - - lockedJobs?.forEach(job => job.cancel(new Error('agenda stopped'))); - - const jobIds = lockedJobs?.map(job => job.attrs._id) || []; - - if (jobIds.length > 0) { - log('about to unlock jobs with ids: %O', jobIds); - await this.db.unlockJobs(jobIds); - } - - this.off('processJob', this.jobProcessor.process.bind(this.jobProcessor)); - - this.jobProcessor = undefined; - } + readonly attrs: IAgendaConfig & IDbConfig; + + public readonly forkedWorker?: boolean; + + public readonly forkHelper?: { + path: string; + options?: ForkOptions; + }; + + db!: JobDbRepository; + + // internally used + on(event: "processJob", listener: (job: JobWithId) => void): this; + + on(event: "fail", listener: (error: Error, job: JobWithId) => void): this; + on(event: "success", listener: (job: JobWithId) => void): this; + on(event: "start", listener: (job: JobWithId) => void): this; + on(event: "complete", listener: (job: JobWithId) => void): this; + on(event: string, listener: (job: JobWithId) => void): this; + on(event: string, listener: (error: Error, job: JobWithId) => void): this; + on(event: "ready", listener: () => void): this; + on(event: "error", listener: (error: Error) => void): this; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + on(event: string, listener: (...args: any[]) => void): this { + if (this.forkedWorker && event !== "ready" && event !== "error") { + const warning = new Error(`calling on(${event}) during a forkedWorker has no effect!`); + console.warn(warning.message, warning.stack); + return this; + } + return super.on(event, listener); + } + + readonly definitions: { + [name: string]: IJobDefinition; + } = {}; + + private jobProcessor?: JobProcessor; + + readonly ready: Promise; + + isActiveJobProcessor(): boolean { + return !!this.jobProcessor; + } + + async getForkedJob(jobId: string) { + const jobData = await this.db.getJobById(jobId); + if (!jobData) { + throw new Error("db entry not found"); + } + const job = new Job(this, jobData); + return job; + } + + async getRunningStats(fullDetails = false): Promise { + if (!this.jobProcessor) { + throw new Error("agenda not running!"); + } + return this.jobProcessor.getStatus(fullDetails); + } + + /** + * @param {Object} config - Agenda Config + * @param {Function} cb - Callback after Agenda has started and connected to mongo + */ + constructor( + config: { + name?: string; + defaultConcurrency?: number; + processEvery?: string | number; + maxConcurrency?: number; + defaultLockLimit?: number; + lockLimit?: number; + defaultLockLifetime?: number; + } & (IDatabaseOptions | IMongoOptions | object) & + IDbConfig & { + forkHelper?: { path: string; options?: ForkOptions }; + forkedWorker?: boolean; + } = DefaultOptions, + cb?: (error?: Error) => void + ) { + super(); + + this.attrs = { + name: config.name || "", + processEvery: calculateProcessEvery(config.processEvery) || DefaultOptions.processEvery, + defaultConcurrency: config.defaultConcurrency || DefaultOptions.defaultConcurrency, + maxConcurrency: config.maxConcurrency || DefaultOptions.maxConcurrency, + defaultLockLimit: config.defaultLockLimit || DefaultOptions.defaultLockLimit, + lockLimit: config.lockLimit || DefaultOptions.lockLimit, + defaultLockLifetime: config.defaultLockLifetime || DefaultOptions.defaultLockLifetime, // 10 minute default lockLifetime + sort: config.sort || DefaultOptions.sort, + }; + + this.forkedWorker = config.forkedWorker; + this.forkHelper = config.forkHelper; + + this.ready = new Promise((resolve) => { + this.once("ready", resolve); + }); + + if (this.hasDatabaseConfig(config)) { + this.db = new JobDbRepository(this, config); + this.db.connect(); + } + + if (cb) { + this.ready.then(() => cb()); + } + } + + /** + * Connect to the spec'd MongoDB server and database. + */ + async database(address: string, collection?: string, options?: MongoClientOptions): Promise { + this.db = new JobDbRepository(this, { db: { address, collection, options } }); + await this.db.connect(); + return this; + } + + /** + * Use existing mongo connectino to pass into agenda + * @param mongo + * @param collection + */ + async mongo(mongo: Db, collection?: string): Promise { + this.db = new JobDbRepository(this, { mongo, db: { collection } }); + await this.db.connect(); + return this; + } + + /** + * Set the sort query for finding next job + * Default is { nextRunAt: 1, priority: -1 } + * @param query + */ + sort(query: { [key: string]: SortDirection }): Agenda { + log("Agenda.sort([Object])"); + this.attrs.sort = query; + return this; + } + + private hasDatabaseConfig(config: unknown): config is (IDatabaseOptions | IMongoOptions) & IDbConfig { + return !!((config as IDatabaseOptions)?.db?.address || (config as IMongoOptions)?.mongo); + } + + /** + * Cancels any jobs matching the passed MongoDB query, and removes them from the database. + * @param query + */ + async cancel(query: Filter): Promise { + log("attempting to cancel all Agenda jobs", query); + try { + const amountOfRemovedJobs = await this.db.removeJobs(query); + log("%s jobs cancelled", amountOfRemovedJobs); + return amountOfRemovedJobs; + } catch (error) { + log("error trying to delete jobs from MongoDB"); + throw error; + } + } + + /** + * Set name of queue + * @param name + */ + name(name: string): Agenda { + log("Agenda.name(%s)", name); + this.attrs.name = name; + return this; + } + + /** + * Set the time how often the job processor checks for new jobs to process + * @param time + */ + processEvery(time: string | number): Agenda { + if (this.jobProcessor) { + throw new Error("job processor is already running, you need to set processEvery before calling start"); + } + log("Agenda.processEvery(%d)", time); + this.attrs.processEvery = calculateProcessEvery(time); + return this; + } + + /** + * Set the concurrency for jobs (globally), type does not matter + * @param num + */ + maxConcurrency(num: number): Agenda { + log("Agenda.maxConcurrency(%d)", num); + this.attrs.maxConcurrency = num; + return this; + } + + /** + * Set the default concurrency for each job + * @param num number of max concurrency + */ + defaultConcurrency(num: number): Agenda { + log("Agenda.defaultConcurrency(%d)", num); + this.attrs.defaultConcurrency = num; + return this; + } + + /** + * Set the default amount jobs that are allowed to be locked at one time (GLOBAL) + * @param num + */ + lockLimit(num: number): Agenda { + log("Agenda.lockLimit(%d)", num); + this.attrs.lockLimit = num; + return this; + } + + /** + * Set default lock limit per job type + * @param num + */ + defaultLockLimit(num: number): Agenda { + log("Agenda.defaultLockLimit(%d)", num); + this.attrs.defaultLockLimit = num; + return this; + } + + /** + * Set the default lock time (in ms) + * Default is 10 * 60 * 1000 ms (10 minutes) + * @param ms + */ + defaultLockLifetime(ms: number): Agenda { + log("Agenda.defaultLockLifetime(%d)", ms); + this.attrs.defaultLockLifetime = ms; + return this; + } + + /** + * Finds all jobs matching 'query' + * @param query + * @param sort + * @param limit + * @param skip + */ + async jobs(query: Filter = {}, sort: Sort = {}, limit = 0, skip = 0): Promise { + const result = await this.db.getJobs(query, sort, limit, skip); + + return result.map((job) => new Job(this, job)); + } + + /** + * Removes all jobs from queue + * @note: Only use after defining your jobs + */ + async purge(): Promise { + const definedNames = Object.keys(this.definitions); + log("Agenda.purge(%o)", definedNames); + return this.cancel({ name: { $not: { $in: definedNames } } }); + } + + /** + * Setup definition for job + * Method is used by consumers of lib to setup their functions + * BREAKING CHANGE in v4: options moved from 2nd to 3rd parameter! + * @param name + * @param processor + * @param options + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + define( + name: string, + processor: (agendaJob: Job, done: (error?: Error) => void) => void, + options?: Partial> & { + priority?: JobPriority; + } + ): void; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + define( + name: string, + processor: (agendaJob: Job) => Promise, + options?: Partial> & { + priority?: JobPriority; + } + ): void; + define( + name: string, + processor: ((job: Job) => Promise) | ((job: Job, done: (error?: Error) => void) => void), + options?: Partial> & { + priority?: JobPriority; + } + ): void { + if (this.definitions[name]) { + log("overwriting already defined agenda job", name); + } + + const filePath = getCallerFilePath(); + + this.definitions[name] = { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + fn: processor as any, + filePath, + concurrency: options?.concurrency || this.attrs.defaultConcurrency, + lockLimit: options?.lockLimit || this.attrs.defaultLockLimit, + priority: parsePriority(options?.priority), + lockLifetime: options?.lockLifetime || this.attrs.defaultLockLifetime, + }; + log("job [%s] defined with following options: \n%O", name, this.definitions[name]); + } + + /** + * Internal helper method that uses createJob to create jobs for an array of names + * @param {Number} interval run every X interval + * @param {Array} names Strings of jobs to schedule + * @param {Object} data data to run for job + * @param {Object} options options to run job for + * @returns {Array} array of jobs created + */ + private async createJobs( + names: string[], + createJob: (name: string) => Promise> + ): Promise[]> { + try { + const jobs = await Promise.all(names.map((name) => createJob(name))); + + log("createJobs() -> all jobs created successfully"); + + return jobs; + } catch (error) { + log("createJobs() -> error creating one or more of the jobs", error); + throw error; + } + } + + /** + * Given a name and some data, create a new job + * @param name + */ + create(name: string): Job; + create(name: string, data: DATA): Job; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + create(name: string, data?: unknown): Job { + log("Agenda.create(%s, [Object])", name); + const priority = this.definitions[name] ? this.definitions[name].priority : 0; + const job = new Job(this, { name, data, type: "normal", priority }); + return job; + } + + /** + * Creates a scheduled job with given interval and name/names of the job to run + * @param interval + * @param names + * @param data + * @param options + */ + async every( + interval: string | number, + names: string[], + data?: undefined, + options?: { timezone?: string; skipImmediate?: boolean; forkMode?: boolean } + ): Promise[]>; + async every( + interval: string | number, + name: string, + data?: undefined, + options?: { timezone?: string; skipImmediate?: boolean; forkMode?: boolean } + ): Promise>; + async every( + interval: string | number, + names: string[], + data: DATA, + options?: { timezone?: string; skipImmediate?: boolean; forkMode?: boolean } + ): Promise[]>; + async every( + interval: string | number, + name: string, + data: DATA, + options?: { timezone?: string; skipImmediate?: boolean; forkMode?: boolean } + ): Promise>; + async every( + interval: string | number, + names: string | string[], + data?: unknown, + options?: { timezone?: string; skipImmediate?: boolean; forkMode?: boolean } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ): Promise | Job[]> { + /** + * Internal method to setup job that gets run every interval + * @param {Number} interval run every X interval + * @param {String} name String job to schedule + * @param {Object} data data to run for job + * @param {Object} options options to run job for + * @returns {Job} instance of job + */ + log("Agenda.every(%s, %O, %O)", interval, names, options); + + const createJob = async (name: string): Promise => { + const job = this.create(name, data); + job.attrs.type = "single"; + job.repeatEvery(interval, options); + if (options?.forkMode) { + job.forkMode(options.forkMode); + } + await job.save(); + + return job; + }; + + if (typeof names === "string") { + const job = await createJob(names); + + return job; + } + + log("Agenda.every(%s, %s, %O)", interval, names, options); + const jobs = await this.createJobs(names, createJob); + + return jobs; + } + + /** + * Schedule a job or jobs at a specific time + * @param when + * @param names + */ + async schedule(when: string | Date, names: string[]): Promise[]>; + async schedule(when: string | Date, names: string): Promise>; + async schedule(when: string | Date, names: string[], data: DATA): Promise[]>; + async schedule(when: string | Date, name: string, data: DATA): Promise>; + async schedule(when: string | Date, names: string | string[], data?: unknown): Promise { + const createJob = async (name: string) => { + const job = this.create(name, data); + + await job.schedule(when).save(); + + return job; + }; + + if (typeof names === "string") { + log("Agenda.schedule(%s, %O, [%O])", when, names); + return createJob(names); + } + + log("Agenda.schedule(%s, %O, [%O])", when, names); + return this.createJobs(names, createJob); + } + + /** + * Create a job for this exact moment + * @param name + */ + async now(name: string): Promise>; + async now(name: string, data: DATA): Promise>; + async now(name: string, data?: DATA): Promise> { + log("Agenda.now(%s, [Object])", name); + try { + const job = this.create(name, data); + + job.schedule(new Date()); + await job.save(); + + return job as Job; + } catch (error) { + log("error trying to create a job for this exact moment"); + throw error; + } + } + + /** + * Starts processing jobs using processJobs() methods, storing an interval ID + * This method will only resolve if a db has been set up beforehand. + */ + async start(): Promise { + log("Agenda.start called, waiting for agenda to be initialized (db connection)", this.attrs.processEvery); + await this.ready; + if (this.jobProcessor) { + log("Agenda.start was already called, ignoring"); + return; + } + + this.jobProcessor = new JobProcessor( + this, + this.attrs.maxConcurrency, + this.attrs.lockLimit, + this.attrs.processEvery + ); + + this.on("processJob", this.jobProcessor.process.bind(this.jobProcessor)); + } + + /** + * Clear the interval that processes the jobs and unlocks all currently locked jobs + */ + async stop(): Promise { + if (!this.jobProcessor) { + log("Agenda.stop called, but agenda has never started!"); + return; + } + + log("Agenda.stop called, clearing interval for processJobs()"); + + const lockedJobs = this.jobProcessor.stop(); + + log("Agenda._unlockJobs()"); + + lockedJobs?.forEach((job) => job.cancel(new Error("agenda stopped"))); + + const jobIds = lockedJobs?.map((job) => job.attrs._id) || []; + + if (jobIds.length > 0) { + log("about to unlock jobs with ids: %O", jobIds); + await this.db.unlockJobs(jobIds); + } + + this.off("processJob", this.jobProcessor.process.bind(this.jobProcessor)); + + this.jobProcessor = undefined; + } } -export * from './types/AgendaConfig.js'; - -export * from './types/JobDefinition.js'; - -export * from './types/JobParameters.js'; - -export * from './types/DbOptions.js'; - -export * from './Job.js'; +export * from "./interfaces/index"; +export * from "./job"; diff --git a/src/interfaces/agenda-config.ts b/src/interfaces/agenda-config.ts new file mode 100644 index 0000000..5b06946 --- /dev/null +++ b/src/interfaces/agenda-config.ts @@ -0,0 +1,9 @@ +export interface IAgendaConfig { + name?: string; + defaultConcurrency: number; + processEvery: number; + maxConcurrency: number; + defaultLockLimit: number; + lockLimit: number; + defaultLockLifetime: number; +} diff --git a/src/interfaces/agenda-status.ts b/src/interfaces/agenda-status.ts new file mode 100644 index 0000000..877e4b5 --- /dev/null +++ b/src/interfaces/agenda-status.ts @@ -0,0 +1,31 @@ +import type { IJobDefinition } from "./job-definition"; +import type { IJobParameters } from "./job-parameters"; + +export interface IAgendaJobStatus { + [name: string]: { + running: number; + locked: number; + config: IJobDefinition; + }; +} + +export interface IAgendaStatus { + version: string; + queueName: string | undefined; + totalQueueSizeDB: number; + config: { + totalLockLimit: number; + maxConcurrency: number; + processEvery: string | number; + }; + internal: { + localQueueProcessing: number; + localLockLimitReached: number; + }; + jobStatus?: IAgendaJobStatus; + queuedJobs: number | IJobParameters[]; + runningJobs: number | IJobParameters[]; + lockedJobs: number | IJobParameters[]; + jobsToLock: number | IJobParameters[]; + isLockingOnTheFly: boolean; +} diff --git a/src/interfaces/db-options.ts b/src/interfaces/db-options.ts new file mode 100644 index 0000000..b171207 --- /dev/null +++ b/src/interfaces/db-options.ts @@ -0,0 +1,23 @@ +import type { Db, MongoClientOptions, SortDirection } from "mongodb"; + +export interface IDatabaseOptions { + db: { + collection?: string; + address: string; + options?: MongoClientOptions; + }; +} + +export interface IMongoOptions { + db?: { + collection?: string; + }; + mongo: Db; +} + +export interface IDbConfig { + ensureIndex?: boolean; + sort?: { + [key: string]: SortDirection; + }; +} diff --git a/src/interfaces/index.ts b/src/interfaces/index.ts new file mode 100644 index 0000000..532c4fd --- /dev/null +++ b/src/interfaces/index.ts @@ -0,0 +1,5 @@ +export * from "./agenda-config"; +export * from "./agenda-status"; +export * from "./db-options"; +export * from "./job-definition"; +export * from "./job-parameters"; diff --git a/src/interfaces/job-definition.ts b/src/interfaces/job-definition.ts new file mode 100644 index 0000000..bdc1285 --- /dev/null +++ b/src/interfaces/job-definition.ts @@ -0,0 +1,16 @@ +import type { Job } from "../job"; + +export interface IJobDefinition { + /** max number of locked jobs of this kind */ + lockLimit: number; + /** lock lifetime in milliseconds */ + lockLifetime: number; + /** Higher priority jobs will run first. */ + priority?: number; + /** how many jobs of this kind can run in parallel/simultanously per Agenda instance */ + concurrency?: number; + filePath: string | undefined; + fn: DefinitionProcessor void)>; +} + +export type DefinitionProcessor = (agendaJob: Job, done: CB) => CB extends void ? Promise : void; diff --git a/src/interfaces/job-parameters.ts b/src/interfaces/job-parameters.ts new file mode 100644 index 0000000..a7c8b8b --- /dev/null +++ b/src/interfaces/job-parameters.ts @@ -0,0 +1,40 @@ +import { Filter, ObjectId } from "mongodb"; + +export interface IJobParameters { + _id?: ObjectId; + name: string; + priority: number; + nextRunAt: Date | null; + /** + * normal: job is queued and will be processed (regular case when the user adds a new job) + * single: job with this name is only queued once, if there is an exisitn gentry in the database, the job is just updated, but not newly inserted (this is used for .every()) + */ + type: "normal" | "single"; + lockedAt?: Date; + lastFinishedAt?: Date; + failedAt?: Date; + failCount?: number; + failReason?: string; + repeatTimezone?: string; + lastRunAt?: Date; + repeatInterval?: string | number; + data: DATA; + repeatAt?: string; + disabled?: boolean; + progress?: number; + // unique query object + unique?: Filter, "unique">>; + uniqueOpts?: { + insertOnly: boolean; + }; + lastModifiedBy?: string; + /** forks a new node sub process for executing this job */ + fork?: boolean; +} + +export type TJobDatefield = keyof Pick< + IJobParameters, + "lastRunAt" | "lastFinishedAt" | "nextRunAt" | "failedAt" | "lockedAt" +>; + +export const datefields: Array = ["lastRunAt", "lastFinishedAt", "nextRunAt", "failedAt", "lockedAt"]; diff --git a/src/job-db-repository.ts b/src/job-db-repository.ts new file mode 100644 index 0000000..aa3f7f2 --- /dev/null +++ b/src/job-db-repository.ts @@ -0,0 +1,367 @@ +import debug from "debug"; +import { Collection, Db, Filter, MongoClient, MongoClientOptions, ObjectId, Sort, UpdateFilter } from "mongodb"; +import type { Agenda } from "./index"; +import type { IDatabaseOptions, IDbConfig, IJobParameters, IMongoOptions } from "./interfaces/index"; +import type { Job, JobWithId } from "./job"; +import { hasMongoProtocol } from "./utils/index"; + +const log = debug("agenda:db"); + +/** + * @class + */ +export class JobDbRepository { + public collection!: Collection; + + constructor( + private agenda: Agenda, + private connectOptions: (IDatabaseOptions | IMongoOptions) & IDbConfig + ) { + this.connectOptions.sort = this.connectOptions.sort || { nextRunAt: 1, priority: -1 }; + } + + private async createConnection(): Promise { + const { connectOptions } = this; + if (this.hasDatabaseConfig(connectOptions)) { + log("using database config", connectOptions); + return this.database(connectOptions.db.address, connectOptions.db.options); + } + + if (this.hasMongoConnection(connectOptions)) { + log("using passed in mongo connection"); + return connectOptions.mongo; + } + + throw new Error("invalid db config, or db config not found"); + } + + private hasMongoConnection(connectOptions: unknown): connectOptions is IMongoOptions { + return !!(connectOptions as IMongoOptions)?.mongo; + } + + private hasDatabaseConfig(connectOptions: unknown): connectOptions is IDatabaseOptions { + return !!(connectOptions as IDatabaseOptions)?.db?.address; + } + + async getJobById(id: string) { + return this.collection.findOne({ _id: new ObjectId(id) }); + } + + async getJobs(query: Filter, sort: Sort = {}, limit = 0, skip = 0): Promise { + return this.collection.find(query).sort(sort).limit(limit).skip(skip).toArray(); + } + + async removeJobs(query: Filter): Promise { + const result = await this.collection.deleteMany(query); + return result.deletedCount || 0; + } + + async getQueueSize(): Promise { + return this.collection.countDocuments({ nextRunAt: { $lt: new Date() } }); + } + + async unlockJob(job: Job): Promise { + // only unlock jobs which are not currently processed (nextRunAT is not null) + await this.collection.updateOne({ _id: job.attrs._id, nextRunAt: { $ne: null } }, { $unset: { lockedAt: true } }); + } + + /** + * Internal method to unlock jobs so that they can be re-run + */ + async unlockJobs(jobIds: ObjectId[]): Promise { + await this.collection.updateMany( + { _id: { $in: jobIds }, nextRunAt: { $ne: null } }, + { $unset: { lockedAt: true } } + ); + } + + async lockJob(job: JobWithId): Promise { + // Query to run against collection to see if we need to lock it + const criteria: Filter & { lockedAt?: Date | null }> = { + _id: job.attrs._id, + name: job.attrs.name, + lockedAt: null, + nextRunAt: job.attrs.nextRunAt, + disabled: { $ne: true }, + }; + + // Update / options for the MongoDB query + const update: UpdateFilter = { $set: { lockedAt: new Date() } }; + + // Lock the job in MongoDB! + const resp = (await this.collection.findOneAndUpdate(criteria as Filter, update, { + returnDocument: "after", + sort: this.connectOptions.sort, + includeResultMetadata: true, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + })) as any; + + return resp?.value || undefined; + } + + async getNextJobToRun( + jobName: string, + nextScanAt: Date, + lockDeadline: Date, + now: Date = new Date() + ): Promise { + /** + * Query used to find job to run + */ + const JOB_PROCESS_WHERE_QUERY: Filter & { lockedAt?: Date | null } */> = + { + name: jobName, + disabled: { $ne: true }, + $or: [ + { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + lockedAt: { $eq: null as any }, + nextRunAt: { $lte: nextScanAt }, + }, + { + lockedAt: { $lte: lockDeadline }, + }, + ], + }; + + /** + * Query used to set a job as locked + */ + const JOB_PROCESS_SET_QUERY: UpdateFilter = { $set: { lockedAt: now } }; + + // Find ONE and ONLY ONE job and set the 'lockedAt' time so that job begins to be processed + const result = (await this.collection.findOneAndUpdate(JOB_PROCESS_WHERE_QUERY, JOB_PROCESS_SET_QUERY, { + returnDocument: "after", + sort: this.connectOptions.sort, + includeResultMetadata: true, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + })) as any; + + return result.value || undefined; + } + + async connect(): Promise { + const db = await this.createConnection(); + log("successful connection to MongoDB", db.options); + + const collection = this.connectOptions.db?.collection || "agendaJobs"; + + this.collection = db.collection(collection); + if (log.enabled) { + log( + `connected with collection: ${collection}, collection size: ${ + typeof this.collection.estimatedDocumentCount === "function" + ? await this.collection.estimatedDocumentCount() + : "?" + }` + ); + } + + if (this.connectOptions.ensureIndex) { + log("attempting index creation"); + try { + const result = await this.collection.createIndex( + { + name: 1, + ...this.connectOptions.sort, + priority: -1, + lockedAt: 1, + nextRunAt: 1, + disabled: 1, + }, + { name: "findAndLockNextJobIndex" } + ); + log("index succesfully created", result); + } catch (error) { + log("db index creation failed", error); + throw error; + } + } + + this.agenda.emit("ready"); + } + + private async database(url: string, options?: MongoClientOptions) { + let connectionString = url; + + if (!hasMongoProtocol(connectionString)) { + connectionString = `mongodb://${connectionString}`; + } + + const client = await MongoClient.connect(connectionString, { + ...options, + }); + + return client.db(); + } + + private processDbResult(job: Job, res?: IJobParameters): Job { + log("processDbResult() called with success, checking whether to process job immediately or not"); + + // We have a result from the above calls + if (res) { + // Grab ID and nextRunAt from MongoDB and store it as an attribute on Job + job.attrs._id = res._id; + job.attrs.nextRunAt = res.nextRunAt; + + // check if we should process the job immediately + this.agenda.emit("processJob", job); + } + + // Return the Job instance + return job; + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + async saveJobState(job: Job): Promise { + const id = job.attrs._id; + const $set = { + lockedAt: (job.attrs.lockedAt && new Date(job.attrs.lockedAt)) || undefined, + nextRunAt: (job.attrs.nextRunAt && new Date(job.attrs.nextRunAt)) || undefined, + lastRunAt: (job.attrs.lastRunAt && new Date(job.attrs.lastRunAt)) || undefined, + progress: job.attrs.progress, + failReason: job.attrs.failReason, + failCount: job.attrs.failCount, + failedAt: job.attrs.failedAt && new Date(job.attrs.failedAt), + lastFinishedAt: (job.attrs.lastFinishedAt && new Date(job.attrs.lastFinishedAt)) || undefined, + }; + + log("[job %s] save job state: \n%O", id, $set); + + const result = await this.collection.updateOne( + { _id: id, name: job.attrs.name }, + { + $set, + } + ); + + if (!result.acknowledged || result.matchedCount !== 1) { + throw new Error( + `job ${id} (name: ${job.attrs.name}) cannot be updated in the database, maybe it does not exist anymore?` + ); + } + } + + /** + * Save the properties on a job to MongoDB + * @name Agenda#saveJob + * @function + * @param {Job} job job to save into MongoDB + * @returns {Promise} resolves when job is saved or errors + */ + async saveJob(job: Job): Promise> { + try { + log("attempting to save a job"); + + // Grab information needed to save job but that we don't want to persist in MongoDB + const id = job.attrs._id; + + // Store job as JSON and remove props we don't want to store from object + // _id, unique, uniqueOpts + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { _id, unique, uniqueOpts, ...props } = { + ...job.toJson(), + // Store name of agenda queue as last modifier in job data + lastModifiedBy: this.agenda.attrs.name, + }; + + log("[job %s] set job props: \n%O", id, props); + + // Grab current time and set default query options for MongoDB + const now = new Date(); + const protect: Partial = {}; + let update: UpdateFilter = { $set: props }; + log("current time stored as %s", now.toISOString()); + + // If the job already had an ID, then update the properties of the job + // i.e, who last modified it, etc + if (id) { + // Update the job and process the resulting data' + log("job already has _id, calling findOneAndUpdate() using _id as query"); + const result = (await this.collection.findOneAndUpdate({ _id: id, name: props.name }, update, { + returnDocument: "after", + includeResultMetadata: true, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + })) as any; + return this.processDbResult(job, result.value as IJobParameters); + } + + if (props.type === "single") { + // Job type set to 'single' so... + log('job with type of "single" found'); + + // If the nextRunAt time is older than the current time, "protect" that property, meaning, don't change + // a scheduled job's next run time! + if (props.nextRunAt && props.nextRunAt <= now) { + log("job has a scheduled nextRunAt time, protecting that field from upsert"); + protect.nextRunAt = props.nextRunAt; + delete (props as Partial).nextRunAt; + } + + // If we have things to protect, set them in MongoDB using $setOnInsert + if (Object.keys(protect).length > 0) { + update.$setOnInsert = protect; + } + + // Try an upsert + log( + `calling findOneAndUpdate(${props.name}) with job name and type of "single" as query`, + await this.collection.findOne({ + name: props.name, + type: "single", + }) + ); + // this call ensure a job of this name can only exists once + const result = (await this.collection.findOneAndUpdate( + { + name: props.name, + type: "single", + }, + update, + { + upsert: true, + returnDocument: "after", + includeResultMetadata: true, + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + )) as any; + log( + `findOneAndUpdate(${props.name}) with type "single" ${ + result.lastErrorObject?.updatedExisting ? "updated existing entry" : "inserted new entry" + }` + ); + return this.processDbResult(job, result.value as IJobParameters); + } + + if (job.attrs.unique) { + // If we want the job to be unique, then we can upsert based on the 'unique' query object that was passed in + const query: Filter, "unique">> = job.attrs.unique; + query.name = props.name; + if (job.attrs.uniqueOpts?.insertOnly) { + update = { $setOnInsert: props }; + } + + // Use the 'unique' query object to find an existing job or create a new one + log("calling findOneAndUpdate() with unique object as query: \n%O", query); + const result = (await this.collection.findOneAndUpdate(query as IJobParameters, update, { + upsert: true, + returnDocument: "after", + includeResultMetadata: true, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + })) as any; + return this.processDbResult(job, result.value as IJobParameters); + } + + // If all else fails, the job does not exist yet so we just insert it into MongoDB + log("using default behavior, inserting new job via insertOne() with props that were set: \n%O", props); + const result = await this.collection.insertOne(props); + return this.processDbResult(job, { + _id: result.insertedId, + ...props, + } as IJobParameters); + } catch (error) { + log("processDbResult() received an error, job was not updated/created"); + throw error; + } + } +} diff --git a/src/job-processing-queue.ts b/src/job-processing-queue.ts new file mode 100644 index 0000000..09edd1f --- /dev/null +++ b/src/job-processing-queue.ts @@ -0,0 +1,126 @@ +import type { Agenda } from "./index"; +import type { IJobParameters } from "./interfaces/index"; +import type { Job, JobWithId } from "./job"; + +/** + * @class + */ +export class JobProcessingQueue { + private _queue: Job[]; + + constructor(private agenda: Agenda) { + this._queue = []; + } + + get length(): number { + return this._queue.length; + } + + getQueue(): Job[] { + return this._queue; + } + + /** + * Pops and returns last queue element (next job to be processed) without checking concurrency. + * @returns {Job} Next Job to be processed + */ + pop(): Job | undefined { + return this._queue.pop(); + } + + /** + * Inserts job in first queue position + * @param {Job} job job to add to queue + * @returns {undefined} + */ + /* + push(job: Job): void { + this._queue.push(job); + } */ + + remove(job: Job): void { + let removeJobIndex = this._queue.indexOf(job); + if (removeJobIndex === -1) { + // lookup by id + removeJobIndex = this._queue.findIndex((j) => j.attrs._id?.toString() === job.attrs._id?.toString()); + } + if (removeJobIndex === -1) { + throw new Error(`cannot find job ${job.attrs._id} in processing queue?`); + } + + this._queue.splice(removeJobIndex, 1); + } + + /** + * Inserts job in queue where it will be order from left to right in decreasing + * order of nextRunAt and priority (in case of same nextRunAt), if all values + * are even the first jobs to be introduced will have priority + * @param {Job} job job to add to queue + * @returns {undefined} + */ + insert(job: Job): void { + const matchIndex = this._queue.findIndex((element) => { + if ( + element.attrs.nextRunAt && + job.attrs.nextRunAt && + element.attrs.nextRunAt.getTime() <= job.attrs.nextRunAt.getTime() + ) { + if (element.attrs.nextRunAt.getTime() === job.attrs.nextRunAt.getTime()) { + if (element.attrs.priority >= job.attrs.priority) { + return true; + } + } else { + return true; + } + } + + return false; + }); + + if (matchIndex === -1) { + // put on left side of the queue + this._queue.unshift(job); + } else { + this._queue.splice(matchIndex, 0, job); + } + } + + /** + * Returns (does not pop, element remains in queue) first element (always from the right) + * that can be processed (not blocked by concurrency execution) + * @param {Object} jobStatus current status of jobs + * @returns {Job} Next Job to be processed + */ + returnNextConcurrencyFreeJob( + jobStatus: { + [jobName: string]: + | { + running: number; + } + | undefined; + }, + handledJobs: IJobParameters["_id"][] + ): (JobWithId & { attrs: IJobParameters & { nextRunAt?: Date | null } }) | undefined { + const next = (Object.keys(this._queue) as unknown as number[]).reverse().find((i) => { + const def = this.agenda.definitions[this._queue[i].attrs.name]; + const status = jobStatus[this._queue[i].attrs.name]; + + // check if we have a definition + // if there is no status available, we are good to go + // if there is no max concurrency defined (0), we are also good to go + // and if concurrency limit is not reached yet (actual running jobs is lower than max concurrency) + if ( + def && + !handledJobs.includes(this._queue[i].attrs._id) && + (!status || !def.concurrency || status.running < def.concurrency) + ) { + return true; + } + return false; + }); + + return next !== undefined + ? (this._queue[next] as JobWithId & { attrs: IJobParameters & { nextRunAt: Date } }) + : undefined; + } +} diff --git a/src/job-processor.ts b/src/job-processor.ts new file mode 100644 index 0000000..5bf3277 --- /dev/null +++ b/src/job-processor.ts @@ -0,0 +1,610 @@ +import debug from "debug"; +import { version as agendaVersion } from "../package.json"; +import type { Agenda, JobWithId } from "./index"; +import type { IAgendaJobStatus, IAgendaStatus, IJobDefinition, IJobParameters } from "./interfaces/index"; +import { Job } from "./job"; +import { JobProcessingQueue } from "./job-processing-queue"; + +const log = debug("agenda:jobProcessor"); + +const MAX_SAFE_32BIT_INTEGER = 2 ** 31; // Math.pow(2,31); + +/** + * @class + * Process methods for jobs + */ +export class JobProcessor { + private jobStatus: { + [name: string]: { running: number; locked: number; lockLimitReached?: number } | undefined; + } = {}; + + private localQueueProcessing = 0; + + private localLockLimitReached = 0; + + async getStatus(fullDetails = false): Promise { + const jobStatus = Object.keys(this.agenda.definitions).reduce((obj, key) => { + obj[key] = { + ...this.jobStatus[key]!, + config: this.agenda.definitions[key], + }; + return obj; + }, {} as IAgendaJobStatus); + + return { + version: agendaVersion, + queueName: this.agenda.attrs.name, + totalQueueSizeDB: await this.agenda.db.getQueueSize(), + internal: { + localQueueProcessing: this.localQueueProcessing, + localLockLimitReached: this.localLockLimitReached, + }, + config: { + totalLockLimit: this.totalLockLimit, + maxConcurrency: this.maxConcurrency, + processEvery: this.processEvery, + }, + jobStatus, + queuedJobs: !fullDetails + ? this.jobQueue.length + : this.jobQueue.getQueue().map((job) => ({ + ...job.toJson(), + canceled: job.getCanceledMessage(), + })), + runningJobs: !fullDetails + ? this.runningJobs.length + : this.runningJobs.map((job) => ({ + ...job.toJson(), + canceled: job.getCanceledMessage(), + })), + lockedJobs: !fullDetails + ? this.lockedJobs.length + : this.lockedJobs.map((job) => ({ + ...job.toJson(), + canceled: job.getCanceledMessage(), + })), + jobsToLock: !fullDetails + ? this.jobsToLock.length + : this.jobsToLock.map((job) => ({ + ...job.toJson(), + canceled: job.getCanceledMessage(), + })), + isLockingOnTheFly: this.isLockingOnTheFly, + }; + } + + private nextScanAt = new Date(); + + private jobQueue: JobProcessingQueue; + + private runningJobs: JobWithId[] = []; + + private lockedJobs: JobWithId[] = []; + + private jobsToLock: JobWithId[] = []; + + private isLockingOnTheFly = false; + + private isJobQueueFilling = new Map(); + + private isRunning = true; + + private processInterval?: ReturnType; + + constructor( + private agenda: Agenda, + private maxConcurrency: number, + private totalLockLimit: number, + private processEvery: number + ) { + this.jobQueue = new JobProcessingQueue(this.agenda); + log("creating interval to call processJobs every [%dms]", processEvery); + this.processInterval = setInterval(() => this.process(), processEvery); + this.process(); + } + + stop(): JobWithId[] { + log.extend("stop")("stop job processor", this.isRunning); + this.isRunning = false; + + if (this.processInterval) { + clearInterval(this.processInterval); + this.processInterval = undefined; + } + + return this.lockedJobs; + } + + // processJobs + async process(extraJob?: JobWithId): Promise { + // Make sure an interval has actually been set + // Prevents race condition with 'Agenda.stop' and already scheduled run + if (!this.isRunning) { + log.extend("process")("JobProcessor got stopped already, returning"); + return; + } + + // Determine whether or not we have a direct process call! + if (!extraJob) { + log.extend("process")("starting to process jobs"); + + // Go through each jobName set in 'Agenda.process' and fill the queue with the next jobs + await Promise.all( + Object.keys(this.agenda.definitions).map(async (jobName) => { + log.extend("process")("queuing up job to process: [%s]", jobName); + await this.jobQueueFilling(jobName); + }) + ); + this.jobProcessing(); + } else if ( + this.agenda.definitions[extraJob.attrs.name] && + // If the extraJob would have been processed in an older scan, process the job immediately + extraJob.attrs.nextRunAt && + extraJob.attrs.nextRunAt < this.nextScanAt + ) { + log.extend("process")( + "[%s:%s] job would have ran by nextScanAt, processing the job immediately", + extraJob.attrs.name + ); + // Add the job to list of jobs to lock and then lock it immediately! + this.jobsToLock.push(extraJob); + await this.lockOnTheFly(); + } + } + + /** + * Returns true if a job of the specified name can be locked. + * Considers maximum locked jobs at any time if self._lockLimit is > 0 + * Considers maximum locked jobs of the specified name at any time if jobDefinition.lockLimit is > 0 + * @param {String} name name of job to check if we should lock or not + * @returns {boolean} whether or not you should lock job + */ + shouldLock(name: string): boolean { + const jobDefinition = this.agenda.definitions[name]; + let shouldLock = true; + // global lock limit + if (this.totalLockLimit && this.lockedJobs.length >= this.totalLockLimit) { + shouldLock = false; + } + + // job specific lock limit + const status = this.jobStatus[name]; + if (jobDefinition.lockLimit && status && status.locked >= jobDefinition.lockLimit) { + shouldLock = false; + } + + log.extend("shouldLock")( + "job [%s] lock status: shouldLock = %s", + name, + shouldLock, + `${status?.locked} >= ${jobDefinition?.lockLimit}`, + `${this.lockedJobs.length} >= ${this.totalLockLimit}` + ); + return shouldLock; + } + + /** + * Internal method that adds jobs to be processed to the local queue + * @param {*} jobs Jobs to queue + * @param {boolean} inFront puts the job in front of queue if true + * @returns {undefined} + */ + private enqueueJob(job: Job): void { + this.jobQueue.insert(job); + } + + /** + * Internal method that will lock a job and store it on MongoDB + * This method is called when we immediately start to process a job without using the process interval + * We do this because sometimes jobs are scheduled but will be run before the next process time + * @returns {undefined} + */ + async lockOnTheFly(): Promise { + // Already running this? Return + if (this.isLockingOnTheFly) { + log.extend("lockOnTheFly")("already running, returning"); + return; + } + + // Don't have any jobs to run? Return + if (this.jobsToLock.length === 0) { + log.extend("lockOnTheFly")("no jobs to current lock on the fly, returning"); + return; + } + + this.isLockingOnTheFly = true; + + // Set that we are running this + try { + // Grab a job that needs to be locked + const job = this.jobsToLock.pop(); + + if (job) { + if (this.isJobQueueFilling.has(job.attrs.name)) { + log.extend("lockOnTheFly")("jobQueueFilling already running for: %s", job.attrs.name); + return; + } + + // If locking limits have been hit, stop locking on the fly. + // Jobs that were waiting to be locked will be picked up during a + // future locking interval. + if (!this.shouldLock(job.attrs.name)) { + log.extend("lockOnTheFly")("lock limit hit for: [%s:%S]", job.attrs.name, job.attrs._id); + this.updateStatus(job.attrs.name, "lockLimitReached", +1); + this.jobsToLock = []; + return; + } + + // Lock the job in MongoDB! + const resp = await this.agenda.db.lockJob(job); + + if (resp) { + if (job.attrs.name !== resp.name) { + throw new Error(`got different job name: ${resp.name} (actual) !== ${job.attrs.name} (expected)`); + } + + const jobToEnqueue = new Job(this.agenda, resp, true) as JobWithId; + + // Before en-queing job make sure we haven't exceed our lock limits + if (!this.shouldLock(jobToEnqueue.attrs.name)) { + log.extend("lockOnTheFly")( + "lock limit reached while job was locked in database. Releasing lock on [%s]", + jobToEnqueue.attrs.name + ); + this.updateStatus(jobToEnqueue.attrs.name, "lockLimitReached", +1); + this.agenda.db.unlockJob(jobToEnqueue); + + this.jobsToLock = []; + return; + } + + log.extend("lockOnTheFly")( + "found job [%s:%s] that can be locked on the fly", + jobToEnqueue.attrs.name, + jobToEnqueue.attrs._id + ); + this.updateStatus(jobToEnqueue.attrs.name, "locked", +1); + this.lockedJobs.push(jobToEnqueue); + this.enqueueJob(jobToEnqueue); + this.jobProcessing(); + } else { + log.extend("lockOnTheFly")("cannot lock job [%s] on the fly", job.attrs.name); + } + } + } finally { + // Mark lock on fly is done for now + this.isLockingOnTheFly = false; + } + + // Re-run in case anything is in the queue + await this.lockOnTheFly(); + } + + private async findAndLockNextJob(jobName: string, definition: IJobDefinition): Promise { + const lockDeadline = new Date(Date.now().valueOf() - definition.lockLifetime); + log.extend("findAndLockNextJob")(`looking for lockable jobs for ${jobName} (lock dead line = ${lockDeadline})`); + + // Find ONE and ONLY ONE job and set the 'lockedAt' time so that job begins to be processed + const result = await this.agenda.db.getNextJobToRun(jobName, this.nextScanAt, lockDeadline); + + if (result) { + log.extend("findAndLockNextJob")( + "found a job available to lock, creating a new job on Agenda with id [%s]", + result._id + ); + return new Job(this.agenda, result, true) as JobWithId; + } + + return undefined; + } + + /** + * Internal method used to fill a queue with jobs that can be run + * @param {String} name fill a queue with specific job name + * @returns {undefined} + */ + private async jobQueueFilling(name: string): Promise { + this.isJobQueueFilling.set(name, true); + + try { + // Don't lock because of a limit we have set (lockLimit, etc) + if (!this.shouldLock(name)) { + this.updateStatus(name, "lockLimitReached", +1); + log.extend("jobQueueFilling")("lock limit reached in queue filling for [%s]", name); + return; + } + + // Set the date of the next time we are going to run _processEvery function + const now = new Date(); + this.nextScanAt = new Date(now.valueOf() + this.processEvery); + + // For this job name, find the next job to run and lock it! + const job = await this.findAndLockNextJob(name, this.agenda.definitions[name]); + + // Still have the job? + // 1. Add it to lock list + // 2. Add count of locked jobs + // 3. Queue the job to actually be run now that it is locked + // 4. Recursively run this same method we are in to check for more available jobs of same type! + if (job) { + if (job.attrs.name !== name) { + throw new Error(`got different job name: ${job.attrs.name} (actual) !== ${name} (expected)`); + } + + // Before en-queing job make sure we haven't exceed our lock limits + if (!this.shouldLock(name)) { + log.extend("jobQueueFilling")("lock limit reached before job was returned. Releasing lock on [%s]", name); + this.updateStatus(name, "lockLimitReached", +1); + this.agenda.db.unlockJob(job); + return; + } + + log.extend("jobQueueFilling")("[%s:%s] job locked while filling queue", name, job.attrs._id); + this.updateStatus(name, "locked", +1); + this.lockedJobs.push(job); + + this.enqueueJob(job); + await this.jobQueueFilling(name); + } else { + log.extend("jobQueueFilling")("Cannot lock job [%s]", name); + } + } catch (error) { + log.extend("jobQueueFilling")("[%s] job lock failed while filling queue", name, error); + this.agenda.emit("error", error); + } finally { + this.isJobQueueFilling.delete(name); + } + } + + /** + * Internal method that processes any jobs in the local queue (array) + * handledJobs keeps list of already processed jobs + * @returns {undefined} + */ + private async jobProcessing(handledJobs: IJobParameters["_id"][] = []) { + // Ensure we have jobs + if (this.jobQueue.length === 0) { + return; + } + + this.localQueueProcessing += 1; + + try { + const now = new Date(); + + // Check if there is any job that is not blocked by concurrency + const job = this.jobQueue.returnNextConcurrencyFreeJob(this.jobStatus, handledJobs); + + if (!job) { + log.extend("jobProcessing")("[%s:%s] there is no job to process"); + return; + } + + this.jobQueue.remove(job); + + if (!(await job.isExpired())) { + // check if job has expired (and therefore probably got picked up again by another queue in the meantime) + // before it even has started to run + + log.extend("jobProcessing")( + "[%s:%s] there is a job to process (priority = %d)", + job.attrs.name, + job.attrs._id, + job.attrs.priority, + job.gotTimerToExecute + ); + + // If the 'nextRunAt' time is older than the current time, run the job + // Otherwise, setTimeout that gets called at the time of 'nextRunAt' + if (!job.attrs.nextRunAt || job.attrs.nextRunAt <= now) { + log.extend("jobProcessing")( + "[%s:%s] nextRunAt is in the past, run the job immediately", + job.attrs.name, + job.attrs._id + ); + this.runOrRetry(job); + } else { + const runIn = job.attrs.nextRunAt.getTime() - now.getTime(); + if (runIn > this.processEvery) { + // this job is not in the near future, remove it (it will be picked up later) + log.extend("runOrRetry")("[%s:%s] job is too far away, freeing it up", job.attrs.name, job.attrs._id); + let lockedJobIndex = this.lockedJobs.indexOf(job); + if (lockedJobIndex === -1) { + // lookup by id + lockedJobIndex = this.lockedJobs.findIndex((j) => j.attrs._id?.toString() === job.attrs._id?.toString()); + } + if (lockedJobIndex === -1) { + throw new Error(`cannot find job ${job.attrs._id} in locked jobs queue?`); + } + + this.lockedJobs.splice(lockedJobIndex, 1); + this.updateStatus(job.attrs.name, "locked", -1); + } else { + log.extend("jobProcessing")( + "[%s:%s] nextRunAt is in the future, calling setTimeout(%d)", + job.attrs.name, + job.attrs._id, + runIn + ); + // re add to queue (puts it at the right position in the queue) + this.jobQueue.insert(job); + // ensure every job gets a timer to run at the near future time (but also ensure this time is set only once) + if (!job.gotTimerToExecute) { + job.gotTimerToExecute = true; + setTimeout( + () => { + this.jobProcessing(); + }, + runIn > MAX_SAFE_32BIT_INTEGER ? MAX_SAFE_32BIT_INTEGER : runIn + ); // check if runIn is higher than unsined 32 bit int, if so, use this time to recheck, + // because setTimeout will run in an overflow otherwise and reprocesses immediately + } + } + } + } + + handledJobs.push(job.attrs._id); + + if (job && this.localQueueProcessing < this.maxConcurrency) { + // additionally run again and check if there are more jobs that we can process right now (as long concurrency not reached) + setImmediate(() => this.jobProcessing(handledJobs)); + } + } finally { + this.localQueueProcessing -= 1; + } + } + + /** + * Internal method that tries to run a job and if it fails, retries again! + * @returns {boolean} processed a job or not + */ + private async runOrRetry(job: JobWithId): Promise { + if (!this.isRunning) { + // const a = new Error(); + // console.log('STACK', a.stack); + log.extend("runOrRetry")("JobProcessor got stopped already while calling runOrRetry, returning!"); + return; + } + + const jobDefinition = this.agenda.definitions[job.attrs.name]; + const status = this.jobStatus[job.attrs.name]; + + if ( + (!jobDefinition.concurrency || !status || status.running < jobDefinition.concurrency) && + this.runningJobs.length < this.maxConcurrency + ) { + // Add to local "running" queue + this.runningJobs.push(job); + this.updateStatus(job.attrs.name, "running", 1); + + let jobIsRunning = true; + try { + log.extend("runOrRetry")("[%s:%s] processing job", job.attrs.name, job.attrs._id); + + // check if the job is still alive + const checkIfJobIsStillAlive = () => + // check every "this.agenda.definitions[job.attrs.name].lockLifetime / 2"" (or at mininum every processEvery) + new Promise((resolve, reject) => { + setTimeout( + async () => { + // when job is not running anymore, just finish + if (!jobIsRunning) { + log.extend("runOrRetry")( + "[%s:%s] checkIfJobIsStillAlive detected job is not running anymore. stopping check.", + job.attrs.name, + job.attrs._id + ); + resolve(); + return; + } + + if (await job.isExpired()) { + log.extend("runOrRetry")( + "[%s:%s] checkIfJobIsStillAlive detected an expired job, killing it.", + job.attrs.name, + job.attrs._id + ); + + reject( + new Error( + `execution of '${job.attrs.name}' canceled, execution took more than ${ + this.agenda.definitions[job.attrs.name].lockLifetime + }ms. Call touch() for long running jobs to keep them alive.` + ) + ); + return; + } + + if (!job.attrs.lockedAt) { + log.extend("runOrRetry")( + "[%s:%s] checkIfJobIsStillAlive detected a job without a lockedAt value, killing it.", + job.attrs.name, + job.attrs._id + ); + + reject( + new Error( + `execution of '${job.attrs.name}' canceled, no lockedAt date found. Ensure to call touch() for long running jobs to keep them alive.` + ) + ); + return; + } + + resolve(checkIfJobIsStillAlive()); + }, + Math.max(this.processEvery / 2, this.agenda.definitions[job.attrs.name].lockLifetime / 2) + ); + }); + // CALL THE ACTUAL METHOD TO PROCESS THE JOB!!! + await Promise.race([job.run(), checkIfJobIsStillAlive()]); + + log.extend("runOrRetry")("[%s:%s] processing job successfull", job.attrs.name, job.attrs._id); + + // Job isn't in running jobs so throw an error + if (!this.runningJobs.includes(job)) { + log.extend("runOrRetry")( + "[%s] callback was called, job must have been marked as complete already", + job.attrs._id + ); + throw new Error(`callback already called - job ${job.attrs.name} already marked complete`); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } catch (error: any) { + job.cancel(error); + log.extend("runOrRetry")("[%s:%s] processing job failed", job.attrs.name, job.attrs._id, error); + this.agenda.emit("error", error); + } finally { + jobIsRunning = false; + + // Remove the job from the running queue + let runningJobIndex = this.runningJobs.indexOf(job); + if (runningJobIndex === -1) { + // lookup by id + runningJobIndex = this.runningJobs.findIndex((j) => j.attrs._id?.toString() === job.attrs._id?.toString()); + } + if (runningJobIndex === -1) { + // eslint-disable-next-line no-unsafe-finally + throw new Error(`cannot find job ${job.attrs._id} in running jobs queue?`); + } + this.runningJobs.splice(runningJobIndex, 1); + this.updateStatus(job.attrs.name, "running", -1); + + // Remove the job from the locked queue + let lockedJobIndex = this.lockedJobs.indexOf(job); + if (lockedJobIndex === -1) { + // lookup by id + lockedJobIndex = this.lockedJobs.findIndex((j) => j.attrs._id?.toString() === job.attrs._id?.toString()); + } + if (lockedJobIndex === -1) { + // eslint-disable-next-line no-unsafe-finally + throw new Error(`cannot find job ${job.attrs._id} in locked jobs queue?`); + } + this.lockedJobs.splice(lockedJobIndex, 1); + this.updateStatus(job.attrs.name, "locked", -1); + } + + // Re-process jobs now that one has finished + setImmediate(() => this.jobProcessing()); + return; + } + + // Run the job later + log.extend("runOrRetry")( + "[%s:%s] concurrency preventing immediate run, pushing job to top of queue", + job.attrs.name, + job.attrs._id + ); + this.enqueueJob(job); + } + + private updateStatus(name: string, key: "locked" | "running" | "lockLimitReached", number: -1 | 1) { + if (!this.jobStatus[name]) { + this.jobStatus[name] = { + locked: 0, + running: 0, + }; + } + + this.jobStatus[name]![key] += number; + } +} diff --git a/src/job.ts b/src/job.ts new file mode 100644 index 0000000..525b9b3 --- /dev/null +++ b/src/job.ts @@ -0,0 +1,468 @@ +import date from "@lesjoursfr/date"; +import debug from "debug"; +import { ObjectId } from "mongodb"; +import { ChildProcess, fork } from "node:child_process"; +import type { Agenda } from "./index"; +import type { DefinitionProcessor } from "./interfaces/index"; +import { datefields, IJobParameters, TJobDatefield } from "./interfaces/index"; +import { computeFromInterval, computeFromRepeatAt, JobPriority, parsePriority } from "./utils/index"; + +const log = debug("agenda:job"); + +/** + * @class + */ +export class Job { + readonly attrs: IJobParameters; + + /** this flag is set to true, if a job got canceled (e.g. due to a timeout or other exception), + * you can use it for long running tasks to periodically check if canceled is true, + * also touch will check if and throws that the job got canceled + */ + private canceled?: Error | string | true; + + getCanceledMessage() { + return typeof this.canceled === "object" ? this.canceled?.message || this.canceled : this.canceled; + } + + private forkedChild?: ChildProcess; + + cancel(error?: Error | string) { + this.agenda.emit(`cancel:${this.attrs.name}`, this); + this.canceled = error || true; + if (this.forkedChild) { + try { + this.forkedChild.send({ + type: "cancel", + error: this.canceled instanceof Error ? this.canceled.message : this.canceled, + }); + console.info("send canceled child", this.attrs.name, this.attrs._id); + } catch (_err) { + console.log("cannot send cancel to child"); + } + } + } + + /** internal variable to ensure a job does not set unlimited numbers of setTimeouts if the job is not processed + * immediately */ + gotTimerToExecute!: boolean; + + /** + * creates a new job object + * @param agenda + * @param args + * @param byJobProcessor + */ + constructor( + agenda: Agenda, + args: Partial> & { + name: string; + type: "normal" | "single"; + }, + byJobProcessor?: boolean + ); + constructor( + agenda: Agenda, + args: Partial> & { + name: string; + type: "normal" | "single"; + data: DATA; + }, + byJobProcessor?: boolean + ); + constructor( + readonly agenda: Agenda, + args: Partial> & { + name: string; + type: "normal" | "single"; + data: DATA; + }, + private readonly byJobProcessor = false + ) { + // Set attrs to args + this.attrs = { + ...args, + // Set defaults if undefined + priority: parsePriority(args.priority), + nextRunAt: args.nextRunAt === undefined ? new Date() : args.nextRunAt, + type: args.type, + }; + } + + /** + * Given a job, turn it into an JobParameters object + */ + toJson(): IJobParameters { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const result = {} as any; + + for (const key of Object.keys(this.attrs)) { + if (Object.hasOwnProperty.call(this.attrs, key)) { + result[key as keyof IJobParameters] = + datefields.includes(key as TJobDatefield) && this.attrs[key as keyof IJobParameters] + ? new Date(this.attrs[key as keyof IJobParameters] as string | number) + : this.attrs[key as keyof IJobParameters]; + } + } + + return result; + } + + /** + * Sets a job to repeat every X amount of time + * @param interval + * @param options + */ + repeatEvery(interval: string | number, options: { timezone?: string; skipImmediate?: boolean } = {}): this { + this.attrs.repeatInterval = interval; + this.attrs.repeatTimezone = options.timezone; + if (options.skipImmediate) { + // Set the lastRunAt time to the nextRunAt so that the new nextRunAt will be computed in reference to the current value. + this.attrs.lastRunAt = this.attrs.nextRunAt || new Date(); + this.computeNextRunAt(); + this.attrs.lastRunAt = undefined; + } else { + this.computeNextRunAt(); + } + + return this; + } + + /** + * Sets a job to repeat at a specific time + * @param time + */ + repeatAt(time: string): this { + this.attrs.repeatAt = time; + return this; + } + + /** + * if set, a job is forked via node child process and runs in a seperate/own + * thread + * @param enableForkMode + */ + forkMode(enableForkMode: boolean): this { + this.attrs.fork = enableForkMode; + return this; + } + + /** + * Prevents the job from running + */ + disable(): this { + this.attrs.disabled = true; + return this; + } + + /** + * Allows job to run + */ + enable(): this { + this.attrs.disabled = false; + return this; + } + + /** + * Data to ensure is unique for job to be created + * @param unique + * @param opts + */ + unique(unique: Required>["unique"], opts?: IJobParameters["uniqueOpts"]): this { + this.attrs.unique = unique; + this.attrs.uniqueOpts = opts; + return this; + } + + /** + * Schedules a job to run at specified time + * @param time + */ + schedule(time: string | Date): this { + const d = new Date(time); + + this.attrs.nextRunAt = Number.isNaN(d.getTime()) ? date(time as string) : d; + + return this; + } + + /** + * Sets priority of the job + * @param priority priority of when job should be queued + */ + priority(priority: JobPriority): this { + this.attrs.priority = parsePriority(priority); + return this; + } + + /** + * Fails the job with a reason (error) specified + * + * @param reason + */ + fail(reason: Error | string): this { + this.attrs.failReason = reason instanceof Error ? reason.message : reason; + this.attrs.failCount = (this.attrs.failCount || 0) + 1; + const now = new Date(); + this.attrs.failedAt = now; + this.attrs.lastFinishedAt = now; + log("[%s:%s] fail() called [%d] times so far", this.attrs.name, this.attrs._id, this.attrs.failCount); + return this; + } + + private async fetchStatus(): Promise { + const dbJob = await this.agenda.db.getJobs({ _id: this.attrs._id }); + if (!dbJob || dbJob.length === 0) { + // @todo: should we just return false instead? a finished job could have been removed from database, + // and then this would throw... + throw new Error(`job with id ${this.attrs._id} not found in database`); + } + + this.attrs.lastRunAt = dbJob[0].lastRunAt; + this.attrs.lockedAt = dbJob[0].lockedAt; + this.attrs.lastFinishedAt = dbJob[0].lastFinishedAt; + } + + /** + * A job is running if: + * (lastRunAt exists AND lastFinishedAt does not exist) + * OR + * (lastRunAt exists AND lastFinishedAt exists but the lastRunAt is newer [in time] than lastFinishedAt) + * @returns Whether or not job is running at the moment (true for running) + */ + async isRunning(): Promise { + if (!this.byJobProcessor || this.attrs.fork) { + // we have no job definition, therfore we are not the job processor, but a client call + // so we get the real state from database + await this.fetchStatus(); + } + + if (!this.attrs.lastRunAt) { + return false; + } + + if (!this.attrs.lastFinishedAt) { + return true; + } + + if (this.attrs.lockedAt && this.attrs.lastRunAt.getTime() > this.attrs.lastFinishedAt.getTime()) { + return true; + } + + return false; + } + + /** + * Saves a job to database + */ + async save(): Promise { + if (this.agenda.forkedWorker) { + const warning = new Error("calling save() on a Job during a forkedWorker has no effect!"); + console.warn(warning.message, warning.stack); + return this as Job; + } + // ensure db connection is ready + await this.agenda.ready; + return this.agenda.db.saveJob(this as Job); + } + + /** + * Remove the job from database + */ + remove(): Promise { + return this.agenda.cancel({ _id: this.attrs._id }); + } + + async isDead(): Promise { + return this.isExpired(); + } + + async isExpired(): Promise { + if (!this.byJobProcessor || this.attrs.fork) { + // we have no job definition, therfore we are not the job processor, but a client call + // so we get the real state from database + await this.fetchStatus(); + } + + const definition = this.agenda.definitions[this.attrs.name]; + + const lockDeadline = new Date(Date.now() - definition.lockLifetime); + + // This means a job has "expired", as in it has not been "touched" within the lockoutTime + // Remove from local lock + if (this.attrs.lockedAt && this.attrs.lockedAt < lockDeadline) { + return true; + } + return false; + } + + /** + * Updates "lockedAt" time so the job does not get picked up again + * @param progress 0 to 100 + */ + async touch(progress?: number): Promise { + if (this.canceled) { + throw new Error(`job ${this.attrs.name} got canceled already: ${this.canceled}!`); + } + this.attrs.lockedAt = new Date(); + this.attrs.progress = progress; + + await this.agenda.db.saveJobState(this); + } + + private computeNextRunAt() { + try { + if (this.attrs.repeatInterval) { + this.attrs.nextRunAt = computeFromInterval(this.attrs); + log( + "[%s:%s] nextRunAt set to [%s]", + this.attrs.name, + this.attrs._id, + new Date(this.attrs.nextRunAt).toISOString() + ); + } else if (this.attrs.repeatAt) { + this.attrs.nextRunAt = computeFromRepeatAt(this.attrs); + + log("[%s:%s] nextRunAt set to [%s]", this.attrs.name, this.attrs._id, this.attrs.nextRunAt.toISOString()); + } else { + this.attrs.nextRunAt = null; + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } catch (error: any) { + this.attrs.nextRunAt = null; + this.fail(error); + } + + return this; + } + + async run(): Promise { + this.attrs.lastRunAt = new Date(); + log("[%s:%s] setting lastRunAt to: %s", this.attrs.name, this.attrs._id, this.attrs.lastRunAt.toISOString()); + this.computeNextRunAt(); + await this.agenda.db.saveJobState(this); + + try { + this.agenda.emit("start", this); + this.agenda.emit(`start:${this.attrs.name}`, this); + log("[%s:%s] starting job", this.attrs.name, this.attrs._id); + + if (this.attrs.fork) { + if (!this.agenda.forkHelper) { + throw new Error("no forkHelper specified, you need to set a path to a helper script"); + } + const { forkHelper } = this.agenda; + + await new Promise((resolve, reject) => { + this.forkedChild = fork( + forkHelper.path, + [this.attrs.name, this.attrs._id!.toString(), this.agenda.definitions[this.attrs.name].filePath || ""], + forkHelper.options + ); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let childError: any; + this.forkedChild.on("close", (code) => { + if (code) { + console.info( + "fork parameters", + forkHelper, + this.attrs.name, + this.attrs._id, + this.agenda.definitions[this.attrs.name].filePath + ); + const error = new Error(`child process exited with code: ${code}`); + console.warn(error.message, childError || this.canceled); + reject(childError || this.canceled || error); + } else { + resolve(); + } + }); + this.forkedChild.on("message", (message) => { + if (typeof message === "string") { + try { + childError = JSON.parse(message); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } catch (_errJson: any) { + childError = message; + } + } else { + childError = message; + } + }); + }); + } else { + await this.runJob(); + } + + this.attrs.lastFinishedAt = new Date(); + + this.agenda.emit("success", this); + this.agenda.emit(`success:${this.attrs.name}`, this); + log("[%s:%s] has succeeded", this.attrs.name, this.attrs._id); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } catch (error: any) { + log("[%s:%s] unknown error occurred", this.attrs.name, this.attrs._id); + + this.fail(error); + + this.agenda.emit("fail", error, this); + this.agenda.emit(`fail:${this.attrs.name}`, error, this); + log("[%s:%s] has failed [%s]", this.attrs.name, this.attrs._id, error.message); + } finally { + this.forkedChild = undefined; + this.attrs.lockedAt = undefined; + try { + await this.agenda.db.saveJobState(this); + log("[%s:%s] was saved successfully to MongoDB", this.attrs.name, this.attrs._id); + } catch (err) { + // in case this fails, we ignore it + // this can e.g. happen if the job gets removed during the execution + log("[%s:%s] was not saved to MongoDB", this.attrs.name, this.attrs._id, err); + } + + this.agenda.emit("complete", this); + this.agenda.emit(`complete:${this.attrs.name}`, this); + log("[%s:%s] job finished at [%s] and was unlocked", this.attrs.name, this.attrs._id, this.attrs.lastFinishedAt); + } + } + + async runJob() { + const definition = this.agenda.definitions[this.attrs.name]; + + if (!definition) { + log("[%s:%s] has no definition, can not run", this.attrs.name, this.attrs._id); + throw new Error("Undefined job"); + } + + if (definition.fn.length === 2) { + log("[%s:%s] process function being called", this.attrs.name, this.attrs._id); + await new Promise((resolve, reject) => { + try { + const result = definition.fn(this as Job, (error) => { + if (error) { + reject(error); + return; + } + resolve(); + }); + + if (this.isPromise(result)) { + result.catch((error: Error) => reject(error)); + } + } catch (error) { + reject(error); + } + }); + } else { + log("[%s:%s] process function being called", this.attrs.name, this.attrs._id); + await (definition.fn as DefinitionProcessor)(this); + } + } + + private isPromise(value: unknown): value is Promise { + return !!(value && typeof (value as Promise).then === "function"); + } +} + +export type JobWithId = Job & { attrs: IJobParameters & { _id: ObjectId } }; diff --git a/src/types/AgendaConfig.ts b/src/types/AgendaConfig.ts deleted file mode 100644 index 90909b2..0000000 --- a/src/types/AgendaConfig.ts +++ /dev/null @@ -1,15 +0,0 @@ -export interface IAgendaConfig { - name?: string; - - defaultConcurrency: number; - - processEvery: number; - - maxConcurrency: number; - - defaultLockLimit: number; - - lockLimit: number; - - defaultLockLifetime: number; -} diff --git a/src/types/AgendaStatus.ts b/src/types/AgendaStatus.ts deleted file mode 100644 index b6922b3..0000000 --- a/src/types/AgendaStatus.ts +++ /dev/null @@ -1,31 +0,0 @@ -import type { IJobParameters } from './JobParameters.js'; -import type { IJobDefinition } from './JobDefinition.js'; - -export interface IAgendaJobStatus { - [name: string]: { - running: number; - locked: number; - config: IJobDefinition; - }; -} - -export interface IAgendaStatus { - version: string; - queueName: string | undefined; - totalQueueSizeDB: number; - config: { - totalLockLimit: number; - maxConcurrency: number; - processEvery: string | number; - }; - internal: { - localQueueProcessing: number; - localLockLimitReached: number; - }; - jobStatus?: IAgendaJobStatus; - queuedJobs: number | IJobParameters[]; - runningJobs: number | IJobParameters[]; - lockedJobs: number | IJobParameters[]; - jobsToLock: number | IJobParameters[]; - isLockingOnTheFly: boolean; -} diff --git a/src/types/DbOptions.ts b/src/types/DbOptions.ts deleted file mode 100644 index 3cf3dc2..0000000 --- a/src/types/DbOptions.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { Db, MongoClientOptions, SortDirection } from 'mongodb'; - -export interface IDatabaseOptions { - db: { - collection?: string; - address: string; - options?: MongoClientOptions; - }; -} - -export interface IMongoOptions { - db?: { - collection?: string; - }; - mongo: Db; -} - -export interface IDbConfig { - ensureIndex?: boolean; - sort?: { - [key: string]: SortDirection; - }; -} diff --git a/src/types/JobDefinition.ts b/src/types/JobDefinition.ts deleted file mode 100644 index 30e853b..0000000 --- a/src/types/JobDefinition.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { Job } from '../Job.js'; - -export interface IJobDefinition { - /** max number of locked jobs of this kind */ - lockLimit: number; - /** lock lifetime in milliseconds */ - lockLifetime: number; - /** Higher priority jobs will run first. */ - priority?: number; - /** how many jobs of this kind can run in parallel/simultanously per Agenda instance */ - concurrency?: number; - - filePath: string | undefined; - fn: DefinitionProcessor void)>; -} - -export type DefinitionProcessor = ( - agendaJob: Job, - done: CB -) => CB extends void ? Promise : void; diff --git a/src/types/JobParameters.ts b/src/types/JobParameters.ts deleted file mode 100644 index a7e2e66..0000000 --- a/src/types/JobParameters.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Filter, ObjectId } from 'mongodb'; - -export interface IJobParameters { - _id?: ObjectId; - - name: string; - priority: number; - nextRunAt: Date | null; - /** - * normal: job is queued and will be processed (regular case when the user adds a new job) - * single: job with this name is only queued once, if there is an exisitn gentry in the database, the job is just updated, but not newly inserted (this is used for .every()) - */ - type: 'normal' | 'single'; - - lockedAt?: Date; - lastFinishedAt?: Date; - failedAt?: Date; - failCount?: number; - failReason?: string; - repeatTimezone?: string; - lastRunAt?: Date; - repeatInterval?: string | number; - data: DATA; - repeatAt?: string; - disabled?: boolean; - progress?: number; - - // unique query object - unique?: Filter, 'unique'>>; - uniqueOpts?: { - insertOnly: boolean; - }; - - lastModifiedBy?: string; - - /** forks a new node sub process for executing this job */ - fork?: boolean; -} - -export type TJobDatefield = keyof Pick< - IJobParameters, - 'lastRunAt' | 'lastFinishedAt' | 'nextRunAt' | 'failedAt' | 'lockedAt' ->; - -export const datefields: Array = [ - 'lastRunAt', - 'lastFinishedAt', - 'nextRunAt', - 'failedAt', - 'lockedAt' -]; diff --git a/src/utils/hasMongoProtocol.ts b/src/utils/has-mongo-protocol.ts similarity index 100% rename from src/utils/hasMongoProtocol.ts rename to src/utils/has-mongo-protocol.ts diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 0000000..035a26d --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,6 @@ +export * from "./has-mongo-protocol"; +export * from "./is-valid-date"; +export * from "./next-run-at"; +export * from "./priority"; +export * from "./process-every"; +export * from "./stack"; diff --git a/src/utils/is-valid-date.ts b/src/utils/is-valid-date.ts new file mode 100644 index 0000000..3e84471 --- /dev/null +++ b/src/utils/is-valid-date.ts @@ -0,0 +1,4 @@ +export function isValidDate(date: unknown): date is Date { + // An invalid date object returns NaN for getTime() + return date !== null && Number.isNaN(new Date(date as string).getTime()) === false; +} diff --git a/src/utils/isValidDate.ts b/src/utils/isValidDate.ts deleted file mode 100644 index ae81892..0000000 --- a/src/utils/isValidDate.ts +++ /dev/null @@ -1,4 +0,0 @@ -export function isValidDate(date: unknown): date is Date { - // An invalid date object returns NaN for getTime() - return date !== null && Number.isNaN(new Date(date as string).getTime()) === false; -} diff --git a/src/utils/next-run-at.ts b/src/utils/next-run-at.ts new file mode 100644 index 0000000..b4a1a21 --- /dev/null +++ b/src/utils/next-run-at.ts @@ -0,0 +1,101 @@ +import date from "@lesjoursfr/date"; +import humanInterval from "@lesjoursfr/human-interval"; +import cronParser from "cron-parser"; +import debug from "debug"; +import { DateTime } from "luxon"; +import type { IJobParameters } from "../interfaces"; +import { isValidDate } from "./is-valid-date"; + +const { parseExpression } = cronParser; + +const log = debug("agenda:nextRunAt"); + +const dateForTimezone = (timezoneDate: Date, timezone?: string): DateTime => + DateTime.fromJSDate(timezoneDate, { zone: timezone }); + +export function isValidHumanInterval(value: unknown): value is string { + const transformedValue = humanInterval(value as string); + return typeof transformedValue === "number" && Number.isNaN(transformedValue) === false; +} + +/** + * Internal method that computes the interval + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export const computeFromInterval = (attrs: IJobParameters): Date => { + const previousNextRunAt = attrs.nextRunAt || new Date(); + log("[%s:%s] computing next run via interval [%s]", attrs.name, attrs._id, attrs.repeatInterval); + + const lastRun = dateForTimezone(attrs.lastRunAt || new Date(), attrs.repeatTimezone); + + const cronOptions = { + currentDate: lastRun.toJSDate(), + tz: attrs.repeatTimezone, + }; + + let nextRunAt: Date | null = null; + + let error; + if (typeof attrs.repeatInterval === "string") { + try { + let cronTime = parseExpression(attrs.repeatInterval, cronOptions); + let nextDate = cronTime.next().toDate(); + if (nextDate.valueOf() === lastRun.valueOf() || nextDate.valueOf() <= previousNextRunAt.valueOf()) { + // Handle cronTime giving back the same date for the next run time + cronOptions.currentDate = new Date(lastRun.valueOf() + 1000); + cronTime = parseExpression(attrs.repeatInterval, cronOptions); + nextDate = cronTime.next().toDate(); + } + + nextRunAt = nextDate; + } catch (err) { + error = err; + } + } + + if (isValidHumanInterval(attrs.repeatInterval)) { + if (!attrs.lastRunAt) { + nextRunAt = new Date(lastRun.valueOf()); + } else { + const intervalValue = humanInterval(attrs.repeatInterval) as number; + nextRunAt = new Date(lastRun.valueOf() + intervalValue); + } + } + + if (!isValidDate(nextRunAt)) { + log("[%s:%s] failed to calculate nextRunAt due to invalid repeat interval", attrs.name, attrs._id); + throw new Error( + `failed to calculate nextRunAt due to invalid repeat interval (${attrs.repeatInterval}): ${ + error || "no readable human interval" + }` + ); + } + + return nextRunAt; +}; + +/** + * Internal method to compute next run time from the repeat string + * @returns {undefined} + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function computeFromRepeatAt(attrs: IJobParameters): Date { + const lastRun = attrs.lastRunAt || new Date(); + const nextDate = date(attrs.repeatAt!).valueOf(); + + // If you do not specify offset date for below test it will fail for ms + const offset = new Date(); + + if (offset.getTime() === date(attrs.repeatAt!, offset).getTime()) { + log("[%s:%s] failed to calculate repeatAt due to invalid format", attrs.name, attrs._id); + // this.attrs.nextRunAt = undefined; + // this.fail('failed to calculate repeatAt time due to invalid format'); + throw new Error("failed to calculate repeatAt time due to invalid format"); + } + + if (nextDate.valueOf() === lastRun.valueOf()) { + return date("tomorrow at ", attrs.repeatAt); + } + + return date(attrs.repeatAt!); +} diff --git a/src/utils/nextRunAt.ts b/src/utils/nextRunAt.ts deleted file mode 100644 index c6faa7a..0000000 --- a/src/utils/nextRunAt.ts +++ /dev/null @@ -1,109 +0,0 @@ -/* eslint-disable import/first */ -import { DateTime } from 'luxon'; -import date from 'date.js'; -import debug from 'debug'; -import cronParser from 'cron-parser'; -import humanInterval from 'human-interval'; -import { isValidDate } from './isValidDate.js'; -import type { IJobParameters } from '../types/JobParameters.js'; - -const { parseExpression } = cronParser; - -const log = debug('agenda:nextRunAt'); - -const dateForTimezone = (timezoneDate: Date, timezone?: string): DateTime => - DateTime.fromJSDate(timezoneDate, { zone: timezone }); - -export function isValidHumanInterval(value: unknown): value is string { - const transformedValue = humanInterval(value as string); - return typeof transformedValue === 'number' && Number.isNaN(transformedValue) === false; -} - -/** - * Internal method that computes the interval - */ -export const computeFromInterval = (attrs: IJobParameters): Date => { - const previousNextRunAt = attrs.nextRunAt || new Date(); - log('[%s:%s] computing next run via interval [%s]', attrs.name, attrs._id, attrs.repeatInterval); - - const lastRun = dateForTimezone(attrs.lastRunAt || new Date(), attrs.repeatTimezone); - - const cronOptions = { - currentDate: lastRun.toJSDate(), - tz: attrs.repeatTimezone - }; - - let nextRunAt: Date | null = null; - - let error; - if (typeof attrs.repeatInterval === 'string') { - try { - let cronTime = parseExpression(attrs.repeatInterval, cronOptions); - let nextDate = cronTime.next().toDate(); - if ( - nextDate.valueOf() === lastRun.valueOf() || - nextDate.valueOf() <= previousNextRunAt.valueOf() - ) { - // Handle cronTime giving back the same date for the next run time - cronOptions.currentDate = new Date(lastRun.valueOf() + 1000); - cronTime = parseExpression(attrs.repeatInterval, cronOptions); - nextDate = cronTime.next().toDate(); - } - - nextRunAt = nextDate; - - // eslint-disable-next-line no-empty - } catch (err) { - error = err; - } - } - - if (isValidHumanInterval(attrs.repeatInterval)) { - if (!attrs.lastRunAt) { - nextRunAt = new Date(lastRun.valueOf()); - } else { - const intervalValue = humanInterval(attrs.repeatInterval) as number; - nextRunAt = new Date(lastRun.valueOf() + intervalValue); - } - } - - if (!isValidDate(nextRunAt)) { - log( - '[%s:%s] failed to calculate nextRunAt due to invalid repeat interval', - attrs.name, - attrs._id - ); - throw new Error( - `failed to calculate nextRunAt due to invalid repeat interval (${attrs.repeatInterval}): ${ - error || 'no readable human interval' - }` - ); - } - - return nextRunAt; -}; - -/** - * Internal method to compute next run time from the repeat string - * @returns {undefined} - */ -export function computeFromRepeatAt(attrs: IJobParameters): Date { - const lastRun = attrs.lastRunAt || new Date(); - const nextDate = date(attrs.repeatAt).valueOf(); - - // If you do not specify offset date for below test it will fail for ms - const offset = Date.now(); - - if (offset === date(attrs.repeatAt, offset).valueOf()) { - log('[%s:%s] failed to calculate repeatAt due to invalid format', attrs.name, attrs._id); - // this.attrs.nextRunAt = undefined; - // this.fail('failed to calculate repeatAt time due to invalid format'); - throw new Error('failed to calculate repeatAt time due to invalid format'); - } - - if (nextDate.valueOf() === lastRun.valueOf()) { - return date('tomorrow at ', attrs.repeatAt); - } - - return date(attrs.repeatAt); -} diff --git a/src/utils/priority.ts b/src/utils/priority.ts index dfdd7da..cbe2e38 100644 --- a/src/utils/priority.ts +++ b/src/utils/priority.ts @@ -1,24 +1,24 @@ export type JobPriority = number | keyof typeof priorityMap; const priorityMap = { - lowest: -20, - low: -10, - normal: 0, - high: 10, - highest: 20 + lowest: -20, + low: -10, + normal: 0, + high: 10, + highest: 20, }; /** * Internal method to turn priority into a number */ export function parsePriority(priority?: JobPriority): number { - if (typeof priority === 'number') { - return priority; - } + if (typeof priority === "number") { + return priority; + } - if (typeof priority === 'string' && priorityMap[priority]) { - return priorityMap[priority]; - } + if (typeof priority === "string" && priorityMap[priority]) { + return priorityMap[priority]; + } - return priorityMap.normal; + return priorityMap.normal; } diff --git a/src/utils/process-every.ts b/src/utils/process-every.ts new file mode 100644 index 0000000..f56bfc2 --- /dev/null +++ b/src/utils/process-every.ts @@ -0,0 +1,6 @@ +import humanInterval from "@lesjoursfr/human-interval"; + +export function calculateProcessEvery(input: number | string = 5000): number { + if (typeof input === "number") return input; + return (humanInterval(input) as number) || 5000; +} diff --git a/src/utils/processEvery.ts b/src/utils/processEvery.ts deleted file mode 100644 index 34c06a9..0000000 --- a/src/utils/processEvery.ts +++ /dev/null @@ -1,6 +0,0 @@ -import humanInterval from 'human-interval'; - -export function calculateProcessEvery(input: number | string = 5000): number { - if (typeof input === 'number') return input; - return (humanInterval(input) as number) || 5000; -} diff --git a/src/utils/stack.ts b/src/utils/stack.ts index e42b4f0..bb15b46 100644 --- a/src/utils/stack.ts +++ b/src/utils/stack.ts @@ -1,21 +1,21 @@ export function getCallerFilePath(position = 2): string | undefined { - if (position >= Error.stackTraceLimit) { - throw new TypeError( - `getCallerFile(position) requires position be less then Error.stackTraceLimit but position was: \`${position}\` and Error.stackTraceLimit was: \`${Error.stackTraceLimit}\`` - ); - } + if (position >= Error.stackTraceLimit) { + throw new TypeError( + `getCallerFile(position) requires position be less then Error.stackTraceLimit but position was: \`${position}\` and Error.stackTraceLimit was: \`${Error.stackTraceLimit}\`` + ); + } - const oldPrepareStackTrace = Error.prepareStackTrace; - Error.prepareStackTrace = (_, stack) => stack; - // eslint-disable-next-line unicorn/error-message - const { stack } = new Error(); - Error.prepareStackTrace = oldPrepareStackTrace; + const oldPrepareStackTrace = Error.prepareStackTrace; + Error.prepareStackTrace = (_, stack) => stack; + const { stack } = new Error(); + Error.prepareStackTrace = oldPrepareStackTrace; - if (stack !== null && typeof stack === 'object') { - // stack[0] holds this file - // stack[1] holds where this function was called - // stack[2] holds the file we're interested in - return stack[position] ? (stack[position] as any).getFileName() : undefined; - } - return undefined; + if (stack !== null && typeof stack === "object") { + // stack[0] holds this file + // stack[1] holds where this function was called + // stack[2] holds the file we're interested in + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return stack[position] ? (stack[position] as any).getFileName() : undefined; + } + return undefined; } diff --git a/test/agenda.test.ts b/test/agenda.test.ts deleted file mode 100644 index 5946205..0000000 --- a/test/agenda.test.ts +++ /dev/null @@ -1,768 +0,0 @@ -/* eslint-disable no-console,no-unused-expressions,@typescript-eslint/no-unused-expressions */ - -import delay from 'delay'; -import { Db } from 'mongodb'; -import { expect } from 'chai'; -import { mockMongo } from './helpers/mock-mongodb.js'; - -import { Agenda } from '../src/index.js'; -import { hasMongoProtocol } from '../src/utils/hasMongoProtocol.js'; -import { Job } from '../src/Job.js'; - -// agenda instances -let globalAgenda: Agenda; -// connection string to mongodb -let mongoCfg: string; -// mongo db connection db instance -let mongoDb: Db; - -const clearJobs = async (): Promise => { - if (mongoDb) { - await mongoDb.collection('agendaJobs').deleteMany({}); - } -}; - -// Slow timeouts for Travis -const jobTimeout = 500; -const jobType = 'do work'; -const jobProcessor = () => {}; - -describe('Agenda', () => { - beforeEach(async () => { - if (!mongoDb) { - const mockedMongo = await mockMongo(); - mongoCfg = mockedMongo.uri; - mongoDb = mockedMongo.mongo.db(); - } - - return new Promise(resolve => { - globalAgenda = new Agenda( - { - mongo: mongoDb - }, - async () => { - await delay(50); - await clearJobs(); - globalAgenda.define('someJob', jobProcessor); - globalAgenda.define('send email', jobProcessor); - globalAgenda.define('some job', jobProcessor); - globalAgenda.define(jobType, jobProcessor); - return resolve(); - } - ); - }); - }); - - afterEach(async () => { - await delay(50); - if (globalAgenda) { - await globalAgenda.stop(); - await clearJobs(); - } - // await mongoClient.disconnect(); - // await jobs._db.close(); - }); - - it('sets a default processEvery', () => { - expect(globalAgenda.attrs.processEvery).to.equal(5000); - }); - - describe('configuration methods', () => { - it('sets the _db directly when passed as an option', () => { - const agendaDb = new Agenda({ mongo: mongoDb }); - expect(agendaDb.db).to.not.equal(undefined); - }); - }); - - describe('configuration methods', () => { - describe('mongo connection tester', () => { - it('passing a valid server connection string', () => { - expect(hasMongoProtocol(mongoCfg)).to.equal(true); - }); - - it('passing a valid multiple server connection string', () => { - expect(hasMongoProtocol(`mongodb+srv://localhost/agenda-test`)).to.equal(true); - }); - - it('passing an invalid connection string', () => { - expect(hasMongoProtocol(`localhost/agenda-test`)).to.equal(false); - }); - }); - describe('mongo', () => { - it('sets the _db directly', () => { - const agenda = new Agenda(); - agenda.mongo(mongoDb); - expect(agenda.db).to.not.equal(undefined); - }); - - it('returns itself', async () => { - const agenda = new Agenda(); - expect(await agenda.mongo(mongoDb)).to.equal(agenda); - }); - }); - - describe('name', () => { - it('sets the agenda name', () => { - globalAgenda.name('test queue'); - expect(globalAgenda.attrs.name).to.equal('test queue'); - }); - it('returns itself', () => { - expect(globalAgenda.name('test queue')).to.equal(globalAgenda); - }); - }); - describe('processEvery', () => { - it('sets the processEvery time', () => { - globalAgenda.processEvery('3 minutes'); - expect(globalAgenda.attrs.processEvery).to.equal(180000); - }); - it('returns itself', () => { - expect(globalAgenda.processEvery('3 minutes')).to.equal(globalAgenda); - }); - }); - describe('maxConcurrency', () => { - it('sets the maxConcurrency', () => { - globalAgenda.maxConcurrency(10); - expect(globalAgenda.attrs.maxConcurrency).to.equal(10); - }); - it('returns itself', () => { - expect(globalAgenda.maxConcurrency(10)).to.equal(globalAgenda); - }); - }); - describe('defaultConcurrency', () => { - it('sets the defaultConcurrency', () => { - globalAgenda.defaultConcurrency(1); - expect(globalAgenda.attrs.defaultConcurrency).to.equal(1); - }); - it('returns itself', () => { - expect(globalAgenda.defaultConcurrency(5)).to.equal(globalAgenda); - }); - }); - describe('lockLimit', () => { - it('sets the lockLimit', () => { - globalAgenda.lockLimit(10); - expect(globalAgenda.attrs.lockLimit).to.equal(10); - }); - it('returns itself', () => { - expect(globalAgenda.lockLimit(10)).to.equal(globalAgenda); - }); - }); - describe('defaultLockLimit', () => { - it('sets the defaultLockLimit', () => { - globalAgenda.defaultLockLimit(1); - expect(globalAgenda.attrs.defaultLockLimit).to.equal(1); - }); - it('returns itself', () => { - expect(globalAgenda.defaultLockLimit(5)).to.equal(globalAgenda); - }); - }); - describe('defaultLockLifetime', () => { - it('returns itself', () => { - expect(globalAgenda.defaultLockLifetime(1000)).to.equal(globalAgenda); - }); - it('sets the default lock lifetime', () => { - globalAgenda.defaultLockLifetime(9999); - expect(globalAgenda.attrs.defaultLockLifetime).to.equal(9999); - }); - it('is inherited by jobs', () => { - globalAgenda.defaultLockLifetime(7777); - globalAgenda.define('testDefaultLockLifetime', () => {}); - expect(globalAgenda.definitions.testDefaultLockLifetime.lockLifetime).to.equal(7777); - }); - }); - describe('sort', () => { - it('returns itself', () => { - expect(globalAgenda.sort({ nextRunAt: 1, priority: -1 })).to.equal(globalAgenda); - }); - it('sets the default sort option', () => { - globalAgenda.sort({ nextRunAt: -1 }); - expect(globalAgenda.attrs.sort).to.eql({ nextRunAt: -1 }); - }); - }); - }); - - describe('job methods', () => { - describe('create', () => { - let job; - beforeEach(() => { - job = globalAgenda.create('sendEmail', { to: 'some guy' }); - }); - - it('returns a job', () => { - expect(job).to.to.be.an.instanceof(Job); - }); - it('sets the name', () => { - expect(job.attrs.name).to.equal('sendEmail'); - }); - it('sets the type', () => { - expect(job.attrs.type).to.equal('normal'); - }); - it('sets the agenda', () => { - expect(job.agenda).to.equal(globalAgenda); - }); - it('sets the data', () => { - expect(job.attrs.data).to.have.property('to', 'some guy'); - }); - }); - - describe('define', () => { - it('stores the definition for the job', () => { - expect(globalAgenda.definitions.someJob).to.have.property('fn', jobProcessor); - }); - - it('sets the default concurrency for the job', () => { - expect(globalAgenda.definitions.someJob).to.have.property('concurrency', 5); - }); - - it('sets the default lockLimit for the job', () => { - expect(globalAgenda.definitions.someJob).to.have.property('lockLimit', 0); - }); - - it('sets the default priority for the job', () => { - expect(globalAgenda.definitions.someJob).to.have.property('priority', 0); - }); - it('takes concurrency option for the job', () => { - globalAgenda.define('highPriority', jobProcessor, { priority: 10 }); - expect(globalAgenda.definitions.highPriority).to.have.property('priority', 10); - }); - }); - - describe('every', () => { - describe('with a job name specified', () => { - it('returns a job', async () => { - expect(await globalAgenda.every('5 minutes', 'send email')).to.be.an.instanceof(Job); - }); - it('sets the repeatEvery', async () => { - expect( - await globalAgenda - .every('5 seconds', 'send email') - .then(({ attrs }) => attrs.repeatInterval) - ).to.equal('5 seconds'); - }); - it('sets the agenda', async () => { - expect( - await globalAgenda.every('5 seconds', 'send email').then(({ agenda }) => agenda) - ).to.equal(globalAgenda); - }); - it('should update a job that was previously scheduled with `every`', async () => { - await globalAgenda.every(10, 'shouldBeSingleJob'); - await delay(10); - await globalAgenda.every(20, 'shouldBeSingleJob'); - - // Give the saves a little time to propagate - await delay(jobTimeout); - - const res = await globalAgenda.jobs({ name: 'shouldBeSingleJob' }); - expect(res).to.have.length(1); - }); - it('should not run immediately if options.skipImmediate is true', async () => { - const jobName = 'send email'; - await globalAgenda.every('5 minutes', jobName, {}, { skipImmediate: true }); - const job = (await globalAgenda.jobs({ name: jobName }))[0]; - const nextRunAt = job.attrs.nextRunAt!.getTime(); - const now = new Date().getTime(); - expect(nextRunAt - now > 0).to.equal(true); - }); - it('should run immediately if options.skipImmediate is false', async () => { - const jobName = 'send email'; - await globalAgenda.every('5 minutes', jobName, {}, { skipImmediate: false }); - const job = (await globalAgenda.jobs({ name: jobName }))[0]; - const nextRunAt = job.attrs.nextRunAt!.getTime(); - const now = new Date().getTime(); - expect(nextRunAt - now <= 0).to.equal(true); - }); - }); - describe('with array of names specified', () => { - it('returns array of jobs', async () => { - expect(await globalAgenda.every('5 minutes', ['send email', 'some job'])).to.be.an( - 'array' - ); - }); - }); - }); - - describe('schedule', () => { - describe('with a job name specified', () => { - it('returns a job', async () => { - expect(await globalAgenda.schedule('in 5 minutes', 'send email')).to.be.an.instanceof( - Job - ); - }); - it('sets the schedule', async () => { - const fiveish = new Date().valueOf() + 250000; - const scheduledJob = await globalAgenda.schedule('in 5 minutes', 'send email'); - expect(scheduledJob.attrs.nextRunAt!.valueOf()).to.be.greaterThan(fiveish); - }); - }); - describe('with array of names specified', () => { - it('returns array of jobs', async () => { - expect(await globalAgenda.schedule('5 minutes', ['send email', 'some job'])).to.be.an( - 'array' - ); - }); - }); - }); - - describe('unique', () => { - describe('should demonstrate unique contraint', () => { - it('should modify one job when unique matches', async () => { - const job1 = await globalAgenda - .create('unique job', { - type: 'active', - userId: '123', - other: true - }) - .unique({ - 'data.type': 'active', - 'data.userId': '123' - }) - .schedule('now') - .save(); - - await delay(100); - - const job2 = await globalAgenda - .create('unique job', { - type: 'active', - userId: '123', - other: false - }) - .unique({ - 'data.type': 'active', - 'data.userId': '123' - }) - .schedule('now') - .save(); - - expect(job1.attrs.nextRunAt!.toISOString()).not.to.equal( - job2.attrs.nextRunAt!.toISOString() - ); - - let jobs = await mongoDb - .collection('agendaJobs') - .find({ - name: 'unique job' - }) - .toArray(); - expect(jobs).to.have.length(1); - }); - - it('should not modify job when unique matches and insertOnly is set to true', async () => { - const job1 = await globalAgenda - .create('unique job', { - type: 'active', - userId: '123', - other: true - }) - .unique( - { - 'data.type': 'active', - 'data.userId': '123' - }, - { - insertOnly: true - } - ) - .schedule('now') - .save(); - - const job2 = await globalAgenda - .create('unique job', { - type: 'active', - userId: '123', - other: false - }) - .unique( - { - 'data.type': 'active', - 'data.userId': '123' - }, - { - insertOnly: true - } - ) - .schedule('now') - .save(); - - expect(job1.attrs.nextRunAt!.toISOString()).to.equal(job2.attrs.nextRunAt!.toISOString()); - - let jobs = await mongoDb - .collection('agendaJobs') - .find({ - name: 'unique job' - }) - .toArray(); - expect(jobs).to.have.length(1); - }); - }); - - describe('should demonstrate non-unique contraint', () => { - it("should create two jobs when unique doesn't match", async () => { - const time = new Date(Date.now() + 1000 * 60 * 3); - const time2 = new Date(Date.now() + 1000 * 60 * 4); - - await globalAgenda - .create('unique job', { - type: 'active', - userId: '123', - other: true - }) - .unique({ - 'data.type': 'active', - 'data.userId': '123', - nextRunAt: time - }) - .schedule(time) - .save(); - - await globalAgenda - .create('unique job', { - type: 'active', - userId: '123', - other: false - }) - .unique({ - 'data.type': 'active', - 'data.userId': '123', - nextRunAt: time2 - }) - .schedule(time) - .save(); - - let jobs = await mongoDb - .collection('agendaJobs') - .find({ - name: 'unique job' - }) - .toArray(); - - expect(jobs).to.have.length(2); - }); - }); - }); - - describe('now', () => { - it('returns a job', async () => { - expect(await globalAgenda.now('send email')).to.to.be.an.instanceof(Job); - }); - it('sets the schedule', async () => { - const now = new Date(); - expect( - await globalAgenda.now('send email').then(({ attrs }) => attrs.nextRunAt!.valueOf()) - ).to.greaterThan(now.valueOf() - 1); - }); - - it('runs the job immediately', async () => { - globalAgenda.define('immediateJob', async job => { - expect(await job.isRunning()).to.be.equal(true); - await globalAgenda.stop(); - }); - await globalAgenda.now('immediateJob'); - await globalAgenda.start(); - }); - }); - - describe('jobs', () => { - it('returns jobs', async () => { - await globalAgenda.create('test').save(); - const c = await globalAgenda.jobs({}); - - expect(c.length).to.not.equals(0); - expect(c[0]).to.to.be.an.instanceof(Job); - await clearJobs(); - }); - }); - - describe('purge', () => { - it('removes all jobs without definitions', async () => { - const job = globalAgenda.create('no definition'); - await globalAgenda.stop(); - await job.save(); - const j = await globalAgenda.jobs({ - name: 'no definition' - }); - - expect(j).to.have.length(1); - await globalAgenda.purge(); - const jAfterPurge = await globalAgenda.jobs({ - name: 'no definition' - }); - - expect(jAfterPurge).to.have.length(0); - }); - }); - - describe('saveJob', () => { - it('persists job to the database', async () => { - const job = globalAgenda.create('someJob', {}); - await job.save(); - - expect(job.attrs._id).to.not.be.equal(undefined); - - await clearJobs(); - }); - }); - }); - - describe('cancel', () => { - beforeEach(async () => { - let remaining = 3; - const checkDone = () => { - remaining -= 1; - }; - - await globalAgenda.create('jobA').save().then(checkDone); - await globalAgenda.create('jobA', 'someData').save().then(checkDone); - await globalAgenda.create('jobB').save().then(checkDone); - expect(remaining).to.equal(0); - }); - - afterEach(async () => { - await globalAgenda.db.removeJobs({ name: { $in: ['jobA', 'jobB'] } }); - }); - - it('should cancel a job', async () => { - const j = await globalAgenda.jobs({ name: 'jobA' }); - expect(j).to.have.length(2); - - await globalAgenda.cancel({ name: 'jobA' }); - const job = await globalAgenda.jobs({ name: 'jobA' }); - - expect(job).to.have.length(0); - }); - - it('should cancel multiple jobs', async () => { - const jobs1 = await globalAgenda.jobs({ name: { $in: ['jobA', 'jobB'] } }); - expect(jobs1).to.have.length(3); - await globalAgenda.cancel({ name: { $in: ['jobA', 'jobB'] } }); - - const jobs2 = await globalAgenda.jobs({ name: { $in: ['jobA', 'jobB'] } }); - expect(jobs2).to.have.length(0); - }); - - it('should cancel jobs only if the data matches', async () => { - const jobs1 = await globalAgenda.jobs({ name: 'jobA', data: 'someData' }); - expect(jobs1).to.have.length(1); - await globalAgenda.cancel({ name: 'jobA', data: 'someData' }); - - const jobs2 = await globalAgenda.jobs({ name: 'jobA', data: 'someData' }); - expect(jobs2).to.have.length(0); - - const jobs3 = await globalAgenda.jobs({ name: 'jobA' }); - expect(jobs3).to.have.length(1); - }); - }); - - describe('search', () => { - beforeEach(async () => { - await globalAgenda.create('jobA', 1).save(); - await globalAgenda.create('jobA', 2).save(); - await globalAgenda.create('jobA', 3).save(); - }); - - afterEach(async () => { - await globalAgenda.db.removeJobs({ name: 'jobA' }); - }); - - it('should limit jobs', async () => { - const results = await globalAgenda.jobs({ name: 'jobA' }, {}, 2); - expect(results).to.have.length(2); - }); - - it('should skip jobs', async () => { - const results = await globalAgenda.jobs({ name: 'jobA' }, {}, 2, 2); - expect(results).to.have.length(1); - }); - - it('should sort jobs', async () => { - const results = await globalAgenda.jobs({ name: 'jobA' }, { data: -1 }); - - expect(results).to.have.length(3); - - const job1 = results[0]; - const job2 = results[1]; - const job3 = results[2]; - - expect(job1.attrs.data).to.equal(3); - expect(job2.attrs.data).to.equal(2); - expect(job3.attrs.data).to.equal(1); - }); - }); - - describe('ensureIndex findAndLockNextJobIndex', () => { - it('ensureIndex-Option false does not create index findAndLockNextJobIndex', async () => { - const agenda = new Agenda({ - mongo: mongoDb, - ensureIndex: false - }); - - agenda.define('someJob', jobProcessor); - await agenda.create('someJob', 1).save(); - - const listIndex = await mongoDb.command({ listIndexes: 'agendaJobs' }); - expect(listIndex.cursor.firstBatch).to.have.lengthOf(1); - expect(listIndex.cursor.firstBatch[0].name).to.be.equal('_id_'); - }); - - it('ensureIndex-Option true does create index findAndLockNextJobIndex', async () => { - const agenda = new Agenda({ - mongo: mongoDb, - ensureIndex: true - }); - - agenda.define('someJob', jobProcessor); - await agenda.create('someJob', 1).save(); - - const listIndex = await mongoDb.command({ listIndexes: 'agendaJobs' }); - expect(listIndex.cursor.firstBatch).to.have.lengthOf(2); - expect(listIndex.cursor.firstBatch[0].name).to.be.equal('_id_'); - expect(listIndex.cursor.firstBatch[1].name).to.be.equal('findAndLockNextJobIndex'); - }); - - it('creating two agenda-instances with ensureIndex-Option true does not throw an error', async () => { - const agenda = new Agenda({ - mongo: mongoDb, - ensureIndex: true - }); - - agenda.define('someJob', jobProcessor); - await agenda.create('someJob', 1).save(); - - const secondAgenda = new Agenda({ - mongo: mongoDb, - ensureIndex: true - }); - - secondAgenda.define('someJob', jobProcessor); - await secondAgenda.create('someJob', 1).save(); - }); - }); - - describe('process jobs', () => { - // eslint-disable-line prefer-arrow-callback - it('do not run failed jobs again', async () => { - const unhandledRejections: any[] = []; - const rejectionsHandler = error => unhandledRejections.push(error); - process.on('unhandledRejection', rejectionsHandler); - - let jprocesses = 0; - - globalAgenda.define('failing job', async _job => { - jprocesses++; - throw new Error('failed'); - }); - - let failCalled = false; - globalAgenda.on('fail:failing job', _err => { - failCalled = true; - }); - - let errorCalled = false; - globalAgenda.on('error', _err => { - errorCalled = true; - }); - - globalAgenda.processEvery(100); - await globalAgenda.start(); - - await globalAgenda.now('failing job'); - - await delay(500); - - process.removeListener('unhandledRejection', rejectionsHandler); - - expect(jprocesses).to.be.equal(1); - expect(errorCalled).to.be.false; - expect(failCalled).to.be.true; - expect(unhandledRejections).to.have.length(0); - }).timeout(10000); - - // eslint-disable-line prefer-arrow-callback - it('ensure there is no unhandledPromise on job timeouts', async () => { - const unhandledRejections: any[] = []; - const rejectionsHandler = error => unhandledRejections.push(error); - process.on('unhandledRejection', rejectionsHandler); - - globalAgenda.define( - 'very short timeout', - (_job, done) => { - setTimeout(() => { - done(); - }, 10000); - }, - { - lockLifetime: 100 - } - ); - - let errorCalled = false; - globalAgenda.on('error', _err => { - errorCalled = true; - }); - - globalAgenda.processEvery(100); - await globalAgenda.start(); - - // await globalAgenda.every('1 seconds', 'j0'); - await globalAgenda.now('very short timeout'); - - await delay(500); - - process.removeListener('unhandledRejection', rejectionsHandler); - - expect(errorCalled).to.be.true; - expect(unhandledRejections).to.have.length(0); - }).timeout(10000); - - it('should not cause unhandledRejection', async () => { - // This unit tests if for this bug [https://github.com/agenda/agenda/issues/884] - // which is not reproducible with default agenda config on shorter processEvery. - // Thus we set the test timeout to 10000, and the delay below to 6000. - - const unhandledRejections: any[] = []; - const rejectionsHandler = error => unhandledRejections.push(error); - process.on('unhandledRejection', rejectionsHandler); - - /* - let j0processes = 0; - globalAgenda.define('j0', (_job, done) => { - j0processes += 1; - done(); - }); */ - - let j1processes = 0; - - globalAgenda.define('j1', (_job, done) => { - j1processes += 1; - done(); - }); - - let j2processes = 0; - globalAgenda.define('j2', (_job, done) => { - j2processes += 1; - done(); - }); - - let j3processes = 0; - globalAgenda.define('j3', async _job => { - j3processes += 1; - }); - await globalAgenda.start(); - - // await globalAgenda.every('1 seconds', 'j0'); - await globalAgenda.every('5 seconds', 'j1'); - await globalAgenda.every('10 seconds', 'j2'); - await globalAgenda.every('15 seconds', 'j3'); - - await delay(3001); - - process.removeListener('unhandledRejection', rejectionsHandler); - - // expect(j0processes).to.equal(5); - expect(j1processes).to.gte(1); - expect(j2processes).to.equal(1); - expect(j3processes).to.equal(1); - - expect(unhandledRejections).to.have.length(0); - }).timeout(10500); - }); -}); diff --git a/test/fixtures/add-tests.ts b/test/fixtures/add-tests.ts deleted file mode 100644 index a2b121f..0000000 --- a/test/fixtures/add-tests.ts +++ /dev/null @@ -1,76 +0,0 @@ -/* eslint-disable unicorn/no-process-exit */ -export default { - none: (): void => {}, - daily: agenda => { - agenda.define('once a day test job', (job, done) => { - process.send!('ran'); - done(); - process.exit(0); - }); - - agenda.every('one day', 'once a day test job'); - }, - 'daily-array': agenda => { - agenda.define('daily test 1', (job, done) => { - process.send!('test1-ran'); - done(); - }); - - agenda.define('daily test 2', (job, done) => { - process.send!('test2-ran'); - done(); - }); - - agenda.every('one day', ['daily test 1', 'daily test 2']); - }, - 'define-future-job': agenda => { - const future = new Date(); - future.setDate(future.getDate() + 1); - - agenda.define('job in the future', (job, done) => { - process.send!('ran'); - done(); - process.exit(0); - }); - - agenda.schedule(future, 'job in the future'); - }, - 'define-past-due-job': agenda => { - const past = new Date(); - past.setDate(past.getDate() - 1); - - agenda.define('job in the past', (job, done) => { - process.send!('ran'); - done(); - process.exit(0); - }); - - agenda.schedule(past, 'job in the past'); - }, - 'schedule-array': agenda => { - const past = new Date(); - past.setDate(past.getDate() - 1); - - agenda.define('scheduled test 1', (job, done) => { - process.send!('test1-ran'); - done(); - }); - - agenda.define('scheduled test 2', (job, done) => { - process.send!('test2-ran'); - done(); - }); - - agenda.schedule(past, ['scheduled test 1', 'scheduled test 2']); - }, - now(agenda) { - agenda.define('now run this job', (job, done) => { - process.send!('ran'); - done(); - process.exit(0); - }); - - agenda.now('now run this job'); - } -}; -/* eslint-enable unicorn/no-process-exit */ diff --git a/test/fixtures/agenda-instance.ts b/test/fixtures/agenda-instance.ts deleted file mode 100644 index 44b8a01..0000000 --- a/test/fixtures/agenda-instance.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Agenda } from '../../src/index.js'; -import addTests from './add-tests.js'; - -const connStr = process.argv[2]; -const tests = process.argv.slice(3); - -const agenda = new Agenda( - { - db: { - address: connStr - }, - processEvery: 100 - }, - async () => { - tests.forEach(test => { - addTests[test](agenda); - }); - - await agenda.start(); - - // Ensure we can shut down the process from tests - process.on('message', msg => { - if (msg === 'exit') { - process.exit(0); - } - }); - - // Send default message of "notRan" after 400ms - setTimeout(() => { - process.send!('notRan'); - // eslint-disable-next-line unicorn/no-process-exit - process.exit(0); - }, 400); - } -); diff --git a/test/fixtures/someJobDefinition.ts b/test/fixtures/someJobDefinition.ts deleted file mode 100644 index 0322c55..0000000 --- a/test/fixtures/someJobDefinition.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Agenda } from '../../src/index.js'; - -export default (agenda: Agenda, _definitionOnly = false) => { - agenda.define('some job', async job => { - console.log('HELLO from a sub worker'); - if (job.attrs.data?.failIt === 'error') { - throw new Error('intended error :-)'); - } else if (job.attrs.data?.failIt === 'die') { - process.exit(3); - } else if (job.attrs.data?.failIt === 'timeout') { - await new Promise(resolve => { - setTimeout(resolve, 5000); - }); - } - await job.touch(); - }); -}; diff --git a/test/helpers/forkHelper.ts b/test/helpers/forkHelper.ts deleted file mode 100644 index 58e2455..0000000 --- a/test/helpers/forkHelper.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { Agenda } from '../../src/index.js'; - -function isCancelMessage(message): message is { type: 'cancel'; error: string } { - return message !== null && typeof message === 'object' && message.type === 'cancel'; -} - -(async () => { - /** do other required initializations */ - - // get process arguments (name, jobId and path to agenda definition file) - const [, , name, jobId, agendaDefinition] = process.argv; - - // set fancy process title - process.title = `${process.title} (sub worker: ${name}/${jobId})`; - - // initialize Agenda in "forkedWorker" mode - const agenda = new Agenda({ name: `subworker-${name}`, forkedWorker: true }); - // connect agenda (but do not start it) - await agenda.database(process.env.DB_CONNECTION!); - - if (!name || !jobId) { - throw new Error(`invalid parameters: ${JSON.stringify(process.argv)}`); - } - - // load job definition - /** in this case the file is for example ../some/path/definitions.js - with a content like: - export default (agenda: Agenda, definitionOnly = false) => { - agenda.define( - 'some job', - async (notification: { - attrs: { data: { dealId: string; orderId: TypeObjectId } }; - }) => { - // do something - } - ); - - if (!definitionOnly) { - // here you can create scheduled jobs or other things - } - }); - */ - if (agendaDefinition) { - const loadDefinition = await import(agendaDefinition); - (loadDefinition.default || loadDefinition)(agenda, true); - } - - // run this job now - const job = await agenda.getForkedJob(jobId); - - process.on('message', message => { - if (isCancelMessage(message)) { - job.cancel(message.error); - setTimeout(() => { - // kill it after 10 seconds - process.exit(2); - }, 10000); - } else { - console.log('got message', message); - } - }); - - await job.runJob(); - - // disconnect database and exit - process.exit(0); -})().catch(err => { - console.error('err', err); - if (process.send) { - process.send(JSON.stringify(err)); - } - process.exit(1); -}); diff --git a/test/helpers/mock-mongodb.ts b/test/helpers/mock-mongodb.ts deleted file mode 100644 index 9e5c144..0000000 --- a/test/helpers/mock-mongodb.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { MongoMemoryServer } from 'mongodb-memory-server'; -import { MongoClient } from 'mongodb'; -import debug from 'debug'; - -const log = debug('agenda:mock-mongodb'); - -export interface IMockMongo { - disconnect: () => void; - mongo: MongoClient; - mongod: MongoMemoryServer; - uri: string; -} - -export async function mockMongo(): Promise { - - const self: IMockMongo = {} as any; - self.mongod = await MongoMemoryServer.create(); - const uri = self.mongod.getUri(); - log('mongod started', uri); - - // @ts-ignore - self.mongo = await MongoClient.connect(uri); - self.disconnect = function () { - self.mongod.stop(); - log('mongod stopped'); - self.mongo.close(); - }; - self.uri = uri; - - return self; -} diff --git a/test/job.test.ts b/test/job.test.ts deleted file mode 100644 index dd376da..0000000 --- a/test/job.test.ts +++ /dev/null @@ -1,1837 +0,0 @@ -/* eslint-disable no-console */ -import path from 'node:path'; -import { fileURLToPath } from 'node:url'; -import cp from 'node:child_process'; -import { expect } from 'chai'; -import assert from 'node:assert'; -import { DateTime } from 'luxon'; -import { Db } from 'mongodb'; - -import delay from 'delay'; -import * as sinon from 'sinon'; -import { fail } from 'assert'; -import { Job } from '../src/Job.js'; -import { Agenda } from '../src/index.js'; -import { mockMongo } from './helpers/mock-mongodb.js'; -import someJobDefinition from './fixtures/someJobDefinition.js'; -const __dirname = path.dirname(fileURLToPath(import.meta.url)); - -// Create agenda instances -let agenda: Agenda; -// connection string to mongodb -let mongoCfg: string; -// mongo db connection db instance -let mongoDb: Db; - -const clearJobs = async () => { - if (mongoDb) { - await mongoDb.collection('agendaJobs').deleteMany({}); - } -}; - -// Slow timeouts for Travis -const jobTimeout = 500; -const jobType = 'do work'; -const jobProcessor = () => {}; - -describe('Job', () => { - beforeEach(async function() { - if (!mongoDb) { - this.timeout(0); - const mockedMongo = await mockMongo(); - mongoCfg = mockedMongo.uri; - mongoDb = mockedMongo.mongo.db(); - } - - return new Promise(resolve => { - agenda = new Agenda( - { - mongo: mongoDb - }, - async () => { - await delay(50); - await clearJobs(); - agenda.define('someJob', jobProcessor); - agenda.define('send email', jobProcessor); - agenda.define('some job', jobProcessor); - agenda.define(jobType, jobProcessor); - return resolve(); - } - ); - }); - }); - - afterEach(async () => { - await delay(50); - await agenda.stop(); - await clearJobs(); - // await mongoClient.disconnect(); - // await jobs._db.close(); - }); - - describe('repeatAt', () => { - const job = new Job(agenda, { name: 'demo', type: 'normal' }); - it('sets the repeat at', () => { - job.repeatAt('3:30pm'); - expect(job.attrs.repeatAt).to.equal('3:30pm'); - }); - it('returns the job', () => { - expect(job.repeatAt('3:30pm')).to.equal(job); - }); - }); - - describe('toJSON', () => { - it('failedAt', () => { - let job = new Job(agenda, { - name: 'demo', - type: 'normal', - nextRunAt: null, - failedAt: null as any - }); - expect(job.toJson().failedAt).to.be.not.a('Date'); - - job = new Job(agenda, { - name: 'demo', - type: 'normal', - nextRunAt: null, - failedAt: new Date() - }); - expect(job.toJson().failedAt).to.be.a('Date'); - }); - }); - - describe('unique', () => { - const job = new Job(agenda, { name: 'demo', type: 'normal' }); - it('sets the unique property', () => { - job.unique({ 'data.type': 'active', 'data.userId': '123' }); - expect(JSON.stringify(job.attrs.unique)).to.equal( - JSON.stringify({ 'data.type': 'active', 'data.userId': '123' }) - ); - }); - it('returns the job', () => { - expect(job.unique({ 'data.type': 'active', 'data.userId': '123' })).to.equal(job); - }); - }); - - describe('repeatEvery', () => { - const job = new Job(agenda, { name: 'demo', type: 'normal' }); - it('sets the repeat interval', () => { - job.repeatEvery(5000); - expect(job.attrs.repeatInterval).to.equal(5000); - }); - it('returns the job', () => { - expect(job.repeatEvery('one second')).to.equal(job); - }); - it('sets the nextRunAt property with skipImmediate', () => { - const job2 = new Job(agenda, { name: 'demo', type: 'normal' }); - const now = new Date().valueOf(); - job2.repeatEvery('3 minutes', { skipImmediate: true }); - expect(job2.attrs.nextRunAt).to.be.within(new Date(now + 180000 - 2), new Date(now + 180002)); // Inclusive - }); - it('repeats from the existing nextRunAt property with skipImmediate', () => { - const job2 = new Job(agenda, { name: 'demo', type: 'normal' }); - const futureDate = new Date('3000-01-01T00:00:00'); - job2.attrs.nextRunAt = futureDate; - job2.repeatEvery('3 minutes', { skipImmediate: true }); - expect(job2.attrs.nextRunAt!.getTime()).to.equal(futureDate.getTime() + 180000); - }); - it('repeats from the existing scheduled date with skipImmediate', () => { - const futureDate = new Date('3000-01-01T00:00:00'); - const job2 = new Job(agenda, { name: 'demo', type: 'normal' }).schedule(futureDate); - job2.repeatEvery('3 minutes', { skipImmediate: true }); - expect(job2.attrs.nextRunAt!.getTime()).to.equal(futureDate.valueOf() + 180000); - }); - }); - - describe('schedule', () => { - let job; - beforeEach(() => { - job = new Job(agenda, { name: 'demo', type: 'normal' }); - }); - it('sets the next run time', () => { - job.schedule('in 5 minutes'); - expect(job.attrs.nextRunAt).to.be.an.instanceof(Date); - }); - it('sets the next run time Date object', () => { - const when = new Date(Date.now() + 1000 * 60 * 3); - job.schedule(when); - expect(job.attrs.nextRunAt).to.be.an.instanceof(Date); - expect(job.attrs.nextRunAt.getTime()).to.eql(when.getTime()); - }); - it('returns the job', () => { - expect(job.schedule('tomorrow at noon')).to.equal(job); - }); - it('understands ISODates on the 30th', () => { - // https://github.com/agenda/agenda/issues/807 - expect(job.schedule('2019-04-30T22:31:00.00Z').attrs.nextRunAt.getTime()).to.equal( - 1556663460000 - ); - }); - }); - - describe('priority', () => { - let job; - beforeEach(() => { - job = new Job(agenda, { name: 'demo', type: 'normal' }); - }); - it('sets the priority to a number', () => { - job.priority(10); - expect(job.attrs.priority).to.equal(10); - }); - it('returns the job', () => { - expect(job.priority(50)).to.equal(job); - }); - it('parses written priorities', () => { - job.priority('high'); - expect(job.attrs.priority).to.equal(10); - }); - }); - - describe('computeNextRunAt', () => { - let job: Job; - - beforeEach(() => { - job = new Job(agenda, { name: 'demo', type: 'normal' }); - }); - - it('returns the job', () => { - const jobProto = Object.getPrototypeOf(job); - expect(jobProto.computeNextRunAt.call(job)).to.equal(job); - }); - - it('sets to undefined if no repeat at', () => { - job.attrs.repeatAt = undefined; - const jobProto = Object.getPrototypeOf(job); - jobProto.computeNextRunAt.call(job); - expect(job.attrs.nextRunAt).to.equal(null); - }); - - it('it understands repeatAt times', () => { - const d = new Date(); - d.setHours(23); - d.setMinutes(59); - d.setSeconds(0); - job.attrs.repeatAt = '11:59pm'; - const jobProto = Object.getPrototypeOf(job); - jobProto.computeNextRunAt.call(job); - expect(job.attrs.nextRunAt?.getHours()).to.equal(d.getHours()); - expect(job.attrs.nextRunAt?.getMinutes()).to.equal(d.getMinutes()); - }); - - it('sets to undefined if no repeat interval', () => { - job.attrs.repeatInterval = undefined; - const jobProto = Object.getPrototypeOf(job); - jobProto.computeNextRunAt.call(job); - expect(job.attrs.nextRunAt).to.equal(null); - }); - - it('it understands human intervals', () => { - const now = new Date(); - job.attrs.lastRunAt = now; - job.repeatEvery('2 minutes'); - const jobProto = Object.getPrototypeOf(job); - jobProto.computeNextRunAt.call(job); - expect(job.attrs.nextRunAt?.getTime()).to.equal(now.valueOf() + 120000); - }); - - it('understands cron intervals', () => { - const now = new Date(); - now.setMinutes(1); - now.setMilliseconds(0); - now.setSeconds(0); - job.attrs.lastRunAt = now; - job.repeatEvery('*/2 * * * *'); - const jobProto = Object.getPrototypeOf(job); - jobProto.computeNextRunAt.call(job); - expect(job.attrs.nextRunAt?.valueOf()).to.equal(now.valueOf() + 60000); - }); - - it('understands cron intervals with a timezone', () => { - const date = new Date('2015-01-01T06:01:00-00:00'); - job.attrs.lastRunAt = date; - job.repeatEvery('0 6 * * *', { - timezone: 'GMT' - }); - const jobProto = Object.getPrototypeOf(job); - jobProto.computeNextRunAt.call(job); - expect(DateTime.fromJSDate(job.attrs.nextRunAt!).setZone('GMT').hour).to.equal(6); - expect(DateTime.fromJSDate(job.attrs.nextRunAt!).toJSDate().getDate()).to.equal( - DateTime.fromJSDate(job.attrs.lastRunAt!).plus({ days: 1 }).toJSDate().getDate() - ); - }); - - it('understands cron intervals with a vienna timezone with higher hours', () => { - const date = new Date('2015-01-01T06:01:00-00:00'); - job.attrs.lastRunAt = date; - job.repeatEvery('0 16 * * *', { - timezone: 'Europe/Vienna' - }); - const jobProto = Object.getPrototypeOf(job); - jobProto.computeNextRunAt.call(job); - expect(DateTime.fromJSDate(job.attrs.nextRunAt!).setZone('GMT').hour).to.equal(15); - expect(DateTime.fromJSDate(job.attrs.nextRunAt!).toJSDate().getDate()).to.equal( - DateTime.fromJSDate(job.attrs.lastRunAt!).toJSDate().getDate() - ); - }); - - it('understands cron intervals with a timezone when last run is the same as the interval', () => { - const date = new Date('2015-01-01T06:00:00-00:00'); - job.attrs.lastRunAt = date; - job.repeatEvery('0 6 * * *', { - timezone: 'GMT' - }); - const jobProto = Object.getPrototypeOf(job); - jobProto.computeNextRunAt.call(job); - expect(DateTime.fromJSDate(job.attrs.nextRunAt!).setZone('GMT').hour).to.equal(6); - expect(DateTime.fromJSDate(job.attrs.nextRunAt!).toJSDate().getDate()).to.equal( - DateTime.fromJSDate(job.attrs.lastRunAt!).plus({ days: 1 }).toJSDate().getDate() - ); - }); - - it('gives the correct nextDate when the lastRun is 1ms before the expected time', () => { - // (Issue #858): lastRunAt being 1ms before the nextRunAt makes cronTime return the same nextRunAt - const last = new Date(); - last.setSeconds(59); - last.setMilliseconds(999); - const next = new Date(last.valueOf() + 1); - const expectedDate = new Date(next.valueOf() + 60000); - job.attrs.lastRunAt = last; - job.attrs.nextRunAt = next; - job.repeatEvery('* * * * *', { - timezone: 'GMT' - }); - const jobProto = Object.getPrototypeOf(job); - jobProto.computeNextRunAt.call(job); - expect(job.attrs.nextRunAt.valueOf()).to.equal(expectedDate.valueOf()); - }); - - it('cron job with month starting at 1', async () => { - job.repeatEvery('0 0 * 1 *', { - timezone: 'GMT' - }); - if (job.attrs.nextRunAt) { - expect(job.attrs.nextRunAt.getMonth()).to.equal(0); - } else { - fail(); - } - }); - - it('repeating job with cron', async () => { - job.repeatEvery('0 0 * 1 *', { - timezone: 'GMT' - }); - expect(job.attrs.nextRunAt).to.not.eql(null); - }); - - describe('when repeat at time is invalid', () => { - beforeEach(() => { - job.attrs.repeatAt = 'foo'; - const jobProto = Object.getPrototypeOf(job); - jobProto.computeNextRunAt.call(job); - }); - - it('sets nextRunAt to null', () => { - expect(job.attrs.nextRunAt).to.equal(null); - }); - - it('fails the job', () => { - expect(job.attrs.failReason).to.equal( - 'failed to calculate repeatAt time due to invalid format' - ); - }); - }); - - describe('when repeat interval is invalid', () => { - beforeEach(() => { - job.attrs.repeatInterval = 'asd'; - const jobProto = Object.getPrototypeOf(job); - jobProto.computeNextRunAt.call(job); - }); - - it('sets nextRunAt to null', () => { - expect(job.attrs.nextRunAt).to.equal(null); - }); - - it('fails the job', () => { - expect(job.attrs.failReason).to.equal( - 'failed to calculate nextRunAt due to invalid repeat interval (asd): Error: Validation error, cannot resolve alias "asd"' - ); - }); - }); - }); - - describe('remove', () => { - it('removes the job', async () => { - const job = new Job(agenda, { - name: 'removed job', - type: 'normal' - }); - await job.save(); - const resultSaved = await mongoDb - .collection('agendaJobs') - .find({ - _id: job.attrs._id - }) - .toArray(); - - expect(resultSaved).to.have.length(1); - await job.remove(); - - const resultDeleted = await mongoDb - .collection('agendaJobs') - .find({ - _id: job.attrs._id - }) - .toArray(); - - expect(resultDeleted).to.have.length(0); - }); - }); - - describe('run', () => { - beforeEach(async () => { - agenda.define('testRun', (_job, done) => { - setTimeout(() => { - done(); - }, 100); - }); - }); - - it('updates lastRunAt', async () => { - const job = new Job(agenda, { name: 'testRun', type: 'normal' }); - await job.save(); - const now = new Date(); - await delay(5); - await job.run(); - - expect(job.attrs.lastRunAt?.valueOf()).to.greaterThan(now.valueOf()); - }); - - it('fails if job is undefined', async () => { - const job = new Job(agenda, { name: 'not defined', type: 'normal' }); - await job.save(); - - await job.run().catch(error => { - expect(error.message).to.equal('Undefined job'); - }); - expect(job.attrs.failedAt).to.not.be.undefined; - expect(job.attrs.failReason).to.equal('Undefined job'); - }); - - it('updates nextRunAt', async () => { - const job = new Job(agenda, { name: 'testRun', type: 'normal' }); - await job.save(); - - const now = new Date(); - job.repeatEvery('10 minutes'); - await delay(5); - await job.run(); - expect(job.attrs.nextRunAt?.valueOf()).to.greaterThan(now.valueOf() + 59999); - }); - - it('handles errors', async () => { - const job = new Job(agenda, { name: 'failBoat', type: 'normal' }); - await job.save(); - - agenda.define('failBoat', () => { - throw new Error('Zomg fail'); - }); - await job.run(); - expect(job.attrs.failReason).to.equal('Zomg fail'); - }); - - it('handles errors with q promises', async () => { - const job = new Job(agenda, { name: 'failBoat2', type: 'normal' }); - await job.save(); - - agenda.define('failBoat2', async (_job, cb) => { - try { - throw new Error('Zomg fail'); - } catch (err: any) { - cb(err); - } - }); - await job.run(); - expect(job.attrs.failReason).to.not.be.undefined; - }); - - it('allows async functions', async () => { - const job = new Job(agenda, { name: 'async', type: 'normal' }); - await job.save(); - - const successSpy = sinon.stub(); - let finished = false; - - agenda.once('success:async', successSpy); - - agenda.define('async', async () => { - await delay(5); - finished = true; - }); - - expect(finished).to.equal(false); - await job.run(); - expect(successSpy.callCount).to.equal(1); - expect(finished).to.equal(true); - }); - - it('handles errors from async functions', async () => { - const job = new Job(agenda, { name: 'asyncFail', type: 'normal' }); - await job.save(); - - const failSpy = sinon.stub(); - const err = new Error('failure'); - - agenda.once('fail:asyncFail', failSpy); - - agenda.define('asyncFail', async () => { - await delay(5); - throw err; - }); - - await job.run(); - expect(failSpy.callCount).to.equal(1); - expect(failSpy.calledWith(err)).to.equal(true); - }); - - it('waits for the callback to be called even if the function is async', async () => { - const job = new Job(agenda, { name: 'asyncCb', type: 'normal' }); - await job.save(); - - const successSpy = sinon.stub(); - let finishedCb = false; - - agenda.once('success:asyncCb', successSpy); - - agenda.define('asyncCb', async (_job, cb) => { - (async () => { - await delay(5); - finishedCb = true; - cb(); - })(); - }); - - await job.run(); - expect(finishedCb).to.equal(true); - expect(successSpy.callCount).to.equal(1); - }); - - it("uses the callback error if the function is async and didn't reject", async () => { - const job = new Job(agenda, { name: 'asyncCbError', type: 'normal' }); - await job.save(); - - const failSpy = sinon.stub(); - const err = new Error('failure'); - - agenda.once('fail:asyncCbError', failSpy); - - agenda.define('asyncCbError', async (_job, cb) => { - (async () => { - await delay(5); - cb(err); - })(); - }); - - await job.run(); - expect(failSpy.callCount).to.equal(1); - expect(failSpy.calledWith(err)).to.equal(true); - }); - - it('favors the async function error over the callback error if it comes first', async () => { - const job = new Job(agenda, { name: 'asyncCbTwoError', type: 'normal' }); - await job.save(); - - const failSpy = sinon.stub(); - const fnErr = new Error('functionFailure'); - const cbErr = new Error('callbackFailure'); - - agenda.on('fail:asyncCbTwoError', failSpy); - - agenda.define('asyncCbTwoError', async (_job, cb) => { - (async () => { - await delay(5); - cb(cbErr); - })(); - - throw fnErr; - }); - - await job.run(); - expect(failSpy.callCount).to.equal(1); - expect(failSpy.calledWith(fnErr)).to.equal(true); - expect(failSpy.calledWith(cbErr)).to.equal(false); - }); - - it('favors the callback error over the async function error if it comes first', async () => { - const job = new Job(agenda, { name: 'asyncCbTwoErrorCb', type: 'normal' }); - await job.save(); - - const failSpy = sinon.stub(); - const fnErr = new Error('functionFailure'); - const cbErr = new Error('callbackFailure'); - - agenda.on('fail:asyncCbTwoErrorCb', failSpy); - - agenda.define('asyncCbTwoErrorCb', async (_job, cb) => { - cb(cbErr); - await delay(5); - throw fnErr; - }); - - await job.run(); - expect(failSpy.callCount).to.equal(1); - expect(failSpy.calledWith(cbErr)).to.equal(true); - expect(failSpy.calledWith(fnErr)).to.equal(false); - }); - - it("doesn't allow a stale job to be saved", async () => { - const job = new Job(agenda, { name: 'failBoat3', type: 'normal' }); - await job.save(); - - agenda.define('failBoat3', async (_job, cb) => { - // Explicitly find the job again, - // so we have a new job object - const jobs = await agenda.jobs({ name: 'failBoat3' }); - expect(jobs).to.have.length(1); - await jobs[0].remove(); - cb(); - }); - - await job.run(); - - // Expect the deleted job to not exist in the database - const deletedJob = await agenda.jobs({ name: 'failBoat3' }); - expect(deletedJob).to.have.length(0); - }); - }); - - describe('touch', () => { - it('extends the lock lifetime', async () => { - const lockedAt = new Date(); - const job = new Job(agenda, { name: 'some job', type: 'normal', lockedAt }); - await job.save(); - await delay(2); - await job.touch(); - expect(job.attrs.lockedAt).to.greaterThan(lockedAt); - }); - }); - - describe('fail', () => { - const job = new Job(agenda, { name: 'demo', type: 'normal' }); - it('takes a string', () => { - job.fail('test'); - expect(job.attrs.failReason).to.equal('test'); - }); - it('takes an error object', () => { - job.fail(new Error('test')); - expect(job.attrs.failReason).to.equal('test'); - }); - it('sets the failedAt time', () => { - job.fail('test'); - expect(job.attrs.failedAt).to.be.an.instanceof(Date); - }); - it('sets the failedAt time equal to lastFinishedAt time', () => { - job.fail('test'); - expect(job.attrs.failedAt).to.equal(job.attrs.lastFinishedAt); - }); - }); - - describe('enable', () => { - it('sets disabled to false on the job', () => { - const job = new Job(agenda, { name: 'test', type: 'normal', disabled: true }); - job.enable(); - expect(job.attrs.disabled).to.equal(false); - }); - - it('returns the job', () => { - const job = new Job(agenda, { name: 'test', type: 'normal', disabled: true }); - expect(job.enable()).to.equal(job); - }); - }); - - describe('disable', () => { - it('sets disabled to true on the job', () => { - const job = new Job(agenda, { name: 'demo', type: 'normal' }); - job.disable(); - expect(job.attrs.disabled).to.be.true; - }); - it('returns the job', () => { - const job = new Job(agenda, { name: 'demo', type: 'normal' }); - expect(job.disable()).to.equal(job); - }); - }); - - describe('save', () => { - /** this is undocumented, and therefore we remvoe it - it('calls saveJob on the agenda', done => { - const oldSaveJob = agenda.saveJob; - agenda.saveJob = () => { - agenda.saveJob = oldSaveJob; - done(); - }; - - const job = agenda.create('some job', { - wee: 1 - }); - job.save(); - }); */ - - it('doesnt save the job if its been removed', async () => { - const job = agenda.create('another job'); - // Save, then remove, then try and save again. - // The second save should fail. - const j = await job.save(); - await j.remove(); - await j.save(); - - const jobs = await agenda.jobs({ name: 'another job' }); - expect(jobs).to.have.length(0); - }); - - it('returns the job', async () => { - const job = agenda.create('some job', { - wee: 1 - }); - expect(await job.save()).to.equal(job); - }); - }); - - describe('start/stop', () => { - it('starts/stops the job queue', async () => { - const processed = new Promise(resolve => { - agenda.define('jobQueueTest', async _job => { - resolve('processed'); - }); - }); - await agenda.every('1 second', 'jobQueueTest'); - agenda.processEvery('1 second'); - await agenda.start(); - - expect( - await Promise.race([ - processed, - new Promise(resolve => { - setTimeout(() => resolve(`not processed`), 1100); - }) - ]) - ).to.eq('processed'); - - await agenda.stop(); - const processedStopped = new Promise(resolve => { - agenda.define('jobQueueTest', async _job => { - resolve(); - }); - }); - - expect( - await Promise.race([ - processedStopped, - new Promise(resolve => { - setTimeout(() => resolve(`not processed`), 1100); - }) - ]) - ).to.eq('not processed'); - }); - - it('does not run disabled jobs', async () => { - let ran = false; - agenda.define('disabledJob', () => { - ran = true; - }); - - const job = await agenda.create('disabledJob').disable().schedule('now'); - await job.save(); - await agenda.start(); - await delay(jobTimeout); - - expect(ran).to.equal(false); - - await agenda.stop(); - }); - - it('does not throw an error trying to process undefined jobs', async () => { - await agenda.start(); - const job = agenda.create('jobDefinedOnAnotherServer').schedule('now'); - - await job.save(); - - await delay(jobTimeout); - await agenda.stop(); - }); - - it('clears locks on stop', async () => { - agenda.define('longRunningJob', (_job, _cb) => { - // eslint-disable-line no-unused-vars - // Job never finishes - }); - agenda.every('10 seconds', 'longRunningJob'); - agenda.processEvery('1 second'); - - await agenda.start(); - await delay(jobTimeout); - const jobStarted = await agenda.db.getJobs({ name: 'longRunningJob' }); - expect(jobStarted[0].lockedAt).to.not.equal(null); - await agenda.stop(); - const job = await agenda.db.getJobs({ name: 'longRunningJob' }); - expect(job[0].lockedAt).to.equal(undefined); - }); - - describe('events', () => { - beforeEach(() => { - agenda.define('jobQueueTest', (_job, cb) => { - cb(); - }); - agenda.define('failBoat', () => { - throw new Error('Zomg fail'); - }); - }); - - it('emits start event', async () => { - const spy = sinon.spy(); - const job = new Job(agenda, { name: 'jobQueueTest', type: 'normal' }); - await job.save(); - agenda.once('start', spy); - - await job.run(); - expect(spy.called).to.be.true; - expect(spy.calledWithExactly(job)).to.be.true; - }); - - it('emits start:job name event', async () => { - const spy = sinon.spy(); - const job = new Job(agenda, { name: 'jobQueueTest', type: 'normal' }); - await job.save(); - agenda.once('start:jobQueueTest', spy); - - await job.run(); - expect(spy.called).to.be.true; - expect(spy.calledWithExactly(job)).to.be.true; - }); - - it('emits complete event', async () => { - const spy = sinon.spy(); - const job = new Job(agenda, { name: 'jobQueueTest', type: 'normal' }); - await job.save(); - agenda.once('complete', spy); - - await job.run(); - expect(spy.called).to.be.true; - expect(spy.calledWithExactly(job)).to.be.true; - }); - - it('emits complete:job name event', async () => { - const spy = sinon.spy(); - const job = new Job(agenda, { name: 'jobQueueTest', type: 'normal' }); - await job.save(); - agenda.once('complete:jobQueueTest', spy); - - await job.run(); - expect(spy.called).to.be.true; - expect(spy.calledWithExactly(job)).to.be.true; - }); - - it('emits success event', async () => { - const spy = sinon.spy(); - const job = new Job(agenda, { name: 'jobQueueTest', type: 'normal' }); - await job.save(); - agenda.once('success', spy); - - await job.run(); - expect(spy.called).to.be.true; - expect(spy.calledWithExactly(job)).to.be.true; - }); - - it('emits success:job name event', async () => { - const spy = sinon.spy(); - const job = new Job(agenda, { name: 'jobQueueTest', type: 'normal' }); - await job.save(); - agenda.once('success:jobQueueTest', spy); - - await job.run(); - expect(spy.called).to.be.true; - expect(spy.calledWithExactly(job)).to.be.true; - }); - - it('emits fail event', async () => { - const spy = sinon.spy(); - const job = new Job(agenda, { name: 'failBoat', type: 'normal' }); - await job.save(); - agenda.once('fail', spy); - - await job.run().catch(error => { - expect(error.message).to.equal('Zomg fail'); - }); - - expect(spy.called).to.be.true; - - const err = spy.args[0][0]; - expect(err.message).to.equal('Zomg fail'); - expect(job.attrs.failCount).to.equal(1); - expect(job.attrs.failedAt!.valueOf()).not.to.be.below(job.attrs.lastFinishedAt!.valueOf()); - }); - - it('emits fail:job name event', async () => { - const spy = sinon.spy(); - const job = new Job(agenda, { name: 'failBoat', type: 'normal' }); - await job.save(); - agenda.once('fail:failBoat', spy); - - await job.run().catch(error => { - expect(error.message).to.equal('Zomg fail'); - }); - - expect(spy.called).to.be.true; - - const err = spy.args[0][0]; - expect(err.message).to.equal('Zomg fail'); - expect(job.attrs.failCount).to.equal(1); - expect(job.attrs.failedAt!.valueOf()).to.not.be.below(job.attrs.lastFinishedAt!.valueOf()); - }); - }); - }); - - describe('job lock', () => { - it('runs a recurring job after a lock has expired', async () => { - const processorPromise = new Promise(resolve => { - let startCounter = 0; - agenda.define( - 'lock job', - async () => { - startCounter++; - - if (startCounter !== 1) { - await agenda.stop(); - resolve(startCounter); - } - }, - { - lockLifetime: 50 - } - ); - }); - - expect(agenda.definitions['lock job'].lockLifetime).to.equal(50); - - agenda.defaultConcurrency(100); - agenda.processEvery(10); - agenda.every('0.02 seconds', 'lock job'); - await agenda.stop(); - await agenda.start(); - expect(await processorPromise).to.equal(2); - }); - - it('runs a one-time job after its lock expires', async () => { - const processorPromise = new Promise(resolve => { - let runCount = 0; - - agenda.define( - 'lock job', - async _job => { - runCount++; - if (runCount === 1) { - // this should time out - await new Promise(longResolve => { - setTimeout(longResolve, 1000); - }); - } else { - await new Promise(longResolve => { - setTimeout(longResolve, 10); - }); - resolve(runCount); - } - }, - { - lockLifetime: 50, - concurrency: 1 - } - ); - }); - - let errorHasBeenThrown; - agenda.on('error', err => { - errorHasBeenThrown = err; - }); - agenda.processEvery(25); - await agenda.start(); - agenda.now('lock job', { - i: 1 - }); - expect(await processorPromise).to.equal(2); - expect(errorHasBeenThrown?.message).to.includes("execution of 'lock job' canceled"); - }); - - it('does not process locked jobs', async () => { - const history: any[] = []; - - agenda.define( - 'lock job', - (job, cb) => { - history.push(job.attrs.data.i); - - setTimeout(() => { - cb(); - }, 150); - }, - { - lockLifetime: 300 - } - ); - - agenda.processEvery(100); - await agenda.start(); - - await Promise.all([ - agenda.now('lock job', { i: 1 }), - agenda.now('lock job', { i: 2 }), - agenda.now('lock job', { i: 3 }) - ]); - - await delay(500); - expect(history).to.have.length(3); - expect(history).to.contain(1); - expect(history).to.contain(2); - expect(history).to.contain(3); - }); - - it('does not on-the-fly lock more than agenda._lockLimit jobs', async () => { - agenda.lockLimit(1); - - agenda.define('lock job', (_job, _cb) => { - /* this job nevers finishes */ - }); // eslint-disable-line no-unused-vars - - await agenda.start(); - - await Promise.all([agenda.now('lock job', { i: 1 }), agenda.now('lock job', { i: 2 })]); - - // give it some time to get picked up - await delay(200); - - expect((await agenda.getRunningStats()).lockedJobs).to.equal(1); - }); - - it('does not on-the-fly lock more mixed jobs than agenda._lockLimit jobs', async () => { - agenda.lockLimit(1); - - agenda.define('lock job', (_job, _cb) => {}); // eslint-disable-line no-unused-vars - agenda.define('lock job2', (_job, _cb) => {}); // eslint-disable-line no-unused-vars - agenda.define('lock job3', (_job, _cb) => {}); // eslint-disable-line no-unused-vars - agenda.define('lock job4', (_job, _cb) => {}); // eslint-disable-line no-unused-vars - agenda.define('lock job5', (_job, _cb) => {}); // eslint-disable-line no-unused-vars - - await agenda.start(); - - await Promise.all([ - agenda.now('lock job', { i: 1 }), - agenda.now('lock job5', { i: 2 }), - agenda.now('lock job4', { i: 3 }), - agenda.now('lock job3', { i: 4 }), - agenda.now('lock job2', { i: 5 }) - ]); - - await delay(500); - expect((await agenda.getRunningStats()).lockedJobs).to.equal(1); - await agenda.stop(); - }); - - it('does not on-the-fly lock more than definition.lockLimit jobs', async () => { - agenda.define('lock job', (_job, _cb) => {}, { lockLimit: 1 }); // eslint-disable-line no-unused-vars - - await agenda.start(); - - await Promise.all([agenda.now('lock job', { i: 1 }), agenda.now('lock job', { i: 2 })]); - - await delay(500); - expect((await agenda.getRunningStats()).lockedJobs).to.equal(1); - }); - - it('does not lock more than agenda._lockLimit jobs during processing interval', async () => { - agenda.lockLimit(1); - agenda.processEvery(200); - - agenda.define('lock job', (_job, _cb) => {}); // eslint-disable-line no-unused-vars - - await agenda.start(); - - const when = DateTime.local().plus({ milliseconds: 300 }).toJSDate(); - - await Promise.all([ - agenda.schedule(when, 'lock job', { i: 1 }), - agenda.schedule(when, 'lock job', { i: 2 }) - ]); - - await delay(500); - expect((await agenda.getRunningStats()).lockedJobs).to.equal(1); - }); - - it('does not lock more than definition.lockLimit jobs during processing interval', async () => { - agenda.processEvery(200); - - agenda.define('lock job', (_job, _cb) => {}, { lockLimit: 1 }); // eslint-disable-line no-unused-vars - - await agenda.start(); - - const when = DateTime.local().plus({ milliseconds: 300 }).toJSDate(); - - await Promise.all([ - agenda.schedule(when, 'lock job', { i: 1 }), - agenda.schedule(when, 'lock job', { i: 2 }) - ]); - - await delay(500); - expect((await agenda.getRunningStats()).lockedJobs).to.equal(1); - await agenda.stop(); - }); - }); - - describe('job concurrency', () => { - it('should not block a job for concurrency of another job', async () => { - agenda.processEvery(50); - - const processed: number[] = []; - const now = Date.now(); - - agenda.define( - 'blocking', - (job, cb) => { - processed.push(job.attrs.data.i); - setTimeout(cb, 400); - }, - { - concurrency: 1 - } - ); - - const checkResultsPromise = new Promise(resolve => { - agenda.define( - 'non-blocking', - job => { - processed.push(job.attrs.data.i); - resolve(processed); - }, - { - // Lower priority to keep it at the back in the queue - priority: 'lowest' - } - ); - }); - - let finished = false; - agenda.on('complete', () => { - if (!finished && processed.length === 3) { - finished = true; - } - }); - - agenda.start(); - - await Promise.all([ - agenda.schedule(new Date(now + 100), 'blocking', { i: 1 }), - agenda.schedule(new Date(now + 101), 'blocking', { i: 2 }), - agenda.schedule(new Date(now + 102), 'non-blocking', { i: 3 }) - ]); - - try { - const results: number[] = await Promise.race([ - checkResultsPromise, - // eslint-disable-next-line prefer-promise-reject-errors - new Promise((_, reject) => { - setTimeout(() => { - reject(`not processed`); - }, 2000); - }) - ]); - expect(results).not.to.contain(2); - } catch (err) { - console.log('stats', err, JSON.stringify(await agenda.getRunningStats(), undefined, 3)); - throw err; - } - }); - - it('should run jobs as first in first out (FIFO)', async () => { - agenda.processEvery(100); - agenda.define('fifo', (_job, cb) => cb(), { concurrency: 1 }); - - const checkResultsPromise = new Promise(resolve => { - const results: number[] = []; - - agenda.on('start:fifo', job => { - results.push(new Date(job.attrs.nextRunAt!).getTime()); - if (results.length !== 3) { - return; - } - - resolve(results); - }); - }); - - await agenda.start(); - - await agenda.now('fifo'); - await delay(50); - await agenda.now('fifo'); - await delay(50); - await agenda.now('fifo'); - await delay(50); - try { - const results: number[] = await Promise.race([ - checkResultsPromise, - // eslint-disable-next-line prefer-promise-reject-errors - new Promise((_, reject) => { - setTimeout(() => { - reject(`not processed`); - }, 2000); - }) - ]); - expect(results.join('')).to.eql(results.sort().join('')); - } catch (err) { - console.log('stats', err, JSON.stringify(await agenda.getRunningStats(), undefined, 3)); - throw err; - } - }); - - it('should run jobs as first in first out (FIFO) with respect to priority', async () => { - const now = Date.now(); - - agenda.define('fifo-priority', (_job, cb) => setTimeout(cb, 100), { concurrency: 1 }); - - const checkResultsPromise = new Promise(resolve => { - const times: number[] = []; - const priorities: number[] = []; - - agenda.on('start:fifo-priority', job => { - priorities.push(job.attrs.priority); - times.push(new Date(job.attrs.lastRunAt!).getTime()); - if (priorities.length !== 3 || times.length !== 3) { - return; - } - - resolve({ times, priorities }); - }); - }); - - await Promise.all([ - agenda.create('fifo-priority', { i: 1 }).schedule(new Date(now)).priority('high').save(), - agenda - .create('fifo-priority', { i: 2 }) - .schedule(new Date(now + 100)) - .priority('low') - .save(), - agenda - .create('fifo-priority', { i: 3 }) - .schedule(new Date(now + 100)) - .priority('high') - .save() - ]); - await agenda.start(); - try { - const { times, priorities } = await Promise.race([ - checkResultsPromise, - // eslint-disable-next-line prefer-promise-reject-errors - new Promise((_, reject) => { - setTimeout(() => { - reject(`not processed`); - }, 2000); - }) - ]); - - expect(times.join('')).to.eql(times.sort().join('')); - expect(priorities).to.eql([10, 10, -10]); - } catch (err) { - console.log('stats', err, JSON.stringify(await agenda.getRunningStats(), undefined, 3)); - throw err; - } - }); - - it('should run higher priority jobs first', async () => { - // Inspired by tests added by @lushc here: - // - const now = new Date(); - - agenda.define('priority', (_job, cb) => setTimeout(cb, 10), { concurrency: 1 }); - - const checkResultsPromise = new Promise(resolve => { - const results: number[] = []; - - agenda.on('start:priority', job => { - results.push(job.attrs.priority); - if (results.length !== 3) { - return; - } - - resolve(results); - }); - }); - - await Promise.all([ - agenda.create('priority').schedule(now).save(), - agenda.create('priority').schedule(now).priority('low').save(), - agenda.create('priority').schedule(now).priority('high').save() - ]); - await agenda.start(); - try { - const results = await Promise.race([ - checkResultsPromise, - // eslint-disable-next-line prefer-promise-reject-errors - new Promise((_, reject) => { - setTimeout(() => { - reject(`not processed`); - }, 2000); - }) - ]); - expect(results).to.eql([10, 0, -10]); - } catch (err) { - console.log('stats', JSON.stringify(await agenda.getRunningStats(), undefined, 3)); - throw err; - } - }); - - it('should support custom sort option', () => { - const sort = { foo: 1 } as const; - const agendaSort = new Agenda({ sort }); - expect(agendaSort.attrs.sort).to.eql(sort); - }); - }); - - describe('every running', () => { - beforeEach(async () => { - agenda.defaultConcurrency(1); - agenda.processEvery(5); - - await agenda.stop(); - }); - - it('should run the same job multiple times', async () => { - let counter = 0; - - agenda.define('everyRunTest1', (_job, cb) => { - if (counter < 2) { - counter++; - } - - cb(); - }); - - await agenda.every(10, 'everyRunTest1'); - - await agenda.start(); - - await agenda.jobs({ name: 'everyRunTest1' }); - await delay(jobTimeout); - expect(counter).to.equal(2); - - await agenda.stop(); - }); - - it('should reuse the same job on multiple runs', async () => { - let counter = 0; - - agenda.define('everyRunTest2', (_job, cb) => { - if (counter < 2) { - counter++; - } - - cb(); - }); - await agenda.every(10, 'everyRunTest2'); - - await agenda.start(); - - await delay(jobTimeout); - const result = await agenda.jobs({ name: 'everyRunTest2' }); - - expect(result).to.have.length(1); - await agenda.stop(); - }); - }); - - describe('Integration Tests', () => { - describe('.every()', () => { - it('Should not rerun completed jobs after restart', done => { - let i = 0; - - const serviceError = function (e) { - done(e); - }; - - const receiveMessage = function (msg) { - if (msg === 'ran') { - expect(i).to.equal(0); - i += 1; - // eslint-disable-next-line @typescript-eslint/no-use-before-define - startService(); - } else if (msg === 'notRan') { - expect(i).to.equal(1); - done(); - } else { - done(new Error('Unexpected response returned!')); - } - }; - - const startService = () => { - const serverPath = path.join(__dirname, 'fixtures', 'agenda-instance.ts'); - const n = cp.fork(serverPath, [mongoCfg, 'daily'], { - execArgv: ['--import', 'tsx/esm'] - }); - - n.on('message', receiveMessage); - n.on('error', serviceError); - }; - - startService(); - }); - - it('Should properly run jobs when defined via an array', done => { - const serverPath = path.join(__dirname, 'fixtures', 'agenda-instance.ts'); - const n = cp.fork(serverPath, [mongoCfg, 'daily-array'], { - execArgv: ['--import', 'tsx/esm'] - }); - - let ran1 = false; - let ran2 = false; - let doneCalled = false; - - const serviceError = function (e) { - done(e); - }; - - const receiveMessage = function (msg) { - if (msg === 'test1-ran') { - ran1 = true; - if (ran1 && ran2 && !doneCalled) { - doneCalled = true; - done(); - n.send('exit'); - } - } else if (msg === 'test2-ran') { - ran2 = true; - if (ran1 && ran2 && !doneCalled) { - doneCalled = true; - done(); - n.send('exit'); - } - } else if (!doneCalled) { - done(new Error('Jobs did not run!')); - } - }; - - n.on('message', receiveMessage); - n.on('error', serviceError); - }); - - it('should not run if job is disabled', async () => { - let counter = 0; - - agenda.define('everyDisabledTest', (_job, cb) => { - counter++; - cb(); - }); - - const job = await agenda.every(10, 'everyDisabledTest'); - - job.disable(); - - await job.save(); - await agenda.start(); - - await delay(jobTimeout); - await agenda.jobs({ name: 'everyDisabledTest' }); - expect(counter).to.equal(0); - await agenda.stop(); - }); - }); - - describe('schedule()', () => { - it('Should not run jobs scheduled in the future', done => { - let i = 0; - - const serviceError = function (e) { - done(e); - }; - - const receiveMessage = function (msg) { - if (msg === 'notRan') { - if (i < 5) { - done(); - return; - } - - i += 1; - // eslint-disable-next-line @typescript-eslint/no-use-before-define - startService(); - } else { - done(new Error('Job scheduled in future was ran!')); - } - }; - - const startService = () => { - const serverPath = path.join(__dirname, 'fixtures', 'agenda-instance.ts'); - const n = cp.fork(serverPath, [mongoCfg, 'define-future-job'], { - execArgv: ['--import', 'tsx/esm'] - }); - - n.on('message', receiveMessage); - n.on('error', serviceError); - }; - - startService(); - }); - - it('Should run past due jobs when process starts', done => { - const serviceError = function (e) { - done(e); - }; - - const receiveMessage = function (msg) { - if (msg === 'ran') { - done(); - } else { - done(new Error('Past due job did not run!')); - } - }; - - const startService = () => { - const serverPath = path.join(__dirname, 'fixtures', 'agenda-instance.ts'); - const n = cp.fork(serverPath, [mongoCfg, 'define-past-due-job'], { - execArgv: ['--import', 'tsx/esm'] - }); - - n.on('message', receiveMessage); - n.on('error', serviceError); - }; - - startService(); - }); - - it('Should schedule using array of names', done => { - const serverPath = path.join(__dirname, 'fixtures', 'agenda-instance.ts'); - const n = cp.fork(serverPath, [mongoCfg, 'schedule-array'], { - execArgv: ['--import', 'tsx/esm'] - }); - - let ran1 = false; - let ran2 = false; - let doneCalled = false; - - const serviceError = err => { - done(err); - }; - - const receiveMessage = msg => { - if (msg === 'test1-ran') { - ran1 = true; - if (ran1 && ran2 && !doneCalled) { - doneCalled = true; - done(); - n.send('exit'); - } - } else if (msg === 'test2-ran') { - ran2 = true; - if (ran1 && ran2 && !doneCalled) { - doneCalled = true; - done(); - n.send('exit'); - } - } else if (!doneCalled) { - done(new Error('Jobs did not run!')); - } - }; - - n.on('message', receiveMessage); - n.on('error', serviceError); - }); - }); - - describe('now()', () => { - it('Should immediately run the job', done => { - const serviceError = function (e) { - done(e); - }; - - const receiveMessage = function (msg) { - if (msg === 'ran') { - return done(); - } - - return done(new Error('Job did not immediately run!')); - }; - - const serverPath = path.join(__dirname, 'fixtures', 'agenda-instance.ts'); - const n = cp.fork(serverPath, [mongoCfg, 'now'], { execArgv: ['--import', 'tsx/esm'] }); - - n.on('message', receiveMessage); - n.on('error', serviceError); - }); - }); - - describe('General Integration', () => { - it('Should not run a job that has already been run', async () => { - const runCount = {}; - - agenda.define('test-job', (job, cb) => { - const id = job.attrs._id!.toString(); - - runCount[id] = runCount[id] ? runCount[id] + 1 : 1; - cb(); - }); - - agenda.processEvery(100); - await agenda.start(); - - await Promise.all([...new Array(10)].map(() => agenda.now('test-job'))); - - await delay(jobTimeout); - const ids = Object.keys(runCount); - expect(ids).to.have.length(10); - Object.keys(runCount).forEach(id => { - expect(runCount[id]).to.equal(1); - }); - }); - }); - }); - - it('checks database for running job on "client"', async () => { - agenda.define('test', async () => { - await new Promise(resolve => { - setTimeout(resolve, 30000); - }); - }); - - const job = await agenda.now('test'); - await agenda.start(); - - await new Promise(resolve => { - agenda.on('start:test', resolve); - }); - - expect(await job.isRunning()).to.be.equal(true); - }); - - it('should not run job if it has been removed', async () => { - let executed = false; - agenda.define('test', async () => { - executed = true; - }); - - const job = new Job(agenda, { - name: 'test', - type: 'normal' - }); - job.schedule('in 1 second'); - await job.save(); - - await agenda.start(); - - let jobStarted; - let retried = 0; - // wait till it's locked (Picked up by the event processor) - do { - jobStarted = await agenda.db.getJobs({ name: 'test' }); - if (!jobStarted[0].lockedAt) { - await delay(100); - } - retried++; - } while (!jobStarted[0].lockedAt || retried > 10); - - expect(jobStarted[0].lockedAt).to.exist; // .equal(null); - - await job.remove(); - - let error; - const completed = new Promise(resolve => { - agenda.on('error', err => { - error = err; - resolve(); - }); - }); - - await Promise.race([ - new Promise(resolve => { - setTimeout(() => { - resolve(); - }, 1000); - }), - completed - ]); - - expect(executed).to.be.equal(false); - if (typeof error !== 'undefined') { - expect(error.message).to.includes('(name: test) cannot be updated in the database'); - } - }); - - describe('job fork mode', () => {7 - it('runs a job in fork mode', async () => { - const agendaFork = new Agenda({ - mongo: mongoDb, - forkHelper: { - path: './test/helpers/forkHelper.ts', - options: { - env: { DB_CONNECTION: mongoCfg }, - execArgv: ['--import', 'tsx/esm'] - } - } - }); - - expect(agendaFork.forkHelper?.path).to.be.eq('./test/helpers/forkHelper.ts'); - - const job = agendaFork.create('some job'); - job.forkMode(true); - job.schedule('now'); - await job.save(); - - const jobData = await agenda.db.getJobById(job.attrs._id as any); - - if (!jobData) { - throw new Error('job not found'); - } - - expect(jobData.fork).to.be.eq(true); - - // initialize job definition (keep in a seperate file to have a easier fork mode implementation) - someJobDefinition(agendaFork); - - await agendaFork.start(); - - do { - // console.log('.'); - await delay(50); - } while (await job.isRunning()); - - const jobDataFinished = await agenda.db.getJobById(job.attrs._id as any); - expect(jobDataFinished?.lastFinishedAt).to.not.be.eq(undefined); - expect(jobDataFinished?.failReason).to.be.eq(null); - expect(jobDataFinished?.failCount).to.be.eq(null); - }); - - it('runs a job in fork mode, but let it fail', async () => { - const agendaFork = new Agenda({ - mongo: mongoDb, - forkHelper: { - path: './test/helpers/forkHelper.ts', - options: { - env: { DB_CONNECTION: mongoCfg }, - execArgv: ['--import', 'tsx/esm'] - } - } - }); - - expect(agendaFork.forkHelper?.path).to.be.eq('./test/helpers/forkHelper.ts'); - - const job = agendaFork.create('some job', { failIt: 'error' }); - job.forkMode(true); - job.schedule('now'); - await job.save(); - - const jobData = await agenda.db.getJobById(job.attrs._id as any); - - if (!jobData) { - throw new Error('job not found'); - } - - expect(jobData.fork).to.be.eq(true); - - // initialize job definition (keep in a seperate file to have a easier fork mode implementation) - someJobDefinition(agendaFork); - - await agendaFork.start(); - - do { - // console.log('.'); - await delay(50); - } while (await job.isRunning()); - - const jobDataFinished = await agenda.db.getJobById(job.attrs._id as any); - expect(jobDataFinished?.lastFinishedAt).to.not.be.eq(undefined); - expect(jobDataFinished?.failReason).to.not.be.eq(null); - expect(jobDataFinished?.failCount).to.be.eq(1); - }); - - it('runs a job in fork mode, but let it die', async () => { - const agendaFork = new Agenda({ - mongo: mongoDb, - forkHelper: { - path: './test/helpers/forkHelper.ts', - options: { - env: { DB_CONNECTION: mongoCfg }, - execArgv: ['--import', 'tsx/esm'] - } - } - }); - - expect(agendaFork.forkHelper?.path).to.be.eq('./test/helpers/forkHelper.ts'); - - const job = agendaFork.create('some job', { failIt: 'die' }); - job.forkMode(true); - job.schedule('now'); - await job.save(); - - const jobData = await agenda.db.getJobById(job.attrs._id as any); - - if (!jobData) { - throw new Error('job not found'); - } - - expect(jobData.fork).to.be.eq(true); - - // initialize job definition (keep in a seperate file to have a easier fork mode implementation) - someJobDefinition(agendaFork); - - await agendaFork.start(); - - do { - // console.log('.'); - await delay(50); - } while (await job.isRunning()); - - const jobDataFinished = await agenda.db.getJobById(job.attrs._id as any); - expect(jobDataFinished?.lastFinishedAt).to.not.be.eq(undefined); - expect(jobDataFinished?.failReason).to.not.be.eq(null); - expect(jobDataFinished?.failCount).to.be.eq(1); - }); - - it('runs a job in fork mode, but let it timeout', async () => { - const agendaFork = new Agenda({ - mongo: mongoDb, - forkHelper: { - path: './test/helpers/forkHelper.ts', - options: { - env: { DB_CONNECTION: mongoCfg }, - execArgv: ['--import', 'tsx/esm'] - } - }, - defaultLockLifetime: 1000 - }); - - expect(agendaFork.forkHelper?.path).to.be.eq('./test/helpers/forkHelper.ts'); - - const job = agendaFork.create('some job', { failIt: 'timeout' }); - job.forkMode(true); - job.schedule('now'); - await job.save(); - - const jobData = await agenda.db.getJobById(job.attrs._id as any); - - if (!jobData) { - throw new Error('job not found'); - } - - expect(jobData.fork).to.be.eq(true); - - // initialize job definition (keep in a seperate file to have a easier fork mode implementation) - someJobDefinition(agendaFork); - - await agendaFork.start(); - - do { - // console.log('.'); - await delay(50); - } while (await job.isRunning()); - - const jobDataFinished = await agenda.db.getJobById(job.attrs._id as any); - expect(jobDataFinished?.lastFinishedAt).to.not.be.eq(undefined); - expect(jobDataFinished?.failReason).to.not.be.eq(null); - expect(jobDataFinished?.failCount).to.be.eq(1); - }); - }); -}); diff --git a/test/jobprocessor.test.ts b/test/jobprocessor.test.ts deleted file mode 100644 index dde6d13..0000000 --- a/test/jobprocessor.test.ts +++ /dev/null @@ -1,280 +0,0 @@ -/* eslint-disable no-console */ -import { fail } from 'assert'; -import { expect } from 'chai'; - -import { Db } from 'mongodb'; -import { Agenda } from '../src/index.js'; -import { mockMongo } from './helpers/mock-mongodb.js'; - -// Create agenda instances -let agenda: Agenda; -// mongo db connection db instance -let mongoDb: Db; - -const clearJobs = async () => { - if (mongoDb) { - await mongoDb.collection('agendaJobs').deleteMany({}); - } -}; - -describe('JobProcessor', () => { - // this.timeout(1000000); - - beforeEach(async () => { - if (!mongoDb) { - const mockedMongo = await mockMongo(); - // mongoCfg = mockedMongo.uri; - mongoDb = mockedMongo.mongo.db(); - } - - return new Promise(resolve => { - agenda = new Agenda( - { - mongo: mongoDb, - maxConcurrency: 4, - defaultConcurrency: 1, - lockLimit: 15, - defaultLockLimit: 6, - processEvery: '1 second', - name: 'agendaTest' - }, - async () => { - await clearJobs(); - return resolve(); - } - ); - }); - }); - - afterEach(async () => { - await agenda.stop(); - await clearJobs(); - }); - - describe('getRunningStats', () => { - it('throws an error when agenda is not running', async () => { - try { - await agenda.getRunningStats(); - fail(); - } catch (err: any) { - expect(err.message).to.be.equal('agenda not running!'); - } - }); - - it('contains the agendaVersion', async () => { - await agenda.start(); - - const status = await agenda.getRunningStats(); - expect(status).to.have.property('version'); - expect(status.version).to.match(/\d+.\d+.\d+/); - }); - - it('shows the correct job status', async () => { - agenda.define('test', async () => { - await new Promise(resolve => { - setTimeout(resolve, 30000); - }); - }); - - agenda.now('test'); - await agenda.start(); - - await new Promise(resolve => { - agenda.on('start:test', resolve); - }); - - const status = await agenda.getRunningStats(); - expect(status).to.have.property('jobStatus'); - if (status.jobStatus) { - expect(status.jobStatus).to.have.property('test'); - expect(status.jobStatus.test.locked).to.be.equal(1); - expect(status.jobStatus.test.running).to.be.equal(1); - expect(status.jobStatus.test.config.fn).to.be.a('function'); - expect(status.jobStatus.test.config.concurrency).to.be.equal(1); - expect(status.jobStatus.test.config.lockLifetime).to.be.equal(600000); - expect(status.jobStatus.test.config.priority).to.be.equal(0); - expect(status.jobStatus.test.config.lockLimit).to.be.equal(6); - } - }); - - it('shows isLockingOnTheFly', async () => { - await agenda.start(); - - const status = await agenda.getRunningStats(); - expect(status).to.have.property('isLockingOnTheFly'); - expect(status.isLockingOnTheFly).to.be.a('boolean'); - expect(status.isLockingOnTheFly).to.be.equal(false); - }); - - it('shows queueName', async () => { - await agenda.start(); - - const status = await agenda.getRunningStats(); - expect(status).to.have.property('queueName'); - expect(status.queueName).to.be.a('string'); - expect(status.queueName).to.be.equal('agendaTest'); - }); - - it('shows totalQueueSizeDB', async () => { - await agenda.start(); - - const status = await agenda.getRunningStats(); - expect(status).to.have.property('totalQueueSizeDB'); - expect(status.totalQueueSizeDB).to.be.a('number'); - expect(status.totalQueueSizeDB).to.be.equal(0); - }); - }); - - it('ensure new jobs are always filling up running queue', async () => { - let shortOneFinished = false; - - agenda.define('test long', async () => { - await new Promise(resolve => { - setTimeout(resolve, 1000); - }); - }); - agenda.define('test short', async () => { - shortOneFinished = true; - await new Promise(resolve => { - setTimeout(resolve, 5); - }); - }); - - await agenda.start(); - - // queue up long ones - for (let i = 0; i < 100; i += 1) { - agenda.now('test long'); - } - - await new Promise(resolve => { - setTimeout(resolve, 1000); - }); - - // queue more short ones (they should complete first!) - for (let j = 0; j < 100; j += 1) { - agenda.now('test short'); - } - - await new Promise(resolve => { - setTimeout(resolve, 1000); - }); - - expect(shortOneFinished).to.be.equal(true); - }); - - it('ensure slow jobs time out', async () => { - let jobStarted = false; - agenda.define( - 'test long', - async () => { - jobStarted = true; - await new Promise(resolve => { - setTimeout(resolve, 2500); - }); - }, - { lockLifetime: 500 } - ); - - // queue up long ones - agenda.now('test long'); - - await agenda.start(); - - const promiseResult = await new Promise(resolve => { - agenda.on('error', err => { - resolve(err); - }); - - agenda.on('success', () => { - resolve(); - }); - }); - - expect(jobStarted).to.be.equal(true); - expect(promiseResult).to.be.an('error'); - }); - - it('ensure slow jobs do not time out when calling touch', async () => { - agenda.define( - 'test long', - async job => { - for (let i = 0; i < 10; i += 1) { - await new Promise(resolve => { - setTimeout(resolve, 100); - }); - await job.touch(); - } - }, - { lockLifetime: 500 } - ); - - await agenda.start(); - - // queue up long ones - agenda.now('test long'); - - const promiseResult = await new Promise(resolve => { - agenda.on('error', err => { - resolve(err); - }); - - agenda.on('success', () => { - resolve(); - }); - }); - - expect(promiseResult).to.not.be.an('error'); - }); - - it('ensure concurrency is filled up', async () => { - agenda.maxConcurrency(300); - agenda.lockLimit(150); - agenda.defaultLockLimit(20); - agenda.defaultConcurrency(10); - - for (let jobI = 0; jobI < 10; jobI += 1) { - agenda.define( - `test job ${jobI}`, - async () => { - await new Promise(resolve => { - setTimeout(resolve, 5000); - }); - }, - { lockLifetime: 10000 } - ); - } - - // queue up jobs - for (let jobI = 0; jobI < 10; jobI += 1) { - for (let jobJ = 0; jobJ < 25; jobJ += 1) { - agenda.now(`test job ${jobI}`); - } - } - - await agenda.start(); - - let runningJobs = 0; - const allJobsStarted = new Promise(async resolve => { - do { - runningJobs = (await agenda.getRunningStats()).runningJobs as number; - await new Promise(wait => { - setTimeout(wait, 50); - }); - } while (runningJobs < 90); // @todo Why not 100? - resolve('all started'); - }); - - expect( - await Promise.race([ - allJobsStarted, - new Promise(resolve => { - setTimeout( - () => resolve(`not all jobs started, currently running: ${runningJobs}`), - 1500 - ); - }) - ]) - ).to.equal('all started'); - }); -}); diff --git a/test/retry.test.ts b/test/retry.test.ts deleted file mode 100644 index 7c3e322..0000000 --- a/test/retry.test.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* eslint-disable no-console */ -import { Db } from 'mongodb'; -import delay from 'delay'; -import { mockMongo } from './helpers/mock-mongodb.js'; - -import { Agenda } from '../src/index.js'; - -// agenda instances -let agenda: Agenda; -// mongo db connection db instance -let mongoDb: Db; - -const clearJobs = async (): Promise => { - if (mongoDb) { - await mongoDb.collection('agendaJobs').deleteMany({}); - } -}; - -const jobType = 'do work'; -const jobProcessor = () => { }; - -describe('Retry', () => { - beforeEach(async () => { - if (!mongoDb) { - const mockedMongo = await mockMongo(); - mongoDb = mockedMongo.mongo.db(); - } - - return new Promise(resolve => { - agenda = new Agenda( - { - mongo: mongoDb - }, - async () => { - await delay(50); - await clearJobs(); - agenda.define('someJob', jobProcessor); - agenda.define('send email', jobProcessor); - agenda.define('some job', jobProcessor); - agenda.define(jobType, jobProcessor); - return resolve(); - } - ); - }); - }); - - afterEach(async () => { - await delay(50); - await agenda.stop(); - await clearJobs(); - // await mongoClient.disconnect(); - // await jobs._db.close(); - }); - - it('should retry a job', async () => { - let shouldFail = true; - - agenda.processEvery(100); // Shave 5s off test runtime :grin: - agenda.define('a job', (_job, done) => { - if (shouldFail) { - shouldFail = false; - return done(new Error('test failure')); - } - - done(); - return undefined; - }); - - agenda.on('fail:a job', (err, job) => { - if (err) { - // Do nothing as this is expected to fail. - } - - job.schedule('now').save(); - }); - - const successPromise = new Promise(resolve => { - agenda.on('success:a job', resolve) - }); - - await agenda.now('a job'); - - await agenda.start(); - await successPromise; - }).timeout(100000); -}); diff --git a/tests/agenda.spec.ts b/tests/agenda.spec.ts new file mode 100644 index 0000000..63df455 --- /dev/null +++ b/tests/agenda.spec.ts @@ -0,0 +1,748 @@ +import { Db } from "mongodb"; +import { deepStrictEqual, notStrictEqual, strictEqual } from "node:assert"; +import { setTimeout as delay } from "node:timers/promises"; +import { Agenda } from "../src/index"; +import { Job } from "../src/job"; +import { hasMongoProtocol } from "../src/utils/has-mongo-protocol"; +import { mockMongo } from "./helpers/mock-mongodb"; + +// agenda instances +let globalAgenda: Agenda; +// connection string to mongodb +let mongoCfg: string; +// mongo db connection db instance +let mongoDb: Db; + +const clearJobs = async (): Promise => { + if (mongoDb) { + await mongoDb.collection("agendaJobs").deleteMany({}); + } +}; + +// Slow timeouts for Travis +const jobTimeout = 500; +const jobType = "do work"; +const jobProcessor = () => {}; + +describe("Agenda", () => { + beforeEach(async () => { + if (!mongoDb) { + const mockedMongo = await mockMongo(); + mongoCfg = mockedMongo.uri; + mongoDb = mockedMongo.mongo.db(); + } + + return new Promise((resolve) => { + globalAgenda = new Agenda( + { + mongo: mongoDb, + }, + async () => { + await delay(50); + await clearJobs(); + globalAgenda.define("someJob", jobProcessor); + globalAgenda.define("send email", jobProcessor); + globalAgenda.define("some job", jobProcessor); + globalAgenda.define(jobType, jobProcessor); + return resolve(); + } + ); + }); + }); + + afterEach(async () => { + await delay(50); + if (globalAgenda) { + await globalAgenda.stop(); + await clearJobs(); + } + }); + + it("sets a default processEvery", () => { + strictEqual(globalAgenda.attrs.processEvery, 5000); + }); + + describe("configuration methods", () => { + it("sets the _db directly when passed as an option", () => { + const agendaDb = new Agenda({ mongo: mongoDb }); + notStrictEqual(agendaDb.db, undefined); + }); + }); + + describe("configuration methods", () => { + describe("mongo connection tester", () => { + it("passing a valid server connection string", () => { + strictEqual(hasMongoProtocol(mongoCfg), true); + }); + + it("passing a valid multiple server connection string", () => { + strictEqual(hasMongoProtocol(`mongodb+srv://localhost/agenda-test`), true); + }); + + it("passing an invalid connection string", () => { + strictEqual(hasMongoProtocol(`localhost/agenda-test`), false); + }); + }); + describe("mongo", () => { + it("sets the _db directly", () => { + const agenda = new Agenda(); + agenda.mongo(mongoDb); + notStrictEqual(agenda.db, undefined); + }); + + it("returns itself", async () => { + const agenda = new Agenda(); + strictEqual(await agenda.mongo(mongoDb), agenda); + }); + }); + + describe("name", () => { + it("sets the agenda name", () => { + globalAgenda.name("test queue"); + strictEqual(globalAgenda.attrs.name, "test queue"); + }); + it("returns itself", () => { + strictEqual(globalAgenda.name("test queue"), globalAgenda); + }); + }); + describe("processEvery", () => { + it("sets the processEvery time", () => { + globalAgenda.processEvery("3 minutes"); + strictEqual(globalAgenda.attrs.processEvery, 180000); + }); + it("returns itself", () => { + strictEqual(globalAgenda.processEvery("3 minutes"), globalAgenda); + }); + }); + describe("maxConcurrency", () => { + it("sets the maxConcurrency", () => { + globalAgenda.maxConcurrency(10); + strictEqual(globalAgenda.attrs.maxConcurrency, 10); + }); + it("returns itself", () => { + strictEqual(globalAgenda.maxConcurrency(10), globalAgenda); + }); + }); + describe("defaultConcurrency", () => { + it("sets the defaultConcurrency", () => { + globalAgenda.defaultConcurrency(1); + strictEqual(globalAgenda.attrs.defaultConcurrency, 1); + }); + it("returns itself", () => { + strictEqual(globalAgenda.defaultConcurrency(5), globalAgenda); + }); + }); + describe("lockLimit", () => { + it("sets the lockLimit", () => { + globalAgenda.lockLimit(10); + strictEqual(globalAgenda.attrs.lockLimit, 10); + }); + it("returns itself", () => { + strictEqual(globalAgenda.lockLimit(10), globalAgenda); + }); + }); + describe("defaultLockLimit", () => { + it("sets the defaultLockLimit", () => { + globalAgenda.defaultLockLimit(1); + strictEqual(globalAgenda.attrs.defaultLockLimit, 1); + }); + it("returns itself", () => { + strictEqual(globalAgenda.defaultLockLimit(5), globalAgenda); + }); + }); + describe("defaultLockLifetime", () => { + it("returns itself", () => { + strictEqual(globalAgenda.defaultLockLifetime(1000), globalAgenda); + }); + it("sets the default lock lifetime", () => { + globalAgenda.defaultLockLifetime(9999); + strictEqual(globalAgenda.attrs.defaultLockLifetime, 9999); + }); + it("is inherited by jobs", () => { + globalAgenda.defaultLockLifetime(7777); + globalAgenda.define("testDefaultLockLifetime", () => {}); + strictEqual(globalAgenda.definitions.testDefaultLockLifetime.lockLifetime, 7777); + }); + }); + describe("sort", () => { + it("returns itself", () => { + strictEqual(globalAgenda.sort({ nextRunAt: 1, priority: -1 }), globalAgenda); + }); + it("sets the default sort option", () => { + globalAgenda.sort({ nextRunAt: -1 }); + deepStrictEqual(globalAgenda.attrs.sort, { nextRunAt: -1 }); + }); + }); + }); + + describe("job methods", () => { + describe("create", () => { + let job: Job; + beforeEach(() => { + job = globalAgenda.create("sendEmail", { to: "some guy" }); + }); + + it("returns a job", () => { + strictEqual(job instanceof Job, true); + }); + it("sets the name", () => { + strictEqual(job.attrs.name, "sendEmail"); + }); + it("sets the type", () => { + strictEqual(job.attrs.type, "normal"); + }); + it("sets the agenda", () => { + strictEqual(job.agenda, globalAgenda); + }); + it("sets the data", () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + strictEqual((job.attrs.data as any).to, "some guy"); + }); + }); + + describe("define", () => { + it("stores the definition for the job", () => { + strictEqual(globalAgenda.definitions.someJob.fn, jobProcessor); + }); + + it("sets the default concurrency for the job", () => { + strictEqual(globalAgenda.definitions.someJob.concurrency, 5); + }); + + it("sets the default lockLimit for the job", () => { + strictEqual(globalAgenda.definitions.someJob.lockLimit, 0); + }); + + it("sets the default priority for the job", () => { + strictEqual(globalAgenda.definitions.someJob.priority, 0); + }); + it("takes concurrency option for the job", () => { + globalAgenda.define("highPriority", jobProcessor, { priority: 10 }); + strictEqual(globalAgenda.definitions.highPriority.priority, 10); + }); + }); + + describe("every", () => { + describe("with a job name specified", () => { + it("returns a job", async () => { + strictEqual((await globalAgenda.every("5 minutes", "send email")) instanceof Job, true); + }); + it("sets the repeatEvery", async () => { + strictEqual( + await globalAgenda.every("5 seconds", "send email").then(({ attrs }) => attrs.repeatInterval), + "5 seconds" + ); + }); + it("sets the agenda", async () => { + strictEqual(await globalAgenda.every("5 seconds", "send email").then(({ agenda }) => agenda), globalAgenda); + }); + it("should update a job that was previously scheduled with `every`", async () => { + await globalAgenda.every(10, "shouldBeSingleJob"); + await delay(10); + await globalAgenda.every(20, "shouldBeSingleJob"); + + // Give the saves a little time to propagate + await delay(jobTimeout); + + const res = await globalAgenda.jobs({ name: "shouldBeSingleJob" }); + strictEqual(res.length, 1); + }); + it("should not run immediately if options.skipImmediate is true", async () => { + const jobName = "send email"; + await globalAgenda.every("5 minutes", jobName, {}, { skipImmediate: true }); + const job = (await globalAgenda.jobs({ name: jobName }))[0]; + const nextRunAt = job.attrs.nextRunAt!.getTime(); + const now = new Date().getTime(); + strictEqual(nextRunAt - now > 0, true); + }); + it("should run immediately if options.skipImmediate is false", async () => { + const jobName = "send email"; + await globalAgenda.every("5 minutes", jobName, {}, { skipImmediate: false }); + const job = (await globalAgenda.jobs({ name: jobName }))[0]; + const nextRunAt = job.attrs.nextRunAt!.getTime(); + const now = new Date().getTime(); + strictEqual(nextRunAt - now <= 0, true); + }); + }); + describe("with array of names specified", () => { + it("returns array of jobs", async () => { + strictEqual(Array.isArray(await globalAgenda.every("5 minutes", ["send email", "some job"])), true); + }); + }); + }); + + describe("schedule", () => { + describe("with a job name specified", () => { + it("returns a job", async () => { + strictEqual((await globalAgenda.schedule("in 5 minutes", "send email")) instanceof Job, true); + }); + it("sets the schedule", async () => { + const fiveish = new Date().valueOf() + 250000; + const scheduledJob = await globalAgenda.schedule("in 5 minutes", "send email"); + strictEqual(fiveish < scheduledJob.attrs.nextRunAt!.valueOf(), true); + }); + }); + describe("with array of names specified", () => { + it("returns array of jobs", async () => { + strictEqual(Array.isArray(await globalAgenda.schedule("5 minutes", ["send email", "some job"])), true); + }); + }); + }); + + describe("unique", () => { + describe("should demonstrate unique contraint", () => { + it("should modify one job when unique matches", async () => { + const job1 = await globalAgenda + .create("unique job", { + type: "active", + userId: "123", + other: true, + }) + .unique({ + "data.type": "active", + "data.userId": "123", + }) + .schedule("now") + .save(); + + await delay(100); + + const job2 = await globalAgenda + .create("unique job", { + type: "active", + userId: "123", + other: false, + }) + .unique({ + "data.type": "active", + "data.userId": "123", + }) + .schedule("now") + .save(); + + notStrictEqual(job1.attrs.nextRunAt!.toISOString(), job2.attrs.nextRunAt!.toISOString()); + + const jobs = await mongoDb + .collection("agendaJobs") + .find({ + name: "unique job", + }) + .toArray(); + strictEqual(jobs.length, 1); + }); + + it("should not modify job when unique matches and insertOnly is set to true", async () => { + const job1 = await globalAgenda + .create("unique job", { + type: "active", + userId: "123", + other: true, + }) + .unique( + { + "data.type": "active", + "data.userId": "123", + }, + { + insertOnly: true, + } + ) + .schedule("now") + .save(); + + const job2 = await globalAgenda + .create("unique job", { + type: "active", + userId: "123", + other: false, + }) + .unique( + { + "data.type": "active", + "data.userId": "123", + }, + { + insertOnly: true, + } + ) + .schedule("now") + .save(); + + strictEqual(job1.attrs.nextRunAt!.toISOString(), job2.attrs.nextRunAt!.toISOString()); + + const jobs = await mongoDb + .collection("agendaJobs") + .find({ + name: "unique job", + }) + .toArray(); + strictEqual(jobs.length, 1); + }); + }); + + describe("should demonstrate non-unique contraint", () => { + it("should create two jobs when unique doesn't match", async () => { + const time = new Date(Date.now() + 1000 * 60 * 3); + const time2 = new Date(Date.now() + 1000 * 60 * 4); + + await globalAgenda + .create("unique job", { + type: "active", + userId: "123", + other: true, + }) + .unique({ + "data.type": "active", + "data.userId": "123", + nextRunAt: time, + }) + .schedule(time) + .save(); + + await globalAgenda + .create("unique job", { + type: "active", + userId: "123", + other: false, + }) + .unique({ + "data.type": "active", + "data.userId": "123", + nextRunAt: time2, + }) + .schedule(time) + .save(); + + const jobs = await mongoDb + .collection("agendaJobs") + .find({ + name: "unique job", + }) + .toArray(); + + strictEqual(jobs.length, 2); + }); + }); + }); + + describe("now", () => { + it("returns a job", async () => { + strictEqual((await globalAgenda.now("send email")) instanceof Job, true); + }); + it("sets the schedule", async () => { + const now = new Date(); + strictEqual( + now.valueOf() - 1 <= (await globalAgenda.now("send email").then(({ attrs }) => attrs.nextRunAt!.valueOf())), + true + ); + }); + + it("runs the job immediately", async () => { + globalAgenda.define("immediateJob", async (job) => { + strictEqual(await job.isRunning(), true); + await globalAgenda.stop(); + }); + await globalAgenda.now("immediateJob"); + await globalAgenda.start(); + }); + }); + + describe("jobs", () => { + it("returns jobs", async () => { + await globalAgenda.create("test").save(); + const c = await globalAgenda.jobs({}); + + notStrictEqual(c.length, 0); + strictEqual(c[0] instanceof Job, true); + await clearJobs(); + }); + }); + + describe("purge", () => { + it("removes all jobs without definitions", async () => { + const job = globalAgenda.create("no definition"); + await globalAgenda.stop(); + await job.save(); + const j = await globalAgenda.jobs({ + name: "no definition", + }); + + strictEqual(j.length, 1); + await globalAgenda.purge(); + const jAfterPurge = await globalAgenda.jobs({ + name: "no definition", + }); + + strictEqual(jAfterPurge.length, 0); + }); + }); + + describe("saveJob", () => { + it("persists job to the database", async () => { + const job = globalAgenda.create("someJob", {}); + await job.save(); + + notStrictEqual(job.attrs._id, undefined); + + await clearJobs(); + }); + }); + }); + + describe("cancel", () => { + beforeEach(async () => { + let remaining = 3; + const checkDone = () => { + remaining -= 1; + }; + + await globalAgenda.create("jobA").save().then(checkDone); + await globalAgenda.create("jobA", "someData").save().then(checkDone); + await globalAgenda.create("jobB").save().then(checkDone); + strictEqual(remaining, 0); + }); + + afterEach(async () => { + await globalAgenda.db.removeJobs({ name: { $in: ["jobA", "jobB"] } }); + }); + + it("should cancel a job", async () => { + const j = await globalAgenda.jobs({ name: "jobA" }); + strictEqual(j.length, 2); + + await globalAgenda.cancel({ name: "jobA" }); + const job = await globalAgenda.jobs({ name: "jobA" }); + + strictEqual(job.length, 0); + }); + + it("should cancel multiple jobs", async () => { + const jobs1 = await globalAgenda.jobs({ name: { $in: ["jobA", "jobB"] } }); + strictEqual(jobs1.length, 3); + await globalAgenda.cancel({ name: { $in: ["jobA", "jobB"] } }); + + const jobs2 = await globalAgenda.jobs({ name: { $in: ["jobA", "jobB"] } }); + strictEqual(jobs2.length, 0); + }); + + it("should cancel jobs only if the data matches", async () => { + const jobs1 = await globalAgenda.jobs({ name: "jobA", data: "someData" }); + strictEqual(jobs1.length, 1); + await globalAgenda.cancel({ name: "jobA", data: "someData" }); + + const jobs2 = await globalAgenda.jobs({ name: "jobA", data: "someData" }); + strictEqual(jobs2.length, 0); + + const jobs3 = await globalAgenda.jobs({ name: "jobA" }); + strictEqual(jobs3.length, 1); + }); + }); + + describe("search", () => { + beforeEach(async () => { + await globalAgenda.create("jobA", 1).save(); + await globalAgenda.create("jobA", 2).save(); + await globalAgenda.create("jobA", 3).save(); + }); + + afterEach(async () => { + await globalAgenda.db.removeJobs({ name: "jobA" }); + }); + + it("should limit jobs", async () => { + const results = await globalAgenda.jobs({ name: "jobA" }, {}, 2); + strictEqual(results.length, 2); + }); + + it("should skip jobs", async () => { + const results = await globalAgenda.jobs({ name: "jobA" }, {}, 2, 2); + strictEqual(results.length, 1); + }); + + it("should sort jobs", async () => { + const results = await globalAgenda.jobs({ name: "jobA" }, { data: -1 }); + + strictEqual(results.length, 3); + + const job1 = results[0]; + const job2 = results[1]; + const job3 = results[2]; + + strictEqual(job1.attrs.data, 3); + strictEqual(job2.attrs.data, 2); + strictEqual(job3.attrs.data, 1); + }); + }); + + describe("ensureIndex findAndLockNextJobIndex", () => { + it("ensureIndex-Option false does not create index findAndLockNextJobIndex", async () => { + const agenda = new Agenda({ + mongo: mongoDb, + ensureIndex: false, + }); + + agenda.define("someJob", jobProcessor); + await agenda.create("someJob", 1).save(); + + const listIndex = await mongoDb.command({ listIndexes: "agendaJobs" }); + strictEqual(listIndex.cursor.firstBatch.length, 1); + strictEqual(listIndex.cursor.firstBatch[0].name, "_id_"); + }); + + it("ensureIndex-Option true does create index findAndLockNextJobIndex", async () => { + const agenda = new Agenda({ + mongo: mongoDb, + ensureIndex: true, + }); + + agenda.define("someJob", jobProcessor); + await agenda.create("someJob", 1).save(); + + const listIndex = await mongoDb.command({ listIndexes: "agendaJobs" }); + strictEqual(listIndex.cursor.firstBatch.length, 2); + strictEqual(listIndex.cursor.firstBatch[0].name, "_id_"); + strictEqual(listIndex.cursor.firstBatch[1].name, "findAndLockNextJobIndex"); + }); + + it("creating two agenda-instances with ensureIndex-Option true does not throw an error", async () => { + const agenda = new Agenda({ + mongo: mongoDb, + ensureIndex: true, + }); + + agenda.define("someJob", jobProcessor); + await agenda.create("someJob", 1).save(); + + const secondAgenda = new Agenda({ + mongo: mongoDb, + ensureIndex: true, + }); + + secondAgenda.define("someJob", jobProcessor); + await secondAgenda.create("someJob", 1).save(); + }); + }); + + describe("process jobs", () => { + it("do not run failed jobs again", async () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const unhandledRejections: any[] = []; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const rejectionsHandler = (error: any) => unhandledRejections.push(error); + process.on("unhandledRejection", rejectionsHandler); + + let jprocesses = 0; + + globalAgenda.define("failing job", async (_job) => { + jprocesses++; + throw new Error("failed"); + }); + + let failCalled = false; + globalAgenda.on("fail:failing job", (_err) => { + failCalled = true; + }); + + let errorCalled = false; + globalAgenda.on("error", (_err) => { + errorCalled = true; + }); + + globalAgenda.processEvery(100); + await globalAgenda.start(); + + await globalAgenda.now("failing job"); + + await delay(500); + + process.removeListener("unhandledRejection", rejectionsHandler); + + strictEqual(jprocesses, 1); + strictEqual(errorCalled, false); + strictEqual(failCalled, true); + strictEqual(unhandledRejections.length, 0); + }).timeout(10000); + + it("ensure there is no unhandledPromise on job timeouts", async () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const unhandledRejections: any[] = []; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const rejectionsHandler = (error: any) => unhandledRejections.push(error); + process.on("unhandledRejection", rejectionsHandler); + + globalAgenda.define( + "very short timeout", + (_job, done) => { + setTimeout(() => { + done(); + }, 10000); + }, + { + lockLifetime: 100, + } + ); + + let errorCalled = false; + globalAgenda.on("error", (_err) => { + errorCalled = true; + }); + + globalAgenda.processEvery(100); + await globalAgenda.start(); + + await globalAgenda.now("very short timeout"); + + await delay(500); + + process.removeListener("unhandledRejection", rejectionsHandler); + + strictEqual(errorCalled, true); + strictEqual(unhandledRejections.length, 0); + }).timeout(10000); + + it("should not cause unhandledRejection", async () => { + // This unit tests if for this bug [https://github.com/agenda/agenda/issues/884] + // which is not reproducible with default agenda config on shorter processEvery. + // Thus we set the test timeout to 10000, and the delay below to 6000. + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const unhandledRejections: any[] = []; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const rejectionsHandler = (error: any) => unhandledRejections.push(error); + process.on("unhandledRejection", rejectionsHandler); + + let j1processes = 0; + + globalAgenda.define("j1", (_job, done) => { + j1processes += 1; + done(); + }); + + let j2processes = 0; + globalAgenda.define("j2", (_job, done) => { + j2processes += 1; + done(); + }); + + let j3processes = 0; + globalAgenda.define("j3", async (_job) => { + j3processes += 1; + }); + await globalAgenda.start(); + + await globalAgenda.every("5 seconds", "j1"); + await globalAgenda.every("10 seconds", "j2"); + await globalAgenda.every("15 seconds", "j3"); + + await delay(3001); + + process.removeListener("unhandledRejection", rejectionsHandler); + + strictEqual(1 <= j1processes, true); + strictEqual(j2processes, 1); + strictEqual(j3processes, 1); + + strictEqual(unhandledRejections.length, 0); + }).timeout(10500); + }); +}); diff --git a/tests/fixtures/add-tests.ts b/tests/fixtures/add-tests.ts new file mode 100644 index 0000000..02ec7b1 --- /dev/null +++ b/tests/fixtures/add-tests.ts @@ -0,0 +1,76 @@ +import { Agenda } from "../../src/index"; + +export default { + none: function (): void {}, + daily: function (agenda: Agenda) { + agenda.define("once a day test job", (_job, done) => { + process.send!("ran"); + done(); + process.exit(0); + }); + + agenda.every("one day", "once a day test job"); + }, + "daily-array": function (agenda: Agenda) { + agenda.define("daily test 1", (_job, done) => { + process.send!("test1-ran"); + done(); + }); + + agenda.define("daily test 2", (_job, done) => { + process.send!("test2-ran"); + done(); + }); + + agenda.every("one day", ["daily test 1", "daily test 2"]); + }, + "define-future-job": function (agenda: Agenda) { + const future = new Date(); + future.setDate(future.getDate() + 1); + + agenda.define("job in the future", (_job, done) => { + process.send!("ran"); + done(); + process.exit(0); + }); + + agenda.schedule(future, "job in the future"); + }, + "define-past-due-job": function (agenda: Agenda) { + const past = new Date(); + past.setDate(past.getDate() - 1); + + agenda.define("job in the past", (_job, done) => { + process.send!("ran"); + done(); + process.exit(0); + }); + + agenda.schedule(past, "job in the past"); + }, + "schedule-array": function (agenda: Agenda) { + const past = new Date(); + past.setDate(past.getDate() - 1); + + agenda.define("scheduled test 1", (_unlockJobsjob, done) => { + process.send!("test1-ran"); + done(); + }); + + agenda.define("scheduled test 2", (_job, done) => { + process.send!("test2-ran"); + done(); + }); + + agenda.schedule(past, ["scheduled test 1", "scheduled test 2"]); + }, + now: function (agenda: Agenda) { + agenda.define("now run this job", (_job, done) => { + process.send!("ran"); + done(); + process.exit(0); + }); + + agenda.now("now run this job"); + }, +}; diff --git a/tests/fixtures/agenda-instance.ts b/tests/fixtures/agenda-instance.ts new file mode 100644 index 0000000..b7abcab --- /dev/null +++ b/tests/fixtures/agenda-instance.ts @@ -0,0 +1,34 @@ +import { Agenda } from "../../src/index"; +import addTests from "./add-tests"; + +const connStr = process.argv[2]; +const tests = process.argv.slice(3); + +const agenda = new Agenda( + { + db: { + address: connStr, + }, + processEvery: 100, + }, + async () => { + tests.forEach((test) => { + addTests[test as keyof typeof addTests]?.(agenda); + }); + + await agenda.start(); + + // Ensure we can shut down the process from tests + process.on("message", (msg) => { + if (msg === "exit") { + process.exit(0); + } + }); + + // Send default message of "notRan" after 400ms + setTimeout(() => { + process.send!("notRan"); + process.exit(0); + }, 400); + } +); diff --git a/tests/fixtures/some-job-definition.ts b/tests/fixtures/some-job-definition.ts new file mode 100644 index 0000000..c6851d0 --- /dev/null +++ b/tests/fixtures/some-job-definition.ts @@ -0,0 +1,17 @@ +import { Agenda } from "../../src/index"; + +export default (agenda: Agenda, _definitionOnly = false) => { + agenda.define("some job", async (job) => { + console.log("HELLO from a sub worker"); + if (job.attrs.data?.failIt === "error") { + throw new Error("intended error :-)"); + } else if (job.attrs.data?.failIt === "die") { + process.exit(3); + } else if (job.attrs.data?.failIt === "timeout") { + await new Promise((resolve) => { + setTimeout(resolve, 5000); + }); + } + await job.touch(); + }); +}; diff --git a/tests/helpers/fork-helper.ts b/tests/helpers/fork-helper.ts new file mode 100644 index 0000000..a7d29e2 --- /dev/null +++ b/tests/helpers/fork-helper.ts @@ -0,0 +1,75 @@ +import { Agenda } from "../../src/index"; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function isCancelMessage(message: any): message is { type: "cancel"; error: string } { + return message !== null && typeof message === "object" && message.type === "cancel"; +} + +(async () => { + /** do other required initializations */ + + // get process arguments (name, jobId and path to agenda definition file) + const [, , name, jobId, agendaDefinition] = process.argv; + + // set fancy process title + process.title = `${process.title} (sub worker: ${name}/${jobId})`; + + // initialize Agenda in "forkedWorker" mode + const agenda = new Agenda({ name: `subworker-${name}`, forkedWorker: true }); + // connect agenda (but do not start it) + await agenda.database(process.env.DB_CONNECTION!); + + if (!name || !jobId) { + throw new Error(`invalid parameters: ${JSON.stringify(process.argv)}`); + } + + // load job definition + /** + * in this case the file is for example ../some/path/definitions.js + * with a content like: + * export default (agenda: Agenda, definitionOnly = false) => { + * agenda.define( + * 'some job', + * async (notification: { + * attrs: { data: { dealId: string; orderId: TypeObjectId } }; + * }) => { + * // do something + * } + * ); + * + * if (!definitionOnly) { + * // here you can create scheduled jobs or other things + * } + * }); + */ + if (agendaDefinition) { + const loadDefinition = await import(agendaDefinition); + (loadDefinition.default || loadDefinition)(agenda, true); + } + + // run this job now + const job = await agenda.getForkedJob(jobId); + + process.on("message", (message) => { + if (isCancelMessage(message)) { + job.cancel(message.error); + setTimeout(() => { + // kill it after 10 seconds + process.exit(2); + }, 10000); + } else { + console.log("got message", message); + } + }); + + await job.runJob(); + + // disconnect database and exit + process.exit(0); +})().catch((err) => { + console.error("err", err); + if (process.send) { + process.send(JSON.stringify(err)); + } + process.exit(1); +}); diff --git a/tests/helpers/mock-mongodb.ts b/tests/helpers/mock-mongodb.ts new file mode 100644 index 0000000..bba25b6 --- /dev/null +++ b/tests/helpers/mock-mongodb.ts @@ -0,0 +1,31 @@ +import debug from "debug"; +import { MongoClient } from "mongodb"; +import { MongoMemoryServer } from "mongodb-memory-server"; + +const log = debug("agenda:mock-mongodb"); + +export interface IMockMongo { + disconnect: () => void; + mongo: MongoClient; + mongod: MongoMemoryServer; + uri: string; +} + +export async function mockMongo(): Promise { + const mongod = await MongoMemoryServer.create(); + const uri = mongod.getUri(); + log("mongod started", uri); + + const mongo = await MongoClient.connect(uri); + + return { + disconnect: function () { + mongod.stop(); + log("mongod stopped"); + mongo.close(); + }, + mongo: mongo, + mongod: mongod, + uri: uri, + }; +} diff --git a/tests/job-processor.spec.ts b/tests/job-processor.spec.ts new file mode 100644 index 0000000..0cce833 --- /dev/null +++ b/tests/job-processor.spec.ts @@ -0,0 +1,274 @@ +import { Db } from "mongodb"; +import { fail, match, notStrictEqual, strictEqual } from "node:assert"; +import { Agenda } from "../src/index"; +import { mockMongo } from "./helpers/mock-mongodb"; + +// Create agenda instances +let agenda: Agenda; +// mongo db connection db instance +let mongoDb: Db; + +const clearJobs = async () => { + if (mongoDb) { + await mongoDb.collection("agendaJobs").deleteMany({}); + } +}; + +describe("JobProcessor", () => { + beforeEach(async () => { + if (!mongoDb) { + const mockedMongo = await mockMongo(); + mongoDb = mockedMongo.mongo.db(); + } + + return new Promise((resolve) => { + agenda = new Agenda( + { + mongo: mongoDb, + maxConcurrency: 4, + defaultConcurrency: 1, + lockLimit: 15, + defaultLockLimit: 6, + processEvery: "1 second", + name: "agendaTest", + }, + async () => { + await clearJobs(); + return resolve(); + } + ); + }); + }); + + afterEach(async () => { + await agenda.stop(); + await clearJobs(); + }); + + describe("getRunningStats", () => { + it("throws an error when agenda is not running", async () => { + try { + await agenda.getRunningStats(); + fail(); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } catch (err: any) { + strictEqual(err.message, "agenda not running!"); + } + }); + + it("contains the agendaVersion", async () => { + await agenda.start(); + + const status = await agenda.getRunningStats(); + notStrictEqual(status.version, undefined); + match(status.version, /\d+.\d+.\d+/); + }); + + it("shows the correct job status", async () => { + agenda.define("test", async () => { + await new Promise((resolve) => { + setTimeout(resolve, 30000); + }); + }); + + agenda.now("test"); + await agenda.start(); + + await new Promise((resolve) => { + agenda.on("start:test", resolve); + }); + + const status = await agenda.getRunningStats(); + notStrictEqual(status.jobStatus, undefined); + if (status.jobStatus) { + notStrictEqual(status.jobStatus.test, undefined); + strictEqual(status.jobStatus.test.locked, 1); + strictEqual(status.jobStatus.test.running, 1); + strictEqual(typeof status.jobStatus.test.config.fn, "function"); + strictEqual(status.jobStatus.test.config.concurrency, 1); + strictEqual(status.jobStatus.test.config.lockLifetime, 600000); + strictEqual(status.jobStatus.test.config.priority, 0); + strictEqual(status.jobStatus.test.config.lockLimit, 6); + } + }); + + it("shows isLockingOnTheFly", async () => { + await agenda.start(); + + const status = await agenda.getRunningStats(); + notStrictEqual(status.isLockingOnTheFly, undefined); + strictEqual(typeof status.isLockingOnTheFly, "boolean"); + strictEqual(status.isLockingOnTheFly, false); + }); + + it("shows queueName", async () => { + await agenda.start(); + + const status = await agenda.getRunningStats(); + notStrictEqual(status.isLockingOnTheFly, undefined); + strictEqual(typeof status.queueName, "string"); + strictEqual(status.queueName, "agendaTest"); + }); + + it("shows totalQueueSizeDB", async () => { + await agenda.start(); + + const status = await agenda.getRunningStats(); + notStrictEqual(status.totalQueueSizeDB, undefined); + strictEqual(typeof status.totalQueueSizeDB, "number"); + strictEqual(status.totalQueueSizeDB, 0); + }); + }); + + it("ensure new jobs are always filling up running queue", async () => { + let shortOneFinished = false; + + agenda.define("test long", async () => { + await new Promise((resolve) => { + setTimeout(resolve, 1000); + }); + }); + agenda.define("test short", async () => { + shortOneFinished = true; + await new Promise((resolve) => { + setTimeout(resolve, 5); + }); + }); + + await agenda.start(); + + // queue up long ones + for (let i = 0; i < 100; i += 1) { + agenda.now("test long"); + } + + await new Promise((resolve) => { + setTimeout(resolve, 1000); + }); + + // queue more short ones (they should complete first!) + for (let j = 0; j < 100; j += 1) { + agenda.now("test short"); + } + + await new Promise((resolve) => { + setTimeout(resolve, 1000); + }); + + strictEqual(shortOneFinished, true); + }); + + it("ensure slow jobs time out", async () => { + let jobStarted = false; + agenda.define( + "test long", + async () => { + jobStarted = true; + await new Promise((resolve) => { + setTimeout(resolve, 2500); + }); + }, + { lockLifetime: 500 } + ); + + // queue up long ones + agenda.now("test long"); + + await agenda.start(); + + const promiseResult = await new Promise((resolve) => { + agenda.on("error", (err) => { + resolve(err); + }); + + agenda.on("success", () => { + resolve(); + }); + }); + + strictEqual(jobStarted, true); + strictEqual(promiseResult instanceof Error, true); + }); + + it("ensure slow jobs do not time out when calling touch", async () => { + agenda.define( + "test long", + async (job) => { + for (let i = 0; i < 10; i += 1) { + await new Promise((resolve) => { + setTimeout(resolve, 100); + }); + await job.touch(); + } + }, + { lockLifetime: 500 } + ); + + await agenda.start(); + + // queue up long ones + agenda.now("test long"); + + const promiseResult = await new Promise((resolve) => { + agenda.on("error", (err) => { + resolve(err); + }); + + agenda.on("success", () => { + resolve(); + }); + }); + + strictEqual(promiseResult instanceof Error, false); + }); + + it("ensure concurrency is filled up", async () => { + agenda.maxConcurrency(300); + agenda.lockLimit(150); + agenda.defaultLockLimit(20); + agenda.defaultConcurrency(10); + + for (let jobI = 0; jobI < 10; jobI += 1) { + agenda.define( + `test job ${jobI}`, + async () => { + await new Promise((resolve) => { + setTimeout(resolve, 5000); + }); + }, + { lockLifetime: 10000 } + ); + } + + // queue up jobs + for (let jobI = 0; jobI < 10; jobI += 1) { + for (let jobJ = 0; jobJ < 25; jobJ += 1) { + agenda.now(`test job ${jobI}`); + } + } + + await agenda.start(); + + let runningJobs = 0; + // eslint-disable-next-line no-async-promise-executor + const allJobsStarted = new Promise(async (resolve) => { + do { + runningJobs = (await agenda.getRunningStats()).runningJobs as number; + await new Promise((wait) => { + setTimeout(wait, 50); + }); + } while (runningJobs < 90); // @todo Why not 100? + resolve("all started"); + }); + + strictEqual( + await Promise.race([ + allJobsStarted, + new Promise((resolve) => { + setTimeout(() => resolve(`not all jobs started, currently running: ${runningJobs}`), 1500); + }), + ]), + "all started" + ); + }); +}); diff --git a/tests/job.spec.ts b/tests/job.spec.ts new file mode 100644 index 0000000..d4ab436 --- /dev/null +++ b/tests/job.spec.ts @@ -0,0 +1,1829 @@ +import { DateTime } from "luxon"; +import { Db } from "mongodb"; +import { deepStrictEqual, fail, notStrictEqual, strictEqual } from "node:assert"; +import cp from "node:child_process"; +import path from "node:path"; +import { setTimeout as delay } from "node:timers/promises"; +import * as sinon from "sinon"; +import { Agenda } from "../src/index"; +import { Job } from "../src/job"; +import someJobDefinition from "./fixtures/some-job-definition"; +import { mockMongo } from "./helpers/mock-mongodb"; + +// Create agenda instances +let agenda: Agenda; +// connection string to mongodb +let mongoCfg: string; +// mongo db connection db instance +let mongoDb: Db; + +const clearJobs = async () => { + if (mongoDb) { + await mongoDb.collection("agendaJobs").deleteMany({}); + } +}; + +// Slow timeouts for Travis +const jobTimeout = 500; +const jobType = "do work"; +const jobProcessor = () => {}; + +describe("Job", () => { + beforeEach(async function () { + if (!mongoDb) { + this.timeout(0); + const mockedMongo = await mockMongo(); + mongoCfg = mockedMongo.uri; + mongoDb = mockedMongo.mongo.db(); + } + + return new Promise((resolve) => { + agenda = new Agenda( + { + mongo: mongoDb, + }, + async () => { + await delay(50); + await clearJobs(); + agenda.define("someJob", jobProcessor); + agenda.define("send email", jobProcessor); + agenda.define("some job", jobProcessor); + agenda.define(jobType, jobProcessor); + return resolve(); + } + ); + }); + }); + + afterEach(async () => { + await delay(50); + await agenda.stop(); + await clearJobs(); + }); + + describe("repeatAt", () => { + const job = new Job(agenda, { name: "demo", type: "normal" }); + it("sets the repeat at", () => { + job.repeatAt("3:30pm"); + strictEqual(job.attrs.repeatAt, "3:30pm"); + }); + it("returns the job", () => { + strictEqual(job.repeatAt("3:30pm"), job); + }); + }); + + describe("toJSON", () => { + it("failedAt", () => { + let job = new Job(agenda, { + name: "demo", + type: "normal", + nextRunAt: null, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + failedAt: null as any, + }); + strictEqual(job.toJson().failedAt instanceof Date, false); + + job = new Job(agenda, { + name: "demo", + type: "normal", + nextRunAt: null, + failedAt: new Date(), + }); + strictEqual(job.toJson().failedAt instanceof Date, true); + }); + }); + + describe("unique", () => { + const job = new Job(agenda, { name: "demo", type: "normal" }); + it("sets the unique property", () => { + job.unique({ "data.type": "active", "data.userId": "123" }); + strictEqual(JSON.stringify(job.attrs.unique), JSON.stringify({ "data.type": "active", "data.userId": "123" })); + }); + it("returns the job", () => { + strictEqual(job.unique({ "data.type": "active", "data.userId": "123" }), job); + }); + }); + + describe("repeatEvery", () => { + const job = new Job(agenda, { name: "demo", type: "normal" }); + it("sets the repeat interval", () => { + job.repeatEvery(5000); + strictEqual(job.attrs.repeatInterval, 5000); + }); + it("returns the job", () => { + strictEqual(job.repeatEvery("one second"), job); + }); + it("sets the nextRunAt property with skipImmediate", () => { + const job2 = new Job(agenda, { name: "demo", type: "normal" }); + const now = new Date().valueOf(); + job2.repeatEvery("3 minutes", { skipImmediate: true }); + strictEqual(new Date(now + 180000 - 2) <= job2.attrs.nextRunAt!, true); + strictEqual(job2.attrs.nextRunAt! <= new Date(now + 180002), true); + }); + it("repeats from the existing nextRunAt property with skipImmediate", () => { + const job2 = new Job(agenda, { name: "demo", type: "normal" }); + const futureDate = new Date("3000-01-01T00:00:00"); + job2.attrs.nextRunAt = futureDate; + job2.repeatEvery("3 minutes", { skipImmediate: true }); + strictEqual(job2.attrs.nextRunAt!.getTime(), futureDate.getTime() + 180000); + }); + it("repeats from the existing scheduled date with skipImmediate", () => { + const futureDate = new Date("3000-01-01T00:00:00"); + const job2 = new Job(agenda, { name: "demo", type: "normal" }).schedule(futureDate); + job2.repeatEvery("3 minutes", { skipImmediate: true }); + strictEqual(job2.attrs.nextRunAt!.getTime(), futureDate.valueOf() + 180000); + }); + }); + + describe("schedule", () => { + let job: Job; + beforeEach(() => { + job = new Job(agenda, { name: "demo", type: "normal" }); + }); + it("sets the next run time", () => { + job.schedule("in 5 minutes"); + strictEqual(job.attrs.nextRunAt instanceof Date, true); + }); + it("sets the next run time Date object", () => { + const when = new Date(Date.now() + 1000 * 60 * 3); + job.schedule(when); + strictEqual(job.attrs.nextRunAt instanceof Date, true); + strictEqual(job.attrs.nextRunAt?.getTime(), when.getTime()); + }); + it("returns the job", () => { + strictEqual(job.schedule("tomorrow at noon"), job); + }); + it("understands ISODates on the 30th", () => { + // https://github.com/agenda/agenda/issues/807 + strictEqual(job.schedule("2019-04-30T22:31:00.00Z").attrs.nextRunAt?.getTime(), 1556663460000); + }); + }); + + describe("priority", () => { + let job: Job; + beforeEach(() => { + job = new Job(agenda, { name: "demo", type: "normal" }); + }); + it("sets the priority to a number", () => { + job.priority(10); + strictEqual(job.attrs.priority, 10); + }); + it("returns the job", () => { + strictEqual(job.priority(50), job); + }); + it("parses written priorities", () => { + job.priority("high"); + strictEqual(job.attrs.priority, 10); + }); + }); + + describe("computeNextRunAt", () => { + let job: Job; + + beforeEach(() => { + job = new Job(agenda, { name: "demo", type: "normal" }); + }); + + it("returns the job", () => { + const jobProto = Object.getPrototypeOf(job); + strictEqual(jobProto.computeNextRunAt.call(job), job); + }); + + it("sets to undefined if no repeat at", () => { + job.attrs.repeatAt = undefined; + const jobProto = Object.getPrototypeOf(job); + jobProto.computeNextRunAt.call(job); + strictEqual(job.attrs.nextRunAt, null); + }); + + it("it understands repeatAt times", () => { + const d = new Date(); + d.setHours(23); + d.setMinutes(59); + d.setSeconds(0); + job.attrs.repeatAt = "11:59pm"; + const jobProto = Object.getPrototypeOf(job); + jobProto.computeNextRunAt.call(job); + strictEqual(job.attrs.nextRunAt?.getHours(), d.getHours()); + strictEqual(job.attrs.nextRunAt?.getMinutes(), d.getMinutes()); + }); + + it("sets to undefined if no repeat interval", () => { + job.attrs.repeatInterval = undefined; + const jobProto = Object.getPrototypeOf(job); + jobProto.computeNextRunAt.call(job); + strictEqual(job.attrs.nextRunAt, null); + }); + + it("it understands human intervals", () => { + const now = new Date(); + job.attrs.lastRunAt = now; + job.repeatEvery("2 minutes"); + const jobProto = Object.getPrototypeOf(job); + jobProto.computeNextRunAt.call(job); + strictEqual(job.attrs.nextRunAt?.getTime(), now.valueOf() + 120000); + }); + + it("understands cron intervals", () => { + const now = new Date(); + now.setMinutes(1); + now.setMilliseconds(0); + now.setSeconds(0); + job.attrs.lastRunAt = now; + job.repeatEvery("*/2 * * * *"); + const jobProto = Object.getPrototypeOf(job); + jobProto.computeNextRunAt.call(job); + strictEqual(job.attrs.nextRunAt?.valueOf(), now.valueOf() + 60000); + }); + + it("understands cron intervals with a timezone", () => { + const date = new Date("2015-01-01T06:01:00-00:00"); + job.attrs.lastRunAt = date; + job.repeatEvery("0 6 * * *", { + timezone: "GMT", + }); + const jobProto = Object.getPrototypeOf(job); + jobProto.computeNextRunAt.call(job); + strictEqual(DateTime.fromJSDate(job.attrs.nextRunAt!).setZone("GMT").hour, 6); + strictEqual( + DateTime.fromJSDate(job.attrs.nextRunAt!).toJSDate().getDate(), + DateTime.fromJSDate(job.attrs.lastRunAt!).plus({ days: 1 }).toJSDate().getDate() + ); + }); + + it("understands cron intervals with a vienna timezone with higher hours", () => { + const date = new Date("2015-01-01T06:01:00-00:00"); + job.attrs.lastRunAt = date; + job.repeatEvery("0 16 * * *", { + timezone: "Europe/Vienna", + }); + const jobProto = Object.getPrototypeOf(job); + jobProto.computeNextRunAt.call(job); + strictEqual(DateTime.fromJSDate(job.attrs.nextRunAt!).setZone("GMT").hour, 15); + strictEqual( + DateTime.fromJSDate(job.attrs.nextRunAt!).toJSDate().getDate(), + DateTime.fromJSDate(job.attrs.lastRunAt!).toJSDate().getDate() + ); + }); + + it("understands cron intervals with a timezone when last run is the same as the interval", () => { + const date = new Date("2015-01-01T06:00:00-00:00"); + job.attrs.lastRunAt = date; + job.repeatEvery("0 6 * * *", { + timezone: "GMT", + }); + const jobProto = Object.getPrototypeOf(job); + jobProto.computeNextRunAt.call(job); + strictEqual(DateTime.fromJSDate(job.attrs.nextRunAt!).setZone("GMT").hour, 6); + strictEqual( + DateTime.fromJSDate(job.attrs.nextRunAt!).toJSDate().getDate(), + DateTime.fromJSDate(job.attrs.lastRunAt!).plus({ days: 1 }).toJSDate().getDate() + ); + }); + + it("gives the correct nextDate when the lastRun is 1ms before the expected time", () => { + // (Issue #858): lastRunAt being 1ms before the nextRunAt makes cronTime return the same nextRunAt + const last = new Date(); + last.setSeconds(59); + last.setMilliseconds(999); + const next = new Date(last.valueOf() + 1); + const expectedDate = new Date(next.valueOf() + 60000); + job.attrs.lastRunAt = last; + job.attrs.nextRunAt = next; + job.repeatEvery("* * * * *", { + timezone: "GMT", + }); + const jobProto = Object.getPrototypeOf(job); + jobProto.computeNextRunAt.call(job); + strictEqual(job.attrs.nextRunAt.valueOf(), expectedDate.valueOf()); + }); + + it("cron job with month starting at 1", async () => { + job.repeatEvery("0 0 * 1 *", { + timezone: "GMT", + }); + if (job.attrs.nextRunAt) { + strictEqual(job.attrs.nextRunAt.getMonth(), 0); + } else { + fail(); + } + }); + + it("repeating job with cron", async () => { + job.repeatEvery("0 0 * 1 *", { + timezone: "GMT", + }); + notStrictEqual(job.attrs.nextRunAt, null); + }); + + describe("when repeat at time is invalid", () => { + beforeEach(() => { + job.attrs.repeatAt = "foo"; + const jobProto = Object.getPrototypeOf(job); + jobProto.computeNextRunAt.call(job); + }); + + it("sets nextRunAt to null", () => { + strictEqual(job.attrs.nextRunAt, null); + }); + + it("fails the job", () => { + strictEqual(job.attrs.failReason, "failed to calculate repeatAt time due to invalid format"); + }); + }); + + describe("when repeat interval is invalid", () => { + beforeEach(() => { + job.attrs.repeatInterval = "asd"; + const jobProto = Object.getPrototypeOf(job); + jobProto.computeNextRunAt.call(job); + }); + + it("sets nextRunAt to null", () => { + strictEqual(job.attrs.nextRunAt, null); + }); + + it("fails the job", () => { + strictEqual( + job.attrs.failReason, + 'failed to calculate nextRunAt due to invalid repeat interval (asd): Error: Validation error, cannot resolve alias "asd"' + ); + }); + }); + }); + + describe("remove", () => { + it("removes the job", async () => { + const job = new Job(agenda, { + name: "removed job", + type: "normal", + }); + await job.save(); + const resultSaved = await mongoDb + .collection("agendaJobs") + .find({ + _id: job.attrs._id, + }) + .toArray(); + + strictEqual(resultSaved.length, 1); + await job.remove(); + + const resultDeleted = await mongoDb + .collection("agendaJobs") + .find({ + _id: job.attrs._id, + }) + .toArray(); + + strictEqual(resultDeleted.length, 0); + }); + }); + + describe("run", () => { + beforeEach(async () => { + agenda.define("testRun", (_job, done) => { + setTimeout(() => { + done(); + }, 100); + }); + }); + + it("updates lastRunAt", async () => { + const job = new Job(agenda, { name: "testRun", type: "normal" }); + await job.save(); + const now = new Date(); + await delay(5); + await job.run(); + + strictEqual(now.valueOf() < (job.attrs.lastRunAt?.valueOf() ?? -Infinity), true); + }); + + it("fails if job is undefined", async () => { + const job = new Job(agenda, { name: "not defined", type: "normal" }); + await job.save(); + + await job.run().catch((error) => { + strictEqual(error.message, "Undefined job"); + }); + notStrictEqual(job.attrs.failedAt, undefined); + strictEqual(job.attrs.failReason, "Undefined job"); + }); + + it("updates nextRunAt", async () => { + const job = new Job(agenda, { name: "testRun", type: "normal" }); + await job.save(); + + const now = new Date(); + job.repeatEvery("10 minutes"); + await delay(5); + await job.run(); + strictEqual(now.valueOf() + 59999 < (job.attrs.nextRunAt?.valueOf() ?? -Infinity), true); + }); + + it("handles errors", async () => { + const job = new Job(agenda, { name: "failBoat", type: "normal" }); + await job.save(); + + agenda.define("failBoat", () => { + throw new Error("Zomg fail"); + }); + await job.run(); + strictEqual(job.attrs.failReason, "Zomg fail"); + }); + + it("handles errors with q promises", async () => { + const job = new Job(agenda, { name: "failBoat2", type: "normal" }); + await job.save(); + + agenda.define("failBoat2", async (_job, cb) => { + try { + throw new Error("Zomg fail"); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } catch (err: any) { + cb(err); + } + }); + await job.run(); + notStrictEqual(job.attrs.failReason, undefined); + }); + + it("allows async functions", async () => { + const job = new Job(agenda, { name: "async", type: "normal" }); + await job.save(); + + const successSpy = sinon.stub(); + let finished = false; + + agenda.once("success:async", successSpy); + + agenda.define("async", async () => { + await delay(5); + finished = true; + }); + + strictEqual(finished, false); + await job.run(); + strictEqual(successSpy.callCount, 1); + strictEqual(finished, true); + }); + + it("handles errors from async functions", async () => { + const job = new Job(agenda, { name: "asyncFail", type: "normal" }); + await job.save(); + + const failSpy = sinon.stub(); + const err = new Error("failure"); + + agenda.once("fail:asyncFail", failSpy); + + agenda.define("asyncFail", async () => { + await delay(5); + throw err; + }); + + await job.run(); + strictEqual(failSpy.callCount, 1); + strictEqual(failSpy.calledWith(err), true); + }); + + it("waits for the callback to be called even if the function is async", async () => { + const job = new Job(agenda, { name: "asyncCb", type: "normal" }); + await job.save(); + + const successSpy = sinon.stub(); + let finishedCb = false; + + agenda.once("success:asyncCb", successSpy); + + agenda.define("asyncCb", async (_job, cb) => { + (async () => { + await delay(5); + finishedCb = true; + cb(); + })(); + }); + + await job.run(); + strictEqual(finishedCb, true); + strictEqual(successSpy.callCount, 1); + }); + + it("uses the callback error if the function is async and didn't reject", async () => { + const job = new Job(agenda, { name: "asyncCbError", type: "normal" }); + await job.save(); + + const failSpy = sinon.stub(); + const err = new Error("failure"); + + agenda.once("fail:asyncCbError", failSpy); + + agenda.define("asyncCbError", async (_job, cb) => { + (async () => { + await delay(5); + cb(err); + })(); + }); + + await job.run(); + strictEqual(failSpy.callCount, 1); + strictEqual(failSpy.calledWith(err), true); + }); + + it("favors the async function error over the callback error if it comes first", async () => { + const job = new Job(agenda, { name: "asyncCbTwoError", type: "normal" }); + await job.save(); + + const failSpy = sinon.stub(); + const fnErr = new Error("functionFailure"); + const cbErr = new Error("callbackFailure"); + + agenda.on("fail:asyncCbTwoError", failSpy); + + agenda.define("asyncCbTwoError", async (_job, cb) => { + (async () => { + await delay(5); + cb(cbErr); + })(); + + throw fnErr; + }); + + await job.run(); + strictEqual(failSpy.callCount, 1); + strictEqual(failSpy.calledWith(fnErr), true); + strictEqual(failSpy.calledWith(cbErr), false); + }); + + it("favors the callback error over the async function error if it comes first", async () => { + const job = new Job(agenda, { name: "asyncCbTwoErrorCb", type: "normal" }); + await job.save(); + + const failSpy = sinon.stub(); + const fnErr = new Error("functionFailure"); + const cbErr = new Error("callbackFailure"); + + agenda.on("fail:asyncCbTwoErrorCb", failSpy); + + agenda.define("asyncCbTwoErrorCb", async (_job, cb) => { + cb(cbErr); + await delay(5); + throw fnErr; + }); + + await job.run(); + strictEqual(failSpy.callCount, 1); + strictEqual(failSpy.calledWith(cbErr), true); + strictEqual(failSpy.calledWith(fnErr), false); + }); + + it("doesn't allow a stale job to be saved", async () => { + const job = new Job(agenda, { name: "failBoat3", type: "normal" }); + await job.save(); + + agenda.define("failBoat3", async (_job, cb) => { + // Explicitly find the job again, + // so we have a new job object + const jobs = await agenda.jobs({ name: "failBoat3" }); + strictEqual(jobs.length, 1); + await jobs[0].remove(); + cb(); + }); + + await job.run(); + + // Expect the deleted job to not exist in the database + const deletedJob = await agenda.jobs({ name: "failBoat3" }); + strictEqual(deletedJob.length, 0); + }); + }); + + describe("touch", () => { + it("extends the lock lifetime", async () => { + const lockedAt = new Date(); + const job = new Job(agenda, { name: "some job", type: "normal", lockedAt }); + await job.save(); + await delay(2); + await job.touch(); + strictEqual(lockedAt.valueOf() < job.attrs.lockedAt!.valueOf(), true); + }); + }); + + describe("fail", () => { + const job = new Job(agenda, { name: "demo", type: "normal" }); + it("takes a string", () => { + job.fail("test"); + strictEqual(job.attrs.failReason, "test"); + }); + it("takes an error object", () => { + job.fail(new Error("test")); + strictEqual(job.attrs.failReason, "test"); + }); + it("sets the failedAt time", () => { + job.fail("test"); + strictEqual(job.attrs.failedAt instanceof Date, true); + }); + it("sets the failedAt time equal to lastFinishedAt time", () => { + job.fail("test"); + strictEqual(job.attrs.failedAt, job.attrs.lastFinishedAt); + }); + }); + + describe("enable", () => { + it("sets disabled to false on the job", () => { + const job = new Job(agenda, { name: "test", type: "normal", disabled: true }); + job.enable(); + strictEqual(job.attrs.disabled, false); + }); + + it("returns the job", () => { + const job = new Job(agenda, { name: "test", type: "normal", disabled: true }); + strictEqual(job.enable(), job); + }); + }); + + describe("disable", () => { + it("sets disabled to true on the job", () => { + const job = new Job(agenda, { name: "demo", type: "normal" }); + job.disable(); + strictEqual(job.attrs.disabled, true); + }); + it("returns the job", () => { + const job = new Job(agenda, { name: "demo", type: "normal" }); + strictEqual(job.disable(), job); + }); + }); + + describe("save", () => { + it("doesnt save the job if its been removed", async () => { + const job = agenda.create("another job"); + // Save, then remove, then try and save again. + // The second save should fail. + const j = await job.save(); + await j.remove(); + await j.save(); + + const jobs = await agenda.jobs({ name: "another job" }); + strictEqual(jobs.length, 0); + }); + + it("returns the job", async () => { + const job = agenda.create("some job", { + wee: 1, + }); + strictEqual(await job.save(), job); + }); + }); + + describe("start/stop", () => { + it("starts/stops the job queue", async () => { + const processed = new Promise((resolve) => { + agenda.define("jobQueueTest", async (_job) => { + resolve("processed"); + }); + }); + await agenda.every("1 second", "jobQueueTest"); + agenda.processEvery("1 second"); + await agenda.start(); + + strictEqual( + await Promise.race([ + processed, + new Promise((resolve) => { + setTimeout(() => resolve(`not processed`), 1100); + }), + ]), + "processed" + ); + + await agenda.stop(); + const processedStopped = new Promise((resolve) => { + agenda.define("jobQueueTest", async (_job) => { + resolve(); + }); + }); + + strictEqual( + await Promise.race([ + processedStopped, + new Promise((resolve) => { + setTimeout(() => resolve(`not processed`), 1100); + }), + ]), + "not processed" + ); + }); + + it("does not run disabled jobs", async () => { + let ran = false; + agenda.define("disabledJob", () => { + ran = true; + }); + + const job = await agenda.create("disabledJob").disable().schedule("now"); + await job.save(); + await agenda.start(); + await delay(jobTimeout); + + strictEqual(ran, false); + + await agenda.stop(); + }); + + it("does not throw an error trying to process undefined jobs", async () => { + await agenda.start(); + const job = agenda.create("jobDefinedOnAnotherServer").schedule("now"); + + await job.save(); + + await delay(jobTimeout); + await agenda.stop(); + }); + + it("clears locks on stop", async () => { + agenda.define("longRunningJob", (_job, _cb) => { + // Job never finishes + }); + agenda.every("10 seconds", "longRunningJob"); + agenda.processEvery("1 second"); + + await agenda.start(); + await delay(jobTimeout); + const jobStarted = await agenda.db.getJobs({ name: "longRunningJob" }); + notStrictEqual(jobStarted[0].lockedAt, null); + await agenda.stop(); + const job = await agenda.db.getJobs({ name: "longRunningJob" }); + strictEqual(job[0].lockedAt, undefined); + }); + + describe("events", () => { + beforeEach(() => { + agenda.define("jobQueueTest", (_job, cb) => { + cb(); + }); + agenda.define("failBoat", () => { + throw new Error("Zomg fail"); + }); + }); + + it("emits start event", async () => { + const spy = sinon.spy(); + const job = new Job(agenda, { name: "jobQueueTest", type: "normal" }); + await job.save(); + agenda.once("start", spy); + + await job.run(); + strictEqual(spy.called, true); + strictEqual(spy.calledWithExactly(job), true); + }); + + it("emits start:job name event", async () => { + const spy = sinon.spy(); + const job = new Job(agenda, { name: "jobQueueTest", type: "normal" }); + await job.save(); + agenda.once("start:jobQueueTest", spy); + + await job.run(); + strictEqual(spy.called, true); + strictEqual(spy.calledWithExactly(job), true); + }); + + it("emits complete event", async () => { + const spy = sinon.spy(); + const job = new Job(agenda, { name: "jobQueueTest", type: "normal" }); + await job.save(); + agenda.once("complete", spy); + + await job.run(); + strictEqual(spy.called, true); + strictEqual(spy.calledWithExactly(job), true); + }); + + it("emits complete:job name event", async () => { + const spy = sinon.spy(); + const job = new Job(agenda, { name: "jobQueueTest", type: "normal" }); + await job.save(); + agenda.once("complete:jobQueueTest", spy); + + await job.run(); + strictEqual(spy.called, true); + strictEqual(spy.calledWithExactly(job), true); + }); + + it("emits success event", async () => { + const spy = sinon.spy(); + const job = new Job(agenda, { name: "jobQueueTest", type: "normal" }); + await job.save(); + agenda.once("success", spy); + + await job.run(); + strictEqual(spy.called, true); + strictEqual(spy.calledWithExactly(job), true); + }); + + it("emits success:job name event", async () => { + const spy = sinon.spy(); + const job = new Job(agenda, { name: "jobQueueTest", type: "normal" }); + await job.save(); + agenda.once("success:jobQueueTest", spy); + + await job.run(); + strictEqual(spy.called, true); + strictEqual(spy.calledWithExactly(job), true); + }); + + it("emits fail event", async () => { + const spy = sinon.spy(); + const job = new Job(agenda, { name: "failBoat", type: "normal" }); + await job.save(); + agenda.once("fail", spy); + + await job.run().catch((error) => { + strictEqual(error.message, "Zomg fail"); + }); + + strictEqual(spy.called, true); + + const err = spy.args[0][0]; + strictEqual(err.message, "Zomg fail"); + strictEqual(job.attrs.failCount, 1); + strictEqual(job.attrs.lastFinishedAt!.valueOf() < job.attrs.failedAt!.valueOf(), false); + }); + + it("emits fail:job name event", async () => { + const spy = sinon.spy(); + const job = new Job(agenda, { name: "failBoat", type: "normal" }); + await job.save(); + agenda.once("fail:failBoat", spy); + + await job.run().catch((error) => { + strictEqual(error.message, "Zomg fail"); + }); + + strictEqual(spy.called, true); + + const err = spy.args[0][0]; + strictEqual(err.message, "Zomg fail"); + strictEqual(job.attrs.failCount, 1); + strictEqual(job.attrs.lastFinishedAt!.valueOf() < job.attrs.failedAt!.valueOf(), false); + }); + }); + }); + + describe("job lock", () => { + it("runs a recurring job after a lock has expired", async () => { + const processorPromise = new Promise((resolve) => { + let startCounter = 0; + agenda.define( + "lock job", + async () => { + startCounter++; + + if (startCounter !== 1) { + await agenda.stop(); + resolve(startCounter); + } + }, + { + lockLifetime: 50, + } + ); + }); + + strictEqual(agenda.definitions["lock job"].lockLifetime, 50); + + agenda.defaultConcurrency(100); + agenda.processEvery(10); + agenda.every("0.02 seconds", "lock job"); + await agenda.stop(); + await agenda.start(); + strictEqual(await processorPromise, 2); + }); + + it("runs a one-time job after its lock expires", async () => { + const processorPromise = new Promise((resolve) => { + let runCount = 0; + + agenda.define( + "lock job", + async (_job) => { + runCount++; + if (runCount === 1) { + // this should time out + await new Promise((longResolve) => { + setTimeout(longResolve, 1000); + }); + } else { + await new Promise((longResolve) => { + setTimeout(longResolve, 10); + }); + resolve(runCount); + } + }, + { + lockLifetime: 50, + concurrency: 1, + } + ); + }); + + let errorHasBeenThrown!: Error; + agenda.on("error", (err) => { + errorHasBeenThrown = err; + }); + agenda.processEvery(25); + await agenda.start(); + agenda.now("lock job", { + i: 1, + }); + strictEqual(await processorPromise, 2); + strictEqual(errorHasBeenThrown?.message.includes("execution of 'lock job' canceled"), true); + }); + + it("does not process locked jobs", async () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const history: any[] = []; + + agenda.define( + "lock job", + (job, cb) => { + history.push(job.attrs.data.i); + + setTimeout(() => { + cb(); + }, 150); + }, + { + lockLifetime: 300, + } + ); + + agenda.processEvery(100); + await agenda.start(); + + await Promise.all([ + agenda.now("lock job", { i: 1 }), + agenda.now("lock job", { i: 2 }), + agenda.now("lock job", { i: 3 }), + ]); + + await delay(500); + strictEqual(history.length, 3); + strictEqual(history.includes(1), true); + strictEqual(history.includes(2), true); + strictEqual(history.includes(3), true); + }); + + it("does not on-the-fly lock more than agenda._lockLimit jobs", async () => { + agenda.lockLimit(1); + + agenda.define("lock job", (_job, _cb) => { + /* this job nevers finishes */ + }); + + await agenda.start(); + + await Promise.all([agenda.now("lock job", { i: 1 }), agenda.now("lock job", { i: 2 })]); + + // give it some time to get picked up + await delay(200); + + strictEqual((await agenda.getRunningStats()).lockedJobs, 1); + }); + + it("does not on-the-fly lock more mixed jobs than agenda._lockLimit jobs", async () => { + agenda.lockLimit(1); + + agenda.define("lock job", (_job, _cb) => {}); + agenda.define("lock job2", (_job, _cb) => {}); + agenda.define("lock job3", (_job, _cb) => {}); + agenda.define("lock job4", (_job, _cb) => {}); + agenda.define("lock job5", (_job, _cb) => {}); + + await agenda.start(); + + await Promise.all([ + agenda.now("lock job", { i: 1 }), + agenda.now("lock job5", { i: 2 }), + agenda.now("lock job4", { i: 3 }), + agenda.now("lock job3", { i: 4 }), + agenda.now("lock job2", { i: 5 }), + ]); + + await delay(500); + strictEqual((await agenda.getRunningStats()).lockedJobs, 1); + await agenda.stop(); + }); + + it("does not on-the-fly lock more than definition.lockLimit jobs", async () => { + agenda.define("lock job", (_job, _cb) => {}, { lockLimit: 1 }); + + await agenda.start(); + + await Promise.all([agenda.now("lock job", { i: 1 }), agenda.now("lock job", { i: 2 })]); + + await delay(500); + strictEqual((await agenda.getRunningStats()).lockedJobs, 1); + }); + + it("does not lock more than agenda._lockLimit jobs during processing interval", async () => { + agenda.lockLimit(1); + agenda.processEvery(200); + + agenda.define("lock job", (_job, _cb) => {}); + + await agenda.start(); + + const when = DateTime.local().plus({ milliseconds: 300 }).toJSDate(); + + await Promise.all([agenda.schedule(when, "lock job", { i: 1 }), agenda.schedule(when, "lock job", { i: 2 })]); + + await delay(500); + strictEqual((await agenda.getRunningStats()).lockedJobs, 1); + }); + + it("does not lock more than definition.lockLimit jobs during processing interval", async () => { + agenda.processEvery(200); + + agenda.define("lock job", (_job, _cb) => {}, { lockLimit: 1 }); + + await agenda.start(); + + const when = DateTime.local().plus({ milliseconds: 300 }).toJSDate(); + + await Promise.all([agenda.schedule(when, "lock job", { i: 1 }), agenda.schedule(when, "lock job", { i: 2 })]); + + await delay(500); + strictEqual((await agenda.getRunningStats()).lockedJobs, 1); + await agenda.stop(); + }); + }); + + describe("job concurrency", () => { + it("should not block a job for concurrency of another job", async () => { + agenda.processEvery(50); + + const processed: number[] = []; + const now = Date.now(); + + agenda.define( + "blocking", + (job, cb) => { + processed.push(job.attrs.data.i); + setTimeout(cb, 400); + }, + { + concurrency: 1, + } + ); + + const checkResultsPromise = new Promise((resolve) => { + agenda.define( + "non-blocking", + (job) => { + processed.push(job.attrs.data.i); + resolve(processed); + }, + { + // Lower priority to keep it at the back in the queue + priority: "lowest", + } + ); + }); + + let finished = false; + agenda.on("complete", () => { + if (!finished && processed.length === 3) { + finished = true; + } + }); + + agenda.start(); + + await Promise.all([ + agenda.schedule(new Date(now + 100), "blocking", { i: 1 }), + agenda.schedule(new Date(now + 101), "blocking", { i: 2 }), + agenda.schedule(new Date(now + 102), "non-blocking", { i: 3 }), + ]); + + try { + const results: number[] = await Promise.race([ + checkResultsPromise, + + new Promise((_, reject) => { + setTimeout(() => { + reject(`not processed`); + }, 2000); + }), + ]); + strictEqual(results.includes(2), false); + } catch (err) { + console.log("stats", err, JSON.stringify(await agenda.getRunningStats(), undefined, 3)); + throw err; + } + }); + + it("should run jobs as first in first out (FIFO)", async () => { + agenda.processEvery(100); + agenda.define("fifo", (_job, cb) => cb(), { concurrency: 1 }); + + const checkResultsPromise = new Promise((resolve) => { + const results: number[] = []; + + agenda.on("start:fifo", (job) => { + results.push(new Date(job.attrs.nextRunAt!).getTime()); + if (results.length !== 3) { + return; + } + + resolve(results); + }); + }); + + await agenda.start(); + + await agenda.now("fifo"); + await delay(50); + await agenda.now("fifo"); + await delay(50); + await agenda.now("fifo"); + await delay(50); + try { + const results: number[] = await Promise.race([ + checkResultsPromise, + + new Promise((_, reject) => { + setTimeout(() => { + reject(`not processed`); + }, 2000); + }), + ]); + strictEqual(results.join(""), results.sort().join("")); + } catch (err) { + console.log("stats", err, JSON.stringify(await agenda.getRunningStats(), undefined, 3)); + throw err; + } + }); + + it("should run jobs as first in first out (FIFO) with respect to priority", async () => { + const now = Date.now(); + + agenda.define("fifo-priority", (_job, cb) => setTimeout(cb, 100), { concurrency: 1 }); + + const checkResultsPromise = new Promise((resolve) => { + const times: number[] = []; + const priorities: number[] = []; + + agenda.on("start:fifo-priority", (job) => { + priorities.push(job.attrs.priority); + times.push(new Date(job.attrs.lastRunAt!).getTime()); + if (priorities.length !== 3 || times.length !== 3) { + return; + } + + resolve({ times, priorities }); + }); + }); + + await Promise.all([ + agenda.create("fifo-priority", { i: 1 }).schedule(new Date(now)).priority("high").save(), + agenda + .create("fifo-priority", { i: 2 }) + .schedule(new Date(now + 100)) + .priority("low") + .save(), + agenda + .create("fifo-priority", { i: 3 }) + .schedule(new Date(now + 100)) + .priority("high") + .save(), + ]); + await agenda.start(); + try { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const { times, priorities } = await Promise.race([ + checkResultsPromise, + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + new Promise((_, reject) => { + setTimeout(() => { + reject(`not processed`); + }, 2000); + }), + ]); + + strictEqual(times.join(""), times.sort().join("")); + deepStrictEqual(priorities, [10, 10, -10]); + } catch (err) { + console.log("stats", err, JSON.stringify(await agenda.getRunningStats(), undefined, 3)); + throw err; + } + }); + + it("should run higher priority jobs first", async () => { + // Inspired by tests added by @lushc here: + // + const now = new Date(); + + agenda.define("priority", (_job, cb) => setTimeout(cb, 10), { concurrency: 1 }); + + const checkResultsPromise = new Promise((resolve) => { + const results: number[] = []; + + agenda.on("start:priority", (job) => { + results.push(job.attrs.priority); + if (results.length !== 3) { + return; + } + + resolve(results); + }); + }); + + await Promise.all([ + agenda.create("priority").schedule(now).save(), + agenda.create("priority").schedule(now).priority("low").save(), + agenda.create("priority").schedule(now).priority("high").save(), + ]); + await agenda.start(); + try { + const results = await Promise.race([ + checkResultsPromise, + + new Promise((_, reject) => { + setTimeout(() => { + reject(`not processed`); + }, 2000); + }), + ]); + deepStrictEqual(results, [10, 0, -10]); + } catch (err) { + console.log("stats", JSON.stringify(await agenda.getRunningStats(), undefined, 3)); + throw err; + } + }); + + it("should support custom sort option", () => { + const sort = { foo: 1 } as const; + const agendaSort = new Agenda({ sort }); + deepStrictEqual(agendaSort.attrs.sort, sort); + }); + }); + + describe("every running", () => { + beforeEach(async () => { + agenda.defaultConcurrency(1); + agenda.processEvery(5); + + await agenda.stop(); + }); + + it("should run the same job multiple times", async () => { + let counter = 0; + + agenda.define("everyRunTest1", (_job, cb) => { + if (counter < 2) { + counter++; + } + + cb(); + }); + + await agenda.every(10, "everyRunTest1"); + + await agenda.start(); + + await agenda.jobs({ name: "everyRunTest1" }); + await delay(jobTimeout); + strictEqual(counter, 2); + + await agenda.stop(); + }); + + it("should reuse the same job on multiple runs", async () => { + let counter = 0; + + agenda.define("everyRunTest2", (_job, cb) => { + if (counter < 2) { + counter++; + } + + cb(); + }); + await agenda.every(10, "everyRunTest2"); + + await agenda.start(); + + await delay(jobTimeout); + const result = await agenda.jobs({ name: "everyRunTest2" }); + + strictEqual(result.length, 1); + await agenda.stop(); + }); + }); + + describe("Integration Tests", () => { + describe(".every()", () => { + it("Should not rerun completed jobs after restart", (done) => { + let i = 0; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const serviceError = function (e: any) { + done(e); + }; + + const receiveMessage = function (msg: string) { + if (msg === "ran") { + strictEqual(i, 0); + i += 1; + + startService(); + } else if (msg === "notRan") { + strictEqual(i, 1); + done(); + } else { + done(new Error("Unexpected response returned!")); + } + }; + + const startService = () => { + const serverPath = path.join(__dirname, "fixtures", "agenda-instance.ts"); + const n = cp.fork(serverPath, [mongoCfg, "daily"], { + execArgv: ["--require", "ts-node/register"], + }); + + n.on("message", receiveMessage); + n.on("error", serviceError); + }; + + startService(); + }); + + it("Should properly run jobs when defined via an array", (done) => { + const serverPath = path.join(__dirname, "fixtures", "agenda-instance.ts"); + const n = cp.fork(serverPath, [mongoCfg, "daily-array"], { + execArgv: ["--require", "ts-node/register"], + }); + + let ran1 = false; + let ran2 = false; + let doneCalled = false; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const serviceError = function (e: any) { + done(e); + }; + + const receiveMessage = function (msg: string) { + if (msg === "test1-ran") { + ran1 = true; + if (ran1 && ran2 && !doneCalled) { + doneCalled = true; + done(); + n.send("exit"); + } + } else if (msg === "test2-ran") { + ran2 = true; + if (ran1 && ran2 && !doneCalled) { + doneCalled = true; + done(); + n.send("exit"); + } + } else if (!doneCalled) { + done(new Error("Jobs did not run!")); + } + }; + + n.on("message", receiveMessage); + n.on("error", serviceError); + }); + + it("should not run if job is disabled", async () => { + let counter = 0; + + agenda.define("everyDisabledTest", (_job, cb) => { + counter++; + cb(); + }); + + const job = await agenda.every(10, "everyDisabledTest"); + + job.disable(); + + await job.save(); + await agenda.start(); + + await delay(jobTimeout); + await agenda.jobs({ name: "everyDisabledTest" }); + strictEqual(counter, 0); + await agenda.stop(); + }); + }); + + describe("schedule()", () => { + it("Should not run jobs scheduled in the future", (done) => { + let i = 0; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const serviceError = function (e: any) { + done(e); + }; + + const receiveMessage = function (msg: string) { + if (msg === "notRan") { + if (i < 5) { + done(); + return; + } + + i += 1; + + startService(); + } else { + done(new Error("Job scheduled in future was ran!")); + } + }; + + const startService = () => { + const serverPath = path.join(__dirname, "fixtures", "agenda-instance.ts"); + const n = cp.fork(serverPath, [mongoCfg, "define-future-job"], { + execArgv: ["--require", "ts-node/register"], + }); + + n.on("message", receiveMessage); + n.on("error", serviceError); + }; + + startService(); + }); + + it("Should run past due jobs when process starts", (done) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const serviceError = function (e: any) { + done(e); + }; + + const receiveMessage = function (msg: string) { + if (msg === "ran") { + done(); + } else { + done(new Error("Past due job did not run!")); + } + }; + + const startService = () => { + const serverPath = path.join(__dirname, "fixtures", "agenda-instance.ts"); + const n = cp.fork(serverPath, [mongoCfg, "define-past-due-job"], { + execArgv: ["--require", "ts-node/register"], + }); + + n.on("message", receiveMessage); + n.on("error", serviceError); + }; + + startService(); + }); + + it("Should schedule using array of names", (done) => { + const serverPath = path.join(__dirname, "fixtures", "agenda-instance.ts"); + const n = cp.fork(serverPath, [mongoCfg, "schedule-array"], { + execArgv: ["--require", "ts-node/register"], + }); + + let ran1 = false; + let ran2 = false; + let doneCalled = false; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const serviceError = (err: any) => { + done(err); + }; + + const receiveMessage = (msg: string) => { + if (msg === "test1-ran") { + ran1 = true; + if (ran1 && ran2 && !doneCalled) { + doneCalled = true; + done(); + n.send("exit"); + } + } else if (msg === "test2-ran") { + ran2 = true; + if (ran1 && ran2 && !doneCalled) { + doneCalled = true; + done(); + n.send("exit"); + } + } else if (!doneCalled) { + done(new Error("Jobs did not run!")); + } + }; + + n.on("message", receiveMessage); + n.on("error", serviceError); + }); + }); + + describe("now()", () => { + it("Should immediately run the job", (done) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const serviceError = function (e: any) { + done(e); + }; + + const receiveMessage = function (msg: string) { + if (msg === "ran") { + return done(); + } + + return done(new Error("Job did not immediately run!")); + }; + + const serverPath = path.join(__dirname, "fixtures", "agenda-instance.ts"); + const n = cp.fork(serverPath, [mongoCfg, "now"], { + execArgv: ["--require", "ts-node/register"], + }); + + n.on("message", receiveMessage); + n.on("error", serviceError); + }); + }); + + describe("General Integration", () => { + it("Should not run a job that has already been run", async () => { + const runCount: { [keyof: string]: number } = {}; + + agenda.define("test-job", (job, cb) => { + const id = job.attrs._id!.toString(); + + runCount[id] = runCount[id] ? runCount[id] + 1 : 1; + cb(); + }); + + agenda.processEvery(100); + await agenda.start(); + + await Promise.all([...new Array(10)].map(() => agenda.now("test-job"))); + + await delay(jobTimeout); + const ids = Object.keys(runCount); + strictEqual(ids.length, 10); + Object.keys(runCount).forEach((id) => { + strictEqual(runCount[id], 1); + }); + }); + }); + }); + + it('checks database for running job on "client"', async () => { + agenda.define("test", async () => { + await new Promise((resolve) => { + setTimeout(resolve, 30000); + }); + }); + + const job = await agenda.now("test"); + await agenda.start(); + + await new Promise((resolve) => { + agenda.on("start:test", resolve); + }); + + strictEqual(await job.isRunning(), true); + }); + + it("should not run job if it has been removed", async () => { + let executed = false; + agenda.define("test", async () => { + executed = true; + }); + + const job = new Job(agenda, { + name: "test", + type: "normal", + }); + job.schedule("in 1 second"); + await job.save(); + + await agenda.start(); + + let jobStarted; + let retried = 0; + // wait till it's locked (Picked up by the event processor) + do { + jobStarted = await agenda.db.getJobs({ name: "test" }); + if (!jobStarted[0].lockedAt) { + await delay(100); + } + retried++; + } while (!jobStarted[0].lockedAt || retried > 10); + + notStrictEqual(jobStarted[0].lockedAt, undefined); + + await job.remove(); + + let error; + const completed = new Promise((resolve) => { + agenda.on("error", (err) => { + error = err; + resolve(); + }); + }); + + await Promise.race([ + new Promise((resolve) => { + setTimeout(() => { + resolve(); + }, 1000); + }), + completed, + ]); + + strictEqual(executed, false); + if (typeof error !== "undefined") { + strictEqual((error as Error).message.includes("(name: test) cannot be updated in the database"), true); + } + }); + + describe("job fork mode", () => { + it("runs a job in fork mode", async () => { + const agendaFork = new Agenda({ + mongo: mongoDb, + forkHelper: { + path: "./tests/helpers/fork-helper.ts", + options: { + env: { DB_CONNECTION: mongoCfg }, + execArgv: ["--require", "ts-node/register"], + }, + }, + }); + + strictEqual(agendaFork.forkHelper?.path, "./tests/helpers/fork-helper.ts"); + + const job = agendaFork.create("some job"); + job.forkMode(true); + job.schedule("now"); + await job.save(); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const jobData = await agenda.db.getJobById(job.attrs._id as any); + + if (!jobData) { + throw new Error("job not found"); + } + + strictEqual(jobData.fork, true); + + // initialize job definition (keep in a seperate file to have a easier fork mode implementation) + someJobDefinition(agendaFork); + + await agendaFork.start(); + + do { + // console.log('.'); + await delay(50); + } while (await job.isRunning()); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const jobDataFinished = await agenda.db.getJobById(job.attrs._id as any); + notStrictEqual(jobDataFinished?.lastFinishedAt, undefined); + strictEqual(jobDataFinished?.failReason, null); + strictEqual(jobDataFinished?.failCount, null); + }); + + it("runs a job in fork mode, but let it fail", async () => { + const agendaFork = new Agenda({ + mongo: mongoDb, + forkHelper: { + path: "./tests/helpers/fork-helper.ts", + options: { + env: { DB_CONNECTION: mongoCfg }, + execArgv: ["--require", "ts-node/register"], + }, + }, + }); + + strictEqual(agendaFork.forkHelper?.path, "./tests/helpers/fork-helper.ts"); + + const job = agendaFork.create("some job", { failIt: "error" }); + job.forkMode(true); + job.schedule("now"); + await job.save(); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const jobData = await agenda.db.getJobById(job.attrs._id as any); + + if (!jobData) { + throw new Error("job not found"); + } + + strictEqual(jobData.fork, true); + + // initialize job definition (keep in a seperate file to have a easier fork mode implementation) + someJobDefinition(agendaFork); + + await agendaFork.start(); + + do { + await delay(50); + } while (await job.isRunning()); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const jobDataFinished = await agenda.db.getJobById(job.attrs._id as any); + notStrictEqual(jobDataFinished?.lastFinishedAt, undefined); + notStrictEqual(jobDataFinished?.failReason, null); + strictEqual(jobDataFinished?.failCount, 1); + }); + + it("runs a job in fork mode, but let it die", async () => { + const agendaFork = new Agenda({ + mongo: mongoDb, + forkHelper: { + path: "./tests/helpers/fork-helper.ts", + options: { + env: { DB_CONNECTION: mongoCfg }, + execArgv: ["--require", "ts-node/register"], + }, + }, + }); + + strictEqual(agendaFork.forkHelper?.path, "./tests/helpers/fork-helper.ts"); + + const job = agendaFork.create("some job", { failIt: "die" }); + job.forkMode(true); + job.schedule("now"); + await job.save(); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const jobData = await agenda.db.getJobById(job.attrs._id as any); + + if (!jobData) { + throw new Error("job not found"); + } + + strictEqual(jobData.fork, true); + + // initialize job definition (keep in a seperate file to have a easier fork mode implementation) + someJobDefinition(agendaFork); + + await agendaFork.start(); + + do { + // console.log('.'); + await delay(50); + } while (await job.isRunning()); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const jobDataFinished = await agenda.db.getJobById(job.attrs._id as any); + notStrictEqual(jobDataFinished?.lastFinishedAt, undefined); + notStrictEqual(jobDataFinished?.failReason, null); + strictEqual(jobDataFinished?.failCount, 1); + }); + + it("runs a job in fork mode, but let it timeout", async () => { + const agendaFork = new Agenda({ + mongo: mongoDb, + forkHelper: { + path: "./tests/helpers/fork-helper.ts", + options: { + env: { DB_CONNECTION: mongoCfg }, + execArgv: ["--require", "ts-node/register"], + }, + }, + defaultLockLifetime: 1000, + }); + + strictEqual(agendaFork.forkHelper?.path, "./tests/helpers/fork-helper.ts"); + + const job = agendaFork.create("some job", { failIt: "timeout" }); + job.forkMode(true); + job.schedule("now"); + await job.save(); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const jobData = await agenda.db.getJobById(job.attrs._id as any); + + if (!jobData) { + throw new Error("job not found"); + } + + strictEqual(jobData.fork, true); + + // initialize job definition (keep in a seperate file to have a easier fork mode implementation) + someJobDefinition(agendaFork); + + await agendaFork.start(); + + do { + // console.log('.'); + await delay(50); + } while (await job.isRunning()); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const jobDataFinished = await agenda.db.getJobById(job.attrs._id as any); + notStrictEqual(jobDataFinished?.lastFinishedAt, undefined); + notStrictEqual(jobDataFinished?.failReason, null); + strictEqual(jobDataFinished?.failCount, 1); + }); + }); +}); diff --git a/tests/retry.spec.ts b/tests/retry.spec.ts new file mode 100644 index 0000000..ab89c5c --- /dev/null +++ b/tests/retry.spec.ts @@ -0,0 +1,82 @@ +import { Db } from "mongodb"; +import { setTimeout as delay } from "node:timers/promises"; +import { Agenda, Job } from "../src/index"; +import { mockMongo } from "./helpers/mock-mongodb"; + +// agenda instances +let agenda: Agenda; +// mongo db connection db instance +let mongoDb: Db; + +const clearJobs = async (): Promise => { + if (mongoDb) { + await mongoDb.collection("agendaJobs").deleteMany({}); + } +}; + +const jobType = "do work"; +const jobProcessor = () => {}; + +describe("Retry", () => { + beforeEach(async () => { + if (!mongoDb) { + const mockedMongo = await mockMongo(); + mongoDb = mockedMongo.mongo.db(); + } + + return new Promise((resolve) => { + agenda = new Agenda( + { + mongo: mongoDb, + }, + async () => { + await delay(50); + await clearJobs(); + agenda.define("someJob", jobProcessor); + agenda.define("send email", jobProcessor); + agenda.define("some job", jobProcessor); + agenda.define(jobType, jobProcessor); + return resolve(); + } + ); + }); + }); + + afterEach(async () => { + await delay(50); + await agenda.stop(); + await clearJobs(); + }); + + it("should retry a job", async () => { + let shouldFail = true; + + agenda.processEvery(100); // Shave 5s off test runtime :grin: + agenda.define("a job", (_job, done) => { + if (shouldFail) { + shouldFail = false; + return done(new Error("test failure")); + } + + done(); + return undefined; + }); + + agenda.on("fail:a job", (err: unknown, job: Job) => { + if (err) { + // Do nothing as this is expected to fail. + } + + job.schedule("now").save(); + }); + + const successPromise = new Promise((resolve) => { + agenda.on("success:a job", resolve); + }); + + await agenda.now("a job"); + + await agenda.start(); + await successPromise; + }).timeout(100000); +}); diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 0000000..87bf552 --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "rootDir": "src" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "**/*.spec.ts"] +} diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json deleted file mode 100644 index a5accd3..0000000 --- a/tsconfig.eslint.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "./tsconfig.json", - "include": [ - "src/**/*.js", - "src/**/*.ts", - "test/**/*.js", - "test/**/*.ts", - "*.js" - ], - "compilerOptions": { - "allowJs": true, - "checkJs": true - } -} diff --git a/tsconfig.json b/tsconfig.json index 94be094..ffb3083 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,25 +1,16 @@ { + "extends": "./node_modules/@tsconfig/node20/tsconfig.json", "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src", - "module": "nodenext", - "moduleDetection": "force", - "target": "es2022", - - // other best practice configs - "moduleResolution": "nodenext", - "strict": true, - "noImplicitAny": false, - "removeComments": false, - "emitDecoratorMetadata": true, - "composite": true, - "experimentalDecorators": true, - "strictPropertyInitialization": false, - "resolveJsonModule": true, - "sourceMap": true, - "isolatedModules": false, - "declaration": true + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + "outDir": "lib", + "rootDir": ".", + "declaration": true, + "declarationDir": "lib", + "resolveJsonModule": true }, - "exclude": ["node_modules", "**/__tests__"], - "include": ["./src"] + "include": ["src/**/*", "tests/**/*"], + "exclude": ["node_modules"], + "ts-node": { + "files": true + } }