├── locales ├── en.json ├── de.json ├── nl.json ├── hu.json ├── ko.json ├── ar.json ├── fi.json ├── he.json ├── zh-hant.json ├── cs.json ├── el.json ├── es.json ├── eu.json ├── gl.json ├── it.json ├── lt.json ├── pl.json ├── pt.json ├── ru.json ├── sk.json ├── sl.json ├── sq.json ├── sv.json ├── th.json ├── ca.json ├── dsb.json ├── fr.json ├── hsb.json ├── ia.json ├── id.json ├── krc.json ├── mk.json ├── my.json ├── nb.json ├── pms.json ├── sd.json ├── ur.json ├── diq.json ├── kaa.json ├── oc.json ├── roa-tara.json ├── sc.json ├── scn.json ├── sw.json ├── ff.json ├── pt-br.json ├── zh-hans.json ├── uk.json ├── tr.json ├── bn.json └── fa.json ├── .gitignore ├── CONTRIBUTING.md ├── templates ├── markdown_entry.ejs └── exportcolumn.html ├── .eslintrc.cjs ├── .github ├── dependabot.yml └── workflows │ ├── test-and-release.yml │ ├── npmpublish.yml │ ├── backend-tests.yml │ └── frontend-tests.yml ├── ep.json ├── express.ts ├── package.json ├── static ├── tests │ ├── frontend │ │ └── specs │ │ │ └── test.js │ └── backend │ │ └── specs │ │ └── api │ │ └── exportHTML.ts ├── js │ └── markdown.js └── css │ └── markdown.css ├── index.ts ├── README.md ├── .travis.yml ├── LICENSE ├── exportMarkdown.ts └── pnpm-lock.yaml /locales/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "ep_markdown.showMarkdown" : "Show Markdown" 3 | } 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .cache.json 2 | .ep_initialized 3 | node_modules 4 | node_modules/ 5 | .idea -------------------------------------------------------------------------------- /locales/de.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [] 4 | }, 5 | "ep_markdown.showMarkdown": "Markdown anzeigen" 6 | } 7 | -------------------------------------------------------------------------------- /locales/nl.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [] 4 | }, 5 | "ep_markdown.showMarkdown": "Toon Markdown" 6 | } 7 | -------------------------------------------------------------------------------- /locales/hu.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [] 4 | }, 5 | "ep_markdown.showMarkdown": "Markdown megjelenítése" 6 | } 7 | -------------------------------------------------------------------------------- /locales/ko.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Ykhwong" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "마크다운 표시" 8 | } 9 | -------------------------------------------------------------------------------- /locales/ar.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Meno25" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "إظهار Markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/fi.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Artnay" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Näytä Markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/he.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "YaronSh" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "הצגת Markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/zh-hant.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Kly" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "顯示 Markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/cs.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Spotter" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Zobrazit Markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/el.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Norhorn" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Εμφάνιση Markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/es.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Ovruni" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Mostrar Markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/eu.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Izendegi" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Erakutsi Markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/gl.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Ghose" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Mostrar Markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/it.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Albano" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Mostra Markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/lt.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Nokeoo" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Rodyti žymėjimą" 8 | } 9 | -------------------------------------------------------------------------------- /locales/pl.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Usagi.02808" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Pokaż Markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/pt.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Guilha" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Mostrar Markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/ru.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Megakott" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Показать Markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/sk.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Yardom78" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Zobraziť Markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/sl.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Eleassar" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Prikaži Markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/sq.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Besnik b" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Shfaq Markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/sv.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Bengtsson96" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Visa Markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/th.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Andibecker" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "แสดง Markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/ca.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Mguix" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Visualització en Markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/dsb.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Michawiki" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Markdown pokazaś" 8 | } 9 | -------------------------------------------------------------------------------- /locales/fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Verdy p" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Afficher en Markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/hsb.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Michawiki" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Markdown pokazać" 8 | } 9 | -------------------------------------------------------------------------------- /locales/ia.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "McDutchie" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Monstrar Markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/id.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Atriwidada" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Tampilkan Markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/krc.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Къарачайлы" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Белгилеуню кёргюзт" 8 | } 9 | -------------------------------------------------------------------------------- /locales/mk.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Bjankuloski06" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Прикажи Markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/my.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Andibecker" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Markdown ကိုပြပါ" 8 | } 9 | -------------------------------------------------------------------------------- /locales/nb.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Jon Harald Søby" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Vis markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/pms.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Borichèt" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Smon-e an Markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/sd.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Mehtab ahmed" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "مارڪ ڊائون ڏيکاريو" 8 | } 9 | -------------------------------------------------------------------------------- /locales/ur.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Obaid Raza" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "مارک ڈاؤن دکھائیں" 8 | } 9 | -------------------------------------------------------------------------------- /locales/diq.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "1917 Ekim Devrimi" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Acêrê bımocne" 8 | } 9 | -------------------------------------------------------------------------------- /locales/kaa.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Inabat Allanova" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Belgini kórsetiw" 8 | } 9 | -------------------------------------------------------------------------------- /locales/oc.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Quentí" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Visualizacion en Markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/roa-tara.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Joetaras" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "'Ndruche 'u markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/sc.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Adr mm" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Visualizatzione in Markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/scn.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Ajeje Brazorf" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Ammustra Markdown" 8 | } 9 | -------------------------------------------------------------------------------- /locales/sw.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Andibecker" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Onyesha alama ya alama" 8 | } 9 | -------------------------------------------------------------------------------- /locales/ff.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Ibrahima Malal Sarr" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Hollu ɗaɗi ndernderei" 8 | } 9 | -------------------------------------------------------------------------------- /locales/pt-br.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Duke of Wikipädia" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "Mostrar Markdown" 8 | } 9 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Auto publishing 2 | To publish a new version of this plugin to NPM just bump the version number in package.json and travis will auto publish for you. 3 | -------------------------------------------------------------------------------- /locales/zh-hans.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Cosing", 5 | "列维劳德" 6 | ] 7 | }, 8 | "ep_markdown.showMarkdown": "展示Markdown" 9 | } 10 | -------------------------------------------------------------------------------- /locales/uk.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "DDPAT", 5 | "Ice bulldog" 6 | ] 7 | }, 8 | "ep_markdown.showMarkdown": "Показати розмітку" 9 | } 10 | -------------------------------------------------------------------------------- /locales/tr.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Hedda", 5 | "MuratTheTurkish" 6 | ] 7 | }, 8 | "ep_markdown.showMarkdown": "İşaretlemeyi Göster" 9 | } 10 | -------------------------------------------------------------------------------- /locales/bn.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Joysriramsarkar.manathetiger56", 5 | "জয়শ্রীরাম সরকার" 6 | ] 7 | }, 8 | "ep_markdown.showMarkdown": "মার্কডাউন দেখুন" 9 | } 10 | -------------------------------------------------------------------------------- /templates/markdown_entry.ejs: -------------------------------------------------------------------------------- 1 |

2 | > 3 | 4 |

5 | -------------------------------------------------------------------------------- /locales/fa.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Darafsh" 5 | ] 6 | }, 7 | "ep_markdown.showMarkdown": "پرونده خیلی بزرگ است. با مدیر سایت تماس بگیرید تا اندازهٔ مجاز برای وارد کردن پرونده را افزایش دهد." 8 | } 9 | -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | // This is a workaround for https://github.com/eslint/eslint/issues/3458 4 | require('eslint-config-etherpad/patch/modern-module-resolution'); 5 | 6 | module.exports = { 7 | root: true, 8 | extends: 'etherpad/plugin', 9 | }; 10 | -------------------------------------------------------------------------------- /templates/exportcolumn.html: -------------------------------------------------------------------------------- 1 | 2 | Markdown 3 | 4 | 9 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "github-actions" 4 | directory: "/" 5 | schedule: 6 | interval: "daily" 7 | - package-ecosystem: "npm" 8 | directory: "/" 9 | schedule: 10 | interval: "daily" 11 | versioning-strategy: "increase" 12 | -------------------------------------------------------------------------------- /ep.json: -------------------------------------------------------------------------------- 1 | { 2 | "parts":[ 3 | { 4 | "name": "markdown", 5 | "hooks":{ 6 | "expressCreateServer": "ep_markdown/express", 7 | "eejsBlock_exportColumn": "ep_markdown/index", 8 | "eejsBlock_mySettings": "ep_markdown/index", 9 | "import": "ep_markdown/index" 10 | }, 11 | "client_hooks": { 12 | "aceEditorCSS": "ep_markdown/static/js/markdown", 13 | "postAceInit": "ep_markdown/static/js/markdown" 14 | } 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /.github/workflows/test-and-release.yml: -------------------------------------------------------------------------------- 1 | name: Node.js Package 2 | on: [push] 3 | 4 | 5 | jobs: 6 | backend: 7 | uses: ./.github/workflows/backend-tests.yml 8 | secrets: inherit 9 | frontend: 10 | uses: ./.github/workflows/frontend-tests.yml 11 | secrets: inherit 12 | release: 13 | if: ${{ github.ref == 'refs/heads/master' || github.ref == 'refs/heads/main' }} 14 | needs: 15 | - backend 16 | - frontend 17 | uses: ./.github/workflows/npmpublish.yml 18 | secrets: inherit 19 | -------------------------------------------------------------------------------- /express.ts: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const exportMarkdown = require('./exportMarkdown'); 4 | 5 | exports.expressCreateServer = (hookName, {app}) => { 6 | app.get('/p/:padId/:revNum?/export/markdown', (req, res, next) => { 7 | (async () => { 8 | const {padId, revNum} = req.params; 9 | res.attachment(`${padId}.md`); 10 | res.contentType('plain/text'); 11 | res.send(await exportMarkdown.getPadMarkdownDocument(padId, revNum)); 12 | })().catch((err) => next(err || new Error(err))); 13 | }); 14 | }; 15 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ep_markdown", 3 | "description": "Edit and Export as Markdown in Etherpad", 4 | "version": "1.0.1", 5 | "author": { 6 | "name": "John McLear", 7 | "email": "john@mclear.co.uk", 8 | "url": "http://mclear.co.uk" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "https://github.com/ether/ep_markdown.git" 13 | }, 14 | "dependencies": { 15 | "showdown": "*" 16 | }, 17 | "contributors": [], 18 | "license": "Apache-2.0", 19 | "funding": { 20 | "type": "individual", 21 | "url": "https://etherpad.org/" 22 | }, 23 | "devDependencies": { 24 | "eslint": "^8.57.0", 25 | "eslint-config-etherpad": "^4.0.4", 26 | "typescript": "^5.4.2", 27 | "@types/mocha": "^10.0.6", 28 | "@types/node": "^20.12.4" 29 | }, 30 | "scripts": { 31 | "lint": "eslint .", 32 | "lint:fix": "eslint --fix ." 33 | }, 34 | "engines": { 35 | "node": ">=18.0.0" 36 | }, 37 | "peerDependenciesMeta": { 38 | "ep_headings2": { 39 | "optional": true 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /static/tests/frontend/specs/test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Set formatting attributes and ensure ep_markdown displays properly', function () { 4 | // create a new pad before each test run 5 | beforeEach(async function () { 6 | this.timeout(60000); 7 | await helper.aNewPad(); 8 | }); 9 | 10 | it('Bold section is shown as **foo** when clicking Show Markdown', async function () { 11 | this.timeout(60000); 12 | const chrome$ = helper.padChrome$; 13 | const inner$ = helper.padInner$; 14 | 15 | const $editorContents = inner$('div'); 16 | 17 | // clear pad 18 | $editorContents.sendkeys('{selectall}'); 19 | inner$('div').first().sendkeys('bold'); 20 | inner$('div').first().sendkeys('{selectall}'); 21 | chrome$('.buttonicon-bold').click(); 22 | chrome$('#options-markdown').click(); 23 | 24 | await helper.waitForPromise(() => (inner$('div').first()[0].textContent === 'bold')); 25 | 26 | const hasMarkdown = inner$('body').hasClass('markdown'); 27 | // TODO: Use a psuedo selector to ensure the value displayed to user is **bold** 28 | expect(hasMarkdown).to.be(true); 29 | }); 30 | }); 31 | -------------------------------------------------------------------------------- /index.ts: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const eejs = require('ep_etherpad-lite/node/eejs'); 4 | const settings = require('ep_etherpad-lite/node/utils/Settings'); 5 | import {promises} from 'fs'; 6 | const fsp = promises 7 | 8 | exports.eejsBlock_exportColumn = (hookName, context) => { 9 | context.content += eejs.require('./templates/exportcolumn.html', {}, module); 10 | }; 11 | 12 | exports.eejsBlock_styles = (hookName, context) => { 13 | context.content += eejs.require('./templates/styles.html', {}, module); 14 | }; 15 | 16 | exports.eejsBlock_mySettings = (hookName, context) => { 17 | let checkedState = 'unchecked'; 18 | if (!settings.ep_markdown_default) { 19 | checkedState = 'unchecked'; 20 | } else if (settings.ep_markdown_default === true) { 21 | checkedState = 'checked'; 22 | } 23 | context.content += 24 | eejs.require('./templates/markdown_entry.ejs', {checked: checkedState}, module); 25 | }; 26 | 27 | exports.import = async (hookName, {destFile, fileEnding, srcFile}) => { 28 | if (fileEnding !== '.md') return; 29 | 30 | const markdown = await fsp.readFile(srcFile, 'utf8'); 31 | const showdown = require('showdown'); 32 | const converter = new showdown.Converter({completeHTMLDocument: true}); 33 | 34 | const html = converter.makeHtml(markdown); 35 | 36 | await fsp.writeFile(destFile, html, 'utf8'); 37 | return destFile; 38 | }; 39 | -------------------------------------------------------------------------------- /static/js/markdown.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | exports.postAceInit = (hookName, context) => { 4 | const padRootPath = new RegExp(/.*\/p\/[^/]+/) 5 | .exec(document.location.pathname) || clientVars.padId; 6 | $('#exportmarkdowna').attr('href', `${padRootPath}/export/markdown`); 7 | 8 | const enable = () => { 9 | // add css class markdown 10 | $('iframe[name="ace_outer"]').contents().find('iframe') 11 | .contents().find('#innerdocbody').addClass('markdown'); 12 | $('#underline').hide(); // no markdown support for these 13 | $('#strikethrough').hide(); 14 | }; 15 | const disable = () => { 16 | // add css class markdown 17 | $('iframe[name="ace_outer"]').contents().find('iframe') 18 | .contents().find('#innerdocbody').removeClass('markdown'); 19 | $('#underline').removeAttr('style'); // no markdown support for these 20 | $('#strikethrough').removeAttr('style'); 21 | }; 22 | 23 | /* init */ 24 | if ($('#options-markdown').is(':checked')) { 25 | enable(); 26 | } else { 27 | disable(); 28 | } 29 | /* on click */ 30 | $('#options-markdown').on('click', () => { 31 | if ($('#options-markdown').is(':checked')) { 32 | enable(); 33 | } else { 34 | disable(); 35 | } 36 | }); 37 | }; 38 | 39 | // inner pad CSS 40 | exports.aceEditorCSS = (hookName, context) => ['/ep_markdown/static/css/markdown.css']; 41 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Publish Status](https://github.com/ether/ep_markdown/workflows/Node.js%20Package/badge.svg) ![Backend Tests Status](https://github.com/ether/ep_markdown/workflows/Backend%20tests/badge.svg) 2 | 3 | Markdown editing in Etherpad 4 | ============================ 5 | 6 | ![Alt Text](http://i.imgur.com/bGZHFqH.gif "ep_markdown in action") 7 | 8 | Features 9 | ======== 10 | 11 | * Use the normal editbar buttons to add markdown. 12 | * Import as Markdown (automatically applies styling / text attributes). 13 | * Export as Markdown. 14 | * Localizations. 15 | 16 | Usage 17 | ===== 18 | 19 | To enable Markdown view click Settings -> Markdown 20 | 21 | Limitations 22 | =========== 23 | This plugin is not designed for you to write Markdown and it format that markdown with styling. So you can't expect to type \*\*blah\*\* and expect to see blah in bold. You can however type blah, set it as bold and then click "Show as Markdown" and it will show \*\*bold\*\*. I will not be adding support for supporting typing in markdown which will render to a style because it will be impossible to handle character control. 24 | 25 | Setting as default 26 | ================== 27 | 28 | Paste the below into your settings. 29 | 30 | "ep_markdown_default": true, 31 | 32 | Todo 33 | ==== 34 | * Support ALL styles fully (please let me know what does / doesn't work) 35 | * Create markdown icon for export menu 36 | * Better code block support (currently it's line by line) 37 | * Import Markdown (and it applies formatting automatically) 38 | 39 | Requirements 40 | ============ 41 | 42 | Etherpad 1.8.1 43 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | 3 | node_js: 4 | - "lts/*" 5 | 6 | cache: false 7 | 8 | services: 9 | - docker 10 | 11 | install: 12 | - "export GIT_HASH=$(git rev-parse --verify --short HEAD)" 13 | 14 | #script: 15 | # - "tests/frontend/travis/runner.sh" 16 | 17 | env: 18 | global: 19 | - secure: "WMGxFkOeTTlhWB+ChMucRtIqVmMbwzYdNHuHQjKCcj8HBEPdZLfCuK/kf4rG\nVLcLQiIsyllqzNhBGVHG1nyqWr0/LTm8JRqSCDDVIhpyzp9KpCJQQJG2Uwjk\n6/HIJJh/wbxsEdLNV2crYU/EiVO3A4Bq0YTHUlbhUqG3mSCr5Ec=" 20 | - secure: "gejXUAHYscbR6Bodw35XexpToqWkv2ifeECsbeEmjaLkYzXmUUNWJGknKSu7\nEUsSfQV8w+hxApr1Z+jNqk9aX3K1I4btL3cwk2trnNI8XRAvu1c1Iv60eerI\nkE82Rsd5lwUaMEh+/HoL8ztFCZamVndoNgX7HWp5J/NRZZMmh4g=" 21 | 22 | jobs: 23 | include: 24 | - name: "Lint test package-lock" 25 | install: 26 | - "npm install lockfile-lint" 27 | script: 28 | - npx lockfile-lint --path package-lock.json --validate-https --allowed-hosts npm 29 | - name: "Run the Backend tests" 30 | before_install: 31 | - sudo add-apt-repository -y ppa:libreoffice/ppa 32 | - sudo apt-get update 33 | - sudo apt-get -y install libreoffice 34 | - sudo apt-get -y install libreoffice-pdfimport 35 | install: 36 | - "npm install" 37 | - "mkdir ep_markdown" 38 | - "mv !(ep_markdown) ep_markdown" 39 | - "git clone https://github.com/ether/etherpad-lite.git etherpad" 40 | - "cd etherpad" 41 | - "mkdir -p node_modules" 42 | - "mv ../ep_markdown node_modules" 43 | - "bin/installDeps.sh" 44 | - "export GIT_HASH=$(git rev-parse --verify --short HEAD)" 45 | - "cd src && npm install && cd -" 46 | script: 47 | - "tests/frontend/travis/runnerBackend.sh" 48 | - name: "Test the Frontend" 49 | before_script: 50 | - "tests/frontend/travis/sauce_tunnel.sh" 51 | install: 52 | - "npm install" 53 | - "mkdir ep_markdown" 54 | - "mv !(ep_markdown) ep_markdown" 55 | - "git clone https://github.com/ether/etherpad-lite.git etherpad" 56 | - "cd etherpad" 57 | - "mkdir -p node_modules" 58 | - "mv ../ep_markdown node_modules" 59 | - "bin/installDeps.sh" 60 | - "export GIT_HASH=$(git rev-parse --verify --short HEAD)" 61 | script: 62 | - "tests/frontend/travis/runner.sh" 63 | 64 | notifications: 65 | irc: 66 | channels: 67 | - "irc.freenode.org#etherpad-lite-dev" 68 | 69 | ##ETHERPAD_TRAVIS_V=9 70 | ## Travis configuration automatically created using bin/plugins/updateAllPluginsScript.sh 71 | -------------------------------------------------------------------------------- /static/tests/backend/specs/api/exportHTML.ts: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const common = require('ep_etherpad-lite/tests/backend/common'); 4 | const randomString = require('ep_etherpad-lite/static/js/pad_utils').randomString; 5 | import {generateJWTToken} from "ep_etherpad-lite/tests/backend/common"; 6 | 7 | let agent; 8 | const apiVersion = 1; 9 | 10 | const getMarkdownEndPointFor = (padID: string) => `/p/${padID}/export/markdown`; 11 | 12 | const buildHTML = (body: string) => `${body}`; 13 | 14 | // Creates a pad and returns the pad id. Calls the callback when finished. 15 | const createPad = async (padID: string) => { 16 | const res = await agent.get(`/api/${apiVersion}/createPad?padID=${padID}`) 17 | .set("Authorization", await generateJWTToken()) 18 | return new Promise((resolve, reject) => { 19 | if (res.body.code !== 0) { 20 | reject(new Error('Unable to create new Pad')); 21 | } else { 22 | resolve(padID); 23 | } 24 | }) 25 | }; 26 | 27 | const setHTML = async (padID: string, html: string) => { 28 | const newHtml = `/api/${apiVersion}/setHTML?padID=${padID}&html=${html}` 29 | console.log("New HTML is",newHtml) 30 | const res = await agent.get(newHtml) 31 | .set("Authorization", await generateJWTToken()) 32 | console.log("Res is",res.body) 33 | return new Promise((resolve, reject) => { 34 | if (res.body.code !== 0) { 35 | reject(new Error('Unable to set pad HTML')); 36 | } else { 37 | resolve(padID); 38 | } 39 | }) 40 | }; 41 | 42 | describe('Import and Export markdown', function () { 43 | let padID: string; 44 | let html: Function; 45 | 46 | before(async function () { agent = await common.init(); }); 47 | 48 | // create a new pad before each test run 49 | beforeEach(async function () { 50 | padID = randomString(5); 51 | await createPad(padID); 52 | await setHTML(padID, html()); 53 | }); 54 | 55 | describe('when text has formatting', function () { 56 | before(async function () { 57 | html = () => buildHTML( 58 | 'italicbold
  1. derp2
underline'); 59 | }); 60 | 61 | it('returns ok', async function () { 62 | await agent 63 | .get(getMarkdownEndPointFor(padID)) 64 | .set("Authorization", await generateJWTToken()) 65 | .expect(200); 66 | }); 67 | 68 | it('returns Markdown correctly', async function () { 69 | const res = await agent 70 | .get(getMarkdownEndPointFor(padID)) 71 | .set("Authorization", await generateJWTToken()) 72 | const markdown = res.text; 73 | if (markdown.indexOf('*italic*') === -1) throw new Error('Unable to export italic'); 74 | if (markdown.indexOf('**bold**') === -1) throw new Error('Unable to export bold'); 75 | if (markdown.indexOf('* derp') === -1) throw new Error('Unable to export UL'); 76 | if (markdown.indexOf('[]underline[]') === -1) { 77 | throw new Error('Unable to export underline'); 78 | } 79 | }); 80 | }); 81 | }); 82 | -------------------------------------------------------------------------------- /.github/workflows/npmpublish.yml: -------------------------------------------------------------------------------- 1 | # This workflow will run tests using node and then publish a package to the npm registry when a release is created 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages 3 | 4 | name: Node.js Package 5 | 6 | on: 7 | workflow_call: 8 | 9 | jobs: 10 | publish-npm: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/setup-node@v4 14 | with: 15 | node-version: 20 16 | registry-url: https://registry.npmjs.org/ 17 | - name: Check out Etherpad core 18 | uses: actions/checkout@v3 19 | with: 20 | repository: ether/etherpad-lite 21 | - uses: pnpm/action-setup@v3 22 | name: Install pnpm 23 | with: 24 | version: 8 25 | run_install: false 26 | - name: Get pnpm store directory 27 | shell: bash 28 | run: | 29 | echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV 30 | - uses: actions/cache@v4 31 | name: Setup pnpm cache 32 | with: 33 | path: ${{ env.STORE_PATH }} 34 | key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} 35 | restore-keys: | 36 | ${{ runner.os }}-pnpm-store- 37 | - 38 | uses: actions/checkout@v3 39 | with: 40 | fetch-depth: 0 41 | - 42 | name: Bump version (patch) 43 | run: | 44 | LATEST_TAG=$(git describe --tags --abbrev=0) || exit 1 45 | NEW_COMMITS=$(git rev-list --count "${LATEST_TAG}"..) || exit 1 46 | [ "${NEW_COMMITS}" -gt 0 ] || exit 0 47 | git config user.name 'github-actions[bot]' 48 | git config user.email '41898282+github-actions[bot]@users.noreply.github.com' 49 | pnpm i 50 | pnpm version patch 51 | git push --follow-tags 52 | # This is required if the package has a prepare script that uses something 53 | # in dependencies or devDependencies. 54 | - 55 | run: pnpm i 56 | # `npm publish` must come after `git push` otherwise there is a race 57 | # condition: If two PRs are merged back-to-back then master/main will be 58 | # updated with the commits from the second PR before the first PR's 59 | # workflow has a chance to push the commit generated by `npm version 60 | # patch`. This causes the first PR's `git push` step to fail after the 61 | # package has already been published, which in turn will cause all future 62 | # workflow runs to fail because they will all attempt to use the same 63 | # already-used version number. By running `npm publish` after `git push`, 64 | # back-to-back merges will cause the first merge's workflow to fail but 65 | # the second's will succeed. 66 | - 67 | run: pnpm publish 68 | env: 69 | NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} 70 | #- 71 | # name: Add package to etherpad organization 72 | # run: pnpm access grant read-write etherpad:developers 73 | # env: 74 | # NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} 75 | -------------------------------------------------------------------------------- /.github/workflows/backend-tests.yml: -------------------------------------------------------------------------------- 1 | name: Backend Tests 2 | 3 | # any branch is useful for testing before a PR is submitted 4 | on: 5 | workflow_call: 6 | 7 | jobs: 8 | withplugins: 9 | # run on pushes to any branch 10 | # run on PRs from external forks 11 | if: | 12 | (github.event_name != 'pull_request') 13 | || (github.event.pull_request.head.repo.id != github.event.pull_request.base.repo.id) 14 | name: with Plugins 15 | runs-on: ubuntu-latest 16 | steps: 17 | - 18 | name: Install libreoffice 19 | uses: awalsh128/cache-apt-pkgs-action@v1.4.2 20 | with: 21 | packages: libreoffice libreoffice-pdfimport 22 | version: 1.0 23 | - 24 | name: Install etherpad core 25 | uses: actions/checkout@v3 26 | with: 27 | repository: ether/etherpad-lite 28 | path: etherpad-lite 29 | - uses: pnpm/action-setup@v3 30 | name: Install pnpm 31 | with: 32 | version: 8 33 | run_install: false 34 | - name: Get pnpm store directory 35 | shell: bash 36 | run: | 37 | echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV 38 | - uses: actions/cache@v4 39 | name: Setup pnpm cache 40 | with: 41 | path: ${{ env.STORE_PATH }} 42 | key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} 43 | restore-keys: | 44 | ${{ runner.os }}-pnpm-store- 45 | - 46 | name: Checkout plugin repository 47 | uses: actions/checkout@v3 48 | with: 49 | path: plugin 50 | - 51 | name: Determine plugin name 52 | id: plugin_name 53 | working-directory: ./plugin 54 | run: | 55 | npx -c 'printf %s\\n "::set-output name=plugin_name::${npm_package_name}"' 56 | - 57 | name: Link plugin directory 58 | working-directory: ./plugin 59 | run: | 60 | pnpm link --global 61 | - name: Remove tests 62 | working-directory: ./etherpad-lite 63 | run: rm -rf ./src/tests/backend/specs 64 | - 65 | name: Install Etherpad core dependencies 66 | working-directory: ./etherpad-lite 67 | run: bin/installDeps.sh 68 | - name: Link plugin to etherpad-lite 69 | working-directory: ./etherpad-lite 70 | run: | 71 | pnpm link --global $PLUGIN_NAME 72 | pnpm run install-plugins --path ../../plugin 73 | env: 74 | PLUGIN_NAME: ${{ steps.plugin_name.outputs.plugin_name }} 75 | - name: Link ep_etherpad-lite 76 | working-directory: ./etherpad-lite/src 77 | run: | 78 | pnpm link --global 79 | - name: Link etherpad to plugin 80 | working-directory: ./plugin 81 | run: | 82 | pnpm link --global ep_etherpad-lite 83 | - 84 | name: Run the backend tests 85 | working-directory: ./etherpad-lite 86 | run: | 87 | res=$(find .. -path "./node_modules/ep_*/static/tests/backend/specs/**" | wc -l) 88 | if [ $res -eq 0 ]; then 89 | echo "No backend tests found" 90 | else 91 | pnpm run test 92 | fi 93 | -------------------------------------------------------------------------------- /.github/workflows/frontend-tests.yml: -------------------------------------------------------------------------------- 1 | # Publicly credit Sauce Labs because they generously support open source 2 | # projects. 3 | name: Frontend Tests 4 | 5 | on: 6 | workflow_call: 7 | 8 | jobs: 9 | test-frontend: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - 14 | name: Check out Etherpad core 15 | uses: actions/checkout@v3 16 | with: 17 | repository: ether/etherpad-lite 18 | - uses: pnpm/action-setup@v3 19 | name: Install pnpm 20 | with: 21 | version: 8 22 | run_install: false 23 | - name: Get pnpm store directory 24 | shell: bash 25 | run: | 26 | echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV 27 | - uses: actions/cache@v4 28 | name: Setup pnpm cache 29 | with: 30 | path: ${{ env.STORE_PATH }} 31 | key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} 32 | restore-keys: | 33 | ${{ runner.os }}-pnpm-store- 34 | - 35 | name: Check out the plugin 36 | uses: actions/checkout@v3 37 | with: 38 | path: ./node_modules/__tmp 39 | - 40 | name: export GIT_HASH to env 41 | id: environment 42 | run: | 43 | cd ./node_modules/__tmp 44 | echo "::set-output name=sha_short::$(git rev-parse --short ${{ github.sha }})" 45 | - 46 | name: Determine plugin name 47 | id: plugin_name 48 | run: | 49 | cd ./node_modules/__tmp 50 | npx -c 'printf %s\\n "::set-output name=plugin_name::${npm_package_name}"' 51 | - 52 | name: Rename plugin directory 53 | env: 54 | PLUGIN_NAME: ${{ steps.plugin_name.outputs.plugin_name }} 55 | run: | 56 | mv ./node_modules/__tmp ./node_modules/"${PLUGIN_NAME}" 57 | - 58 | name: Install plugin dependencies 59 | env: 60 | PLUGIN_NAME: ${{ steps.plugin_name.outputs.plugin_name }} 61 | run: | 62 | cd ./node_modules/"${PLUGIN_NAME}" 63 | pnpm i 64 | # Etherpad core dependencies must be installed after installing the 65 | # plugin's dependencies, otherwise npm will try to hoist common 66 | # dependencies by removing them from src/node_modules and installing them 67 | # in the top-level node_modules. As of v6.14.10, npm's hoist logic appears 68 | # to be buggy, because it sometimes removes dependencies from 69 | # src/node_modules but fails to add them to the top-level node_modules. 70 | # Even if npm correctly hoists the dependencies, the hoisting seems to 71 | # confuse tools such as `npm outdated`, `npm update`, and some ESLint 72 | # rules. 73 | - 74 | name: Install Etherpad core dependencies 75 | run: bin/installDeps.sh 76 | - name: Create settings.json 77 | run: cp ./src/tests/settings.json settings.json 78 | - name: Run the frontend tests 79 | shell: bash 80 | run: | 81 | pnpm run dev & 82 | connected=false 83 | can_connect() { 84 | curl -sSfo /dev/null http://localhost:9001/ || return 1 85 | connected=true 86 | } 87 | now() { date +%s; } 88 | start=$(now) 89 | while [ $(($(now) - $start)) -le 15 ] && ! can_connect; do 90 | sleep 1 91 | done 92 | cd src 93 | pnpm exec playwright install chromium --with-deps 94 | pnpm run test-ui --project=chromium 95 | -------------------------------------------------------------------------------- /static/css/markdown.css: -------------------------------------------------------------------------------- 1 | /* from https://raw.github.com/mrcoles/markdown-css/master/markdown.css */ 2 | 3 | .markdown { 4 | word-wrap: break-word; 5 | } 6 | .markdown, 7 | .markdown h1, 8 | .markdown h2, 9 | .markdown h3, 10 | .markdown h4, 11 | .markdown h5, 12 | .markdown h6, 13 | .markdown pre, 14 | .markdown code, 15 | .markdown blockquote, 16 | .markdown em, 17 | .markdown strong, 18 | .markdown code { 19 | font-size: 14px; 20 | line-height: 20px; 21 | font-weight: normal; 22 | font-style: normal; 23 | font-family: consolas, monaco, courier, "courier new", fixed-width; 24 | color: #333333; 25 | } 26 | .markdown h1, 27 | .markdown h2, 28 | .markdown h3, 29 | .markdown h4, 30 | .markdown h5, 31 | .markdown h6, 32 | .markdown pre, 33 | .markdown code, 34 | .markdown blockquote, 35 | .markdown ol, 36 | .markdown ul, 37 | .markdown li, 38 | .markdown p, 39 | .markdown section, 40 | .markdown header, 41 | .markdown footer { 42 | float: none; 43 | margin: 0; 44 | padding: 0; 45 | } 46 | .markdown h1, 47 | .markdown p, 48 | .markdown ul, 49 | .markdown ol, 50 | .markdown pre, 51 | .markdown blockquote { 52 | margin-top: 20px; 53 | margin-bottom: 20px; 54 | } 55 | .markdown h1 { 56 | position: relative; 57 | display: inline-block; 58 | display: table-cell; 59 | padding: 20px 0 40px; 60 | margin: 0; 61 | overflow: hidden; 62 | } 63 | /* 64 | .markdown h1:after { 65 | content: "===================================================================================================="; 66 | position: absolute; 67 | bottom: 20px; 68 | left: 0; 69 | } 70 | */ 71 | .markdown h1 + * { 72 | margin-top: 0; 73 | } 74 | .markdown h2, 75 | .markdown h3, 76 | .markdown h4, 77 | .markdown h5, 78 | .markdown h6 { 79 | position: relative; 80 | margin-bottom: 20px; 81 | } 82 | .markdown h1:before{ 83 | content: "# "; 84 | display: inline; 85 | } 86 | .markdown h2:before, 87 | .markdown h3:before, 88 | .markdown h4:before, 89 | .markdown h5:before, 90 | .markdown h6:before { 91 | content: "## "; 92 | display: inline; 93 | } 94 | .markdown h3:before { 95 | content: "### "; 96 | } 97 | .markdown h4:before { 98 | content: "#### "; 99 | } 100 | .markdown h5:before { 101 | content: "##### "; 102 | } 103 | .markdown h6:before { 104 | content: "###### "; 105 | } 106 | .markdown li { 107 | position: relative; 108 | display: block; 109 | padding-left: 34px; 110 | padding-left: 4ch; 111 | } 112 | .markdown li:after { 113 | position: absolute; 114 | top: 0; 115 | left: 0; 116 | } 117 | .markdown ul > li:after { 118 | content: "*"; 119 | } 120 | .markdown ol { 121 | counter-reset: ol; 122 | } 123 | .markdown ol > li:after { 124 | content: counter(ol) "."; 125 | counter-increment: ol; 126 | } 127 | .markdown pre { 128 | margin-left: 34px; 129 | padding-left: 4ch; 130 | } 131 | .markdown blockquote { 132 | position: relative; 133 | padding-left: 17px; 134 | padding-left: 2ch; 135 | overflow: hidden; 136 | } 137 | .markdown blockquote:after { 138 | content: ">\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>"; 139 | white-space: pre; 140 | position: absolute; 141 | top: 0; 142 | left: 0; 143 | font-size: 14px; 144 | line-height: 20px; 145 | } 146 | .markdown strong:before, 147 | .markdown strong:after { 148 | content: "__"; 149 | display: inline; 150 | } 151 | .markdown em:before, 152 | .markdown em:after { 153 | content: "*"; 154 | display: inline; 155 | } 156 | .markdown a { 157 | text-decoration: none; 158 | } 159 | .markdown a:before { 160 | content: "["; 161 | display: inline; 162 | color: #333333; 163 | } 164 | .markdown a:after { 165 | content: "](" attr(href) ")"; 166 | display: inline; 167 | color: #333333; 168 | } 169 | .markdown code { 170 | font-weight: 100; 171 | } 172 | .markdown code:before{ 173 | content: "\00a0\00a0\00a0\00a0"; 174 | display: inline; 175 | } 176 | .markdown pre code:before, 177 | .markdown pre code:after { 178 | content: none; 179 | } 180 | .markdown hr { 181 | position: relative; 182 | height: 20px; 183 | font-size: 0; 184 | line-height: 0; 185 | overflow: hidden; 186 | border: 0; 187 | margin-bottom: 20px; 188 | } 189 | .markdown hr:after { 190 | content: "----------------------------------------------------------------------------------------------------"; 191 | position: absolute; 192 | top: 0; 193 | left: 0; 194 | font-size: 14px; 195 | line-height: 20px; 196 | width: 100%; 197 | word-wrap: break-word; 198 | } 199 | @-moz-document url-prefix() { 200 | .markdown h1 { 201 | display: block; 202 | } 203 | } 204 | .markdown-ones ol > li:after { 205 | content: "1."; 206 | } 207 | 208 | /* Additional styles added by John McLear for Etherpad */ 209 | 210 | .markdown b:before{ 211 | content: "**" 212 | } 213 | .markdown b:after{ 214 | content: "**" 215 | } 216 | 217 | .markdown i:before{ 218 | content: "*" 219 | } 220 | .markdown i:after{ 221 | content: "*" 222 | } 223 | 224 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Apache License, Version 2.0 3 | 4 | Apache License 5 | Version 2.0, January 2004 6 | http://www.apache.org/licenses/ 7 | 8 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 9 | 10 | 1. Definitions. 11 | 12 | "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. 13 | 14 | "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. 17 | 18 | "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. 19 | 20 | "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. 21 | 22 | "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. 23 | 24 | "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). 25 | 26 | "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. 27 | 28 | "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." 29 | 30 | "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 31 | 32 | 2. Grant of Copyright License. 33 | 34 | Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 35 | 36 | 3. Grant of Patent License. 37 | 38 | Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 39 | 40 | 4. Redistribution. 41 | 42 | You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: 43 | 44 | You must give any other recipients of the Work or Derivative Works a copy of this License; and 45 | You must cause any modified files to carry prominent notices stating that You changed the files; and 46 | You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and 47 | If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. 48 | 49 | You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 50 | 51 | 5. Submission of Contributions. 52 | 53 | Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 54 | 55 | 6. Trademarks. 56 | 57 | This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 58 | 59 | 7. Disclaimer of Warranty. 60 | 61 | Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 62 | 63 | 8. Limitation of Liability. 64 | 65 | In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 66 | 67 | 9. Accepting Warranty or Additional Liability. 68 | 69 | While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. 70 | 71 | END OF TERMS AND CONDITIONS 72 | 73 | APPENDIX: How to apply the Apache License to your work 74 | 75 | To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. 76 | 77 | Copyright [yyyy] [name of copyright owner] 78 | 79 | Licensed under the Apache License, Version 2.0 (the "License"); 80 | you may not use this file except in compliance with the License. 81 | You may obtain a copy of the License at 82 | 83 | http://www.apache.org/licenses/LICENSE-2.0 84 | 85 | Unless required by applicable law or agreed to in writing, software 86 | distributed under the License is distributed on an "AS IS" BASIS, 87 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 88 | See the License for the specific language governing permissions and 89 | limitations under the License. 90 | -------------------------------------------------------------------------------- /exportMarkdown.ts: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | 4 | import {splitAttributionLines, opIterator,subattribution,eachAttribNumber, opAttributeValue} from 'ep_etherpad-lite/static/js/Changeset' 5 | import {StringIterator} from 'ep_etherpad-lite/static/js/StringIterator' 6 | import {StringAssembler} from 'ep_etherpad-lite/static/js/StringAssembler' 7 | 8 | const padManager = require('ep_etherpad-lite/node/db/PadManager'); 9 | 10 | const getMarkdownFromAtext = (pad, atext) => { 11 | const apool = pad.apool(); 12 | const textLines = atext.text.slice(0, -1).split('\n'); 13 | const attribLines = splitAttributionLines(atext.attribs, atext.text); 14 | const tags = ['**', '*', '[]', '~~']; 15 | const props = ['bold', 'italic', 'underline', 'strikethrough']; 16 | const anumMap = {}; 17 | 18 | props.forEach((propName, i) => { 19 | const propTrueNum = apool.putAttrib([propName, true], true); 20 | if (propTrueNum >= 0) { 21 | anumMap[propTrueNum] = i; 22 | } 23 | }); 24 | 25 | const headingtags = ['# ', '## ', '### ', '#### ', '##### ', '###### ', ' ']; 26 | const headingprops = [ 27 | ['heading', 'h1'], 28 | ['heading', 'h2'], 29 | ['heading', 'h3'], 30 | ['heading', 'h4'], 31 | ['heading', 'h5'], 32 | ['heading', 'h6'], 33 | ['heading', 'code'], 34 | ]; 35 | const headinganumMap = {}; 36 | 37 | headingprops.forEach((prop, i) => { 38 | let name; 39 | let value; 40 | if (typeof prop === 'object') { 41 | name = prop[0]; 42 | value = prop[1]; 43 | } else { 44 | name = prop; 45 | value = true; 46 | } 47 | const propTrueNum = apool.putAttrib([name, value], true); 48 | if (propTrueNum >= 0) { 49 | headinganumMap[propTrueNum] = i; 50 | } 51 | }); 52 | 53 | const getLineMarkdown = (text, attribs) => { 54 | const propVals = [false, false, false]; 55 | const ENTER = 1; 56 | const STAY = 2; 57 | const LEAVE = 0; 58 | 59 | // Use order of tags (b/i/u) as order of nesting, for simplicity 60 | // and decent nesting. For example, 61 | // Just bold Bold and italics Just italics 62 | // becomes 63 | // Just bold Bold and italics Just italics 64 | const taker = new StringIterator(text); 65 | let assem = new StringAssembler(); 66 | 67 | const openTags = []; 68 | const emitOpenTag = (i) => { 69 | openTags.unshift(i); 70 | assem.append(tags[i]); 71 | }; 72 | 73 | const emitCloseTag = (i) => { 74 | openTags.shift(); 75 | assem.append(tags[i]); 76 | }; 77 | 78 | const orderdCloseTags = (tags2close) => { 79 | for (let i = 0; i < openTags.length; i++) { 80 | for (let j = 0; j < tags2close.length; j++) { 81 | if (tags2close[j] === openTags[i]) { 82 | emitCloseTag(tags2close[j]); 83 | i--; 84 | break; 85 | } 86 | } 87 | } 88 | }; 89 | 90 | // start heading check 91 | let heading = false; 92 | let deletedAsterisk = false; // we need to delete * from the beginning of the heading line 93 | const iter2 = opIterator(subattribution(attribs, 0, 1)); 94 | if (iter2.hasNext()) { 95 | const o2 = iter2.next(); 96 | 97 | // iterate through attributes 98 | eachAttribNumber(o2.attribs, (a) => { 99 | if (a in headinganumMap) { 100 | const i = headinganumMap[a]; // i = 0 => bold, etc. 101 | heading = headingtags[i]; 102 | } 103 | }); 104 | } 105 | 106 | if (heading) { 107 | assem.append(heading); 108 | } 109 | 110 | const urls = _findURLs(text); 111 | 112 | let idx = 0; 113 | 114 | const processNextChars = (numChars) => { 115 | if (numChars <= 0) { 116 | return; 117 | } 118 | 119 | const iter = opIterator(subattribution(attribs, idx, idx + numChars)); 120 | idx += numChars; 121 | 122 | while (iter.hasNext()) { 123 | const o = iter.next(); 124 | let propChanged = false; 125 | eachAttribNumber(o.attribs, (a) => { 126 | if (a in anumMap) { 127 | const i = anumMap[a]; // i = 0 => bold, etc. 128 | if (!propVals[i]) { 129 | propVals[i] = ENTER; 130 | propChanged = true; 131 | } else { 132 | propVals[i] = STAY; 133 | } 134 | } 135 | }); 136 | for (let i = 0; i < propVals.length; i++) { 137 | if (propVals[i] === true) { 138 | propVals[i] = LEAVE; 139 | propChanged = true; 140 | } else if (propVals[i] === STAY) { 141 | propVals[i] = true; // set it back 142 | } 143 | } 144 | 145 | // now each member of propVal is in {false,LEAVE,ENTER,true} 146 | // according to what happens at start of span 147 | if (propChanged) { 148 | // leaving bold (e.g.) also leaves italics, etc. 149 | let left = false; 150 | for (let i = 0; i < propVals.length; i++) { 151 | const v = propVals[i]; 152 | if (!left) { 153 | if (v === LEAVE) { 154 | left = true; 155 | } 156 | } else if (v === true) { 157 | propVals[i] = STAY; // tag will be closed and re-opened 158 | } 159 | } 160 | 161 | const tags2close = []; 162 | 163 | for (let i = propVals.length - 1; i >= 0; i--) { 164 | if (propVals[i] === LEAVE) { 165 | // emitCloseTag(i); 166 | tags2close.push(i); 167 | propVals[i] = false; 168 | } else if (propVals[i] === STAY) { 169 | // emitCloseTag(i); 170 | tags2close.push(i); 171 | } 172 | } 173 | 174 | orderdCloseTags(tags2close); 175 | 176 | for (let i = 0; i < propVals.length; i++) { 177 | if (propVals[i] === ENTER || propVals[i] === STAY) { 178 | emitOpenTag(i); 179 | propVals[i] = true; 180 | } 181 | } 182 | // propVals is now all {true,false} again 183 | } // end if (propChanged) 184 | let chars = o.chars; 185 | if (o.lines) { 186 | chars--; // exclude newline at end of line, if present 187 | } 188 | 189 | let s = taker.take(chars); 190 | 191 | // removes the characters with the code 12. Don't know where they come 192 | // from but they break the abiword parser and are completly useless 193 | s = s.replace(String.fromCharCode(12), ''); 194 | 195 | // delete * if this line is a heading 196 | if (heading && !deletedAsterisk) { 197 | s = s.substring(1); 198 | deletedAsterisk = true; 199 | } 200 | 201 | assem.append(s); 202 | } // end iteration over spans in line 203 | 204 | const tags2close = []; 205 | for (let i = propVals.length - 1; i >= 0; i--) { 206 | if (propVals[i]) { 207 | tags2close.push(i); 208 | propVals[i] = false; 209 | } 210 | } 211 | 212 | orderdCloseTags(tags2close); 213 | }; // end processNextChars 214 | 215 | if (urls) { 216 | urls.forEach((urlData) => { 217 | const startIndex = urlData[0]; 218 | const url = urlData[1]; 219 | const urlLength = url.length; 220 | processNextChars(startIndex - idx); 221 | assem.append(`[${url}](`); 222 | processNextChars(urlLength); 223 | assem.append(')'); 224 | }); 225 | } 226 | 227 | processNextChars(text.length - idx); 228 | 229 | // replace &, _ 230 | assem = assem.toString(); 231 | assem = assem.replace(/&/g, '\\&'); 232 | // this breaks Markdown math mode: $\sum_i^j$ becomes $\sum\_i^j$ 233 | assem = assem.replace(/_/g, '\\_'); 234 | 235 | return assem; 236 | }; 237 | // end getLineMarkdown 238 | const pieces = []; 239 | 240 | // Need to deal with constraints imposed on HTML lists; can 241 | // only gain one level of nesting at once, can't change type 242 | // mid-list, etc. 243 | // People might use weird indenting, e.g. skip a level, 244 | // so we want to do something reasonable there. We also 245 | // want to deal gracefully with blank lines. 246 | // => keeps track of the parents level of indentation 247 | const lists = []; // e.g. [[1,'bullet'], [3,'bullet'], ...] 248 | for (let i = 0; i < textLines.length; i++) { 249 | const line = _analyzeLine(textLines[i], attribLines[i], apool); 250 | const lineContent = getLineMarkdown(line.text, line.aline); 251 | 252 | // If we are inside a list 253 | if (line.listLevel) { 254 | // do list stuff 255 | let whichList = -1; // index into lists or -1 256 | if (line.listLevel) { 257 | whichList = lists.length; 258 | for (let j = lists.length - 1; j >= 0; j--) { 259 | if (line.listLevel <= lists[j][0]) { 260 | whichList = j; 261 | } 262 | } 263 | } 264 | 265 | // means we are on a deeper level of indentation than the 266 | // previous line 267 | if (whichList >= lists.length) { 268 | lists.push([line.listLevel, line.listTypeName]); 269 | } 270 | 271 | if (line.listTypeName === 'number') { 272 | pieces.push(`\n${(new Array(line.listLevel * 4)) 273 | .join(' ')}1. `, lineContent || '\n'); // problem here 274 | } else { 275 | pieces.push(`\n${(new Array(line.listLevel * 4)) 276 | .join(' ')}* `, lineContent || '\n'); // problem here 277 | } 278 | } else { 279 | // outside any list 280 | pieces.push('\n', lineContent, '\n'); 281 | } 282 | } 283 | return pieces.join(''); 284 | }; 285 | 286 | const _analyzeLine = (text, aline, apool) => { 287 | const line = {}; 288 | 289 | // identify list 290 | let lineMarker = 0; 291 | line.listLevel = 0; 292 | if (aline) { 293 | const opIter = opIterator(aline); 294 | if (opIter.hasNext()) { 295 | let listType = opAttributeValue(opIter.next(), 'list', apool); 296 | if (listType) { 297 | lineMarker = 1; 298 | listType = /([a-z]+)([12345678])/.exec(listType); 299 | if (listType) { 300 | line.listTypeName = listType[1]; 301 | line.listLevel = Number(listType[2]); 302 | } 303 | } 304 | } 305 | } 306 | if (lineMarker) { 307 | line.text = text.substring(1); 308 | line.aline = subattribution(aline, 1); 309 | } else { 310 | line.text = text; 311 | line.aline = aline; 312 | } 313 | 314 | return line; 315 | }; 316 | 317 | const getPadMarkdown = async (pad, revNum) => { 318 | const atext = revNum == null ? pad.atext : await pad.getInternalRevisionAText(revNum); 319 | return getMarkdownFromAtext(pad, atext); 320 | }; 321 | 322 | exports.getPadMarkdownDocument = 323 | async (padId, revNum) => await getPadMarkdown(await padManager.getPad(padId), revNum); 324 | 325 | // copied from ACE 326 | const _REGEX_WORDCHAR = new RegExp([ 327 | '[', 328 | '\u0030-\u0039', 329 | '\u0041-\u005A', 330 | '\u0061-\u007A', 331 | '\u00C0-\u00D6', 332 | '\u00D8-\u00F6', 333 | '\u00F8-\u00FF', 334 | '\u0100-\u1FFF', 335 | '\u3040-\u9FFF', 336 | '\uF900-\uFDFF', 337 | '\uFE70-\uFEFE', 338 | '\uFF10-\uFF19', 339 | '\uFF21-\uFF3A', 340 | '\uFF41-\uFF5A', 341 | '\uFF66-\uFFDC', 342 | ']', 343 | ].join('')); 344 | const _REGEX_URLCHAR = new RegExp(`([-:@a-zA-Z0-9_.,~%+/\\?=&#;()$]|${_REGEX_WORDCHAR.source})`); 345 | const _REGEX_URL = new RegExp( 346 | '(?:(?:https?|s?ftp|ftps|file|smb|afp|nfs|(x-)?man|gopher|txmt)://|mailto:)' + 347 | `${_REGEX_URLCHAR.source}*(?![:.,;])${_REGEX_URLCHAR.source}`, 'g'); 348 | // returns null if no URLs, or [[startIndex1, url1], [startIndex2, url2], ...] 349 | const _findURLs = (text) => { 350 | _REGEX_URL.lastIndex = 0; 351 | let urls = null; 352 | let execResult; 353 | while ((execResult = _REGEX_URL.exec(text))) { 354 | urls = (urls || []); 355 | const startIndex = execResult.index; 356 | const url = execResult[0]; 357 | urls.push([startIndex, url]); 358 | } 359 | return urls; 360 | }; 361 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | showdown: 9 | specifier: '*' 10 | version: 2.1.0 11 | 12 | devDependencies: 13 | '@types/mocha': 14 | specifier: ^10.0.6 15 | version: 10.0.6 16 | '@types/node': 17 | specifier: ^20.12.4 18 | version: 20.12.5 19 | eslint: 20 | specifier: ^8.57.0 21 | version: 8.57.0 22 | eslint-config-etherpad: 23 | specifier: ^4.0.4 24 | version: 4.0.4(eslint@8.57.0)(typescript@5.4.2) 25 | typescript: 26 | specifier: ^5.4.2 27 | version: 5.4.2 28 | 29 | packages: 30 | 31 | /@aashutoshrathi/word-wrap@1.2.6: 32 | resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} 33 | engines: {node: '>=0.10.0'} 34 | dev: true 35 | 36 | /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): 37 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 38 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 39 | peerDependencies: 40 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 41 | dependencies: 42 | eslint: 8.57.0 43 | eslint-visitor-keys: 3.4.3 44 | dev: true 45 | 46 | /@eslint-community/regexpp@4.10.0: 47 | resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} 48 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 49 | dev: true 50 | 51 | /@eslint/eslintrc@2.1.4: 52 | resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} 53 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 54 | dependencies: 55 | ajv: 6.12.6 56 | debug: 4.3.4 57 | espree: 9.6.1 58 | globals: 13.24.0 59 | ignore: 5.3.1 60 | import-fresh: 3.3.0 61 | js-yaml: 4.1.0 62 | minimatch: 3.1.2 63 | strip-json-comments: 3.1.1 64 | transitivePeerDependencies: 65 | - supports-color 66 | dev: true 67 | 68 | /@eslint/js@8.57.0: 69 | resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} 70 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 71 | dev: true 72 | 73 | /@humanwhocodes/config-array@0.11.14: 74 | resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} 75 | engines: {node: '>=10.10.0'} 76 | dependencies: 77 | '@humanwhocodes/object-schema': 2.0.2 78 | debug: 4.3.4 79 | minimatch: 3.1.2 80 | transitivePeerDependencies: 81 | - supports-color 82 | dev: true 83 | 84 | /@humanwhocodes/module-importer@1.0.1: 85 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 86 | engines: {node: '>=12.22'} 87 | dev: true 88 | 89 | /@humanwhocodes/object-schema@2.0.2: 90 | resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} 91 | dev: true 92 | 93 | /@nodelib/fs.scandir@2.1.5: 94 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 95 | engines: {node: '>= 8'} 96 | dependencies: 97 | '@nodelib/fs.stat': 2.0.5 98 | run-parallel: 1.2.0 99 | dev: true 100 | 101 | /@nodelib/fs.stat@2.0.5: 102 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 103 | engines: {node: '>= 8'} 104 | dev: true 105 | 106 | /@nodelib/fs.walk@1.2.8: 107 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 108 | engines: {node: '>= 8'} 109 | dependencies: 110 | '@nodelib/fs.scandir': 2.1.5 111 | fastq: 1.17.1 112 | dev: true 113 | 114 | /@rushstack/eslint-patch@1.7.2: 115 | resolution: {integrity: sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==} 116 | dev: true 117 | 118 | /@types/json-schema@7.0.15: 119 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 120 | dev: true 121 | 122 | /@types/json5@0.0.29: 123 | resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} 124 | dev: true 125 | 126 | /@types/mocha@10.0.6: 127 | resolution: {integrity: sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==} 128 | dev: true 129 | 130 | /@types/node@20.12.5: 131 | resolution: {integrity: sha512-BD+BjQ9LS/D8ST9p5uqBxghlN+S42iuNxjsUGjeZobe/ciXzk2qb1B6IXc6AnRLS+yFJRpN2IPEHMzwspfDJNw==} 132 | dependencies: 133 | undici-types: 5.26.5 134 | dev: true 135 | 136 | /@types/semver@7.5.8: 137 | resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} 138 | dev: true 139 | 140 | /@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0)(eslint@8.57.0)(typescript@5.4.2): 141 | resolution: {integrity: sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw==} 142 | engines: {node: ^16.0.0 || >=18.0.0} 143 | peerDependencies: 144 | '@typescript-eslint/parser': ^7.0.0 145 | eslint: ^8.56.0 146 | typescript: '*' 147 | peerDependenciesMeta: 148 | typescript: 149 | optional: true 150 | dependencies: 151 | '@eslint-community/regexpp': 4.10.0 152 | '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.4.2) 153 | '@typescript-eslint/scope-manager': 7.2.0 154 | '@typescript-eslint/type-utils': 7.2.0(eslint@8.57.0)(typescript@5.4.2) 155 | '@typescript-eslint/utils': 7.2.0(eslint@8.57.0)(typescript@5.4.2) 156 | '@typescript-eslint/visitor-keys': 7.2.0 157 | debug: 4.3.4 158 | eslint: 8.57.0 159 | graphemer: 1.4.0 160 | ignore: 5.3.1 161 | natural-compare: 1.4.0 162 | semver: 7.6.0 163 | ts-api-utils: 1.3.0(typescript@5.4.2) 164 | typescript: 5.4.2 165 | transitivePeerDependencies: 166 | - supports-color 167 | dev: true 168 | 169 | /@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2): 170 | resolution: {integrity: sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==} 171 | engines: {node: ^16.0.0 || >=18.0.0} 172 | peerDependencies: 173 | eslint: ^8.56.0 174 | typescript: '*' 175 | peerDependenciesMeta: 176 | typescript: 177 | optional: true 178 | dependencies: 179 | '@typescript-eslint/scope-manager': 7.2.0 180 | '@typescript-eslint/types': 7.2.0 181 | '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.2) 182 | '@typescript-eslint/visitor-keys': 7.2.0 183 | debug: 4.3.4 184 | eslint: 8.57.0 185 | typescript: 5.4.2 186 | transitivePeerDependencies: 187 | - supports-color 188 | dev: true 189 | 190 | /@typescript-eslint/scope-manager@7.2.0: 191 | resolution: {integrity: sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==} 192 | engines: {node: ^16.0.0 || >=18.0.0} 193 | dependencies: 194 | '@typescript-eslint/types': 7.2.0 195 | '@typescript-eslint/visitor-keys': 7.2.0 196 | dev: true 197 | 198 | /@typescript-eslint/type-utils@7.2.0(eslint@8.57.0)(typescript@5.4.2): 199 | resolution: {integrity: sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==} 200 | engines: {node: ^16.0.0 || >=18.0.0} 201 | peerDependencies: 202 | eslint: ^8.56.0 203 | typescript: '*' 204 | peerDependenciesMeta: 205 | typescript: 206 | optional: true 207 | dependencies: 208 | '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.2) 209 | '@typescript-eslint/utils': 7.2.0(eslint@8.57.0)(typescript@5.4.2) 210 | debug: 4.3.4 211 | eslint: 8.57.0 212 | ts-api-utils: 1.3.0(typescript@5.4.2) 213 | typescript: 5.4.2 214 | transitivePeerDependencies: 215 | - supports-color 216 | dev: true 217 | 218 | /@typescript-eslint/types@7.2.0: 219 | resolution: {integrity: sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==} 220 | engines: {node: ^16.0.0 || >=18.0.0} 221 | dev: true 222 | 223 | /@typescript-eslint/typescript-estree@7.2.0(typescript@5.4.2): 224 | resolution: {integrity: sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==} 225 | engines: {node: ^16.0.0 || >=18.0.0} 226 | peerDependencies: 227 | typescript: '*' 228 | peerDependenciesMeta: 229 | typescript: 230 | optional: true 231 | dependencies: 232 | '@typescript-eslint/types': 7.2.0 233 | '@typescript-eslint/visitor-keys': 7.2.0 234 | debug: 4.3.4 235 | globby: 11.1.0 236 | is-glob: 4.0.3 237 | minimatch: 9.0.3 238 | semver: 7.6.0 239 | ts-api-utils: 1.3.0(typescript@5.4.2) 240 | typescript: 5.4.2 241 | transitivePeerDependencies: 242 | - supports-color 243 | dev: true 244 | 245 | /@typescript-eslint/utils@7.2.0(eslint@8.57.0)(typescript@5.4.2): 246 | resolution: {integrity: sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==} 247 | engines: {node: ^16.0.0 || >=18.0.0} 248 | peerDependencies: 249 | eslint: ^8.56.0 250 | dependencies: 251 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) 252 | '@types/json-schema': 7.0.15 253 | '@types/semver': 7.5.8 254 | '@typescript-eslint/scope-manager': 7.2.0 255 | '@typescript-eslint/types': 7.2.0 256 | '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.2) 257 | eslint: 8.57.0 258 | semver: 7.6.0 259 | transitivePeerDependencies: 260 | - supports-color 261 | - typescript 262 | dev: true 263 | 264 | /@typescript-eslint/visitor-keys@7.2.0: 265 | resolution: {integrity: sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==} 266 | engines: {node: ^16.0.0 || >=18.0.0} 267 | dependencies: 268 | '@typescript-eslint/types': 7.2.0 269 | eslint-visitor-keys: 3.4.3 270 | dev: true 271 | 272 | /@ungap/structured-clone@1.2.0: 273 | resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} 274 | dev: true 275 | 276 | /acorn-jsx@5.3.2(acorn@8.11.3): 277 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 278 | peerDependencies: 279 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 280 | dependencies: 281 | acorn: 8.11.3 282 | dev: true 283 | 284 | /acorn@8.11.3: 285 | resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} 286 | engines: {node: '>=0.4.0'} 287 | hasBin: true 288 | dev: true 289 | 290 | /ajv@6.12.6: 291 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 292 | dependencies: 293 | fast-deep-equal: 3.1.3 294 | fast-json-stable-stringify: 2.1.0 295 | json-schema-traverse: 0.4.1 296 | uri-js: 4.4.1 297 | dev: true 298 | 299 | /ansi-regex@5.0.1: 300 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 301 | engines: {node: '>=8'} 302 | dev: true 303 | 304 | /ansi-styles@4.3.0: 305 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 306 | engines: {node: '>=8'} 307 | dependencies: 308 | color-convert: 2.0.1 309 | dev: true 310 | 311 | /argparse@2.0.1: 312 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 313 | dev: true 314 | 315 | /array-buffer-byte-length@1.0.1: 316 | resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} 317 | engines: {node: '>= 0.4'} 318 | dependencies: 319 | call-bind: 1.0.7 320 | is-array-buffer: 3.0.4 321 | dev: true 322 | 323 | /array-includes@3.1.7: 324 | resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} 325 | engines: {node: '>= 0.4'} 326 | dependencies: 327 | call-bind: 1.0.7 328 | define-properties: 1.2.1 329 | es-abstract: 1.22.5 330 | get-intrinsic: 1.2.4 331 | is-string: 1.0.7 332 | dev: true 333 | 334 | /array-union@2.1.0: 335 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 336 | engines: {node: '>=8'} 337 | dev: true 338 | 339 | /array.prototype.filter@1.0.3: 340 | resolution: {integrity: sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==} 341 | engines: {node: '>= 0.4'} 342 | dependencies: 343 | call-bind: 1.0.7 344 | define-properties: 1.2.1 345 | es-abstract: 1.22.5 346 | es-array-method-boxes-properly: 1.0.0 347 | is-string: 1.0.7 348 | dev: true 349 | 350 | /array.prototype.findlastindex@1.2.4: 351 | resolution: {integrity: sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==} 352 | engines: {node: '>= 0.4'} 353 | dependencies: 354 | call-bind: 1.0.7 355 | define-properties: 1.2.1 356 | es-abstract: 1.22.5 357 | es-errors: 1.3.0 358 | es-shim-unscopables: 1.0.2 359 | dev: true 360 | 361 | /array.prototype.flat@1.3.2: 362 | resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} 363 | engines: {node: '>= 0.4'} 364 | dependencies: 365 | call-bind: 1.0.7 366 | define-properties: 1.2.1 367 | es-abstract: 1.22.5 368 | es-shim-unscopables: 1.0.2 369 | dev: true 370 | 371 | /array.prototype.flatmap@1.3.2: 372 | resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} 373 | engines: {node: '>= 0.4'} 374 | dependencies: 375 | call-bind: 1.0.7 376 | define-properties: 1.2.1 377 | es-abstract: 1.22.5 378 | es-shim-unscopables: 1.0.2 379 | dev: true 380 | 381 | /arraybuffer.prototype.slice@1.0.3: 382 | resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} 383 | engines: {node: '>= 0.4'} 384 | dependencies: 385 | array-buffer-byte-length: 1.0.1 386 | call-bind: 1.0.7 387 | define-properties: 1.2.1 388 | es-abstract: 1.22.5 389 | es-errors: 1.3.0 390 | get-intrinsic: 1.2.4 391 | is-array-buffer: 3.0.4 392 | is-shared-array-buffer: 1.0.3 393 | dev: true 394 | 395 | /available-typed-arrays@1.0.7: 396 | resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} 397 | engines: {node: '>= 0.4'} 398 | dependencies: 399 | possible-typed-array-names: 1.0.0 400 | dev: true 401 | 402 | /balanced-match@1.0.2: 403 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 404 | dev: true 405 | 406 | /brace-expansion@1.1.11: 407 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 408 | dependencies: 409 | balanced-match: 1.0.2 410 | concat-map: 0.0.1 411 | dev: true 412 | 413 | /brace-expansion@2.0.1: 414 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 415 | dependencies: 416 | balanced-match: 1.0.2 417 | dev: true 418 | 419 | /braces@3.0.2: 420 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 421 | engines: {node: '>=8'} 422 | dependencies: 423 | fill-range: 7.0.1 424 | dev: true 425 | 426 | /builtin-modules@3.3.0: 427 | resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} 428 | engines: {node: '>=6'} 429 | dev: true 430 | 431 | /builtins@5.0.1: 432 | resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} 433 | dependencies: 434 | semver: 7.6.0 435 | dev: true 436 | 437 | /call-bind@1.0.7: 438 | resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} 439 | engines: {node: '>= 0.4'} 440 | dependencies: 441 | es-define-property: 1.0.0 442 | es-errors: 1.3.0 443 | function-bind: 1.1.2 444 | get-intrinsic: 1.2.4 445 | set-function-length: 1.2.2 446 | dev: true 447 | 448 | /callsites@3.1.0: 449 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 450 | engines: {node: '>=6'} 451 | dev: true 452 | 453 | /chalk@4.1.2: 454 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 455 | engines: {node: '>=10'} 456 | dependencies: 457 | ansi-styles: 4.3.0 458 | supports-color: 7.2.0 459 | dev: true 460 | 461 | /color-convert@2.0.1: 462 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 463 | engines: {node: '>=7.0.0'} 464 | dependencies: 465 | color-name: 1.1.4 466 | dev: true 467 | 468 | /color-name@1.1.4: 469 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 470 | dev: true 471 | 472 | /commander@9.5.0: 473 | resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} 474 | engines: {node: ^12.20.0 || >=14} 475 | dev: false 476 | 477 | /concat-map@0.0.1: 478 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 479 | dev: true 480 | 481 | /cross-spawn@7.0.3: 482 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 483 | engines: {node: '>= 8'} 484 | dependencies: 485 | path-key: 3.1.1 486 | shebang-command: 2.0.0 487 | which: 2.0.2 488 | dev: true 489 | 490 | /debug@3.2.7: 491 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} 492 | peerDependencies: 493 | supports-color: '*' 494 | peerDependenciesMeta: 495 | supports-color: 496 | optional: true 497 | dependencies: 498 | ms: 2.1.3 499 | dev: true 500 | 501 | /debug@4.3.4: 502 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 503 | engines: {node: '>=6.0'} 504 | peerDependencies: 505 | supports-color: '*' 506 | peerDependenciesMeta: 507 | supports-color: 508 | optional: true 509 | dependencies: 510 | ms: 2.1.2 511 | dev: true 512 | 513 | /deep-is@0.1.4: 514 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 515 | dev: true 516 | 517 | /define-data-property@1.1.4: 518 | resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} 519 | engines: {node: '>= 0.4'} 520 | dependencies: 521 | es-define-property: 1.0.0 522 | es-errors: 1.3.0 523 | gopd: 1.0.1 524 | dev: true 525 | 526 | /define-properties@1.2.1: 527 | resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} 528 | engines: {node: '>= 0.4'} 529 | dependencies: 530 | define-data-property: 1.1.4 531 | has-property-descriptors: 1.0.2 532 | object-keys: 1.1.1 533 | dev: true 534 | 535 | /dir-glob@3.0.1: 536 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 537 | engines: {node: '>=8'} 538 | dependencies: 539 | path-type: 4.0.0 540 | dev: true 541 | 542 | /doctrine@2.1.0: 543 | resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} 544 | engines: {node: '>=0.10.0'} 545 | dependencies: 546 | esutils: 2.0.3 547 | dev: true 548 | 549 | /doctrine@3.0.0: 550 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 551 | engines: {node: '>=6.0.0'} 552 | dependencies: 553 | esutils: 2.0.3 554 | dev: true 555 | 556 | /enhanced-resolve@5.16.0: 557 | resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} 558 | engines: {node: '>=10.13.0'} 559 | dependencies: 560 | graceful-fs: 4.2.11 561 | tapable: 2.2.1 562 | dev: true 563 | 564 | /es-abstract@1.22.5: 565 | resolution: {integrity: sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==} 566 | engines: {node: '>= 0.4'} 567 | dependencies: 568 | array-buffer-byte-length: 1.0.1 569 | arraybuffer.prototype.slice: 1.0.3 570 | available-typed-arrays: 1.0.7 571 | call-bind: 1.0.7 572 | es-define-property: 1.0.0 573 | es-errors: 1.3.0 574 | es-set-tostringtag: 2.0.3 575 | es-to-primitive: 1.2.1 576 | function.prototype.name: 1.1.6 577 | get-intrinsic: 1.2.4 578 | get-symbol-description: 1.0.2 579 | globalthis: 1.0.3 580 | gopd: 1.0.1 581 | has-property-descriptors: 1.0.2 582 | has-proto: 1.0.3 583 | has-symbols: 1.0.3 584 | hasown: 2.0.2 585 | internal-slot: 1.0.7 586 | is-array-buffer: 3.0.4 587 | is-callable: 1.2.7 588 | is-negative-zero: 2.0.3 589 | is-regex: 1.1.4 590 | is-shared-array-buffer: 1.0.3 591 | is-string: 1.0.7 592 | is-typed-array: 1.1.13 593 | is-weakref: 1.0.2 594 | object-inspect: 1.13.1 595 | object-keys: 1.1.1 596 | object.assign: 4.1.5 597 | regexp.prototype.flags: 1.5.2 598 | safe-array-concat: 1.1.2 599 | safe-regex-test: 1.0.3 600 | string.prototype.trim: 1.2.8 601 | string.prototype.trimend: 1.0.7 602 | string.prototype.trimstart: 1.0.7 603 | typed-array-buffer: 1.0.2 604 | typed-array-byte-length: 1.0.1 605 | typed-array-byte-offset: 1.0.2 606 | typed-array-length: 1.0.5 607 | unbox-primitive: 1.0.2 608 | which-typed-array: 1.1.15 609 | dev: true 610 | 611 | /es-array-method-boxes-properly@1.0.0: 612 | resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} 613 | dev: true 614 | 615 | /es-define-property@1.0.0: 616 | resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} 617 | engines: {node: '>= 0.4'} 618 | dependencies: 619 | get-intrinsic: 1.2.4 620 | dev: true 621 | 622 | /es-errors@1.3.0: 623 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 624 | engines: {node: '>= 0.4'} 625 | dev: true 626 | 627 | /es-set-tostringtag@2.0.3: 628 | resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} 629 | engines: {node: '>= 0.4'} 630 | dependencies: 631 | get-intrinsic: 1.2.4 632 | has-tostringtag: 1.0.2 633 | hasown: 2.0.2 634 | dev: true 635 | 636 | /es-shim-unscopables@1.0.2: 637 | resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} 638 | dependencies: 639 | hasown: 2.0.2 640 | dev: true 641 | 642 | /es-to-primitive@1.2.1: 643 | resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} 644 | engines: {node: '>= 0.4'} 645 | dependencies: 646 | is-callable: 1.2.7 647 | is-date-object: 1.0.5 648 | is-symbol: 1.0.4 649 | dev: true 650 | 651 | /escape-string-regexp@1.0.5: 652 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 653 | engines: {node: '>=0.8.0'} 654 | dev: true 655 | 656 | /escape-string-regexp@4.0.0: 657 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 658 | engines: {node: '>=10'} 659 | dev: true 660 | 661 | /eslint-compat-utils@0.1.2(eslint@8.57.0): 662 | resolution: {integrity: sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==} 663 | engines: {node: '>=12'} 664 | peerDependencies: 665 | eslint: '>=6.0.0' 666 | dependencies: 667 | eslint: 8.57.0 668 | dev: true 669 | 670 | /eslint-config-etherpad@4.0.4(eslint@8.57.0)(typescript@5.4.2): 671 | resolution: {integrity: sha512-y1riT+lmFwd+TZR9LzTlF4ntcTWRUpjqspdJ8kekLY9gcwyBsKTaW/Jj8mO4DyfDR72/3o4t6v7A8d8SqXybUQ==} 672 | engines: {node: '>=12.17.0'} 673 | dependencies: 674 | '@rushstack/eslint-patch': 1.7.2 675 | '@typescript-eslint/eslint-plugin': 7.2.0(@typescript-eslint/parser@7.2.0)(eslint@8.57.0)(typescript@5.4.2) 676 | '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.4.2) 677 | eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) 678 | eslint-plugin-cypress: 2.15.1(eslint@8.57.0) 679 | eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.0) 680 | eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) 681 | eslint-plugin-mocha: 10.4.1(eslint@8.57.0) 682 | eslint-plugin-n: 16.6.2(eslint@8.57.0) 683 | eslint-plugin-prefer-arrow: 1.2.3(eslint@8.57.0) 684 | eslint-plugin-promise: 6.1.1(eslint@8.57.0) 685 | eslint-plugin-you-dont-need-lodash-underscore: 6.13.0 686 | transitivePeerDependencies: 687 | - eslint 688 | - eslint-import-resolver-node 689 | - eslint-import-resolver-webpack 690 | - supports-color 691 | - typescript 692 | dev: true 693 | 694 | /eslint-import-resolver-node@0.3.9: 695 | resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} 696 | dependencies: 697 | debug: 3.2.7 698 | is-core-module: 2.13.1 699 | resolve: 1.22.8 700 | transitivePeerDependencies: 701 | - supports-color 702 | dev: true 703 | 704 | /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0): 705 | resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} 706 | engines: {node: ^14.18.0 || >=16.0.0} 707 | peerDependencies: 708 | eslint: '*' 709 | eslint-plugin-import: '*' 710 | dependencies: 711 | debug: 4.3.4 712 | enhanced-resolve: 5.16.0 713 | eslint: 8.57.0 714 | eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) 715 | eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) 716 | fast-glob: 3.3.2 717 | get-tsconfig: 4.7.3 718 | is-core-module: 2.13.1 719 | is-glob: 4.0.3 720 | transitivePeerDependencies: 721 | - '@typescript-eslint/parser' 722 | - eslint-import-resolver-node 723 | - eslint-import-resolver-webpack 724 | - supports-color 725 | dev: true 726 | 727 | /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): 728 | resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} 729 | engines: {node: '>=4'} 730 | peerDependencies: 731 | '@typescript-eslint/parser': '*' 732 | eslint: '*' 733 | eslint-import-resolver-node: '*' 734 | eslint-import-resolver-typescript: '*' 735 | eslint-import-resolver-webpack: '*' 736 | peerDependenciesMeta: 737 | '@typescript-eslint/parser': 738 | optional: true 739 | eslint: 740 | optional: true 741 | eslint-import-resolver-node: 742 | optional: true 743 | eslint-import-resolver-typescript: 744 | optional: true 745 | eslint-import-resolver-webpack: 746 | optional: true 747 | dependencies: 748 | '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.4.2) 749 | debug: 3.2.7 750 | eslint: 8.57.0 751 | eslint-import-resolver-node: 0.3.9 752 | eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) 753 | transitivePeerDependencies: 754 | - supports-color 755 | dev: true 756 | 757 | /eslint-plugin-cypress@2.15.1(eslint@8.57.0): 758 | resolution: {integrity: sha512-eLHLWP5Q+I4j2AWepYq0PgFEei9/s5LvjuSqWrxurkg1YZ8ltxdvMNmdSf0drnsNo57CTgYY/NIHHLRSWejR7w==} 759 | peerDependencies: 760 | eslint: '>= 3.2.1' 761 | dependencies: 762 | eslint: 8.57.0 763 | globals: 13.24.0 764 | dev: true 765 | 766 | /eslint-plugin-es-x@7.5.0(eslint@8.57.0): 767 | resolution: {integrity: sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==} 768 | engines: {node: ^14.18.0 || >=16.0.0} 769 | peerDependencies: 770 | eslint: '>=8' 771 | dependencies: 772 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) 773 | '@eslint-community/regexpp': 4.10.0 774 | eslint: 8.57.0 775 | eslint-compat-utils: 0.1.2(eslint@8.57.0) 776 | dev: true 777 | 778 | /eslint-plugin-eslint-comments@3.2.0(eslint@8.57.0): 779 | resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} 780 | engines: {node: '>=6.5.0'} 781 | peerDependencies: 782 | eslint: '>=4.19.1' 783 | dependencies: 784 | escape-string-regexp: 1.0.5 785 | eslint: 8.57.0 786 | ignore: 5.3.1 787 | dev: true 788 | 789 | /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): 790 | resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} 791 | engines: {node: '>=4'} 792 | peerDependencies: 793 | '@typescript-eslint/parser': '*' 794 | eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 795 | peerDependenciesMeta: 796 | '@typescript-eslint/parser': 797 | optional: true 798 | dependencies: 799 | '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.4.2) 800 | array-includes: 3.1.7 801 | array.prototype.findlastindex: 1.2.4 802 | array.prototype.flat: 1.3.2 803 | array.prototype.flatmap: 1.3.2 804 | debug: 3.2.7 805 | doctrine: 2.1.0 806 | eslint: 8.57.0 807 | eslint-import-resolver-node: 0.3.9 808 | eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) 809 | hasown: 2.0.2 810 | is-core-module: 2.13.1 811 | is-glob: 4.0.3 812 | minimatch: 3.1.2 813 | object.fromentries: 2.0.7 814 | object.groupby: 1.0.2 815 | object.values: 1.1.7 816 | semver: 6.3.1 817 | tsconfig-paths: 3.15.0 818 | transitivePeerDependencies: 819 | - eslint-import-resolver-typescript 820 | - eslint-import-resolver-webpack 821 | - supports-color 822 | dev: true 823 | 824 | /eslint-plugin-mocha@10.4.1(eslint@8.57.0): 825 | resolution: {integrity: sha512-G85ALUgKaLzuEuHhoW3HVRgPTmia6njQC3qCG6CEvA8/Ja9PDZnRZOuzekMki+HaViEQXINuYsmhp5WR5/4MfA==} 826 | engines: {node: '>=14.0.0'} 827 | peerDependencies: 828 | eslint: '>=7.0.0' 829 | dependencies: 830 | eslint: 8.57.0 831 | eslint-utils: 3.0.0(eslint@8.57.0) 832 | globals: 13.24.0 833 | rambda: 7.5.0 834 | dev: true 835 | 836 | /eslint-plugin-n@16.6.2(eslint@8.57.0): 837 | resolution: {integrity: sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==} 838 | engines: {node: '>=16.0.0'} 839 | peerDependencies: 840 | eslint: '>=7.0.0' 841 | dependencies: 842 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) 843 | builtins: 5.0.1 844 | eslint: 8.57.0 845 | eslint-plugin-es-x: 7.5.0(eslint@8.57.0) 846 | get-tsconfig: 4.7.3 847 | globals: 13.24.0 848 | ignore: 5.3.1 849 | is-builtin-module: 3.2.1 850 | is-core-module: 2.13.1 851 | minimatch: 3.1.2 852 | resolve: 1.22.8 853 | semver: 7.6.0 854 | dev: true 855 | 856 | /eslint-plugin-prefer-arrow@1.2.3(eslint@8.57.0): 857 | resolution: {integrity: sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==} 858 | peerDependencies: 859 | eslint: '>=2.0.0' 860 | dependencies: 861 | eslint: 8.57.0 862 | dev: true 863 | 864 | /eslint-plugin-promise@6.1.1(eslint@8.57.0): 865 | resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} 866 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 867 | peerDependencies: 868 | eslint: ^7.0.0 || ^8.0.0 869 | dependencies: 870 | eslint: 8.57.0 871 | dev: true 872 | 873 | /eslint-plugin-you-dont-need-lodash-underscore@6.13.0: 874 | resolution: {integrity: sha512-6FkFLp/R/QlgfJl5NrxkIXMQ36jMVLczkWDZJvMd7/wr/M3K0DS7mtX7plZ3giTDcbDD7VBfNYUfUVaBCZOXKA==} 875 | engines: {node: '>=4.0'} 876 | dependencies: 877 | kebab-case: 1.0.2 878 | dev: true 879 | 880 | /eslint-scope@7.2.2: 881 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 882 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 883 | dependencies: 884 | esrecurse: 4.3.0 885 | estraverse: 5.3.0 886 | dev: true 887 | 888 | /eslint-utils@3.0.0(eslint@8.57.0): 889 | resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} 890 | engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} 891 | peerDependencies: 892 | eslint: '>=5' 893 | dependencies: 894 | eslint: 8.57.0 895 | eslint-visitor-keys: 2.1.0 896 | dev: true 897 | 898 | /eslint-visitor-keys@2.1.0: 899 | resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} 900 | engines: {node: '>=10'} 901 | dev: true 902 | 903 | /eslint-visitor-keys@3.4.3: 904 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 905 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 906 | dev: true 907 | 908 | /eslint@8.57.0: 909 | resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} 910 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 911 | hasBin: true 912 | dependencies: 913 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) 914 | '@eslint-community/regexpp': 4.10.0 915 | '@eslint/eslintrc': 2.1.4 916 | '@eslint/js': 8.57.0 917 | '@humanwhocodes/config-array': 0.11.14 918 | '@humanwhocodes/module-importer': 1.0.1 919 | '@nodelib/fs.walk': 1.2.8 920 | '@ungap/structured-clone': 1.2.0 921 | ajv: 6.12.6 922 | chalk: 4.1.2 923 | cross-spawn: 7.0.3 924 | debug: 4.3.4 925 | doctrine: 3.0.0 926 | escape-string-regexp: 4.0.0 927 | eslint-scope: 7.2.2 928 | eslint-visitor-keys: 3.4.3 929 | espree: 9.6.1 930 | esquery: 1.5.0 931 | esutils: 2.0.3 932 | fast-deep-equal: 3.1.3 933 | file-entry-cache: 6.0.1 934 | find-up: 5.0.0 935 | glob-parent: 6.0.2 936 | globals: 13.24.0 937 | graphemer: 1.4.0 938 | ignore: 5.3.1 939 | imurmurhash: 0.1.4 940 | is-glob: 4.0.3 941 | is-path-inside: 3.0.3 942 | js-yaml: 4.1.0 943 | json-stable-stringify-without-jsonify: 1.0.1 944 | levn: 0.4.1 945 | lodash.merge: 4.6.2 946 | minimatch: 3.1.2 947 | natural-compare: 1.4.0 948 | optionator: 0.9.3 949 | strip-ansi: 6.0.1 950 | text-table: 0.2.0 951 | transitivePeerDependencies: 952 | - supports-color 953 | dev: true 954 | 955 | /espree@9.6.1: 956 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 957 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 958 | dependencies: 959 | acorn: 8.11.3 960 | acorn-jsx: 5.3.2(acorn@8.11.3) 961 | eslint-visitor-keys: 3.4.3 962 | dev: true 963 | 964 | /esquery@1.5.0: 965 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 966 | engines: {node: '>=0.10'} 967 | dependencies: 968 | estraverse: 5.3.0 969 | dev: true 970 | 971 | /esrecurse@4.3.0: 972 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 973 | engines: {node: '>=4.0'} 974 | dependencies: 975 | estraverse: 5.3.0 976 | dev: true 977 | 978 | /estraverse@5.3.0: 979 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 980 | engines: {node: '>=4.0'} 981 | dev: true 982 | 983 | /esutils@2.0.3: 984 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 985 | engines: {node: '>=0.10.0'} 986 | dev: true 987 | 988 | /fast-deep-equal@3.1.3: 989 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 990 | dev: true 991 | 992 | /fast-glob@3.3.2: 993 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 994 | engines: {node: '>=8.6.0'} 995 | dependencies: 996 | '@nodelib/fs.stat': 2.0.5 997 | '@nodelib/fs.walk': 1.2.8 998 | glob-parent: 5.1.2 999 | merge2: 1.4.1 1000 | micromatch: 4.0.5 1001 | dev: true 1002 | 1003 | /fast-json-stable-stringify@2.1.0: 1004 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1005 | dev: true 1006 | 1007 | /fast-levenshtein@2.0.6: 1008 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1009 | dev: true 1010 | 1011 | /fastq@1.17.1: 1012 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 1013 | dependencies: 1014 | reusify: 1.0.4 1015 | dev: true 1016 | 1017 | /file-entry-cache@6.0.1: 1018 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 1019 | engines: {node: ^10.12.0 || >=12.0.0} 1020 | dependencies: 1021 | flat-cache: 3.2.0 1022 | dev: true 1023 | 1024 | /fill-range@7.0.1: 1025 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1026 | engines: {node: '>=8'} 1027 | dependencies: 1028 | to-regex-range: 5.0.1 1029 | dev: true 1030 | 1031 | /find-up@5.0.0: 1032 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1033 | engines: {node: '>=10'} 1034 | dependencies: 1035 | locate-path: 6.0.0 1036 | path-exists: 4.0.0 1037 | dev: true 1038 | 1039 | /flat-cache@3.2.0: 1040 | resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} 1041 | engines: {node: ^10.12.0 || >=12.0.0} 1042 | dependencies: 1043 | flatted: 3.3.1 1044 | keyv: 4.5.4 1045 | rimraf: 3.0.2 1046 | dev: true 1047 | 1048 | /flatted@3.3.1: 1049 | resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} 1050 | dev: true 1051 | 1052 | /for-each@0.3.3: 1053 | resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} 1054 | dependencies: 1055 | is-callable: 1.2.7 1056 | dev: true 1057 | 1058 | /fs.realpath@1.0.0: 1059 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1060 | dev: true 1061 | 1062 | /function-bind@1.1.2: 1063 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 1064 | dev: true 1065 | 1066 | /function.prototype.name@1.1.6: 1067 | resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} 1068 | engines: {node: '>= 0.4'} 1069 | dependencies: 1070 | call-bind: 1.0.7 1071 | define-properties: 1.2.1 1072 | es-abstract: 1.22.5 1073 | functions-have-names: 1.2.3 1074 | dev: true 1075 | 1076 | /functions-have-names@1.2.3: 1077 | resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 1078 | dev: true 1079 | 1080 | /get-intrinsic@1.2.4: 1081 | resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} 1082 | engines: {node: '>= 0.4'} 1083 | dependencies: 1084 | es-errors: 1.3.0 1085 | function-bind: 1.1.2 1086 | has-proto: 1.0.3 1087 | has-symbols: 1.0.3 1088 | hasown: 2.0.2 1089 | dev: true 1090 | 1091 | /get-symbol-description@1.0.2: 1092 | resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} 1093 | engines: {node: '>= 0.4'} 1094 | dependencies: 1095 | call-bind: 1.0.7 1096 | es-errors: 1.3.0 1097 | get-intrinsic: 1.2.4 1098 | dev: true 1099 | 1100 | /get-tsconfig@4.7.3: 1101 | resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} 1102 | dependencies: 1103 | resolve-pkg-maps: 1.0.0 1104 | dev: true 1105 | 1106 | /glob-parent@5.1.2: 1107 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1108 | engines: {node: '>= 6'} 1109 | dependencies: 1110 | is-glob: 4.0.3 1111 | dev: true 1112 | 1113 | /glob-parent@6.0.2: 1114 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1115 | engines: {node: '>=10.13.0'} 1116 | dependencies: 1117 | is-glob: 4.0.3 1118 | dev: true 1119 | 1120 | /glob@7.2.3: 1121 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1122 | dependencies: 1123 | fs.realpath: 1.0.0 1124 | inflight: 1.0.6 1125 | inherits: 2.0.4 1126 | minimatch: 3.1.2 1127 | once: 1.4.0 1128 | path-is-absolute: 1.0.1 1129 | dev: true 1130 | 1131 | /globals@13.24.0: 1132 | resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} 1133 | engines: {node: '>=8'} 1134 | dependencies: 1135 | type-fest: 0.20.2 1136 | dev: true 1137 | 1138 | /globalthis@1.0.3: 1139 | resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} 1140 | engines: {node: '>= 0.4'} 1141 | dependencies: 1142 | define-properties: 1.2.1 1143 | dev: true 1144 | 1145 | /globby@11.1.0: 1146 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 1147 | engines: {node: '>=10'} 1148 | dependencies: 1149 | array-union: 2.1.0 1150 | dir-glob: 3.0.1 1151 | fast-glob: 3.3.2 1152 | ignore: 5.3.1 1153 | merge2: 1.4.1 1154 | slash: 3.0.0 1155 | dev: true 1156 | 1157 | /gopd@1.0.1: 1158 | resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} 1159 | dependencies: 1160 | get-intrinsic: 1.2.4 1161 | dev: true 1162 | 1163 | /graceful-fs@4.2.11: 1164 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1165 | dev: true 1166 | 1167 | /graphemer@1.4.0: 1168 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 1169 | dev: true 1170 | 1171 | /has-bigints@1.0.2: 1172 | resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} 1173 | dev: true 1174 | 1175 | /has-flag@4.0.0: 1176 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1177 | engines: {node: '>=8'} 1178 | dev: true 1179 | 1180 | /has-property-descriptors@1.0.2: 1181 | resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} 1182 | dependencies: 1183 | es-define-property: 1.0.0 1184 | dev: true 1185 | 1186 | /has-proto@1.0.3: 1187 | resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} 1188 | engines: {node: '>= 0.4'} 1189 | dev: true 1190 | 1191 | /has-symbols@1.0.3: 1192 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 1193 | engines: {node: '>= 0.4'} 1194 | dev: true 1195 | 1196 | /has-tostringtag@1.0.2: 1197 | resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} 1198 | engines: {node: '>= 0.4'} 1199 | dependencies: 1200 | has-symbols: 1.0.3 1201 | dev: true 1202 | 1203 | /hasown@2.0.2: 1204 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 1205 | engines: {node: '>= 0.4'} 1206 | dependencies: 1207 | function-bind: 1.1.2 1208 | dev: true 1209 | 1210 | /ignore@5.3.1: 1211 | resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} 1212 | engines: {node: '>= 4'} 1213 | dev: true 1214 | 1215 | /import-fresh@3.3.0: 1216 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1217 | engines: {node: '>=6'} 1218 | dependencies: 1219 | parent-module: 1.0.1 1220 | resolve-from: 4.0.0 1221 | dev: true 1222 | 1223 | /imurmurhash@0.1.4: 1224 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1225 | engines: {node: '>=0.8.19'} 1226 | dev: true 1227 | 1228 | /inflight@1.0.6: 1229 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1230 | dependencies: 1231 | once: 1.4.0 1232 | wrappy: 1.0.2 1233 | dev: true 1234 | 1235 | /inherits@2.0.4: 1236 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1237 | dev: true 1238 | 1239 | /internal-slot@1.0.7: 1240 | resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} 1241 | engines: {node: '>= 0.4'} 1242 | dependencies: 1243 | es-errors: 1.3.0 1244 | hasown: 2.0.2 1245 | side-channel: 1.0.6 1246 | dev: true 1247 | 1248 | /is-array-buffer@3.0.4: 1249 | resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} 1250 | engines: {node: '>= 0.4'} 1251 | dependencies: 1252 | call-bind: 1.0.7 1253 | get-intrinsic: 1.2.4 1254 | dev: true 1255 | 1256 | /is-bigint@1.0.4: 1257 | resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} 1258 | dependencies: 1259 | has-bigints: 1.0.2 1260 | dev: true 1261 | 1262 | /is-boolean-object@1.1.2: 1263 | resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} 1264 | engines: {node: '>= 0.4'} 1265 | dependencies: 1266 | call-bind: 1.0.7 1267 | has-tostringtag: 1.0.2 1268 | dev: true 1269 | 1270 | /is-builtin-module@3.2.1: 1271 | resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} 1272 | engines: {node: '>=6'} 1273 | dependencies: 1274 | builtin-modules: 3.3.0 1275 | dev: true 1276 | 1277 | /is-callable@1.2.7: 1278 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 1279 | engines: {node: '>= 0.4'} 1280 | dev: true 1281 | 1282 | /is-core-module@2.13.1: 1283 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} 1284 | dependencies: 1285 | hasown: 2.0.2 1286 | dev: true 1287 | 1288 | /is-date-object@1.0.5: 1289 | resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} 1290 | engines: {node: '>= 0.4'} 1291 | dependencies: 1292 | has-tostringtag: 1.0.2 1293 | dev: true 1294 | 1295 | /is-extglob@2.1.1: 1296 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1297 | engines: {node: '>=0.10.0'} 1298 | dev: true 1299 | 1300 | /is-glob@4.0.3: 1301 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1302 | engines: {node: '>=0.10.0'} 1303 | dependencies: 1304 | is-extglob: 2.1.1 1305 | dev: true 1306 | 1307 | /is-negative-zero@2.0.3: 1308 | resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} 1309 | engines: {node: '>= 0.4'} 1310 | dev: true 1311 | 1312 | /is-number-object@1.0.7: 1313 | resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} 1314 | engines: {node: '>= 0.4'} 1315 | dependencies: 1316 | has-tostringtag: 1.0.2 1317 | dev: true 1318 | 1319 | /is-number@7.0.0: 1320 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1321 | engines: {node: '>=0.12.0'} 1322 | dev: true 1323 | 1324 | /is-path-inside@3.0.3: 1325 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 1326 | engines: {node: '>=8'} 1327 | dev: true 1328 | 1329 | /is-regex@1.1.4: 1330 | resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} 1331 | engines: {node: '>= 0.4'} 1332 | dependencies: 1333 | call-bind: 1.0.7 1334 | has-tostringtag: 1.0.2 1335 | dev: true 1336 | 1337 | /is-shared-array-buffer@1.0.3: 1338 | resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} 1339 | engines: {node: '>= 0.4'} 1340 | dependencies: 1341 | call-bind: 1.0.7 1342 | dev: true 1343 | 1344 | /is-string@1.0.7: 1345 | resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} 1346 | engines: {node: '>= 0.4'} 1347 | dependencies: 1348 | has-tostringtag: 1.0.2 1349 | dev: true 1350 | 1351 | /is-symbol@1.0.4: 1352 | resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} 1353 | engines: {node: '>= 0.4'} 1354 | dependencies: 1355 | has-symbols: 1.0.3 1356 | dev: true 1357 | 1358 | /is-typed-array@1.1.13: 1359 | resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} 1360 | engines: {node: '>= 0.4'} 1361 | dependencies: 1362 | which-typed-array: 1.1.15 1363 | dev: true 1364 | 1365 | /is-weakref@1.0.2: 1366 | resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} 1367 | dependencies: 1368 | call-bind: 1.0.7 1369 | dev: true 1370 | 1371 | /isarray@2.0.5: 1372 | resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} 1373 | dev: true 1374 | 1375 | /isexe@2.0.0: 1376 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1377 | dev: true 1378 | 1379 | /js-yaml@4.1.0: 1380 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1381 | hasBin: true 1382 | dependencies: 1383 | argparse: 2.0.1 1384 | dev: true 1385 | 1386 | /json-buffer@3.0.1: 1387 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1388 | dev: true 1389 | 1390 | /json-schema-traverse@0.4.1: 1391 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1392 | dev: true 1393 | 1394 | /json-stable-stringify-without-jsonify@1.0.1: 1395 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1396 | dev: true 1397 | 1398 | /json5@1.0.2: 1399 | resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} 1400 | hasBin: true 1401 | dependencies: 1402 | minimist: 1.2.8 1403 | dev: true 1404 | 1405 | /kebab-case@1.0.2: 1406 | resolution: {integrity: sha512-7n6wXq4gNgBELfDCpzKc+mRrZFs7D+wgfF5WRFLNAr4DA/qtr9Js8uOAVAfHhuLMfAcQ0pRKqbpjx+TcJVdE1Q==} 1407 | dev: true 1408 | 1409 | /keyv@4.5.4: 1410 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1411 | dependencies: 1412 | json-buffer: 3.0.1 1413 | dev: true 1414 | 1415 | /levn@0.4.1: 1416 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1417 | engines: {node: '>= 0.8.0'} 1418 | dependencies: 1419 | prelude-ls: 1.2.1 1420 | type-check: 0.4.0 1421 | dev: true 1422 | 1423 | /locate-path@6.0.0: 1424 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1425 | engines: {node: '>=10'} 1426 | dependencies: 1427 | p-locate: 5.0.0 1428 | dev: true 1429 | 1430 | /lodash.merge@4.6.2: 1431 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1432 | dev: true 1433 | 1434 | /lru-cache@6.0.0: 1435 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1436 | engines: {node: '>=10'} 1437 | dependencies: 1438 | yallist: 4.0.0 1439 | dev: true 1440 | 1441 | /merge2@1.4.1: 1442 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1443 | engines: {node: '>= 8'} 1444 | dev: true 1445 | 1446 | /micromatch@4.0.5: 1447 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1448 | engines: {node: '>=8.6'} 1449 | dependencies: 1450 | braces: 3.0.2 1451 | picomatch: 2.3.1 1452 | dev: true 1453 | 1454 | /minimatch@3.1.2: 1455 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1456 | dependencies: 1457 | brace-expansion: 1.1.11 1458 | dev: true 1459 | 1460 | /minimatch@9.0.3: 1461 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} 1462 | engines: {node: '>=16 || 14 >=14.17'} 1463 | dependencies: 1464 | brace-expansion: 2.0.1 1465 | dev: true 1466 | 1467 | /minimist@1.2.8: 1468 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 1469 | dev: true 1470 | 1471 | /ms@2.1.2: 1472 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1473 | dev: true 1474 | 1475 | /ms@2.1.3: 1476 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1477 | dev: true 1478 | 1479 | /natural-compare@1.4.0: 1480 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1481 | dev: true 1482 | 1483 | /object-inspect@1.13.1: 1484 | resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} 1485 | dev: true 1486 | 1487 | /object-keys@1.1.1: 1488 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 1489 | engines: {node: '>= 0.4'} 1490 | dev: true 1491 | 1492 | /object.assign@4.1.5: 1493 | resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} 1494 | engines: {node: '>= 0.4'} 1495 | dependencies: 1496 | call-bind: 1.0.7 1497 | define-properties: 1.2.1 1498 | has-symbols: 1.0.3 1499 | object-keys: 1.1.1 1500 | dev: true 1501 | 1502 | /object.fromentries@2.0.7: 1503 | resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} 1504 | engines: {node: '>= 0.4'} 1505 | dependencies: 1506 | call-bind: 1.0.7 1507 | define-properties: 1.2.1 1508 | es-abstract: 1.22.5 1509 | dev: true 1510 | 1511 | /object.groupby@1.0.2: 1512 | resolution: {integrity: sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==} 1513 | dependencies: 1514 | array.prototype.filter: 1.0.3 1515 | call-bind: 1.0.7 1516 | define-properties: 1.2.1 1517 | es-abstract: 1.22.5 1518 | es-errors: 1.3.0 1519 | dev: true 1520 | 1521 | /object.values@1.1.7: 1522 | resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} 1523 | engines: {node: '>= 0.4'} 1524 | dependencies: 1525 | call-bind: 1.0.7 1526 | define-properties: 1.2.1 1527 | es-abstract: 1.22.5 1528 | dev: true 1529 | 1530 | /once@1.4.0: 1531 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1532 | dependencies: 1533 | wrappy: 1.0.2 1534 | dev: true 1535 | 1536 | /optionator@0.9.3: 1537 | resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} 1538 | engines: {node: '>= 0.8.0'} 1539 | dependencies: 1540 | '@aashutoshrathi/word-wrap': 1.2.6 1541 | deep-is: 0.1.4 1542 | fast-levenshtein: 2.0.6 1543 | levn: 0.4.1 1544 | prelude-ls: 1.2.1 1545 | type-check: 0.4.0 1546 | dev: true 1547 | 1548 | /p-limit@3.1.0: 1549 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1550 | engines: {node: '>=10'} 1551 | dependencies: 1552 | yocto-queue: 0.1.0 1553 | dev: true 1554 | 1555 | /p-locate@5.0.0: 1556 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1557 | engines: {node: '>=10'} 1558 | dependencies: 1559 | p-limit: 3.1.0 1560 | dev: true 1561 | 1562 | /parent-module@1.0.1: 1563 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1564 | engines: {node: '>=6'} 1565 | dependencies: 1566 | callsites: 3.1.0 1567 | dev: true 1568 | 1569 | /path-exists@4.0.0: 1570 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1571 | engines: {node: '>=8'} 1572 | dev: true 1573 | 1574 | /path-is-absolute@1.0.1: 1575 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1576 | engines: {node: '>=0.10.0'} 1577 | dev: true 1578 | 1579 | /path-key@3.1.1: 1580 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1581 | engines: {node: '>=8'} 1582 | dev: true 1583 | 1584 | /path-parse@1.0.7: 1585 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1586 | dev: true 1587 | 1588 | /path-type@4.0.0: 1589 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 1590 | engines: {node: '>=8'} 1591 | dev: true 1592 | 1593 | /picomatch@2.3.1: 1594 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1595 | engines: {node: '>=8.6'} 1596 | dev: true 1597 | 1598 | /possible-typed-array-names@1.0.0: 1599 | resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} 1600 | engines: {node: '>= 0.4'} 1601 | dev: true 1602 | 1603 | /prelude-ls@1.2.1: 1604 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1605 | engines: {node: '>= 0.8.0'} 1606 | dev: true 1607 | 1608 | /punycode@2.3.1: 1609 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1610 | engines: {node: '>=6'} 1611 | dev: true 1612 | 1613 | /queue-microtask@1.2.3: 1614 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1615 | dev: true 1616 | 1617 | /rambda@7.5.0: 1618 | resolution: {integrity: sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==} 1619 | dev: true 1620 | 1621 | /regexp.prototype.flags@1.5.2: 1622 | resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} 1623 | engines: {node: '>= 0.4'} 1624 | dependencies: 1625 | call-bind: 1.0.7 1626 | define-properties: 1.2.1 1627 | es-errors: 1.3.0 1628 | set-function-name: 2.0.2 1629 | dev: true 1630 | 1631 | /resolve-from@4.0.0: 1632 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1633 | engines: {node: '>=4'} 1634 | dev: true 1635 | 1636 | /resolve-pkg-maps@1.0.0: 1637 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 1638 | dev: true 1639 | 1640 | /resolve@1.22.8: 1641 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 1642 | hasBin: true 1643 | dependencies: 1644 | is-core-module: 2.13.1 1645 | path-parse: 1.0.7 1646 | supports-preserve-symlinks-flag: 1.0.0 1647 | dev: true 1648 | 1649 | /reusify@1.0.4: 1650 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1651 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1652 | dev: true 1653 | 1654 | /rimraf@3.0.2: 1655 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1656 | hasBin: true 1657 | dependencies: 1658 | glob: 7.2.3 1659 | dev: true 1660 | 1661 | /run-parallel@1.2.0: 1662 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1663 | dependencies: 1664 | queue-microtask: 1.2.3 1665 | dev: true 1666 | 1667 | /safe-array-concat@1.1.2: 1668 | resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} 1669 | engines: {node: '>=0.4'} 1670 | dependencies: 1671 | call-bind: 1.0.7 1672 | get-intrinsic: 1.2.4 1673 | has-symbols: 1.0.3 1674 | isarray: 2.0.5 1675 | dev: true 1676 | 1677 | /safe-regex-test@1.0.3: 1678 | resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} 1679 | engines: {node: '>= 0.4'} 1680 | dependencies: 1681 | call-bind: 1.0.7 1682 | es-errors: 1.3.0 1683 | is-regex: 1.1.4 1684 | dev: true 1685 | 1686 | /semver@6.3.1: 1687 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1688 | hasBin: true 1689 | dev: true 1690 | 1691 | /semver@7.6.0: 1692 | resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} 1693 | engines: {node: '>=10'} 1694 | hasBin: true 1695 | dependencies: 1696 | lru-cache: 6.0.0 1697 | dev: true 1698 | 1699 | /set-function-length@1.2.2: 1700 | resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} 1701 | engines: {node: '>= 0.4'} 1702 | dependencies: 1703 | define-data-property: 1.1.4 1704 | es-errors: 1.3.0 1705 | function-bind: 1.1.2 1706 | get-intrinsic: 1.2.4 1707 | gopd: 1.0.1 1708 | has-property-descriptors: 1.0.2 1709 | dev: true 1710 | 1711 | /set-function-name@2.0.2: 1712 | resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} 1713 | engines: {node: '>= 0.4'} 1714 | dependencies: 1715 | define-data-property: 1.1.4 1716 | es-errors: 1.3.0 1717 | functions-have-names: 1.2.3 1718 | has-property-descriptors: 1.0.2 1719 | dev: true 1720 | 1721 | /shebang-command@2.0.0: 1722 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1723 | engines: {node: '>=8'} 1724 | dependencies: 1725 | shebang-regex: 3.0.0 1726 | dev: true 1727 | 1728 | /shebang-regex@3.0.0: 1729 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1730 | engines: {node: '>=8'} 1731 | dev: true 1732 | 1733 | /showdown@2.1.0: 1734 | resolution: {integrity: sha512-/6NVYu4U819R2pUIk79n67SYgJHWCce0a5xTP979WbNp0FL9MN1I1QK662IDU1b6JzKTvmhgI7T7JYIxBi3kMQ==} 1735 | hasBin: true 1736 | dependencies: 1737 | commander: 9.5.0 1738 | dev: false 1739 | 1740 | /side-channel@1.0.6: 1741 | resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} 1742 | engines: {node: '>= 0.4'} 1743 | dependencies: 1744 | call-bind: 1.0.7 1745 | es-errors: 1.3.0 1746 | get-intrinsic: 1.2.4 1747 | object-inspect: 1.13.1 1748 | dev: true 1749 | 1750 | /slash@3.0.0: 1751 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1752 | engines: {node: '>=8'} 1753 | dev: true 1754 | 1755 | /string.prototype.trim@1.2.8: 1756 | resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} 1757 | engines: {node: '>= 0.4'} 1758 | dependencies: 1759 | call-bind: 1.0.7 1760 | define-properties: 1.2.1 1761 | es-abstract: 1.22.5 1762 | dev: true 1763 | 1764 | /string.prototype.trimend@1.0.7: 1765 | resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} 1766 | dependencies: 1767 | call-bind: 1.0.7 1768 | define-properties: 1.2.1 1769 | es-abstract: 1.22.5 1770 | dev: true 1771 | 1772 | /string.prototype.trimstart@1.0.7: 1773 | resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} 1774 | dependencies: 1775 | call-bind: 1.0.7 1776 | define-properties: 1.2.1 1777 | es-abstract: 1.22.5 1778 | dev: true 1779 | 1780 | /strip-ansi@6.0.1: 1781 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1782 | engines: {node: '>=8'} 1783 | dependencies: 1784 | ansi-regex: 5.0.1 1785 | dev: true 1786 | 1787 | /strip-bom@3.0.0: 1788 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 1789 | engines: {node: '>=4'} 1790 | dev: true 1791 | 1792 | /strip-json-comments@3.1.1: 1793 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1794 | engines: {node: '>=8'} 1795 | dev: true 1796 | 1797 | /supports-color@7.2.0: 1798 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1799 | engines: {node: '>=8'} 1800 | dependencies: 1801 | has-flag: 4.0.0 1802 | dev: true 1803 | 1804 | /supports-preserve-symlinks-flag@1.0.0: 1805 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1806 | engines: {node: '>= 0.4'} 1807 | dev: true 1808 | 1809 | /tapable@2.2.1: 1810 | resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} 1811 | engines: {node: '>=6'} 1812 | dev: true 1813 | 1814 | /text-table@0.2.0: 1815 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 1816 | dev: true 1817 | 1818 | /to-regex-range@5.0.1: 1819 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1820 | engines: {node: '>=8.0'} 1821 | dependencies: 1822 | is-number: 7.0.0 1823 | dev: true 1824 | 1825 | /ts-api-utils@1.3.0(typescript@5.4.2): 1826 | resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} 1827 | engines: {node: '>=16'} 1828 | peerDependencies: 1829 | typescript: '>=4.2.0' 1830 | dependencies: 1831 | typescript: 5.4.2 1832 | dev: true 1833 | 1834 | /tsconfig-paths@3.15.0: 1835 | resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} 1836 | dependencies: 1837 | '@types/json5': 0.0.29 1838 | json5: 1.0.2 1839 | minimist: 1.2.8 1840 | strip-bom: 3.0.0 1841 | dev: true 1842 | 1843 | /type-check@0.4.0: 1844 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1845 | engines: {node: '>= 0.8.0'} 1846 | dependencies: 1847 | prelude-ls: 1.2.1 1848 | dev: true 1849 | 1850 | /type-fest@0.20.2: 1851 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 1852 | engines: {node: '>=10'} 1853 | dev: true 1854 | 1855 | /typed-array-buffer@1.0.2: 1856 | resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} 1857 | engines: {node: '>= 0.4'} 1858 | dependencies: 1859 | call-bind: 1.0.7 1860 | es-errors: 1.3.0 1861 | is-typed-array: 1.1.13 1862 | dev: true 1863 | 1864 | /typed-array-byte-length@1.0.1: 1865 | resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} 1866 | engines: {node: '>= 0.4'} 1867 | dependencies: 1868 | call-bind: 1.0.7 1869 | for-each: 0.3.3 1870 | gopd: 1.0.1 1871 | has-proto: 1.0.3 1872 | is-typed-array: 1.1.13 1873 | dev: true 1874 | 1875 | /typed-array-byte-offset@1.0.2: 1876 | resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} 1877 | engines: {node: '>= 0.4'} 1878 | dependencies: 1879 | available-typed-arrays: 1.0.7 1880 | call-bind: 1.0.7 1881 | for-each: 0.3.3 1882 | gopd: 1.0.1 1883 | has-proto: 1.0.3 1884 | is-typed-array: 1.1.13 1885 | dev: true 1886 | 1887 | /typed-array-length@1.0.5: 1888 | resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==} 1889 | engines: {node: '>= 0.4'} 1890 | dependencies: 1891 | call-bind: 1.0.7 1892 | for-each: 0.3.3 1893 | gopd: 1.0.1 1894 | has-proto: 1.0.3 1895 | is-typed-array: 1.1.13 1896 | possible-typed-array-names: 1.0.0 1897 | dev: true 1898 | 1899 | /typescript@5.4.2: 1900 | resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} 1901 | engines: {node: '>=14.17'} 1902 | hasBin: true 1903 | dev: true 1904 | 1905 | /unbox-primitive@1.0.2: 1906 | resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} 1907 | dependencies: 1908 | call-bind: 1.0.7 1909 | has-bigints: 1.0.2 1910 | has-symbols: 1.0.3 1911 | which-boxed-primitive: 1.0.2 1912 | dev: true 1913 | 1914 | /undici-types@5.26.5: 1915 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 1916 | dev: true 1917 | 1918 | /uri-js@4.4.1: 1919 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1920 | dependencies: 1921 | punycode: 2.3.1 1922 | dev: true 1923 | 1924 | /which-boxed-primitive@1.0.2: 1925 | resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} 1926 | dependencies: 1927 | is-bigint: 1.0.4 1928 | is-boolean-object: 1.1.2 1929 | is-number-object: 1.0.7 1930 | is-string: 1.0.7 1931 | is-symbol: 1.0.4 1932 | dev: true 1933 | 1934 | /which-typed-array@1.1.15: 1935 | resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} 1936 | engines: {node: '>= 0.4'} 1937 | dependencies: 1938 | available-typed-arrays: 1.0.7 1939 | call-bind: 1.0.7 1940 | for-each: 0.3.3 1941 | gopd: 1.0.1 1942 | has-tostringtag: 1.0.2 1943 | dev: true 1944 | 1945 | /which@2.0.2: 1946 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1947 | engines: {node: '>= 8'} 1948 | hasBin: true 1949 | dependencies: 1950 | isexe: 2.0.0 1951 | dev: true 1952 | 1953 | /wrappy@1.0.2: 1954 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1955 | dev: true 1956 | 1957 | /yallist@4.0.0: 1958 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 1959 | dev: true 1960 | 1961 | /yocto-queue@0.1.0: 1962 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1963 | engines: {node: '>=10'} 1964 | dev: true 1965 | --------------------------------------------------------------------------------